Dire Weasel
August 13th, 2021, 22:14
I'm putting together a simple extension to support a skip turn effect.
Unfortunately, it looks like I'll need to replace CombatManager.nextActor(), which is pretty drastic and very fragile.
I'd obviously prefer a function I could hook.
How feasible would it be to call a function like shouldSkipActor() from nextActor() in CoreRPG's manager_combat.lua?
Something like:
function nextActor(bSkipBell, bNoRoundAdvance)
if not Session.IsHost then
return;
end
local nodeActive = CombatManager.getActiveCT();
local nIndexActive = 0;
-- Check the skip hidden NPC option
local bSkipHidden = OptionsManager.isOption("CTSH", "on");
-- Determine the next actor
local nodeNext = nil;
local nIndexNext = 0;
local aEntries = CombatManager.getSortedCombatantList();
local nEntriesCount = #aEntries
if nEntriesCount > 0 then
if nodeActive then
for i = 1, nEntriesCount do
if aEntries[i] == nodeActive then
nIndexActive = i;
break;
end
end
end
for i = nIndexActive + 1, nEntriesCount do
if not CombatManager.shouldSkipActor(aEntries[i], bSkipHidden) then
nodeNext = aEntries[i];
nIndexNext = i;
break;
end
end
end
-- If next actor available, advance effects, activate and start turn
if nodeNext then
-- Show turn message for skipped actors
for i = nIndexActive + 1, nIndexNext - 1 do
CombatManager.showTurnMessage(aEntries[i], false);
end
-- End turn for current actor
CombatManager.onTurnEndEvent(nodeActive);
-- Process effects in between current and next actors
if nodeActive then
CombatManager.onInitChangeEvent(nodeActive, nodeNext);
else
CombatManager.onInitChangeEvent(nil, nodeNext);
end
-- Start turn for next actor
CombatManager.requestActivation(nodeNext, bSkipBell);
CombatManager.onTurnStartEvent(nodeNext);
elseif not bNoRoundAdvance then
-- Show turn message for skipped actors
for i = nIndexActive + 1, nEntriesCount do
CombatManager.showTurnMessage(aEntries[i], false);
end
CombatManager.nextRound(1);
end
end
function shouldSkipActor(nodeCT, bSkipHidden)
return bSkipHidden and DB.getValue(nodeCT, "friendfoe", "") ~= "friend" and CombatManager.isCTHidden(nodeCT)
end
Unfortunately, it looks like I'll need to replace CombatManager.nextActor(), which is pretty drastic and very fragile.
I'd obviously prefer a function I could hook.
How feasible would it be to call a function like shouldSkipActor() from nextActor() in CoreRPG's manager_combat.lua?
Something like:
function nextActor(bSkipBell, bNoRoundAdvance)
if not Session.IsHost then
return;
end
local nodeActive = CombatManager.getActiveCT();
local nIndexActive = 0;
-- Check the skip hidden NPC option
local bSkipHidden = OptionsManager.isOption("CTSH", "on");
-- Determine the next actor
local nodeNext = nil;
local nIndexNext = 0;
local aEntries = CombatManager.getSortedCombatantList();
local nEntriesCount = #aEntries
if nEntriesCount > 0 then
if nodeActive then
for i = 1, nEntriesCount do
if aEntries[i] == nodeActive then
nIndexActive = i;
break;
end
end
end
for i = nIndexActive + 1, nEntriesCount do
if not CombatManager.shouldSkipActor(aEntries[i], bSkipHidden) then
nodeNext = aEntries[i];
nIndexNext = i;
break;
end
end
end
-- If next actor available, advance effects, activate and start turn
if nodeNext then
-- Show turn message for skipped actors
for i = nIndexActive + 1, nIndexNext - 1 do
CombatManager.showTurnMessage(aEntries[i], false);
end
-- End turn for current actor
CombatManager.onTurnEndEvent(nodeActive);
-- Process effects in between current and next actors
if nodeActive then
CombatManager.onInitChangeEvent(nodeActive, nodeNext);
else
CombatManager.onInitChangeEvent(nil, nodeNext);
end
-- Start turn for next actor
CombatManager.requestActivation(nodeNext, bSkipBell);
CombatManager.onTurnStartEvent(nodeNext);
elseif not bNoRoundAdvance then
-- Show turn message for skipped actors
for i = nIndexActive + 1, nEntriesCount do
CombatManager.showTurnMessage(aEntries[i], false);
end
CombatManager.nextRound(1);
end
end
function shouldSkipActor(nodeCT, bSkipHidden)
return bSkipHidden and DB.getValue(nodeCT, "friendfoe", "") ~= "friend" and CombatManager.isCTHidden(nodeCT)
end