Rev 1 | Rev 15 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1 | pmbaty | 1 | #include "brender/brender.h" |
2 | #include "car.h" |
||
3 | #include "dinput.h" |
||
4 | #include "errors.h" |
||
5 | #include "globvars.h" |
||
6 | #include "grafdata.h" |
||
7 | #include "graphics.h" |
||
8 | #include "harness/config.h" |
||
9 | #include "harness/hooks.h" |
||
10 | #include "harness/os.h" |
||
11 | #include "harness/trace.h" |
||
12 | #include "input.h" |
||
13 | #include "loadsave.h" |
||
14 | #include "main.h" |
||
15 | #include "pd/sys.h" |
||
16 | #include "sound.h" |
||
17 | #include "ssdx.h" |
||
18 | #include "utility.h" |
||
19 | #include <errno.h> |
||
20 | #include <stdio.h> |
||
21 | #include <string.h> |
||
22 | #include <sys/stat.h> |
||
23 | #include <time.h> |
||
24 | |||
25 | #include "harness/win95_polyfill.h" |
||
26 | |||
27 | #define GFX_INIT_STRING_32X20X8 "320x200 init string" |
||
28 | #define GFX_INIT_STRING_64X48X8 "640x480 init string" |
||
29 | |||
30 | #define KEYDOWN(var, key) (var[key] & 0x80) |
||
31 | |||
32 | int gExtra_mem; |
||
33 | int gReplay_override; |
||
34 | tGraf_spec gGraf_specs[2] = { |
||
35 | { 8, 1, 0, 320, 200, 0, 0, "32X20X8", GFX_INIT_STRING_32X20X8, 320, 320, 200, NULL }, |
||
36 | { 8, 1, 0, 640, 480, 0, 0, "64X48X8", GFX_INIT_STRING_64X48X8, 640, 480, 480, NULL } |
||
37 | }; |
||
38 | int gASCII_table[128]; |
||
39 | tU32 gKeyboard_bits[8]; |
||
40 | int gASCII_shift_table[128]; |
||
41 | char gNetwork_profile_fname[256]; |
||
42 | tS32 gJoystick_min1y; |
||
43 | tS32 gJoystick_min2y; |
||
44 | tS32 gJoystick_min2x; |
||
45 | tS32 gRaw_joystick2y; |
||
46 | tS32 gRaw_joystick2x; |
||
47 | tS32 gRaw_joystick1y; |
||
48 | tS32 gRaw_joystick1x; |
||
49 | tS32 gJoystick_range2y; |
||
50 | tS32 gJoystick_range2x; |
||
51 | tS32 gJoystick_range1y; |
||
52 | tS32 gJoystick_range1x; |
||
53 | int gNo_voodoo; |
||
54 | int gSwitched_resolution; |
||
55 | br_pixelmap* gReal_back_screen; |
||
56 | tS32 gJoystick_min1x; |
||
57 | br_pixelmap* gTemp_screen; |
||
58 | int gGfx_initialized; // maybe renamed here |
||
59 | tU32 gUpper_loop_limit; |
||
60 | int gReal_back_screen_locked; |
||
61 | tU32 gScan_code[123]; // was tU8 [123][2] in symbol dump |
||
62 | |||
63 | // Added by dethrace. Windows-specific. Original variable names unknown. |
||
64 | int gWin32_fatal_error_exit_code; |
||
65 | int gWin32_show_fatal_error_message; |
||
66 | char gWin32_fatal_error_message[512]; |
||
67 | int gWin32_action_replay_buffer_allocated; |
||
68 | void* gWin32_action_replay_buffer; |
||
69 | int gWin32_action_replay_buffer_size; |
||
70 | void* gWin32_hwnd; |
||
71 | int gWin32_lbutton_down; |
||
72 | int gWin32_rbutton_down; |
||
73 | PALETTEENTRY_ gWin32_palette[256]; |
||
74 | br_diaghandler gWin32_br_diaghandler; |
||
75 | int gWin32_window_has_focus = 1; |
||
76 | int gNetwork_profile_file_exists = 0; |
||
77 | |||
78 | char* _unittest_last_fatal_error; |
||
79 | |||
80 | int original_main(int pArgc, char** pArgv); |
||
81 | |||
82 | /*static*/ void KeyboardHandler(void); |
||
83 | /*static*/ int KeyDown(tU8 pScan_code); |
||
84 | /*static*/ void KeyTranslation(tU8 pKey_index, tU8 pScan_code_1, tU8 pScan_code_2); |
||
85 | /*static*/ void KeyBegin(void); |
||
86 | /*static*/ void KeyEnd(void); |
||
87 | /*static*/ int KeyDown22(int pKey_index); |
||
88 | static void Win32ReleaseInputDevice(void); |
||
89 | static void Win32PumpMessages(void); |
||
90 | static HARNESS_NORETURN void Win32FatalError(char* pStr_1, char* pStr_2); |
||
91 | static void Win32CreateWindow(void); |
||
92 | static void Win32InitScreen(void); |
||
93 | /*static*/ void Copy8BitTo16BitPixelmap(br_pixelmap* pDst, br_pixelmap* pSrc, br_pixelmap* pPalette); |
||
94 | /*static*/ void SwapBackScreen(void); |
||
95 | /*static*/ void ReallyCopyBackScreen(int pRendering_area_only, int pClear_top_and_bottom); |
||
96 | /*static*/ void CopyBackScreen(int pRendering_area_only); |
||
97 | static void Win32SetPaletteEntries(uint8_t* entries, int pFirst_colour, int pCount); |
||
98 | static void Win32InitInputDevice(void); |
||
99 | static void Win32AllocateActionReplayBuffer(void); |
||
100 | static void Usage(char* pProgpath); |
||
101 | /*static*/ int OurGetChar(void); |
||
102 | /*static*/ int InitJoysticks(void); |
||
103 | /*static*/ tU32 ReadJoystickAxis(int pBit); |
||
104 | static void Win32BRenderWarningFunc(char* msg); |
||
105 | static void Win32BRenderFailureFunc(char* msg); |
||
106 | |||
107 | extern void QuitGame(void); |
||
108 | |||
109 | void KeyboardHandler(void) { |
||
110 | //tU8 scan_code; // Pierre-Marie Baty -- unused variable |
||
111 | //tU8 up; // Pierre-Marie Baty -- unused variable |
||
112 | //static tU8 extended; // Pierre-Marie Baty -- unused variable |
||
113 | LOG_TRACE("()"); |
||
114 | NOT_IMPLEMENTED(); |
||
115 | } |
||
116 | |||
117 | int KeyDown(tU8 pScan_code) { |
||
118 | NOT_IMPLEMENTED(); |
||
119 | } |
||
120 | |||
121 | void KeyTranslation(tU8 pKey_index, tU8 pScan_code_1, tU8 pScan_code_2) { |
||
122 | LOG_TRACE("(%d, %d, %d)", pKey_index, pScan_code_1, pScan_code_2); |
||
123 | NOT_IMPLEMENTED(); |
||
124 | } |
||
125 | |||
126 | void KeyBegin(void) { |
||
127 | gScan_code[KEY_0] = DIK_0; |
||
128 | gScan_code[KEY_1] = DIK_1; |
||
129 | gScan_code[KEY_2] = DIK_2; |
||
130 | gScan_code[KEY_3] = DIK_3; |
||
131 | gScan_code[KEY_4] = DIK_4; |
||
132 | gScan_code[KEY_5] = DIK_5; |
||
133 | gScan_code[KEY_6] = DIK_6; |
||
134 | gScan_code[KEY_7] = DIK_7; |
||
135 | gScan_code[KEY_8] = DIK_8; |
||
136 | gScan_code[KEY_9] = DIK_9; |
||
137 | gScan_code[KEY_A] = DIK_A; |
||
138 | gScan_code[KEY_B] = DIK_B; |
||
139 | gScan_code[KEY_C] = DIK_C; |
||
140 | gScan_code[KEY_D] = DIK_D; |
||
141 | gScan_code[KEY_E] = DIK_E; |
||
142 | gScan_code[KEY_F] = DIK_F; |
||
143 | gScan_code[KEY_G] = DIK_G; |
||
144 | gScan_code[KEY_H] = DIK_H; |
||
145 | gScan_code[KEY_I] = DIK_I; |
||
146 | gScan_code[KEY_J] = DIK_J; |
||
147 | gScan_code[KEY_K] = DIK_K; |
||
148 | gScan_code[KEY_L] = DIK_L; |
||
149 | gScan_code[KEY_M] = DIK_M; |
||
150 | gScan_code[KEY_N] = DIK_N; |
||
151 | gScan_code[KEY_O] = DIK_O; |
||
152 | gScan_code[KEY_P] = DIK_P; |
||
153 | gScan_code[KEY_Q] = DIK_Q; |
||
154 | gScan_code[KEY_R] = DIK_R; |
||
155 | gScan_code[KEY_S] = DIK_S; |
||
156 | gScan_code[KEY_T] = DIK_T; |
||
157 | gScan_code[KEY_U] = DIK_U; |
||
158 | gScan_code[KEY_V] = DIK_V; |
||
159 | gScan_code[KEY_W] = DIK_W; |
||
160 | gScan_code[KEY_X] = DIK_X; |
||
161 | gScan_code[KEY_Y] = DIK_Y; |
||
162 | gScan_code[KEY_Z] = DIK_Z; |
||
163 | gScan_code[KEY_GRAVE] = DIK_GRAVE; |
||
164 | gScan_code[KEY_MINUS] = DIK_MINUS; |
||
165 | gScan_code[KEY_EQUALS] = DIK_EQUALS; |
||
166 | gScan_code[KEY_BACKSPACE] = DIK_BACK; |
||
167 | gScan_code[KEY_RETURN] = DIK_RETURN; |
||
168 | gScan_code[KEY_KP_ENTER] = DIK_NUMPADENTER; |
||
169 | gScan_code[KEY_CAPSLOCK] = DIK_CAPSLOCK; |
||
170 | gScan_code[KEY_TAB] = DIK_TAB; |
||
171 | gScan_code[KEY_SLASH] = DIK_SLASH; |
||
172 | gScan_code[KEY_UNKNOWN_55] = 0; |
||
173 | gScan_code[KEY_SEMICOLON] = DIK_SEMICOLON; |
||
174 | gScan_code[KEY_APOSTROPHE] = DIK_APOSTROPHE; |
||
175 | gScan_code[KEY_PERIOD] = DIK_PERIOD; |
||
176 | gScan_code[KEY_COMMA] = DIK_COMMA; |
||
177 | gScan_code[KEY_LBRACKET] = DIK_LBRACKET; |
||
178 | gScan_code[KEY_RBRACKET] = DIK_RBRACKET; |
||
179 | gScan_code[KEY_ESCAPE] = DIK_ESCAPE; |
||
180 | gScan_code[KEY_INSERT] = DIK_INSERT; |
||
181 | gScan_code[KEY_DELETE] = DIK_DELETE; |
||
182 | gScan_code[KEY_HOME] = DIK_HOME; |
||
183 | gScan_code[KEY_END] = DIK_END; |
||
184 | gScan_code[KEY_PAGEUP] = DIK_PGUP; |
||
185 | gScan_code[KEY_PAGEDOWN] = DIK_PGDN; |
||
186 | gScan_code[KEY_LEFT] = DIK_LEFT; |
||
187 | gScan_code[KEY_RIGHT] = DIK_RIGHT; |
||
188 | gScan_code[KEY_UP] = DIK_UP; |
||
189 | gScan_code[KEY_DOWN] = DIK_DOWN; |
||
190 | gScan_code[KEY_KP_NUMLOCK] = DIK_NUMLOCK; |
||
191 | gScan_code[KEY_KP_DIVIDE] = DIK_DIVIDE; |
||
192 | gScan_code[KEY_KP_MULTIPLY] = DIK_MULTIPLY; |
||
193 | gScan_code[KEY_KP_MINUS] = DIK_SUBTRACT; |
||
194 | gScan_code[KEY_KP_PLUS] = DIK_ADD; |
||
195 | gScan_code[KEY_KP_PERIOD] = DIK_DECIMAL; |
||
196 | gScan_code[KEY_KP_0] = DIK_NUMPAD0; |
||
197 | gScan_code[KEY_KP_1] = DIK_NUMPAD1; |
||
198 | gScan_code[KEY_KP_2] = DIK_NUMPAD2; |
||
199 | gScan_code[KEY_KP_3] = DIK_NUMPAD3; |
||
200 | gScan_code[KEY_KP_4] = DIK_NUMPAD4; |
||
201 | gScan_code[KEY_KP_5] = DIK_NUMPAD5; |
||
202 | gScan_code[KEY_KP_6] = DIK_NUMPAD6; |
||
203 | gScan_code[KEY_KP_7] = DIK_NUMPAD7; |
||
204 | gScan_code[KEY_KP_8] = DIK_NUMPAD8; |
||
205 | gScan_code[KEY_KP_9] = DIK_NUMPAD9; |
||
206 | gScan_code[KEY_F1] = DIK_F1; |
||
207 | gScan_code[KEY_F2] = DIK_F2; |
||
208 | gScan_code[KEY_F3] = DIK_F3; |
||
209 | gScan_code[KEY_F4] = DIK_F4; |
||
210 | gScan_code[KEY_F5] = DIK_F5; |
||
211 | gScan_code[KEY_F6] = DIK_F6; |
||
212 | gScan_code[KEY_F7] = DIK_F7; |
||
213 | gScan_code[KEY_F8] = DIK_F8; |
||
214 | gScan_code[KEY_F9] = DIK_F9; |
||
215 | gScan_code[KEY_F10] = DIK_F10; |
||
216 | gScan_code[KEY_F11] = DIK_F11; |
||
217 | gScan_code[KEY_F12] = DIK_F12; |
||
218 | gScan_code[KEY_PRTSCN] = DIK_SYSRQ; |
||
219 | gScan_code[KEY_SCRLK] = DIK_SCROLL; |
||
220 | gScan_code[KEY_SPACE] = DIK_SPACE; |
||
221 | gScan_code[KEY_RSHIFT] = DIK_RSHIFT; |
||
222 | gScan_code[KEY_RALT] = DIK_RALT; |
||
223 | gScan_code[KEY_RCTRL] = DIK_RCONTROL; |
||
224 | gScan_code[KEY_LSHIFT] = DIK_LSHIFT; |
||
225 | gScan_code[KEY_LALT] = DIK_LALT; |
||
226 | gScan_code[KEY_LCTRL] = DIK_LCONTROL; |
||
227 | gScan_code[KEY_KP_EQUALS] = 0; |
||
228 | gScan_code[KEY_BACKSLASH] = DIK_BACKSLASH; |
||
229 | gScan_code[KEY_CTRL_ANY_2] = 0xff; |
||
230 | gScan_code[KEY_PAUSE] = 0xff; |
||
231 | gScan_code[KEY_SHIFT_ANY] = 0xff; |
||
232 | gScan_code[KEY_ALT_ANY] = 0xff; |
||
233 | gScan_code[KEY_CTRL_ANY] = 0xff; |
||
234 | } |
||
235 | |||
236 | void KeyEnd(void) { |
||
237 | LOG_TRACE("()"); |
||
238 | NOT_IMPLEMENTED(); |
||
239 | } |
||
240 | |||
241 | int KeyDown22(int pKey_index) { |
||
242 | LOG_TRACE("(%d)", pKey_index); |
||
243 | NOT_IMPLEMENTED(); |
||
244 | } |
||
245 | |||
246 | void PDSetKeyArray(int* pKeys, int pMark) { |
||
247 | int i; |
||
248 | uint8_t keystate[256]; |
||
249 | LOG_TRACE10("(%p, %d)", pKeys, pMark); |
||
250 | |||
251 | gKeys_pressed = 0; |
||
252 | Win32PumpMessages(); |
||
253 | DirectInputDevice_GetDeviceState(COUNT_OF(keystate), keystate); |
||
254 | |||
255 | for (i = 0; i < COUNT_OF(gScan_code); i++) { |
||
256 | if (gScan_code[i] == 0) { |
||
257 | continue; |
||
258 | } |
||
259 | if (gScan_code[i] == 0xff) { |
||
260 | switch (i) { |
||
261 | case KEY_SHIFT_ANY: |
||
262 | if (KEYDOWN(keystate, gScan_code[KEY_LSHIFT]) || KEYDOWN(keystate, gScan_code[KEY_RSHIFT])) { |
||
263 | pKeys[KEY_SHIFT_ANY] = pMark; |
||
264 | } else { |
||
265 | if (pKeys[KEY_SHIFT_ANY] == pMark) { |
||
266 | pKeys[KEY_SHIFT_ANY] = 0; |
||
267 | } |
||
268 | } |
||
269 | break; |
||
270 | case KEY_ALT_ANY: |
||
271 | if (KEYDOWN(keystate, gScan_code[KEY_LALT]) || KEYDOWN(keystate, gScan_code[KEY_RALT])) { |
||
272 | pKeys[KEY_ALT_ANY] = pMark; |
||
273 | } else { |
||
274 | if (pKeys[KEY_ALT_ANY] == pMark) { |
||
275 | pKeys[KEY_ALT_ANY] = 0; |
||
276 | } |
||
277 | } |
||
278 | break; |
||
279 | case KEY_CTRL_ANY: |
||
280 | case KEY_CTRL_ANY_2: |
||
281 | if (KEYDOWN(keystate, gScan_code[KEY_LCTRL]) || KEYDOWN(keystate, gScan_code[KEY_RCTRL])) { |
||
282 | pKeys[KEY_CTRL_ANY] = pMark; |
||
283 | pKeys[KEY_CTRL_ANY_2] = pMark; |
||
284 | } else { |
||
285 | if (pKeys[KEY_CTRL_ANY] == pMark || pKeys[KEY_CTRL_ANY_2] == pMark) { |
||
286 | pKeys[KEY_CTRL_ANY] = 0; |
||
287 | pKeys[KEY_CTRL_ANY_2] = 0; |
||
288 | } |
||
289 | } |
||
290 | break; |
||
291 | default: |
||
292 | continue; |
||
293 | } |
||
294 | } else if (KEYDOWN(keystate, gScan_code[i])) { |
||
295 | pKeys[i] = pMark; |
||
296 | gKeys_pressed = i + (gKeys_pressed << 8) + 1; |
||
297 | } else { |
||
298 | if (pKeys[i] == pMark) { |
||
299 | pKeys[i] = 0; |
||
300 | } |
||
301 | } |
||
302 | } |
||
303 | } |
||
304 | |||
305 | void Win32ReleaseInputDevice(void) { |
||
306 | } |
||
307 | |||
308 | int PDGetASCIIFromKey(int pKey) { |
||
309 | LOG_TRACE("(%d)", pKey); |
||
310 | |||
311 | /* The Windows Carmageddon executable uses PDKeyDown here. The German DOS executable uses PDKeyDown3. */ |
||
312 | if (PDKeyDown3(KEY_SHIFT_ANY)) { |
||
313 | return gASCII_shift_table[pKey]; |
||
314 | } else { |
||
315 | return gASCII_table[pKey]; |
||
316 | } |
||
317 | } |
||
318 | |||
319 | void Win32PumpMessages(void) { |
||
320 | MSG_ msg; // [esp+Ch] [ebp-20h] BYREF |
||
321 | |||
322 | PDUnlockRealBackScreen(); |
||
323 | while ((!gWin32_window_has_focus || PeekMessageA_(&msg, 0, 0, 0, 1u)) && (gWin32_window_has_focus || GetMessageA_(&msg, 0, 0, 0) != -1)) { |
||
324 | if (msg.message == WM_QUIT) { |
||
325 | dr_dprintf("WM_QUIT received."); |
||
326 | if (gWin32_window_has_focus) { |
||
327 | dr_dprintf("Active, so lock the surface"); |
||
328 | PDLockRealBackScreen(); |
||
329 | dr_dprintf("QuitGame being called..."); |
||
330 | QuitGame(); |
||
331 | } |
||
332 | PDShutdownSystem(); |
||
333 | } |
||
334 | TranslateMessage_(&msg); |
||
335 | DispatchMessageA_(&msg); |
||
336 | } |
||
337 | PDLockRealBackScreen(); |
||
338 | } |
||
339 | |||
340 | void PDFatalError(char* pThe_str) { |
||
341 | LOG_TRACE("(\"%s\")", pThe_str); |
||
342 | |||
343 | dr_dprintf("FATAL ERROR: %s", pThe_str); |
||
344 | Win32FatalError(pThe_str, ""); |
||
345 | } |
||
346 | |||
347 | void Win32FatalError(char* pStr_1, char* pStr_2) { |
||
348 | gWin32_show_fatal_error_message = 1; |
||
349 | sprintf(gWin32_fatal_error_message, "%s\n%s", pStr_1, pStr_2); |
||
350 | gWin32_fatal_error_exit_code = 15; |
||
351 | PDShutdownSystem(); |
||
352 | } |
||
353 | |||
354 | void PDNonFatalError(char* pThe_str) { |
||
355 | LOG_TRACE("(\"%s\")", pThe_str); |
||
356 | NOT_IMPLEMENTED(); |
||
357 | } |
||
358 | |||
359 | void PDInitialiseSystem(void) { |
||
360 | tPath_name the_path; |
||
361 | FILE* f; |
||
362 | int len; |
||
363 | |||
364 | Win32AllocateActionReplayBuffer(); |
||
365 | gBack_screen = NULL; |
||
366 | gScreen = NULL; |
||
367 | Win32CreateWindow(); |
||
368 | ShowCursor_(0); |
||
369 | KeyBegin(); |
||
370 | |||
371 | PathCat(the_path, gApplication_path, "KEYBOARD.COK"); |
||
372 | f = fopen(the_path, "rb"); |
||
373 | if (f == NULL) { |
||
374 | if (harness_game_info.defines.requires_ascii_table) { |
||
375 | #if !defined(DETHRACE_FIX_BUGS) |
||
376 | PDFatalError("This .exe must have KEYBOARD.COK in the DATA folder."); |
||
377 | #endif |
||
378 | } |
||
379 | // dethrace: demos do not ship with KEYBOARD.COK file |
||
380 | memcpy(gASCII_table, harness_game_info.defines.ascii_table, sizeof(gASCII_table)); |
||
381 | memcpy(gASCII_shift_table, harness_game_info.defines.ascii_shift_table, sizeof(gASCII_shift_table)); |
||
382 | } else { |
||
383 | PathCat(the_path, gApplication_path, "KEYBOARD.COK"); |
||
384 | f = fopen(the_path, "rb"); |
||
385 | if (f == NULL) { |
||
386 | PDFatalError("This .exe must have KEYBOARD.COK in the DATA folder."); |
||
387 | } |
||
388 | fseek(f, 0, 2); |
||
389 | len = ftell(f) / 2; |
||
390 | rewind(f); |
||
391 | fread(gASCII_table, len, 1u, f); |
||
392 | fread(gASCII_shift_table, len, 1u, f); |
||
393 | fclose(f); |
||
394 | } |
||
395 | Win32InitInputDevice(); |
||
396 | } |
||
397 | |||
398 | void Win32CreateWindow(void) { |
||
399 | // wnd_class.style = 3; |
||
400 | // wnd_class.lpfnWndProc = window_proc; |
||
401 | // wnd_class.cbClsExtra = 0; |
||
402 | // wnd_class.cbWndExtra = 0; |
||
403 | // wnd_class.hInstance = gWin32_hinst; |
||
404 | // wnd_class.hIcon = LoadIconA(0, (LPCSTR)0x7F00); |
||
405 | // wnd_class.hCursor = LoadCursorA(0, (LPCSTR)0x7F00); |
||
406 | // wnd_class.hbrBackground = (HBRUSH)GetStockObject(4); |
||
407 | // wnd_class.lpszMenuName = 0; |
||
408 | // wnd_class.lpszClassName = "CarmageddonClass"; |
||
409 | // LOWORD(v5) = RegisterClassA(&wnd_class); |
||
410 | // v5 = (unsigned __int16)v5; |
||
411 | // v2 = gWin32_hinst; |
||
412 | |||
413 | // int height = GetSystemMetrics(SM_CYSCREEN); |
||
414 | // int width = GetSystemMetrics(SM_CXSCREEN); |
||
415 | |||
416 | int width = gGraf_specs[gGraf_spec_index].total_width; |
||
417 | int height = gGraf_specs[gGraf_spec_index].total_height; |
||
418 | // WS_VISIBLE | WS_POPUP |
||
419 | gWin32_hwnd = CreateWindowExA_(0, "CarmageddonClass", "Carmageddon", 0x90000000, 0, 0, width, height, 0, NULL, NULL, NULL); |
||
420 | SSDXGetWindowRect(gWin32_hwnd); |
||
421 | // hdc = GetDC(gWin32_hwnd); |
||
422 | // GetSystemPaletteEntries(hdc, 0, 256u, &gWin32_palette); |
||
423 | // ReleaseDC(gWin32_hwnd, hdc); |
||
424 | // UpdateWindow(gWin32_hwnd); |
||
425 | // SetFocus(gWin32_hwnd); |
||
426 | } |
||
427 | |||
428 | void PDShutdownSystem(void) { |
||
429 | static int been_here = 0; |
||
430 | LOG_TRACE("()"); |
||
431 | |||
432 | if (!been_here) { |
||
433 | been_here = 1; |
||
434 | dr_dprintf("PDShutdownSystem()..."); |
||
435 | SSDXRelease(); |
||
436 | Win32ReleaseInputDevice(); |
||
437 | ShowCursor_(1); |
||
438 | if (gWin32_hwnd) { |
||
439 | dr_dprintf("Resizing main window..."); |
||
440 | SetWindowPos_(gWin32_hwnd, 0, -100, -100, 64, 64, 0x414u); |
||
441 | } |
||
442 | dr_dprintf("Servicing messages..."); |
||
443 | Win32PumpMessages(); |
||
444 | dr_dprintf("Sending WM_SHOWWINDOW broadcast message..."); |
||
445 | SendMessageA_(HWND_BROADCAST, 0x18u, 1u, 0); |
||
446 | if (gWin32_show_fatal_error_message) { |
||
447 | dr_dprintf("Displaying fatal error..."); |
||
448 | MessageBoxA_(0, gWin32_fatal_error_message, "Carmageddon Fatal Error", MB_ICONERROR); |
||
449 | } |
||
450 | if (gWin32_hwnd) { |
||
451 | dr_dprintf("Destroying window..."); |
||
452 | DestroyWindow_(gWin32_hwnd); |
||
453 | gWin32_hwnd = 0; |
||
454 | } |
||
455 | dr_dprintf("End of PDShutdownSystem()."); |
||
456 | CloseDiagnostics(); |
||
457 | ExitProcess_(gWin32_fatal_error_exit_code); |
||
458 | } |
||
459 | ExitProcess_(8u); |
||
460 | } |
||
461 | |||
462 | void PDSaveOriginalPalette(void) { |
||
463 | LOG_TRACE("()"); |
||
464 | NOT_IMPLEMENTED(); |
||
465 | } |
||
466 | |||
467 | void PDRevertPalette(void) { |
||
468 | LOG_TRACE("()"); |
||
469 | |||
470 | // empty function |
||
471 | } |
||
472 | |||
473 | int PDInitScreenVars(int pArgc, char** pArgv) { |
||
474 | // this codes from dossys |
||
475 | gGraf_specs[gGraf_spec_index].phys_width = gGraf_specs[gGraf_spec_index].total_width; |
||
476 | gGraf_specs[gGraf_spec_index].phys_height = gGraf_specs[gGraf_spec_index].total_height; |
||
477 | return 1; |
||
478 | } |
||
479 | |||
480 | void PDInitScreen(void) { |
||
481 | Win32InitScreen(); |
||
482 | } |
||
483 | |||
484 | void Win32InitScreen(void) { |
||
485 | // SWP_NOSENDCHANGING | SWP_NOACTIVATE | SWP_NOZORDER |
||
486 | SetWindowPos_(gWin32_hwnd, 0, 0, 0, gGraf_specs[gReal_graf_data_index].total_width, gGraf_specs[gReal_graf_data_index].total_height, 0x414u); |
||
487 | // get_window_rect(gWin32_hwnd); |
||
488 | Win32PumpMessages(); |
||
489 | } |
||
490 | |||
491 | void PDLockRealBackScreen(void) { |
||
492 | LOG_TRACE("()"); |
||
493 | |||
494 | // no-op |
||
495 | } |
||
496 | |||
497 | void PDUnlockRealBackScreen(void) { |
||
498 | LOG_TRACE("()"); |
||
499 | |||
500 | // no-op |
||
501 | } |
||
502 | |||
503 | void PDAllocateScreenAndBack(void) { |
||
504 | // this is a mix of windows and dos code |
||
505 | |||
506 | dr_dprintf("PDAllocateScreenAndBack() - START..."); |
||
507 | BrMaterialFindHook(PDMissingMaterial); |
||
508 | BrTableFindHook(PDMissingTable); |
||
509 | BrModelFindHook(PDMissingModel); |
||
510 | BrMapFindHook(PDMissingMap); |
||
511 | |||
512 | int row_bytes; |
||
513 | SSDXInitDirectDraw(gGraf_specs[gGraf_spec_index].total_width, gGraf_specs[gGraf_spec_index].total_height, &row_bytes); |
||
514 | gScreen = BrPixelmapAllocate(BR_PMT_INDEX_8, gGraf_specs[gGraf_spec_index].total_width, gGraf_specs[gGraf_spec_index].total_height, NULL, BR_PMAF_NORMAL); |
||
515 | |||
516 | gScreen->origin_x = 0; |
||
517 | gGfx_initialized = 1; |
||
518 | gScreen->origin_y = 0; |
||
519 | gBack_screen = BrPixelmapMatch(gScreen, BR_PMMATCH_OFFSCREEN); |
||
520 | gBack_screen->origin_x = 0; |
||
521 | gBack_screen->origin_y = 0; |
||
522 | gTemp_screen = BrPixelmapMatch(gScreen, BR_PMMATCH_OFFSCREEN); |
||
523 | gTemp_screen->origin_x = 0; |
||
524 | gTemp_screen->origin_y = 0; |
||
525 | dr_dprintf("PDAllocateScreenAndBack() - END."); |
||
526 | |||
527 | // dr_dprintf("PDAllocateScreenAndBack() - START..."); |
||
528 | // BrMaterialFindHook(PDMissingMaterial); |
||
529 | // BrTableFindHook(PDMissingTable); |
||
530 | // BrModelFindHook(PDMissingModel); |
||
531 | // BrMapFindHook(PDMissingMap); |
||
532 | // dr_dprintf("Setting up DirectDraw stuff..."); |
||
533 | // SSDXStart(gWin32_hwnd, 0, 1); |
||
534 | // dr_dprintf("Setting up DirectSound stuff..."); |
||
535 | // int result = SSDXStart(gWin32_hwnd, 0, 2); |
||
536 | // int row_bytes; |
||
537 | // if (result == 0) { |
||
538 | // result = SSDXInitDirectDraw(gGraf_specs[gGraf_spec_index].total_width, gGraf_specs[gGraf_spec_index].total_height, &row_bytes); |
||
539 | // } |
||
540 | // if (result) { |
||
541 | // SSDXHandleError(result); |
||
542 | // PDFatalError("Unable to setup DirectDraw - please check that DirectX is installed"); |
||
543 | // } |
||
544 | // gGraf_specs[gGraf_spec_index].row_bytes = row_bytes; |
||
545 | // gGraf_specs[gGraf_spec_index].phys_width = gGraf_specs[gGraf_spec_index].row_bytes; |
||
546 | // gGraf_specs[gGraf_spec_index].phys_height = gGraf_specs[gGraf_spec_index].total_height; |
||
547 | // dr_dprintf( |
||
548 | // "Graf spec info after screen allocation:\n" |
||
549 | // " Total width: %d\n" |
||
550 | // " Total height: %d\n" |
||
551 | // " Phys width: %d\n" |
||
552 | // " Phys height: %d\n" |
||
553 | // " Row bytes: %d\n", |
||
554 | // gGraf_specs[gGraf_spec_index].total_width, |
||
555 | // gGraf_specs[gGraf_spec_index].total_height, |
||
556 | // gGraf_specs[gGraf_spec_index].phys_width, |
||
557 | // gGraf_specs[gGraf_spec_index].phys_height, |
||
558 | // gGraf_specs[gGraf_spec_index].row_bytes); |
||
559 | // dr_dprintf("First attempt at locking surface..."); |
||
560 | // PDLockRealBackScreen(); |
||
561 | // dr_dprintf("Done first surface lock; gOffscreen_pixels 0x%p", gOffscreen_pixels); |
||
562 | // gBack_screen = BrPixelmapAllocate( |
||
563 | // 3u, |
||
564 | // gGraf_specs[gGraf_spec_index].phys_width, |
||
565 | // gGraf_specs[gGraf_spec_index].phys_height, |
||
566 | // gOffscreen_pixels, |
||
567 | // 0); |
||
568 | // gScreen = gBack_screen; |
||
569 | // gBack_screen->origin_x = 0; |
||
570 | // gBack_screen->origin_y = 0; |
||
571 | // gBack_screen->base_x = 0; |
||
572 | // gBack_screen->base_y = 0; |
||
573 | // gBack_screen->row_bytes = gGraf_specs[gGraf_spec_index].row_bytes; |
||
574 | // gTemp_screen = (br_pixelmap*)BrPixelmapMatch(gBack_screen, 0); |
||
575 | // gGfx_initialized = 1; |
||
576 | // memset(gBack_screen->pixels, 0, gBack_screen->row_bytes * gBack_screen->height); |
||
577 | // PDScreenBufferSwap(0); |
||
578 | // dr_dprintf("PDAllocateScreenAndBack() - END."); |
||
579 | } |
||
580 | |||
581 | void Copy8BitTo16BitPixelmap(br_pixelmap* pDst, br_pixelmap* pSrc, br_pixelmap* pPalette) { |
||
582 | //int x; // Pierre-Marie Baty -- unused variable |
||
583 | //int y; // Pierre-Marie Baty -- unused variable |
||
584 | //tU8* src; // Pierre-Marie Baty -- unused variable |
||
585 | //tU8 value; // Pierre-Marie Baty -- unused variable |
||
586 | //tU8 red; // Pierre-Marie Baty -- unused variable |
||
587 | //tU8 green; // Pierre-Marie Baty -- unused variable |
||
588 | //tU8 blue; // Pierre-Marie Baty -- unused variable |
||
589 | //tU16* dst; // Pierre-Marie Baty -- unused variable |
||
590 | //tU16* palette_entry; // Pierre-Marie Baty -- unused variable |
||
591 | LOG_TRACE("(%p, %p, %p)", pDst, pSrc, pPalette); |
||
592 | NOT_IMPLEMENTED(); |
||
593 | } |
||
594 | |||
595 | void Double8BitTo16BitPixelmap(br_pixelmap* pDst, br_pixelmap* pSrc, br_pixelmap* pPalette, tU16 pOff, tU16 pSrc_width, tU16 pSrc_height) { |
||
596 | //int x; // Pierre-Marie Baty -- unused variable |
||
597 | //int y; // Pierre-Marie Baty -- unused variable |
||
598 | //tU8* src; // Pierre-Marie Baty -- unused variable |
||
599 | //tU8 value; // Pierre-Marie Baty -- unused variable |
||
600 | //tU8 red; // Pierre-Marie Baty -- unused variable |
||
601 | //tU8 green; // Pierre-Marie Baty -- unused variable |
||
602 | //tU8 blue; // Pierre-Marie Baty -- unused variable |
||
603 | //tU16* dst0; // Pierre-Marie Baty -- unused variable |
||
604 | //tU16* dst1; // Pierre-Marie Baty -- unused variable |
||
605 | //tU16 sixteen; // Pierre-Marie Baty -- unused variable |
||
606 | //tU16* palette_entry; // Pierre-Marie Baty -- unused variable |
||
607 | LOG_TRACE("(%p, %p, %p, %d, %d, %d)", pDst, pSrc, pPalette, pOff, pSrc_width, pSrc_height); |
||
608 | NOT_IMPLEMENTED(); |
||
609 | } |
||
610 | |||
611 | br_pixelmap* PDInterfacePixelmap(void) { |
||
612 | LOG_TRACE("()"); |
||
613 | NOT_IMPLEMENTED(); |
||
614 | } |
||
615 | |||
616 | void SwapBackScreen(void) { |
||
617 | LOG_TRACE("()"); |
||
618 | NOT_IMPLEMENTED(); |
||
619 | } |
||
620 | |||
621 | void ReallyCopyBackScreen(int pRendering_area_only, int pClear_top_and_bottom) { |
||
622 | LOG_TRACE("(%d, %d)", pRendering_area_only, pClear_top_and_bottom); |
||
623 | NOT_IMPLEMENTED(); |
||
624 | } |
||
625 | |||
626 | void CopyBackScreen(int pRendering_area_only) { |
||
627 | LOG_TRACE("(%d)", pRendering_area_only); |
||
628 | NOT_IMPLEMENTED(); |
||
629 | } |
||
630 | |||
631 | void PDScreenBufferSwap(int pRendering_area_only) { |
||
632 | // taken from dossys |
||
633 | |||
634 | if (pRendering_area_only) { |
||
635 | BrPixelmapRectangleCopy(gScreen, gY_offset, gX_offset, gRender_screen, 0, 0, gWidth, gHeight); |
||
636 | } else { |
||
637 | if (gReal_graf_data_index == gGraf_data_index) { |
||
638 | BrPixelmapDoubleBuffer(gScreen, gBack_screen); |
||
639 | } else { |
||
640 | DRPixelmapDoubledCopy(gTemp_screen, gBack_screen, 320, 200, 0, 40); |
||
641 | BrPixelmapDoubleBuffer(gScreen, gTemp_screen); |
||
642 | } |
||
643 | } |
||
644 | } |
||
645 | |||
646 | void PDPixelmapToScreenRectangleCopy(br_pixelmap* dst, br_int_16 dx, br_int_16 dy, br_pixelmap* src, br_int_16 sx, br_int_16 sy, br_uint_16 w, br_uint_16 h) { |
||
647 | LOG_TRACE("(%p, %d, %d, %p, %d, %d, %d, %d)", dst, dx, dy, src, sx, sy, w, h); |
||
648 | NOT_IMPLEMENTED(); |
||
649 | } |
||
650 | |||
651 | void PDPixelmapHLineOnScreen(br_pixelmap* dst, br_int_16 x1, br_int_16 y1, br_int_16 x2, br_int_16 y2, br_uint_32 colour) { |
||
652 | LOG_TRACE("(%p, %d, %d, %d, %d, %d)", dst, x1, y1, x2, y2, colour); |
||
653 | NOT_IMPLEMENTED(); |
||
654 | } |
||
655 | |||
656 | void PDPixelmapVLineOnScreen(br_pixelmap* dst, br_int_16 x1, br_int_16 y1, br_int_16 x2, br_int_16 y2, br_uint_32 colour) { |
||
657 | LOG_TRACE("(%p, %d, %d, %d, %d, %d)", dst, x1, y1, x2, y2, colour); |
||
658 | NOT_IMPLEMENTED(); |
||
659 | } |
||
660 | |||
661 | void PDInstallErrorHandlers(void) { |
||
662 | LOG_TRACE("()"); |
||
663 | |||
664 | gWin32_br_diaghandler.identifier = "LlantisilioBlahBlahBlahOgOgOch"; |
||
665 | gWin32_br_diaghandler.warning = Win32BRenderWarningFunc; |
||
666 | gWin32_br_diaghandler.failure = Win32BRenderFailureFunc; |
||
667 | BrDiagHandlerSet(&gWin32_br_diaghandler); |
||
668 | } |
||
669 | |||
670 | void PDSetFileVariables(void) { |
||
671 | |||
672 | // Changed by dethrace for cross-platform |
||
673 | // strcpy(gDir_separator, "\\"); |
||
674 | strcpy(gDir_separator, "/"); |
||
675 | } |
||
676 | |||
677 | void PDBuildAppPath(char* pThe_path) { |
||
678 | GetCurrentDirectoryA_(253, pThe_path); |
||
679 | // GetShortPathNameA(pThe_path, pThe_path, 253); |
||
680 | strcat(pThe_path, "/"); // original: strcat(pThe_path, "\\") |
||
681 | dr_dprintf("Application path '%s'", pThe_path); |
||
682 | } |
||
683 | |||
684 | void PDForEveryFile(char* pThe_path, void (*pAction_routine)(char*)) { |
||
685 | char found_path[256]; // [esp+Ch] [ebp-448h] BYREF |
||
686 | WIN32_FIND_DATAA_ find_data; // [esp+10Ch] [ebp-348h] BYREF |
||
687 | HANDLE_ hFindFile; // [esp+24Ch] [ebp-208h] |
||
688 | char file_filter[256]; // [esp+250h] [ebp-204h] BYREF |
||
689 | char current_dir[260]; // [esp+350h] [ebp-104h] BYREF |
||
690 | |||
691 | GetCurrentDirectoryA_(sizeof(current_dir), current_dir); |
||
692 | if (SetCurrentDirectoryA_(pThe_path)) { |
||
693 | strcpy(file_filter, "*.???"); |
||
694 | hFindFile = FindFirstFileA_(file_filter, &find_data); |
||
695 | if (hFindFile != INVALID_HANDLE_VALUE) { |
||
696 | do { |
||
697 | PathCat(found_path, pThe_path, find_data.cFileName); |
||
698 | pAction_routine(found_path); |
||
699 | } while (FindNextFileA_(hFindFile, &find_data)); |
||
700 | FindClose_(hFindFile); |
||
701 | } |
||
702 | SetCurrentDirectoryA_(current_dir); |
||
703 | } |
||
704 | } |
||
705 | |||
706 | void PDSetPalette(br_pixelmap* pThe_palette) { |
||
707 | PDSetPaletteEntries(pThe_palette, 0, 256); |
||
708 | } |
||
709 | |||
710 | void Win32SetPaletteEntries(uint8_t* entries, int pFirst_colour, int pCount) { |
||
711 | int i; // [esp+Ch] [ebp-Ch] |
||
712 | int last_colour; // [esp+14h] [ebp-4h] |
||
713 | |||
714 | last_colour = pFirst_colour + pCount - 1; |
||
715 | if (last_colour > 255) { |
||
716 | last_colour = 255; |
||
717 | } |
||
718 | for (i = pFirst_colour; i <= last_colour; i++) { |
||
719 | gWin32_palette[i].peFlags = 0; |
||
720 | gWin32_palette[i].peRed = entries[i * 4 + 2]; |
||
721 | gWin32_palette[i].peGreen = entries[i * 4 + 1]; |
||
722 | gWin32_palette[i].peBlue = entries[i * 4]; |
||
723 | } |
||
724 | SSDXSetPaleeteEntries(gWin32_palette, 0, 256); |
||
725 | } |
||
726 | |||
727 | void PDSetPaletteEntries(br_pixelmap* pPalette, int pFirst_colour, int pCount) { |
||
728 | Win32SetPaletteEntries(pPalette->pixels, pFirst_colour, pCount); |
||
729 | } |
||
730 | |||
731 | void PDSwitchToRealResolution(void) { |
||
732 | LOG_TRACE("()"); |
||
733 | } |
||
734 | |||
735 | void PDSwitchToLoresMode(void) { |
||
736 | LOG_TRACE("()"); |
||
737 | } |
||
738 | |||
739 | void PDMouseButtons(int* pButton_1, int* pButton_2) { |
||
740 | //br_uint_32 mouse_buttons; // Pierre-Marie Baty -- unused variable |
||
741 | //br_int_32 mouse_x; // Pierre-Marie Baty -- unused variable |
||
742 | //br_int_32 mouse_y; // Pierre-Marie Baty -- unused variable |
||
743 | LOG_TRACE("(%p, %p)", pButton_1, pButton_2); |
||
744 | |||
745 | // added by dethrace |
||
746 | gHarness_platform.GetMouseButtons(pButton_1, pButton_2); |
||
747 | } |
||
748 | |||
749 | void PDGetMousePosition(int* pX_coord, int* pY_coord) { |
||
750 | POINT_ p; |
||
751 | LOG_TRACE("(%p, %p)", pX_coord, pY_coord); |
||
752 | |||
753 | GetCursorPos_(&p); |
||
754 | ScreenToClient_(gWin32_hwnd, &p); |
||
755 | *pX_coord = p.x; |
||
756 | *pY_coord = p.y; |
||
757 | } |
||
758 | |||
759 | int PDGetTotalTime(void) { |
||
760 | return timeGetTime_(); |
||
761 | } |
||
762 | |||
763 | int PDServiceSystem(tU32 pTime_since_last_call) { |
||
764 | Win32PumpMessages(); |
||
765 | return 0; |
||
766 | } |
||
767 | |||
768 | void Win32InitInputDevice(void) { |
||
769 | // do directinput stuff |
||
770 | gJoystick_deadzone = 8000; |
||
771 | } |
||
772 | |||
773 | void Win32AllocateActionReplayBuffer(void) { |
||
774 | MEMORYSTATUS_ mem_status; // [esp+Ch] [ebp-28h] BYREF |
||
775 | size_t buf_size; // [esp+2Ch] [ebp-8h] |
||
776 | void* buf; // [esp+30h] [ebp-4h] |
||
777 | |||
778 | buf = 0; |
||
779 | if (gWin32_action_replay_buffer_allocated) { |
||
780 | return; |
||
781 | } |
||
782 | gWin32_action_replay_buffer_allocated = 1; |
||
783 | mem_status.dwLength = sizeof(mem_status); |
||
784 | GlobalMemoryStatus_(&mem_status); |
||
785 | dr_dprintf( |
||
786 | "Win32AllocateActionReplayBuffer(): Memory Status BEFORE Action Replay Allocation:\n" |
||
787 | " dwLength %u\n" |
||
788 | " dwMemoryLoad %u\n" |
||
789 | " dwTotalPhys %u\n" |
||
790 | " dwAvailPhys %u\n" |
||
791 | " dwTotalPageFile %u\n" |
||
792 | " dwAvailPageFile %u\n" |
||
793 | " dwTotalVirtual %u\n" |
||
794 | " dwAvailVirtual %u", |
||
795 | mem_status.dwLength, |
||
796 | mem_status.dwMemoryLoad, |
||
797 | mem_status.dwTotalPhys, |
||
798 | mem_status.dwAvailPhys, |
||
799 | mem_status.dwTotalPageFile, |
||
800 | mem_status.dwAvailPageFile, |
||
801 | mem_status.dwTotalVirtual, |
||
802 | mem_status.dwAvailVirtual); |
||
803 | |||
804 | buf_size = 20000000; |
||
805 | |||
806 | if (mem_status.dwTotalPhys < 16000000) { |
||
807 | buf_size = 500000; |
||
808 | } |
||
809 | if (mem_status.dwTotalPhys < 24000000) { |
||
810 | buf_size = 4000000; |
||
811 | } |
||
812 | if (mem_status.dwTotalPhys < 32000000) { |
||
813 | buf_size = 6000000; |
||
814 | } |
||
815 | if (mem_status.dwTotalPhys < 48000000) { |
||
816 | buf_size = 12000000; |
||
817 | } |
||
818 | |||
819 | dr_dprintf("Win32AllocateActionReplayBuffer(): We want %d bytes...", buf_size); |
||
820 | if (mem_status.dwAvailPhys + mem_status.dwAvailPageFile < buf_size) { |
||
821 | buf_size = mem_status.dwAvailPhys + mem_status.dwAvailPageFile - 1048576; |
||
822 | dr_dprintf("Win32AllocateActionReplayBuffer(): ...but there's only %d bytes available...", buf_size); |
||
823 | } |
||
824 | if (buf_size < 65536) { |
||
825 | buf_size = 65536; |
||
826 | dr_dprintf("Win32AllocateActionReplayBuffer(): ...but we have to have a minimum size of %d bytes...", 65536); |
||
827 | } |
||
828 | while (buf_size >= 65536) { |
||
829 | buf = malloc(buf_size); |
||
830 | if (buf) { |
||
831 | break; |
||
832 | } |
||
833 | buf_size -= 65536; |
||
834 | } |
||
835 | gWin32_action_replay_buffer = buf; |
||
836 | if (buf) { |
||
837 | gWin32_action_replay_buffer_size = buf_size; |
||
838 | Sleep_(1000u); |
||
839 | } else { |
||
840 | gWin32_action_replay_buffer_size = 0; |
||
841 | } |
||
842 | dr_dprintf("Win32AllocateActionReplayBuffer(): Actually allocated %d bytes.", buf_size); |
||
843 | GlobalMemoryStatus_(&mem_status); |
||
844 | dr_dprintf( |
||
845 | "Win32AllocateActionReplayBuffer(): Memory Status AFTER Action Replay Allocation:\n" |
||
846 | " dwLength %u\n" |
||
847 | " dwMemoryLoad %u\n" |
||
848 | " dwTotalPhys %u\n" |
||
849 | " dwAvailPhys %u\n" |
||
850 | " dwTotalPageFile %u\n" |
||
851 | " dwAvailPageFile %u\n" |
||
852 | " dwTotalVirtual %u\n" |
||
853 | " dwAvailVirtual %u", |
||
854 | mem_status.dwLength, |
||
855 | mem_status.dwMemoryLoad, |
||
856 | mem_status.dwTotalPhys, |
||
857 | mem_status.dwAvailPhys, |
||
858 | mem_status.dwTotalPageFile, |
||
859 | mem_status.dwAvailPageFile, |
||
860 | mem_status.dwTotalVirtual, |
||
861 | mem_status.dwAvailVirtual); |
||
862 | } |
||
863 | |||
864 | void PDAllocateActionReplayBuffer(char** pBuffer, tU32* pBuffer_size) { |
||
865 | LOG_TRACE("(%p, %p)", pBuffer, pBuffer_size); |
||
866 | |||
11 | pmbaty | 867 | if (gReplay_override) { |
868 | *pBuffer = NULL; |
||
869 | *pBuffer_size = 0; |
||
870 | return; |
||
871 | } |
||
1 | pmbaty | 872 | Win32AllocateActionReplayBuffer(); |
873 | *pBuffer = gWin32_action_replay_buffer; |
||
874 | *pBuffer_size = gWin32_action_replay_buffer_size; |
||
875 | } |
||
876 | |||
877 | void PDDisposeActionReplayBuffer(char* pBuffer) { |
||
878 | LOG_TRACE("(\"%s\")", pBuffer); |
||
879 | } |
||
880 | |||
881 | // this function is taken from dossys |
||
882 | void Usage(char* pProgpath) { |
||
883 | char base_name[256]; // fix: changed from 9 to avoid overflow on longer filenames |
||
884 | |||
885 | _splitpath_(pProgpath, NULL, NULL, base_name, NULL); |
||
886 | |||
887 | fprintf(stderr, |
||
888 | "Usage: %s [%s] [%s YonFactor] [%s CarSimplificationLevel] [%s SoundDetailLevel] [%s] [%s] [%s] [%s] [%s] [%s]\nWhere YonFactor is between 0 and 1,\nCarSimplificationLevel is a whole number between 0 and %d,\nand SoundDetailLevel is a whole number.\n", |
||
889 | base_name, |
||
890 | "-hires", |
||
891 | "-yon", |
||
892 | "-simple", |
||
893 | "-sound", |
||
894 | "-robots", |
||
895 | "-lomem", |
||
896 | "-nosound", |
||
897 | "-spamfritter", |
||
898 | "-nocutscenes", |
||
899 | "-noreplay", |
||
900 | CAR_MAX_SIMPLIFICATION_LEVEL); |
||
901 | exit(1); |
||
902 | } |
||
903 | |||
904 | // Renamed from "main" to "original_main" to allow for harness + unit testing |
||
905 | int original_main(int pArgc, char** pArgv) { |
||
906 | int arg; |
||
907 | int i; |
||
908 | float f; |
||
909 | |||
910 | for (i = 1; i < pArgc; i++) { |
||
911 | if (strcasecmp(pArgv[i], "-hires") == 0) { |
||
912 | gGraf_spec_index = 1; |
||
913 | } else if (strcasecmp(pArgv[i], "-yon") == 0 && i < pArgc - 1) { |
||
914 | i++; |
||
915 | sscanf(pArgv[i], "%f", &f); |
||
916 | if (f >= 0.0 && f <= 1.0f) { |
||
917 | gYon_multiplier = f; |
||
918 | } |
||
919 | } else if (strcasecmp(pArgv[i], "-simple") == 0 && i < pArgc - 1) { |
||
920 | i++; |
||
921 | sscanf(pArgv[i], "%d", &arg); |
||
922 | if (arg >= 0 && arg < 5) { |
||
923 | gCar_simplification_level = arg; |
||
924 | } |
||
925 | } else if (strcasecmp(pArgv[i], "-sound") == 0 && i < pArgc - 1) { |
||
926 | i++; |
||
927 | sscanf(pArgv[i], "%d", &arg); |
||
928 | gSound_detail_level = arg; |
||
929 | |||
930 | } else if (strcasecmp(pArgv[i], "-robots") == 0 || strcasecmp(pArgv[i], "-german") == 0) { |
||
931 | gSausage_override = 1; |
||
932 | } else if (strcasecmp(pArgv[i], "-lomem") == 0) { |
||
933 | gAustere_override = 1; |
||
934 | } else if (strcasecmp(pArgv[i], "-nosound") == 0) { |
||
935 | gSound_override = 1; |
||
936 | } else if (strcasecmp(pArgv[i], "-spamfritter") == 0) { |
||
937 | gExtra_mem = 2000000; |
||
938 | } else if (strcasecmp(pArgv[i], "-nocutscenes") == 0) { |
||
939 | gCut_scene_override = 1; |
||
940 | } else if (strcasecmp(pArgv[i], "-noreplay") == 0) { |
||
941 | gReplay_override = 1; |
||
942 | } else { |
||
943 | Usage(pArgv[0]); |
||
944 | } |
||
945 | } |
||
946 | |||
947 | gNetwork_profile_fname[0] = 0; |
||
948 | uint32_t len = GetCurrentDirectoryA_(240, gNetwork_profile_fname); |
||
949 | if (len > 0 && len == strlen(gNetwork_profile_fname)) { |
||
950 | gNetwork_profile_file_exists = 1; |
||
951 | strcat(gNetwork_profile_fname, "/"); |
||
952 | strcat(gNetwork_profile_fname, "NETWORK.INI"); |
||
953 | } |
||
954 | |||
955 | GameMain(pArgc, pArgv); |
||
956 | return 0; |
||
957 | } |
||
958 | |||
959 | int OurGetChar(void) { |
||
960 | //int key; // Pierre-Marie Baty -- unused variable |
||
961 | LOG_TRACE("()"); |
||
962 | NOT_IMPLEMENTED(); |
||
963 | } |
||
964 | |||
965 | void PDEnterDebugger(char* pStr) { |
||
966 | //static unsigned char* save_it; // Pierre-Marie Baty -- unused variable |
||
967 | LOG_TRACE("(\"%s\")", pStr); |
||
968 | |||
969 | dr_dprintf("PDEnterDebugger(): %s", pStr); |
||
970 | ShowCursor_(1); |
||
971 | #ifdef DETHRACE_FIX_BUGS |
||
972 | if (strcmp(pStr, "Bet you weren't expecting this") != 0 |
||
973 | #else |
||
974 | if (pStr != "Bet you weren't expecting this" |
||
975 | #endif |
||
976 | && _CrtDbgReport_(_CRT_ASSERT, "C:\\Msdev\\Projects\\DethRace\\Win95sys.c", 437, 0, 0) == 1) { |
||
977 | |||
978 | abort(); // original: __debugbreak(); |
||
979 | } |
||
980 | ShowCursor_(0); |
||
981 | } |
||
982 | |||
983 | // Added function |
||
984 | br_material* PDMissingMaterial(char* name) { |
||
985 | LOG_TRACE("(\"%s\")", name); |
||
986 | |||
987 | // FIXME: call functiont in harness |
||
988 | dr_dprintf("SOMETHING MISSING WARNING - Can't find material '%s'", name); |
||
989 | return NULL; |
||
990 | } |
||
991 | |||
992 | // Added function |
||
993 | br_pixelmap* PDMissingTable(char* name) { |
||
994 | LOG_TRACE("(\"%s\")", name); |
||
995 | |||
996 | // FIXME: call function in harness |
||
997 | dr_dprintf("SOMETHING MISSING WARNING - Can't find shade table '%s'", name); |
||
998 | return NULL; |
||
999 | } |
||
1000 | |||
1001 | // Added function |
||
1002 | br_model* PDMissingModel(char* name) { |
||
1003 | LOG_TRACE("(\"%s\")", name); |
||
1004 | |||
1005 | // FIXME: call function in harness |
||
1006 | dr_dprintf("SOMETHING MISSING WARNING - Can't find model '%s'", name); |
||
1007 | return NULL; |
||
1008 | } |
||
1009 | |||
1010 | // Added function |
||
1011 | br_pixelmap* PDMissingMap(char* name) { |
||
1012 | LOG_TRACE("(\"%s\")", name); |
||
1013 | |||
1014 | // FIXME: call function in harness |
||
1015 | dr_dprintf("SOMETHING MISSING WARNING - Can't find pixelmap '%s'", name); |
||
1016 | return NULL; |
||
1017 | } |
||
1018 | |||
1019 | void PDEndItAllAndReRunTheBastard(void) { |
||
1020 | LOG_TRACE("()"); |
||
1021 | NOT_IMPLEMENTED(); |
||
1022 | } |
||
1023 | |||
1024 | int InitJoysticks(void) { |
||
1025 | LOG_TRACE("()"); |
||
1026 | NOT_IMPLEMENTED(); |
||
1027 | } |
||
1028 | |||
1029 | tU32 ReadJoystickAxis(int pBit) { |
||
1030 | //tU32 val; // Pierre-Marie Baty -- unused variable |
||
1031 | //tU32 count; // Pierre-Marie Baty -- unused variable |
||
1032 | LOG_TRACE("(%d)", pBit); |
||
1033 | NOT_IMPLEMENTED(); |
||
1034 | } |
||
1035 | |||
1036 | void PDReadJoySticks(void) { |
||
1037 | //tU32 temp1x; // Pierre-Marie Baty -- unused variable |
||
1038 | //tU32 temp1y; // Pierre-Marie Baty -- unused variable |
||
1039 | //tU32 temp2x; // Pierre-Marie Baty -- unused variable |
||
1040 | //tU32 temp2y; // Pierre-Marie Baty -- unused variable |
||
1041 | LOG_TRACE("()"); |
||
1042 | NOT_IMPLEMENTED(); |
||
1043 | } |
||
1044 | |||
1045 | tS32 PDGetJoy1X(void) { |
||
1046 | //tS32 joy; // Pierre-Marie Baty -- unused variable |
||
1047 | LOG_TRACE("()"); |
||
1048 | NOT_IMPLEMENTED(); |
||
1049 | } |
||
1050 | |||
1051 | tS32 PDGetJoy1Y(void) { |
||
1052 | //tS32 joy; // Pierre-Marie Baty -- unused variable |
||
1053 | LOG_TRACE("()"); |
||
1054 | NOT_IMPLEMENTED(); |
||
1055 | } |
||
1056 | |||
1057 | tS32 PDGetJoy2X(void) { |
||
1058 | //tS32 joy; // Pierre-Marie Baty -- unused variable |
||
1059 | LOG_TRACE("()"); |
||
1060 | NOT_IMPLEMENTED(); |
||
1061 | } |
||
1062 | |||
1063 | tS32 PDGetJoy2Y(void) { |
||
1064 | //tS32 joy; // Pierre-Marie Baty -- unused variable |
||
1065 | LOG_TRACE("()"); |
||
1066 | NOT_IMPLEMENTED(); |
||
1067 | } |
||
1068 | |||
1069 | int PDGetJoy1Button1(void) { |
||
1070 | LOG_TRACE("()"); |
||
1071 | NOT_IMPLEMENTED(); |
||
1072 | } |
||
1073 | |||
1074 | int PDGetJoy1Button2(void) { |
||
1075 | LOG_TRACE("()"); |
||
1076 | NOT_IMPLEMENTED(); |
||
1077 | } |
||
1078 | |||
1079 | int PDGetJoy1Button3(void) { |
||
1080 | LOG_TRACE("()"); |
||
1081 | NOT_IMPLEMENTED(); |
||
1082 | } |
||
1083 | |||
1084 | int PDGetJoy1Button4(void) { |
||
1085 | LOG_TRACE("()"); |
||
1086 | NOT_IMPLEMENTED(); |
||
1087 | } |
||
1088 | |||
1089 | int PDGetJoy2Button1(void) { |
||
1090 | LOG_TRACE("()"); |
||
1091 | NOT_IMPLEMENTED(); |
||
1092 | } |
||
1093 | |||
1094 | int PDGetJoy2Button2(void) { |
||
1095 | LOG_TRACE("()"); |
||
1096 | NOT_IMPLEMENTED(); |
||
1097 | } |
||
1098 | |||
1099 | int PDGetJoy2Button3(void) { |
||
1100 | LOG_TRACE("()"); |
||
1101 | NOT_IMPLEMENTED(); |
||
1102 | } |
||
1103 | |||
1104 | int PDGetJoy2Button4(void) { |
||
1105 | LOG_TRACE("()"); |
||
1106 | NOT_IMPLEMENTED(); |
||
1107 | } |
||
1108 | |||
1109 | int PDFileUnlock(char* pThe_path) { |
||
1110 | uint32_t dwFileAttributes; // [esp+Ch] [ebp-4h] |
||
1111 | LOG_TRACE("(\"%s\")", pThe_path); |
||
1112 | |||
1113 | dwFileAttributes = GetFileAttributesA_(pThe_path); |
||
1114 | return dwFileAttributes != INVALID_FILE_ATTRIBUTES && SetFileAttributesA_(pThe_path, dwFileAttributes & ~FILE_ATTRIBUTE_READONLY); |
||
1115 | } |
||
1116 | |||
1117 | int PDCheckDriveExists2(char* pThe_path, char* pFile_name, tU32 pMin_size) { |
||
1118 | |||
1119 | char the_path[256]; // [esp+Ch] [ebp-108h] BYREF |
||
1120 | tU32 file_size; // [esp+10Ch] [ebp-8h] |
||
1121 | HANDLE_ hFile; // [esp+110h] [ebp-4h] |
||
1122 | LOG_TRACE("(\"%s\", \"%s\", %d)", pThe_path, pFile_name, pMin_size); |
||
1123 | |||
1124 | file_size = 0; |
||
1125 | if (pFile_name) { |
||
1126 | PathCat(the_path, pThe_path, pFile_name); |
||
1127 | } else { |
||
1128 | strcpy(the_path, pThe_path); |
||
1129 | } |
||
1130 | if (the_path[0] && the_path[1] == ':' && !the_path[2]) { |
||
1131 | strcat(the_path, gDir_separator); |
||
1132 | } |
||
1133 | if (GetFileAttributesA_(pThe_path) == INVALID_FILE_ATTRIBUTES) { |
||
1134 | return 0; |
||
1135 | } |
||
1136 | hFile = CreateFileA_(the_path, GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); |
||
1137 | if (hFile != INVALID_HANDLE_VALUE) { |
||
1138 | file_size = GetFileSize_(hFile, 0); |
||
1139 | CloseHandle_(hFile); |
||
1140 | } |
||
1141 | return file_size >= pMin_size; |
||
1142 | } |
||
1143 | |||
1144 | int PDDoWeLeadAnAustereExistance(void) { |
||
1145 | return 0; |
||
1146 | } |
||
1147 | |||
1148 | // Windows-specific functions. The only name we know for sure is "Win32AllocateReplayBuffer". |
||
1149 | |||
1150 | void Win32BRenderWarningFunc(char* msg) { |
||
1151 | dr_dprintf("*******************************************************************************"); |
||
1152 | dr_dprintf("BRender WARNING: '%s'", msg); |
||
1153 | dr_dprintf("*******************************************************************************"); |
||
1154 | } |
||
1155 | |||
1156 | void Win32BRenderFailureFunc(char* msg) { |
||
1157 | dr_dprintf("*******************************************************************************"); |
||
1158 | dr_dprintf("BRender FAILURE: '%s'", msg); |
||
1159 | dr_dprintf("*******************************************************************************"); |
||
1160 | Win32FatalError("BRender error detected:", msg); |
||
1161 | } |