Tramway SDK
ai.h
Go to the documentation of this file.
1// Tramway Drifting and Dungeon Exploration Simulator SDK Runtime
2
3#ifndef TRAM_SDK_EXTENSIONS_KITCHENSINK_AI_H
4#define TRAM_SDK_EXTENSIONS_KITCHENSINK_AI_H
5
6#include <vector>
7#include <framework/core.h>
8#include <framework/uid.h>
9#include <framework/math.h>
10#include <framework/value.h>
11
12/*
13 * AI framework for video game NPCs
14 *
15 * This is a half-finished framework for creating AI packages that could be used
16 * to make video game NPCs.
17 *
18 * Haven't tried using it, probably doesn't work.
19 *
20 * Still working out the basic API and internal mechanics.
21 *
22 */
23
24namespace tram {
25 class ControllerComponent;
26}
27
28namespace tram::Ext::Kitchensink {
29 class AnimationStateComponent;
30 /*
31
32 if normal:
33
34 if time is morning:
35 return go_eat()
36 if time is day:
37 return go_stand(at_workplace)
38 if time is evening:
39 return go_eat()
40 if time is night:
41 return go_sleep(home)
42
43 if combat:
44
45 if health > 10:
46 return attack
47 if true:
48 return retreat
49
50 inside_params ->
51 attacker
52 attacker_faction
53
54 if normal and attack and victim_faction is self_faction:
55 combat_target =
56 attack
57
58 AIAgent:
59 list<pair<AICondition, AIPackage>> package_queue;
60 name class;
61 package_script
62 list<Value> variables
63 AIClass:
64 name parent_class;
65 package_script;
66 default_variables;
67
68 AIPackage:
69 state = running/finished
70 forced = true/false
71
72 SetAIPackage(AI_ATTACK, [("target", big_chungus)])
73
74 AI_ATTACK
75 AI_SLEEP
76 AI_EAT
77
78
79AI_ATTACK ->
80
81 */
82
83class AIAgent;
84class AIPackage;
85typedef AIPackage* (*ai_package_constr)(valuearray_t);
86
87void InitAI();
88void UpdateAI();
89
90class AIPackage {
91public:
92 virtual bool Process() = 0;
93
94 virtual ~AIPackage() = default;
95
96 static void Register(name_t name, ai_package_constr constr);
97 static AIPackage* Make(name_t name, valuearray_t params);
98protected:
99 AIAgent* parent = nullptr;
100};
101
104};
105
106class AIAgent {
107public:
108 std::vector<AIPackage*> package_stack;
109 std::vector<AIPackage*> override_stack;
110
112
113 std::vector<AIVariable> variables;
114
116 void Clear();
117
120
121 void Update();
122
123 void SetControllerComponent(ControllerComponent* c) { controllercomponent = c; }
125 ControllerComponent* GetControllerComponent() { return controllercomponent; }
127
128 static AIAgent* Find(id_t id);
129private:
130 ControllerComponent* controllercomponent;
131 AnimationStateComponent* animationstate;
132};
133
134}
135
136#endif // TRAM_SDK_EXTENSIONS_KITCHENSINK_AI_H
Provides an API for character controllers.
Definition: controller.h:15
name_t script
Definition: ai.h:111
std::vector< AIVariable > variables
Definition: ai.h:113
void Update()
Definition: ai.cpp:48
void SetAnimationStateComponent(AnimationStateComponent *c)
Definition: ai.h:124
AnimationStateComponent * GetAnimationStateComponent()
Definition: ai.h:126
void SetControllerComponent(ControllerComponent *c)
Definition: ai.h:123
std::vector< AIPackage * > override_stack
Definition: ai.h:109
void PushOverride(AIPackage *)
static AIAgent * Find(id_t id)
Definition: ai.cpp:64
ControllerComponent * GetControllerComponent()
Definition: ai.h:125
std::vector< AIPackage * > package_stack
Definition: ai.h:108
static void Register(name_t name, ai_package_constr constr)
Definition: ai.cpp:33
AIAgent * parent
Definition: ai.h:99
static AIPackage * Make(name_t name, valuearray_t params)
Definition: ai.cpp:37
Definition: value.h:314
Generic, type-safe union.
Definition: value.h:18
Extension containing random stuff that doesn't fit in anywhere else.
Definition: ai.cpp:15
AIPackage *(* ai_package_constr)(valuearray_t)
Definition: ai.h:85
void UpdateAI()
Definition: ai.cpp:29
void InitAI()
Definition: ai.cpp:20
Serialization, i.e.
uint32_t id_t
Definition: core.h:10
ValueArray valuearray_t
Definition: value.h:325
Value value
Definition: ai.h:103
Interned string type.
Definition: uid.h:10