PDA

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