OpenGothic
Open source reimplementation of Gothic I and II
Loading...
Searching...
No Matches
world.h
Go to the documentation of this file.
1#pragma once
2
3#include <Tempest/VertexBuffer>
4#include <Tempest/IndexBuffer>
5#include <Tempest/Matrix4x4>
6#include <string>
7#include <functional>
8
9#include <zenkit/World.hh>
10
11#include "graphics/worldview.h"
12#include "graphics/lightgroup.h"
14#include "game/gamescript.h"
16#include "worldobjects.h"
17#include "worldsound.h"
18#include "waypoint.h"
19#include "waymatrix.h"
20
21class GameSession;
22class Focus;
23class WayMatrix;
24class VisualFx;
25class GlobalEffects;
26class ParticleFx;
27class Interactive;
28class VersionInfo;
29class GlobalFx;
30
31class World final {
32 public:
33 World()=delete;
34 World(const World&)=delete;
35 World(GameSession& game, std::string_view file, bool startup, std::function<void(int)> loadProgress);
36 ~World();
37
38 void createPlayer(std::string_view cls);
39 void insertPlayer(std::unique_ptr<Npc>&& npc, std::string_view waypoint);
40 void setPlayer(Npc* npc);
41 void postInit();
42 std::string_view name() const { return wname; }
43
44 void load(Serialize& fin );
45 void save(Serialize& fout);
46
47 uint32_t npcId(const Npc* ptr) const;
48 Npc* npcById(uint32_t id);
49 uint32_t npcCount() const;
50
51 uint32_t mobsiId(const Interactive* ptr) const;
52 Interactive* mobsiById(uint32_t id);
53
54 uint32_t itmId(const void* ptr) const;
55 Item* itmById(uint32_t id);
56
57 const WayPoint* findPoint(std::string_view name, bool inexact=true) const;
58 const WayPoint* findWayPoint(std::string_view name) const;
59 const WayPoint* findWayPoint(const Tempest::Vec3& pos) const;
60 const WayPoint* findWayPoint(const Tempest::Vec3& pos, const std::function<bool(const WayPoint&)>& f) const;
61 const WayPoint* findWayPoint(const Tempest::Vec3& pos, std::string_view name) const;
62
63 const WayPoint* findFreePoint(const Npc& pos, std::string_view name) const;
64 const WayPoint* findFreePoint(const Tempest::Vec3& pos, std::string_view name) const;
65
66 const WayPoint* findNextFreePoint(const Npc& pos, std::string_view name) const;
67 const WayPoint* findNextWayPoint(const Npc &npc) const;
68 const WayPoint* findNextPoint(const WayPoint& pos) const;
69
70 const WayPoint& startPoint() const;
71 const WayPoint& deadPoint() const;
72
73 void detectNpcNear(std::function<void(Npc&)> f);
74 void detectNpc (const Tempest::Vec3& p, const float r, const std::function<void(Npc&)>& f);
75 void detectItem(const Tempest::Vec3& p, const float r, const std::function<void(Item&)>& f);
76
77 WayPath wayTo(const Npc& pos,const WayPoint& end) const;
78
79 WorldView* view() const { return wview.get(); }
80 WorldSound* sound() { return &wsound; }
81 DynamicWorld* physic() const { return wdynamic.get(); }
82 GlobalEffects* globalFx() const { return globFx.get(); }
83
84 GameScript& script() const;
85 GameSession& gameSession() const { return game; }
86 auto version() const -> const VersionInfo&;
87
88 void assignRoomToGuild(std::string_view room, int32_t guildId);
89 int32_t guildOfRoom(const Tempest::Vec3& pos);
90 int32_t guildOfRoom(std::string_view portalName);
91
92 void runEffect(Effect&& e);
93 void stopEffect(const VisualFx& vfx);
94
95 GlobalFx addGlobalEffect(std::string_view what, uint64_t len, const std::string* argv, size_t argc);
96 MeshObjects::Mesh addView(std::string_view visual) const;
97 MeshObjects::Mesh addView(std::string_view visual, int32_t headTex, int32_t teetTex, int32_t bodyColor) const;
98 MeshObjects::Mesh addView(const zenkit::IItem& itm);
99 MeshObjects::Mesh addView(const ProtoMesh* visual);
100 MeshObjects::Mesh addAtachView (const ProtoMesh::Attach& visual, const int32_t version);
101 MeshObjects::Mesh addStaticView(const ProtoMesh* visual, bool staticDraw);
102 MeshObjects::Mesh addStaticView(std::string_view visual);
103 MeshObjects::Mesh addDecalView (const zenkit::VisualDecal& decal);
104 LightGroup::Light addLight(const zenkit::VLight& vob);
105 LightGroup::Light addLight(std::string_view preset);
106
107 void updateAnimation(uint64_t dt);
108 void resetPositionToTA();
109
110 auto takeHero() -> std::unique_ptr<Npc>;
111 Npc* player() const { return npcPlayer; }
112 Npc* findNpcByInstance(size_t instance, size_t n = 0);
113 Item* findItemByInstance(size_t instance, size_t n = 0);
114 std::string_view roomAt(const Tempest::Vec3& arr);
115
116 void scaleTime(uint64_t& dt);
117 void tick(uint64_t dt);
118 uint64_t tickCount() const;
119 void setDayTime(int32_t h,int32_t min);
120 gtime time() const;
121
122 Focus validateFocus(const Focus& def);
123 Focus findFocus(const Npc& pl, const Focus &def);
124 Focus findFocus(const Focus& def);
125 bool testFocusNpc(Npc *def);
126
127 void triggerOnStart(bool firstTime);
128 void triggerEvent(const TriggerEvent& e);
129 void triggerChangeWorld(std::string_view world, std::string_view wayPoint);
130 void execTriggerEvent(const TriggerEvent& e);
134 void setCurrentCs(CsCamera* cs);
135 CsCamera* currentCs() const;
136 bool isCutsceneLock() const;
139
140 Interactive* availableMob(const Npc &pl, std::string_view name);
141 Interactive* findInteractive(const Npc& pl);
142 void setMobRoutine(gtime time, std::string_view scheme, int32_t state);
143
144 void marchInteractives(DbgPainter& p) const;
145 void marchPoints (DbgPainter& p) const;
146 void marchCsCameras (DbgPainter& p) const;
147
149 void aiOutputSound(Npc &player, std::string_view msg);
150 bool isInDialog() const;
151
152 bool isTargeted (Npc& npc);
153 Npc* addNpc (std::string_view name, std::string_view at);
154 Npc* addNpc (size_t npcInstance, std::string_view at);
155 Npc* addNpc (size_t npcInstance, const Tempest::Vec3& at);
156 void removeNpc (Npc& npc);
157
158 Item* addItem (size_t itemInstance, std::string_view at);
159 Item* addItem (const zenkit::VItem& vob);
160 Item* addItem (size_t itemInstance, const Tempest::Vec3& pos);
161 Item* addItemDyn (size_t itemInstance, const Tempest::Matrix4x4& pos, size_t owner);
162 auto takeItem (Item& it) -> std::unique_ptr<Item>;
163 void removeItem (Item& it);
164 size_t hasItems(std::string_view tag, size_t itemCls);
165
166 Bullet& shootBullet(const Item &itmId, const Npc& npc, const Npc* target, const Interactive* inter);
167 Bullet& shootSpell(const Item &itm, const Npc &npc, const Npc *target);
168
169 void sendPassivePerc (Npc& self, Npc& other, int32_t perc);
170 void sendPassivePerc (Npc& self, Npc& other, Npc& victim, int32_t perc);
171 void sendPassivePerc (Npc& self, Npc& other, Item& item, int32_t perc);
172 void sendPassivePerc (Npc& self, Npc& other, Npc& victim, Item& item, int32_t perc);
173
174 void sendImmediatePerc(Npc& self, Npc& other, Npc& victim, int32_t perc);
175 void sendImmediatePerc(Npc& self, Npc& other, Npc& victim, Item& item, int32_t perc);
176
177 bool isInSfxRange(const Tempest::Vec3& pos) const;
178 bool isInPfxRange(const Tempest::Vec3& pos) const;
179
180 void addDlgSound(std::string_view s, const Tempest::Vec3& pos, float range, uint64_t &timeLen);
181
182 Sound addWeaponHitEffect(Npc& src, const Bullet* srcArrow, Npc& reciver);
183 Sound addWeaponBlkEffect(ItemMaterial src, ItemMaterial reciver, const Tempest::Matrix4x4& pos);
184 Sound addLandHitEffect (ItemMaterial src, zenkit::MaterialGroup reciver, const Tempest::Matrix4x4& pos);
185
186 void addTrigger (AbstractTrigger* trigger);
187 void addInteractive(Interactive* inter);
188 void addStartPoint (const Tempest::Vec3& pos, const Tempest::Vec3& dir, std::string_view name);
189 void addFreePoint (const Tempest::Vec3& pos, const Tempest::Vec3& dir, std::string_view name);
190 void addSound (const zenkit::VirtualObject& vob);
191
192 void invalidateVobIndex();
193
194 private:
195 const zenkit::IFocus& searchPolicy(const Npc& pl, TargetCollect& collAlgo, TargetType& collType, WorldObjects::SearchFlg& opt) const;
196 std::string wname;
197 GameSession& game;
198
199 std::unique_ptr<WayMatrix> wmatrix;
200
201 struct BspSector final {
202 int32_t guild=GIL_NONE;
203 };
204
205 struct {
206 std::vector<zenkit::BspNode> nodes;
207 std::vector<zenkit::BspSector> sectors;
208 std::vector<std::uint64_t> leaf_node_indices;
209 std::vector<BspSector> sectorsData;
210 } bsp;
211
212 Npc* npcPlayer=nullptr;
213
214 std::unique_ptr<DynamicWorld> wdynamic;
215 std::unique_ptr<WorldView> wview;
216 std::unique_ptr<GlobalEffects> globFx;
217 WorldSound wsound;
218 WorldObjects wobj;
219 std::unique_ptr<Npc> lvlInspector;
220
221 auto roomAt(const zenkit::BspNode &node) -> std::string_view;
222 auto portalAt(std::string_view tag) -> BspSector*;
223
224 void initScripts(bool firstTime);
225
226 Sound addHitEffect(std::string_view src, std::string_view reciver, std::string_view scheme, const Tempest::Matrix4x4& pos);
227 };
Definition focus.h:10
Definition item.h:14
Definition npc.h:25
Definition sound.h:5
Definition world.h:31
auto version() const -> const VersionInfo &
Definition world.cpp:1023
void sendPassivePerc(Npc &self, Npc &other, int32_t perc)
Definition world.cpp:697
int32_t guildOfRoom(const Tempest::Vec3 &pos)
Definition world.cpp:1040
CsCamera * currentCs() const
Definition world.cpp:536
void save(Serialize &fout)
Definition world.cpp:188
void triggerOnStart(bool firstTime)
Definition world.cpp:867
void addDlgSound(std::string_view s, const Tempest::Vec3 &pos, float range, uint64_t &timeLen)
Definition world.cpp:799
std::vector< zenkit::BspSector > sectors
Definition world.h:207
void runEffect(Effect &&e)
Definition world.cpp:234
void marchCsCameras(DbgPainter &p) const
Definition world.cpp:570
size_t hasItems(std::string_view tag, size_t itemCls)
Definition world.cpp:633
void triggerChangeWorld(std::string_view world, std::string_view wayPoint)
Definition world.cpp:554
void disableCollizionZone(CollisionZone &z)
Definition world.cpp:550
void scaleTime(uint64_t &dt)
Definition world.cpp:371
LightGroup::Light addLight(const zenkit::VLight &vob)
Definition world.cpp:283
void triggerEvent(const TriggerEvent &e)
Definition world.cpp:495
AiOuputPipe * openDlgOuput(Npc &player, Npc &npc)
Definition world.cpp:574
const WayPoint * findNextWayPoint(const Npc &npc) const
Definition world.cpp:941
Interactive * findInteractive(const Npc &pl)
Definition world.cpp:487
DynamicWorld * physic() const
Definition world.h:81
bool isTargeted(Npc &npc)
Definition world.cpp:586
void resetPositionToTA()
Definition world.cpp:295
void load(Serialize &fin)
Definition world.cpp:170
MeshObjects::Mesh addAtachView(const ProtoMesh::Attach &visual, const int32_t version)
Definition world.cpp:267
std::string_view roomAt(const Tempest::Vec3 &arr)
Definition world.cpp:311
Interactive * availableMob(const Npc &pl, std::string_view name)
Definition world.cpp:483
Focus validateFocus(const Focus &def)
Definition world.cpp:409
void enableCollizionZone(CollisionZone &z)
Definition world.cpp:546
auto takeHero() -> std::unique_ptr< Npc >
Definition world.cpp:299
WayPath wayTo(const Npc &pos, const WayPoint &end) const
Definition world.cpp:981
uint64_t tickCount() const
Definition world.cpp:387
bool isCutsceneLock() const
Definition world.cpp:540
GameSession & gameSession() const
Definition world.h:85
Npc * addNpc(std::string_view name, std::string_view at)
Definition world.cpp:590
const WayPoint * findNextFreePoint(const Npc &pos, std::string_view name) const
Definition world.cpp:923
void sendImmediatePerc(Npc &self, Npc &other, Npc &victim, int32_t perc)
Definition world.cpp:713
bool isInDialog() const
Definition world.cpp:582
void enableTicks(AbstractTrigger &t)
Definition world.cpp:524
Sound addLandHitEffect(ItemMaterial src, zenkit::MaterialGroup reciver, const Tempest::Matrix4x4 &pos)
Definition world.cpp:752
World()=delete
const WayPoint * findPoint(std::string_view name, bool inexact=true) const
Definition world.cpp:871
uint32_t itmId(const void *ptr) const
Definition world.cpp:224
gtime time() const
Definition world.cpp:405
void detectNpcNear(std::function< void(Npc &)> f)
Definition world.cpp:969
bool testFocusNpc(Npc *def)
Definition world.cpp:473
void invalidateVobIndex()
Definition world.cpp:832
Item * itmById(uint32_t id)
Definition world.cpp:228
void insertPlayer(std::unique_ptr< Npc > &&npc, std::string_view waypoint)
Definition world.cpp:138
Sound addWeaponBlkEffect(ItemMaterial src, ItemMaterial reciver, const Tempest::Matrix4x4 &pos)
Definition world.cpp:758
uint32_t npcId(const Npc *ptr) const
Definition world.cpp:200
uint32_t mobsiId(const Interactive *ptr) const
Definition world.cpp:214
void disableTicks(AbstractTrigger &t)
Definition world.cpp:528
Npc * findNpcByInstance(size_t instance, size_t n=0)
Definition world.cpp:307
bool isInSfxRange(const Tempest::Vec3 &pos) const
Definition world.cpp:791
std::vector< std::uint64_t > leaf_node_indices
Definition world.h:208
WorldSound * sound()
Definition world.h:80
void updateAnimation(uint64_t dt)
Definition world.cpp:291
Item * addItemDyn(size_t itemInstance, const Tempest::Matrix4x4 &pos, size_t owner)
Definition world.cpp:621
void addTrigger(AbstractTrigger *trigger)
Definition world.cpp:804
void removeItem(Item &it)
Definition world.cpp:629
void createPlayer(std::string_view cls)
Definition world.cpp:128
const WayPoint & deadPoint() const
Definition world.cpp:965
GlobalEffects * globalFx() const
Definition world.h:82
void detectItem(const Tempest::Vec3 &p, const float r, const std::function< void(Item &)> &f)
Definition world.cpp:977
Npc * npcById(uint32_t id)
Definition world.cpp:204
~World()
Definition world.cpp:125
std::string_view name() const
Definition world.h:42
void marchPoints(DbgPainter &p) const
Definition world.cpp:566
Item * addItem(size_t itemInstance, std::string_view at)
Definition world.cpp:609
auto takeItem(Item &it) -> std::unique_ptr< Item >
Definition world.cpp:625
void addSound(const zenkit::VirtualObject &vob)
Definition world.cpp:820
GlobalFx addGlobalEffect(std::string_view what, uint64_t len, const std::string *argv, size_t argc)
Definition world.cpp:247
void addFreePoint(const Tempest::Vec3 &pos, const Tempest::Vec3 &dir, std::string_view name)
Definition world.cpp:816
bool isInPfxRange(const Tempest::Vec3 &pos) const
Definition world.cpp:795
void setCurrentCs(CsCamera *cs)
Definition world.cpp:532
void detectNpc(const Tempest::Vec3 &p, const float r, const std::function< void(Npc &)> &f)
Definition world.cpp:973
Interactive * mobsiById(uint32_t id)
Definition world.cpp:218
void stopEffect(const VisualFx &vfx)
Definition world.cpp:238
void tick(uint64_t dt)
Definition world.cpp:375
MeshObjects::Mesh addView(std::string_view visual) const
Definition world.cpp:251
std::vector< BspSector > sectorsData
Definition world.h:209
void enableDefTrigger(AbstractTrigger &t)
Definition world.cpp:520
std::vector< zenkit::BspNode > nodes
Definition world.h:206
uint32_t npcCount() const
Definition world.cpp:210
const WayPoint * findFreePoint(const Npc &pos, std::string_view name) const
Definition world.cpp:897
const WayPoint & startPoint() const
Definition world.cpp:961
void postInit()
Definition world.cpp:163
void setMobRoutine(gtime time, std::string_view scheme, int32_t state)
Definition world.cpp:558
const WayPoint * findWayPoint(std::string_view name) const
Definition world.cpp:875
void addStartPoint(const Tempest::Vec3 &pos, const Tempest::Vec3 &dir, std::string_view name)
Definition world.cpp:812
void aiOutputSound(Npc &player, std::string_view msg)
Definition world.cpp:578
void setDayTime(int32_t h, int32_t min)
Definition world.cpp:391
MeshObjects::Mesh addStaticView(const ProtoMesh *visual, bool staticDraw)
Definition world.cpp:271
Sound addWeaponHitEffect(Npc &src, const Bullet *srcArrow, Npc &reciver)
Definition world.cpp:721
void setPlayer(Npc *npc)
Definition world.cpp:145
WorldView * view() const
Definition world.h:79
const WayPoint * findNextPoint(const WayPoint &pos) const
Definition world.cpp:957
World(const World &)=delete
Item * findItemByInstance(size_t instance, size_t n=0)
Definition world.cpp:303
void assignRoomToGuild(std::string_view room, int32_t guildId)
Definition world.cpp:1027
GameScript & script() const
Definition world.cpp:1019
void marchInteractives(DbgPainter &p) const
Definition world.cpp:562
void removeNpc(Npc &npc)
Definition world.cpp:605
MeshObjects::Mesh addDecalView(const zenkit::VisualDecal &decal)
Definition world.cpp:279
void addInteractive(Interactive *inter)
Definition world.cpp:808
Bullet & shootSpell(const Item &itm, const Npc &npc, const Npc *target)
Definition world.cpp:637
Focus findFocus(const Npc &pl, const Focus &def)
Definition world.cpp:418
void execTriggerEvent(const TriggerEvent &e)
Definition world.cpp:499
Bullet & shootBullet(const Item &itmId, const Npc &npc, const Npc *target, const Interactive *inter)
Definition world.cpp:662
Npc * player() const
Definition world.h:111
static CommandLine * instance
@ GIL_NONE
Definition constants.h:9
TargetType
Definition constants.h:288
TargetCollect
Definition constants.h:277
ItemMaterial
Definition constants.h:242