More evtmgr

This commit is contained in:
Seeky 2020-09-26 22:58:09 +01:00
parent b555f891ca
commit c6c353e0dc
5 changed files with 263 additions and 29 deletions

247
evtmgr.c
View File

@ -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;
}

View File

@ -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
View File

@ -0,0 +1,3 @@
#pragma once
int unknown_805ae9c8; // referenced in evtmgr.c

View File

@ -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
View 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