summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt2
-rw-r--r--src/event.cpp57
-rw-r--r--src/event.hpp17
3 files changed, 76 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index e90552d..5a1851a 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -16,6 +16,8 @@ set(PKE_SOURCE_FILES
src/macros.hpp
src/ecs.hpp
src/ecs.cpp
+ src/event.hpp
+ src/event.cpp
src/game.hpp
src/game.cpp
src/memory.hpp
diff --git a/src/event.cpp b/src/event.cpp
new file mode 100644
index 0000000..4683f0e
--- /dev/null
+++ b/src/event.cpp
@@ -0,0 +1,57 @@
+
+#include "event.hpp"
+
+struct EventBucket {
+ char name[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+ DynArray<EventHandler> callbacks{8};
+};
+DynArray<EventBucket> eventBuckets{4};
+
+void EventBucketFind(const char *name, char *safeName, EventBucket*& bkt) {
+ assert(strlen(name) <= 16);
+ memset(safeName, '\0', 16);
+ memcpy(safeName, name, strlen(name));
+ for (long i = 0; i < eventBuckets.Count(); ++i) {
+ EventBucket *tmpBkt = eventBuckets.GetPtr() + (sizeof(EventBucket) * i);
+ if (strncmp(safeName, tmpBkt->name, 16) == 0) {
+ bkt = tmpBkt;
+ break;
+ }
+ }
+}
+
+void RegisterCallback(const char *name, EventHandler handler) {
+ char safeName[16];
+ EventBucket *bkt = nullptr;
+ EventBucketFind(name, safeName, bkt);
+ if (bkt == nullptr) {
+ eventBuckets.Push(EventBucket{});
+ bkt = eventBuckets.GetPtr() + (sizeof(EventBucket) * (eventBuckets.Count() - 1));
+ memcpy(bkt->name, safeName, 16);
+ }
+ bkt->callbacks.Push(handler);
+}
+
+void UnregisterCallback(const char *name, EventHandler handler) {
+ char safeName[16];
+ EventBucket *bkt = nullptr;
+ EventBucketFind(name, safeName, bkt);
+ if (bkt == nullptr) return;
+ for (uint64_t i = 0; i < bkt->callbacks.Count(); ++i) {
+ if (bkt->callbacks[i] == handler) {
+ bkt->callbacks.Remove(i);
+ break;
+ }
+ }
+}
+
+void DispatchCabllack(const char *name) {
+ char safeName[16];
+ EventBucket *bkt = nullptr;
+ EventBucketFind(name, safeName, bkt);
+ if (bkt == nullptr) return;
+ for (long i = 0; i < bkt->callbacks.Count(); ++i) {
+ bkt->callbacks[i]();
+ }
+}
+
diff --git a/src/event.hpp b/src/event.hpp
new file mode 100644
index 0000000..505d82a
--- /dev/null
+++ b/src/event.hpp
@@ -0,0 +1,17 @@
+#ifndef PKE_EVENT_HPP
+#define PKE_EVENT_HPP
+
+#include "macros.hpp"
+#include "dynamic-array.hpp"
+
+#include <cassert>
+#include <cstdint>
+#include <cstring>
+
+typedef void (*EventHandler)();
+
+void RegisterCallback(const char *name, EventHandler handler);
+void UnregisterCallback(const char *name, EventHandler handler);
+void DispatchCabllack(const char *name);
+
+#endif /* PKE_EVENT_HPP */