mirror of
https://github.com/HarbourMasters/Starship.git
synced 2025-02-02 16:23:57 +03:00
Moved spawner to OnGameUpdate hook
This commit is contained in:
parent
4dd2eb6eb6
commit
7cfa58117d
@ -4,6 +4,7 @@
|
|||||||
#include "assets/ast_logo.h"
|
#include "assets/ast_logo.h"
|
||||||
#include "mods.h"
|
#include "mods.h"
|
||||||
#include "port/interpolation/FrameInterpolation.h"
|
#include "port/interpolation/FrameInterpolation.h"
|
||||||
|
#include "port/hooks/list/EngineEvent.h"
|
||||||
|
|
||||||
f32 gNextVsViewScale;
|
f32 gNextVsViewScale;
|
||||||
f32 gVsViewScale;
|
f32 gVsViewScale;
|
||||||
@ -346,6 +347,9 @@ void Game_Update(void) {
|
|||||||
u8 partialFill;
|
u8 partialFill;
|
||||||
u8 soundMode;
|
u8 soundMode;
|
||||||
|
|
||||||
|
// @port: @event: Call GAME_UPDATE_EVENT_PRE
|
||||||
|
EventSystem_CallEvent(GAME_UPDATE_EVENT_PRE, NULL);
|
||||||
|
|
||||||
Game_SetGameState();
|
Game_SetGameState();
|
||||||
if (gGameStandby) {
|
if (gGameStandby) {
|
||||||
Game_InitStandbyDL(&gUnkDisp1);
|
Game_InitStandbyDL(&gUnkDisp1);
|
||||||
@ -600,12 +604,9 @@ void Game_Update(void) {
|
|||||||
gFillScreenRed, gFillScreenGreen, gFillScreenBlue, gFillScreenAlpha);
|
gFillScreenRed, gFillScreenGreen, gFillScreenBlue, gFillScreenAlpha);
|
||||||
}
|
}
|
||||||
Audio_dummy_80016A50();
|
Audio_dummy_80016A50();
|
||||||
#if MODS_RAM_MOD == 1
|
|
||||||
RamMod_Update();
|
// @port: @event: Call GAME_UPDATE_EVENT_POST
|
||||||
#endif
|
EventSystem_CallEvent(GAME_UPDATE_EVENT_POST, NULL);
|
||||||
if(CVarGetInteger("gSpawnerMod", 0) == 1){
|
|
||||||
Spawner();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,12 +3,25 @@
|
|||||||
|
|
||||||
EventSystem* EventSystem::Instance = new EventSystem();
|
EventSystem* EventSystem::Instance = new EventSystem();
|
||||||
|
|
||||||
size_t EventSystem::RegisterListener(EventID id, EventPriority priority, EventCallback callback) {
|
ListenerID EventSystem::RegisterListener(EventID id, EventCallback callback, EventPriority priority) {
|
||||||
if (std::find(this->mEventListeners[id].begin(), this->mEventListeners[id].end(), callback) != this->mEventListeners[id].end()) {
|
if(std::find_if(this->mEventListeners[id].begin(), this->mEventListeners[id].end(), [callback](EventListener listener) {
|
||||||
|
return listener.function == callback;
|
||||||
|
}) != this->mEventListeners[id].end()) {
|
||||||
throw std::runtime_error("Listener already registered");
|
throw std::runtime_error("Listener already registered");
|
||||||
}
|
}
|
||||||
|
|
||||||
this->mEventListeners[id].push_back(callback);
|
this->mEventListeners[id].push_back({ priority, callback });
|
||||||
|
|
||||||
|
// Sort by priority
|
||||||
|
std::sort(this->mEventListeners[id].begin(), this->mEventListeners[id].end(), [](EventListener a, EventListener b) {
|
||||||
|
return a.priority < b.priority;
|
||||||
|
});
|
||||||
|
|
||||||
|
return this->mEventListeners[id].size() - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void EventSystem::UnregisterListener(EventID ev, ListenerID id) {
|
||||||
|
this->mEventListeners[ev].erase(this->mEventListeners[ev].begin() + id);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EventSystem::CallEvent(EventID id, IEvent* event) {
|
void EventSystem::CallEvent(EventID id, IEvent* event) {
|
||||||
@ -16,13 +29,17 @@ void EventSystem::CallEvent(EventID id, IEvent* event) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto& callback : this->mEventListeners[id]) {
|
for (auto& listener : this->mEventListeners[id]) {
|
||||||
callback(event);
|
listener.function(event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" size_t EventSystem_RegisterListener(EventID id, EventPriority priority, EventCallback callback) {
|
extern "C" size_t EventSystem_RegisterListener(EventID id, EventCallback callback, EventPriority priority) {
|
||||||
return EventSystem::Instance->RegisterListener(id, priority, callback);
|
return EventSystem::Instance->RegisterListener(id, callback, priority);
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" void EventSystem_UnregisterListener(EventID ev, size_t id) {
|
||||||
|
EventSystem::Instance->UnregisterListener(ev, id);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" void EventSystem_CallEvent(EventID id, void* event) {
|
extern "C" void EventSystem_CallEvent(EventID id, void* event) {
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
typedef uint16_t EventID;
|
typedef uint16_t EventID;
|
||||||
|
typedef uint32_t ListenerID;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
EVENT_TYPE_PRE,
|
EVENT_TYPE_PRE,
|
||||||
@ -23,6 +24,11 @@ typedef struct {
|
|||||||
|
|
||||||
typedef void (*EventCallback)(IEvent*);
|
typedef void (*EventCallback)(IEvent*);
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
EventPriority priority;
|
||||||
|
EventCallback function;
|
||||||
|
} EventListener;
|
||||||
|
|
||||||
// ID Type
|
// ID Type
|
||||||
// 000000000000000 0
|
// 000000000000000 0
|
||||||
#define EVENT_ID(id, type) ((id << 1) | type)
|
#define EVENT_ID(id, type) ((id << 1) | type)
|
||||||
@ -34,12 +40,14 @@ typedef void (*EventCallback)(IEvent*);
|
|||||||
class EventSystem {
|
class EventSystem {
|
||||||
public:
|
public:
|
||||||
static EventSystem* Instance;
|
static EventSystem* Instance;
|
||||||
size_t RegisterListener(EventID id, EventPriority priority, EventCallback callback);
|
ListenerID RegisterListener(EventID id, EventCallback callback, EventPriority priority = EVENT_PRIORITY_NORMAL);
|
||||||
|
void UnregisterListener(EventID ev, ListenerID id);
|
||||||
void CallEvent(EventID id, IEvent* event);
|
void CallEvent(EventID id, IEvent* event);
|
||||||
private:
|
private:
|
||||||
std::array<std::vector<EventCallback>, 0xFFFF> mEventListeners;
|
std::array<std::vector<EventListener>, 0xFFFF> mEventListeners;
|
||||||
};
|
};
|
||||||
#else
|
#else
|
||||||
extern size_t EventSystem_RegisterListener(EventID id, EventPriority priority, EventCallback callback);
|
extern ListenerID EventSystem_RegisterListener(EventID id, EventCallback callback, EventPriority priority);
|
||||||
|
extern void EventSystem_UnregisterListener(EventID ev, ListenerID id);
|
||||||
extern void EventSystem_CallEvent(EventID id, void* event);
|
extern void EventSystem_CallEvent(EventID id, void* event);
|
||||||
#endif
|
#endif
|
@ -3,4 +3,7 @@
|
|||||||
#include "port/hooks/impl/EventSystem.h"
|
#include "port/hooks/impl/EventSystem.h"
|
||||||
|
|
||||||
#define DISPLAY_UPDATE_EVENT_PRE EVENT_ID(1, EVENT_TYPE_PRE)
|
#define DISPLAY_UPDATE_EVENT_PRE EVENT_ID(1, EVENT_TYPE_PRE)
|
||||||
#define DISPLAY_UPDATE_EVENT_POST EVENT_ID(1, EVENT_TYPE_POST)
|
#define DISPLAY_UPDATE_EVENT_POST EVENT_ID(1, EVENT_TYPE_POST)
|
||||||
|
|
||||||
|
#define GAME_UPDATE_EVENT_PRE EVENT_ID(2, EVENT_TYPE_PRE)
|
||||||
|
#define GAME_UPDATE_EVENT_POST EVENT_ID(2, EVENT_TYPE_POST)
|
@ -2,6 +2,7 @@
|
|||||||
#include "port/hooks/list/EngineEvent.h"
|
#include "port/hooks/list/EngineEvent.h"
|
||||||
#include "global.h"
|
#include "global.h"
|
||||||
#include "hit64.h"
|
#include "hit64.h"
|
||||||
|
#include "mods.h"
|
||||||
|
|
||||||
void OnDisplayUpdatePre(IEvent* event) {
|
void OnDisplayUpdatePre(IEvent* event) {
|
||||||
#if DEBUG_BOSS_KILLER == 1
|
#if DEBUG_BOSS_KILLER == 1
|
||||||
@ -145,9 +146,19 @@ void OnDisplayUpdatePre(IEvent* event) {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void OnGameUpdatePost(IEvent* event) {
|
||||||
|
#if MODS_RAM_MOD == 1
|
||||||
|
RamMod_Update();
|
||||||
|
#endif
|
||||||
|
if(CVarGetInteger("gSpawnerMod", 0) == 1){
|
||||||
|
Spawner();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void PortEnhancements_Init() {
|
void PortEnhancements_Init() {
|
||||||
// Register event listeners
|
// Register event listeners
|
||||||
EventSystem_RegisterListener(DISPLAY_UPDATE_EVENT_PRE, EVENT_PRIORITY_NORMAL, OnDisplayUpdatePre);
|
EventSystem_RegisterListener(DISPLAY_UPDATE_EVENT_PRE, OnDisplayUpdatePre, EVENT_PRIORITY_NORMAL);
|
||||||
|
EventSystem_RegisterListener(GAME_UPDATE_EVENT_POST, OnGameUpdatePost, EVENT_PRIORITY_NORMAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PortEnhancements_Exit() {
|
void PortEnhancements_Exit() {
|
||||||
|
Loading…
Reference in New Issue
Block a user