Rev 11 | Rev 18 | 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 }, |
||
| 15 | pmbaty | 36 | { 8, 1, 0, 640, 480, 0, 0, "64X48X8", GFX_INIT_STRING_64X48X8, 640, 480, 480, NULL } // Pierre-Marie Baty -- fixed yres |
| 1 | pmbaty | 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 | } |