ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/Deliantra-Client/Client.xs
(Generate patch)

Comparing deliantra/Deliantra-Client/Client.xs (file contents):
Revision 1.305 by root, Sun May 2 21:22:20 2010 UTC vs.
Revision 1.313 by root, Sat Jan 7 15:24:41 2012 UTC

99 99
100#define KMOD_LRAM 0x10000 // our extension 100#define KMOD_LRAM 0x10000 // our extension
101 101
102#define TEXID_SPEECH 1 102#define TEXID_SPEECH 1
103#define TEXID_NOFACE 2 103#define TEXID_NOFACE 2
104
105static char *
106fast_sv_grow (SV *sv, STRLEN need)
107{
108 STRLEN len = SvLEN (sv);
109 STRLEN want = SvCUR (sv) + need;
110
111 if (expect_false (len < want))
112 {
113 do
114 len *= 2;
115 while (len < want);
116
117 sv_grow (sv, len);
118 }
119
120 SvCUR_set (sv, want);
121 return SvEND (sv) - need;
122}
104 123
105static AV *texture_av; 124static AV *texture_av;
106 125
107static struct 126static struct
108{ 127{
463 482
464 SDL_PushEvent ((SDL_Event *)&ev); 483 SDL_PushEvent ((SDL_Event *)&ev);
465} 484}
466 485
467static unsigned int 486static unsigned int
487div255 (unsigned int n)
488{
489 return (n + (n >> 8)) >> 8;
490}
491
492static unsigned int
468minpot (unsigned int n) 493minpot (unsigned int n)
469{ 494{
470 if (!n) 495 if (!n)
471 return 0; 496 return 0;
472 497
555 580
556static void 581static void
557deliantra_main () 582deliantra_main ()
558{ 583{
559 char *argv[] = { 0 }; 584 char *argv[] = { 0 };
560 call_argv ("::main", G_DISCARD | G_VOID, argv); 585 call_argv ("DC::Main::main", G_DISCARD | G_VOID, argv);
561} 586}
562 587
563#ifdef __MACOSX__ 588#ifdef __MACOSX__
564 /* to due surprising braindamage on the side of SDL design, we 589 /* to due surprising braindamage on the side of SDL design, we
565 * do some mind-boggling hack here: SDL requires a custom main() 590 * do some mind-boggling hack here: SDL requires a custom main()
566 * on OS X, so... we provide one and call the original main(), which, 591 * on OS X, so... we provide one and call the original main(), which,
567 * due to share dlibrary magic, calls -lSDLmain's main, not perl's main, 592 * due to shared library magic, calls -lSDLmain's main, not perl's main,
568 * and which calls our main (== SDL_main) back. 593 * and which calls our main (== SDL_main) back.
569 */ 594 */
570 extern C_LINKAGE int 595 extern C_LINKAGE int
571 main (int argc, char *argv[]) 596 main (int argc, char *argv[])
572 { 597 {
796 821
797 const_iv (FOW_DARKNESS) 822 const_iv (FOW_DARKNESS)
798# undef const_iv 823# undef const_iv
799 }; 824 };
800 825
801 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; ) 826 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ > const_iv; civ--)
802 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv)); 827 newCONSTSUB (stash, (char *)civ[-1].name, newSViv (civ[-1].iv));
803 828
804 assert (SDLK_MODIFIER_MIN == SDLK_NUMLOCK); 829 assert (SDLK_MODIFIER_MIN == SDLK_NUMLOCK);
805 assert (SDLK_MODIFIER_MAX == SDLK_COMPOSE); 830 assert (SDLK_MODIFIER_MAX == SDLK_COMPOSE);
806} 831}
807 832
925 ); 950 );
926 951
927 if (RETVAL) 952 if (RETVAL)
928 { 953 {
929 av_clear (texture_av); 954 av_clear (texture_av);
930
931 SDL_WM_SetCaption ("Deliantra MORPG Client " VERSION, "Deliantra");
932#define GL_FUNC(ptr,name) gl.name = (ptr)SDL_GL_GetProcAddress ("gl" # name); 955#define GL_FUNC(ptr,name) gl.name = (ptr)SDL_GL_GetProcAddress ("gl" # name);
933#include "glfunc.h" 956#include "glfunc.h"
934#undef GL_FUNC 957#undef GL_FUNC
935
936 if (!gl.ActiveTexture ) gl.ActiveTexture = gl.ActiveTextureARB; 958 if (!gl.ActiveTexture ) gl.ActiveTexture = gl.ActiveTextureARB;
937 if (!gl.MultiTexCoord2f) gl.MultiTexCoord2f = gl.MultiTexCoord2fARB; 959 if (!gl.MultiTexCoord2f) gl.MultiTexCoord2f = gl.MultiTexCoord2fARB;
938 } 960 }
939} 961}
940 OUTPUT: 962 OUTPUT:
941 RETVAL 963 RETVAL
942 964
943void 965void
966SDL_WM_SetCaption (const char *title, const char *icon)
967
968void
944SDL_GL_SwapBuffers () 969SDL_GL_SwapBuffers ()
945 970
946char * 971char *
947SDL_GetKeyName (int sym) 972SDL_GetKeyName (int sym)
948 973
950SDL_GetAppState () 975SDL_GetAppState ()
951 976
952int 977int
953SDL_GetModState () 978SDL_GetModState ()
954 979
980int
981SDL_WaitEvent ()
982 C_ARGS: 0
983
955void 984void
985SDL_PumpEvents ()
986
987void
956poll_events () 988peep_events ()
957 PPCODE: 989 PPCODE:
958{ 990{
959 SDL_Event ev; 991 SDL_Event ev;
960 992
961 SDL_PumpEvents (); 993 SDL_PumpEvents ();
1114 OUTPUT: 1146 OUTPUT:
1115 RETVAL 1147 RETVAL
1116 1148
1117void 1149void
1118IMG_Init (int flags = IMG_INIT_JPG | IMG_INIT_PNG) 1150IMG_Init (int flags = IMG_INIT_JPG | IMG_INIT_PNG)
1151
1152# MIX_INIT_MP3 gives smpeg + libstdc++ + libgcc_s
1153void
1154Mix_Init (int flags = MIX_INIT_MOD | MIX_INIT_OGG)
1119 1155
1120void 1156void
1121load_image_inline (SV *image_) 1157load_image_inline (SV *image_)
1122 ALIAS: 1158 ALIAS:
1123 load_image_file = 1 1159 load_image_file = 1
2115 ? self->row + y 2151 ? self->row + y
2116 : 0; 2152 : 0;
2117 2153
2118 for (x = x0; x < x1; x++) 2154 for (x = x0; x < x1; x++)
2119 { 2155 {
2120 int r = 32, g = 32, b = 32, a = 192; 2156 unsigned int r = 32, g = 32, b = 32, a = 192;
2121 2157
2122 if (row && row->c0 <= x && x < row->c1) 2158 if (row && row->c0 <= x && x < row->c1)
2123 { 2159 {
2124 mapcell *cell = row->col + (x - row->c0); 2160 mapcell *cell = row->col + (x - row->c0);
2125 2161
2127 { 2163 {
2128 maptex tex = self->tex [cell->tile [z]]; 2164 maptex tex = self->tex [cell->tile [z]];
2129 int a0 = 255 - tex.a; 2165 int a0 = 255 - tex.a;
2130 int a1 = tex.a; 2166 int a1 = tex.a;
2131 2167
2132 r = (r * a0 + tex.r * a1) / 255; 2168 r = div255 (r * a0 + tex.r * a1);
2133 g = (g * a0 + tex.g * a1) / 255; 2169 g = div255 (g * a0 + tex.g * a1);
2134 b = (b * a0 + tex.b * a1) / 255; 2170 b = div255 (b * a0 + tex.b * a1);
2135 a = (a * a0 + tex.a * a1) / 255; 2171 a = div255 (a * a0 + tex.a * a1);
2136 } 2172 }
2137 } 2173 }
2138 2174
2139 *map++ = (r ) 2175 *map++ = (r )
2140 | (g << 8) 2176 | (g << 8)
2147} 2183}
2148 OUTPUT: 2184 OUTPUT:
2149 RETVAL 2185 RETVAL
2150 2186
2151void 2187void
2152draw (DC::Map self, int mx, int my, int sw, int sh, int T, U32 player = 0xffffffff, int sdx = 0, int sdy = 0) 2188draw (DC::Map self, int mx, int my, int sw, int sh, int Tw, int Th, U32 player = 0xffffffff, int sdx = 0, int sdy = 0)
2153 CODE: 2189 CODE:
2154{ 2190{
2155 int x, y, z; 2191 int x, y, z;
2156 2192
2157 HV *smooth = (HV *)sv_2mortal ((SV *)newHV ()); 2193 HV *smooth = (HV *)sv_2mortal ((SV *)newHV ());
2241 2277
2242 key.texname = tex.name; 2278 key.texname = tex.name;
2243 arr = rc_array (rc, &key); 2279 arr = rc_array (rc, &key);
2244 } 2280 }
2245 2281
2246 px = (x + 1) * T - tex.w; 2282 px = (x + 1) * Th - tex.w;
2247 py = (y + 1) * T - tex.h; 2283 py = (y + 1) * Tw - tex.h;
2248 2284
2249 if (expect_false (cell->player == player) && expect_false (z == 2)) 2285 if (expect_false (cell->player == player) && expect_false (z == 2))
2250 { 2286 {
2251 pl_x = px; 2287 pl_x = px;
2252 pl_y = py; 2288 pl_y = py;
2305 if (cell->flags & 1) 2341 if (cell->flags & 1)
2306 { 2342 {
2307 rc_key_t key_ov = key; 2343 rc_key_t key_ov = key;
2308 maptex tex = self->tex [TEXID_SPEECH]; 2344 maptex tex = self->tex [TEXID_SPEECH];
2309 rc_array_t *arr; 2345 rc_array_t *arr;
2310 int px = x * T + T * 2 / 32; 2346 int px = x * Tw + Tw * 2 / 32;
2311 int py = y * T - T * 6 / 32; 2347 int py = y * Th - Th * 6 / 32;
2312 2348
2313 key_ov.texname = tex.name; 2349 key_ov.texname = tex.name;
2314 arr = rc_array (rc_ov, &key_ov); 2350 arr = rc_array (rc_ov, &key_ov);
2315 2351
2316 rc_t2f_v3f (arr, 0 , 0 , px , py , 0); 2352 rc_t2f_v3f (arr, 0 , 0 , px , py , 0);
2317 rc_t2f_v3f (arr, 0 , tex.t, px , py + T, 0); 2353 rc_t2f_v3f (arr, 0 , tex.t, px , py + Th, 0);
2318 rc_t2f_v3f (arr, tex.s, tex.t, px + T, py + T, 0); 2354 rc_t2f_v3f (arr, tex.s, tex.t, px + Tw, py + Th, 0);
2319 rc_t2f_v3f (arr, tex.s, 0 , px + T, py , 0); 2355 rc_t2f_v3f (arr, tex.s, 0 , px + Tw, py , 0);
2320 } 2356 }
2321 } 2357 }
2322 } 2358 }
2323 } 2359 }
2324 2360
2351 if (!(bits & 0x1000) 2387 if (!(bits & 0x1000)
2352 && skey->level == level 2388 && skey->level == level
2353 && level > smooth_max [skey->x][skey->y]) 2389 && level > smooth_max [skey->x][skey->y])
2354 { 2390 {
2355 maptex tex = self->tex [skey->tile]; 2391 maptex tex = self->tex [skey->tile];
2356 int px = (((int)skey->x) - 1) * T; 2392 int px = (((int)skey->x) - 1) * Tw;
2357 int py = (((int)skey->y) - 1) * T; 2393 int py = (((int)skey->y) - 1) * Th;
2358 int border = bits & 15; 2394 int border = bits & 15;
2359 int corner = (bits >> 8) & ~(bits >> 4) & 15; 2395 int corner = (bits >> 8) & ~(bits >> 4) & 15;
2360 float dx = tex.s * .0625f; // 16 images/row 2396 float dx = tex.s * .0625f; // 16 images/row
2361 float dy = tex.t * .5f ; // 2 images/column 2397 float dy = tex.t * .5f ; // 2 images/column
2362 2398
2375 2411
2376 if (border) 2412 if (border)
2377 { 2413 {
2378 float ox = border * dx; 2414 float ox = border * dx;
2379 2415
2380 glTexCoord2f (ox , 0.f ); glVertex2i (px , py ); 2416 glTexCoord2f (ox , 0.f ); glVertex2i (px , py );
2381 glTexCoord2f (ox , dy ); glVertex2i (px , py + T); 2417 glTexCoord2f (ox , dy ); glVertex2i (px , py + Th);
2382 glTexCoord2f (ox + dx, dy ); glVertex2i (px + T, py + T); 2418 glTexCoord2f (ox + dx, dy ); glVertex2i (px + Tw, py + Th);
2383 glTexCoord2f (ox + dx, 0.f ); glVertex2i (px + T, py ); 2419 glTexCoord2f (ox + dx, 0.f ); glVertex2i (px + Tw, py );
2384 } 2420 }
2385 2421
2386 if (corner) 2422 if (corner)
2387 { 2423 {
2388 float ox = corner * dx; 2424 float ox = corner * dx;
2389 2425
2390 glTexCoord2f (ox , dy ); glVertex2i (px , py ); 2426 glTexCoord2f (ox , dy ); glVertex2i (px , py );
2391 glTexCoord2f (ox , dy * 2.f); glVertex2i (px , py + T); 2427 glTexCoord2f (ox , dy * 2.f); glVertex2i (px , py + Th);
2392 glTexCoord2f (ox + dx, dy * 2.f); glVertex2i (px + T, py + T); 2428 glTexCoord2f (ox + dx, dy * 2.f); glVertex2i (px + Tw, py + Th);
2393 glTexCoord2f (ox + dx, dy ); glVertex2i (px + T, py ); 2429 glTexCoord2f (ox + dx, dy ); glVertex2i (px + Tw, py );
2394 } 2430 }
2395 } 2431 }
2396 } 2432 }
2397 } 2433 }
2398 } 2434 }
2439 for (x = 0; x < sw; x++) 2475 for (x = 0; x < sw; x++)
2440 if (row->c0 <= x + mx && x + mx < row->c1) 2476 if (row->c0 <= x + mx && x + mx < row->c1)
2441 { 2477 {
2442 mapcell *cell = row->col + (x + mx - row->c0); 2478 mapcell *cell = row->col + (x + mx - row->c0);
2443 2479
2444 int px = x * T; 2480 int px = x * Tw;
2445 int py = y * T; 2481 int py = y * Th;
2446 2482
2447 if (expect_false (cell->player == player)) 2483 if (expect_false (cell->player == player))
2448 { 2484 {
2449 px += sdx; 2485 px += sdx;
2450 py += sdy; 2486 py += sdy;
2451 } 2487 }
2452 2488
2453 if (cell->stat_hp) 2489 if (cell->stat_hp)
2454 { 2490 {
2455 int width = cell->stat_width * T; 2491 int width = cell->stat_width * Tw;
2456 int thick = (sh * T / 32 + 27) / 28 + 1 + cell->stat_width; 2492 int thick = (sh * Th / 32 + 27) / 28 + 1 + cell->stat_width;
2457 2493
2458 glColor3ub (0, 0, 0); 2494 glColor3ub (0, 0, 0);
2459 glRectf (px + 1, py - thick - 2, 2495 glRectf (px + 1, py - thick - 2,
2460 px + width - 1, py); 2496 px + width - 1, py);
2461 2497
2541 int x, y; 2577 int x, y;
2542 int sw1 = sw + 2; 2578 int sw1 = sw + 2;
2543 int sh1 = sh + 2; 2579 int sh1 = sh + 2;
2544 int sh3 = sh * 3; 2580 int sh3 = sh * 3;
2545 int sw3 = sw * 3; 2581 int sw3 = sw * 3;
2546 uint8_t *darkness1 = (uint8_t *)malloc (sw1 * sh1);
2547 SV *darkness3_sv = sv_2mortal (newSV (sw3 * sh3)); 2582 SV *darkness3_sv = sv_2mortal (newSV (sw3 * sh3));
2548 uint8_t *darkness3 = (uint8_t *)SvPVX (darkness3_sv); 2583 uint8_t *darkness3 = (uint8_t *)SvPVX (darkness3_sv);
2584 uint8_t *darkness1 = (uint8_t *)malloc (sw1 * sh1);
2585 memset (darkness1, 0, sw1*sh1);
2549 2586
2550 SvPOK_only (darkness3_sv); 2587 SvPOK_only (darkness3_sv);
2551 SvCUR_set (darkness3_sv, sw3 * sh3); 2588 SvCUR_set (darkness3_sv, sw3 * sh3);
2552 2589
2553 mx += self->x - 1; 2590 mx += self->x - 1;
3132 const_iv (GL_FUNC_SUBTRACT), 3169 const_iv (GL_FUNC_SUBTRACT),
3133 const_iv (GL_FUNC_REVERSE_SUBTRACT), 3170 const_iv (GL_FUNC_REVERSE_SUBTRACT),
3134# undef const_iv 3171# undef const_iv
3135 }; 3172 };
3136 3173
3137 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; ) 3174 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ > const_iv; civ--)
3138 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv)); 3175 newCONSTSUB (stash, (char *)civ[-1].name, newSViv (civ[-1].iv));
3139 3176
3140 texture_av = newAV (); 3177 texture_av = newAV ();
3141 AvREAL_off (texture_av); 3178 AvREAL_off (texture_av);
3142} 3179}
3143 3180

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines