-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathWorld.h
320 lines (253 loc) · 9.3 KB
/
World.h
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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
/////////////////////////////////////////////////////////////////////////////
//
// $Header: /WinArena/World.h 10 12/31/06 12:11p Lee $
//
// File: World.h
//
//
/////////////////////////////////////////////////////////////////////////////
#pragma once
#include "Animation.h"
#include "Raster.h"
#include "SoundDriver.h"
#include "Types.h"
#include "MidiPlayer.h"
#define c_PortalOpenTime 1400 // milliseconds required for door/portcullis to open
extern AnimInfo_t g_AnimInfo[];
extern CritterInfo_t g_CritterInfo[]; // g_CritterInfo[c_CritterTypeCount];
extern SoundFile_t g_SoundFile[];
extern SongFile_t g_SongFile[];
struct BlockSide_t
{
DWORD Flags;
long yLo;
long yHi;
long vLo;
long vHi;
};
class CwaWorld
{
private:
ArenaLoader m_Loader;
CwaSoundDriver m_SoundDriver;
CwaRaster* m_pRaster;
CwaAnimation* m_pWeapon;
bool m_UseFogMap;
BYTE m_LightMapNormal[18*256];
BYTE m_LightMapFog[18*256];
CwaTexture* m_pCurrentMousePointer;
bool m_MouseMoveEnabled;
long m_MouseTurnRate;
long m_MouseTurnRateFraction;
long m_MouseWalkRate;
long m_MouseStrafeRate;
SoundClip_t m_SoundClips[Sound_ArraySize];
CwaTexture m_TextureList[Texture_ArraySize];
CwaTexture m_WallList[256];
CwaTexture m_FlatList[64];
CwaAnimation m_Animations[Animation_ArraySize];
CwaCreature m_Creatures[128];
CwaAnimation m_Water;
CwaAnimation m_WeaponAxe;
CwaAnimation m_WeaponHammer;
CwaAnimation m_WeaponHand;
CwaAnimation m_WeaponMace;
CwaAnimation m_WeaponStaff;
CwaAnimation m_WeaponStar;
CwaAnimation m_WeaponSword;
CwaAnimation m_MousePointer;
CwaAnimation m_SpellAcid;
CwaAnimation m_SpellFire;
CwaAnimation m_SpellIce;
CwaAnimation m_SpellMagic;
CwaAnimation m_SpellShock;
CwaAnimation m_SpellSmoke;
CastingSpell_t m_SpellAnimation;
DWORD m_SpellCastBaseTime;
AttackState_t m_AttackState;
DWORD m_AttackStartTime;
bool m_AttackAnimating;
CellNode_t m_Nodes[128][128];
Critter_t m_Critter[128];
Sprite_t m_Sprite[1024];
Projectile_t m_Projectile[16];
LightSource_t m_Lights[128];
Trigger_t m_Triggers[64];
DWORD m_LightCount;
CwaMidiPlayer m_MidiPlayer;
CwaMidiSong m_SongList[Song_ArraySize];
MidiEvent_t m_MidiEvent;
DWORD m_TriggerCount;
Character_t m_Character;
long m_Position[3];
long m_Direction;
long m_DirectionSine;
long m_DirectionCosine;
long m_TurnSpeed;
long m_MoveSpeed;
long m_StrafeSpeed;
DWORD m_ElevationBaseTime;
Elevation_t m_Elevation;
long m_ElevationBeginPos[3]; // where player will land when falling
long m_ElevationEndPos[3]; // where player will land when falling
DWORD m_MaxEast;
DWORD m_MaxSouth;
DWORD m_MaxDrawDistance; // only draw cells within this grid distance
DWORD m_WalkDistance; // distance walked since last footstep sound
bool m_LeftFootStep; // was most recent footstep sound left or right?
long m_HalfWidth;
long m_HalfHeight;
long m_FieldOfViewX;
long m_FieldOfViewY;
long m_InverseFieldOfViewX;
long m_InverseFieldOfViewY;
bool m_ShowFPS;
bool m_IlluminatePlayer;
DWORD m_FPS;
DWORD m_MouseX;
DWORD m_MouseY;
bool m_RightMouseDown;
DWORD m_RightMouseX;
DWORD m_RightMouseY;
DWORD m_BaseAttackTime;
DWORD m_RandomSoundDelay;
DWORD m_CurrentTimeDelta;
DWORD m_CurrentTime;
DisplayMode_t m_DisplayMode;
bool m_FullBright; // render everything at full brightness, enabled by "Light" spell
DWORD m_SkyColor; // sky/darkness color to use when outside
PauseState_t m_PauseState; // game is paused, usually waiting for user input
bool m_SelectionCompleted; // flag gets set to true when user has picked item from list
DWORD m_SelectionCount; // number of items in selection list
DWORD m_SelectionIndex; // index of currently highlighted item
DWORD m_SelectionMaxVisi; // maximum number of items visible at once
DWORD m_SelectionOffset; // index of first visible item
DWORD m_SelectionID; // sprite ID when clicking on a loot pile or corpse
char* m_SelectionList[32];
DWORD m_LevelDownID; // texture IDs for stairs up/down tiles
DWORD m_LevelUpID;
Triangle_t m_TriangleList[64];
Triangle_t* m_pInputTriangleQueue;
Triangle_t* m_pOutputTriangleQueue;
Triangle_t* m_pFreeTriangleQueue;
DWORD m_Palette[256];
char m_MessageBuffer[256];
DWORD m_MessageBaseTime;
DWORD m_MessageWidth;
bool m_QuickSortOverflow;
DWORD m_QuadLimit; // maximum number of quads to render to improve performance, or 0 for no limit
DWORD m_QuadCount;
QuadSort_t m_QuadSortList[10000]; // sorting table, sorts quad indices instead of quads, so swapping is faster
Quad_t m_QuadList[10000]; // list of visible quads
inline void LerpVertex(const Vertex_t &v1, const Vertex_t &v2, Vertex_t &result, long mul)
{
result.x = FixedMul((v2.x - v1.x), mul) + v1.x;
result.y = FixedMul((v2.y - v1.y), mul) + v1.y;
result.z = FixedMul((v2.z - v1.z), mul) + v1.z;
result.u = FixedMul((v2.u - v1.u), mul) + v1.u;
result.v = FixedMul((v2.v - v1.v), mul) + v1.v;
result.l = FixedMul((v2.l - v1.l), mul) + v1.l;
}
public:
CwaWorld(void);
~CwaWorld(void);
bool Load(void);
void Unload(void);
void ResampleAudio(BYTE input[], short output[], DWORD countIn, DWORD countOut, DWORD filterSize);
void DumpMusic();
void ShowFPS(bool enable);
void EnablePlayerIllumination(bool enable);
void SetFPS(DWORD fps);
void SetResolution(DWORD width, DWORD height);
void SetRaster(CwaRaster *pRaster);
void SetRenderDistance(DWORD distance);
void ScrollWheel(bool down);
void ScrollSelectMenuUp(void);
void ScrollSelectMenuDown(void);
void SetMousePosition(DWORD x, DWORD y);
bool LeftMouseClick(void);
void LeftMouseClickLootPile(DWORD x, DWORD y);
void RightMouseClick(bool down);
void AdvanceTime(DWORD delta);
void PressEscKey(void);
DWORD Random32(DWORD maxValue);
bool CheckCritterCollision(long x, long z, DWORD &id);
bool CheckHitCritterMelee(DWORD &id);
bool ShowOutsideOfBlock(DWORD south, DWORD east, DWORD level, BlockSide_t &side);
bool IsBlockSolid(DWORD south, DWORD east, DWORD level);
bool CellIsVisible(DWORD south, DWORD east);
DWORD CellTrigger(DWORD south, DWORD east);
void SetPlayerDirection(long direction);
void MovePlayer(DWORD milliseconds);
void FallIntoTrench(long southFrac, long eastFrac, long south, long east);
void Jump(void);
void SetTurnSpeed(long speed);
void SetMoveSpeed(long speed);
void CheckMouseMovement(void);
void PushPlayerBack(long east, long south, long minDistance);
void ClickOnID(DWORD pointID);
void SetDisplayMessage(char *pMessage = NULL);
void ResetTriangleQueues(void);
void SwapInputOutputTriangleQueues(void);
Triangle_t* NewTriangle(void);
void FreeTriangle(Triangle_t *pTriangle);
Triangle_t* PopInputTriangle(void);
void PushOutputTriangle(Triangle_t *pTriangle);
Triangle_t* PopOutputTriangle(void);
long ComputeBrightness(long position[]);
void UpdateLightSources(void);
void UpdateMouseMoving(DWORD scale);
void UpdateTriggers(void);
void ShowArmorRatings(DWORD scale);
void ComputeGridCoords(GridCoords_t *pGrid, long lineNum);
void Render(void);
void RenderAutomap(DWORD scale);
void RenderCharacter(DWORD scale);
void RenderControlPanel(DWORD scale);
void RenderGameScreen(DWORD scale);
void RenderInventory(DWORD scale);
void RenderJournal(DWORD scale);
void RenderLoadSave(DWORD scale);
void RenderSpellBook(DWORD scale);
void RenderSpellPage(DWORD scale);
void RenderSpellCasting(DWORD scale);
void RenderWater(DWORD scale);
void RenderWeaponOverlay(DWORD scale);
void RenderCell(GridCoords_t *pGrid0, GridCoords_t *pGrid1, DWORD south, DWORD east);
void RenderTriQuad(Vertex_t corners[], DWORD shapeID, bool transparent = false);
void RenderSprite(DWORD spriteNum);
void RenderProjectile(DWORD projectileNum);
void RenderCritter(DWORD critterNum);
void RenderTriangleList(bool transparent, DWORD shapeID);
bool CreateHorizontalQuad(Quad_t &quad);
void AddHorizontalQuad(Quad_t &quad, CwaTexture *pTexture, DWORD shapeID = 0, DWORD flags = 0);
void AddWallQuad(Quad_t &quad, CwaTexture *pTexture, DWORD shapeID = 0, DWORD flags = 0);
void AddVerticalQuad(Vertex_t corners[], CwaTexture *pTexture, DWORD shapeID = 0, DWORD flags = 0);
void SortQuadList(void);
void RenderQuadList(void);
void RenderQuadListWithDepth(void);
bool ClipQuadToNearZ(Quad_t &quad);
void ClipNearZ(void);
void TransformPoint(long point[]);
bool TransformVertices(Vertex_t corners[], DWORD count);
/////////////////////////////////////////////////////////////////////////
//
// The following methods are implemented in WorldBuilder.cpp
//
void ResetLevel(void);
void SetCellTrigger(DWORD south, DWORD east, DWORD type);
long PortalAngle(Trigger_t &trigger);
DWORD AllocCritter(void);
DWORD AllocLight(void);
DWORD AllocSprite(void);
void FreeSprite(DWORD spriteID);
DWORD AddAnimatedSprite(DWORD anim, long position[3]);
DWORD MakeCritter(DWORD critterID, long position[3]);
DWORD MakeFlatSprite(DWORD textureID, long position[3], DWORD scale);
DWORD MakeLootPile(DWORD textureID, long position[3]);
void BuildTestLevel(void);
void BuildTestCity(void);
void BuildDemoDungeon(char datafile[], char info[], DWORD width, DWORD height, bool exterior);
void ParseInfoFlags(char *p, FlatInfo_t &flat);
void ParseINF(char name[], FlatInfo_t flats[]);
};