OpenGothic
Open source reimplementation of Gothic I and II
Loading...
Searching...
No Matches
movealgo.h
Go to the documentation of this file.
1#pragma once
2
3#include <cstdint>
4#include <limits>
5
6#include <zenkit/Material.hh>
7
8#include <Tempest/Point>
9
12
13class Npc;
14class World;
15class WayPoint;
16class Serialize;
17
18class MoveAlgo final {
19 public:
20 static const float closeToPointThreshold;
21 static const float climbMove;
22
23 MoveAlgo(Npc& unit);
24
30
31 enum MvFlags {
32 NoFlag = 0,
34 WaitMove = 1<<1,
35 };
36
37 static bool isClose(const Npc& npc, const Npc& p, float dist);
38 static bool isClose(const Npc& npc, const WayPoint& p);
39 static bool isClose(const Npc& npc, const WayPoint& p, float dist);
40 static bool isClose(const Npc& npc, const Tempest::Vec3& p, float dist);
41
42 void load(Serialize& fin);
43 void save(Serialize& fout) const;
44
45 void tick(uint64_t dt, MvFlags fai=NoFlag);
46
47 void multSpeed(float s){ mulSpeed=s; }
48 void clearSpeed();
49 void accessDamFly(float dx,float dz);
50
51 bool testSlide(const Tempest::Vec3& p, DynamicWorld::CollisionTest& out, bool cont = false) const;
52
53 bool startClimb(JumpStatus ani);
54 void startDive();
55
56 bool isFalling() const;
57 bool isSlide() const;
58 bool isInAir() const;
59 bool isJumpup() const;
60 bool isClimb() const;
61 bool isInWater() const;
62 bool isSwim() const;
63 bool isDive() const;
64
65 zenkit::MaterialGroup groundMaterial() const;
66 auto groundNormal() const -> Tempest::Vec3;
67
68 auto portalName() -> std::string_view;
69 auto formerPortalName() -> std::string_view;
70 int32_t diveTime() const;
71
72 float waterDepthKnee() const;
73 float waterDepthChest() const;
74 bool canFlyOverWater() const;
75
76 bool checkLastBounce() const;
77
78 private:
79 void tickMobsi (uint64_t dt);
80 bool tickSlide (uint64_t dt);
81 void tickGravity(uint64_t dt);
82 void tickSwim (uint64_t dt);
83 void tickClimb (uint64_t dt);
84 void tickJumpup (uint64_t dt);
85 bool tickRun(uint64_t dt, MvFlags moveFlg);
86
87 bool tryMove (float x, float y, float z);
88 bool tryMove (float x, float y, float z, DynamicWorld::CollisionTest& out);
89
90 enum Flags : uint32_t {
91 NoFlags = 0,
92 InAir = 1<<1,
93 Falling = 1<<2,
94 Slide = 1<<3,
95 JumpUp = 1<<4,
96 ClimbUp = 1<<5,
97 InWater = 1<<6,
98 Swim = 1<<7,
99 Dive = 1<<8,
100 };
101
102 void setInAir (bool f);
103 void setAsJumpup (bool f);
104 void setAsClimb (bool f);
105 void setAsSlide (bool f);
106 void setInWater (bool f);
107 void setAsSwim (bool f);
108 void setAsDive (bool f);
109 void setAsFalling(bool f);
110
111 bool slideDir() const;
112 bool isForward(const Tempest::Vec3& dp) const;
113 bool isBackward(const Tempest::Vec3& dp) const;
114 bool testMoveDirection(const Tempest::Vec3& dp, const Tempest::Vec3& dir) const;
115 void applyRotation(Tempest::Vec3& out, const Tempest::Vec3& in) const;
116 void applyRotation(Tempest::Vec3& out, const Tempest::Vec3& in, float radians) const;
117 auto animMoveSpeed(uint64_t dt) const -> Tempest::Vec3;
118 auto npcMoveSpeed (uint64_t dt, MvFlags moveFlg) -> Tempest::Vec3;
119 auto go2NpcMoveSpeed (const Tempest::Vec3& dp, const Npc &tg) -> Tempest::Vec3;
120 auto go2WpMoveSpeed (Tempest::Vec3 dp, const Tempest::Vec3& to) -> Tempest::Vec3;
121 void implTick(uint64_t dt,MvFlags fai=NoFlag);
122
123 void onMoveFailed(const Tempest::Vec3& dp, const DynamicWorld::CollisionTest& info, uint64_t dt);
124 void onGravityFailed(const DynamicWorld::CollisionTest& info, uint64_t dt);
125
126 float stepHeight() const;
127 float slideAngle() const;
128 float slideAngle2() const;
129
130 void emitWaterSplash(float y);
131
132 void rayMain (const Tempest::Vec3& pos) const;
133 float dropRay (const Tempest::Vec3& pos, bool& hasCol) const;
134 float waterRay (const Tempest::Vec3& pos, bool* hasCol = nullptr) const;
135 auto normalRay(const Tempest::Vec3& pos) const -> Tempest::Vec3;
136
137 struct CacheLand : DynamicWorld::RayLandResult {
138 float x=0, y=0, z=std::numeric_limits<float>::infinity();
139 };
140 struct CacheWater : DynamicWorld::RayWaterResult {
141 float x=0, y=0, z=std::numeric_limits<float>::infinity();
142 };
143
144 Npc& npc;
145 mutable CacheLand cache;
146 mutable CacheWater cacheW;
147
148 std::string_view portal;
149 std::string_view formerPortal;
150 Flags flags = NoFlags;
151
152 float mulSpeed =1.f;
153 Tempest::Vec3 fallSpeed ={};
154 float fallCount=0.f;
155
156 uint64_t climbStart=0;
157 Tempest::Vec3 climbPos0={};
158 float climbHeight=0.f;
159 uint8_t jmp=0;
160
161 uint64_t diveStart = 0;
162 uint64_t lastBounce = 0;
163
164 static const float gravity;
165 static const float eps;
166 static const int32_t flyOverWaterHint;
167 static const float waterPadd;
168 };
void multSpeed(float s)
Definition movealgo.h:47
static const float closeToPointThreshold
Definition movealgo.h:20
void clearSpeed()
Definition movealgo.cpp:529
bool isSlide() const
Definition movealgo.cpp:804
zenkit::MaterialGroup groundMaterial() const
bool canFlyOverWater() const
Definition movealgo.cpp:673
float waterDepthKnee() const
Definition movealgo.cpp:663
auto groundNormal() const -> Tempest::Vec3
float waterDepthChest() const
Definition movealgo.cpp:668
bool isSwim() const
Definition movealgo.cpp:824
auto formerPortalName() -> std::string_view
@ WaitMove
Definition movealgo.h:34
@ FaiMove
Definition movealgo.h:33
bool isFalling() const
Definition movealgo.cpp:800
bool isClimb() const
Definition movealgo.cpp:816
void load(Serialize &fin)
Definition movealgo.cpp:19
bool isInAir() const
Definition movealgo.cpp:808
bool testSlide(const Tempest::Vec3 &p, DynamicWorld::CollisionTest &out, bool cont=false) const
Definition movealgo.cpp:620
auto portalName() -> std::string_view
bool isDive() const
Definition movealgo.cpp:828
void save(Serialize &fout) const
Definition movealgo.cpp:33
void startDive()
Definition movealgo.cpp:786
static const float climbMove
Definition movealgo.h:21
bool startClimb(JumpStatus ani)
Definition movealgo.cpp:746
void accessDamFly(float dx, float dz)
Definition movealgo.cpp:536
bool checkLastBounce() const
Definition movealgo.cpp:680
static bool isClose(const Npc &npc, const Npc &p, float dist)
Definition movealgo.cpp:709
void tick(uint64_t dt, MvFlags fai=NoFlag)
Definition movealgo.cpp:441
int32_t diveTime() const
Definition movealgo.cpp:703
bool isInWater() const
Definition movealgo.cpp:820
bool isJumpup() const
Definition movealgo.cpp:812
Definition npc.h:25
Definition world.h:31
AnimationSolver::Anim anim
Definition movealgo.h:26