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.296 by root, Mon Dec 21 23:52:34 2009 UTC vs.
Revision 1.317 by root, Fri Nov 23 12:39:05 2012 UTC

41#include <SDL_opengl.h> 41#include <SDL_opengl.h>
42 42
43/* work around os x broken headers */ 43/* work around os x broken headers */
44#ifdef __MACOSX__ 44#ifdef __MACOSX__
45typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); 45typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
46typedef void (APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture);
47typedef void (APIENTRYP PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t);
46#endif 48#endif
47 49
48#define PANGO_ENABLE_BACKEND 50#define PANGO_ENABLE_BACKEND
49#define G_DISABLE_CAST_CHECKS 51#define G_DISABLE_CAST_CHECKS
50 52
97 99
98#define KMOD_LRAM 0x10000 // our extension 100#define KMOD_LRAM 0x10000 // our extension
99 101
100#define TEXID_SPEECH 1 102#define TEXID_SPEECH 1
101#define TEXID_NOFACE 2 103#define TEXID_NOFACE 2
102#define TEXID_HIDDEN 3 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}
103 123
104static AV *texture_av; 124static AV *texture_av;
105 125
106static struct 126static struct
107{ 127{
462 482
463 SDL_PushEvent ((SDL_Event *)&ev); 483 SDL_PushEvent ((SDL_Event *)&ev);
464} 484}
465 485
466static unsigned int 486static unsigned int
487div255 (unsigned int n)
488{
489 return (n + (n >> 8)) >> 8;
490}
491
492static unsigned int
467minpot (unsigned int n) 493minpot (unsigned int n)
468{ 494{
469 if (!n) 495 if (!n)
470 return 0; 496 return 0;
471 497
551 577
552 return mod; 578 return mod;
553} 579}
554 580
555static void 581static void
556deliantra_main () 582deliantra_main (SV *real_main)
557{ 583{
558 char *argv[] = { 0 }; 584 dSP;
559 call_argv ("::main", G_DISCARD | G_VOID, argv); 585
586 PUSHMARK (SP);
587 call_sv (real_main, G_DISCARD | G_VOID);
560} 588}
561 589
562#ifdef __MACOSX__ 590#ifdef __MACOSX__
591 static SV *real_main;
592
563 /* to due surprising braindamage on the side of SDL design, we 593 /* to due surprising braindamage on the side of SDL design, we
564 * do some mind-boggling hack here: SDL requires a custom main() 594 * do some mind-boggling hack here: SDL requires a custom main()
565 * on OS X, so... we provide one and call the original main(), which, 595 * on OS X, so... we provide one and call the original main(), which,
566 * due to share dlibrary magic, calls -lSDLmain's main, not perl's main, 596 * due to shared library magic, calls -lSDLmain's main, not perl's main,
567 * and which calls our main (== SDL_main) back. 597 * and which calls our main (== SDL_main) back.
568 */ 598 */
569 extern C_LINKAGE int 599 extern C_LINKAGE int
570 main (int argc, char *argv[]) 600 main (int argc, char *argv[])
571 { 601 {
572 deliantra_main (); 602 deliantra_main (real_main);
573 } 603 }
574 604
575 #undef main 605 #undef main
576 606
577 extern C_LINKAGE int main (int argc, char *argv[]); 607 extern C_LINKAGE int main (int argc, char *argv[]);
578 608
579 static void 609 static void
580 SDL_braino (void) 610 SDL_main_hack (SV *real_main_)
581 { 611 {
612 real_main = real_main_;
613
582 char *argv[] = { "deliantra client", 0 }; 614 char *argv[] = { "deliantra client", 0 };
583 (main) (1, argv); 615 (main) (1, argv);
584 } 616 }
585#else 617#else
586 static void 618 static void
587 SDL_braino (void) 619 SDL_main_hack (SV *real_main)
588 { 620 {
589 deliantra_main (); 621 deliantra_main (real_main);
590 } 622 }
591#endif 623#endif
592 624
593MODULE = Deliantra::Client PACKAGE = DC 625MODULE = Deliantra::Client PACKAGE = DC
594 626
795 827
796 const_iv (FOW_DARKNESS) 828 const_iv (FOW_DARKNESS)
797# undef const_iv 829# undef const_iv
798 }; 830 };
799 831
800 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; ) 832 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ > const_iv; civ--)
801 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv)); 833 newCONSTSUB (stash, (char *)civ[-1].name, newSViv (civ[-1].iv));
802 834
803 assert (SDLK_MODIFIER_MIN == SDLK_NUMLOCK); 835 assert (SDLK_MODIFIER_MIN == SDLK_NUMLOCK);
804 assert (SDLK_MODIFIER_MAX == SDLK_COMPOSE); 836 assert (SDLK_MODIFIER_MAX == SDLK_COMPOSE);
805} 837}
806 838
845#endif 877#endif
846} 878}
847 879
848char *SDL_GetError () 880char *SDL_GetError ()
849 881
850void SDL_braino () 882void SDL_main_hack (SV *real_main)
883 PROTOTYPE: &
851 884
852int SDL_Init (U32 flags) 885int SDL_Init (U32 flags)
853 886
854int SDL_InitSubSystem (U32 flags) 887int SDL_InitSubSystem (U32 flags)
855 888
924 ); 957 );
925 958
926 if (RETVAL) 959 if (RETVAL)
927 { 960 {
928 av_clear (texture_av); 961 av_clear (texture_av);
929
930 SDL_WM_SetCaption ("Deliantra MORPG Client " VERSION, "Deliantra");
931#define GL_FUNC(ptr,name) gl.name = (ptr)SDL_GL_GetProcAddress ("gl" # name); 962#define GL_FUNC(ptr,name) gl.name = (ptr)SDL_GL_GetProcAddress ("gl" # name);
932#include "glfunc.h" 963#include "glfunc.h"
933#undef GL_FUNC 964#undef GL_FUNC
965 if (!gl.ActiveTexture ) gl.ActiveTexture = gl.ActiveTextureARB;
966 if (!gl.MultiTexCoord2f) gl.MultiTexCoord2f = gl.MultiTexCoord2fARB;
934 } 967 }
935} 968}
936 OUTPUT: 969 OUTPUT:
937 RETVAL 970 RETVAL
938 971
939void 972void
973SDL_WM_SetCaption (const char *title, const char *icon)
974
975void
940SDL_GL_SwapBuffers () 976SDL_GL_SwapBuffers ()
941 977
942char * 978char *
943SDL_GetKeyName (int sym) 979SDL_GetKeyName (int sym)
944 980
946SDL_GetAppState () 982SDL_GetAppState ()
947 983
948int 984int
949SDL_GetModState () 985SDL_GetModState ()
950 986
987int
988SDL_WaitEvent ()
989 C_ARGS: 0
990
951void 991void
992SDL_PumpEvents ()
993
994void
952poll_events () 995peep_events ()
953 PPCODE: 996 PPCODE:
954{ 997{
955 SDL_Event ev; 998 SDL_Event ev;
956 999
957 SDL_PumpEvents (); 1000 SDL_PumpEvents ();
1023 1066
1024 XPUSHs (sv_2mortal (sv_bless (newRV_noinc ((SV *)hv), gv_stashpv ("DC::UI::Event", 1)))); 1067 XPUSHs (sv_2mortal (sv_bless (newRV_noinc ((SV *)hv), gv_stashpv ("DC::UI::Event", 1))));
1025 } 1068 }
1026} 1069}
1027 1070
1071char *
1072SDL_AudioDriverName ()
1073 CODE:
1074{
1075 char buf [256];
1076 if (!SDL_AudioDriverName (buf, sizeof (buf)))
1077 XSRETURN_UNDEF;
1078
1079 RETVAL = buf;
1080}
1081 OUTPUT:
1082 RETVAL
1083
1028int 1084int
1029Mix_OpenAudio (int frequency = 44100, int format = MIX_DEFAULT_FORMAT, int channels = 2, int chunksize = 4096) 1085Mix_OpenAudio (int frequency = 44100, int format = MIX_DEFAULT_FORMAT, int channels = 2, int chunksize = 4096)
1030 POSTCALL: 1086 POSTCALL:
1031 Mix_HookMusicFinished (music_finished); 1087 Mix_HookMusicFinished (music_finished);
1032 Mix_ChannelFinished (channel_finished); 1088 Mix_ChannelFinished (channel_finished);
1094add_font (char *file) 1150add_font (char *file)
1095 CODE: 1151 CODE:
1096 RETVAL = FcConfigAppFontAddFile (0, (const FcChar8 *)file); 1152 RETVAL = FcConfigAppFontAddFile (0, (const FcChar8 *)file);
1097 OUTPUT: 1153 OUTPUT:
1098 RETVAL 1154 RETVAL
1155
1156void
1157IMG_Init (int flags = IMG_INIT_JPG | IMG_INIT_PNG)
1158
1159# MIX_INIT_MP3 gives smpeg + libstdc++ + libgcc_s
1160void
1161Mix_Init (int flags = MIX_INIT_MOD | MIX_INIT_OGG)
1099 1162
1100void 1163void
1101load_image_inline (SV *image_) 1164load_image_inline (SV *image_)
1102 ALIAS: 1165 ALIAS:
1103 load_image_file = 1 1166 load_image_file = 1
1429 1492
1430void 1493void
1431set_height (DC::Layout self, int base_height) 1494set_height (DC::Layout self, int base_height)
1432 CODE: 1495 CODE:
1433 if (self->base_height != base_height) 1496 if (self->base_height != base_height)
1434 { 1497 {
1435 self->base_height = base_height; 1498 self->base_height = base_height;
1436 layout_update_font (self); 1499 layout_update_font (self);
1437 } 1500 }
1438 1501
1439void 1502void
1671void 1734void
1672draw_fow_texture (float intensity, int hidden_tex, int name1, uint8_t *data1, float s, float t, int w, int h, float blend = 0.f, int dx = 0, int dy = 0, int name2 = 0, uint8_t *data2 = data1) 1735draw_fow_texture (float intensity, int hidden_tex, int name1, uint8_t *data1, float s, float t, int w, int h, float blend = 0.f, int dx = 0, int dy = 0, int name2 = 0, uint8_t *data2 = data1)
1673 PROTOTYPE: @ 1736 PROTOTYPE: @
1674 CODE: 1737 CODE:
1675{ 1738{
1739 glEnable (GL_BLEND);
1740 glBlendFunc (intensity ? GL_SRC_ALPHA : GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
1676 glEnable (GL_TEXTURE_2D); 1741 glEnable (GL_TEXTURE_2D);
1677 glEnable (GL_BLEND);
1678 glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
1679 glBindTexture (GL_TEXTURE_2D, name1); 1742 glBindTexture (GL_TEXTURE_2D, name1);
1680 1743
1681 glColor3f (intensity, intensity, intensity); 1744 glColor3f (intensity, intensity, intensity);
1682 glPushMatrix (); 1745 glPushMatrix ();
1683 glScalef (1./3, 1./3, 1.); 1746 glScalef (1./3, 1./3, 1.);
1698 glBindTexture (GL_TEXTURE_2D, name2); 1761 glBindTexture (GL_TEXTURE_2D, name2);
1699 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); 1762 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
1700 1763
1701 /* rgb == rgb(glcolor) */ 1764 /* rgb == rgb(glcolor) */
1702 glTexEnvi (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE); 1765 glTexEnvi (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);
1703 glTexEnvi (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_CONSTANT); 1766 glTexEnvi (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PRIMARY_COLOR);
1704 glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR); 1767 glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
1705 1768
1706 /* alpha = interpolate t0, t1 by env_alpha */ 1769 /* alpha = interpolate t0, t1 by env_alpha */
1707 glTexEnvfv (GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, env_color); 1770 glTexEnvfv (GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, env_color);
1708 1771
1969 self->y += MAP_EXTEND_Y; 2032 self->y += MAP_EXTEND_Y;
1970 } 2033 }
1971} 2034}
1972 2035
1973SV * 2036SV *
1974map1a_update (DC::Map self, SV *data_, int extmap) 2037map1a_update (DC::Map self, SV *data_)
1975 CODE: 2038 CODE:
1976{ 2039{
1977 uint8_t *data = (uint8_t *)SvPVbyte_nolen (data_); 2040 uint8_t *data = (uint8_t *)SvPVbyte_nolen (data_);
1978 uint8_t *data_end = (uint8_t *)SvEND (data_); 2041 uint8_t *data_end = (uint8_t *)SvEND (data_);
1979 mapcell *cell; 2042 mapcell *cell;
2000 2063
2001 //TODO: don't trust server data to be in-range(!) 2064 //TODO: don't trust server data to be in-range(!)
2002 2065
2003 if (flags & 8) 2066 if (flags & 8)
2004 { 2067 {
2068 uint8_t ext, cmd;
2069
2005 if (extmap) 2070 do
2006 { 2071 {
2007 uint8_t ext, cmd; 2072 ext = *data++;
2073 cmd = ext & 0x7f;
2008 2074
2009 do 2075 if (cmd < 4)
2076 cell->darkness = 255 - ext * 64 + 1; /* make sure this doesn't collide with FOW_DARKNESS */
2077 else if (cmd == 5) // health
2010 { 2078 {
2011 ext = *data++;
2012 cmd = ext & 0x7f;
2013
2014 if (cmd < 4)
2015 cell->darkness = 255 - ext * 64 + 1; /* make sure this doesn't collide with FOW_DARKNESS */
2016 else if (cmd == 5) // health
2017 {
2018 cell->stat_width = 1; 2079 cell->stat_width = 1;
2019 cell->stat_hp = *data++; 2080 cell->stat_hp = *data++;
2020 }
2021 else if (cmd == 6) // monster width
2022 cell->stat_width = *data++ + 1;
2023 else if (cmd == 0x47)
2024 {
2025 if (*data == 1) cell->player = data [1];
2026 else if (*data == 2) cell->player = data [2] + (data [1] << 8);
2027 else if (*data == 3) cell->player = data [3] + (data [2] << 8) + (data [1] << 16);
2028 else if (*data == 4) cell->player = data [4] + (data [3] << 8) + (data [2] << 16) + (data [1] << 24);
2029
2030 data += *data + 1;
2031 }
2032 else if (cmd == 8) // cell flags
2033 cell->flags = *data++;
2034 else if (ext & 0x40) // unknown, multibyte => skip
2035 data += *data + 1;
2036 else
2037 data++;
2038 } 2081 }
2039 while (ext & 0x80); 2082 else if (cmd == 6) // monster width
2083 cell->stat_width = *data++ + 1;
2084 else if (cmd == 0x47)
2085 {
2086 if (*data == 1) cell->player = data [1];
2087 else if (*data == 2) cell->player = data [2] + (data [1] << 8);
2088 else if (*data == 3) cell->player = data [3] + (data [2] << 8) + (data [1] << 16);
2089 else if (*data == 4) cell->player = data [4] + (data [3] << 8) + (data [2] << 16) + (data [1] << 24);
2090
2091 data += *data + 1;
2092 }
2093 else if (cmd == 8) // cell flags
2094 cell->flags = *data++;
2095 else if (ext & 0x40) // unknown, multibyte => skip
2096 data += *data + 1;
2097 else
2098 data++;
2040 } 2099 }
2041 else 2100 while (ext & 0x80);
2042 cell->darkness = *data++ + 1;
2043 } 2101 }
2044 2102
2045 for (z = 0; z <= 2; ++z) 2103 for (z = 0; z <= 2; ++z)
2046 if (flags & (4 >> z)) 2104 if (flags & (4 >> z))
2047 { 2105 {
2095 ? self->row + y 2153 ? self->row + y
2096 : 0; 2154 : 0;
2097 2155
2098 for (x = x0; x < x1; x++) 2156 for (x = x0; x < x1; x++)
2099 { 2157 {
2100 int r = 32, g = 32, b = 32, a = 192; 2158 unsigned int r = 32, g = 32, b = 32, a = 192;
2101 2159
2102 if (row && row->c0 <= x && x < row->c1) 2160 if (row && row->c0 <= x && x < row->c1)
2103 { 2161 {
2104 mapcell *cell = row->col + (x - row->c0); 2162 mapcell *cell = row->col + (x - row->c0);
2105 2163
2107 { 2165 {
2108 maptex tex = self->tex [cell->tile [z]]; 2166 maptex tex = self->tex [cell->tile [z]];
2109 int a0 = 255 - tex.a; 2167 int a0 = 255 - tex.a;
2110 int a1 = tex.a; 2168 int a1 = tex.a;
2111 2169
2112 r = (r * a0 + tex.r * a1) / 255; 2170 r = div255 (r * a0 + tex.r * a1);
2113 g = (g * a0 + tex.g * a1) / 255; 2171 g = div255 (g * a0 + tex.g * a1);
2114 b = (b * a0 + tex.b * a1) / 255; 2172 b = div255 (b * a0 + tex.b * a1);
2115 a = (a * a0 + tex.a * a1) / 255; 2173 a = div255 (a * a0 + tex.a * a1);
2116 } 2174 }
2117 } 2175 }
2118 2176
2119 *map++ = (r ) 2177 *map++ = (r )
2120 | (g << 8) 2178 | (g << 8)
2127} 2185}
2128 OUTPUT: 2186 OUTPUT:
2129 RETVAL 2187 RETVAL
2130 2188
2131void 2189void
2132draw (DC::Map self, int mx, int my, int sw, int sh, int T, U32 player = 0xffffffff, int sdx = 0, int sdy = 0) 2190draw (DC::Map self, int mx, int my, int sw, int sh, int Tw, int Th, U32 player = 0xffffffff, int sdx = 0, int sdy = 0)
2133 CODE: 2191 CODE:
2134{ 2192{
2135 int x, y, z; 2193 int x, y, z;
2136 2194
2137 HV *smooth = (HV *)sv_2mortal ((SV *)newHV ()); 2195 HV *smooth = (HV *)sv_2mortal ((SV *)newHV ());
2141 int pl_x, pl_y; 2199 int pl_x, pl_y;
2142 maptex pl_tex; 2200 maptex pl_tex;
2143 rc_t *rc = rc_alloc (); 2201 rc_t *rc = rc_alloc ();
2144 rc_t *rc_ov = rc_alloc (); 2202 rc_t *rc_ov = rc_alloc ();
2145 rc_key_t key; 2203 rc_key_t key;
2146 rc_array_t *arr, *arr_hidden; 2204 rc_array_t *arr;
2147 2205
2148 pl_tex.name = 0; 2206 pl_tex.name = 0;
2149 2207
2150 // that's current max. sorry. 2208 // that's current max. sorry.
2151 if (sw > 255) sw = 255; 2209 if (sw > 255) sw = 255;
2188 } 2246 }
2189 2247
2190 glEnable (GL_BLEND); 2248 glEnable (GL_BLEND);
2191 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 2249 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
2192 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 2250 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
2193
2194 key.texname = self->tex [TEXID_HIDDEN].name;
2195 arr_hidden = rc_array (rc_ov, &key);
2196 2251
2197 for (z = 0; z <= 2; z++) 2252 for (z = 0; z <= 2; z++)
2198 { 2253 {
2199 memset (smooth_level, 0, sizeof (smooth_level)); 2254 memset (smooth_level, 0, sizeof (smooth_level));
2200 key.texname = -1; 2255 key.texname = -1;
2224 2279
2225 key.texname = tex.name; 2280 key.texname = tex.name;
2226 arr = rc_array (rc, &key); 2281 arr = rc_array (rc, &key);
2227 } 2282 }
2228 2283
2229 px = (x + 1) * T - tex.w; 2284 px = (x + 1) * Th - tex.w;
2230 py = (y + 1) * T - tex.h; 2285 py = (y + 1) * Tw - tex.h;
2231 2286
2232 if (expect_false (cell->player == player) && expect_false (z == 2)) 2287 if (expect_false (cell->player == player) && expect_false (z == 2))
2233 { 2288 {
2234 pl_x = px; 2289 pl_x = px;
2235 pl_y = py; 2290 pl_y = py;
2288 if (cell->flags & 1) 2343 if (cell->flags & 1)
2289 { 2344 {
2290 rc_key_t key_ov = key; 2345 rc_key_t key_ov = key;
2291 maptex tex = self->tex [TEXID_SPEECH]; 2346 maptex tex = self->tex [TEXID_SPEECH];
2292 rc_array_t *arr; 2347 rc_array_t *arr;
2293 int px = x * T + T * 2 / 32; 2348 int px = x * Tw + Tw * 2 / 32;
2294 int py = y * T - T * 6 / 32; 2349 int py = y * Th - Th * 6 / 32;
2295 2350
2296 key_ov.texname = tex.name; 2351 key_ov.texname = tex.name;
2297 arr = rc_array (rc_ov, &key_ov); 2352 arr = rc_array (rc_ov, &key_ov);
2298 2353
2299 rc_t2f_v3f (arr, 0 , 0 , px , py , 0); 2354 rc_t2f_v3f (arr, 0 , 0 , px , py , 0);
2300 rc_t2f_v3f (arr, 0 , tex.t, px , py + T, 0); 2355 rc_t2f_v3f (arr, 0 , tex.t, px , py + Th, 0);
2301 rc_t2f_v3f (arr, tex.s, tex.t, px + T, py + T, 0); 2356 rc_t2f_v3f (arr, tex.s, tex.t, px + Tw, py + Th, 0);
2302 rc_t2f_v3f (arr, tex.s, 0 , px + T, py , 0); 2357 rc_t2f_v3f (arr, tex.s, 0 , px + Tw, py , 0);
2303 } 2358 }
2304 } 2359 }
2305 } 2360 }
2306 } 2361 }
2307 2362
2334 if (!(bits & 0x1000) 2389 if (!(bits & 0x1000)
2335 && skey->level == level 2390 && skey->level == level
2336 && level > smooth_max [skey->x][skey->y]) 2391 && level > smooth_max [skey->x][skey->y])
2337 { 2392 {
2338 maptex tex = self->tex [skey->tile]; 2393 maptex tex = self->tex [skey->tile];
2339 int px = (((int)skey->x) - 1) * T; 2394 int px = (((int)skey->x) - 1) * Tw;
2340 int py = (((int)skey->y) - 1) * T; 2395 int py = (((int)skey->y) - 1) * Th;
2341 int border = bits & 15; 2396 int border = bits & 15;
2342 int corner = (bits >> 8) & ~(bits >> 4) & 15; 2397 int corner = (bits >> 8) & ~(bits >> 4) & 15;
2343 float dx = tex.s * .0625f; // 16 images/row 2398 float dx = tex.s * .0625f; // 16 images/row
2344 float dy = tex.t * .5f ; // 2 images/column 2399 float dy = tex.t * .5f ; // 2 images/column
2345 2400
2358 2413
2359 if (border) 2414 if (border)
2360 { 2415 {
2361 float ox = border * dx; 2416 float ox = border * dx;
2362 2417
2363 glTexCoord2f (ox , 0.f ); glVertex2i (px , py ); 2418 glTexCoord2f (ox , 0.f ); glVertex2i (px , py );
2364 glTexCoord2f (ox , dy ); glVertex2i (px , py + T); 2419 glTexCoord2f (ox , dy ); glVertex2i (px , py + Th);
2365 glTexCoord2f (ox + dx, dy ); glVertex2i (px + T, py + T); 2420 glTexCoord2f (ox + dx, dy ); glVertex2i (px + Tw, py + Th);
2366 glTexCoord2f (ox + dx, 0.f ); glVertex2i (px + T, py ); 2421 glTexCoord2f (ox + dx, 0.f ); glVertex2i (px + Tw, py );
2367 } 2422 }
2368 2423
2369 if (corner) 2424 if (corner)
2370 { 2425 {
2371 float ox = corner * dx; 2426 float ox = corner * dx;
2372 2427
2373 glTexCoord2f (ox , dy ); glVertex2i (px , py ); 2428 glTexCoord2f (ox , dy ); glVertex2i (px , py );
2374 glTexCoord2f (ox , dy * 2.f); glVertex2i (px , py + T); 2429 glTexCoord2f (ox , dy * 2.f); glVertex2i (px , py + Th);
2375 glTexCoord2f (ox + dx, dy * 2.f); glVertex2i (px + T, py + T); 2430 glTexCoord2f (ox + dx, dy * 2.f); glVertex2i (px + Tw, py + Th);
2376 glTexCoord2f (ox + dx, dy ); glVertex2i (px + T, py ); 2431 glTexCoord2f (ox + dx, dy ); glVertex2i (px + Tw, py );
2377 } 2432 }
2378 } 2433 }
2379 } 2434 }
2380 } 2435 }
2381 } 2436 }
2422 for (x = 0; x < sw; x++) 2477 for (x = 0; x < sw; x++)
2423 if (row->c0 <= x + mx && x + mx < row->c1) 2478 if (row->c0 <= x + mx && x + mx < row->c1)
2424 { 2479 {
2425 mapcell *cell = row->col + (x + mx - row->c0); 2480 mapcell *cell = row->col + (x + mx - row->c0);
2426 2481
2427 int px = x * T; 2482 int px = x * Tw;
2428 int py = y * T; 2483 int py = y * Th;
2429 2484
2430 if (expect_false (cell->player == player)) 2485 if (expect_false (cell->player == player))
2431 { 2486 {
2432 px += sdx; 2487 px += sdx;
2433 py += sdy; 2488 py += sdy;
2434 } 2489 }
2435 2490
2436 if (cell->stat_hp) 2491 if (cell->stat_hp)
2437 { 2492 {
2438 int width = cell->stat_width * T; 2493 int width = cell->stat_width * Tw;
2439 int thick = (sh * T / 32 + 27) / 28 + 1 + cell->stat_width; 2494 int thick = (sh * Th / 32 + 27) / 28 + 1 + cell->stat_width;
2440 2495
2441 glColor3ub (0, 0, 0); 2496 glColor3ub (0, 0, 0);
2442 glRectf (px + 1, py - thick - 2, 2497 glRectf (px + 1, py - thick - 2,
2443 px + width - 1, py); 2498 px + width - 1, py);
2444 2499
2524 int x, y; 2579 int x, y;
2525 int sw1 = sw + 2; 2580 int sw1 = sw + 2;
2526 int sh1 = sh + 2; 2581 int sh1 = sh + 2;
2527 int sh3 = sh * 3; 2582 int sh3 = sh * 3;
2528 int sw3 = sw * 3; 2583 int sw3 = sw * 3;
2529 uint8_t *darkness1 = (uint8_t *)malloc (sw1 * sh1);
2530 SV *darkness3_sv = sv_2mortal (newSV (sw3 * sh3)); 2584 SV *darkness3_sv = sv_2mortal (newSV (sw3 * sh3));
2531 uint8_t *darkness3 = (uint8_t *)SvPVX (darkness3_sv); 2585 uint8_t *darkness3 = (uint8_t *)SvPVX (darkness3_sv);
2586 uint8_t *darkness1 = (uint8_t *)malloc (sw1 * sh1);
2587 memset (darkness1, 0, sw1*sh1);
2532 2588
2533 SvPOK_only (darkness3_sv); 2589 SvPOK_only (darkness3_sv);
2534 SvCUR_set (darkness3_sv, sw3 * sh3); 2590 SvCUR_set (darkness3_sv, sw3 * sh3);
2535 2591
2536 mx += self->x - 1; 2592 mx += self->x - 1;
2797 if (RETVAL < 0) 2853 if (RETVAL < 0)
2798 { 2854 {
2799 RETVAL = Mix_GroupOldest (-1); 2855 RETVAL = Mix_GroupOldest (-1);
2800 2856
2801 if (RETVAL < 0) 2857 if (RETVAL < 0)
2858 {
2859 // happens sometimes, maybe it just stopped playing(?)
2860 RETVAL = Mix_GroupAvailable (-1);
2861
2862 if (RETVAL < 0)
2802 XSRETURN_UNDEF; 2863 XSRETURN_UNDEF;
2803 2864 }
2865 else
2804 Mix_HaltChannel (RETVAL); 2866 Mix_HaltChannel (RETVAL);
2805 } 2867 }
2806 2868
2807 Mix_UnregisterAllEffects (RETVAL); 2869 Mix_UnregisterAllEffects (RETVAL);
2808 Mix_Volume (RETVAL, 128); 2870 Mix_Volume (RETVAL, 128);
2809} 2871}
2868 Mix_SetReverseStereo (self, flip); 2930 Mix_SetReverseStereo (self, flip);
2869 2931
2870MODULE = Deliantra::Client PACKAGE = DC::MixChunk 2932MODULE = Deliantra::Client PACKAGE = DC::MixChunk
2871 2933
2872PROTOTYPES: DISABLE 2934PROTOTYPES: DISABLE
2935
2936void
2937decoders ()
2938 PPCODE:
2939#if SDL_MIXER_MAJOR_VERSION > 1 || SDL_MIXER_MINOR_VERSION > 2 || SDL_MIXER_PATCHLEVEL >= 10
2940 int i, num = Mix_GetNumChunkDecoders ();
2941 EXTEND (SP, num);
2942 for (i = 0; i < num; ++i)
2943 PUSHs (sv_2mortal (newSVpv (Mix_GetChunkDecoder (i), 0)));
2944#else
2945 XPUSHs (sv_2mortal (newSVpv ("(sdl mixer too old)", 0)));
2946#endif
2873 2947
2874DC::MixChunk 2948DC::MixChunk
2875new (SV *class, DC::RW rwops) 2949new (SV *class, DC::RW rwops)
2876 CODE: 2950 CODE:
2877 RETVAL = Mix_LoadWAV_RW (rwops, 1); 2951 RETVAL = Mix_LoadWAV_RW (rwops, 1);
2910 OUTPUT: 2984 OUTPUT:
2911 RETVAL 2985 RETVAL
2912 2986
2913MODULE = Deliantra::Client PACKAGE = DC::MixMusic 2987MODULE = Deliantra::Client PACKAGE = DC::MixMusic
2914 2988
2989void
2990decoders ()
2991 PPCODE:
2992#if SDL_MIXER_MAJOR_VERSION > 1 || SDL_MIXER_MINOR_VERSION > 2 || SDL_MIXER_PATCHLEVEL >= 10
2993 int i, num = Mix_GetNumMusicDecoders ();
2994 EXTEND (SP, num);
2995 for (i = 0; i < num; ++i)
2996 PUSHs (sv_2mortal (newSVpv (Mix_GetMusicDecoder (i), 0)));
2997#else
2998 XPUSHs (sv_2mortal (newSVpv ("(sdl mixer too old)", 0)));
2999#endif
3000
2915int 3001int
2916volume (int volume = -1) 3002volume (int volume = -1)
2917 PROTOTYPE: ;$ 3003 PROTOTYPE: ;$
2918 CODE: 3004 CODE:
2919 if (items > 0) 3005 if (items > 0)
2929 3015
2930void 3016void
2931halt () 3017halt ()
2932 CODE: 3018 CODE:
2933 Mix_HaltMusic (); 3019 Mix_HaltMusic ();
3020
3021int
3022playing ()
3023 CODE:
3024 RETVAL = Mix_PlayingMusic ();
3025 OUTPUT:
3026 RETVAL
2934 3027
2935DC::MixMusic 3028DC::MixMusic
2936new (SV *class, DC::RW rwops) 3029new (SV *class, DC::RW rwops)
2937 CODE: 3030 CODE:
2938 RETVAL = Mix_LoadMUS_RW (rwops); 3031 RETVAL = Mix_LoadMUS_RW (rwops);
3078 const_iv (GL_FUNC_SUBTRACT), 3171 const_iv (GL_FUNC_SUBTRACT),
3079 const_iv (GL_FUNC_REVERSE_SUBTRACT), 3172 const_iv (GL_FUNC_REVERSE_SUBTRACT),
3080# undef const_iv 3173# undef const_iv
3081 }; 3174 };
3082 3175
3083 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; ) 3176 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ > const_iv; civ--)
3084 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv)); 3177 newCONSTSUB (stash, (char *)civ[-1].name, newSViv (civ[-1].iv));
3085 3178
3086 texture_av = newAV (); 3179 texture_av = newAV ();
3087 AvREAL_off (texture_av); 3180 AvREAL_off (texture_av);
3088} 3181}
3089 3182
3132 RETVAL 3225 RETVAL
3133 3226
3134int glGetError () 3227int glGetError ()
3135 3228
3136void glFinish () 3229void glFinish ()
3230
3231void glFlush ()
3137 3232
3138void glClear (int mask) 3233void glClear (int mask)
3139 3234
3140void glClearColor (float r, float g, float b, float a = 1.0) 3235void glClearColor (float r, float g, float b, float a = 1.0)
3141 PROTOTYPE: @ 3236 PROTOTYPE: @

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines