View Full Version : Help with code
YAKO SOMEDAKY
January 16th, 2020, 13:15
To begin with, I apologize if the code is disorganized or ugly.
His idea is to convert all units of time into seconds, minutes to seconds, hours to seconds, days to seconds.
I did what I knew to dig, because it's worth remembering and stressing I'm not a programmer.
Anyway, this is the error message that pops up to me:
[<color="red">ERROR</color>] Failed to load script buffer (Cypher System) (EffectManager2): [string "scripts/manager_effect2.lua"]:122: 'end' expected (to close 'if' at line 120) near 'return'
And this is the code that I "made"
--
-- Please see the license.html file included with this distribution for
-- attribution and copyright information.
--
-- Given a combat tracker node, return true if the node currently has an active "dazed" effect on it.
-- Otherwise return false.
--
function onInit()
EffectManager.registerEffectVar("nStatus", { sDBType = "number", sDBField = "status", bSkipAdd = false });
EffectManager.registerEffectVar("sUnits", { sDBType = "string", sDBField = "units", bSkipAdd = false });
EffectManager.setCustomOnEffectAddStart(onEffectAd dStart);
EffectManager.setCustomOnEffectStartTurn(onEffectS tartTurn);
EffectManager.setCustomOnEffectEndTurn(onEffectEnd Turn);
EffectManager.setCustomOnEffectActorStartTurn(onEf fectActorStartTurn);
EffectManager.setCustomOnEffectActorEndTurn(onEffe ctActorEndTurn);
EffectManager.setCustomOnEffectTextEncode(onEffect TextEncode);
EffectManager.setCustomOnEffectTextDecode(onEffect TextDecode);
end
function onEffectAddStart(rEffect)
rEffect.nStatus = 0;
rEffect.nDuration = rEffect.nDuration or 1;
if rEffect.sUnits == "min" then
rEffect.nDuration = rEffect.nDuration * 60;
rEffect.sUnits = "sec";
elseif rEffect.sUnits == "hr" then
rEffect.nDuration = rEffect.nDuration * 3600;
rEffect.sUnits = "sec";
elseif rEffect.sUnits == "day" then
rEffect.nDuration = rEffect.nDuration * 86400;
rEffect.sUnits = "sec";
if rEffect.sUnits and rEffect.sUnits == "sec" then
rEffect.sUnits = "sec";
rEffect.nStatus = 1;
end
end
end
function onEffectStartTurn(nodeEffect)
return true;
end
function onEffectEndTurn(nodeEffect)
return true;
end
function onEffectActorStartTurn(nodeActor, nodeEffect)
DB.setValue(nodeEffect, "status", "number", 1);
end
function onEffectActorEndTurn(nodeActor, nodeEffect)
local nDuration = DB.getValue(nodeEffect, "duration", 1);
local sUnits = DB.getValue(nodeEffect, "units", "");
local nStatus = DB.getValue(nodeEffect, "status", 1);
-- Convert to seconds
if sUnits == "min" then
sUnits = "sec";
nDuration = nDuration * 60;
DB.setValue(nodeEffect, "units", "string", sUnits);
elseif sUnits == "hr" then
sUnits = "sec";
nDuration = nDuration * 3600;
DB.setValue(nodeEffect, "units", "string", sUnits);
elseif sUnits == "day" then
sUnits = "sec";
nDuration = nDuration * 86400;
DB.setValue(nodeEffect, "units", "string", sUnits);
if sUnits and nStatus == 1 then
sUnits = "sec";
nDuration = nDuration - 1;
end
end
end
function onEffectTextEncode(rEffect)
local aMessage = {};
if rEffect.sUnits and rEffect.sUnits ~= "" then
local sOutputUnits = nil;
if rEffect.sUnits == "sec" then
sOutputUnits = "SEC";
elseif rEffect.sUnits == "min" then
sOutputUnits = "MIN";
elseif rEffect.sUnits == "hr" then
sOutputUnits = "HR";
elseif rEffect.sUnits == "day" then
sOutputUnits = "DAY";
if sOutputUnits then
table.insert(aMessage, "[UNITS " .. sOutputUnits .. "]");
return table.concat(aMessage, " ");
end
end
end
end
function onEffectTextDecode(sEffect, rEffect)
local s = sEffect;
local sUnits = s:match("%[UNITS ([^]]+)]");
if sUnits then
s = s:gsub("%[UNITS ([^]]+)]", "");
if sUnits == "SEC" then
rEffect.sUnits = "sec";
elseif sUnits == "MIN" then
rEffect.sUnits = "min";
elseif sUnits == "HR" then
rEffect.sUnits = "hr";
elseif sUnits == "DAY" then
rEffect.sUnits = "day";
return s;
end
end
end
function isDazed(nodeCT)
for _,nodeChild in pairs(DB.getChildren(nodeCT, "effects")) do
if string.lower(DB.getValue(nodeChild, "label", "")) == "dazed" and DB.getValue(nodeChild, "isactive") == 1 then
return true;
return false;
end
end
end
Trenloe
January 16th, 2020, 13:22
Moved thread to the workshop forum.
You can’t have 2 return commands like that. Delete the second one at line 122.
YAKO SOMEDAKY
January 16th, 2020, 17:49
Trenloe, as you indicated I made the change of return, and some new additions to see if the time is decreasing, because I was and I have this problem, but this message appears now that I try to apply the effect
Error message: [<color="red">ERROR</color>] Script execution error: [string "scripts/manager_effect.lua"]:942: attempt to index local 's' (a nil value)
This message appears when I click to apply the second, minute, and hour effects, but not with days, the days effect converts time to seconds, but does not decrease.
Code changed
--
-- Please see the license.html file included with this distribution for
-- attribution and copyright information.
--
-- Given a combat tracker node, return true if the node currently has an active "dazed" effect on it.
-- Otherwise return false.
--
function onInit()
EffectManager.registerEffectVar("nStatus", { sDBType = "number", sDBField = "status", bSkipAdd = false });
EffectManager.registerEffectVar("sUnits", { sDBType = "string", sDBField = "units", bSkipAdd = false });
EffectManager.setCustomOnEffectAddStart(onEffectAd dStart);
EffectManager.setCustomOnEffectStartTurn(onEffectS tartTurn);
EffectManager.setCustomOnEffectEndTurn(onEffectEnd Turn);
EffectManager.setCustomOnEffectActorStartTurn(onEf fectActorStartTurn);
EffectManager.setCustomOnEffectActorEndTurn(onEffe ctActorEndTurn);
EffectManager.setCustomOnEffectTextEncode(onEffect TextEncode);
EffectManager.setCustomOnEffectTextDecode(onEffect TextDecode);
end
function onEffectAddStart(rEffect)
rEffect.nStatus = 0;
rEffect.nDuration = rEffect.nDuration or 1;
if rEffect.sUnits == "min" then
rEffect.nDuration = rEffect.nDuration * 60;
rEffect.sUnits = "sec";
elseif rEffect.sUnits == "hr" then
rEffect.nDuration = rEffect.nDuration * 3600;
rEffect.sUnits = "sec";
elseif rEffect.sUnits == "day" then
rEffect.nDuration = rEffect.nDuration * 86400;
rEffect.sUnits = "sec";
if rEffect.sUnits and rEffect.sUnits == "min" then
rEffect.sUnits = "sec";
rEffect.nStatus = 1;
elseif rEffect.sUnits and rEffect.sUnits == "hr" then
rEffect.sUnits = "sec";
rEffect.nStatus = 1;
elseif rEffect.sUnits and rEffect.sUnits == "day" then
rEffect.sUnits = "sec";
rEffect.nStatus = 1;
end
end
end
function onEffectStartTurn(nodeEffect)
return true;
end
function onEffectEndTurn(nodeEffect)
return true;
end
function onEffectActorStartTurn(nodeActor, nodeEffect)
DB.setValue(nodeEffect, "status", "number", 1);
end
function onEffectActorEndTurn(nodeActor, nodeEffect)
local nDuration = DB.getValue(nodeEffect, "duration", 1);
local sUnits = DB.getValue(nodeEffect, "units", "");
local nStatus = DB.getValue(nodeEffect, "status", 1);
-- Convert to seconds
if sUnits == "min" then
sUnits = "sec";
nDuration = nDuration * 60;
DB.setValue(nodeEffect, "units", "string", sUnits);
elseif sUnits == "hr" then
sUnits = "sec";
nDuration = nDuration * 3600;
DB.setValue(nodeEffect, "units", "string", sUnits);
elseif sUnits == "day" then
sUnits = "sec";
nDuration = nDuration * 86400;
DB.setValue(nodeEffect, "units", "string", sUnits);
if sUnits == "min" and nStatus == 1 then
sUnits = "sec";
nDuration = nDuration - 1;
elseif sUnits == "hr" and nStatus == 1 then
sUnits = "sec";
nDuration = nDuration - 1;
elseif sUnits == "day" and nStatus == 1 then
sUnits = "sec";
nDuration = nDuration - 1;
end
end
end
function onEffectTextEncode(rEffect)
local aMessage = {};
if rEffect.sUnits and rEffect.sUnits ~= "" then
local sOutputUnits = nil;
if rEffect.sUnits == "sec" then
sOutputUnits = "SEC";
elseif rEffect.sUnits == "min" then
sOutputUnits = "MIN";
elseif rEffect.sUnits == "hr" then
sOutputUnits = "HR";
elseif rEffect.sUnits == "day" then
sOutputUnits = "DAY";
if sOutputUnits then
table.insert(aMessage, "[UNITS " .. sOutputUnits .. "]");
return table.concat(aMessage, " ");
end
end
end
end
function onEffectTextDecode(sEffect, rEffect)
local s = sEffect;
local sUnits = s:match("%[UNITS ([^]]+)]");
if sUnits then
s = s:gsub("%[UNITS ([^]]+)]", "");
if sUnits == "SEC" then
rEffect.sUnits = "sec";
elseif sUnits == "MIN" then
rEffect.sUnits = "min";
elseif sUnits == "HR" then
rEffect.sUnits = "hr";
elseif sUnits == "DAY" then
rEffect.sUnits = "day";
return s;
end
end
end
function isDazed(nodeCT)
for _,nodeChild in pairs(DB.getChildren(nodeCT, "effects")) do
if string.lower(DB.getValue(nodeChild, "label", "")) == "dazed" and DB.getValue(nodeChild, "isactive") == 1 then
return true;
end
end
end
Moon Wizard
January 16th, 2020, 23:32
yako2020,
Your onEffectTextDecode function must have a return value at all exit points; or else you will get this error because you are returning nil if you don't specify a return value.
Make sure to review the 5E ruleset for an example of this situation in a live case:
scripts/manager_effect_5E.lua (Lines 58-83)
Regards,
JPG
YAKO SOMEDAKY
January 17th, 2020, 04:18
Finally, I was able to convert the units of time, minutes, hours and days to seconds but I can't make the time decrement!
31223
YAKO SOMEDAKY
January 17th, 2020, 04:27
-- -- Please see the license.html file included with this distribution for
-- attribution and copyright information.
--
function onInit()
EffectManager.registerEffectVar("nStatus", { sDBType = "number", sDBField = "status", bSkipAdd = false });
EffectManager.registerEffectVar("sUnits", { sDBType = "string", sDBField = "units", bSkipAdd = false });
EffectManager.setCustomOnEffectAddStart(onEffectAd dStart);
EffectManager.setCustomOnEffectStartTurn(onEffectS tartTurn);
EffectManager.setCustomOnEffectEndTurn(onEffectEnd Turn);
EffectManager.setCustomOnEffectActorStartTurn(onEf fectActorStartTurn);
EffectManager.setCustomOnEffectActorEndTurn(onEffe ctActorEndTurn);
EffectManager.setCustomOnEffectTextEncode(onEffect TextEncode);
EffectManager.setCustomOnEffectTextDecode(onEffect TextDecode);
end
function onEffectAddStart(rEffect)
rEffect.nStatus = 0;
rEffect.nDuration = rEffect.nDuration or 1;
if rEffect.sUnits == "min" then
rEffect.nDuration = rEffect.nDuration * 60;
rEffect.sUnits = "sec";
elseif rEffect.sUnits == "hr" then
rEffect.nDuration = rEffect.nDuration * 3600;
rEffect.sUnits = "sec";
elseif rEffect.sUnits == "day" then
rEffect.nDuration = rEffect.nDuration * 86400;
rEffect.sUnits = "sec";
if rEffect.sUnits == "" then
rEffect.nStatus = 1;
end
end
end
function onEffectStartTurn(nodeEffect)
return true;
end
function onEffectEndTurn(nodeEffect)
return true;
end
function onEffectActorStartTurn(nodeActor, nodeEffect)
DB.setValue(nodeEffect, "status", "number", 1);
end
function onEffectActorEndTurn(nodeActor, nodeEffect)
local nDuration = DB.getValue(nodeEffect, "duration", 0);
local sUnits = DB.getValue(nodeEffect, "units", "");
local nStatus = DB.getValue(nodeEffect, "status", 0);
-- Convert to seconds
if sUnits == "min" then
sUnits = "sec";
nDuration = nDuration * 60;
DB.setValue(nodeEffect, "units", "string", sUnits);
elseif sUnits == "hr" then
sUnits = "sec";
nDuration = nDuration * 3600;
DB.setValue(nodeEffect, "units", "string", sUnits);
elseif sUnits == "day" then
sUnits = "sec";
nDuration = nDuration * 86400;
DB.setValue(nodeEffect, "units", "string", sUnits);
end
if sUnits == "min" and nStatus == 1 then
sUnits = "sec";
nDuration = nDuration - 1;
elseif sUnits == "hr" and nStatus == 1 then
sUnits = "sec";
nDuration = nDuration - 1;
elseif sUnits == "day" and nStatus == 1 then
sUnits = "sec";
nDuration = nDuration - 1;
if nDuration <= 0 and sUnits ~= "min" then
EffectManager.expireEffect(nodeActor, nodeEffect, 0);
elseif nDuration <= 0 and sUnits ~= "hr" then
EffectManager.expireEffect(nodeActor, nodeEffect, 0);
elseif nDuration <= 0 and sUnits ~= "" then
EffectManager.expireEffect(nodeActor, nodeEffect, 0);
else
DB.setValue(nodeEffect, "status", "number", 1);
DB.setValue(nodeEffect, "duration", "number", nDuration);
end
end
end
function onEffectTextEncode(rEffect)
local aMessage = {};
if rEffect.sUnits and rEffect.sUnits ~= "" then
local sOutputUnits = nil;
if rEffect.sUnits == "sec+" then
sOutputUnits = "SEC+";
elseif rEffect.sUnits == "sec" then
sOutputUnits = "SEC";
elseif rEffect.sUnits == "min" then
sOutputUnits = "MIN";
elseif rEffect.sUnits == "hr" then
sOutputUnits = "HR";
elseif rEffect.sUnits == "day" then
sOutputUnits = "DAY";
end
if sOutputUnits then
table.insert(aMessage, "[UNITS " .. sOutputUnits .. "]");
end
end
return table.concat(aMessage, " ");
end
function onEffectTextDecode(sEffect, rEffect)
local s = sEffect;
local sUnits = s:match("%[UNITS ([^]]+)]");
if sUnits then
s = s:gsub("%[UNITS ([^]]+)]", "");
if sUnits == "SEC" then
rEffect.sUnits = "sec";
elseif sUnits == "MIN" then
rEffect.sUnits = "min";
elseif sUnits == "HR" then
rEffect.sUnits = "hr";
elseif sUnits == "DAY" then
rEffect.sUnits = "day";
end
end
return s;
end
function isDazed(nodeCT)
for _,nodeChild in pairs(DB.getChildren(nodeCT, "effects")) do
if string.lower(DB.getValue(nodeChild, "label", "")) == "dazed" and DB.getValue(nodeChild, "isactive") == 1 then
return true;
end
end
return false;
end
YAKO SOMEDAKY
January 17th, 2020, 05:34
Finally! It is now decreasing the time and expiring when the value reaches 0.
Now I will apply sec + to GURPS which is a scheme that instead of decrementing increments the value.
Many thanks to all who helped me in this my madness!
YAKO SOMEDAKY
January 17th, 2020, 05:37
If you are interested in the code there, it is worth remembering that it will not be beautiful, nor so unprofessional, but it works.
One day maybe a transform into an extension.
-- -- Please see the license.html file included with this distribution for
-- attribution and copyright information.
--
function onInit()
EffectManager.registerEffectVar("nStatus", { sDBType = "number", sDBField = "status", bSkipAdd = false });
EffectManager.registerEffectVar("sUnits", { sDBType = "string", sDBField = "units", bSkipAdd = false });
EffectManager.setCustomOnEffectAddStart(onEffectAd dStart);
EffectManager.setCustomOnEffectStartTurn(onEffectS tartTurn);
EffectManager.setCustomOnEffectEndTurn(onEffectEnd Turn);
EffectManager.setCustomOnEffectActorStartTurn(onEf fectActorStartTurn);
EffectManager.setCustomOnEffectActorEndTurn(onEffe ctActorEndTurn);
EffectManager.setCustomOnEffectTextEncode(onEffect TextEncode);
EffectManager.setCustomOnEffectTextDecode(onEffect TextDecode);
end
function onEffectAddStart(rEffect)
rEffect.nStatus = 0;
rEffect.nDuration = rEffect.nDuration or 1;
if rEffect.sUnits == "min" then
rEffect.nDuration = rEffect.nDuration * 60;
rEffect.sUnits = "sec";
elseif rEffect.sUnits == "hr" then
rEffect.nDuration = rEffect.nDuration * 3600;
rEffect.sUnits = "sec";
elseif rEffect.sUnits == "day" then
rEffect.nDuration = rEffect.nDuration * 86400;
rEffect.sUnits = "sec";
if rEffect.sUnits == "sec" then
rEffect.nStatus = 1;
elseif rEffect.sUnits == "min" then
rEffect.nStatus = 1;
elseif rEffect.sUnits == "hr" then
rEffect.nStatus = 1;
elseif rEffect.sUnits == "day" then
rEffect.nStatus = 1;
end
end
end
function onEffectStartTurn(nodeEffect)
return true;
end
function onEffectEndTurn(nodeEffect)
return true;
end
function onEffectActorStartTurn(nodeActor, nodeEffect)
DB.setValue(nodeEffect, "status", "number", 1);
end
function onEffectActorEndTurn(nodeActor, nodeEffect)
local nDuration = DB.getValue(nodeEffect, "duration", 0);
local sUnits = DB.getValue(nodeEffect, "units", "");
local nStatus = DB.getValue(nodeEffect, "status", 0);
-- Convert to seconds
if sUnits == "min" then
sUnits = "sec";
nDuration = nDuration * 60;
DB.setValue(nodeEffect, "units", "string", sUnits);
elseif sUnits == "hr" then
sUnits = "sec";
nDuration = nDuration * 3600;
DB.setValue(nodeEffect, "units", "string", sUnits);
elseif sUnits == "day" then
sUnits = "sec";
nDuration = nDuration * 86400;
DB.setValue(nodeEffect, "units", "string", sUnits);
end
if sUnits == "sec" and nStatus == 1 then
sUnits = "sec";
nDuration = nDuration - 1;
if nDuration <= 0 then
EffectManager.expireEffect(nodeActor, nodeEffect, 0);
else
DB.setValue(nodeEffect, "status", "number", 1);
DB.setValue(nodeEffect, "duration", "number", nDuration);
end
end
end
function onEffectTextEncode(rEffect)
local aMessage = {};
if rEffect.sUnits and rEffect.sUnits ~= "" then
local sOutputUnits = nil;
if rEffect.sUnits == "sec" then
sOutputUnits = "SEC";
elseif rEffect.sUnits == "min" then
sOutputUnits = "MIN";
elseif rEffect.sUnits == "hr" then
sOutputUnits = "HR";
elseif rEffect.sUnits == "day" then
sOutputUnits = "DAY";
end
if sOutputUnits then
table.insert(aMessage, "[UNITS " .. sOutputUnits .. "]");
end
end
return table.concat(aMessage, " ");
end
function onEffectTextDecode(sEffect, rEffect)
local s = sEffect;
local sUnits = s:match("%[UNITS ([^]]+)]");
if sUnits then
s = s:gsub("%[UNITS ([^]]+)]", "");
if sUnits == "SEC" then
rEffect.sUnits = "sec";
elseif sUnits == "MIN" then
rEffect.sUnits = "min";
elseif sUnits == "HR" then
rEffect.sUnits = "hr";
elseif sUnits == "DAY" then
rEffect.sUnits = "day";
end
end
return s;
end
seycyrus
January 17th, 2020, 06:03
Thanks for your work Yako!
YAKO SOMEDAKY
January 17th, 2020, 15:16
Happy to contribute, even with my follies!
But unfortunately I detected a failure and I have no idea why.
When there is only one "actor" in CT the effects "counter" does not work and when there is more than one "actor" the "counter" does not work in the last one.
YAKO SOMEDAKY
January 18th, 2020, 15:31
Problem solved, some returns were wrong, now the effects are working.
YAKO SOMEDAKY
January 18th, 2020, 15:40
local of file ->ruleset\scripts\manager_effect2.lua
name of file in base.xml -> <script name="EffectManager2" file="scripts/manager_effect2.lua" />
Converts time units and countdown works perfectly.
function onInit() EffectManager.registerEffectVar("nStatus", { sDBType = "number", sDBField = "status", bSkipAdd = false });
EffectManager.registerEffectVar("sUnits", { sDBType = "string", sDBField = "units", bSkipAdd = false });
EffectManager.setCustomOnEffectAddStart(onEffectAd dStart);
EffectManager.setCustomOnEffectStartTurn(onEffectS tartTurn);
EffectManager.setCustomOnEffectEndTurn(onEffectEnd Turn);
EffectManager.setCustomOnEffectActorStartTurn(onEf fectActorStartTurn);
EffectManager.setCustomOnEffectActorEndTurn(onEffe ctActorEndTurn);
EffectManager.setCustomOnEffectTextEncode(onEffect TextEncode);
EffectManager.setCustomOnEffectTextDecode(onEffect TextDecode);
end
function onEffectAddStart(rEffect)
rEffect.nStatus = 0;
rEffect.nDuration = rEffect.nDuration or 1;
if rEffect.sUnits == "min" then
rEffect.nDuration = rEffect.nDuration * 60;
rEffect.sUnits = "sec";
elseif rEffect.sUnits == "hr" then
rEffect.nDuration = rEffect.nDuration * 3600;
rEffect.sUnits = "sec";
elseif rEffect.sUnits == "day" then
rEffect.nDuration = rEffect.nDuration * 86400;
rEffect.sUnits = "sec";
end
end
function onEffectStartTurn(nodeActor, nodeEffect)
return false;
end
function onEffectEndTurn(nodeActor, nodeEffect)
return false;
end
function onEffectActorStartTurn(nodeActor, nodeEffect)
DB.setValue(nodeEffect, "status", "number", 1);
return true;
end
function onEffectActorEndTurn(nodeActor, nodeEffect)
local nDuration = DB.getValue(nodeEffect, "duration", 0);
local sUnits = DB.getValue(nodeEffect, "units", "");
local nStatus = DB.getValue(nodeEffect, "status", 0);
-- Convert to seconds
if sUnits == "min" then
sUnits = "sec";
nDuration = nDuration * 60;
DB.setValue(nodeEffect, "units", "string", sUnits);
elseif sUnits == "hr" then
sUnits = "sec";
nDuration = nDuration * 3600;
DB.setValue(nodeEffect, "units", "string", sUnits);
elseif sUnits == "day" then
sUnits = "sec";
nDuration = nDuration * 86400;
DB.setValue(nodeEffect, "units", "string", sUnits);
end
if sUnits == "sec" and nStatus == 1 then
nDuration = nDuration - 1;
end
if nDuration <= 0 and sUnits ~= "" and sUnits ~= "sec+" then
EffectManager.expireEffect(nodeActor, nodeEffect, 0);
else
DB.setValue(nodeEffect, "status", "number", 1);
DB.setValue(nodeEffect, "duration", "number", nDuration);
end
end
function onEffectTextEncode(rEffect)
local aMessage = {};
if rEffect.sUnits and rEffect.sUnits ~= "" then
local sOutputUnits = nil;
if rEffect.sUnits == "sec" then
sOutputUnits = "SEC";
elseif rEffect.sUnits == "min" then
sOutputUnits = "MIN";
elseif rEffect.sUnits == "hr" then
sOutputUnits = "HR";
elseif rEffect.sUnits == "day" then
sOutputUnits = "DAY";
end
if sOutputUnits then
table.insert(aMessage, "[UNITS " .. sOutputUnits .. "]");
end
end
return table.concat(aMessage, " ");
end
function onEffectTextDecode(sEffect, rEffect)
local s = sEffect;
local sUnits = s:match("%[UNITS ([^]]+)]");
if sUnits then
s = s:gsub("%[UNITS ([^]]+)]", "");
if sUnits == "SEC" then
rEffect.sUnits = "sec";
elseif sUnits == "MIN" then
rEffect.sUnits = "min";
elseif sUnits == "HR" then
rEffect.sUnits = "hr";
elseif sUnits == "DAY" then
rEffect.sUnits = "day";
end
end
return s;
end
YAKO SOMEDAKY
January 18th, 2020, 15:43
local of file ->ruleset\scripts\manager_effect2.lua
name of file in base.xml -> <script name="EffectManager2" file="scripts/manager_effect2.lua" />
Practically the same as the previous code but with an increment in the count.
function onInit() EffectManager.registerEffectVar("nStatus", { sDBType = "number", sDBField = "status", bSkipAdd = false });
EffectManager.registerEffectVar("sUnits", { sDBType = "string", sDBField = "units", bSkipAdd = false });
EffectManager.setCustomOnEffectAddStart(onEffectAd dStart);
EffectManager.setCustomOnEffectStartTurn(onEffectS tartTurn);
EffectManager.setCustomOnEffectEndTurn(onEffectEnd Turn);
EffectManager.setCustomOnEffectActorStartTurn(onEf fectActorStartTurn);
EffectManager.setCustomOnEffectActorEndTurn(onEffe ctActorEndTurn);
EffectManager.setCustomOnEffectTextEncode(onEffect TextEncode);
EffectManager.setCustomOnEffectTextDecode(onEffect TextDecode);
end
function onEffectAddStart(rEffect)
rEffect.nStatus = 0;
rEffect.nDuration = rEffect.nDuration or 1;
if rEffect.sUnits == "min" then
rEffect.nDuration = rEffect.nDuration * 60;
rEffect.sUnits = "sec";
elseif rEffect.sUnits == "hr" then
rEffect.nDuration = rEffect.nDuration * 3600;
rEffect.sUnits = "sec";
elseif rEffect.sUnits == "day" then
rEffect.nDuration = rEffect.nDuration * 86400;
rEffect.sUnits = "sec";
if rEffect.sUnits ~= "sec" and rEffect.nStatus ~= "0" then
rEffect.sUnits = "sec+"
rEffect.nStatus = 1;
end
end
end
function onEffectStartTurn(nodeActor, nodeEffect)
return true;
end
function onEffectEndTurn(nodeActor, nodeEffect)
return false;
end
function onEffectActorStartTurn(nodeActor, nodeEffect)
DB.setValue(nodeEffect, "status", "number", 1);
return true;
end
function onEffectActorEndTurn(nodeActor, nodeEffect)
local nDuration = DB.getValue(nodeEffect, "duration", 0);
local sUnits = DB.getValue(nodeEffect, "units", "");
local nStatus = DB.getValue(nodeEffect, "status", 0);
-- Convert to seconds
if sUnits == "min" then
sUnits = "sec";
nDuration = nDuration * 60;
DB.setValue(nodeEffect, "units", "string", sUnits);
elseif sUnits == "hr" then
sUnits = "sec";
nDuration = nDuration * 3600;
DB.setValue(nodeEffect, "units", "string", sUnits);
elseif sUnits == "day" then
sUnits = "sec";
nDuration = nDuration * 86400;
DB.setValue(nodeEffect, "units", "string", sUnits);
end
if sUnits == "sec+" then
nDuration = nDuration + 1;
elseif sUnits == "sec" and nStatus == 1 then
nDuration = nDuration - 1;
end
if nDuration <= 0 and sUnits ~= "" and sUnits ~= "sec+" then
EffectManager.expireEffect(nodeActor, nodeEffect, 0);
else
DB.setValue(nodeEffect, "status", "number", 1);
DB.setValue(nodeEffect, "duration", "number", nDuration);
end
return true;
end
function onEffectTextEncode(rEffect)
local aMessage = {};
if rEffect.sUnits and rEffect.sUnits ~= "" then
local sOutputUnits = nil;
if rEffect.sUnits == "sec+" then
sOutputUnits = "SEC+";
elseif rEffect.sUnits == "sec" then
sOutputUnits = "SEC";
elseif rEffect.sUnits == "min" then
sOutputUnits = "MIN";
elseif rEffect.sUnits == "hr" then
sOutputUnits = "HR";
elseif rEffect.sUnits == "day" then
sOutputUnits = "DAY";
end
if sOutputUnits then
table.insert(aMessage, "[UNITS " .. sOutputUnits .. "]");
end
end
return table.concat(aMessage, " ");
end
function onEffectTextDecode(sEffect, rEffect)
local s = sEffect;
local sUnits = s:match("%[UNITS ([^]]+)]");
if sUnits then
s = s:gsub("%[UNITS ([^]]+)]", "");
if sUnits == "SEC+" then
rEffect.sUnits = "sec+";
elseif sUnits == "SEC" then
rEffect.sUnits = "sec";
elseif sUnits == "MIN" then
rEffect.sUnits = "min";
elseif sUnits == "HR" then
rEffect.sUnits = "hr";
elseif sUnits == "DAY" then
rEffect.sUnits = "day";
end
end
return s;
end
Powered by vBulletin® Version 4.2.1 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.