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.321 by root, Sun Nov 18 01:15:04 2018 UTC

48#endif 48#endif
49 49
50#define PANGO_ENABLE_BACKEND 50#define PANGO_ENABLE_BACKEND
51#define G_DISABLE_CAST_CHECKS 51#define G_DISABLE_CAST_CHECKS
52 52
53#include <glib/gmacros.h> 53#include <glib.h>
54 54
55#include <pango/pango.h> 55#include <pango/pango.h>
56 56
57#ifndef PANGO_VERSION_CHECK 57#ifndef PANGO_VERSION_CHECK
58# define PANGO_VERSION_CHECK(a,b,c) 0 58# define PANGO_VERSION_CHECK(a,b,c) 0
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 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}
123
105static AV *texture_av; 124static AV *texture_av;
106 125
107static struct 126static struct
108{ 127{
109#define GL_FUNC(ptr,name) ptr name; 128#define GL_FUNC(ptr,name) ptr name;
165{ 184{
166 GSList *attrs = run->item->analysis.extra_attrs; 185 GSList *attrs = run->item->analysis.extra_attrs;
167 186
168 while (attrs) 187 while (attrs)
169 { 188 {
170 PangoAttribute *attr = attrs->data; 189 PangoAttribute *attr = (PangoAttribute *)attrs->data;
171 190
172 if (attr->klass->type == PANGO_ATTR_SHAPE) 191 if (attr->klass->type == PANGO_ATTR_SHAPE)
173 return 1; 192 return 1;
174 193
175 attrs = attrs->next; 194 attrs = attrs->next;
193static void 212static void
194substitute_func (FcPattern *pattern, gpointer data) 213substitute_func (FcPattern *pattern, gpointer data)
195{ 214{
196 FcPatternAddBool (pattern, FC_HINTING, 1); 215 FcPatternAddBool (pattern, FC_HINTING, 1);
197#ifdef FC_HINT_STYLE 216#ifdef FC_HINT_STYLE
198 FcPatternAddBool (pattern, FC_HINT_STYLE, FC_HINT_FULL); 217 FcPatternAddInteger (pattern, FC_HINT_STYLE, FC_HINT_FULL);
199#endif 218#endif
200 FcPatternAddBool (pattern, FC_AUTOHINT, 0); 219 FcPatternAddBool (pattern, FC_AUTOHINT, 0);
201} 220}
202 221
203static void 222static void
462 ev.data2 = 0; 481 ev.data2 = 0;
463 482
464 SDL_PushEvent ((SDL_Event *)&ev); 483 SDL_PushEvent ((SDL_Event *)&ev);
465} 484}
466 485
486// approximately divide by 255
487static unsigned int
488div255 (unsigned int n)
489{
490 return (n + (n >> 8)) >> 8;
491}
492
467static unsigned int 493static unsigned int
468minpot (unsigned int n) 494minpot (unsigned int n)
469{ 495{
470 if (!n) 496 if (!n)
471 return 0; 497 return 0;
552 578
553 return mod; 579 return mod;
554} 580}
555 581
556static void 582static void
557deliantra_main () 583deliantra_main (SV *real_main)
558{ 584{
559 char *argv[] = { 0 }; 585 dSP;
560 call_argv ("::main", G_DISCARD | G_VOID, argv); 586
587 PUSHMARK (SP);
588 call_sv (real_main, G_DISCARD | G_VOID);
561} 589}
562 590
563#ifdef __MACOSX__ 591#ifdef __MACOSX__
592 static SV *real_main;
593
564 /* to due surprising braindamage on the side of SDL design, we 594 /* to due surprising braindamage on the side of SDL design, we
565 * do some mind-boggling hack here: SDL requires a custom main() 595 * 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, 596 * 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, 597 * due to shared library magic, calls -lSDLmain's main, not perl's main,
568 * and which calls our main (== SDL_main) back. 598 * and which calls our main (== SDL_main) back.
569 */ 599 */
570 extern C_LINKAGE int 600 extern C_LINKAGE int
571 main (int argc, char *argv[]) 601 main (int argc, char *argv[])
572 { 602 {
573 deliantra_main (); 603 deliantra_main (real_main);
574 } 604 }
575 605
576 #undef main 606 #undef main
577 607
578 extern C_LINKAGE int main (int argc, char *argv[]); 608 extern C_LINKAGE int main (int argc, char *argv[]);
579 609
580 static void 610 static void
581 SDL_braino (void) 611 SDL_main_hack (SV *real_main_)
582 { 612 {
613 real_main = real_main_;
614
583 char *argv[] = { "deliantra client", 0 }; 615 char *argv[] = { "deliantra client", 0 };
584 (main) (1, argv); 616 (main) (1, argv);
585 } 617 }
586#else 618#else
587 static void 619 static void
588 SDL_braino (void) 620 SDL_main_hack (SV *real_main)
589 { 621 {
590 deliantra_main (); 622 deliantra_main (real_main);
591 } 623 }
592#endif 624#endif
593 625
594MODULE = Deliantra::Client PACKAGE = DC 626MODULE = Deliantra::Client PACKAGE = DC
595 627
796 828
797 const_iv (FOW_DARKNESS) 829 const_iv (FOW_DARKNESS)
798# undef const_iv 830# undef const_iv
799 }; 831 };
800 832
801 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; ) 833 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ > const_iv; civ--)
802 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv)); 834 newCONSTSUB (stash, (char *)civ[-1].name, newSViv (civ[-1].iv));
803 835
804 assert (SDLK_MODIFIER_MIN == SDLK_NUMLOCK); 836 assert (SDLK_MODIFIER_MIN == SDLK_NUMLOCK);
805 assert (SDLK_MODIFIER_MAX == SDLK_COMPOSE); 837 assert (SDLK_MODIFIER_MAX == SDLK_COMPOSE);
806} 838}
807 839
846#endif 878#endif
847} 879}
848 880
849char *SDL_GetError () 881char *SDL_GetError ()
850 882
851void SDL_braino () 883void SDL_main_hack (SV *real_main)
884 PROTOTYPE: &
852 885
853int SDL_Init (U32 flags) 886int SDL_Init (U32 flags)
854 887
855int SDL_InitSubSystem (U32 flags) 888int SDL_InitSubSystem (U32 flags)
856 889
857void SDL_QuitSubSystem (U32 flags) 890void SDL_QuitSubSystem (U32 flags)
858 891
859void SDL_Quit () 892void SDL_Quit ()
860 893
861int SDL_GL_SetAttribute (int attr, int value) 894int SDL_GL_SetAttribute (int attr, int value)
895 C_ARGS: (SDL_GLattr)attr, value
862 896
863int SDL_GL_GetAttribute (int attr) 897int SDL_GL_GetAttribute (int attr)
864 CODE: 898 CODE:
865 if (SDL_GL_GetAttribute (attr, &RETVAL)) 899 if (SDL_GL_GetAttribute ((SDL_GLattr)attr, &RETVAL))
866 XSRETURN_UNDEF; 900 XSRETURN_UNDEF;
867 OUTPUT: 901 OUTPUT:
868 RETVAL 902 RETVAL
869 903
870void 904void
925 ); 959 );
926 960
927 if (RETVAL) 961 if (RETVAL)
928 { 962 {
929 av_clear (texture_av); 963 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); 964#define GL_FUNC(ptr,name) gl.name = (ptr)SDL_GL_GetProcAddress ("gl" # name);
933#include "glfunc.h" 965#include "glfunc.h"
934#undef GL_FUNC 966#undef GL_FUNC
935
936 if (!gl.ActiveTexture ) gl.ActiveTexture = gl.ActiveTextureARB; 967 if (!gl.ActiveTexture ) gl.ActiveTexture = gl.ActiveTextureARB;
937 if (!gl.MultiTexCoord2f) gl.MultiTexCoord2f = gl.MultiTexCoord2fARB; 968 if (!gl.MultiTexCoord2f) gl.MultiTexCoord2f = gl.MultiTexCoord2fARB;
938 } 969 }
939} 970}
940 OUTPUT: 971 OUTPUT:
941 RETVAL 972 RETVAL
942 973
943void 974void
975SDL_WM_SetCaption (const char *title, const char *icon)
976
977void
944SDL_GL_SwapBuffers () 978SDL_GL_SwapBuffers ()
945 979
946char * 980char *
947SDL_GetKeyName (int sym) 981SDL_GetKeyName (int sym)
982 C_ARGS: (SDLKey)sym
948 983
949int 984int
950SDL_GetAppState () 985SDL_GetAppState ()
951 986
952int 987int
953SDL_GetModState () 988SDL_GetModState ()
954 989
990int
991SDL_WaitEvent ()
992 C_ARGS: 0
993
955void 994void
995SDL_PumpEvents ()
996
997void
956poll_events () 998peep_events ()
957 PPCODE: 999 PPCODE:
958{ 1000{
959 SDL_Event ev; 1001 SDL_Event ev;
960 1002
961 SDL_PumpEvents (); 1003 SDL_PumpEvents ();
1042 OUTPUT: 1084 OUTPUT:
1043 RETVAL 1085 RETVAL
1044 1086
1045int 1087int
1046Mix_OpenAudio (int frequency = 44100, int format = MIX_DEFAULT_FORMAT, int channels = 2, int chunksize = 4096) 1088Mix_OpenAudio (int frequency = 44100, int format = MIX_DEFAULT_FORMAT, int channels = 2, int chunksize = 4096)
1047 POSTCALL: 1089 POSTCALL:
1048 Mix_HookMusicFinished (music_finished); 1090 Mix_HookMusicFinished (music_finished);
1049 Mix_ChannelFinished (channel_finished); 1091 Mix_ChannelFinished (channel_finished);
1050 1092
1051void 1093void
1052Mix_QuerySpec () 1094Mix_QuerySpec ()
1114 OUTPUT: 1156 OUTPUT:
1115 RETVAL 1157 RETVAL
1116 1158
1117void 1159void
1118IMG_Init (int flags = IMG_INIT_JPG | IMG_INIT_PNG) 1160IMG_Init (int flags = IMG_INIT_JPG | IMG_INIT_PNG)
1161
1162# MIX_INIT_MP3 gives smpeg + libstdc++ + libgcc_s
1163void
1164Mix_Init (int flags = MIX_INIT_MOD | MIX_INIT_OGG)
1119 1165
1120void 1166void
1121load_image_inline (SV *image_) 1167load_image_inline (SV *image_)
1122 ALIAS: 1168 ALIAS:
1123 load_image_file = 1 1169 load_image_file = 1
1169 1215
1170 SDL_LockSurface (surface2); 1216 SDL_LockSurface (surface2);
1171 EXTEND (SP, 6); 1217 EXTEND (SP, 6);
1172 PUSHs (sv_2mortal (newSViv (surface2->w))); 1218 PUSHs (sv_2mortal (newSViv (surface2->w)));
1173 PUSHs (sv_2mortal (newSViv (surface2->h))); 1219 PUSHs (sv_2mortal (newSViv (surface2->h)));
1174 PUSHs (sv_2mortal (newSVpvn (surface2->pixels, surface2->h * surface2->pitch))); 1220 PUSHs (sv_2mortal (newSVpvn ((const char *)surface2->pixels, surface2->h * surface2->pitch)));
1175 PUSHs (sv_2mortal (newSViv (surface->flags & (SDL_SRCCOLORKEY | SDL_SRCALPHA) ? GL_RGBA : GL_RGB))); 1221 PUSHs (sv_2mortal (newSViv (surface->flags & (SDL_SRCCOLORKEY | SDL_SRCALPHA) ? GL_RGBA : GL_RGB)));
1176 PUSHs (sv_2mortal (newSViv (GL_RGBA))); 1222 PUSHs (sv_2mortal (newSViv (GL_RGBA)));
1177 PUSHs (sv_2mortal (newSViv (GL_UNSIGNED_BYTE))); 1223 PUSHs (sv_2mortal (newSViv (GL_UNSIGNED_BYTE)));
1178 SDL_UnlockSurface (surface2); 1224 SDL_UnlockSurface (surface2);
1179 1225
1251MODULE = Deliantra::Client PACKAGE = DC::Font 1297MODULE = Deliantra::Client PACKAGE = DC::Font
1252 1298
1253PROTOTYPES: DISABLE 1299PROTOTYPES: DISABLE
1254 1300
1255DC::Font 1301DC::Font
1256new_from_file (SV *class, char *path, int id = 0) 1302new_from_file (SV *klass, char *path, int id = 0)
1257 CODE: 1303 CODE:
1258{ 1304{
1259 int count; 1305 int count;
1260 FcPattern *pattern = FcFreeTypeQuery ((const FcChar8 *)path, id, 0, &count); 1306 FcPattern *pattern = FcFreeTypeQuery ((const FcChar8 *)path, id, 0, &count);
1261 RETVAL = pango_fc_font_description_from_pattern (pattern, 0); 1307 RETVAL = pango_fc_font_description_from_pattern (pattern, 0);
1290 PROTOTYPE: 1336 PROTOTYPE:
1291 CODE: 1337 CODE:
1292 tc_restore (); 1338 tc_restore ();
1293 1339
1294DC::Layout 1340DC::Layout
1295new (SV *class) 1341new (SV *klass)
1296 CODE: 1342 CODE:
1297 New (0, RETVAL, 1, struct cf_layout); 1343 New (0, RETVAL, 1, struct cf_layout);
1298 1344
1299 RETVAL->pl = pango_layout_new (opengl_context); 1345 RETVAL->pl = pango_layout_new (opengl_context);
1300 RETVAL->r = 1.; 1346 RETVAL->r = 1.;
1449 1495
1450void 1496void
1451set_height (DC::Layout self, int base_height) 1497set_height (DC::Layout self, int base_height)
1452 CODE: 1498 CODE:
1453 if (self->base_height != base_height) 1499 if (self->base_height != base_height)
1454 { 1500 {
1455 self->base_height = base_height; 1501 self->base_height = base_height;
1456 layout_update_font (self); 1502 layout_update_font (self);
1457 } 1503 }
1458 1504
1459void 1505void
1823MODULE = Deliantra::Client PACKAGE = DC::Map 1869MODULE = Deliantra::Client PACKAGE = DC::Map
1824 1870
1825PROTOTYPES: DISABLE 1871PROTOTYPES: DISABLE
1826 1872
1827DC::Map 1873DC::Map
1828new (SV *class) 1874new (SV *klass)
1829 CODE: 1875 CODE:
1830 New (0, RETVAL, 1, struct map); 1876 New (0, RETVAL, 1, struct map);
1831 RETVAL->x = 0; 1877 RETVAL->x = 0;
1832 RETVAL->y = 0; 1878 RETVAL->y = 0;
1833 RETVAL->w = 0; 1879 RETVAL->w = 0;
1872 1918
1873void 1919void
1874set_smooth (DC::Map self, int face, int smooth, int level) 1920set_smooth (DC::Map self, int face, int smooth, int level)
1875 CODE: 1921 CODE:
1876{ 1922{
1877 tileid texid; 1923 tileid texid;
1878 maptex *tex; 1924 maptex *tex;
1879 1925
1880 if (face < 0 || face >= self->faces) 1926 if (face < 0 || face >= self->faces)
1881 return; 1927 return;
1882 1928
1883 if (smooth < 0 || smooth >= self->faces) 1929 if (smooth < 0 || smooth >= self->faces)
1884 return; 1930 return;
1885 1931
1886 texid = self->face2tile [face]; 1932 texid = self->face2tile [face];
1887 1933
1888 if (!texid) 1934 if (!texid)
1889 return; 1935 return;
1890 1936
1891 tex = self->tex + texid; 1937 tex = self->tex + texid;
1924} 1970}
1925 1971
1926void 1972void
1927expire_textures (DC::Map self, int texid, int count) 1973expire_textures (DC::Map self, int texid, int count)
1928 PPCODE: 1974 PPCODE:
1929 for (; texid < self->texs && count; ++texid, --count) 1975 for (; texid < self->texs && count; ++texid, --count)
1930 { 1976 {
1931 maptex *tex = self->tex + texid; 1977 maptex *tex = self->tex + texid;
1932 1978
1933 if (tex->name) 1979 if (tex->name)
1934 { 1980 {
1989 self->y += MAP_EXTEND_Y; 2035 self->y += MAP_EXTEND_Y;
1990 } 2036 }
1991} 2037}
1992 2038
1993SV * 2039SV *
1994map1a_update (DC::Map self, SV *data_, int extmap) 2040map1a_update (DC::Map self, SV *data_)
1995 CODE: 2041 CODE:
1996{ 2042{
1997 uint8_t *data = (uint8_t *)SvPVbyte_nolen (data_); 2043 uint8_t *data = (uint8_t *)SvPVbyte_nolen (data_);
1998 uint8_t *data_end = (uint8_t *)SvEND (data_); 2044 uint8_t *data_end = (uint8_t *)SvEND (data_);
1999 mapcell *cell; 2045 mapcell *cell;
2020 2066
2021 //TODO: don't trust server data to be in-range(!) 2067 //TODO: don't trust server data to be in-range(!)
2022 2068
2023 if (flags & 8) 2069 if (flags & 8)
2024 { 2070 {
2071 uint8_t ext, cmd;
2072
2025 if (extmap) 2073 do
2026 { 2074 {
2027 uint8_t ext, cmd; 2075 ext = *data++;
2076 cmd = ext & 0x7f;
2028 2077
2029 do 2078 if (cmd < 4)
2079 cell->darkness = 255 - ext * 64 + 1; /* make sure this doesn't collide with FOW_DARKNESS */
2080 else if (cmd == 5) // health
2030 { 2081 {
2031 ext = *data++;
2032 cmd = ext & 0x7f;
2033
2034 if (cmd < 4)
2035 cell->darkness = 255 - ext * 64 + 1; /* make sure this doesn't collide with FOW_DARKNESS */
2036 else if (cmd == 5) // health
2037 {
2038 cell->stat_width = 1; 2082 cell->stat_width = 1;
2039 cell->stat_hp = *data++; 2083 cell->stat_hp = *data++;
2040 }
2041 else if (cmd == 6) // monster width
2042 cell->stat_width = *data++ + 1;
2043 else if (cmd == 0x47)
2044 {
2045 if (*data == 1) cell->player = data [1];
2046 else if (*data == 2) cell->player = data [2] + (data [1] << 8);
2047 else if (*data == 3) cell->player = data [3] + (data [2] << 8) + (data [1] << 16);
2048 else if (*data == 4) cell->player = data [4] + (data [3] << 8) + (data [2] << 16) + (data [1] << 24);
2049
2050 data += *data + 1;
2051 }
2052 else if (cmd == 8) // cell flags
2053 cell->flags = *data++;
2054 else if (ext & 0x40) // unknown, multibyte => skip
2055 data += *data + 1;
2056 else
2057 data++;
2058 } 2084 }
2059 while (ext & 0x80); 2085 else if (cmd == 6) // monster width
2086 cell->stat_width = *data++ + 1;
2087 else if (cmd == 0x47)
2088 {
2089 if (*data == 1) cell->player = data [1];
2090 else if (*data == 2) cell->player = data [2] + (data [1] << 8);
2091 else if (*data == 3) cell->player = data [3] + (data [2] << 8) + (data [1] << 16);
2092 else if (*data == 4) cell->player = data [4] + (data [3] << 8) + (data [2] << 16) + (data [1] << 24);
2093
2094 data += *data + 1;
2095 }
2096 else if (cmd == 8) // cell flags
2097 cell->flags = *data++;
2098 else if (ext & 0x40) // unknown, multibyte => skip
2099 data += *data + 1;
2100 else
2101 data++;
2060 } 2102 }
2061 else 2103 while (ext & 0x80);
2062 cell->darkness = *data++ + 1;
2063 } 2104 }
2064 2105
2065 for (z = 0; z <= 2; ++z) 2106 for (z = 0; z <= 2; ++z)
2066 if (flags & (4 >> z)) 2107 if (flags & (4 >> z))
2067 { 2108 {
2115 ? self->row + y 2156 ? self->row + y
2116 : 0; 2157 : 0;
2117 2158
2118 for (x = x0; x < x1; x++) 2159 for (x = x0; x < x1; x++)
2119 { 2160 {
2120 int r = 32, g = 32, b = 32, a = 192; 2161 unsigned int r = 32, g = 32, b = 32, a = 192;
2121 2162
2122 if (row && row->c0 <= x && x < row->c1) 2163 if (row && row->c0 <= x && x < row->c1)
2123 { 2164 {
2124 mapcell *cell = row->col + (x - row->c0); 2165 mapcell *cell = row->col + (x - row->c0);
2125 2166
2127 { 2168 {
2128 maptex tex = self->tex [cell->tile [z]]; 2169 maptex tex = self->tex [cell->tile [z]];
2129 int a0 = 255 - tex.a; 2170 int a0 = 255 - tex.a;
2130 int a1 = tex.a; 2171 int a1 = tex.a;
2131 2172
2132 r = (r * a0 + tex.r * a1) / 255; 2173 r = div255 (r * a0 + tex.r * a1);
2133 g = (g * a0 + tex.g * a1) / 255; 2174 g = div255 (g * a0 + tex.g * a1);
2134 b = (b * a0 + tex.b * a1) / 255; 2175 b = div255 (b * a0 + tex.b * a1);
2135 a = (a * a0 + tex.a * a1) / 255; 2176 a = div255 (a * a0 + tex.a * a1);
2136 } 2177 }
2137 } 2178 }
2138 2179
2139 *map++ = (r ) 2180 *map++ = (r )
2140 | (g << 8) 2181 | (g << 8)
2141 | (b << 16) 2182 | (b << 16)
2142 | (a << 24); 2183 | (a << 24);
2143 } 2184 }
2144 } 2185 }
2145 2186
2146 RETVAL = map_sv; 2187 RETVAL = map_sv;
2147} 2188}
2148 OUTPUT: 2189 OUTPUT:
2149 RETVAL 2190 RETVAL
2150 2191
2151void 2192void
2152draw (DC::Map self, int mx, int my, int sw, int sh, int T, U32 player = 0xffffffff, int sdx = 0, int sdy = 0) 2193draw (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: 2194 CODE:
2154{ 2195{
2155 int x, y, z; 2196 int x, y, z;
2156 2197
2157 HV *smooth = (HV *)sv_2mortal ((SV *)newHV ()); 2198 HV *smooth = (HV *)sv_2mortal ((SV *)newHV ());
2158 uint32_t smooth_level[256 / 32]; // one bit for every possible smooth level 2199 uint32_t smooth_level[256 / 32]; // one bit for every possible smooth level
2159 static uint8_t smooth_max[256][256]; // egad, fast and wasteful on memory (64k) 2200 static uint8_t smooth_max[256][256]; // egad, fast and wasteful on memory (64k)
2160 smooth_key skey; 2201 smooth_key skey;
2161 int pl_x, pl_y; 2202 int pl_x, pl_y;
2162 maptex pl_tex; 2203 maptex pl_tex;
2241 2282
2242 key.texname = tex.name; 2283 key.texname = tex.name;
2243 arr = rc_array (rc, &key); 2284 arr = rc_array (rc, &key);
2244 } 2285 }
2245 2286
2246 px = (x + 1) * T - tex.w; 2287 px = (x + 1) * Th - tex.w;
2247 py = (y + 1) * T - tex.h; 2288 py = (y + 1) * Tw - tex.h;
2248 2289
2249 if (expect_false (cell->player == player) && expect_false (z == 2)) 2290 if (expect_false (cell->player == player) && expect_false (z == 2))
2250 { 2291 {
2251 pl_x = px; 2292 pl_x = px;
2252 pl_y = py; 2293 pl_y = py;
2305 if (cell->flags & 1) 2346 if (cell->flags & 1)
2306 { 2347 {
2307 rc_key_t key_ov = key; 2348 rc_key_t key_ov = key;
2308 maptex tex = self->tex [TEXID_SPEECH]; 2349 maptex tex = self->tex [TEXID_SPEECH];
2309 rc_array_t *arr; 2350 rc_array_t *arr;
2310 int px = x * T + T * 2 / 32; 2351 int px = x * Tw + Tw * 2 / 32;
2311 int py = y * T - T * 6 / 32; 2352 int py = y * Th - Th * 6 / 32;
2312 2353
2313 key_ov.texname = tex.name; 2354 key_ov.texname = tex.name;
2314 arr = rc_array (rc_ov, &key_ov); 2355 arr = rc_array (rc_ov, &key_ov);
2315 2356
2316 rc_t2f_v3f (arr, 0 , 0 , px , py , 0); 2357 rc_t2f_v3f (arr, 0 , 0 , px , py , 0);
2317 rc_t2f_v3f (arr, 0 , tex.t, px , py + T, 0); 2358 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); 2359 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); 2360 rc_t2f_v3f (arr, tex.s, 0 , px + Tw, py , 0);
2320 } 2361 }
2321 } 2362 }
2322 } 2363 }
2323 } 2364 }
2324 2365
2351 if (!(bits & 0x1000) 2392 if (!(bits & 0x1000)
2352 && skey->level == level 2393 && skey->level == level
2353 && level > smooth_max [skey->x][skey->y]) 2394 && level > smooth_max [skey->x][skey->y])
2354 { 2395 {
2355 maptex tex = self->tex [skey->tile]; 2396 maptex tex = self->tex [skey->tile];
2356 int px = (((int)skey->x) - 1) * T; 2397 int px = (((int)skey->x) - 1) * Tw;
2357 int py = (((int)skey->y) - 1) * T; 2398 int py = (((int)skey->y) - 1) * Th;
2358 int border = bits & 15; 2399 int border = bits & 15;
2359 int corner = (bits >> 8) & ~(bits >> 4) & 15; 2400 int corner = (bits >> 8) & ~(bits >> 4) & 15;
2360 float dx = tex.s * .0625f; // 16 images/row 2401 float dx = tex.s * .0625f; // 16 images/row
2361 float dy = tex.t * .5f ; // 2 images/column 2402 float dy = tex.t * .5f ; // 2 images/column
2362 2403
2375 2416
2376 if (border) 2417 if (border)
2377 { 2418 {
2378 float ox = border * dx; 2419 float ox = border * dx;
2379 2420
2380 glTexCoord2f (ox , 0.f ); glVertex2i (px , py ); 2421 glTexCoord2f (ox , 0.f ); glVertex2i (px , py );
2381 glTexCoord2f (ox , dy ); glVertex2i (px , py + T); 2422 glTexCoord2f (ox , dy ); glVertex2i (px , py + Th);
2382 glTexCoord2f (ox + dx, dy ); glVertex2i (px + T, py + T); 2423 glTexCoord2f (ox + dx, dy ); glVertex2i (px + Tw, py + Th);
2383 glTexCoord2f (ox + dx, 0.f ); glVertex2i (px + T, py ); 2424 glTexCoord2f (ox + dx, 0.f ); glVertex2i (px + Tw, py );
2384 } 2425 }
2385 2426
2386 if (corner) 2427 if (corner)
2387 { 2428 {
2388 float ox = corner * dx; 2429 float ox = corner * dx;
2389 2430
2390 glTexCoord2f (ox , dy ); glVertex2i (px , py ); 2431 glTexCoord2f (ox , dy ); glVertex2i (px , py );
2391 glTexCoord2f (ox , dy * 2.f); glVertex2i (px , py + T); 2432 glTexCoord2f (ox , dy * 2.f); glVertex2i (px , py + Th);
2392 glTexCoord2f (ox + dx, dy * 2.f); glVertex2i (px + T, py + T); 2433 glTexCoord2f (ox + dx, dy * 2.f); glVertex2i (px + Tw, py + Th);
2393 glTexCoord2f (ox + dx, dy ); glVertex2i (px + T, py ); 2434 glTexCoord2f (ox + dx, dy ); glVertex2i (px + Tw, py );
2394 } 2435 }
2395 } 2436 }
2396 } 2437 }
2397 } 2438 }
2398 } 2439 }
2439 for (x = 0; x < sw; x++) 2480 for (x = 0; x < sw; x++)
2440 if (row->c0 <= x + mx && x + mx < row->c1) 2481 if (row->c0 <= x + mx && x + mx < row->c1)
2441 { 2482 {
2442 mapcell *cell = row->col + (x + mx - row->c0); 2483 mapcell *cell = row->col + (x + mx - row->c0);
2443 2484
2444 int px = x * T; 2485 int px = x * Tw;
2445 int py = y * T; 2486 int py = y * Th;
2446 2487
2447 if (expect_false (cell->player == player)) 2488 if (expect_false (cell->player == player))
2448 { 2489 {
2449 px += sdx; 2490 px += sdx;
2450 py += sdy; 2491 py += sdy;
2451 } 2492 }
2452 2493
2453 if (cell->stat_hp) 2494 if (cell->stat_hp)
2454 { 2495 {
2455 int width = cell->stat_width * T; 2496 int width = cell->stat_width * Tw;
2456 int thick = (sh * T / 32 + 27) / 28 + 1 + cell->stat_width; 2497 int thick = (sh * Th / 32 + 27) / 28 + 1 + cell->stat_width;
2457 2498
2458 glColor3ub (0, 0, 0); 2499 glColor3ub (0, 0, 0);
2459 glRectf (px + 1, py - thick - 2, 2500 glRectf (px + 1, py - thick - 2,
2460 px + width - 1, py); 2501 px + width - 1, py);
2461 2502
2541 int x, y; 2582 int x, y;
2542 int sw1 = sw + 2; 2583 int sw1 = sw + 2;
2543 int sh1 = sh + 2; 2584 int sh1 = sh + 2;
2544 int sh3 = sh * 3; 2585 int sh3 = sh * 3;
2545 int sw3 = sw * 3; 2586 int sw3 = sw * 3;
2546 uint8_t *darkness1 = (uint8_t *)malloc (sw1 * sh1);
2547 SV *darkness3_sv = sv_2mortal (newSV (sw3 * sh3)); 2587 SV *darkness3_sv = sv_2mortal (newSV (sw3 * sh3));
2548 uint8_t *darkness3 = (uint8_t *)SvPVX (darkness3_sv); 2588 uint8_t *darkness3 = (uint8_t *)SvPVX (darkness3_sv);
2589 uint8_t *darkness1 = (uint8_t *)malloc (sw1 * sh1);
2590 memset (darkness1, 0, sw1*sh1);
2549 2591
2550 SvPOK_only (darkness3_sv); 2592 SvPOK_only (darkness3_sv);
2551 SvCUR_set (darkness3_sv, sw3 * sh3); 2593 SvCUR_set (darkness3_sv, sw3 * sh3);
2552 2594
2553 mx += self->x - 1; 2595 mx += self->x - 1;
2679 else 2721 else
2680 *data++ = 0; 2722 *data++ = 0;
2681 } 2723 }
2682 } 2724 }
2683 2725
2684 /* if size is w*h + 5 then no data has been found */ 2726 /* if size is w*h + 5 then no data has been found */
2685 if (data - (uint8_t *)SvPVX (data_sv) != w * h + 5) 2727 if (data - (uint8_t *)SvPVX (data_sv) != w * h + 5)
2686 { 2728 {
2687 SvPOK_only (data_sv); 2729 SvPOK_only (data_sv);
2688 SvCUR_set (data_sv, data - (uint8_t *)SvPVX (data_sv)); 2730 SvCUR_set (data_sv, data - (uint8_t *)SvPVX (data_sv));
2689 } 2731 }
2690 2732
2691 RETVAL = data_sv; 2733 RETVAL = data_sv;
2692} 2734}
2693 OUTPUT: 2735 OUTPUT:
2694 RETVAL 2736 RETVAL
2695 2737
2696void 2738void
2703 STRLEN len; 2745 STRLEN len;
2704 uint8_t *data, *end; 2746 uint8_t *data, *end;
2705 2747
2706 len = SvLEN (data_sv); 2748 len = SvLEN (data_sv);
2707 SvGROW (data_sv, len + 8); // reserve at least 7+ bytes more 2749 SvGROW (data_sv, len + 8); // reserve at least 7+ bytes more
2708 data = SvPVbyte_nolen (data_sv); 2750 data = (uint8_t *)SvPVbyte_nolen (data_sv);
2709 end = data + len + 8; 2751 end = data + len + 8;
2710 2752
2711 if (len < 5) 2753 if (len < 5)
2712 XSRETURN_EMPTY; 2754 XSRETURN_EMPTY;
2713 2755
2774} 2816}
2775 2817
2776MODULE = Deliantra::Client PACKAGE = DC::RW 2818MODULE = Deliantra::Client PACKAGE = DC::RW
2777 2819
2778DC::RW 2820DC::RW
2779new (SV *class, SV *data_sv) 2821new (SV *klass, SV *data_sv)
2780 CODE: 2822 CODE:
2781{ 2823{
2782 STRLEN datalen; 2824 STRLEN datalen;
2783 char *data = SvPVbyte (data_sv, datalen); 2825 char *data = SvPVbyte (data_sv, datalen);
2784 2826
2786} 2828}
2787 OUTPUT: 2829 OUTPUT:
2788 RETVAL 2830 RETVAL
2789 2831
2790DC::RW 2832DC::RW
2791new_from_file (SV *class, const char *path, const char *mode = "rb") 2833new_from_file (SV *klass, const char *path, const char *mode = "rb")
2792 CODE: 2834 CODE:
2793 RETVAL = SDL_RWFromFile (path, mode); 2835 RETVAL = SDL_RWFromFile (path, mode);
2794 OUTPUT: 2836 OUTPUT:
2795 RETVAL 2837 RETVAL
2796 2838
2905#else 2947#else
2906 XPUSHs (sv_2mortal (newSVpv ("(sdl mixer too old)", 0))); 2948 XPUSHs (sv_2mortal (newSVpv ("(sdl mixer too old)", 0)));
2907#endif 2949#endif
2908 2950
2909DC::MixChunk 2951DC::MixChunk
2910new (SV *class, DC::RW rwops) 2952new (SV *klass, DC::RW rwops)
2911 CODE: 2953 CODE:
2912 RETVAL = Mix_LoadWAV_RW (rwops, 1); 2954 RETVAL = Mix_LoadWAV_RW (rwops, 1);
2913 OUTPUT: 2955 OUTPUT:
2914 RETVAL 2956 RETVAL
2915 2957
2985 RETVAL = Mix_PlayingMusic (); 3027 RETVAL = Mix_PlayingMusic ();
2986 OUTPUT: 3028 OUTPUT:
2987 RETVAL 3029 RETVAL
2988 3030
2989DC::MixMusic 3031DC::MixMusic
2990new (SV *class, DC::RW rwops) 3032new (SV *klass, DC::RW rwops)
2991 CODE: 3033 CODE:
2992 RETVAL = Mix_LoadMUS_RW (rwops); 3034 RETVAL = Mix_LoadMUS_RW (rwops);
2993 OUTPUT: 3035 OUTPUT:
2994 RETVAL 3036 RETVAL
2995 3037
3132 const_iv (GL_FUNC_SUBTRACT), 3174 const_iv (GL_FUNC_SUBTRACT),
3133 const_iv (GL_FUNC_REVERSE_SUBTRACT), 3175 const_iv (GL_FUNC_REVERSE_SUBTRACT),
3134# undef const_iv 3176# undef const_iv
3135 }; 3177 };
3136 3178
3137 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; ) 3179 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ > const_iv; civ--)
3138 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv)); 3180 newCONSTSUB (stash, (char *)civ[-1].name, newSViv (civ[-1].iv));
3139 3181
3140 texture_av = newAV (); 3182 texture_av = newAV ();
3141 AvREAL_off (texture_av); 3183 AvREAL_off (texture_av);
3142} 3184}
3143 3185
3148 gl.BlendFuncSeparateEXT = 0; 3190 gl.BlendFuncSeparateEXT = 0;
3149 3191
3150void 3192void
3151apple_nvidia_bug (int enable) 3193apple_nvidia_bug (int enable)
3152 3194
3153char * 3195const char *
3154gl_vendor () 3196gl_vendor ()
3155 CODE: 3197 CODE:
3156 RETVAL = (char *)glGetString (GL_VENDOR); 3198 RETVAL = (const char *)glGetString (GL_VENDOR);
3157 OUTPUT: 3199 OUTPUT:
3158 RETVAL 3200 RETVAL
3159 3201
3160char * 3202const char *
3161gl_version () 3203gl_version ()
3162 CODE: 3204 CODE:
3163 RETVAL = (char *)glGetString (GL_VERSION); 3205 RETVAL = (const char *)glGetString (GL_VERSION);
3164 OUTPUT: 3206 OUTPUT:
3165 RETVAL 3207 RETVAL
3166 3208
3167char * 3209const char *
3168gl_extensions () 3210gl_extensions ()
3169 CODE: 3211 CODE:
3170 RETVAL = (char *)glGetString (GL_EXTENSIONS); 3212 RETVAL = (const char *)glGetString (GL_EXTENSIONS);
3171 OUTPUT: 3213 OUTPUT:
3172 RETVAL 3214 RETVAL
3173 3215
3174const char *glGetString (GLenum pname) 3216const char *glGetString (GLenum pname)
3217 CODE:
3218 RETVAL = (const char *)glGetString (pname);
3219 OUTPUT:
3220 RETVAL
3175 3221
3176GLint glGetInteger (GLenum pname) 3222GLint glGetInteger (GLenum pname)
3177 CODE: 3223 CODE:
3178 glGetIntegerv (pname, &RETVAL); 3224 glGetIntegerv (pname, &RETVAL);
3179 OUTPUT: 3225 OUTPUT:
3382 3428
3383void 3429void
3384find_widget (SV *self, NV x, NV y) 3430find_widget (SV *self, NV x, NV y)
3385 PPCODE: 3431 PPCODE:
3386{ 3432{
3387 if (within_widget (self, x, y)) 3433 if (within_widget (self, x, y))
3388 XPUSHs (self); 3434 XPUSHs (self);
3389} 3435}
3390 3436
3391BOOT: 3437BOOT:
3392{ 3438{
3400 3446
3401void 3447void
3402draw (SV *self) 3448draw (SV *self)
3403 CODE: 3449 CODE:
3404{ 3450{
3405 HV *hv; 3451 HV *hv;
3406 SV **svp; 3452 SV **svp;
3407 NV x, y, w, h; 3453 NV x, y, w, h;
3408 SV *draw_x_sv = GvSV (draw_x_gv); 3454 SV *draw_x_sv = GvSV (draw_x_gv);
3409 SV *draw_y_sv = GvSV (draw_y_gv); 3455 SV *draw_y_sv = GvSV (draw_y_gv);
3410 SV *draw_w_sv = GvSV (draw_w_gv); 3456 SV *draw_w_sv = GvSV (draw_w_gv);
3411 SV *draw_h_sv = GvSV (draw_h_gv); 3457 SV *draw_h_sv = GvSV (draw_h_gv);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines