aboutsummaryrefslogtreecommitdiff
path: root/sky/control.h
blob: 3a6508a9c868d10c4e17b4ada9cc0f821de372a4 (plain)
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
/* ScummVM - Scumm Interpreter
 * Copyright (C) 2003 The ScummVM project
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.

 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.

 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 *
 * $Header$
 *
 */

#ifndef CONTROL_H
#define CONTROL_H

#include "common/stdafx.h"
#include "common/scummsys.h"
#include "sky/struc.h"
#include "common/engine.h"
#include "sky/screen.h"
#include "sky/disk.h"
#include "sky/mouse.h"
#include "sky/logic.h"

class SkyScreen;
class SkyLogic;
class SkyMouse;

#define MAX_SAVE_GAMES 999
#define MAX_TEXT_LEN 80
#define PAN_LINE_WIDTH 184
#define PAN_CHAR_HEIGHT 12
#define STATUS_WIDTH 146
#define MPNL_X 60  // Main Panel
#define MPNL_Y 10

#define SPNL_X 20  // Save Panel
#define SPNL_Y 20
#define SP_HEIGHT 149
#define SP_TOP_GAP 12
#define SP_BOT_GAP 27
#define CROSS_SZ_X 27
#define CROSS_SZ_Y 22

#define TEXT_FLAG_MASK (SF_ALLOW_SPEECH | SF_ALLOW_TEXT)

#define GAME_NAME_X (SPNL_X + 18)				// x coordinate of game names
#define GAME_NAME_Y (SPNL_Y + SP_TOP_GAP)		// start y coord of game names
#define MAX_ON_SCREEN ((SP_HEIGHT - SP_TOP_GAP - SP_BOT_GAP) / PAN_CHAR_HEIGHT) // no of save games on screen
#define CP_PANEL 60400 // main panel sprite

#define MAINPANEL 0
#define SAVEPANEL 1

#define NO_MASK false
#define WITH_MASK true

// resource's onClick routines
#define DO_NOTHING		0
#define REST_GAME_PANEL	1
#define SAVE_GAME_PANEL	2
#define SAVE_A_GAME		3
#define RESTORE_A_GAME	4
#define SP_CANCEL		5
#define SHIFT_DOWN_FAST	6
#define SHIFT_DOWN_SLOW	7
#define SHIFT_UP_FAST	8
#define SHIFT_UP_SLOW	9
#define SPEED_SLIDE		10
#define MUSIC_SLIDE		11
#define TOGGLE_FX		12
#define TOGGLE_MS		13
#define TOGGLE_TEXT		14
#define EXIT			15
#define RESTART			16
#define QUIT_TO_DOS		17
#define RESTORE_AUTO	18

// onClick return codes
#define CANCEL_PRESSED	100
#define NAME_TOO_SHORT	101
#define GAME_SAVED		102
#define SHIFTED			103
#define TOGGLED			104
#define RESTARTED		105
#define GAME_RESTORED	106
#define RESTORE_FAILED	107
#define NO_DISK_SPACE	108
#define SPEED_CHANGED	109
#define QUIT_PANEL		110

#define SLOW 0
#define FAST 1

#define SPEED_MULTIPLY 8

//-
#define SAVE_EXT	 1
#define SAVE_MEGA0	 2
#define SAVE_MEGA1	 4
#define SAVE_MEGA2	 8
#define SAVE_MEGA3	16
#define SAVE_GRAFX	32
#define SAVE_TURNP	64

#define SAVE_FILE_REVISION 5
// skipping revision 4, that one will be used for messy downward compatibility in 0.5.0 branch
#define OLD_SAVEGAME_TYPE 4

struct AllocedMem {
	uint16 *mem;
	AllocedMem *next;
};

class SkyConResource {
public:
	SkyConResource(void *pSpData, uint32 pNSprites, uint32 pCurSprite, uint16 pX, uint16 pY, uint32 pText, uint8 pOnClick, OSystem *system, uint8 *screen);
	virtual ~SkyConResource(void) {};
	void setSprite(void *pSpData) { _spriteData = (dataFileHeader*)pSpData; };
	void setText(uint32 pText) { if (pText) _text = pText + 0x7000; else _text = 0; };
	void setXY(uint16 x, uint16 y) { _x = x; _y = y; };
	bool isMouseOver(uint32 mouseX, uint32 mouseY);
	virtual void drawToScreen(bool doMask);

	dataFileHeader *_spriteData;
	uint32 _numSprites, _curSprite;
	uint16 _x, _y;
	uint32 _text;
	uint8 _onClick;
	OSystem *_system;
	uint8 *_screen;
private:
};

class SkyTextResource : public SkyConResource {
public:
	SkyTextResource(void *pSpData, uint32 pNSprites, uint32 pCurSprite, uint16 pX, uint16 pY, uint32 pText, uint8 pOnClick, OSystem *system, uint8 *screen);
	virtual ~SkyTextResource(void);
	virtual void drawToScreen(bool doMask);
	void flushForRedraw(void);
private:
	uint16 _oldX, _oldY;
	uint8 *_oldScreen;
};

class SkyControlStatus {
public:
	SkyControlStatus(SkyText *skyText, OSystem *system, uint8 *scrBuf);
	~SkyControlStatus(void);
	void setToText(const char *newText);
	void setToText(uint16 textNum);
	void drawToScreen(void);
private:
	SkyTextResource *_statusText;
	dataFileHeader *_textData;
	SkyText *_skyText;
	OSystem *_system;
	uint8 *_screenBuf;
};

