pmd-red/src/ground_script_2.c
2024-11-30 21:14:52 -05:00

104 lines
2.7 KiB
C

#include "debug.h"
#include "global.h"
#include "event_flag.h"
#include "ground_map_1.h"
#include "ground_script.h"
extern u8 gAnyScriptLocked;
extern u8 gScriptLocks[];
extern u8 gScriptLockConds[];
extern u8 gUnknown_8116848[];
bool8 GroundLivesNotifyAll(s16);
bool8 GroundObjectsNotifyAll(s16);
bool8 GroundEffectsNotifyAll(s16);
void GroundScript_Unlock(void)
{
s32 index;
bool8 cond;
if(gAnyScriptLocked == 0) return;
gAnyScriptLocked = 0;
index = 0;
for (index = 0; index <= 0x80; index++) {
if(gScriptLocks[index] != 0) {
Log(1, gUnknown_8116848, index);
cond = GroundMapNotifyAll(index);
cond |= GroundLivesNotifyAll(index);
cond |= GroundObjectsNotifyAll(index);
cond |= GroundEffectsNotifyAll(index);
if(gScriptLockConds[index] != 0) {
if (cond) {
GroundMapNotifyAll(index | 0x80);
GroundLivesNotifyAll(index | 0x80);
GroundObjectsNotifyAll(index | 0x80);
GroundEffectsNotifyAll(index | 0x80);
gScriptLocks[index] = gScriptLockConds[index] = 0;
}
} else {
gScriptLocks[index] = 0;
}
}
}
}
const ScriptCommand *FindLabel(Action *action, s32 r1)
{
ScriptCommand script;
const ScriptCommand *scriptPtr2;
const ScriptCommand *scriptPtr;
scriptPtr2 = action->scriptData.script.ptr2;
scriptPtr = scriptPtr2 + 1;
while(1) {
script = *scriptPtr;
scriptPtr++;
if(script.op == 0xF4 && r1 == script.argShort) break;
// DS: Assert(script.op != 0, "script search label error %d", label)
// DS: Assert(script.op != 0xF6, "script search label error %d", label)
}
return scriptPtr;
}
const ScriptCommand *ResolveJump(Action *action, s32 r1)
{
ScriptCommand script;
const ScriptCommand *scriptPtr;
s32 temp;
scriptPtr = action->scriptData.script.ptr;
while(1) {
script = *scriptPtr;
if (script.op == 0xCC)
{
if(FlagJudge(r1, script.arg1, JUDGE_EQ))
return FindLabel(action, script.argShort);
}
else if (script.op == 0xCD)
{
if(FlagJudge(r1, script.arg1, script.argByte))
return FindLabel(action, script.argShort);
}
else if (script.op == 0xCE)
{
temp = GetScriptVarValue(action->scriptData.localVars.buf, (s16)script.arg1);
if(FlagJudge(r1, temp, script.argByte))
return FindLabel(action, script.argShort);
}
else
{
return scriptPtr;
}
scriptPtr++;
}
}