summaryrefslogtreecommitdiffstats
path: root/src/control/Record.h
blob: 4abeb68a75b4caf9583e9b4c29f6e503d3f89c32 (plain) (blame)
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
#pragma once

class CAutomobile;
class CVehicle;
class CControllerState;

class CCarStateEachFrame
{
public:
	int16 velX;
	int16 velY;
	int16 velZ;
	int8 rightX;
	int8 rightY;
	int8 rightZ;
	int8 forwardX;
	int8 forwardY;
	int8 forwardZ;
	int8 wheel;
	uint8 gas;
	uint8 brake;
	bool handbrake;
	CVector pos;
};

extern char* gString;

class CRecordDataForChase
{
	enum {
		NUM_CHASE_CARS = 20
	};
	enum {
		STATE_NONE = 0,
		STATE_RECORD = 1,
		STATE_PLAYBACK_INIT = 2,
		STATE_PLAYBACK = 3,
		STATE_PLAYBACK_BEFORE_RECORDING = 4
	};
	static uint8 &Status;
	static int &PositionChanges;
	static uint8 &CurrentCar;
	static CAutomobile*(&pChaseCars)[NUM_CHASE_CARS];
	static float &AnimTime;
	static uint32 &AnimStartTime;
	static CCarStateEachFrame* (&pBaseMemForCar)[NUM_CHASE_CARS];
	static float &TimeMultiplier;
	static int &FId2;
public:

	static bool IsRecording(void) { return Status == STATE_RECORD; }

	static void Init(void);
	static void SaveOrRetrieveDataForThisFrame(void);
	static void SaveOrRetrieveCarPositions(void);
	static void StoreInfoForCar(CAutomobile*, CCarStateEachFrame*);
	static void RestoreInfoForMatrix(CMatrix&, CCarStateEachFrame*);
	static void RestoreInfoForCar(CAutomobile*, CCarStateEachFrame*, bool);
	static void ProcessControlCars(void);
#if (defined(GTA_PS2) || defined(FIX_BUGS))
	static bool ShouldThisPadBeLeftAlone(uint8 pad);
#endif
	static void GiveUsACar(int32, CVector, float, CAutomobile**, uint8, uint8);
	static void StartChaseScene(float);
	static void CleanUpChaseScene(void);
	static void SetUpCarsForChaseScene(void);
	static void CleanUpCarsForChaseScene(void);
	static void RemoveCarFromChase(int32);
	static CVehicle* TurnChaseCarIntoScriptCar(int32);

};

struct tGameBuffer
{
	float m_fTimeStep;
	uint32 m_nTimeInMilliseconds;
	uint8 m_nSizeOfPads[2];
	uint16 m_nChecksum;
	uint8 m_ControllerBuffer[116];
};

class CRecordDataForGame
{
	enum {
		STATE_NONE = 0,
		STATE_RECORD = 1,
		STATE_PLAYBACK = 2,
	};
	static uint16& RecordingState;
	static uint8* &pDataBuffer;
	static uint8* &pDataBufferPointer;
	static int &FId;
	static tGameBuffer &pDataBufferForFrame;

public:
	static bool IsRecording() { return RecordingState == STATE_RECORD; }
	static bool IsPlayingBack() { return RecordingState == STATE_PLAYBACK; }

	static void SaveOrRetrieveDataForThisFrame(void);
	static void Init(void);

private:
	static uint16 CalcGameChecksum(void);
	static uint8* PackCurrentPadValues(uint8*, CControllerState*, CControllerState*);
	static uint8* UnPackCurrentPadValues(uint8*, uint8, CControllerState*);
};