class SkyControl {
public:
	SkyControl(SkyScreen *screen, SkyDisk *disk, SkyMouse *mouse, SkyText *text, SkyMusicBase *music, SkyLogic *logic, SkySound *sound, OSystem *system, const char *savePath);
	void doControlPanel(void);
	void doLoadSavePanel(void);
	void restartGame(void);
	void showGameQuitMsg(bool useScreen = true);
	void doAutoSave(void);
	uint16 quickXRestore(uint16 slot);
	bool loadSaveAllowed(void);
    
private:
	void initPanel(void);
	void removePanel(void);

	void drawMainPanel(void);

	void delay(unsigned int amount);
	
    void animClick(SkyConResource *pButton);
	bool getYesNo(char *text);
	void buttonControl(SkyConResource *pButton);
	uint16 handleClick(SkyConResource *pButton);
	uint16 doMusicSlide(void);
	uint16 doSpeedSlide(void);
	uint16 toggleFx(SkyConResource *pButton);
	uint16 toggleText(void);
	void toggleMusic(void);
	uint16 shiftDown(uint8 speed);
	uint16 shiftUp(uint8 speed);
	void drawTextCross(uint32 flags);
	void drawCross(uint16 x, uint16 y);

	uint16 saveRestorePanel(bool allowSave);
	void loadDescriptions(uint8 *destBuf);
	void saveDescriptions(uint8 *srcBuf);
	void setUpGameSprites(uint8 *nameBuf, dataFileHeader **nameSprites, uint16 firstNum, uint16 selectedGame);
	void showSprites(dataFileHeader **nameSprites, bool allowSave);
	bool checkKeyList(uint8 key);
	void handleKeyPress(uint8 key, uint8 *textBuf);

	uint16 _selectedGame;
	uint16 saveGameToFile(void);
	void stosMegaSet(uint8 **destPos, MegaSet *mega);
	void stosCompact(uint8 **destPos, Compact *cpt);
	void stosStr(uint8 **destPos, Compact *cpt, uint16 type);
	uint32 prepareSaveData(uint8 *destBuf);

	bool autoSaveExists(void);
	uint16 restoreGameFromFile(bool autoSave);
	void lodsMegaSet(uint8 **srcPos, MegaSet *mega);
	void lodsCompact(uint8 **srcPos, Compact *cpt);
	void lodsStr(uint8 **srcPos, uint16 *src);
	uint16 parseSaveData(uint8 *srcBuf);

	const char *_savePath;
	uint16 *lz77decode(uint16 *data);
	void applyDiff(uint16 *data, uint16 *diffData, uint16 len);
	static Compact *_saveLoadCpts[833]; //-----------------
	static uint16 *_saveLoadARs[19];
	static uint8 _resetData288[0x39B8];
	static uint8 _resetDiff303[824];    // moved to sky/compacts/savedata.cpp
	static uint8 _resetDiff331[824];
	static uint8 _resetDiff348[824];
	static uint8 _resetDiffCd[856];  //-----------------

	AllocedMem *_memListRoot;
	void appendMemList(uint16 *pMem);
	void freeMemList(void);

	SkyScreen *_skyScreen;
	SkyDisk *_skyDisk;
	SkyMouse *_skyMouse;
	SkyText *_skyText;
	SkyMusicBase *_skyMusic;
	SkyLogic *_skyLogic;
	SkySound *_skySound;
	OSystem *_system;
	int _mouseX, _mouseY;
	bool _mouseClicked;
	byte _keyPressed;

	struct {
		uint8 *controlPanel;
		uint8 *button;
		uint8 *buttonDown;
		uint8 *savePanel;
		uint8 *yesNo;
		uint8 *slide;
		uint8 *slode;
		uint8 *slode2;
		uint8 *slide2;
		uint8 *musicBodge;
	} _sprites;

	uint8 *_screenBuf;
	int _lastButton;
	uint32 _curButtonText;
	uint16 _firstText;
	uint16 _savedMouse;
	uint32 _savedCharSet;
	uint16 _enteredTextWidth;
    
	SkyConResource *createResource(void *pSpData, uint32 pNSprites, uint32 pCurSprite, int16 pX, int16 pY, uint32 pText, uint8 pOnClick, uint8 panelType);

	dataFileHeader *_textSprite;
	SkyTextResource *_text;

	SkyConResource *_controlPanel, *_exitButton, *_slide, *_slide2, *_slode;
	SkyConResource *_restorePanButton, *_savePanButton, *_dosPanButton, *_restartPanButton, *_fxPanButton, *_musicPanButton;
	SkyConResource *_bodge, *_yesNo;
	SkyConResource *_controlPanLookList[9];

	//- Save/restore panel
	SkyConResource *_savePanel;
	SkyConResource *_saveButton, *_downFastButton, *_downSlowButton;
	SkyConResource *_upFastButton, *_upSlowButton, *_quitButton, *_restoreButton;
	SkyConResource *_autoSaveButton;

	SkyConResource *_savePanLookList[6], *_restorePanLookList[7];

	SkyControlStatus *_statusBar;

	static char _quitTexts[16][35];
	static uint8 _crossImg[594];
};

#endif // CONTROL_H