--- deliantra/Deliantra-Client/Client.xs 2008/07/13 12:17:00 1.261 +++ deliantra/Deliantra-Client/Client.xs 2008/08/20 13:30:02 1.273 @@ -41,6 +41,11 @@ #include #include +/* work around os x broken headers */ +#ifdef __MACOSX__ +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +#endif + #define PANGO_ENABLE_BACKEND #define G_DISABLE_CAST_CHECKS @@ -88,12 +93,6 @@ /* mask out modifiers we are not interested in */ #define MOD_MASK (KMOD_CTRL | KMOD_SHIFT | KMOD_ALT | KMOD_META) -#if 1 -# define PARACHUTE SDL_INIT_NOPARACHUTE -#else -# define PARACHUTE 0 -#endif - static AV *texture_av; static struct @@ -375,6 +374,16 @@ self->rows = 0; } +#define CELL_CLEAR(cell) \ + do { \ + if ((cell)->player) \ + (cell)->tile [2] = 0; \ + (cell)->darkness = 0; \ + (cell)->stat_hp = 0; \ + (cell)->flags = 0; \ + (cell)->player = 0; \ + } while (0) + static void map_blank (DC__Map self, int x0, int y0, int w, int h) { @@ -398,10 +407,7 @@ cell = row->col + x - row->c0; - cell->darkness = 0; - cell->stat_hp = 0; - cell->flags = 0; - cell->player = 0; + CELL_CLEAR (cell); } } } @@ -523,6 +529,45 @@ return 1; } +static void +deliantra_main () +{ + char *argv[] = { 0 }; + call_argv ("::main", G_DISCARD | G_VOID, argv); + dSP; +} + +#ifdef __MACOSX__ + /* 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, + * due to share dlibrary magic, calls -lSDLmain's main, not perl's main, + * and which calls our main (== SDL_main) back. + */ + extern C_LINKAGE int + main (int argc, char *argv[]) + { + deliantra_main (); + } + + #undef main + + extern C_LINKAGE int main (int argc, char *argv[]); + + static void + SDL_braino (void) + { + char *argv[] = { "deliantra client", 0 }; + (main) (1, argv); + } +#else + static void + SDL_braino (void) + { + deliantra_main (); + } +#endif + MODULE = Deliantra::Client PACKAGE = DC PROTOTYPES: ENABLE @@ -646,6 +691,35 @@ const_iv (KMOD_MODE), const_iv (MIX_DEFAULT_FORMAT), + + const_iv (SDL_INIT_TIMER), + const_iv (SDL_INIT_AUDIO), + const_iv (SDL_INIT_VIDEO), + const_iv (SDL_INIT_CDROM), + const_iv (SDL_INIT_JOYSTICK), + const_iv (SDL_INIT_EVERYTHING), + const_iv (SDL_INIT_NOPARACHUTE), + const_iv (SDL_INIT_EVENTTHREAD), + + const_iv (SDL_GL_RED_SIZE), + const_iv (SDL_GL_GREEN_SIZE), + const_iv (SDL_GL_BLUE_SIZE), + const_iv (SDL_GL_ALPHA_SIZE), + const_iv (SDL_GL_DOUBLEBUFFER), + const_iv (SDL_GL_BUFFER_SIZE), + const_iv (SDL_GL_DEPTH_SIZE), + const_iv (SDL_GL_STENCIL_SIZE), + const_iv (SDL_GL_ACCUM_RED_SIZE), + const_iv (SDL_GL_ACCUM_GREEN_SIZE), + const_iv (SDL_GL_ACCUM_BLUE_SIZE), + const_iv (SDL_GL_ACCUM_ALPHA_SIZE), + const_iv (SDL_GL_STEREO), + const_iv (SDL_GL_MULTISAMPLEBUFFERS), + const_iv (SDL_GL_MULTISAMPLESAMPLES), + const_iv (SDL_GL_ACCELERATED_VISUAL), + const_iv (SDL_GL_SWAP_CONTROL), + + const_iv (FOW_DARKNESS) # undef const_iv }; @@ -691,14 +765,26 @@ #endif } -char * -SDL_GetError () +char *SDL_GetError () -int -SDL_Init (U32 flags = SDL_INIT_VIDEO | SDL_INIT_AUDIO | PARACHUTE) +void SDL_braino () -void -SDL_Quit () +int SDL_Init (U32 flags) + +int SDL_InitSubSystem (U32 flags) + +void SDL_QuitSubSystem (U32 flags) + +void SDL_Quit () + +int SDL_GL_SetAttribute (int attr, int value) + +int SDL_GL_GetAttribute (int attr) + CODE: + if (SDL_GL_GetAttribute (attr, &RETVAL)) + XSRETURN_UNDEF; + OUTPUT: + RETVAL void SDL_ListModes (int rgb, int alpha) @@ -720,17 +806,14 @@ SDL_GL_SetAttribute (SDL_GL_ACCUM_ALPHA_SIZE, 0); SDL_GL_SetAttribute (SDL_GL_DOUBLEBUFFER, 1); -#if SDL_VERSION_ATLEAST(1,2,10) - SDL_GL_SetAttribute (SDL_GL_ACCELERATED_VISUAL, 1); SDL_GL_SetAttribute (SDL_GL_SWAP_CONTROL, 1); -#endif m = SDL_ListModes (0, SDL_FULLSCREEN | SDL_OPENGL); if (m && m != (SDL_Rect **)-1) while (*m) { - if ((*m)->w >= 800 && (*m)->h >= 480) + if ((*m)->w >= 400 && (*m)->h >= 300) { AV *av = newAV (); av_push (av, newSViv ((*m)->w)); @@ -1754,7 +1837,7 @@ } } else - cell->darkness = 0; + CELL_CLEAR (cell); } } OUTPUT: @@ -1816,7 +1899,7 @@ RETVAL void -draw (DC::Map self, int mx, int my, int sw, int sh, int T, U32 player = 0xffffffff, int pdx = 0, int pdy = 0) +draw (DC::Map self, int mx, int my, int sw, int sh, int T, U32 player = 0xffffffff, int sdx = 0, int sdy = 0) CODE: { int x, y, z; @@ -1827,13 +1910,12 @@ smooth_key skey; int pl_x, pl_y; maptex pl_tex; - - pl_tex.name = 0; - rc_t *rc = rc_alloc (); rc_key_t key; rc_array_t *arr; + pl_tex.name = 0; + // thats current max. sorry. if (sw > 255) sw = 255; if (sh > 255) sh = 255; @@ -2074,8 +2156,8 @@ if (pl_tex.name) { maptex tex = pl_tex; - int px = pl_x + pdx; - int py = pl_y + pdy; + int px = pl_x + sdx; + int py = pl_y + sdy; key.texname = tex.name; arr = rc_array (rc, &key); @@ -2202,7 +2284,7 @@ mx += self->x - 1; my += self->y - 1; - memset (darkness1, 255, sw1 * sh1); + memset (darkness1, 255 - FOW_DARKNESS, sw1 * sh1); for (y = 0; y < sh1; y++) if (0 <= y + my && y + my < self->rows)