mirror of
https://github.com/SeekyCt/spm-decomp.git
synced 2025-02-17 03:57:27 +00:00
More evtmgr
This commit is contained in:
parent
b555f891ca
commit
c6c353e0dc
247
evtmgr.c
247
evtmgr.c
@ -3,6 +3,7 @@
|
||||
|
||||
#include "evtmgr.h"
|
||||
#include "memory.h"
|
||||
#include "somewhere.h"
|
||||
#include "swdrv.h"
|
||||
#include "system.h"
|
||||
|
||||
@ -17,40 +18,51 @@ int evtActiveEntryCount; // evtMax?
|
||||
int priTblNum;
|
||||
int evt_unk805ae8e; // runMainF?
|
||||
int evtId = 1;
|
||||
float evtSpeed = 1.0;
|
||||
|
||||
EvtWork * evtGetWork() {
|
||||
return &evtWork;
|
||||
}
|
||||
|
||||
// not
|
||||
void make_pri_table() {
|
||||
EvtWork * wp = &evtWork;
|
||||
EvtEntry * entry = wp->entries;
|
||||
// Add all active entries to index and id tables
|
||||
int priEntryCount = 0;
|
||||
for (int i = 0; i < evtWork.entryCount; i++) {
|
||||
if ((evtWork.entries[i].flags & 1) != 0) {
|
||||
int i = 0;
|
||||
while (i < wp->entryCount) {
|
||||
if (entry->flags & 1) {
|
||||
priTbl[priEntryCount] = i;
|
||||
priIdTbl[priEntryCount] = evtWork.entries[i].id;
|
||||
priIdTbl[priEntryCount] = entry->id;
|
||||
priEntryCount++;
|
||||
}
|
||||
i++;
|
||||
entry++;
|
||||
}
|
||||
|
||||
priTblNum = priEntryCount;
|
||||
|
||||
// Bubble sort tables
|
||||
for (int i = 0; i < priEntryCount - 1; i++) {
|
||||
for (int j = i + 1; j < priEntryCount; j++) {
|
||||
i = 0; // wrong register used, stops matching from here
|
||||
while (i < priEntryCount - 1) {
|
||||
int j = i + 1;
|
||||
while (j < priEntryCount) {
|
||||
int slotI = priTbl[i];
|
||||
if (evtWork.entries[slotI].priority < evtWork.entries[priTbl[j]].priority) {
|
||||
if (wp->entries[slotI].priority < wp->entries[priTbl[j]].priority) {
|
||||
priTbl[i] = priTbl[j];
|
||||
priTbl[j] = slotI;
|
||||
int idI = priIdTbl[i];
|
||||
priIdTbl[i] = priIdTbl[j];
|
||||
priIdTbl[j] = idI;
|
||||
}
|
||||
j++;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
// make_jump_table
|
||||
// void make_jump_table(EvtEntry * entry)
|
||||
|
||||
void evtmgrInit() {
|
||||
evtWork.entryCount = EVT_ENTRY_MAX;
|
||||
@ -73,7 +85,8 @@ void evtmgrReInit() {
|
||||
evt_msg_init();
|
||||
}
|
||||
|
||||
EvtEntry * evtEntry(void * script, uint8_t priority, int8_t flags) {
|
||||
// not matching
|
||||
EvtEntry * evtEntry(void * script, uint8_t priority, uint8_t flags) {
|
||||
EvtEntry * entry = evtWork.entries;
|
||||
int i;
|
||||
for (i = 0; i < evtWork.entryCount; i++) {
|
||||
@ -85,7 +98,7 @@ EvtEntry * evtEntry(void * script, uint8_t priority, int8_t flags) {
|
||||
}
|
||||
evtActiveEntryCount += 1;
|
||||
memset(entry, 0, sizeof(EvtEntry));
|
||||
entry->flags |= 1;
|
||||
entry->flags = flags | 1;
|
||||
entry->curInstructionPtr = script;
|
||||
entry->scriptStart = script;
|
||||
entry->prevInstructionPtr = script;
|
||||
@ -97,7 +110,7 @@ EvtEntry * evtEntry(void * script, uint8_t priority, int8_t flags) {
|
||||
entry->id = evtId++;
|
||||
entry->dowhileDepth = -1;
|
||||
entry->unknown_0xf = -1;
|
||||
entry->type = -1;
|
||||
entry->type = 0xff;
|
||||
entry->unknown_0x19c = 0;
|
||||
entry->speed = 1.0f;
|
||||
entry->unknown_0x160 = 0.0f;
|
||||
@ -105,16 +118,220 @@ EvtEntry * evtEntry(void * script, uint8_t priority, int8_t flags) {
|
||||
entry->unknown_0x168 = 0;
|
||||
entry->unknown_0x4 = 0;
|
||||
entry->unknown_0x0 = 0;
|
||||
for (i = 0; i < 16; i++) {
|
||||
for (int j = 0; j < 16; j++) {
|
||||
entry->lw[i] = 0;
|
||||
}
|
||||
for (i = 0; i < 3; i++) {
|
||||
entry->lw[i] = 0;
|
||||
for (int j = 0; j < 3; j++) {
|
||||
entry->lw[j] = 0;
|
||||
}
|
||||
make_jump_table(entry);
|
||||
if ((evt_unk805ae8e0 != 0) && (entry->flags & 0x20 != 0)) {
|
||||
|
||||
priTbl[priTblNum] = i;
|
||||
priIdTbl[priTblNum++] = entry->id;
|
||||
}
|
||||
if (unknown_805ae9c8 == 1) {
|
||||
for (int i = 0; i < evtWork.entryCount; i++) {
|
||||
if (evtWork.entries[i].flags & 1 != 0) {
|
||||
evtStop(&evtWork.entries[i], 3);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (unknown_805ae9c8 > 0 && unknown_805ae9c8 < 3) {
|
||||
for (int i = 0; i < evtWork.entryCount; i++) {
|
||||
if (evtWork.entries[i].flags & 1 != 0) {
|
||||
evtStop(&evtWork.entries[i], 0xff);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (evtId == 0) {
|
||||
evtId = 1;
|
||||
}
|
||||
return entry;
|
||||
}
|
||||
|
||||
|
||||
//EvtEntry * evtEntryType(void * script, int param_2, int param_3, int param_4)
|
||||
//EvtEntry * evtChildEntry(EvtEntry * entry, void * script, uint8_t flags)
|
||||
//EvtEntry * evtBrotherEntry(EvtEntry * entry, void * script, uint8_t flags)
|
||||
//EvtEntry * evtRestart(EvtEntry * entry)
|
||||
//void evtmgrMain()
|
||||
//void evtDelete(EvtEntry * entry)
|
||||
|
||||
void evtDeleteID(int id)
|
||||
{
|
||||
EvtWork * wp = &evtWork;
|
||||
EvtEntry * entry = wp->entries;
|
||||
int i = 0;
|
||||
while (i < wp->entryCount) {
|
||||
if (entry->flags & 1 != 0 && entry->id == id) {
|
||||
evtDelete(entry);
|
||||
}
|
||||
i++;
|
||||
entry++;
|
||||
}
|
||||
}
|
||||
|
||||
bool evtCheckID(int id) {
|
||||
EvtWork * wp = &evtWork;
|
||||
EvtEntry * entry = wp->entries;
|
||||
int i = 0;
|
||||
while (i < wp->entryCount) {
|
||||
if (entry->flags & 1 && entry->id == id) {
|
||||
return true;
|
||||
}
|
||||
i++;
|
||||
entry++;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void evtSetPri(EvtEntry * entry, uint8_t priority) {
|
||||
entry->priority = priority;
|
||||
}
|
||||
|
||||
void evtSetSpeed(EvtEntry * entry, float multiplier) {
|
||||
entry->speed = multiplier * evtSpeed;
|
||||
}
|
||||
|
||||
void evtSetType(EvtEntry * entry, uint8_t type) {
|
||||
entry->type = type;
|
||||
}
|
||||
|
||||
void evtStop(EvtEntry * entry, uint8_t mask) {
|
||||
EvtWork * wp = &evtWork;
|
||||
if (entry->childEntry) {
|
||||
evtStop(entry->childEntry, mask);
|
||||
}
|
||||
EvtEntry * curEntry = wp->entries;
|
||||
int i = 0;
|
||||
while (i < wp->entryCount) {
|
||||
if (curEntry->flags & 1 && curEntry->brotherEntry == entry) {
|
||||
evtStop(curEntry, mask);
|
||||
}
|
||||
i++;
|
||||
curEntry++;
|
||||
}
|
||||
if (entry->type & mask) {
|
||||
entry->flags |= 2;
|
||||
}
|
||||
}
|
||||
|
||||
void evtStart(EvtEntry * entry, uint8_t mask) {
|
||||
EvtWork * wp = &evtWork;
|
||||
if (entry->childEntry) {
|
||||
evtStart(entry->childEntry, mask);
|
||||
}
|
||||
EvtEntry * curEntry = wp->entries;
|
||||
int i = 0;
|
||||
while (i < wp->entryCount) {
|
||||
if (curEntry->flags & 1 && curEntry->brotherEntry == entry) {
|
||||
evtStart(curEntry, mask);
|
||||
}
|
||||
i++;
|
||||
curEntry++;
|
||||
}
|
||||
if (entry->type & mask) {
|
||||
entry->flags &= ~2;
|
||||
}
|
||||
}
|
||||
|
||||
void evtStopID(int id) {
|
||||
EvtWork * wp = &evtWork;
|
||||
EvtEntry * entry = wp->entries;
|
||||
int i = 0;
|
||||
while (i < wp->entryCount) {
|
||||
if (entry->flags & 1 && entry->id == id) {
|
||||
evtStop(entry, 0xff);
|
||||
}
|
||||
i++;
|
||||
entry++;
|
||||
}
|
||||
}
|
||||
|
||||
void evtStartID(int id) {
|
||||
EvtWork * wp = &evtWork;
|
||||
EvtEntry * entry = wp->entries;
|
||||
int i = 0;
|
||||
while (i < wp->entryCount) {
|
||||
if (entry->flags & 1 && entry->id == id) {
|
||||
evtStart(entry, 0xff);
|
||||
}
|
||||
i++;
|
||||
entry++;
|
||||
}
|
||||
}
|
||||
|
||||
void evtStopAll(uint8_t mask) {
|
||||
EvtWork * wp = &evtWork;
|
||||
EvtEntry * entry = wp->entries;
|
||||
int i = 0;
|
||||
while (i < wp->entryCount) {
|
||||
if (entry->flags & 1) {
|
||||
evtStop(entry, mask);
|
||||
}
|
||||
i++;
|
||||
entry++;
|
||||
}
|
||||
}
|
||||
|
||||
void evtStartAll(uint8_t mask) {
|
||||
EvtWork * wp = &evtWork;
|
||||
EvtEntry * entry = wp->entries;
|
||||
int i = 0;
|
||||
while (i < wp->entryCount) {
|
||||
if (entry->flags & 1) {
|
||||
evtStart(entry, mask);
|
||||
}
|
||||
i++;
|
||||
entry++;
|
||||
}
|
||||
}
|
||||
|
||||
void evtStopOther(EvtEntry * entry, uint8_t mask) {
|
||||
EvtWork * wp = &evtWork;
|
||||
EvtEntry * curEntry = wp->entries;
|
||||
int i = 0;
|
||||
while (i < wp->entryCount) {
|
||||
if (curEntry->flags & 1 && curEntry != entry) {
|
||||
evtStop(curEntry, mask);
|
||||
}
|
||||
i++;
|
||||
curEntry++;
|
||||
}
|
||||
}
|
||||
|
||||
void evtStartOther(EvtEntry * entry, uint8_t mask) {
|
||||
EvtWork * wp = &evtWork;
|
||||
EvtEntry * curEntry = wp->entries;
|
||||
int i = 0;
|
||||
while (i < wp->entryCount) {
|
||||
if (curEntry->flags & 1 && curEntry != entry) {
|
||||
evtStart(curEntry, mask);
|
||||
}
|
||||
i++;
|
||||
curEntry++;
|
||||
}
|
||||
}
|
||||
|
||||
EvtEntry * evtGetPtr(int index) {
|
||||
EvtWork * wp = &evtWork;
|
||||
EvtEntry * entry = &wp->entries[index];
|
||||
if (entry->flags & 1) {
|
||||
return entry;
|
||||
}
|
||||
(void) flags;
|
||||
return 0;
|
||||
}
|
||||
|
||||
EvtEntry * evtGetPtrID(int id) {
|
||||
EvtWork * wp = &evtWork;
|
||||
EvtEntry * curEntry = wp->entries;
|
||||
int i = 0;
|
||||
while (i < wp->entryCount) {
|
||||
if (curEntry->flags & 1 && curEntry->id == id) {
|
||||
return curEntry;
|
||||
}
|
||||
curEntry++;
|
||||
i++;
|
||||
}
|
||||
return 0;
|
||||
}
|
26
evtmgr.h
26
evtmgr.h
@ -30,7 +30,7 @@ typedef struct _EvtEntry {
|
||||
uint8_t curDataLength; // number of pieces of data (4 bytes each) belonging to the current instruction
|
||||
uint8_t curOpcode; // see links above for opcodes
|
||||
uint8_t priority;
|
||||
int8_t type;
|
||||
uint8_t type;
|
||||
char unknown_0xd;
|
||||
int8_t dowhileDepth; // number of do-while loops the current instruction is nested into
|
||||
int8_t unknown_0xf;
|
||||
@ -81,27 +81,27 @@ void make_pri_table(); // 800d87f0
|
||||
void make_jump_table(EvtEntry * entry); // 800d890c
|
||||
void evtmgrInit(); // 800d8a88
|
||||
void evtmgrReInit(); // 800d8b2c
|
||||
EvtEntry * evtEntry(void * script, uint8_t priority, int8_t flags); // 800d8b88
|
||||
EvtEntry * evtEntry(void * script, uint8_t priority, uint8_t flags); // 800d8b88
|
||||
EvtEntry * evtEntryType(void * script, int param_2, int param_3, int param_4); // 800d8df4
|
||||
EvtEntry * evtChildEntry(EvtEntry * entry, void * script, uint8_t flags); // 800d9060
|
||||
EvtEntry * evtBrotherEntry(EvtEntry * entry, void * script, uint8_t flags); // 800d9370
|
||||
EvtEntry * evtRestart(EvtEntry * entry); // 800d9634
|
||||
void evtmgrMain(); // 800d9764
|
||||
void evtDelete(EvtEntry * entry); // 800d9944
|
||||
void evtDeleteId(int id); // 800d9b00
|
||||
void evtDeleteID(int id); // 800d9b00
|
||||
bool evtCheckID(int id); // 800d9b88
|
||||
EvtEntry * evtSetPri(EvtEntry * entry, uint8_t pri); // 800d9bd4
|
||||
void evtSetPri(EvtEntry * entry, uint8_t pri); // 800d9bd4
|
||||
void evtSetSpeed(EvtEntry * entry, float speed); // 800d9bdc
|
||||
void evtSetType(EvtEntry * entry, uint8_t type); // 800d9bec
|
||||
void evtStop(EvtEntry * entry, int param_2); // 800d9bf4
|
||||
void evtStart(EvtEntry * entry, int param_2); // 800d9c98
|
||||
void evtStopId(int id); // 800d9d3c
|
||||
void evtStartId(int id); // 800d9dc8
|
||||
void evtStopAll(int param_1); // 800d9e54
|
||||
void evtStartAll(int param_1); // 800d9ed4
|
||||
void evtStopOther(EvtEntry * entry, int param_2); // 800d9f54
|
||||
void evtStartOther(EvtEntry * entry, int param_2); // 800d9fc8
|
||||
void evtStop(EvtEntry * entry, uint8_t mask); // 800d9bf4
|
||||
void evtStart(EvtEntry * entry, uint8_t mask); // 800d9c98
|
||||
void evtStopID(int id); // 800d9d3c
|
||||
void evtStartID(int id); // 800d9dc8
|
||||
void evtStopAll(uint8_t mask); // 800d9e54
|
||||
void evtStartAll(uint8_t mask); // 800d9ed4
|
||||
void evtStopOther(EvtEntry * entry, uint8_t mask); // 800d9f54
|
||||
void evtStartOther(EvtEntry * entry, uint8_t mask); // 800d9fc8
|
||||
EvtEntry * evtGetPtr(int index); // 800da03c
|
||||
EvtEntry * evtGetPtrId(int id); // 800da064
|
||||
EvtEntry * evtGetPtrID(int id); // 800da064
|
||||
|
||||
#endif
|
3
somewhere.h
Normal file
3
somewhere.h
Normal file
@ -0,0 +1,3 @@
|
||||
#pragma once
|
||||
|
||||
int unknown_805ae9c8; // referenced in evtmgr.c
|
2
spm.bat
2
spm.bat
@ -1 +1 @@
|
||||
mwcceppc -O4 -proc gekko -lang C99 -S -d GAME_SPM -w all -use_lmw_stmw on -inline auto *.c
|
||||
mwcceppc -O4 -proc gekko -lang C99 -S -d GAME_SPM -w all -use_lmw_stmw on -fp hard *.c
|
14
stdint.h
Normal file
14
stdint.h
Normal file
@ -0,0 +1,14 @@
|
||||
#ifndef STDINT_H
|
||||
#define STDINT_H
|
||||
|
||||
typedef signed char int8_t;
|
||||
typedef unsigned char uint8_t;
|
||||
typedef signed short int16_t;
|
||||
typedef unsigned short uint16_t;
|
||||
typedef signed long int32_t;
|
||||
typedef unsigned long uint32_t;
|
||||
typedef signed long long int64_t;
|
||||
typedef unsigned long long uint64_t;
|
||||
typedef unsigned int uint;
|
||||
|
||||
#endif
|
Loading…
x
Reference in New Issue
Block a user