A 3D game engine from scratch.
1// (c) 2020 Vlad-Stefan Harbuz <vlad@vladh.net>
2
3#include "logs.hpp"
4#include "behavior_functions.hpp"
5#include "behavior.hpp"
6#include "engine.hpp"
7#include "intrinsics.hpp"
8
9
10behavior::State *behavior::state = nullptr;
11
12
13behavior::Function behavior::function_map[(u32)Behavior::length] = {
14 (behavior::Function)nullptr,
15 (behavior::Function)behavior_functions::test,
16 (behavior::Function)behavior_functions::char_movement_test,
17};
18
19
20char const *
21behavior::behavior_to_string(Behavior behavior)
22{
23 if (behavior == Behavior::none) {
24 return "none";
25 } else if (behavior == Behavior::test) {
26 return "test";
27 } else if (behavior == Behavior::char_movement_test) {
28 return "char_movement_test";
29 } else {
30 logs::error("Don't know how to convert Behavior to string: %d", behavior);
31 return "<unknown>";
32 }
33}
34
35
36behavior::Behavior
37behavior::behavior_from_string(char const *str)
38{
39 if (strcmp(str, "none") == 0) {
40 return Behavior::none;
41 } else if (strcmp(str, "test") == 0) {
42 return Behavior::test;
43 } else if (strcmp(str, "char_movement_test") == 0) {
44 return Behavior::char_movement_test;
45 } else {
46 logs::fatal("Could not parse Behavior: %s", str);
47 return Behavior::none;
48 }
49}
50
51
52bool
53behavior::is_behavior_component_valid(behavior::Component *behavior_component)
54{
55 return behavior_component->behavior != Behavior::none;
56}
57
58
59void
60behavior::update()
61{
62 each (behavior_component, *get_components()) {
63 if (!is_behavior_component_valid(behavior_component)) {
64 continue;
65 }
66
67 entities::Handle entity_handle = behavior_component->entity_handle;
68
69 auto handler = function_map[(u32)behavior_component->behavior];
70 if (handler) {
71 handler(entity_handle);
72 }
73 }
74}
75
76
77Array<behavior::Component> *
78behavior::get_components()
79{
80 return &behavior::state->components;
81}
82
83
84behavior::Component *
85behavior::get_component(entities::Handle entity_handle)
86{
87 return behavior::state->components[entity_handle];
88}
89
90
91void behavior::init(
92 behavior::State *behavior_state,
93 memory::Pool *asset_memory_pool,
94 ::State *state
95) {
96 behavior::state = behavior_state;
97 // NOTE: behavior needs the global state to pass to the behavior functions
98 behavior::state->state = state;
99 behavior::state->components = Array<behavior::Component>(
100 asset_memory_pool, MAX_N_ENTITIES, "behavior_components", true, 1);
101}