mirror of
https://github.com/pret/pmd-red.git
synced 2026-06-13 04:00:55 -05:00
376 lines
8.8 KiB
C
376 lines
8.8 KiB
C
#include "global.h"
|
|
#include "debug.h"
|
|
#include "ground_script.h"
|
|
|
|
extern u8 gUnknown_2039A36;
|
|
extern u8 gUnknown_2039A38[];
|
|
extern u32 gUnknown_2039B48[];
|
|
extern u8 gUnknown_2039AC0[];
|
|
|
|
extern u32 gUnknown_8116588;
|
|
extern u32 gUnknown_8116538;
|
|
extern u32 gUnknown_8116560;
|
|
extern u8 gUnknown_8116594[];
|
|
extern u8 gUnknown_8116544[];
|
|
extern u8 gUnknown_811656C[];
|
|
|
|
extern DebugLocation gUnknown_81165C8;
|
|
|
|
extern void sub_809D520(void *);
|
|
extern u8 sub_80AC378(void);
|
|
extern u8 sub_80AD290(void);
|
|
extern u8 sub_80A8B74(void);
|
|
extern u8 sub_809A750(void);
|
|
extern s32 sub_80A882C(s16);
|
|
extern s32 sub_80AC240(s16);
|
|
extern s32 sub_80AD158(s16);
|
|
void FatalError(u32 *, const char *, ...) __attribute__((noreturn));
|
|
|
|
// -1 didn't match
|
|
void sub_809D520(void *a0)
|
|
{
|
|
u16 *ptr = a0;
|
|
u16 v = 0xFFFF;
|
|
*ptr = v;
|
|
}
|
|
|
|
s32 sub_809D52C(void *a0)
|
|
{
|
|
s16 *ptr = a0;
|
|
|
|
switch (ptr[0])
|
|
{
|
|
case 0: return 0;
|
|
case 1: return sub_80A882C(ptr[1]);
|
|
case 2: return sub_80AC240(ptr[1]);
|
|
case 3: return sub_80AD158(ptr[1]);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
void InitScriptData(ScriptData *a0)
|
|
{
|
|
s32 i;
|
|
|
|
a0->state = -1;
|
|
a0->savedState = 0;
|
|
a0->script.ptr2 = 0;
|
|
a0->script.ptr = 0;
|
|
a0->savedScript.ptr2 = 0;
|
|
a0->savedScript.ptr = 0;
|
|
a0->curScriptOp = 0;
|
|
a0->curPtr = 0;
|
|
a0->unk22 = -1;
|
|
a0->unk24 = 0;
|
|
a0->unk26 = 0xFF;
|
|
a0->branchDiscriminant = 0;
|
|
a0->unk2A = 0;
|
|
a0->unk2C = 0;
|
|
a0->unk30 = 0;
|
|
for (i = 0; i < 4; i++) {
|
|
a0->unk50[i].raw = 0;
|
|
}
|
|
}
|
|
|
|
void InitAction(Action *a0)
|
|
{
|
|
s32 i;
|
|
|
|
a0->callbacks = NULL;
|
|
a0->parentObject = NULL;
|
|
a0->group = -1;
|
|
a0->sector = 0xFF;
|
|
sub_809D520(&a0->unkC);
|
|
|
|
for (i = 0; i < 4; i++) {
|
|
a0->predefinedScripts[i] = NULL;
|
|
}
|
|
|
|
InitScriptData(&a0->scriptData);
|
|
InitScriptData(&a0->scriptData2);
|
|
}
|
|
|
|
void InitActionWithParams(Action *action, const CallbackData *callbacks, void *parent, s16 group, s8 sector)
|
|
{
|
|
s32 group_s32;
|
|
s32 sector_s32;
|
|
|
|
group_s32 = group;
|
|
sector_s32 = sector;
|
|
|
|
InitAction(action);
|
|
|
|
action->callbacks = callbacks;
|
|
action->parentObject = parent;
|
|
action->group = group_s32;
|
|
action->sector = sector_s32;
|
|
action->unk8[0] = callbacks->maybeId;
|
|
|
|
if(callbacks->func04)
|
|
action->unk8[1] = callbacks->func04(parent);
|
|
else
|
|
action->unk8[1] = 0;
|
|
}
|
|
|
|
void sub_809D648(Action *action)
|
|
{
|
|
InitAction(action);
|
|
}
|
|
|
|
UNUSED s16 sub_809D654(Action *action)
|
|
{
|
|
return action->scriptData.savedState;
|
|
}
|
|
|
|
UNUSED s16 sub_809D65C(Action *action)
|
|
{
|
|
if(action->scriptData.savedState != 0)
|
|
return action->scriptData.state;
|
|
else
|
|
return -1;
|
|
}
|
|
|
|
bool8 sub_809D678(Action *action)
|
|
{
|
|
return action->scriptData.savedState == 0 ? FALSE : TRUE;
|
|
}
|
|
|
|
bool8 sub_809D684(Action *action, ScriptCommand **scriptPtr)
|
|
{
|
|
if(action->scriptData.savedState != 0)
|
|
{
|
|
if(action->scriptData.savedScript.ptr != 0)
|
|
{
|
|
if(action->scriptData.savedScript.ptr2 == *scriptPtr) return 1;
|
|
}
|
|
else
|
|
{
|
|
if(action->scriptData.script.ptr2 == *scriptPtr) return 1;
|
|
}
|
|
}
|
|
if(action->scriptData2.savedState != 0)
|
|
{
|
|
if(action->scriptData2.savedScript.ptr != 0)
|
|
{
|
|
if(action->scriptData2.savedScript.ptr2 == *scriptPtr) return 1;
|
|
}
|
|
else
|
|
{
|
|
if(action->scriptData2.script.ptr2 == *scriptPtr) return 1;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
void SetPredefinedScript(Action *param_1, s16 index, ScriptCommand *param_3)
|
|
{
|
|
param_1->predefinedScripts[index] = param_3;
|
|
}
|
|
|
|
bool8 sub_809D6E4(Action *param_1, ScriptInfoSmall *script, s16 _index)
|
|
{
|
|
ScriptCommand *scriptPtr;
|
|
s32 index = _index;
|
|
|
|
scriptPtr = param_1->predefinedScripts[index];
|
|
script->ptr = scriptPtr;
|
|
script->state = index;
|
|
script->group = param_1->group;
|
|
script->sector = param_1->sector;
|
|
return scriptPtr != NULL;
|
|
}
|
|
|
|
void sub_809D710(Action *param_1, ScriptInfoSmall *script, s16 index)
|
|
{
|
|
s32 index_s32 = index;
|
|
script->ptr = gFunctionScriptTable[index_s32].script;
|
|
script->state = 2;
|
|
if (param_1 != NULL) {
|
|
script->group = param_1->group;
|
|
script->sector = param_1->sector;
|
|
}
|
|
else {
|
|
script->group = -1;
|
|
script->sector = -1;
|
|
}
|
|
}
|
|
|
|
bool8 InitActionScriptData(Action *param_1, const DebugLocation *unused)
|
|
{
|
|
InitScriptData(¶m_1->scriptData);
|
|
InitScriptData(¶m_1->scriptData2);
|
|
return TRUE;
|
|
}
|
|
|
|
bool8 sub_809D770(Action *param_1, DebugLocation *unused)
|
|
{
|
|
InitScriptData(¶m_1->scriptData);
|
|
InitScriptData(¶m_1->scriptData2);
|
|
param_1->scriptData.savedState = 4;
|
|
return TRUE;
|
|
}
|
|
|
|
bool8 GroundScript_ExecutePP(Action *action, s32 *param_2, ScriptInfoSmall *param_3, const DebugLocation *unused)
|
|
{
|
|
if ((param_3 == NULL) || (param_3->ptr == NULL)) {
|
|
return FALSE;
|
|
}
|
|
switch(param_3->state) {
|
|
case 2:
|
|
case 3:
|
|
if (action->scriptData.state == 1) {
|
|
action->scriptData2 = action->scriptData;
|
|
break;
|
|
}
|
|
if (action->scriptData.state == 5) {
|
|
InitScriptData(&action->scriptData2);
|
|
}
|
|
break;
|
|
case 5:
|
|
if (action->scriptData.state != 2) {
|
|
// "execute script type error B" at ../ground/ground_script.c:688
|
|
FatalError(&gUnknown_8116538, gUnknown_8116544);
|
|
}
|
|
if (action->scriptData2.state != -1) {
|
|
// "execute script type error C" at ../ground/ground_script.c:689
|
|
FatalError(&gUnknown_8116560, gUnknown_811656C);
|
|
}
|
|
action->scriptData2 = action->scriptData;
|
|
break;
|
|
case 0:
|
|
if (action->scriptData.state != 1) goto _0809D84A;
|
|
action->scriptData2 = action->scriptData;
|
|
break;
|
|
case 1:
|
|
_0809D84A:
|
|
InitScriptData(&action->scriptData2);
|
|
break;
|
|
default:
|
|
// "execute script type error %d" at ../ground/ground_script.c:708
|
|
FatalError(&gUnknown_8116588, gUnknown_8116594, param_3->state);
|
|
}
|
|
InitScriptData(&action->scriptData);
|
|
if (param_2 != NULL) {
|
|
action->unkC.raw = param_2[0];
|
|
}
|
|
else {
|
|
sub_809D520(&action->unkC);
|
|
}
|
|
action->scriptData.state = param_3->state;
|
|
action->scriptData.savedState = 3;
|
|
action->scriptData.script.group = param_3->group;
|
|
action->scriptData.script.sector = param_3->sector;
|
|
action->scriptData.script.ptr = param_3->ptr;
|
|
action->scriptData.script.ptr2 = param_3->ptr;
|
|
action->scriptData.savedScript.ptr = 0;
|
|
action->scriptData.savedScript.ptr2 = NULL;
|
|
|
|
if (action->callbacks->func14 != 0) {
|
|
action->callbacks->func14(action->parentObject, &action->scriptData.unk26);
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
bool8 sub_809D8C0(Action *param_1, s32 *param_2, s16 index, DebugLocation *debug)
|
|
{
|
|
ScriptInfoSmall auStack28;
|
|
|
|
sub_809D6E4(param_1,&auStack28,index);
|
|
return GroundScript_ExecutePP(param_1, param_2, &auStack28, debug);
|
|
}
|
|
|
|
u8 sub_809D8EC(Action *param_1, s16 param_2)
|
|
{
|
|
s32 param_2_s32;
|
|
|
|
param_2_s32 = param_2;
|
|
|
|
if ((param_2 == 0) && (sub_809A750() == 0)) {
|
|
param_1->scriptData.script.ptr = sub_80A2460(param_1, 0);
|
|
return 0;
|
|
}
|
|
else {
|
|
param_1->scriptData.unk22 = param_2_s32;
|
|
param_1->scriptData.savedState = 2;
|
|
gUnknown_2039A36 = 1;
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
|
|
bool8 GroundScript_Cancel(Action *r0)
|
|
{
|
|
// NOTE: Will always return TRUE
|
|
return sub_809D770(r0, &gUnknown_81165C8);
|
|
}
|
|
|
|
u8 sub_809D940(void)
|
|
{
|
|
u8 ret;
|
|
|
|
ret = sub_80A8B74();
|
|
ret |= sub_80AC378();
|
|
ret |= sub_80AD290();
|
|
return ret;
|
|
}
|
|
|
|
bool8 sub_809D968(Action *param_1, s16 param_2)
|
|
{
|
|
s16 sVar1;
|
|
s16 sVar2;
|
|
bool8 ret;
|
|
|
|
s32 param_2_s16 = param_2;
|
|
|
|
ret = FALSE;
|
|
sVar1 = param_1->scriptData.unk22;
|
|
if ((sVar1 != -1) && (sVar1 == param_2_s16)) {
|
|
param_1->scriptData.unk22 = -1;
|
|
ret = TRUE;
|
|
}
|
|
sVar2 = param_1->scriptData2.unk22;
|
|
if ((sVar2 != -1) && (sVar2 == param_2_s16)) {
|
|
param_1->scriptData2.unk22 = -1;
|
|
ret = TRUE;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
void sub_809D9B8(s16 index)
|
|
{
|
|
s32 index_s16 = index;
|
|
gUnknown_2039A38[index_s16] = 1;
|
|
gUnknown_2039B48[index_s16] = 0;
|
|
gUnknown_2039A36 = 1;
|
|
}
|
|
|
|
void sub_809D9E0(s16 index, s32 r1)
|
|
{
|
|
s32 index_s16 = index;
|
|
gUnknown_2039A38[index_s16] = 1;
|
|
gUnknown_2039B48[index_s16] = r1;
|
|
gUnknown_2039A36 = 1;
|
|
}
|
|
|
|
bool8 sub_809DA08(Action *param_1, s16 index, u32 param_3)
|
|
{
|
|
s32 index_s32;
|
|
|
|
index_s32 = index;
|
|
gUnknown_2039B48[index_s32] = param_3;
|
|
if (index_s32 == 0) {
|
|
if (sub_809A750() == 0) {
|
|
return FALSE;
|
|
}
|
|
param_1->scriptData.unk22 = index_s32;
|
|
}
|
|
else {
|
|
param_1->scriptData.unk22 = index_s32 | 0x80;
|
|
gUnknown_2039A38[index_s32] = 1;
|
|
gUnknown_2039AC0[index_s32] = 1;
|
|
}
|
|
param_1->scriptData.savedState = 2;
|
|
gUnknown_2039A36 = 1;
|
|
return TRUE;
|
|
}
|