1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
|
#pragma once
#include <libultraship.h>
#include "engine/registry/RegisterContent.h"
#include "engine/World.h"
#include "engine/SpawnParams.h"
#include "engine/CoreMath.h"
#include "engine/objects/Object.h"
extern "C" {
#include "common_structs.h"
#include "camera.h"
}
//! @todo Make shadow size bigger if thwomp is scaled up
//! @todo make adjustable properties for squishSize and boundingBoxSize
/**
* Thwomp OObject
*
* The game automatically places the actor on the ground so you do not need to provide a Y coordinate value.
*
* @arg direction the rotational direction the thwomp is facing.
* @arg behaviour the behaviour of the thwomp, uses values 1-6.
* @arg primAlpha unknown
* @arg boundingBoxSize optional. The size of the bounding box for the thwomp. Default value is 12
*/
class OThwomp : public OObject {
public:
enum States : uint16_t {
DISABLED,
STATIONARY,
MOVE_AND_ROTATE,
MOVE_FAR, // Requires enough space to work
STATIONARY_FAST,
SLIDE, // Moves sideways left / right
JAILED // Has no collision
};
// This is simply a helper function to keep Spawning code clean
static OThwomp* Spawn(s16 x, s16 z, s16 direction, f32 scale, s16 behaviour, s16 primAlpha, u16 boundingBoxSize = 7) {
IRotator rot;
rot.Set(0, direction, 0);
SpawnParams params = {
.Name = "mk:thwomp",
.Behaviour = behaviour,
.Location = FVector(x, 0, z),
.Rotation = rot,
.Scale = FVector(0, scale, 0),
.PrimAlpha = primAlpha,
.BoundingBoxSize = boundingBoxSize
};
return dynamic_cast<OThwomp*>(AddObjectToWorld<OThwomp>(params));
}
explicit OThwomp(const SpawnParams& params);
~OThwomp() {
_count--;
}
static size_t GetCount() {
return _count;
}
virtual void SetSpawnParams(SpawnParams& params) override;
virtual void Tick60fps() override;
virtual void Draw(s32 cameraId) override;
virtual void DrawEditorProperties() override;
void SetVisibility(s32 objectIndex);
void func_80080B28(s32 objectIndex, s32 playerId);
void DrawModel(s32, s32);
void TranslateThwompLights();
void ThwompLights(s32 objectIndex);
void func_80080DE4(s32 arg0);
s32 func_8007F75C(s32 playerId);
void func_8007F8D8();
void SetPlayerCrushedEffect(s32 objectIndex, Player* player);
void func_80080A4C(s32 objectIndex, s32 cameraPlayerId);
void func_8007542C(s32 arg0);
void func_80074FD8(s32 objectIndex);
void AddParticles(s32 arg0);
s32 func_8007E50C(s32 objectIndex, Player* player, Camera* camera);
s32 func_8007E59C(s32 objectIndex);
void func_8007F544(s32 objectIndex);
void func_8007EFBC(s32 objectIndex);
void func_8007F280(s32 objectIndex);
void func_8007F660(s32 objectIndex, s32 arg1, s32 arg2);
void func_80080E8C(s32 objectIndex1, s32 objectIndex2, s32 arg2);
void func_8007F6C4(s32 objectIndex, s32 playerId);
void func_800810F4(s32 objectIndex);
void func_80081080(s32 objectIndex);
void StationaryBehaviour(s32 objectIndex);
void func_8007EC30(s32 objectIndex);
void MoveAndRotateBehaviour(s32 objectIndex);
void func_8007EE5C(s32 objectIndex);
void MoveFarBehaviour(s32 objectIndex);
void func_8007FA08(s32 objectIndex);
void func_8007FF5C(s32 objectIndex);
void func_8007FB48(s32 objectIndex);
void func_8007FEA4(s32 objectIndex);
void StationaryFastBehaviour(s32 objectIndex);
void func_80080078(s32 objectIndex);
void JailedBehaviour(s32 objectIndex);
void func_800802C0(s32 objectIndex);
void SlidingBehaviour(s32 objectIndex);
void func_80080524(s32 objectIndex);
void func_8008085C(s32 objectIndex);
void func_800806BC(s32 objectIndex);
void func_8008078C(s32 objectIndex);
void func_8007E63C(s32 objectIndex);
u16 BoundingBoxSize;
OThwomp::States Behaviour;
int16_t PrimAlpha;
private:
static size_t _count;
static size_t _rand;
s32 _idx;
s16 _faceDirection;
//! @todo Write this better. This effects the squish size and the bounding box size.
// We should probably return to the programmer the pointer to the actor so they can do thwomp->squishSize = value.
};
|