mirror of
https://github.com/HarbourMasters/Starship.git
synced 2025-02-02 16:23:57 +03:00
Implemented namespace system, added ItemDropEvent and cleaned up a little bit
This commit is contained in:
parent
7cfa58117d
commit
bc45e3ca87
@ -18,6 +18,7 @@
|
|||||||
#include "assets/ast_title.h"
|
#include "assets/ast_title.h"
|
||||||
#include "assets/ast_katina.h"
|
#include "assets/ast_katina.h"
|
||||||
#include "assets/ast_allies.h"
|
#include "assets/ast_allies.h"
|
||||||
|
#include "port/hooks/Events.h"
|
||||||
|
|
||||||
void func_demo_80048AC0(TeamId teamId) {
|
void func_demo_80048AC0(TeamId teamId) {
|
||||||
s32 teamShield;
|
s32 teamShield;
|
||||||
@ -1567,7 +1568,9 @@ void Cutscene_DropVsItem(Player* player, ObjectId itemId, Item* item) {
|
|||||||
item->obj.pos.y = player->pos.y;
|
item->obj.pos.y = player->pos.y;
|
||||||
item->obj.pos.z = player->trueZpos;
|
item->obj.pos.z = player->trueZpos;
|
||||||
item->obj.id = itemId;
|
item->obj.id = itemId;
|
||||||
Object_SetInfo(&item->info, item->obj.id);
|
CALL_CANCELLABLE_EVENT(ItemDropEvent, item){
|
||||||
|
Object_SetInfo(&item->info, item->obj.id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Cutscene_KillPlayer(Player* player) {
|
void Cutscene_KillPlayer(Player* player) {
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
#include "assets/ast_training.h"
|
#include "assets/ast_training.h"
|
||||||
#include "assets/ast_versus.h"
|
#include "assets/ast_versus.h"
|
||||||
#include "assets/ast_zoness.h"
|
#include "assets/ast_zoness.h"
|
||||||
|
#include "port/hooks/Events.h"
|
||||||
|
|
||||||
s32 D_enmy_Timer_80161670[4];
|
s32 D_enmy_Timer_80161670[4];
|
||||||
s32 gLastPathChange;
|
s32 gLastPathChange;
|
||||||
@ -276,7 +277,9 @@ void Item_Load(Item* this, ObjectInit* objInit) {
|
|||||||
this->obj.rot.z = objInit->rot.z;
|
this->obj.rot.z = objInit->rot.z;
|
||||||
this->obj.id = objInit->id;
|
this->obj.id = objInit->id;
|
||||||
this->width = 1.0f;
|
this->width = 1.0f;
|
||||||
Object_SetInfo(&this->info, this->obj.id);
|
CALL_CANCELLABLE_EVENT(ItemDropEvent, this){
|
||||||
|
Object_SetInfo(&this->info, this->obj.id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Effect_Effect346_Setup(Effect346* this, f32 xPos, f32 yPos, f32 zPos) {
|
void Effect_Effect346_Setup(Effect346* this, f32 xPos, f32 yPos, f32 zPos) {
|
||||||
@ -1042,7 +1045,9 @@ void Scenery_CoStoneArch_Init(CoStoneArch* this, f32* hitboxData) {
|
|||||||
item->obj.pos.y = this->obj.pos.y;
|
item->obj.pos.y = this->obj.pos.y;
|
||||||
item->obj.pos.z = this->obj.pos.z;
|
item->obj.pos.z = this->obj.pos.z;
|
||||||
item->obj.rot.y = this->obj.rot.y;
|
item->obj.rot.y = this->obj.rot.y;
|
||||||
Object_SetInfo(&item->info, item->obj.id);
|
CALL_CANCELLABLE_EVENT(ItemDropEvent, item){
|
||||||
|
Object_SetInfo(&item->info, item->obj.id);
|
||||||
|
}
|
||||||
item->info.hitbox = LOAD_ASSET(hitboxData);
|
item->info.hitbox = LOAD_ASSET(hitboxData);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1696,7 +1701,9 @@ void func_enmy_800660F0(Actor* this) {
|
|||||||
item->obj.pos.z = this->obj.pos.z;
|
item->obj.pos.z = this->obj.pos.z;
|
||||||
item->timer_4A = 8;
|
item->timer_4A = 8;
|
||||||
|
|
||||||
Object_SetInfo(&item->info, item->obj.id);
|
CALL_CANCELLABLE_EVENT(ItemDropEvent, item){
|
||||||
|
Object_SetInfo(&item->info, item->obj.id);
|
||||||
|
}
|
||||||
|
|
||||||
if ((item->obj.id == OBJ_ITEM_SILVER_RING) || (item->obj.id == OBJ_ITEM_BOMB) ||
|
if ((item->obj.id == OBJ_ITEM_SILVER_RING) || (item->obj.id == OBJ_ITEM_BOMB) ||
|
||||||
(item->obj.id == OBJ_ITEM_LASERS)) {
|
(item->obj.id == OBJ_ITEM_LASERS)) {
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include "assets/ast_versus.h"
|
#include "assets/ast_versus.h"
|
||||||
#include "assets/ast_area_6.h"
|
#include "assets/ast_area_6.h"
|
||||||
#include "assets/ast_zoness.h"
|
#include "assets/ast_zoness.h"
|
||||||
|
#include "port/hooks/Events.h"
|
||||||
|
|
||||||
extern float gCurrentScreenWidth;
|
extern float gCurrentScreenWidth;
|
||||||
extern float gCurrentScreenHeight;
|
extern float gCurrentScreenHeight;
|
||||||
@ -7011,7 +7012,9 @@ void Play_SpawnVsItem(ObjectId objId, Item* item) {
|
|||||||
item->obj.pos.y = gScenery360[spawnIndex].obj.pos.y;
|
item->obj.pos.y = gScenery360[spawnIndex].obj.pos.y;
|
||||||
item->obj.pos.z = gScenery360[spawnIndex].obj.pos.z;
|
item->obj.pos.z = gScenery360[spawnIndex].obj.pos.z;
|
||||||
item->obj.id = objId;
|
item->obj.id = objId;
|
||||||
Object_SetInfo(&item->info, item->obj.id);
|
CALL_CANCELLABLE_EVENT(ItemDropEvent, item){
|
||||||
|
Object_SetInfo(&item->info, item->obj.id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
#include "assets/ast_arwing.h"
|
#include "assets/ast_arwing.h"
|
||||||
#include "assets/ast_corneria.h"
|
#include "assets/ast_corneria.h"
|
||||||
#include "fox_co.h"
|
#include "fox_co.h"
|
||||||
|
#include "port/hooks/Events.h"
|
||||||
|
|
||||||
u8 sFightCarrier;
|
u8 sFightCarrier;
|
||||||
f32 sCoGrangaWork[68];
|
f32 sCoGrangaWork[68];
|
||||||
@ -89,7 +90,9 @@ void Corneria_Granga_SpawnItem(Boss* this, f32 x, f32 y, f32 z, ObjectId itemId)
|
|||||||
gItems[i].obj.pos.x = x;
|
gItems[i].obj.pos.x = x;
|
||||||
gItems[i].obj.pos.y = y;
|
gItems[i].obj.pos.y = y;
|
||||||
gItems[i].obj.pos.z = z;
|
gItems[i].obj.pos.z = z;
|
||||||
Object_SetInfo(&gItems[i].info, gItems[i].obj.id);
|
CALL_CANCELLABLE_EVENT(ItemDropEvent, &gItems[i]){
|
||||||
|
Object_SetInfo(&gItems[i].info, gItems[i].obj.id);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -593,7 +596,9 @@ void Corneria_CoGranga_1UpCheck(CoGranga* this) {
|
|||||||
gItems[i].obj.pos.z = gPlayer[0].trueZpos + dest.z;
|
gItems[i].obj.pos.z = gPlayer[0].trueZpos + dest.z;
|
||||||
gItems[i].timer_4A = 8;
|
gItems[i].timer_4A = 8;
|
||||||
|
|
||||||
Object_SetInfo(&gItems[i].info, gItems[i].obj.id);
|
CALL_CANCELLABLE_EVENT(ItemDropEvent, &gItems[i]){
|
||||||
|
Object_SetInfo(&gItems[i].info, gItems[i].obj.id);
|
||||||
|
}
|
||||||
Effect_Effect384_Spawn(gItems[i].obj.pos.x, gItems[i].obj.pos.y, gItems[i].obj.pos.z, 5.0f, 0);
|
Effect_Effect384_Spawn(gItems[i].obj.pos.x, gItems[i].obj.pos.y, gItems[i].obj.pos.z, 5.0f, 0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
#include "global.h"
|
#include "global.h"
|
||||||
#include "assets/ast_blue_marine.h"
|
#include "assets/ast_blue_marine.h"
|
||||||
#include "assets/ast_aquas.h"
|
#include "assets/ast_aquas.h"
|
||||||
|
#include "port/hooks/Events.h"
|
||||||
// #include "prevent_bss_reordering2.h"
|
// #include "prevent_bss_reordering2.h"
|
||||||
|
|
||||||
const char D_i3_801C1A30[] = "プレイヤーのすべてをクリア \n"; // Clear of all players
|
const char D_i3_801C1A30[] = "プレイヤーのすべてをクリア \n"; // Clear of all players
|
||||||
@ -380,7 +381,9 @@ void Aquas_SpawnItem(Vec3f* pos, ObjectId objId) {
|
|||||||
item->obj.pos.y = pos->y;
|
item->obj.pos.y = pos->y;
|
||||||
item->obj.pos.z = pos->z;
|
item->obj.pos.z = pos->z;
|
||||||
item->timer_4A = 2;
|
item->timer_4A = 2;
|
||||||
Object_SetInfo(&item->info, item->obj.id);
|
CALL_CANCELLABLE_EVENT(ItemDropEvent, item){
|
||||||
|
Object_SetInfo(&item->info, item->obj.id);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
#include "assets/ast_bg_planet.h"
|
#include "assets/ast_bg_planet.h"
|
||||||
#include "prevent_bss_reordering.h"
|
#include "prevent_bss_reordering.h"
|
||||||
#include "prevent_bss_reordering2.h"
|
#include "prevent_bss_reordering2.h"
|
||||||
|
#include "port/hooks/Events.h"
|
||||||
|
|
||||||
f32 D_i6_801A7F5C;
|
f32 D_i6_801A7F5C;
|
||||||
f32 D_i6_801A7F64;
|
f32 D_i6_801A7F64;
|
||||||
@ -154,7 +155,9 @@ void Andross_801878A8() {
|
|||||||
item->obj.pos.z = -gLevelObjects[i].zPos1;
|
item->obj.pos.z = -gLevelObjects[i].zPos1;
|
||||||
item->obj.pos.z += gLevelObjects[i].zPos2;
|
item->obj.pos.z += gLevelObjects[i].zPos2;
|
||||||
item->obj.pos.y = gLevelObjects[i].yPos;
|
item->obj.pos.y = gLevelObjects[i].yPos;
|
||||||
Object_SetInfo(&item->info, item->obj.id);
|
CALL_CANCELLABLE_EVENT(ItemDropEvent, item){
|
||||||
|
Object_SetInfo(&item->info, item->obj.id);
|
||||||
|
}
|
||||||
item++;
|
item++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -235,7 +238,9 @@ void Andross_80187C5C(void) {
|
|||||||
item->obj.pos.z = -gLevelObjects[i].zPos1;
|
item->obj.pos.z = -gLevelObjects[i].zPos1;
|
||||||
item->obj.pos.z += gLevelObjects[i].zPos2;
|
item->obj.pos.z += gLevelObjects[i].zPos2;
|
||||||
item->obj.pos.y = gLevelObjects[i].yPos;
|
item->obj.pos.y = gLevelObjects[i].yPos;
|
||||||
Object_SetInfo(&item->info, item->obj.id);
|
CALL_CANCELLABLE_EVENT(ItemDropEvent, item){
|
||||||
|
Object_SetInfo(&item->info, item->obj.id);
|
||||||
|
}
|
||||||
item++;
|
item++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1632,7 +1637,9 @@ void Andross_Effect396_Update(Effect396* this) {
|
|||||||
item->obj.pos.y = this->obj.pos.y;
|
item->obj.pos.y = this->obj.pos.y;
|
||||||
item->obj.pos.z = this->obj.pos.z;
|
item->obj.pos.z = this->obj.pos.z;
|
||||||
item->timer_4A = 8;
|
item->timer_4A = 8;
|
||||||
Object_SetInfo(&item->info, item->obj.id);
|
CALL_CANCELLABLE_EVENT(ItemDropEvent, item){
|
||||||
|
Object_SetInfo(&item->info, item->obj.id);
|
||||||
|
}
|
||||||
item->unk_50 = 90.0f;
|
item->unk_50 = 90.0f;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "list/PlayerShotEvent.h"
|
#include "list/EngineEvent.h"
|
||||||
|
#include "list/ItemEvent.h"
|
@ -1,35 +1,42 @@
|
|||||||
#include "EventSystem.h"
|
#include "EventSystem.h"
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
EventSystem* EventSystem::Instance = new EventSystem();
|
EventSystem* EventSystem::Instance = new EventSystem();
|
||||||
|
|
||||||
ListenerID EventSystem::RegisterListener(EventID id, EventCallback callback, EventPriority priority) {
|
ListenerID EventSystem::RegisterListener(EventID id, EventCallback callback, EventPriority priority) {
|
||||||
if(std::find_if(this->mEventListeners[id].begin(), this->mEventListeners[id].end(), [callback](EventListener listener) {
|
auto& listeners = this->mEventListeners[(uint8_t)((id >> 16) & 0xFF)][(uint16_t)(id & 0xFFFF)];
|
||||||
|
|
||||||
|
if(std::find_if(listeners.begin(), listeners.end(), [callback](EventListener listener) {
|
||||||
return listener.function == callback;
|
return listener.function == callback;
|
||||||
}) != this->mEventListeners[id].end()) {
|
}) != listeners.end()) {
|
||||||
throw std::runtime_error("Listener already registered");
|
throw std::runtime_error("Listener already registered");
|
||||||
}
|
}
|
||||||
|
|
||||||
this->mEventListeners[id].push_back({ priority, callback });
|
listeners.push_back({ priority, callback });
|
||||||
|
|
||||||
// Sort by priority
|
// Sort by priority
|
||||||
std::sort(this->mEventListeners[id].begin(), this->mEventListeners[id].end(), [](EventListener a, EventListener b) {
|
std::sort(listeners.begin(), listeners.end(), [](EventListener a, EventListener b) {
|
||||||
return a.priority < b.priority;
|
return a.priority < b.priority;
|
||||||
});
|
});
|
||||||
|
|
||||||
return this->mEventListeners[id].size() - 1;
|
return listeners.size() - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void EventSystem::UnregisterListener(EventID ev, ListenerID id) {
|
void EventSystem::UnregisterListener(EventID id, ListenerID listenerId) {
|
||||||
this->mEventListeners[ev].erase(this->mEventListeners[ev].begin() + id);
|
auto& listeners = this->mEventListeners[(uint8_t)((id >> 16) & 0xFF)][(uint16_t)(id & 0xFFFF)];
|
||||||
|
|
||||||
|
listeners.erase(listeners.begin() + listenerId);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EventSystem::CallEvent(EventID id, IEvent* event) {
|
void EventSystem::CallEvent(EventID id, IEvent* event) {
|
||||||
if (this->mEventListeners[id].empty()) {
|
auto& listeners = this->mEventListeners[(uint8_t)((id >> 16) & 0xFF)][(uint16_t)(id & 0xFFFF)];
|
||||||
|
|
||||||
|
if (listeners.empty()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto& listener : this->mEventListeners[id]) {
|
for (auto& listener : listeners) {
|
||||||
listener.function(event);
|
listener.function(event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
typedef uint16_t EventID;
|
typedef uint16_t EventID;
|
||||||
|
typedef uint16_t NamespaceID;
|
||||||
typedef uint32_t ListenerID;
|
typedef uint32_t ListenerID;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
@ -29,13 +30,32 @@ typedef struct {
|
|||||||
EventCallback function;
|
EventCallback function;
|
||||||
} EventListener;
|
} EventListener;
|
||||||
|
|
||||||
// ID Type
|
// Namespace ID Type
|
||||||
// 000000000000000 0
|
// 00000000XXXXXXXX 000000000000000 0
|
||||||
#define EVENT_ID(id, type) ((id << 1) | type)
|
#define EVENT_ID(namespace_, id_, type_) ((((uint32_t)(namespace_) & 0xFFFF) << 16) | (((uint32_t)(id_) & 0x7FFF) << 1) | ((uint32_t)(type_) & 0x1))
|
||||||
|
|
||||||
|
#define INTERNAL_EVENT_ID(id, type) EVENT_ID(0, id, type)
|
||||||
|
#define DEFINE_EVENT(id, eventName, type, ...) \
|
||||||
|
typedef struct { \
|
||||||
|
IEvent event; \
|
||||||
|
__VA_ARGS__ \
|
||||||
|
} eventName; \
|
||||||
|
\
|
||||||
|
static uint32_t eventName##_ID = INTERNAL_EVENT_ID(id, type);
|
||||||
|
|
||||||
|
#define CALL_EVENT(eventType, ...) \
|
||||||
|
eventType eventType##_ = { {false}, __VA_ARGS__ }; \
|
||||||
|
EventSystem_CallEvent(eventType##_ID, &eventType##_);
|
||||||
|
|
||||||
|
#define CALL_CANCELLABLE_EVENT(eventType, ...) \
|
||||||
|
eventType eventType##_ = { {false}, __VA_ARGS__ }; \
|
||||||
|
EventSystem_CallEvent(eventType##_ID, &eventType##_); \
|
||||||
|
if (!eventType##_.event.cancelled)
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
#include <array>
|
#include <array>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <unordered_map>
|
||||||
|
|
||||||
class EventSystem {
|
class EventSystem {
|
||||||
public:
|
public:
|
||||||
@ -44,7 +64,7 @@ public:
|
|||||||
void UnregisterListener(EventID ev, ListenerID id);
|
void UnregisterListener(EventID ev, ListenerID id);
|
||||||
void CallEvent(EventID id, IEvent* event);
|
void CallEvent(EventID id, IEvent* event);
|
||||||
private:
|
private:
|
||||||
std::array<std::vector<EventListener>, 0xFFFF> mEventListeners;
|
std::unordered_map<NamespaceID, std::unordered_map<EventID, std::vector<EventListener>>> mEventListeners;
|
||||||
};
|
};
|
||||||
#else
|
#else
|
||||||
extern ListenerID EventSystem_RegisterListener(EventID id, EventCallback callback, EventPriority priority);
|
extern ListenerID EventSystem_RegisterListener(EventID id, EventCallback callback, EventPriority priority);
|
||||||
|
@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
#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 INTERNAL_EVENT_ID(1, EVENT_TYPE_PRE)
|
||||||
#define DISPLAY_UPDATE_EVENT_POST EVENT_ID(1, EVENT_TYPE_POST)
|
#define DISPLAY_UPDATE_EVENT_POST INTERNAL_EVENT_ID(1, EVENT_TYPE_POST)
|
||||||
|
|
||||||
#define GAME_UPDATE_EVENT_PRE EVENT_ID(2, EVENT_TYPE_PRE)
|
#define GAME_UPDATE_EVENT_PRE INTERNAL_EVENT_ID(2, EVENT_TYPE_PRE)
|
||||||
#define GAME_UPDATE_EVENT_POST EVENT_ID(2, EVENT_TYPE_POST)
|
#define GAME_UPDATE_EVENT_POST INTERNAL_EVENT_ID(2, EVENT_TYPE_POST)
|
9
src/port/hooks/list/ItemEvent.h
Normal file
9
src/port/hooks/list/ItemEvent.h
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "gfx.h"
|
||||||
|
#include "sf64object.h"
|
||||||
|
#include "port/hooks/impl/EventSystem.h"
|
||||||
|
|
||||||
|
DEFINE_EVENT(3, ItemDropEvent, EVENT_TYPE_PRE,
|
||||||
|
Item* item;
|
||||||
|
);
|
Loading…
Reference in New Issue
Block a user