OpenGothic
Open source reimplementation of Gothic I and II
Loading...
Searching...
No Matches
worldobjects.h
Go to the documentation of this file.
1#pragma once
2
3#include <vector>
4#include <memory>
5
6#include <zenkit/vobs/Misc.hh>
7
8#include "bullet.h"
9#include "spaceindex.h"
10#include "game/gametime.h"
11#include "game/perceptionmsg.h"
12#include "game/constants.h"
13
14class Npc;
15class Item;
16class Vob;
17class StaticObj;
18class Interactive;
19class World;
20class Serialize;
21class TriggerEvent;
22class AbstractTrigger;
23class CsCamera;
24class CollisionZone;
25
26class WorldObjects final {
27 public:
28 WorldObjects(World &owner);
30
31 enum SearchFlg : uint8_t {
32 NoFlg = 0,
36 NoRay = 8,
38 };
39
50
51 void load(Serialize& fout);
52 void save(Serialize& fout);
53 void tick(uint64_t dt, uint64_t dtPlayer);
54
55 Npc* addNpc(size_t itemInstance, std::string_view at);
56 Npc* addNpc(size_t itemInstance, const Tempest::Vec3& at);
57 Npc* insertPlayer(std::unique_ptr<Npc>&& npc, std::string_view at);
58 auto takeNpc(const Npc* npc) -> std::unique_ptr<Npc>;
59 void removeNpc(Npc& npc);
60
61 void updateAnimation(uint64_t dt);
62
63 bool isTargeted(Npc& npc);
64 Npc* findHero();
65 Npc* findNpcByInstance(size_t instance, size_t n = 0);
66 Item* findItemByInstance(size_t instance, size_t n = 0);
67 void detectNpcNear(const std::function<void(Npc&)>& f);
68 void detectNpc (const float x, const float y, const float z, const float r, const std::function<void(Npc&)>& f);
69 void detectItem(const float x, const float y, const float z, const float r, const std::function<void(Item&)>& f);
70
71 uint32_t npcId(const Npc *ptr) const;
72 size_t npcCount() const { return npcArr.size(); }
73 const Npc& npc(size_t i) const { return *npcArr[i]; }
74 Npc& npc(size_t i) { return *npcArr[i]; }
75
76 size_t itmCount() const { return itemArr.size(); }
77 Item& itm(size_t i) { return *itemArr[i]; }
78 uint32_t itmId(const void* ptr) const;
79
80 size_t mobsiCount() const { return interactiveObj.size(); }
81 Interactive& mobsi(size_t i) { return **(interactiveObj.begin()+i); }
82 uint32_t mobsiId(const void* ptr) const;
83
84 void setCurrentCs(CsCamera* cs);
85 CsCamera* currentCs() const;
86
87 void addTrigger(AbstractTrigger* trigger);
88 void enableDefTrigger(AbstractTrigger& trigger);
89 void triggerEvent(const TriggerEvent& e);
90 bool triggerOnStart(bool firstTime);
91 void execDelayedEvents();
92 bool execTriggerEvent(const TriggerEvent& e);
97
98 void runEffect(Effect&& e);
99 void stopEffect(const VisualFx& vfx);
100
101 Item* addItem (size_t itemInstance, std::string_view at);
102 Item* addItem (const zenkit::VItem &vob);
103 Item* addItem (size_t itemInstance, const Tempest::Vec3& pos);
104 Item* addItem (size_t itemInstance, const Tempest::Vec3& pos, const Tempest::Vec3& dir);
105 Item* addItemDyn(size_t itemInstance, const Tempest::Matrix4x4& pos, size_t owner);
106 auto takeItem(Item& it) -> std::unique_ptr<Item>;
107 void removeItem(Item& it);
108 size_t hasItems(std::string_view tag, size_t itemCls);
109 void onItemRemoved(const Item& itm);
110
111 Bullet& shootBullet(const Item &itmId, const Tempest::Vec3& pos, const Tempest::Vec3& dir, float tgRange, float speed);
112
113 void addInteractive(Interactive* obj);
114 void addStatic (StaticObj* obj);
115 void addRoot (const std::shared_ptr<zenkit::VirtualObject>& vob, bool startup);
116 void invalidateVobIndex();
117
119 Npc* validateNpc (Npc *def);
120 Item* validateItem (Item *def);
121
122 bool testFocusNpc (const Npc &pl, Npc *def, const SearchOpt& opt);
123
124 Interactive* findInteractive(const Npc& pl, Interactive *def, const SearchOpt& opt);
125 Npc* findNpcNear (const Npc& pl, Npc* def, const SearchOpt& opt);
126 Item* findItem (const Npc& pl, Item* def, const SearchOpt& opt);
127
128 void marchInteractives(DbgPainter& p) const;
129 void marchCsCameras(DbgPainter& p) const;
130
131 Interactive* availableMob(const Npc& pl, std::string_view name);
132 void setMobRoutine(gtime time, std::string_view scheme, int32_t state);
133
134 void sendPassivePerc (Npc& self, Npc& other, Npc* victim, Item* itm, int32_t perc);
135 void sendImmediatePerc(Npc& self, Npc& other, Npc& victim, Item* itm, int32_t perc);
136
137 void resetPositionToTA();
138
139 private:
140 struct MobRoutine {
141 gtime time;
142 int32_t state = 0;
143 };
144
145 struct MobStates {
146 std::string scheme;
147 std::vector<MobRoutine> routines;
148 int32_t curState = 0;
149 int32_t stateByTime(gtime t) const;
150 void save(Serialize& fout);
151 void load(Serialize& fin);
152 };
153
154 struct EffectState {
155 Effect eff;
156 uint64_t timeUntil = 0;
157 };
158
159 World& owner;
160
161 std::vector<CollisionZone*> collisionZn;
162 std::vector<std::unique_ptr<Vob>> rootVobs;
163
164 SpaceIndex<Interactive> interactiveObj;
165 SpaceIndex<Item> items;
166
167 std::vector<StaticObj*> objStatic;
168 std::vector<std::unique_ptr<Item>> itemArr;
169 std::list<MobStates> routines;
170
171 std::list<Bullet> bullets;
172 std::vector<EffectState> effects;
173
174 std::vector<std::unique_ptr<Npc>> npcArr;
175 std::vector<std::unique_ptr<Npc>> npcInvalid; // dead or invalid TA
176 std::vector<std::unique_ptr<Npc>> npcRemoved; // removed, but may have a dangling references in game
177 std::vector<Npc*> npcNear;
178
179 std::vector<AbstractTrigger*> triggers;
180 std::vector<AbstractTrigger*> triggersTk;
181 std::vector<AbstractTrigger*> triggersDef;
182 std::vector<PerceptionMsg> sndPerc;
183 std::vector<TriggerEvent> triggerEvents;
184 CsCamera* currentCsCamera = nullptr;
185
186 template<class T>
187 auto findObj(T &src, const Npc &pl, const SearchOpt& opt) -> typename std::remove_reference<decltype(src[0])>::type;
188
189 template<class T>
190 bool testObj(T &src, const Npc &pl, const SearchOpt& opt);
191 template<class T>
192 bool testObj(T &src, const Npc &pl, const SearchOpt& opt, float& rlen);
193
194 void setMobState(std::string_view scheme, int32_t st);
195 void passivePerceptionProcess(PerceptionMsg& msg, Npc& npc, Npc& pl);
196
197 void tickNear(uint64_t dt);
198 void tickTriggers(uint64_t dt);
199 static bool isTargetedBy(Npc& npc,Npc& by);
200 };
size_t size() const
Definition spaceindex.h:17
Definition item.h:14
Definition npc.h:25
T ** begin()
Definition spaceindex.h:66
Definition vob.h:11
void resetPositionToTA()
Item * validateItem(Item *def)
void addRoot(const std::shared_ptr< zenkit::VirtualObject > &vob, bool startup)
auto takeItem(Item &it) -> std::unique_ptr< Item >
void addInteractive(Interactive *obj)
void load(Serialize &fout)
void detectNpc(const float x, const float y, const float z, const float r, const std::function< void(Npc &)> &f)
CsCamera * currentCs() const
Interactive & mobsi(size_t i)
void tick(uint64_t dt, uint64_t dtPlayer)
size_t npcCount() const
Item * findItem(const Npc &pl, Item *def, const SearchOpt &opt)
void enableDefTrigger(AbstractTrigger &trigger)
void enableTicks(AbstractTrigger &t)
Item & itm(size_t i)
uint32_t itmId(const void *ptr) const
void addTrigger(AbstractTrigger *trigger)
void updateAnimation(uint64_t dt)
void setMobRoutine(gtime time, std::string_view scheme, int32_t state)
void detectItem(const float x, const float y, const float z, const float r, const std::function< void(Item &)> &f)
void runEffect(Effect &&e)
void removeNpc(Npc &npc)
Npc * findNpcNear(const Npc &pl, Npc *def, const SearchOpt &opt)
void stopEffect(const VisualFx &vfx)
void invalidateVobIndex()
bool isTargeted(Npc &npc)
Interactive * findInteractive(const Npc &pl, Interactive *def, const SearchOpt &opt)
uint32_t npcId(const Npc *ptr) const
Bullet & shootBullet(const Item &itmId, const Tempest::Vec3 &pos, const Tempest::Vec3 &dir, float tgRange, float speed)
bool triggerOnStart(bool firstTime)
Interactive * validateInteractive(Interactive *def)
void marchInteractives(DbgPainter &p) const
uint32_t mobsiId(const void *ptr) const
Item * addItemDyn(size_t itemInstance, const Tempest::Matrix4x4 &pos, size_t owner)
void save(Serialize &fout)
void enableCollizionZone(CollisionZone &z)
const Npc & npc(size_t i) const
void execDelayedEvents()
Npc * insertPlayer(std::unique_ptr< Npc > &&npc, std::string_view at)
Npc * validateNpc(Npc *def)
Npc * addNpc(size_t itemInstance, std::string_view at)
void setCurrentCs(CsCamera *cs)
void sendPassivePerc(Npc &self, Npc &other, Npc *victim, Item *itm, int32_t perc)
void addStatic(StaticObj *obj)
Npc & npc(size_t i)
void removeItem(Item &it)
size_t hasItems(std::string_view tag, size_t itemCls)
Npc * findNpcByInstance(size_t instance, size_t n=0)
void sendImmediatePerc(Npc &self, Npc &other, Npc &victim, Item *itm, int32_t perc)
auto takeNpc(const Npc *npc) -> std::unique_ptr< Npc >
void onItemRemoved(const Item &itm)
bool testFocusNpc(const Npc &pl, Npc *def, const SearchOpt &opt)
bool execTriggerEvent(const TriggerEvent &e)
void disableCollizionZone(CollisionZone &z)
size_t mobsiCount() const
void detectNpcNear(const std::function< void(Npc &)> &f)
Item * findItemByInstance(size_t instance, size_t n=0)
void triggerEvent(const TriggerEvent &e)
Interactive * availableMob(const Npc &pl, std::string_view name)
size_t itmCount() const
void disableTicks(AbstractTrigger &t)
Item * addItem(size_t itemInstance, std::string_view at)
Npc * addNpc(size_t itemInstance, const Tempest::Vec3 &at)
void marchCsCameras(DbgPainter &p) const
Definition world.h:31
static CommandLine * instance
TargetType
Definition constants.h:288
@ TARGET_TYPE_ALL
Definition constants.h:289
TargetCollect
Definition constants.h:277
@ TARGET_COLLECT_CASTER
Definition constants.h:279
TargetCollect collectAlgo