--- deliantra/Deliantra-Client/Client.xs 2012/01/07 15:24:41 1.313 +++ deliantra/Deliantra-Client/Client.xs 2014/12/24 06:12:21 1.318 @@ -50,7 +50,7 @@ #define PANGO_ENABLE_BACKEND #define G_DISABLE_CAST_CHECKS -#include +#include #include @@ -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) @@ -1487,7 +1494,7 @@ set_height (DC::Layout self, int base_height) CODE: if (self->base_height != base_height) - { + { self->base_height = base_height; layout_update_font (self); } @@ -2027,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_); @@ -2058,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)