#define NB_ELEM 75
class SOOLStck;
union SOOLFile
{
struct
{
char signature[4];
u32 size;
u16 numSections;
u8 _pad[2];
} hdr;
u8 bytes[];
};
union SOOLSctn
{
struct
{
u16 offsVars;
u16 offsVarsEnd;
u16 offsVirtualElements;
u16 numVirtualElements;
u16 unk08;
u16 numPublicMethods;
u16 offsMethodsEnd;
u16 numMethods;
} hdr;
u8 bytes[];
};
struct SOOLElem
{
u16 key;
u16 value;
};
class SOOLStck
{
private:
s16 m_Array[NB_ELEM];
u8 _pad[2];
s32 m_Count;
public:
void Reset(void);
bool IsFull(void);
bool IsEmpty(void);
bool Push(s16 value);
s16 Pop(void);
void Trim(s32 n);
s16 Top(s32 i);
void Reset2(void);
void PrintValues(void);
};
typedef void (*UnkC8Func)(void*);
extern SOOLCtx *func_8005A820(void *unk, s16 ctxId);
extern void io_print(const char*);
class SOOLCtx
{
private:
u32 m_CtxId;
void *m_unk04;
SOOLStck m_Stack;
u16 m_unkA4;
u16 m_unkA6;
s32 m_unkA8;
SOOLCtx *m_ExecCtx;
s16 m_Acc;
s16 m_unkB2;
u8 m_Flags;
u8 _pad[3];
SOOLSctn *m_Section;
u16 *m_MethodOffsets;
s32 m_unkC0;
void *m_unkC4;
UnkC8Func m_unkC8;
public:
SOOLCtx(u32 ctxId, struct SOOLFile *file, u32 sctnOffset, s32 sp10, void *sp14);
void func_800612E0(void);
s32 Step(s16 *offs);
u16 GetElementValue(u16 key);
s8 GetFlags(void);
u16 GetA4(void);
void SetA4(u16 value);
u16 GetA6(void);
s32 GetA8(void);
s32 GetCtxId(void);
void func_8006261C(u16 a1);
void CheckMethod(u16 methodId);
s32 Get04(void);
void Set04(void *ptr);
void *GetC4(void);
void CheckVariable(s16 offset);
u8 *GetSectionData(u16 offset);
void SetC8(UnkC8Func ptr);
void SetFlags(u8 flags, bool bSet);
void func_80062818(void);
void func_80062854(void)
void func_80062864(void)
void *GetAccPtr()
void *GetB2Ptr()
SOOLSctn *GetSection()
SOOLStck *GetStack(void)
};
SOOLCtx::SOOLCtx(u32 ctxId, struct SOOLFile *file, u32 stcnOffset, s32 sp10, void *sp14)
{
m_CtxId = ctxId;
m_unk04 = NULL;
m_unkA4 = 0xFFFF;
m_unkA6 = 0;
m_unkA8 = 0;
m_ExecCtx = this;
m_Acc = 0;
m_unkB2 = 0;
m_Section = (SOOLSctn*) &file.bytes[stcnOffset];
m_MethodOffsets = (m_Section->hdr.numMethods != 0) ? &m_Section->bytes[sizeof(SOOLSctn)] : NULL;
m_unkC0 = sp10;
m_unkC4 = sp14;
m_unkC8 = NULL;
}
void SOOLCtx::func_800612E0(void)
{
if(m_Section != NULL)
{
m_Section = NULL;
}
if(m_unkC8 != NULL)
{
m_unkC8(m_unk04);
}
}
s32 SOOLCtx::Step(s16 *offs)
{
switch(m_Section->bytes[*offs])
{
case 0x00:
SetFlags((1 << 1), true);
return 1;
case 0x01:
return 0;
case 0x02:
struct SOOLStck *stck = GetStack();
*offs = stck->Pop();
m_ExecCtx = func_8005A820(GetC4(), stck->Pop());
return 1;
case 0x03:
if((GetStack()->Pop() << 16) != 0)
{
*offs += 3;
return 1;
}
case 0x04:
u8 *mem = &m_ExecCtx->m_Section->bytes[*offs];
*offs = mem[1] | (mem[2] << 8);
return 1;
case 0x05:
case 0x06:
case 0x09:
u8 *mem = &m_ExecCtx->m_Section->bytes[*offs];
GetStack()->Push((s16)(cmd[1] | (cmd[2] << 8)));
*offs += 3;
return 1;
case 0x07:
u8 *cmd = m_ExecCtx->m_Section->bytes[*offs];
m_ExecCtx->CheckVariable(cmd[1] | (cmd[2] << 8));
cmd = m_ExecCtx->m_Section->bytes[*offs];
s16 *unk = m_ExecCtx->GetSectionData(cmd[1] | (cmd[2] << 8));
GetStack()->Push(unk[0]);
*offs += 3;
return 1;
case 0x08:
u8 *cmd = &m_ExecCtx->m_Section.bytes[*offs];
SOOLCtx *ctx = func_8005A820(GetC4(), cmd[1] | (cmd[2] << 8));
cmd = &m_ExecCtx->m_Section.bytes[*offs];
ctx->CheckVariable(cmd[3] | (cmd[4] << 8));
cmd = &m_ExecCtx->m_Section.bytes[*offs];
ctx = func_8005A820(GetC4(), cmd[1] | (cmd[2] << 8));
cmd = &m_ExecCtx->m_Section.bytes[*offs];
u16 *var = ctx->GetSectionData(cmd[3] | (cmd[4] << 8));
GetStack()->Push(*var);
*offs = *offs + 5;
return 1;
case 0x0A:
SOOLStck *stck = GetStack();
u8 *cmd = m_ExecCtx->m_Section.bytes[*offs];
stck->Push(cmd[1] | cmd[2] << 8);
stck = GetStack();
cmd = m_ExecCtx.m_Section.bytes[*offs];
stck.Push(cmd[3] | cmd[4] << 8);
*offs = *offs + 5;
return 1;
case 0x0B:
SOOLStck *stck = GetStack();
u16 key = stck->Pop();
u16 value = func_8005B410(GetC4(), stck->Pop(), key);
stck->Push(value);
*offs = *offs + 1;
return 1;
case 0x0C:
SOOLStck *stck = GetStack();
u16 key = stck->Pop();
u16 value = func_8005B410(GetC4(), stck->Top(1), key)
stck->Push(value);
*offs = *offs + 1;
return 1;
case 0x0D:
SOOLStack *stck = GetStack()
u16 key = stck->Pop();
u16 ctxId = stck->Pop();
SOOLCtx *ctx = func_8005A820(GetC4(), ctxId);
ctx->CheckVariable(func_8005B410(GetC4(), ctxId, key));
ctx = func_8005A820(GetC4(), ctxId);
s16 *var = ctx->GetSectionData(func_8005B410(GetC4(), ctxId, key))
stck->Push(*var);
*offs = *offs + 1;
return 1;
case 0x0E:
u8 *cmd = &m_ExecCtx->m_Section.bytes[*offs];
if(m_unkA4 == cmd[1] | (cmd[2] << 8))
{
*offs = (cmd[3] | cmd[4] << 8)
return 1;
}
cmd = &m_ExecCtx->m_Section.bytes[*offs];
GetStack()->Push(cmd[2] << 8 | cmd[1])
*offs = *offs + 5;
return 1;
case 0x0F:
SOOLStck *stck = GetStack()
if(stck->Pop() != 0)
{
this->func_8006261C(stck->Pop());
*offs = *offs + 1;
return 1;
}
stck->Pop();
*offs = *offs + 1;
return 1;
case 0x10:
SetFlags(1 << 2, true);
*offs = *offs + 1;
return 1;
case 0x11: break;
SetFlags(1 << 2, false);
*offs = *offs + 1;
return 1;
case 0x12:
SOOLStck *stck = GetStack()
if(m_ExecCtx->GetA4() == s1->Pop())
{
s1->Push(1);
}
else
{
s1->Push(0);
}
*offs = *offs + 1;
return 1;
case 0x13:
SOOLStck *stck = GetStack()
if(func_8005A820(GetC4(), s1->Pop())->GetA4() == s1->Pop())
{
stck->Push(1);
}
else
{
stck->Push(0)
}
*offs = *offs + 1;
return 1;
case 0x14:
SOOLStck *stck = GetStack()
stck->Push((s32)(stck->Pop() << 16) < 1);
*offs = *offs + 1;
return 1;
case 0x15:
SOOLStck *stck = GetStack()
stck->Push(((stck->Pop() ^ stck->Pop()) << 16) < 1);
*offs = *offs + 1;
return 1;
case 0x16: break;
SOOLStck *stck = GetStack();
stck->Push(0 < (stck->Pop() ^ stck-Pop()) << 16)
*offs = *offs + 1;
return 1;
case 0x17:
SOOLStck *stck = GetStack()
if(stck->Pop() << 16 != 0)
{
if(stck->Pop() << 16 != 0)
{
stck->Push(1)
*offs = *offs + 1;
return 1;
}
else
{
stck->Push(0)
*offs = *offs + 1;
return 1;
}
}
stck->Pop();
stck->Push(0);
*offs = *offs + 1;
return 1;
case 0x18: break;
SOOLSTck *stck = GetStack()
if(stck->Pop() << 16 != 0)
{
stck->Pop();
stck->Push(1);
*offs = *offs + 1;
return 1;
}
else
{
if(stck->Pop() << 16 != 0)
{
stck->Pop();
stck->Push(1);
*offs = *offs + 1;
return 1;
}
}
stck->Pop();
stck->Push(0);
*offs = *offs + 1;
return 1;
case 0x19:
SOOLStck *stck = GetStack();
stck->Push(stck->Pop() - stck->Pop());
*acc++;
return 1;
case 0x1A:
SOOLStck *stck = GetStack();
stck->Push(stck->Pop() + stck->Pop());
*acc++;
return 1;
case 0x1B:
SOOLStck *stck = GetStack();
s16 temp = stck->Pop();
if(stck->Top(1) << 16 == 0)
{
io_print("SOOL Engine: you have tried to divide an expression by zero.");
}
stck->Push(temp % stck->Pop());
*acc++;
return 1;
case 0x1C:
SOOLStck *stck = GetStack();
stck->Push(stck->Pop() * stck->Pop());
*acc++;
return 1;
case 0x1D:
SOOLStck *stck = GetStack();
s16 temp = stck->Pop();
if(stck->Top(1) << 16 == 0)
{
io_print("SOOL Engine: you have tried to divide an expression by zero.");
}
stck->Push(temp / stck->Pop());
*acc++;
return 1;
case 0x1E:
SOOLStck *stck = GetStack();
s16 val1 = stck->Pop();
s16 val2 = stck->Pop();
stck->Push(val1 < val2);
*offs++;
return 1;
case 0x1F:
SOOLStck *stck = GetStack();
s16 val1 = stck->Pop();
s16 val2 = stck->Pop();
stck->Push(val2 < val1);
*offs++;
return 1;
case 0x20:
SOOLStck *stck = GetStack();
s16 val1 = stck->Pop();
s16 val2 = stck->Pop();
stck->Push(!(val2 < val1));
*offs++;
return 1;
case 0x21:
SOOLStck *stck = GetStack();
s16 val1 = stck->Pop();
s16 val2 = stck->Pop();
stck->Push(!(val1 < val2));
*offs++;
return 1;
case 0x22:
SOOLStck *stck = GetStack();
stck->Push(-stck->Pop());
*offs++;
return 1;
case 0x23:
SOOLStck *stck = GetStack();
stck->Push(stck->Pop() & stck->Pop());
*offs++;
return 1;
case 0x24:
SOOLStck *stck = GetStack();
stck->Push(stck->Pop() | stck->Pop());
*offs++;
return 1;
case 0x25:
SOOLStck *stck = GetStack();
stck->Push(stck->Pop() << stck->Pop());
*offs++;
return 1;
case 0x26:
SOOLStck *stck = GetStack();
stck->Push(stck->Pop() >> stck->Pop());
*offs++;
return 1;
case 0x28:
SOOLStck *stck = GetStack();
s16 varOffset = stck->Pop();
s16 value = stck->Top(1);
m_ExecCtx->CheckVariable(s0);
u16 *var = m_ExecCtx->GetSectionData(varOffset);
*var = value;
*offs++;
return 1;
case 0x29:
SOOLStck *stck = GetStack();
s16 varOffset = stck->Pop();
s16 ctxId = stck->Pop();
s16 value = stck->Top();
func_8005A820(GetC4(), ctxId)->CheckVariable(varOffset);
u16 *var = func_8005A820(GetC4(), ctxId)->GetSectionData(varOffset);
*var = value;
*offs++;
return 1;
case 0x2A:
u16 varOffset = GetStack()->Pop();
u16 value = *m_ExecCtx->GetSectionData(varOffset);
u16 *var = m_ExecCtx->GetSectionData(varOffset);
*var = value + 1;
*offs = *offs + 1;
return 1;
case 0x2B:
SOOLStck *stck = GetStack();
u16 varOffset = stck->Pop();
u16 ctxId = stck->Pop();
func_8005A820(GetC4(), ctxId)->CheckVariable(varOffset)
u16 *var = func_8005A820(GetC4(), ctxId)->GetSectionData(varOffset);
*var = *var + 1;
*offs = *offs + 1;
return 1;
case 0x2C:
u16 varOffset = GetStack()->Pop();
u16 value = *m_ExecCtx->GetSectionData(varOffset);
u16 *var = m_ExecCtx->GetSectionData(varOffset);
*var = value - 1;
*offs = *offs + 1;
return 1;
case 0x2D:
SOOLStck *stck = GetStack();
u16 varOffset = stck->Pop();
u16 ctxId = stck->Pop();
func_8005A820(GetC4(), ctxId)->CheckVariable(varOffset);
u16 *var = func_8005A820(GetC4(), ctxId)->GetSectionData(varOffset);
*var = *var - 1;
*offs++;
return 1;
case 0x2E:
SOOLStck *stck = GetStack();
u16 *var1 = m_ExecCtx->GetSectionData(stck->Pop());
u16 *var2 = m_ExecCtx->GetSectionData(stck->Pop());
*var2 = *var1;
*offs++;
return 1;
case 0x2F:
SOOLStck *stck = GetStack();
u16 varOffset = stck->Pop();
u16 ctxId = stck->Pop();
func_8005A820(GetC4(), ctxId)->CheckVariable(varOffset);
u16 *var = func_8005A820(GetC4(), ctxId)->GetSectionData(varOffset);
*var = *var + stck->Pop();
*offs = *offs + 1;
return 1;
case 0x30: break;
SOOLStck *stck = GetStack()
u16 varOffset = stck->Pop();
u16 *var = m_ExecCtx->GetSectionData(varOffset);
u16 value = *var;
u16 newValue = value - stck->Pop();
var = m_ExecCtx->GetSectionData(varOffset);
*var = newValue;
*offs = *offs + 1;
return 1;
case 0x31:
SOOLStck *stck = GetStack();
u16 varOffset = stck->Pop();
u16 ctxId = stck->Pop();
func_8005A820(GetC4(), ctxId)->CheckVariable();
u16 *var = func_8005A820(GetC4(), ctxId)->GetSectionData(varOffset);
*var = *var - stck->Pop();
*offs = *offs + 1;
return 1;
case 0x32:
SetFlags(1 << 3, false);
*offs = *offs + 1;
return 1;
case 0x34:
m_ExecCtx->SetFlags(1 << 0, true);
m_ExecCtx->SetFlags(1 << 3, false);
*offs = *offs + 1;
return 1;
case 0x35:
SOOLCtx *ctx = func_8005A820(GetC4(), GetStack()->Pop());
ctx->SetFlags(1 << 0, false);
ctx->SetFlags(1 << 0, false);
*offs = *offs + 1;
return 1;
case 0x36:
func_8005A820(GetC4, GetStack->Pop())->SetFlags(1, 1)
*offs = *offs + 1;
return 1;
case 0x37:
m_ExecCtx->func_8006261C(GetStack()->Pop());
if(m_ExecCtx->GetA8() != 0)
{
m_ExecCtx->SetFlags(1 << 3, false);
}
*offs = *offs + 1;
return 1;
case 0x38: break;
SOOLStck *stck = GetStack()
SOOLCtx *ctx = func_8005A820(GetC4(), stck->Pop())
func_8006261C(ctx, stck->Pop())
if(ctx->GetA8() != 0)
{
ctx->SetFlags(1 << 3, false)
}
*offs = *offs + 1;
return 1;
case 0x39:
SOOLStck *stck = GetStack();
u16 idx = stck->Pop();
m_ExecCtx->CheckMethod(idx);
stck->Push(m_ExecCtx->GetCtxId())
*offs = *offs + 1;
stck->Push(*offs);
*offs = m_ExecCtx->unkBC[idx];
return 1;
case 0x3A: break;
SOOLStck *stck = GetStack()
u16 ctxId = stck->Pop()
u16 methodId = stck->Pop()
stck->Push(m_ExecCtx->GetCtxId())
*offs = *offs + 1;
stck->Push(*offs);
m_ExecCtx = func_8005A820(GetC4(), ctxId);
m_ExecCtx->CheckMethod(methodId);
*offs = m_ExecCtx->unkBC[methodId];
return 1;
case 0x3B:
SOOLStck *stck = GetStack();
stck->Pop();
*acc++;
return 1;
case 0x3C + 0:
case 0x3C + 1:
case 0x3C + 2:
case 0x3C + 3:
case 0x3C + 4:
case 0x3C + 5:
case 0x3C + 6:
case 0x3C + 7:
case 0x3C + 8:
case 0x3C + 9:
case 0x3C + 10:
case 0x3C + 11:
case 0x3C + 12:
case 0x3C + 13:
case 0x3C + 14:
s32 sp10 = 0;
struct SOOLStck *stck = GetStack();
funcptr_8008C514(this, stck, &sp10);
stck->Trim(m_ExecCtx->m_Section->bytes[*acc] + (sp10 + -0x3B));
*acc++;
return 1;
case 0x27:
case 0x33:
case 0x4B:
case 0x4C:
case 0x4D:
case 0x4E:
case 0x4F:
io_print("SOOL Engine: Encountered an unknown operator code.");
break;
case 0x50 + 0:
case 0x50 + 1:
case 0x50 + 2:
case 0x50 + 3:
case 0x50 + 4:
case 0x50 + 5:
case 0x50 + 6:
case 0x50 + 7:
case 0x50 + 8:
case 0x50 + 9:
case 0x50 + 10:
case 0x50 + 11:
case 0x50 + 12:
case 0x50 + 13:
case 0x50 + 14:
s32 sp14 = 0;
struct SOOLStck *stck = GetStack();
s16 retval = funcptr_8008C510(this, stck, &sp14);
stck->Trim(m_ExecCtx->m_Section->bytes[*acc] + (sp14 - 0x4F));
stck->Push(retval);
*acc++;
return 1;
}
}
u16 SOOLCtx::GetElementValue(u16 key)
{
s32 index;
if(m_Section->hdr.numVirtualElements != 0)
{
struct SOOLElem *table = (struct SOOLElem *) &m_Section->bytes[m_Section->hdr.offsVirtualElements];
for(index = 0; index < m_Section->hdr.numVirtualElements; index++)
{
if(table[index].key == key)
{
break;
}
}
if(index != m_Section->hdr.numVirtualElements)
{
return table[index].value;
}
}
io_print("SOOL Engine: unable to find the virtual element in the concerned interactor.");
return 0;
}
s8 SOOLCtx::GetFlags(void)
{
return m_Flags;
}
u16 SOOLCtx::GetA4(void)
{
return m_unkA4;
}
void SOOLCtx::SetA4(u16 value)
{
m_unkA4 = value;
m_unkA8 = 0;
}
u16 SOOLCtx::GetA6(void)
{
return m_unkA6;
}
s32 SOOLCtx::GetA8(void)
{
return 1;
}
s32 SOOLCtx::GetCtxId(void)
{
return m_CtxId;
}
void SOOLCtx::func_8006261C(u16 methodId)
{
if(methodId >= m_Section->hdr.numMethods)
{
return;
}
u8 lastCmdByte;
if(methodId == m_Section->hdr.numMethods - 1),
{
lastCmdByte = m_Section->bytes[m_Section->hdr.offsMethodsEnd - 1];
}
else
{
lastCmdByte = m_Section->bytes[m_MethodOffsets[methodId+1] - 1];
}
if(lastCmdByte == 0x00)
{
if(methodId != m_unkA6)
{
m_unkA8 = 1;
}
m_unkA6 = methodId;
}
}
void SOOLCtx::CheckMethod(u16 methodId)
{
if(methodId >= m_Section->hdr.numMethods)
{
io_print("SOOL Engine: impossible to access a method cause of an incorrect method id.");
}
u8 *pos;
if(methodId == (m_Section->hdr.numMethods - 1))
{
pos = &m_Section->bytes[m_Section->hdr.offsMethodsEnd];
}
else
{
pos = &m_Section->bytes[m_MethodOffsets[methodId+1]];
}
if(pos[-1] != 0x02)
{
io_print("SOOL Engine: impossible to access a method cause of an incorrect method id.");
}
}
s32 SOOLCtx::Get04(void)
{
if(this == NULL)
{
return NULL;
}
return m_unk04;
}
void SOOLCtx::Set04(void *ptr)
{
m_unk04 = ptr;
}
void *SOOLCtx::GetC4(void)
{
return m_unkC4;
}
void SOOLCtx::CheckVariable(s16 offset)
{
if(m_Section->hdr.offsVars == 0xFFFF)
{
io_print("SOOL Engine: the interactor doesn't know the variable you want to read or write.");
}
if((offset & 0xFFFF) < m_Section->hdr.offsVars)
{
io_print("SOOL Engine: the interactor doesn't know the variable you want to read or write.");
}
if((m_Section->hdr.offsVarsEnd == 0xFFFF && offset >= m_Section->hdr.offsMethodsEnd) ||
offset >= m_Section->hdr.offsVarsEnd)
{
io_print("SOOL Engine: the interactor doesn't know the variable you want to read or write.");
}
}
u8 *SOOLCtx::GetSectionData(u16 offset)
{
return &m_Section->bytes[offset];
}
void SOOLCtx::SetC8(UnkC8Func funcptr)
{
m_unkC8 = funcptr;
}
void SOOLCtx::SetFlags(u8 flags, bool bSet)
{
if(bSet)
{
m_Flags |= flags;
}
else
{
m_Flags &= ~flags;
}
}
void SOOLCtx::func_80062818(void)
{
m_unkA6 = m_Section->hdr.numPublicMethods;
m_unkA8 = 1;
if (m_unkA6 == 0xFFFF)
{
m_unkA8 = 0;
m_Flags = m_Flags | (1 << 1);
}
}
void SOOLCtx::func_80062854(void)
{
m_unkB2 = m_Section->hdr.unk08;
}
void SOOLCtx::func_80062864(void)
{
m_unkB0 = m_MethodOffsets[m_unkA4];
}
void *SOOLCtx::GetAccPtr()
{
return &m_Acc;
}
void *SOOLCtx::GetB2Ptr()
{
return &m_unkB2;
}
void* SOOLCtx::GetSection()
{
return m_Section;
}
SOOLStck *SOOLCtx::GetStack(void)
{
return &m_Stack;
}
void SOOLStck::Reset(void)
{
m_Count = 0;
}
bool SOOLStck::IsFull(void)
{
return (m_Count ^ NB_ELEM) < 1;
}
bool SOOLStck::IsEmpty(void)
{
return m_Count < 1;
}
bool SOOLStck::Push(s16 value)
{
if(m_Count == NB_ELEM)
{
io_print("SOOL Engine: Scenaric stack overflow.\n (if necessary, you can increase the defined value NB_ELEM in SOOLStck.h)");
}
m_Array[m_Count++] = value;
return 1;
}
s16 SOOLStck::Pop(void)
{
if(m_Count <= 0)
{
io_print("SOOL Engine: Trying to Pop() an empty scenaric stack.");
}
return m_Array[--m_Count];
}
void SOOLStck::Trim(int n)
{
if(m_Count <= 0)
{
io_print("SOOL Engine: Trying to Pop() an empty scenaric stack.");
}
m_Count -= n;
}
s16 SOOLStck::Top(int i)
{
if(i <= 0 || (m_Count - i) < 0)
{
io_print("SOOL Engine: Invalid stack::Top(i) parameter on a scenaric stack.");
}
return m_Array[m_Count - i];
}
void SOOLStck::Reset2(void)
{
m_Count = 0;
}
void SOOLStck::PrintValues(void)
{
char str[unklength];
for(int i = 0; i < m_Count; i++)
{
sprintf(&str, "SOOLStack[%d]=[%d]", i, m_Array[i]);
func_80057138(&str);
}
}
opcode 0x50+ handler
s16 func_80057140(SOOLCtx *ctx, SOOLStck *stck, s32 *a2)
{
switch(stck->Top(1))
{
case 0x00: return func_80057918(ctx, stck, a2);
case 0x01: return func_800579C8(ctx, stck, a2);
case 0x02: return func_80057A30(ctx, stck, a2);
case 0x03: return func_80057854(ctx, stck, a2);
case 0x04: return func_80057B00(ctx, stck, a2);
case 0x05: return func_80057B68(ctx, stck, a2);
case 0x06: return func_80057BD0(ctx, stck, a2);
case 0x07: return func_80057D3C(ctx, stck, a2);
case 0x08: return func_80057C94(ctx, stck, a2);
case 0x09: return func_80057854(ctx, stck, a2);
case 0x0A: return func_80057DB8(ctx, stck, a2);
case 0x0B: return func_80058260(ctx, stck, a2);
case 0x0C: return func_8005891C(ctx, stck, a2);
case 0x0D: return func_80058A10(ctx, stck, a2);
case 0x0E: return func_80057C38(ctx, stck, a2);
case 0x0F: return func_80058A88(ctx, stck, a2);
case 0x10: return func_80058B18(ctx, stck, a2);
case 0x11: return func_80058C18(ctx, stck, a2);
case 0x12: return func_80058C5C(ctx, stck, a2);
case 0x13: return func_80058E74(ctx, stck, a2);
case 0x14: return func_80058F44(ctx, stck, a2);
case 0x15: return func_80058FC4(ctx, stck, a2);
case 0x16: return func_8005901C(ctx, stck, a2);
case 0x17: return func_800590DC(ctx, stck, a2);
case 0x18: return func_80059138(ctx, stck, a2);
case 0x19: return func_800591F8(ctx, stck, a2);
case 0x1A: return func_800592E8(ctx, stck, a2);
case 0x1B: return func_80057878(ctx, stck, a2);
case 0x1C: return func_80059384(ctx, stck, a2);
case 0x1D: return func_800593A4(ctx, stck, a2);
case 0x1E: return func_80059404(ctx, stck, a2);
case 0x1F: return func_80059458(ctx, stck, a2);
case 0x20: return func_80059478(ctx, stck, a2);
case 0x21: return func_80059560(ctx, stck, a2);
case 0x22: return func_800596B8(ctx, stck, a2);
case 0x23: return func_800596EC(ctx, stck, a2);
case 0x24: return func_80057898(ctx, stck, a2);
case 0x25: return func_800578B8(ctx, stck, a2);
case 0x26: return func_80059770(ctx, stck, a2);
case 0x27: return func_800598D8(ctx, stck, a2);
case 0x28: return func_800578D8(ctx, stck, a2);
case 0x29: return func_800578F8(ctx, stck, a2);
case 0x2A: return func_8005990C(ctx, stck, a2);
case 0x2B: return func_80059988(ctx, stck, a2);
case 0x2C: return func_800599A8(ctx, stck, a2);
case 0x2D: return func_80059A08(ctx, stck, a2);
case 0x2E: return func_80059A84(ctx, stck, a2);
case 0x2F: return func_80059AA4(ctx, stck, a2);
case 0x30: return func_80058C3C(ctx, stck, a2);
case 0x31: return func_80059AC8(ctx, stck, a2);
case 0x32: return func_80059AEC(ctx, stck, a2);
case 0x33: return func_80059B2C(ctx, stck, a2);
case 0x34: return func_80059B80(ctx, stck, a2);
case 0x35: return func_80059BF0(ctx, stck, a2);
case 0x36: return func_80059C50(ctx, stck, a2);
case 0x37: return func_80059CAC(ctx, stck, a2);
case 0x38: return func_80059CCC(ctx, stck, a2);
case 0x39: return func_80059CF0(ctx, stck, a2);
case 0x3A: return func_80059D50(ctx, stck, a2);
case 0x3B: return func_80059DB0(ctx, stck, a2);
case 0x3C: return func_80059E10(ctx, stck, a2);
case 0x3D: return func_80059E8C(ctx, stck, a2);
case 0x3E: return func_80059EEC(ctx, stck, a2);
case 0x3F: return func_80059F20(ctx, stck, a2);
case 0x40: return func_80059198(ctx, stck, a2);
case 0x41: return func_80059F80(ctx, stck, a2);
case 0x42: return func_8005A020(ctx, stck, a2);
case 0x43: return func_8005A074(ctx, stck, a2);
case 0x44: return func_8005A094(ctx, stck, a2);
case 0x45: return func_8005A0B4(ctx, stck, a2);
case 0x46: return func_80058598(ctx, stck, a2);
case 0x47: return func_8005A0D8(ctx, stck, a2);
}
}
s16 func_80057878(SOOLCtx *ctx, SOOLStck *stck, s32 *a2)
{
return func_8003D0F4();
}
s16 func_80057898(SOOLCtx *ctx, SOOLStck *stck, s32 *a2)
{
return func_8003C6FC();
}
s16 func_800578B8(SOOLCtx *ctx, SOOLStck *stck, s32 *a2)
{
return func_8003C580();
}
s16 func_800578D8(SOOLCtx *ctx, SOOLStck *stck, s32 *a2)
{
return func_8003C5D4();
}
s16 func_800578F8(SOOLCtx *ctx, SOOLStck *stck, s32 *a2)
{
return func_8003C628();
}
s16 func_80057918(SOOLCtx *ctx, SOOLStck *stck, s32 *a2)
{
s16 res = stck->Top(2) + func_80082E90() % ((stck->Top(3) - stck->Top(2)) + 1);
if(res < 0)
{
res = -res;
}
return res;
}
SOOLCtx *func_8005A820(a0 , s32 ctxId)
{
s1 = a0 + 0x24
s32 index;
for(index = 0; index < func_80056F14(s1); index++)
{
if(func_80056EEC(s1, index) == NULL)
continue;
if(func_80056EEC(s1, index)->GetCtxId() == ctxId)
break;
}
if(index == func_80056F14(s1))
{
func_80057130("SOOL Engine: impossible to access an interactor with an incorrect interactor number.");
}
return func_80056EEC(s1, index);
}
SOOLCtx *func_80056EEC(a0, index)
{
return a0->unk04[index];
}
void func_80056F00(a0, index, a2)
{
a0->unk04[index] = a2;
}
func_80056F14(a0)
{
return a0->unk00;
}
func_8005F1C(a0)
{
a0->unk00 = 0;
a0->unk04 = NULL;
}
...