--- deliantra/Deliantra-Client/Client.xs 2011/12/27 09:17:27 1.311 +++ deliantra/Deliantra-Client/Client.xs 2012/11/04 02:13:53 1.316 @@ -579,13 +579,17 @@ } static void -deliantra_main () +deliantra_main (SV *real_main) { - char *argv[] = { 0 }; - call_argv ("DC::Main::main", G_DISCARD | G_VOID, argv); + dSP; + + PUSHMARK (SP); + call_sv (real_main, G_DISCARD | G_VOID); } #ifdef __MACOSX__ + static SV *real_main; + /* to due surprising braindamage on the side of SDL design, we * do some mind-boggling hack here: SDL requires a custom main() * on OS X, so... we provide one and call the original main(), which, @@ -595,7 +599,7 @@ extern C_LINKAGE int main (int argc, char *argv[]) { - deliantra_main (); + deliantra_main (real_main); } #undef main @@ -603,16 +607,18 @@ extern C_LINKAGE int main (int argc, char *argv[]); static void - SDL_braino (void) + SDL_main_hack (SV *real_main_) { + real_main = real_main_; + char *argv[] = { "deliantra client", 0 }; (main) (1, argv); } #else static void - SDL_braino (void) + SDL_main_hack (SV *real_main) { - deliantra_main (); + deliantra_main (real_main); } #endif @@ -873,7 +879,8 @@ char *SDL_GetError () -void SDL_braino () +void SDL_main_hack (SV *real_main) + PROTOTYPE: & int SDL_Init (U32 flags) @@ -952,12 +959,9 @@ if (RETVAL) { av_clear (texture_av); - - SDL_WM_SetCaption ("Deliantra MORPG Client " VERSION, "Deliantra"); #define GL_FUNC(ptr,name) gl.name = (ptr)SDL_GL_GetProcAddress ("gl" # name); #include "glfunc.h" #undef GL_FUNC - if (!gl.ActiveTexture ) gl.ActiveTexture = gl.ActiveTextureARB; if (!gl.MultiTexCoord2f) gl.MultiTexCoord2f = gl.MultiTexCoord2fARB; } @@ -966,6 +970,9 @@ RETVAL void +SDL_WM_SetCaption (const char *title, const char *icon) + +void SDL_GL_SwapBuffers () char * @@ -1149,8 +1156,9 @@ void IMG_Init (int flags = IMG_INIT_JPG | IMG_INIT_PNG) +# MIX_INIT_MP3 gives smpeg + libstdc++ + libgcc_s void -Mix_Init (int flags = MIX_INIT_MOD | MIX_INIT_MP3 | MIX_INIT_OGG) +Mix_Init (int flags = MIX_INIT_MOD | MIX_INIT_OGG) void load_image_inline (SV *image_) @@ -2026,7 +2034,7 @@ } SV * -map1a_update (DC::Map self, SV *data_, int extmap) +map1a_update (DC::Map self, SV *data_) CODE: { uint8_t *data = (uint8_t *)SvPVbyte_nolen (data_); @@ -2057,44 +2065,39 @@ if (flags & 8) { - if (extmap) + uint8_t ext, cmd; + + do { - uint8_t ext, cmd; + ext = *data++; + cmd = ext & 0x7f; - do + if (cmd < 4) + cell->darkness = 255 - ext * 64 + 1; /* make sure this doesn't collide with FOW_DARKNESS */ + else if (cmd == 5) // health + { + cell->stat_width = 1; + cell->stat_hp = *data++; + } + else if (cmd == 6) // monster width + cell->stat_width = *data++ + 1; + else if (cmd == 0x47) { - ext = *data++; - cmd = ext & 0x7f; + if (*data == 1) cell->player = data [1]; + else if (*data == 2) cell->player = data [2] + (data [1] << 8); + else if (*data == 3) cell->player = data [3] + (data [2] << 8) + (data [1] << 16); + else if (*data == 4) cell->player = data [4] + (data [3] << 8) + (data [2] << 16) + (data [1] << 24); - if (cmd < 4) - cell->darkness = 255 - ext * 64 + 1; /* make sure this doesn't collide with FOW_DARKNESS */ - else if (cmd == 5) // health - { - cell->stat_width = 1; - cell->stat_hp = *data++; - } - else if (cmd == 6) // monster width - cell->stat_width = *data++ + 1; - else if (cmd == 0x47) - { - if (*data == 1) cell->player = data [1]; - else if (*data == 2) cell->player = data [2] + (data [1] << 8); - else if (*data == 3) cell->player = data [3] + (data [2] << 8) + (data [1] << 16); - else if (*data == 4) cell->player = data [4] + (data [3] << 8) + (data [2] << 16) + (data [1] << 24); - - data += *data + 1; - } - else if (cmd == 8) // cell flags - cell->flags = *data++; - else if (ext & 0x40) // unknown, multibyte => skip - data += *data + 1; - else - data++; + data += *data + 1; } - while (ext & 0x80); + else if (cmd == 8) // cell flags + cell->flags = *data++; + else if (ext & 0x40) // unknown, multibyte => skip + data += *data + 1; + else + data++; } - else - cell->darkness = *data++ + 1; + while (ext & 0x80); } for (z = 0; z <= 2; ++z)