Advertisement
Kitomas

work for 2025-04-25 (5/5)

Apr 25th, 2025 (edited)
352
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 85.55 KB | None | 0 0
  1. /******************************************************************************/
  2. /******************************************************************************/
  3. //"gdi_maze_game_2025-04-25\include\sound_stuff.hpp":
  4. // This file should not be included on its own,
  5. // but rather as part of "public_stuff.hpp"!
  6. //
  7. // (Most of this is lifted straight from kit_sdl2, so if some
  8. //  things here are inconsisent with the rest, that's why!)
  9. //
  10. // ALSO, DO NOT USE THIS AS REFERENCE IN A FUTURE PROJECT,
  11. // BECAUSE IT'S A HACKY MESS!
  12. #ifndef _SOUND_STUFF_HPP
  13. #define _SOUND_STUFF_HPP
  14.  
  15. #ifdef SOUND_STUFF_USED
  16.  
  17. #include <windows.h>
  18.  
  19.  
  20.  
  21.  
  22.  
  23. //#define AUDIODATA_FILELOAD_USED
  24. #define AUDIODATA_SAVEAUDIO_USED
  25. #define AUDIODATA_CONVERTFORMAT_USED
  26.  
  27.  
  28.  
  29.  
  30.  
  31. #define GET_AUDIO_BITSIZE(x)     (x & (0xFF ))
  32. #define GET_AUDIO_ISFLOAT(x)     (x & (1<< 8))
  33. #define GET_AUDIO_ISBIGENDIAN(x) (x & (1<<12))
  34. #define GET_AUDIO_ISSIGNED(x)    (x & (1<<15))
  35.  
  36. #define GET_AUDIO_BYTESIZE(x)    (GET_AUDIO_BITSIZE(x)/8)
  37.  
  38.  
  39.  
  40. enum AudioSampleFormatEnum {
  41.   SMPFMT_U8     = 0x0008,  //unsigned  8-bit samples
  42.   SMPFMT_S8     = 0x8008,  //  signed  8-bit samples
  43.   SMPFMT_U16LSB = 0x0010,  //unsigned 16-bit samples
  44.   SMPFMT_S16LSB = 0x8010,  //  signed 16-bit samples
  45.   SMPFMT_S32LSB = 0x8020,  //  signed 32-bit samples
  46.   SMPFMT_F32LSB = 0x8120,  //32-bit floating point samples
  47.  
  48.   SMPFMT_U16MSB = 0x1010,  //same as LSB, except with big-endian byte order
  49.   SMPFMT_S16MSB = 0x9010,  //same as LSB, except with big-endian byte order
  50.   SMPFMT_S32MSB = 0x9020,  //same as LSB, except with big-endian byte order
  51.   SMPFMT_F32MSB = 0x9120,  //same as LSB, except with big-endian byte order
  52.  
  53.   SMPFMT_S24LSB = 0x8018,  //  signed 24-bit samples
  54.   SMPFMT_F64LSB = 0x8140,  //64-bit floating point samples
  55.  
  56.   SMPFMT_S24MSB = 0x9018,  //same as LSB, except with big-endian byte order
  57.   SMPFMT_F64MSB = 0x9140,  //same as LSB, except with big-endian byte order
  58.  
  59.   //aliases
  60.   SMPFMT_U16    = SMPFMT_U16LSB,
  61.   SMPFMT_S16    = SMPFMT_S16LSB,
  62.   SMPFMT_S24    = SMPFMT_S24LSB,
  63.   SMPFMT_S32    = SMPFMT_S32LSB,
  64.   SMPFMT_F32    = SMPFMT_F32LSB,
  65.   SMPFMT_F64    = SMPFMT_F64LSB,
  66.  
  67.   //may also be used as a wildcard
  68.    //(as in this may be associated with a value != 0xFFFF)
  69.   SMPFMT_UKNOWN = 0xFFFF,
  70.  
  71. };
  72.  
  73.  
  74.  
  75.  
  76.  
  77. /******************************************************************************/
  78.  
  79.  
  80.  
  81.  
  82.  
  83. struct AudioDataHeader;
  84.  
  85. // The pointer this returns MUST have been allocated with mem_alloc()
  86. // Also, ->samples must not be a separate allocation! samples must be contiguous
  87. // and on the same memory block as the header itself!
  88. //
  89. // (Basically, header_ptr->samples = (u8*)header_ptr+header_ptr->headerSize)
  90. typedef AudioDataHeader* (*AudioDataLoaderCallback)(const char* filePath);
  91.  
  92. typedef bool (*AudioDataSaverCallback)(const char* filePath,
  93.                                        AudioDataHeader& header_in);
  94.  
  95.  
  96.  
  97.  
  98.  
  99. // File signature = "kPxM" (no null terminator)
  100. #define KPM_FILE_SIG (0x4D78506B)
  101.  
  102. // This struct is identical to a ".kpm" file as it contains the same header data
  103. struct AudioDataHeader { //72B (0x48B)
  104.   u32        magic; // (0x00) = KPM_FILE_SIG = 0x4D78506B = "kPxM"
  105.   u16       format; // (0x04) = one of AudioSampleFormatEnum if fmt_version == 1
  106.   u16   headerSize; // (0x06) = must be >=sizeof(AudioDataHeader)
  107.   u64     dataSize; // (0x08) = size of audio data, in bytes
  108.  
  109.   u64    loopStart; // (0x10) = which sample to loop back to
  110.   u64      loopEnd; // (0x18) = which sample to jump back to loopStart on
  111.  
  112.   u64   numSamples; // (0x20) = # of sample frames in audio data
  113.   u32   sampleRate; // (0x28) = the audio data's sample rate, in Hz
  114.   u32      bitRate; // (0x2C) = the audio's bit rate (per second)
  115.  
  116.   u16    loopCount; // (0x30) = # of times to loop audio (0 = no loop, 0xFFFF = inf loop)
  117.   u16     channels; // (0x32) = # of interlaced channels in the audio data
  118.   u8     _reserved; // (0x34)
  119.   u8   fmt_version; // (0x35) = 0=kit_w32, 1=kit_sdl2
  120.   u8          mode; // (0x36) = 0 for normal PCM or float data types
  121.   u8 metadata_type; // (0x37) = 0 for no metadata
  122.  
  123.   void*    samples; // (0x38) = the audio's sample data (appears as nullptr in file)
  124.   void*   userdata; // (0x40) = user-defined (also appears nullptr in file)
  125.                     // (0x48) = (start of sample data, assuming a .kpm file)
  126.  
  127.   // Only useful #ifdef _DEBUG
  128.   void printHeader(const char* name = nullptr);
  129.  
  130. };
  131.  
  132.  
  133.  
  134.  
  135.  
  136. class AudioData {
  137.   bool _allocate_hdr(u16 headerSize, u64 dataSize);
  138.  
  139. public:
  140.   AudioDataHeader* hdr = nullptr;
  141.  
  142.   StereoF32 volume = {1.0f, 1.0f};
  143.  
  144.  
  145.  
  146.   // Create with everything zeroed out, except headerSize, dataSize, and samples
  147.   AudioData(u16 headerSize, u64 dataSize){ _allocate_hdr(headerSize,dataSize); }
  148.  
  149.   // Create with zeroed out sample data
  150.   AudioData(AudioSampleFormatEnum format,
  151.             u64 numSamples, u16 channels, u32 sampleRate);
  152.  
  153. #ifdef AUDIODATA_FILELOAD_USED
  154.   // Create from an audio file of a specific file format
  155.   AudioData(const char* filePath, AudioDataLoaderCallback callback);
  156. #endif
  157.  
  158.   ~AudioData();
  159.  
  160.  
  161.  
  162.   inline void printHeader(const char* name = nullptr)
  163.   { if(hdr != nullptr) hdr->printHeader(name); }
  164.  
  165. #ifdef AUDIODATA_SAVEAUDIO_USED
  166.   // (This will overwrite any file named filePath! make sure to check
  167.   //  with fileio_exists() unless you intend to overwrite the previous file)
  168.   bool saveAudio(const char* filePath, AudioDataSaverCallback callback);
  169. #endif
  170.  
  171. #ifdef AUDIODATA_CONVERTFORMAT_USED
  172.   // The conversion method used is slightly inaccurate for a number of reasons.
  173.   // This function only serves as a convenience, where accuracy isn't
  174.   // needed beyond sounding more or less the same.
  175.   //
  176.   // (This will return early if hdr->format == format,
  177.   //  since no conversion would be necessary)
  178.   bool convertFormat(AudioSampleFormatEnum format);
  179. #endif
  180.  
  181. };
  182.  
  183.  
  184.  
  185.  
  186.  
  187. /******************************************************************************/
  188.  
  189.  
  190.  
  191.  
  192.  
  193. struct SoundEngineTrack { //88B
  194.   const AudioDataHeader* audio;
  195.  
  196.   // Time at the point of audio being queued, in seconds
  197.   f64                timestamp;
  198.  
  199.   f64                 position;
  200.  
  201.   f64                  spd_old;
  202.   f64                  spd_new;
  203.   f64                 spdDelta;
  204.  
  205.   StereoF32            vol_old;
  206.   StereoF32            vol_new;
  207.   StereoF32           volDelta;
  208.   StereoF32          volMaster;
  209.  
  210.   u16                    loops;
  211.   bool                stopping;
  212.  
  213.   char             _padding[5];
  214.  
  215. };
  216.  
  217.  
  218.  
  219.  
  220.  
  221. // WARNING: IF A CURRENTLY PLAYING AUDIO CLIP IS DESTROYED BEFORE
  222. // SOUNDENGINE, AN ACCESS VIOLATION MIGHT OCCUR IF ACTIVELY MIXING!
  223.  
  224. class SoundEngine {
  225.   SoundEngineTrack _tracks[64];
  226.   CRITICAL_SECTION   _lock;
  227.   u16          _tracks_len = 64;
  228.   u8              _padding;
  229.  
  230. public:
  231.   // (ALL TRACKS MUST BE FULLY STOPPED BEFORE CHANGING SAMPLERATE,
  232.   //  AS SAMPLERATE IS USED TO CALCULATE SOME AUDIO CLIP INFO!)
  233.  
  234.   bool    stopIfVolumeIsZero = true;
  235.   f32             sampleRate = (f32)sample_rate; // The *device*'s sample rate
  236.   StereoF32    volumeMaster = {1.0f, 1.0f};
  237.   // (Only the left channel of volumeMaster
  238.   //  is used if the source audio is mono)
  239.  
  240.  
  241.  
  242.   SoundEngine(u16 numTracks = 64, f32 _sampleRate = (f32)sample_rate);
  243.  
  244.   ~SoundEngine();
  245.  
  246.  
  247.  
  248.   bool isTrackPlaying(u16 track);
  249.  
  250.   u16        getActiveTracks();
  251.   inline u16 getTrackCount(){ return _tracks_len; }
  252.  
  253.  
  254.  
  255.   // Sets the volume multiplier of a given track,
  256.   // or all active tracks if track == 0xFFFF
  257.   //
  258.   // When forced == true, the volume state is set instantly, instead of
  259.   // being interpolated over the course of the next call to mixTracks()
  260.   bool setVolume(f32 volumeL, f32 volumeR,
  261.                  u16 track = 0xFFFF, bool forced = false);
  262.  
  263.   // Sets the speed multiplier of a given track,
  264.   // or all active tracks if track == 0xFFFF
  265.   //
  266.   // Forced has the same behavior as setVolume
  267.   bool setSpeed(f64 speedNew,
  268.                 u16 track = 0xFFFF, bool forced = false);
  269.  
  270.   // Sets the change in volume over time for a given track.
  271.   // or all active tracks if track == 0xFFFF
  272.   //
  273.   // DeltaSeconds is the time it will take for the volume
  274.   // to go from 0.0x -> 1.0x (or vice versa)
  275.   bool setVolumeDelta(f32 deltaSecondsL, f32 deltaSecondsR,
  276.                       u16 track = 0xFFFF);
  277.  
  278.   // Same behavior as setVolumeDelta, except applied to the speed multiplier
  279.   bool setSpeedDelta(f64 deltaSeconds,
  280.                      u16 track = 0xFFFF);
  281.  
  282.  
  283.  
  284.   // Returns the track the audio was queued into,
  285.   // or 0xFFFF if no empty track was found,
  286.   // or 0xFFFE on error
  287.   u16 play(const AudioData& audio, // (only f32 or StereoF32 samples allowed!)
  288.            f32 volumeL = 1.0f, f32 volumeR = 1.0f, f64 speed = 1.0);
  289.  
  290.   // (Make sure to stop all tracks before freeing any instances of AudioData,
  291.   //  as to avoid any issues related to dangling pointers and whatnot)
  292.   //
  293.   // (Also, unless forced is set to true, this function
  294.   //  won't work if stopIfVolumeIsZero is false!)
  295.   bool stop(u16 track = 0xFFFF, bool forced = false);
  296.  
  297.  
  298.  
  299.   // Returns false if timeout is reached, true otherwise
  300.   //
  301.   // Set timeoutSeconds to 0 to wait indefinitely
  302.   bool waitForTrack(f64 timeoutSeconds = 0, u16 track = 0xFFFF);
  303.  
  304.  
  305.  
  306.   // buffer_len is in elements, not bytes
  307.   //
  308.   // Returns referenceTimestamp, or 0.0 on error
  309.   f64 mixTracks(StereoF32* buffer, size_t buffer_len,
  310.                 f64 referenceTimestamp = timeGetSeconds());
  311.  
  312. };
  313.  
  314.  
  315.  
  316.  
  317.  
  318. #endif /* SOUND_STUFF_USED */
  319.  
  320. #endif /* _SOUND_STUFF_HPP */
  321. /******************************************************************************/
  322. /******************************************************************************/
  323. //"gdi_maze_game_2025-04-25\include\win32\audio.hpp":
  324. #ifndef _WIN32_AUDIO_HPP
  325. #define _WIN32_AUDIO_HPP
  326.  
  327. #include <public_stuff.hpp>
  328.  
  329. #include <windows.h>
  330. #include <mmsystem.h>
  331.  
  332.  
  333.  
  334. #define timeGetDevCaps         _Winmm_func.timeGetDevCaps_
  335. #define timeBeginPeriod        _Winmm_func.timeBeginPeriod_
  336.  
  337. #define waveOutGetNumDevs      _Winmm_func.waveOutGetNumDevs_
  338. #define waveOutGetDevCapsA     _Winmm_func.waveOutGetDevCapsA_
  339. #define waveOutGetVolume       _Winmm_func.waveOutGetVolume_
  340. #define waveOutSetVolume       _Winmm_func.waveOutSetVolume_
  341. #define waveOutGetErrorTextA   _Winmm_func.waveOutGetErrorTextA_
  342. #define waveOutOpen            _Winmm_func.waveOutOpen_
  343. #define waveOutClose           _Winmm_func.waveOutClose_
  344. #define waveOutPrepareHeader   _Winmm_func.waveOutPrepareHeader_
  345. #define waveOutUnprepareHeader _Winmm_func.waveOutUnprepareHeader_
  346. #define waveOutWrite           _Winmm_func.waveOutWrite_
  347. #define waveOutPause           _Winmm_func.waveOutPause_
  348. #define waveOutRestart         _Winmm_func.waveOutRestart_
  349. #define waveOutReset           _Winmm_func.waveOutReset_
  350. #define waveOutBreakLoop       _Winmm_func.waveOutBreakLoop_
  351. #define waveOutGetPosition     _Winmm_func.waveOutGetPosition_
  352. #define waveOutGetPitch        _Winmm_func.waveOutGetPitch_
  353. #define waveOutSetPitch        _Winmm_func.waveOutSetPitch_
  354. #define waveOutGetPlaybackRate _Winmm_func.waveOutGetPlaybackRate_
  355. #define waveOutSetPlaybackRate _Winmm_func.waveOutSetPlaybackRate_
  356. #define waveOutGetID           _Winmm_func.waveOutGetID_
  357. #define waveOutMessage         _Winmm_func.waveOutMessage_
  358.  
  359. union _Winmm_func_t {
  360.   FARPROC ptrs[1];
  361.  
  362.   struct {
  363.     // Idk why these first two are in WinMM at all, but whatever
  364.     MMRESULT (WINAPI *timeGetDevCaps_)(LPTIMECAPS, UINT);
  365.     MMRESULT (WINAPI *timeBeginPeriod_)(UINT);
  366.  
  367.     //UINT     (WINAPI *waveOutGetNumDevs_)(void);
  368.     MMRESULT (WINAPI *waveOutGetDevCapsA_)(UINT_PTR, LPWAVEOUTCAPSA, UINT);
  369.     //MMRESULT (WINAPI *waveOutGetVolume_)(HWAVEOUT, LPDWORD);
  370.     MMRESULT (WINAPI *waveOutSetVolume_)(HWAVEOUT, DWORD);
  371.     //MMRESULT (WINAPI *waveOutGetErrorTextA_)(MMRESULT, LPSTR, UINT);
  372.     MMRESULT (WINAPI *waveOutOpen_)(LPHWAVEOUT, UINT, LPCWAVEFORMATEX, DWORD_PTR, DWORD_PTR, DWORD);
  373.     //MMRESULT (WINAPI *waveOutClose_)(HWAVEOUT);
  374.     MMRESULT (WINAPI *waveOutPrepareHeader_)(HWAVEOUT, LPWAVEHDR, UINT);
  375.     //MMRESULT (WINAPI *waveOutUnprepareHeader_)(HWAVEOUT, LPWAVEHDR, UINT);
  376.     MMRESULT (WINAPI *waveOutWrite_)(HWAVEOUT, LPWAVEHDR, UINT);
  377.     MMRESULT (WINAPI *waveOutPause_)(HWAVEOUT);
  378.     //MMRESULT (WINAPI *waveOutRestart_)(HWAVEOUT);
  379.     //MMRESULT (WINAPI *waveOutReset_)(HWAVEOUT);
  380.     //MMRESULT (WINAPI *waveOutBreakLoop_)(HWAVEOUT);
  381.     //MMRESULT (WINAPI *waveOutGetPosition_)(HWAVEOUT, LPMMTIME, UINT);
  382.     //MMRESULT (WINAPI *waveOutGetPitch_)(HWAVEOUT, LPDWORD);
  383.     //MMRESULT (WINAPI *waveOutSetPitch_)(HWAVEOUT, DWORD);
  384.     //MMRESULT (WINAPI *waveOutGetPlaybackRate_)(HWAVEOUT, LPDWORD);
  385.     //MMRESULT (WINAPI *waveOutSetPlaybackRate_)(HWAVEOUT, DWORD);
  386.     //MMRESULT (WINAPI *waveOutGetID_)(HWAVEOUT, LPUINT);
  387.     //MMRESULT (WINAPI *waveOutMessage_)(HWAVEOUT, UINT, DWORD_PTR, DWORD_PTR);
  388.   };
  389. };
  390.  
  391. extern _Winmm_func_t _Winmm_func;
  392. extern char          _Winmm_names_a[];
  393. extern char          _Winmm_names_b[];
  394.  
  395.  
  396.  
  397. /******************************************************************************/
  398.  
  399.  
  400.  
  401. // Stereo audio samples as two 16-bit signed ints
  402. struct StereoS16 { s16 l,r; };
  403.  
  404.  
  405.  
  406. int WaveOutInit();
  407.  
  408. void WaveOutQuit();
  409.  
  410.  
  411.  
  412. #endif /* _WIN32_AUDIO_HPP */
  413. /******************************************************************************/
  414. /******************************************************************************/
  415. //"gdi_maze_game_2025-04-25\include\win32\input.hpp":
  416. #ifndef _WIN32_INPUT_HPP
  417. #define _WIN32_INPUT_HPP
  418.  
  419. #include <windows.h>
  420.  
  421. #include <public_stuff.hpp>
  422.  
  423.  
  424.  
  425. int InputInit();
  426.  
  427. void InputQuit();
  428.  
  429.  
  430.  
  431. union Event; // Forward declaration
  432.  
  433. // Returns false if queue is full
  434. bool AddToEventQueue(Event& event);
  435.  
  436. // Returns a EVENT_NULL event if queue is empty
  437. Event RemoveFromEventQueue();
  438.  
  439.  
  440.  
  441. #endif /* _WIN32_INPUT_HPP */
  442. /******************************************************************************/
  443. /******************************************************************************/
  444. //"gdi_maze_game_2025-04-25\include\win32\video.hpp":
  445. #ifndef _WIN32_VIDEO_HPP
  446. #define _WIN32_VIDEO_HPP
  447.  
  448. #include <windows.h>
  449.  
  450.  
  451.  
  452. #define RegisterClassA          _User32_func.RegisterClassA_
  453. #define CreateWindowExA         _User32_func.CreateWindowExA_
  454. #define DefWindowProcA          _User32_func.DefWindowProcA_
  455. #define InvalidateRect          _User32_func.InvalidateRect_
  456. #define UpdateWindow            _User32_func.UpdateWindow_
  457. #define BeginPaint              _User32_func.BeginPaint_
  458. #define EndPaint                _User32_func.EndPaint_
  459. #define PeekMessageA            _User32_func.PeekMessageA_
  460. #define DispatchMessageA        _User32_func.DispatchMessageA_
  461. #define DestroyWindow           _User32_func.DestroyWindow_
  462. #define ReleaseDC               _User32_func.ReleaseDC_
  463. #define GetDC                   _User32_func.GetDC_
  464. #define PostQuitMessage         _User32_func.PostQuitMessage_
  465. #define MessageBoxA             _User32_func.MessageBoxA_
  466. #define TranslateMessage        _User32_func.TranslateMessage_
  467. #define GetWindowLongA          _User32_func.GetWindowLongA_
  468. #define AdjustWindowRectEx      _User32_func.AdjustWindowRectEx_
  469. #define LoadCursorA             _User32_func.LoadCursorA_
  470. #define MapVirtualKeyA          _User32_func.MapVirtualKeyA_
  471. #define GetCursorPos            _User32_func.GetCursorPos_
  472. #define ScreenToClient          _User32_func.ScreenToClient_
  473. #define ShowCursor              _User32_func.ShowCursor_
  474. #define ClipCursor              _User32_func.ClipCursor_
  475. #define GetClientRect           _User32_func.GetClientRect_
  476. #define ClientToScreen          _User32_func.ClientToScreen_
  477. #define SetCapture              _User32_func.SetCapture_
  478. #define ReleaseCapture          _User32_func.ReleaseCapture_
  479. #define SetCursorPos            _User32_func.SetCursorPos_
  480. #define RegisterRawInputDevices _User32_func.RegisterRawInputDevices_
  481. #define GetRawInputData         _User32_func.GetRawInputData_
  482.  
  483. union _User32_func_t {
  484.   FARPROC ptrs[1];
  485.  
  486.   struct {
  487.     ATOM    (WINAPI *RegisterClassA_)(CONST WNDCLASSA*);
  488.     HWND    (WINAPI *CreateWindowExA_)(DWORD, LPCSTR, LPCSTR, DWORD, int, int, int, int, HWND, HMENU, HINSTANCE, LPVOID);
  489.     LRESULT (WINAPI *DefWindowProcA_)(HWND, UINT, WPARAM, LPARAM);
  490.     WINBOOL (WINAPI *InvalidateRect_)(HWND, CONST RECT*, WINBOOL);
  491.     WINBOOL (WINAPI *UpdateWindow_)(HWND);
  492.     HDC     (WINAPI *BeginPaint_)(HWND, LPPAINTSTRUCT);
  493.     WINBOOL (WINAPI *EndPaint_)(HWND, CONST PAINTSTRUCT*);
  494.     WINBOOL (WINAPI *PeekMessageA_)(LPMSG, HWND, UINT, UINT, UINT);
  495.     LRESULT (WINAPI *DispatchMessageA_)(CONST MSG*);
  496.     WINBOOL (WINAPI *DestroyWindow_)(HWND);
  497.   //int     (WINAPI *ReleaseDC_)(HWND, HDC);
  498.   //HDC     (WINAPI *GetDC_)(HWND);
  499.     VOID    (WINAPI *PostQuitMessage_)(int);
  500.     int     (WINAPI *MessageBoxA_)(HWND, LPCSTR, LPCSTR, UINT);
  501.     WINBOOL (WINAPI *TranslateMessage_)(CONST MSG*);
  502.     LONG    (WINAPI *GetWindowLongA_)(HWND, int);
  503.     WINBOOL (WINAPI *AdjustWindowRectEx_)(LPRECT, DWORD, WINBOOL, DWORD);
  504.     HCURSOR (WINAPI *LoadCursorA_)(HINSTANCE, LPCSTR);
  505.     UINT    (WINAPI *MapVirtualKeyA_)(UINT, UINT);
  506.   //WINBOOL (WINAPI *GetCursorPos_)(LPPOINT);
  507.     WINBOOL (WINAPI *ScreenToClient_)(HWND, LPPOINT);
  508.     int     (WINAPI *ShowCursor_)(WINBOOL);
  509.     WINBOOL (WINAPI *ClipCursor_)(CONST RECT*);
  510.     WINBOOL (WINAPI *GetClientRect_)(HWND, LPRECT);
  511.     WINBOOL (WINAPI *ClientToScreen_)(HWND, LPPOINT);
  512.     HWND    (WINAPI *SetCapture_)(HWND);
  513.     WINBOOL (WINAPI *ReleaseCapture_)(VOID);
  514.     WINBOOL (WINAPI *SetCursorPos_)(int, int);
  515.     WINBOOL (WINAPI *RegisterRawInputDevices_)(PCRAWINPUTDEVICE, UINT, UINT);
  516.     UINT    (WINAPI *GetRawInputData_)(HRAWINPUT, UINT, LPVOID, PUINT, UINT);
  517.   };
  518. };
  519.  
  520. extern _User32_func_t _User32_func;
  521. extern char           _User32_names_a[];
  522.  
  523.  
  524.  
  525. /******************************************************************************/
  526.  
  527.  
  528.  
  529. #define CreateCompatibleDC     _Gdi32_func.CreateCompatibleDC_
  530. #define CreateDIBSection       _Gdi32_func.CreateDIBSection_
  531. #define SelectObject           _Gdi32_func.SelectObject_
  532. #define DeleteObject           _Gdi32_func.DeleteObject_
  533. #define BitBlt                 _Gdi32_func.BitBlt_
  534. #define DeleteDC               _Gdi32_func.DeleteDC_
  535. #define StretchBlt             _Gdi32_func.StretchBlt_
  536. #define CreateCompatibleBitmap _Gdi32_func.CreateCompatibleBitmap_
  537. #define SetStretchBltMode      _Gdi32_func.SetStretchBltMode_
  538. #define SetDIBColorTable       _Gdi32_func.SetDIBColorTable_
  539. #define CreateSolidBrush       _Gdi32_func.CreateSolidBrush_
  540.  
  541. union _Gdi32_func_t {
  542.   FARPROC ptrs[1];
  543.  
  544.   struct {
  545.     HDC     (WINAPI *CreateCompatibleDC_)(HDC);
  546.     HBITMAP (WINAPI *CreateDIBSection_)(HDC, CONST BITMAPINFO*, UINT, VOID**, HANDLE, DWORD);
  547.     HGDIOBJ (WINAPI *SelectObject_)(HDC, HGDIOBJ);
  548.     WINBOOL (WINAPI *DeleteObject_)(HGDIOBJ);
  549.     WINBOOL (WINAPI *BitBlt_)(HDC, int, int, int, int, HDC, int, int, DWORD);
  550.     WINBOOL (WINAPI *DeleteDC_)(HDC);
  551.     WINBOOL (WINAPI *StretchBlt_)(HDC, int, int, int, int, HDC, int, int, int, int, DWORD);
  552.     HBITMAP (WINAPI *CreateCompatibleBitmap_)(HDC, int, int);
  553.     int     (WINAPI *SetStretchBltMode_)(HDC, int);
  554.     UINT    (WINAPI *SetDIBColorTable_)(HDC, UINT, UINT, CONST RGBQUAD*);
  555.     HBRUSH  (WINAPI *CreateSolidBrush_)(COLORREF);
  556.   };
  557. };
  558.  
  559. extern _Gdi32_func_t _Gdi32_func;
  560. extern char          _Gdi32_names_a[];
  561.  
  562.  
  563.  
  564. /******************************************************************************/
  565.  
  566.  
  567.  
  568. int WindowInit(HINSTANCE hThisInst);
  569.  
  570. void WindowQuit();
  571.  
  572.  
  573.  
  574. #endif /* _WIN32_VIDEO_HPP */
  575. /******************************************************************************/
  576. /******************************************************************************/
  577. //"gdi_maze_game_2025-04-25\src\draw_raycast_scene.hpp":
  578. #ifndef _DRAW_RAYCAST_SCENE_HPP
  579. #define _DRAW_RAYCAST_SCENE_HPP
  580.  
  581. #include <public_stuff.hpp>
  582.  
  583.  
  584.  
  585.  
  586.  
  587. // This assumes point has a length of 1
  588. static inline Fpoint2d create_2d_vector(f32 angleRads,
  589.                                         f32 magnitude)
  590. {
  591.   return {cosf(angleRads)*magnitude, sinf(angleRads)*magnitude};
  592. }
  593.  
  594.  
  595.  
  596.  
  597.  
  598. void fill_scanlines(u32 y, u32 len, Color8 color,
  599.                     Color8* dst = pixels);
  600.  
  601.  
  602.  
  603.  
  604.  
  605. #define RAYCAST_TEX_SIZE 32
  606. #define RAYCAST_TEX_SIZE_TOTAL (8 + RAYCAST_TEX_SIZE*RAYCAST_TEX_SIZE)
  607.  
  608. void draw_raycast_scene(const s32* map, Point2d map_size,
  609.                         Fpoint3d pos, // (pos.z is the angle, in radians)
  610.                         const Color8 tiles[][RAYCAST_TEX_SIZE_TOTAL],
  611.                         Color8 colorCeiling = 0xC0, Color8 colorFloor = 0x90,
  612.                         u32 renderDistance = 100, f32 fov = 90.0f,
  613.                         Color8* dst = pixels);
  614.  
  615.  
  616.  
  617.  
  618.  
  619. #endif /* _DRAW_RAYCAST_SCENE_HPP */
  620. /******************************************************************************/
  621. /******************************************************************************/
  622. //"gdi_maze_game_2025-04-25\src\generate_maze.hpp":
  623. #ifndef _GENERATE_MAZE_HPP
  624. #define _GENERATE_MAZE_HPP
  625.  
  626. #include <public_stuff.hpp>
  627.  
  628.  
  629.  
  630. #define START_X 1
  631. #define START_Y 1
  632.  
  633. // w & h must be odd, otherwise the south-eastern edges will be carved!
  634. bool generate_maze(s32* map, u32 w, u32 h, s32 fillValue = 1);
  635.  
  636.  
  637.  
  638.  
  639.  
  640. #endif /* _GENERATE_MAZE_HPP */
  641. /******************************************************************************/
  642. /******************************************************************************/
  643. //"gdi_maze_game_2025-04-25\src\map_and_textures.hpp":
  644. //22050Hz, s16, mono
  645. #define FOOTSTEP0_HERTZ    22050
  646. #define FOOTSTEP0_FORMAT   SMPFMT_S16
  647. #define FOOTSTEP0_CHANNELS 1#define TEX_SIZE RAYCAST_TEX_SIZE
  648. Color8 textures[8][8 + TEX_SIZE*TEX_SIZE] = {
  649.   // Mario-style brick wall
  650.   { 32, 32, 0x0E, 0,0,0,0,0, // 1032 Bytes
  651.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  652.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  653.     0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x00, 0x00, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x00, 0x00, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E,
  654.     0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x00, 0x00, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x00, 0x00, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E,
  655.     0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x00, 0x00, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x00, 0x00, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E,
  656.     0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x00, 0x00, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x00, 0x00, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E,
  657.     0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x00, 0x00, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x00, 0x00, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E,
  658.     0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x00, 0x00, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x00, 0x00, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E,
  659.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  660.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  661.     0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x00, 0x00, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x00, 0x00,
  662.     0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x00, 0x00, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x00, 0x00,
  663.     0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x00, 0x00, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x00, 0x00,
  664.     0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x00, 0x00, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x00, 0x00,
  665.     0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x00, 0x00, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x00, 0x00,
  666.     0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x00, 0x00, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x00, 0x00,
  667.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  668.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  669.     0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x00, 0x00, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x00, 0x00, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E,
  670.     0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x00, 0x00, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x00, 0x00, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E,
  671.     0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x00, 0x00, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x00, 0x00, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E,
  672.     0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x00, 0x00, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x00, 0x00, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E,
  673.     0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x00, 0x00, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x00, 0x00, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E,
  674.     0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x00, 0x00, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x00, 0x00, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E,
  675.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  676.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  677.     0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x00, 0x00, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x00, 0x00,
  678.     0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x00, 0x00, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x00, 0x00,
  679.     0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x00, 0x00, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x00, 0x00,
  680.     0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x00, 0x00, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x00, 0x00,
  681.     0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x00, 0x00, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x00, 0x00,
  682.     0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x00, 0x00, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x00, 0x00,
  683.   },
  684.   // Smiley face
  685.   { 32, 32, 0x00, 0,0,0,0,0, // 1032 Bytes
  686.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  687.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  688.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  689.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00,
  690.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00,
  691.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00,
  692.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00,
  693.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00,
  694.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
  695.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x00, 0x00, 0x00, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
  696.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
  697.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
  698.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  699.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  700.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  701.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  702.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  703.     0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  704.     0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  705.     0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
  706.     0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00,
  707.     0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00,
  708.     0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
  709.     0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
  710.     0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
  711.     0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
  712.     0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00,
  713.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  714.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  715.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  716.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  717.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  718.   },
  719.   // Random junk
  720.   { 32, 32, 0xCB, 0,0,0,0,0, // 1032 Bytes
  721.     0xA1, 0x1F, 0xA1, 0x89, 0xA1, 0xA1, 0xCB, 0xBD, 0x99, 0x43, 0x27, 0x5F, 0xCB, 0x1A, 0xDE, 0xE9, 0x96, 0xAE, 0xC2, 0x43, 0x5D, 0x08, 0xF8, 0xF8, 0x23, 0xE3, 0x18, 0x18, 0x18, 0x1F, 0xE3, 0xE3,
  722.     0x1F, 0x12, 0xB5, 0xA1, 0xA1, 0xA1, 0xCB, 0xDB, 0x43, 0xAF, 0x1B, 0x55, 0x5F, 0x55, 0xDE, 0xE9, 0x96, 0xAE, 0x43, 0x5D, 0x43, 0x18, 0x18, 0x18, 0x18, 0x18, 0xE3, 0xF8, 0x18, 0x1F, 0xF7, 0xB5,
  723.     0x1F, 0x12, 0x99, 0xB5, 0xB5, 0xDB, 0xDB, 0xA1, 0x43, 0xBD, 0x55, 0x27, 0x5F, 0x27, 0x55, 0x55, 0x55, 0x55, 0x55, 0x5D, 0x08, 0xF8, 0xCB, 0xDB, 0xCB, 0xCB, 0xF8, 0x06, 0x18, 0xA1, 0x7D, 0x7D,
  724.     0xCB, 0x12, 0xCB, 0xDB, 0xDB, 0xB5, 0xCB, 0x43, 0x3F, 0x55, 0x1B, 0x27, 0x5F, 0x12, 0x27, 0x12, 0x43, 0x60, 0xBB, 0x5D, 0x55, 0x55, 0x4A, 0xDB, 0xCB, 0xB3, 0xF8, 0x0C, 0x7D, 0x7D, 0x1F, 0x0C,
  725.     0x20, 0x12, 0xCB, 0xDB, 0xCB, 0x89, 0xCB, 0x43, 0x55, 0xB5, 0x1B, 0x27, 0x5F, 0x99, 0x18, 0x43, 0xCB, 0x60, 0x08, 0x5D, 0x76, 0x55, 0x76, 0xDB, 0x0C, 0x0C, 0x7D, 0x7D, 0x18, 0x83, 0x0C, 0xB5,
  726.     0x20, 0x12, 0x3C, 0x3C, 0xDB, 0x89, 0xCB, 0xAB, 0x55, 0x5E, 0x1B, 0xCB, 0x5F, 0x18, 0x43, 0x27, 0xBB, 0x60, 0x08, 0x5D, 0xB5, 0x55, 0x0C, 0x0C, 0x7D, 0x7D, 0x06, 0x83, 0x83, 0x1F, 0x0C, 0x91,
  727.     0xBD, 0x20, 0xBD, 0xBD, 0xDB, 0xCB, 0x89, 0x55, 0x4A, 0x48, 0x1B, 0xA1, 0x5F, 0xCB, 0x43, 0x27, 0xBB, 0x60, 0xF8, 0x5D, 0x80, 0x55, 0x7D, 0x7D, 0xDB, 0x83, 0x83, 0x83, 0x18, 0x1F, 0x91, 0xCB,
  728.     0x05, 0x20, 0xCB, 0xCB, 0xFC, 0xDB, 0x55, 0xCB, 0x4A, 0x43, 0x48, 0x48, 0x7D, 0x7D, 0x43, 0x27, 0x0A, 0x60, 0x5D, 0x0C, 0x7D, 0x7D, 0xC5, 0x83, 0x83, 0x83, 0x91, 0xA1, 0x1F, 0xF8, 0x18, 0x18,
  729.     0x0B, 0xB5, 0x20, 0x05, 0x05, 0xDB, 0x55, 0xBD, 0x4A, 0x43, 0xB1, 0x7D, 0x5F, 0x48, 0x7D, 0x7D, 0x27, 0x24, 0x7D, 0x7D, 0xDF, 0x83, 0x83, 0x5E, 0x83, 0xCB, 0x18, 0x0C, 0x1F, 0xF8, 0x0C, 0x0C,
  730.     0x22, 0xB5, 0x20, 0xD6, 0xD6, 0xD6, 0x55, 0xD6, 0x4A, 0x7D, 0x7D, 0x1B, 0x43, 0x5F, 0x43, 0x48, 0x7D, 0x7D, 0x60, 0x83, 0x83, 0x24, 0x83, 0x83, 0x06, 0xCB, 0xCB, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B,
  731.     0x0B, 0xB5, 0x22, 0x20, 0x6F, 0xCB, 0x55, 0x4A, 0x7D, 0x27, 0x43, 0x27, 0x43, 0x5F, 0x43, 0x27, 0x47, 0x27, 0x83, 0x27, 0x27, 0x83, 0x55, 0x3B, 0x3B, 0x3B, 0x3B, 0x1F, 0x18, 0xF8, 0x75, 0xAE,
  732.     0xE3, 0xB5, 0x5E, 0x20, 0xA1, 0xCB, 0x55, 0x7D, 0x5E, 0xA7, 0xD2, 0x43, 0x18, 0x71, 0x6E, 0x27, 0x27, 0x83, 0x60, 0x3B, 0x83, 0x3B, 0x55, 0x06, 0xF1, 0x0C, 0x24, 0x24, 0x18, 0xE3, 0xAE, 0x91,
  733.     0x52, 0x52, 0x52, 0xCB, 0x20, 0x7D, 0x7D, 0x6A, 0x6A, 0x6A, 0x6A, 0x6A, 0x1D, 0x71, 0x2F, 0x6E, 0x6E, 0x83, 0x60, 0xCB, 0x83, 0x36, 0x06, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x91, 0xCB,
  734.     0x6A, 0x6A, 0x6A, 0x6A, 0x7D, 0x52, 0x52, 0x55, 0x52, 0xCB, 0x27, 0x27, 0x6A, 0x71, 0x6A, 0x3B, 0x83, 0x6E, 0x6B, 0x83, 0x75, 0x6B, 0x6B, 0x55, 0x0C, 0x27, 0x1F, 0x18, 0xAE, 0x3B, 0x6B, 0x6B,
  735.     0xA1, 0xCB, 0xE3, 0x7D, 0x53, 0x53, 0xE3, 0x55, 0x4A, 0x52, 0x52, 0x52, 0x71, 0x5F, 0x6A, 0x83, 0x4A, 0x60, 0x60, 0x83, 0x75, 0x4A, 0x4A, 0x4A, 0x55, 0x4A, 0x4A, 0x4A, 0x3B, 0x1D, 0xE3, 0xCB,
  736.     0xC4, 0xC4, 0xC4, 0xE3, 0x7D, 0x22, 0x53, 0x55, 0x27, 0x4A, 0x10, 0x3C, 0x71, 0x5F, 0x51, 0x6A, 0x18, 0x60, 0x83, 0x75, 0x75, 0x75, 0x3B, 0x3B, 0x27, 0x55, 0x18, 0xAE, 0x4A, 0x4A, 0x4A, 0x4A,
  737.     0xBD, 0xBD, 0xBD, 0xE3, 0x7D, 0x22, 0x14, 0x56, 0x53, 0x53, 0x53, 0x39, 0x73, 0x5F, 0x7C, 0x7C, 0x77, 0x83, 0x75, 0xEB, 0x43, 0x45, 0xDB, 0x27, 0x27, 0x1F, 0x55, 0xD2, 0xD2, 0x4A, 0x4A, 0x4A,
  738.     0x6B, 0xA1, 0xCB, 0xBD, 0xE3, 0x7D, 0x56, 0x04, 0xD3, 0x27, 0x7C, 0x7C, 0x7C, 0x7C, 0x75, 0x60, 0x7C, 0x83, 0x5D, 0x43, 0x43, 0x43, 0x27, 0x20, 0x1F, 0x4A, 0x55, 0x4A, 0x4A, 0x35, 0xDB, 0x7D,
  739.     0xE3, 0x6B, 0x6B, 0xAE, 0xAE, 0x56, 0x7D, 0x7C, 0x7C, 0x7C, 0x2F, 0x73, 0x5F, 0x42, 0x74, 0x55, 0x83, 0x7C, 0x5D, 0x31, 0x12, 0x43, 0x43, 0x4A, 0x4A, 0x18, 0x27, 0x55, 0x20, 0x7D, 0x7D, 0xE3,
  740.     0xAE, 0xA1, 0xE3, 0x6B, 0x6B, 0x14, 0x7C, 0x7D, 0x3E, 0x39, 0x27, 0x73, 0x5F, 0x74, 0x2F, 0x83, 0x60, 0x7C, 0x5D, 0x31, 0xD2, 0x43, 0x4A, 0x1F, 0x18, 0x27, 0xE3, 0xD2, 0x7D, 0x55, 0xD2, 0xDB,
  741.     0xCB, 0xA1, 0xCB, 0x56, 0x14, 0x6B, 0x7C, 0x7D, 0xCB, 0x3E, 0x43, 0x74, 0x5F, 0x74, 0x4A, 0x83, 0x6B, 0x7C, 0x6B, 0x6B, 0x31, 0x00, 0x4A, 0x43, 0x18, 0x27, 0x12, 0x7D, 0xE3, 0x67, 0x55, 0x55,
  742.     0xF5, 0xCB, 0x56, 0xCB, 0x14, 0x7C, 0x0B, 0x23, 0x7F, 0x6B, 0x6B, 0x43, 0x74, 0x6B, 0x6B, 0x83, 0x60, 0x4A, 0x55, 0x5D, 0x6B, 0x6B, 0x43, 0x1F, 0x43, 0x7D, 0x7D, 0x89, 0x12, 0x12, 0xBD, 0xCB,
  743.     0xCB, 0x56, 0xA1, 0xCB, 0x14, 0x7D, 0x23, 0xFD, 0x7F, 0x43, 0x43, 0x6B, 0x6B, 0x2F, 0x27, 0x83, 0x60, 0x27, 0x43, 0x5D, 0x55, 0x31, 0x6B, 0x7D, 0x7D, 0x43, 0x18, 0x89, 0x18, 0x18, 0x12, 0xBD,
  744.     0x56, 0xBD, 0x45, 0x14, 0xFD, 0x7D, 0x23, 0x7F, 0xB5, 0x27, 0x04, 0x42, 0x5F, 0xC6, 0x2F, 0x83, 0x60, 0x43, 0x24, 0x5D, 0x18, 0x7D, 0x7D, 0x43, 0x6B, 0x6B, 0x43, 0x89, 0xBB, 0x06, 0xBB, 0x12,
  745.     0xCB, 0xCB, 0xBD, 0x16, 0x0B, 0x7D, 0x3A, 0x7F, 0xC5, 0x27, 0xCB, 0x42, 0x5F, 0xE3, 0x2F, 0x83, 0x60, 0x2F, 0x43, 0x5D, 0x7D, 0x43, 0x55, 0x27, 0xA1, 0x43, 0x6B, 0x6B, 0xE3, 0x05, 0xCB, 0x6B,
  746.     0xC5, 0xFD, 0xFD, 0x16, 0x23, 0xCB, 0x7D, 0x7F, 0x27, 0xBD, 0x42, 0x40, 0x5F, 0xDB, 0x2F, 0x83, 0xFF, 0x60, 0x7D, 0x7D, 0x5D, 0x18, 0x30, 0x55, 0xEB, 0xEB, 0xEB, 0x89, 0x6B, 0x6B, 0x6B, 0xE3,
  747.     0xFD, 0xCB, 0xCB, 0x16, 0x23, 0x3A, 0x7F, 0xE3, 0x27, 0x27, 0x42, 0x5F, 0x27, 0x27, 0xDB, 0x83, 0x7D, 0x7D, 0x27, 0x0C, 0x5D, 0x2F, 0x30, 0x27, 0x55, 0x55, 0xEB, 0xEB, 0x1D, 0x1D, 0x1D, 0xDE,
  748.     0xCB, 0x05, 0x05, 0x24, 0x3A, 0xCB, 0x7F, 0x24, 0xCB, 0xFD, 0x42, 0x5F, 0x18, 0x24, 0x27, 0x83, 0x12, 0x60, 0xAE, 0x0C, 0x5D, 0x18, 0x27, 0xDB, 0x27, 0x99, 0x55, 0x89, 0xF7, 0xFD, 0x1D, 0x1D,
  749.     0xAB, 0xCB, 0x0B, 0x3A, 0x24, 0x24, 0x7F, 0xFD, 0xFD, 0x42, 0x40, 0x5F, 0x18, 0x7D, 0x7D, 0x83, 0xDB, 0x60, 0xE3, 0x0C, 0x5C, 0xDB, 0x27, 0x04, 0x27, 0x22, 0x99, 0x55, 0xCB, 0xF7, 0x05, 0x1D,
  750.     0xF6, 0x0B, 0xF6, 0x3A, 0x16, 0x7F, 0x7D, 0xAE, 0xE3, 0x42, 0x40, 0x7D, 0x7D, 0x18, 0x24, 0x83, 0x1F, 0x60, 0xDB, 0x5C, 0x18, 0x9C, 0x1F, 0x27, 0x27, 0xFD, 0x99, 0x4A, 0x55, 0xF7, 0x05, 0xFD,
  751.     0xFD, 0x0B, 0x3A, 0xFD, 0x16, 0x7F, 0x05, 0x7D, 0xE3, 0x42, 0x7D, 0x60, 0xBD, 0x18, 0x24, 0x83, 0x27, 0x60, 0x12, 0x5C, 0x18, 0xE3, 0x1F, 0x18, 0x27, 0xDB, 0xCB, 0xB5, 0xB5, 0x55, 0xB5, 0xB5,
  752.     0x59, 0x3A, 0xCB, 0xCB, 0xAB, 0x7F, 0xCB, 0x7D, 0x7D, 0x7D, 0xA1, 0x60, 0xA1, 0x18, 0xBD, 0x83, 0x27, 0x60, 0x5C, 0x04, 0x18, 0x9C, 0x1F, 0x04, 0x27, 0x27, 0xB5, 0x99, 0x4A, 0x22, 0x55, 0x05,
  753.   },
  754.   {}, // (This is filled with the xor texture!)
  755.   // Finish point tile
  756.   { 32, 32, 0x00, 0,0,0,0,0, // 1032 Bytes
  757.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  758.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  759.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  760.     0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  761.     0x00, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  762.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  763.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  764.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00,
  765.     0x00, 0x00, 0x00, 0xFE, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00,
  766.     0x00, 0x00, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00,
  767.     0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00,
  768.     0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00,
  769.     0x00, 0x00, 0x00, 0xFE, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0xFE, 0xFE, 0x00, 0xFE, 0xFE, 0x00, 0x00, 0xFE, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00,
  770.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  771.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0xFE, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  772.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  773.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  774.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  775.     0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  776.     0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  777.     0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  778.     0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00,
  779.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00,
  780.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00,
  781.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00,
  782.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00,
  783.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00,
  784.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00,
  785.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  786.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00,
  787.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  788.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  789.   },
  790. };
  791.  
  792.  
  793.  
  794.  
  795.  
  796. /******************************************************************************/
  797.  
  798.  
  799.  
  800.  
  801.  
  802. #define MAP_MAX 81
  803. s32 map[MAP_MAX*MAP_MAX];
  804. /******************************************************************************/
  805. /******************************************************************************/
  806. //"gdi_maze_game_2025-04-25\src\win32\_WindowProc.hpp":
  807. #ifndef _WIN32__WINDOWPROC_HPP
  808. #define _WIN32__WINDOWPROC_HPP
  809.  
  810. #include <win32/video.hpp>
  811. #include <win32/input.hpp>
  812.  
  813. #include <windowsx.h>
  814.  
  815. #include <public_stuff.hpp>
  816.  
  817.  
  818.  
  819. //assumes window is without a menu
  820. static inline Point2d CalculateWindowSize(u32 innerWidth, u32 innerHeight,
  821.                                           u32 flags,      u32 flagsEx)
  822. {
  823.   RECT winSize;
  824.   winSize.left   = 0;
  825.   winSize.top    = 0;
  826.   winSize.right  = innerWidth;
  827.   winSize.bottom = innerHeight;
  828.   AdjustWindowRectEx(&winSize, flags, false, flagsEx);
  829.  
  830.   Point2d winSizeAdjusted;
  831.   winSizeAdjusted.x = winSize.right  - winSize.left;
  832.   winSizeAdjusted.y = winSize.bottom - winSize.top;
  833.   return winSizeAdjusted;
  834.  
  835. }
  836.  
  837.  
  838.  
  839. static inline Rect2d ConvertToKitRect(RECT& rectIn){
  840.   Rect2d rectOut;
  841.   rectOut.x = rectIn.left;
  842.   rectOut.y = rectIn.top;
  843.   rectOut.w = rectIn.right  - rectIn.left;
  844.   rectOut.h = rectIn.bottom - rectIn.top;
  845.  
  846.   return rectOut;
  847.  
  848. }
  849.  
  850.  
  851.  
  852. static inline RECT ConvertFromKitRect(Rect2d& rectIn){
  853.   RECT rectOut;
  854.   rectOut.left   = rectIn.x;
  855.   rectOut.top    = rectIn.y;
  856.   rectOut.right  = rectIn.x + rectIn.w;
  857.   rectOut.bottom = rectIn.y + rectIn.h;
  858.  
  859.   return rectOut;
  860.  
  861. }
  862.  
  863.  
  864.  
  865.  
  866.  
  867. union KEY_Params {
  868.   struct {
  869.     u32 repeatCount   : 16; // 0 -> 15
  870.     u32 scanCode      :  8; //16 -> 23
  871.     u32 extendedKey   :  1; //24
  872.     u32 _reserved     :  4; //25 -> 28
  873.     u32 altKeyDown    :  1; //29
  874.     u32 prevUnpressed :  1; //30
  875.     u32 currUnpressed :  1; //31
  876.   };
  877.  
  878.   u32 value;
  879.  
  880.   KEY_Params(u32 _value) : value(_value) {}
  881.  
  882. };
  883.  
  884.  
  885.  
  886. // This event handler is used for KEY_CHAR, KEY_UP, and KEY_DOWN events
  887. static inline void HANDLE_KEY_CHARUPDOWN(Event& event,
  888.                                          bool charEvent,u8 virtualKeyCode,
  889.                                          KEY_Params& params, u16 kmods)
  890. {
  891.   if(charEvent){
  892.     event.type = EVENT_KEY_CHAR;
  893.   } else {
  894.     if(params.currUnpressed) event.type = EVENT_KEY_UP;
  895.     else                     event.type = EVENT_KEY_DOWN;
  896.   }
  897.  
  898.   event.key.kmods = kmods;
  899.  
  900.   event.key.pkey = params.scanCode;
  901.   event.key.vkey = virtualKeyCode;
  902.  
  903.   event.key.pressed = !params.currUnpressed;
  904.   event.key.repeat  = params.repeatCount>0; //modified to act as a boolean
  905.   event.key.ischar  = charEvent;
  906.  
  907. }
  908.  
  909.  
  910.  
  911.  
  912.  
  913. union MOUSE_ButtonStates {
  914.   // The positions of these bits are the same as
  915.   // the bitmasks in Event_Mouse_ButtonEnum
  916.   struct {
  917.     u8  left   : 1;
  918.     u8  middle : 1;
  919.     u8  right  : 1;
  920.     u8  x1     : 1;
  921.     u8  x2     : 1;
  922.     u8  ctrl   : 1; // 'Is the control key currently pressed?'
  923.     u8  shift  : 1; // 'Is the shift key currently pressed?'
  924.     u8 _unused : 1;
  925.   };
  926.  
  927.   u8 value;
  928.  
  929.   MOUSE_ButtonStates() : value(0) {}
  930.   MOUSE_ButtonStates(u8 _value) : value(_value) {}
  931.  
  932. };
  933.  
  934.  
  935.  
  936. extern Point2d win_size;
  937. extern MOUSE_ButtonStates mbutton_states;
  938.  
  939. // Converts window coords to canvas coords
  940. static inline void ConvertCoordinates(f32& x, f32& y){
  941.   x = (x/(win_size.x-1)) * ((f32)CANVAS_W-1.0f);
  942.   y = (y/(win_size.y-1)) * ((f32)CANVAS_H-1.0f);
  943.  
  944. }
  945.  
  946.  
  947.  
  948. static inline void HANDLE_MOUSE_MOVED(Event& event, u8 buttonStates,
  949.                                       Point2d& previous, Point2d& current)
  950. {
  951.   event.type = EVENT_MOUSE_MOVED;
  952.  
  953.   event.mouse.x = current.x;
  954.   event.mouse.y = current.y;
  955.   ConvertCoordinates(event.mouse.x, event.mouse.y);
  956.  
  957.  
  958.   Fpoint2d _previous = { (f32)previous.x, (f32)previous.y };
  959.   Fpoint2d _current = { (f32)current.x, (f32)current.y };
  960.  
  961.   ConvertCoordinates(_previous.x, _previous.y);
  962.   ConvertCoordinates(_current.x, _current.y);
  963.  
  964.   event.mouse.dx = _current.x - _previous.x;
  965.   event.mouse.dy = _current.y - _previous.y;
  966.  
  967.  
  968.   event.mouse.button  = buttonStates;
  969.   event.mouse.pressed = buttonStates!=0;
  970.  
  971. }
  972.  
  973.  
  974.  
  975. // Same event handler is used for both MOUSE_HWHEEL and MOUSE_VWHEEL events
  976. static inline void HANDLE_MOUSE_HVWHEEL(Event& event,
  977.                                         bool verticalScroll, s16 scrollAmount,
  978.                                         u8 buttonStates, Point2d& mousePos)
  979. {
  980.   if(verticalScroll){
  981.     event.type = EVENT_MOUSE_VWHEEL;
  982.     event.mouse.dy = (f32)scrollAmount/WHEEL_DELTA;
  983.   } else {
  984.     event.type = EVENT_MOUSE_HWHEEL;
  985.     event.mouse.dx = (f32)scrollAmount/WHEEL_DELTA;
  986.   }
  987.  
  988.   event.mouse.x = mousePos.x;
  989.   event.mouse.y = mousePos.y;
  990.   ConvertCoordinates(event.mouse.x, event.mouse.y);
  991.  
  992.   event.mouse.button  = buttonStates;
  993.   event.mouse.pressed = buttonStates!=0;
  994.  
  995. }
  996.  
  997.  
  998.  
  999. // Same event handler is used for both MOUSE_UP and MOUSE_DOWN events
  1000. static inline void HANDLE_MOUSE_UPDOWN(Event& event, Point2d& clickPosition,
  1001.                                        u8 buttonStates, bool pressed, bool doubleClick)
  1002. {
  1003.   if(pressed) event.type = EVENT_MOUSE_DOWN;
  1004.   else        event.type = EVENT_MOUSE_UP;
  1005.  
  1006.   event.mouse.x = clickPosition.x;
  1007.   event.mouse.y = clickPosition.y;
  1008.   ConvertCoordinates(event.mouse.x, event.mouse.y);
  1009.  
  1010.   event.mouse.button   = buttonStates;
  1011.   event.mouse.pressed  = pressed;
  1012.   event.mouse.dblClick = doubleClick;
  1013.  
  1014. }
  1015.  
  1016.  
  1017.  
  1018. static void add_event(Event& evt);
  1019.  
  1020. // flag_which must be one of the "DOWN" flags (Ex.: RI_MOUSE_BUTTON_1_DOWN)
  1021. // (Also, timestamp is assumed to have already been set inside evt!)
  1022. static void send_raw_mbutton_press(Event& evt, u16 flags,
  1023.                                    u16 flag_which, u8 button_which);
  1024.  
  1025.  
  1026.  
  1027. // This doesn't handle a single mouse event,
  1028. // but rather all of the mouse events when the cursor is trapped
  1029. static inline void HANDLE_MOUSE_RAWINPUT(Event& evt,
  1030.                                          u16 flags, f32 deltaWheel,
  1031.                                          f32 deltaX, f32 deltaY)
  1032. {
  1033.   QueryPerformanceCounter((LARGE_INTEGER*)&evt.common.timestamp);
  1034.  
  1035.  
  1036.  
  1037.   evt.mouse.button = mbutton_states.value;
  1038.  
  1039.   send_raw_mbutton_press(evt, flags, RI_MOUSE_BUTTON_1_DOWN, MBUTTON_LEFT  );
  1040.   send_raw_mbutton_press(evt, flags, RI_MOUSE_BUTTON_2_DOWN, MBUTTON_MIDDLE);
  1041.   send_raw_mbutton_press(evt, flags, RI_MOUSE_BUTTON_3_DOWN, MBUTTON_RIGHT );
  1042.   send_raw_mbutton_press(evt, flags, RI_MOUSE_BUTTON_4_DOWN, MBUTTON_X1    );
  1043.   send_raw_mbutton_press(evt, flags, RI_MOUSE_BUTTON_5_DOWN, MBUTTON_X2    );
  1044.  
  1045.   evt.mouse.pressed = evt.mouse.button!=0;
  1046.  
  1047.  
  1048.  
  1049.   if(flags&RI_MOUSE_WHEEL){
  1050.     evt.type = EVENT_MOUSE_VWHEEL;
  1051.     evt.mouse.dy = deltaWheel;
  1052.     _add_event_func: add_event(evt);
  1053.  
  1054.   } else if(flags&RI_MOUSE_HWHEEL){
  1055.     evt.type = EVENT_MOUSE_HWHEEL;
  1056.     evt.mouse.dx = deltaWheel;
  1057.     goto _add_event_func;
  1058.  
  1059.   }
  1060.  
  1061.  
  1062.  
  1063.   if(deltaX != 0.0f  ||  deltaY != 0.0f){
  1064.     evt.type = EVENT_MOUSE_MOVED;
  1065.     evt.mouse.dx = deltaX;
  1066.     evt.mouse.dy = deltaY;
  1067.     add_event(evt);
  1068.  
  1069.   }
  1070.  
  1071. }
  1072.  
  1073.  
  1074.  
  1075. #endif /* _WIN32__WINDOWPROC_HPP */
  1076.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement