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.295 by root, Mon Dec 21 03:30:22 2009 UTC vs.
Revision 1.311 by root, Tue Dec 27 09:17:27 2011 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
80#define expect_false(expr) expect ((expr) != 0, 0) 82#define expect_false(expr) expect ((expr) != 0, 0)
81#define expect_true(expr) expect ((expr) != 0, 1) 83#define expect_true(expr) expect ((expr) != 0, 1)
82 84
83#define OBJ_STR "\xef\xbf\xbc" /* U+FFFC, object replacement character */ 85#define OBJ_STR "\xef\xbf\xbc" /* U+FFFC, object replacement character */
84 86
87/* this is used as fow flag as well, so has to have a different value */
88/* then anything that is computed by incoming darkness */
85#define FOW_DARKNESS 64 89#define FOW_DARKNESS 50
86#define DARKNESS_ADJUST(n) ((29 * (int)(n)) >> 5) /* times 0.9 */ 90#define DARKNESS_ADJUST(n) (n)
87 91
88#define MAP_EXTEND_X 32 92#define MAP_EXTEND_X 32
89#define MAP_EXTEND_Y 512 93#define MAP_EXTEND_Y 512
90 94
91#define MIN_FONT_HEIGHT 10 95#define MIN_FONT_HEIGHT 10
95 99
96#define KMOD_LRAM 0x10000 // our extension 100#define KMOD_LRAM 0x10000 // our extension
97 101
98#define TEXID_SPEECH 1 102#define TEXID_SPEECH 1
99#define TEXID_NOFACE 2 103#define TEXID_NOFACE 2
100#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}
101 123
102static AV *texture_av; 124static AV *texture_av;
103 125
104static struct 126static struct
105{ 127{
460 482
461 SDL_PushEvent ((SDL_Event *)&ev); 483 SDL_PushEvent ((SDL_Event *)&ev);
462} 484}
463 485
464static unsigned int 486static unsigned int
487div255 (unsigned int n)
488{
489 return (n + (n >> 8)) >> 8;
490}
491
492static unsigned int
465minpot (unsigned int n) 493minpot (unsigned int n)
466{ 494{
467 if (!n) 495 if (!n)
468 return 0; 496 return 0;
469 497
552 580
553static void 581static void
554deliantra_main () 582deliantra_main ()
555{ 583{
556 char *argv[] = { 0 }; 584 char *argv[] = { 0 };
557 call_argv ("::main", G_DISCARD | G_VOID, argv); 585 call_argv ("DC::Main::main", G_DISCARD | G_VOID, argv);
558} 586}
559 587
560#ifdef __MACOSX__ 588#ifdef __MACOSX__
561 /* to due surprising braindamage on the side of SDL design, we 589 /* to due surprising braindamage on the side of SDL design, we
562 * do some mind-boggling hack here: SDL requires a custom main() 590 * do some mind-boggling hack here: SDL requires a custom main()
563 * 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,
564 * 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,
565 * and which calls our main (== SDL_main) back. 593 * and which calls our main (== SDL_main) back.
566 */ 594 */
567 extern C_LINKAGE int 595 extern C_LINKAGE int
568 main (int argc, char *argv[]) 596 main (int argc, char *argv[])
569 { 597 {
793 821
794 const_iv (FOW_DARKNESS) 822 const_iv (FOW_DARKNESS)
795# undef const_iv 823# undef const_iv
796 }; 824 };
797 825
798 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--)
799 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv)); 827 newCONSTSUB (stash, (char *)civ[-1].name, newSViv (civ[-1].iv));
800 828
801 assert (SDLK_MODIFIER_MIN == SDLK_NUMLOCK); 829 assert (SDLK_MODIFIER_MIN == SDLK_NUMLOCK);
802 assert (SDLK_MODIFIER_MAX == SDLK_COMPOSE); 830 assert (SDLK_MODIFIER_MAX == SDLK_COMPOSE);
803} 831}
804 832
927 955
928 SDL_WM_SetCaption ("Deliantra MORPG Client " VERSION, "Deliantra"); 956 SDL_WM_SetCaption ("Deliantra MORPG Client " VERSION, "Deliantra");
929#define GL_FUNC(ptr,name) gl.name = (ptr)SDL_GL_GetProcAddress ("gl" # name); 957#define GL_FUNC(ptr,name) gl.name = (ptr)SDL_GL_GetProcAddress ("gl" # name);
930#include "glfunc.h" 958#include "glfunc.h"
931#undef GL_FUNC 959#undef GL_FUNC
960
961 if (!gl.ActiveTexture ) gl.ActiveTexture = gl.ActiveTextureARB;
962 if (!gl.MultiTexCoord2f) gl.MultiTexCoord2f = gl.MultiTexCoord2fARB;
932 } 963 }
933} 964}
934 OUTPUT: 965 OUTPUT:
935 RETVAL 966 RETVAL
936 967
944SDL_GetAppState () 975SDL_GetAppState ()
945 976
946int 977int
947SDL_GetModState () 978SDL_GetModState ()
948 979
980int
981SDL_WaitEvent ()
982 C_ARGS: 0
983
949void 984void
985SDL_PumpEvents ()
986
987void
950poll_events () 988peep_events ()
951 PPCODE: 989 PPCODE:
952{ 990{
953 SDL_Event ev; 991 SDL_Event ev;
954 992
955 SDL_PumpEvents (); 993 SDL_PumpEvents ();
1021 1059
1022 XPUSHs (sv_2mortal (sv_bless (newRV_noinc ((SV *)hv), gv_stashpv ("DC::UI::Event", 1)))); 1060 XPUSHs (sv_2mortal (sv_bless (newRV_noinc ((SV *)hv), gv_stashpv ("DC::UI::Event", 1))));
1023 } 1061 }
1024} 1062}
1025 1063
1064char *
1065SDL_AudioDriverName ()
1066 CODE:
1067{
1068 char buf [256];
1069 if (!SDL_AudioDriverName (buf, sizeof (buf)))
1070 XSRETURN_UNDEF;
1071
1072 RETVAL = buf;
1073}
1074 OUTPUT:
1075 RETVAL
1076
1026int 1077int
1027Mix_OpenAudio (int frequency = 44100, int format = MIX_DEFAULT_FORMAT, int channels = 2, int chunksize = 4096) 1078Mix_OpenAudio (int frequency = 44100, int format = MIX_DEFAULT_FORMAT, int channels = 2, int chunksize = 4096)
1028 POSTCALL: 1079 POSTCALL:
1029 Mix_HookMusicFinished (music_finished); 1080 Mix_HookMusicFinished (music_finished);
1030 Mix_ChannelFinished (channel_finished); 1081 Mix_ChannelFinished (channel_finished);
1092add_font (char *file) 1143add_font (char *file)
1093 CODE: 1144 CODE:
1094 RETVAL = FcConfigAppFontAddFile (0, (const FcChar8 *)file); 1145 RETVAL = FcConfigAppFontAddFile (0, (const FcChar8 *)file);
1095 OUTPUT: 1146 OUTPUT:
1096 RETVAL 1147 RETVAL
1148
1149void
1150IMG_Init (int flags = IMG_INIT_JPG | IMG_INIT_PNG)
1151
1152void
1153Mix_Init (int flags = MIX_INIT_MOD | MIX_INIT_MP3 | MIX_INIT_OGG)
1097 1154
1098void 1155void
1099load_image_inline (SV *image_) 1156load_image_inline (SV *image_)
1100 ALIAS: 1157 ALIAS:
1101 load_image_file = 1 1158 load_image_file = 1
1665 glDisable (GL_BLEND); 1722 glDisable (GL_BLEND);
1666 } 1723 }
1667} 1724}
1668 1725
1669void 1726void
1670draw_fow_texture (float intensity, int name1, float s1, float t1, float w1, float h1, float blend = 0.f, float dx = 0.f, float dy = 0.f, int name2 = 0, float s2 = 0.f, float t2 = 0.f, float w2 = 0.f, float h2 = 0.f) 1727draw_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)
1671 PROTOTYPE: @ 1728 PROTOTYPE: @
1672 CODE: 1729 CODE:
1673{ 1730{
1731 glEnable (GL_BLEND);
1732 glBlendFunc (intensity ? GL_SRC_ALPHA : GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
1674 glEnable (GL_TEXTURE_2D); 1733 glEnable (GL_TEXTURE_2D);
1675 glEnable (GL_BLEND);
1676 glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
1677 glBindTexture (GL_TEXTURE_2D, name1); 1734 glBindTexture (GL_TEXTURE_2D, name1);
1678 1735
1679 glColor3f (intensity, intensity, intensity); 1736 glColor3f (intensity, intensity, intensity);
1680 glPushMatrix (); 1737 glPushMatrix ();
1681 glScalef (1./3, 1./3, 1.); 1738 glScalef (1./3, 1./3, 1.);
1682 1739
1683 if (blend > 0.f) 1740 if (blend > 0.f)
1684 { 1741 {
1685 float S2, T2; /* 0. 0. for texture 2 */ 1742 float dx3 = dx * -3.f / w;
1686 float w = w1 > w2 ? w1 : w2; 1743 float dy3 = dy * -3.f / h;
1687 float h = h1 > h2 ? h1 : h2;
1688 GLfloat env_color[4] = { 0., 0., 0., blend }; 1744 GLfloat env_color[4] = { 0., 0., 0., blend };
1689 1745
1690 /* interpolate the two shadow textures */ 1746 /* interpolate the two shadow textures */
1691 /* stage 0 == rgb(glcolor) + alpha(t0) */ 1747 /* stage 0 == rgb(glcolor) + alpha(t0) */
1692 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 1748 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
1697 glBindTexture (GL_TEXTURE_2D, name2); 1753 glBindTexture (GL_TEXTURE_2D, name2);
1698 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); 1754 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
1699 1755
1700 /* rgb == rgb(glcolor) */ 1756 /* rgb == rgb(glcolor) */
1701 glTexEnvi (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE); 1757 glTexEnvi (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);
1702 glTexEnvi (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_CONSTANT); 1758 glTexEnvi (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PRIMARY_COLOR);
1703 glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR); 1759 glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
1704 1760
1705 /* alpha = interpolate t0, t1 by env_alpha */ 1761 /* alpha = interpolate t0, t1 by env_alpha */
1706 glTexEnvfv (GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, env_color); 1762 glTexEnvfv (GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, env_color);
1707 1763
1713 glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA); 1769 glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA);
1714 1770
1715 glTexEnvi (GL_TEXTURE_ENV, GL_SOURCE2_ALPHA, GL_CONSTANT); 1771 glTexEnvi (GL_TEXTURE_ENV, GL_SOURCE2_ALPHA, GL_CONSTANT);
1716 glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND2_ALPHA, GL_SRC_ALPHA); 1772 glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND2_ALPHA, GL_SRC_ALPHA);
1717 1773
1718 s1 *= w / w1;
1719 t1 *= h / h1;
1720
1721 dx *= -3.f / w2;
1722 dy *= -3.f / h2;
1723 dx *= w / w2;
1724 dy *= h / h2;
1725
1726 s2 *= w / w2;
1727 t2 *= h / h2;
1728
1729 glBegin (GL_QUADS); 1774 glBegin (GL_QUADS);
1730 gl.MultiTexCoord2f (GL_TEXTURE0, 0, 0); gl.MultiTexCoord2f (GL_TEXTURE1, dx , dy ); glVertex2f ( 0, 0); 1775 gl.MultiTexCoord2f (GL_TEXTURE0, 0, 0); gl.MultiTexCoord2f (GL_TEXTURE1, dx3 , dy3 ); glVertex2i (0, 0);
1731 gl.MultiTexCoord2f (GL_TEXTURE0, 0, t1); gl.MultiTexCoord2f (GL_TEXTURE1, dx , dy + t2); glVertex2f ( 0, h1); 1776 gl.MultiTexCoord2f (GL_TEXTURE0, 0, t); gl.MultiTexCoord2f (GL_TEXTURE1, dx3 , dy3 + t); glVertex2i (0, h);
1732 gl.MultiTexCoord2f (GL_TEXTURE0, s1, t1); gl.MultiTexCoord2f (GL_TEXTURE1, dx + s2, dy + t2); glVertex2f (w1, h1); 1777 gl.MultiTexCoord2f (GL_TEXTURE0, s, t); gl.MultiTexCoord2f (GL_TEXTURE1, dx3 + s, dy3 + t); glVertex2i (w, h);
1733 gl.MultiTexCoord2f (GL_TEXTURE0, s1, 0); gl.MultiTexCoord2f (GL_TEXTURE1, dx + s2, dy ); glVertex2f (w1, 0); 1778 gl.MultiTexCoord2f (GL_TEXTURE0, s, 0); gl.MultiTexCoord2f (GL_TEXTURE1, dx3 + s, dy3 ); glVertex2i (w, 0);
1734 glEnd (); 1779 glEnd ();
1735 1780
1736 glDisable (GL_TEXTURE_2D); 1781 glDisable (GL_TEXTURE_2D);
1737 gl.ActiveTexture (GL_TEXTURE0); 1782 gl.ActiveTexture (GL_TEXTURE0);
1738 } 1783 }
1740 { 1785 {
1741 /* simple blending of one texture, also opengl <1.3 path */ 1786 /* simple blending of one texture, also opengl <1.3 path */
1742 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 1787 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
1743 1788
1744 glBegin (GL_QUADS); 1789 glBegin (GL_QUADS);
1745 glTexCoord2f ( 0, 0); glVertex2f ( 0, 0); 1790 glTexCoord2f (0, 0); glVertex2f (0, 0);
1746 glTexCoord2f ( 0, t1); glVertex2f ( 0, h1); 1791 glTexCoord2f (0, t); glVertex2f (0, h);
1747 glTexCoord2f (s1, t1); glVertex2f (w1, h1); 1792 glTexCoord2f (s, t); glVertex2f (w, h);
1748 glTexCoord2f (s1, 0); glVertex2f (w1, 0); 1793 glTexCoord2f (s, 0); glVertex2f (w, 0);
1749 glEnd (); 1794 glEnd ();
1750 } 1795 }
1796
1797 /* draw ?-marks or equivalent, this is very clumsy code :/ */
1798 {
1799 int x, y;
1800 int dx3 = dx * 3;
1801 int dy3 = dy * 3;
1802
1803 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
1804 glBindTexture (GL_TEXTURE_2D, hidden_tex);
1805 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
1806 glTranslatef (-1., -1., 0);
1807 glBegin (GL_QUADS);
1808
1809 for (y = 1; y < h; y += 3)
1810 {
1811 int y1 = y - dy3;
1812 int y1valid = y1 >= 0 && y1 < h;
1813
1814 for (x = 1; x < w; x += 3)
1815 {
1816 int x1 = x - dx3;
1817 uint8_t h1 = data1 [x + y * w] == DARKNESS_ADJUST (255 - FOW_DARKNESS);
1818 uint8_t h2;
1819
1820 if (y1valid && x1 >= 0 && x1 < w)
1821 h2 = data2 [x1 + y1 * w] == DARKNESS_ADJUST (255 - FOW_DARKNESS);
1822 else
1823 h2 = 1; /* out of range == invisible */
1824
1825 if (h1 || h2)
1826 {
1827 float alpha = h1 == h2 ? 1.f : h1 ? 1.f - blend : blend;
1828 glColor4f (1., 1., 1., alpha);
1829
1830 glTexCoord2f (0, 0.); glVertex2i (x , y );
1831 glTexCoord2f (0, 1.); glVertex2i (x , y + 3);
1832 glTexCoord2f (1, 1.); glVertex2i (x + 3, y + 3);
1833 glTexCoord2f (1, 0.); glVertex2i (x + 3, y );
1834 }
1835 }
1836 }
1837 }
1838
1839 glEnd ();
1751 1840
1752 glPopMatrix (); 1841 glPopMatrix ();
1753 1842
1754 glDisable (GL_TEXTURE_2D); 1843 glDisable (GL_TEXTURE_2D);
1755 glDisable (GL_BLEND); 1844 glDisable (GL_BLEND);
1976 { 2065 {
1977 ext = *data++; 2066 ext = *data++;
1978 cmd = ext & 0x7f; 2067 cmd = ext & 0x7f;
1979 2068
1980 if (cmd < 4) 2069 if (cmd < 4)
1981 cell->darkness = 255 - ext * 64 + 1; 2070 cell->darkness = 255 - ext * 64 + 1; /* make sure this doesn't collide with FOW_DARKNESS */
1982 else if (cmd == 5) // health 2071 else if (cmd == 5) // health
1983 { 2072 {
1984 cell->stat_width = 1; 2073 cell->stat_width = 1;
1985 cell->stat_hp = *data++; 2074 cell->stat_hp = *data++;
1986 } 2075 }
2061 ? self->row + y 2150 ? self->row + y
2062 : 0; 2151 : 0;
2063 2152
2064 for (x = x0; x < x1; x++) 2153 for (x = x0; x < x1; x++)
2065 { 2154 {
2066 int r = 32, g = 32, b = 32, a = 192; 2155 unsigned int r = 32, g = 32, b = 32, a = 192;
2067 2156
2068 if (row && row->c0 <= x && x < row->c1) 2157 if (row && row->c0 <= x && x < row->c1)
2069 { 2158 {
2070 mapcell *cell = row->col + (x - row->c0); 2159 mapcell *cell = row->col + (x - row->c0);
2071 2160
2073 { 2162 {
2074 maptex tex = self->tex [cell->tile [z]]; 2163 maptex tex = self->tex [cell->tile [z]];
2075 int a0 = 255 - tex.a; 2164 int a0 = 255 - tex.a;
2076 int a1 = tex.a; 2165 int a1 = tex.a;
2077 2166
2078 r = (r * a0 + tex.r * a1) / 255; 2167 r = div255 (r * a0 + tex.r * a1);
2079 g = (g * a0 + tex.g * a1) / 255; 2168 g = div255 (g * a0 + tex.g * a1);
2080 b = (b * a0 + tex.b * a1) / 255; 2169 b = div255 (b * a0 + tex.b * a1);
2081 a = (a * a0 + tex.a * a1) / 255; 2170 a = div255 (a * a0 + tex.a * a1);
2082 } 2171 }
2083 } 2172 }
2084 2173
2085 *map++ = (r ) 2174 *map++ = (r )
2086 | (g << 8) 2175 | (g << 8)
2093} 2182}
2094 OUTPUT: 2183 OUTPUT:
2095 RETVAL 2184 RETVAL
2096 2185
2097void 2186void
2098draw (DC::Map self, int mx, int my, int sw, int sh, int T, U32 player = 0xffffffff, int sdx = 0, int sdy = 0) 2187draw (DC::Map self, int mx, int my, int sw, int sh, int Tw, int Th, U32 player = 0xffffffff, int sdx = 0, int sdy = 0)
2099 CODE: 2188 CODE:
2100{ 2189{
2101 int x, y, z; 2190 int x, y, z;
2102 2191
2103 HV *smooth = (HV *)sv_2mortal ((SV *)newHV ()); 2192 HV *smooth = (HV *)sv_2mortal ((SV *)newHV ());
2107 int pl_x, pl_y; 2196 int pl_x, pl_y;
2108 maptex pl_tex; 2197 maptex pl_tex;
2109 rc_t *rc = rc_alloc (); 2198 rc_t *rc = rc_alloc ();
2110 rc_t *rc_ov = rc_alloc (); 2199 rc_t *rc_ov = rc_alloc ();
2111 rc_key_t key; 2200 rc_key_t key;
2112 rc_array_t *arr, *arr_hidden; 2201 rc_array_t *arr;
2113 2202
2114 pl_tex.name = 0; 2203 pl_tex.name = 0;
2115 2204
2116 // that's current max. sorry. 2205 // that's current max. sorry.
2117 if (sw > 255) sw = 255; 2206 if (sw > 255) sw = 255;
2154 } 2243 }
2155 2244
2156 glEnable (GL_BLEND); 2245 glEnable (GL_BLEND);
2157 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 2246 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
2158 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 2247 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
2159
2160 key.texname = self->tex [TEXID_HIDDEN].name;
2161 arr_hidden = rc_array (rc_ov, &key);
2162 2248
2163 for (z = 0; z <= 2; z++) 2249 for (z = 0; z <= 2; z++)
2164 { 2250 {
2165 memset (smooth_level, 0, sizeof (smooth_level)); 2251 memset (smooth_level, 0, sizeof (smooth_level));
2166 key.texname = -1; 2252 key.texname = -1;
2190 2276
2191 key.texname = tex.name; 2277 key.texname = tex.name;
2192 arr = rc_array (rc, &key); 2278 arr = rc_array (rc, &key);
2193 } 2279 }
2194 2280
2195 px = (x + 1) * T - tex.w; 2281 px = (x + 1) * Th - tex.w;
2196 py = (y + 1) * T - tex.h; 2282 py = (y + 1) * Tw - tex.h;
2197 2283
2198 if (expect_false (cell->player == player) && expect_false (z == 2)) 2284 if (expect_false (cell->player == player) && expect_false (z == 2))
2199 { 2285 {
2200 pl_x = px; 2286 pl_x = px;
2201 pl_y = py; 2287 pl_y = py;
2246 skey.x = x ; skey.y = y ; smooth_or_bits (smooth, &skey, 0x0400); 2332 skey.x = x ; skey.y = y ; smooth_or_bits (smooth, &skey, 0x0400);
2247 skey.x = x + 2; skey.y = y ; smooth_or_bits (smooth, &skey, 0x0800); 2333 skey.x = x + 2; skey.y = y ; smooth_or_bits (smooth, &skey, 0x0800);
2248 } 2334 }
2249 } 2335 }
2250 2336
2251 if (expect_false (z == 2)) 2337 if (expect_false (z == 2) && expect_false (cell->flags))
2252 { 2338 {
2253 /* draw question marks on top of hidden spaces */ 2339 // overlays such as the speech bubble, probably more to come
2254 if (!cell->darkness) 2340 if (cell->flags & 1)
2255 { 2341 {
2256 maptex tex = self->tex [TEXID_HIDDEN];
2257 int px = (x + 1) * T - tex.w;
2258 int py = (y + 1) * T - tex.h;
2259
2260 rc_t2f_v3f (arr_hidden, 0 , 0 , px , py , 0);
2261 rc_t2f_v3f (arr_hidden, 0 , tex.t, px , py + tex.h, 0);
2262 rc_t2f_v3f (arr_hidden, tex.s, tex.t, px + tex.w, py + tex.h, 0);
2263 rc_t2f_v3f (arr_hidden, tex.s, 0 , px + tex.w, py , 0);
2264 }
2265
2266 if (expect_false (cell->flags))
2267 {
2268 // overlays such as the speech bubble, probably more to come
2269 if (cell->flags & 1)
2270 {
2271 rc_key_t key_ov = key; 2342 rc_key_t key_ov = key;
2272 maptex tex = self->tex [TEXID_SPEECH]; 2343 maptex tex = self->tex [TEXID_SPEECH];
2273 rc_array_t *arr; 2344 rc_array_t *arr;
2274 int px = x * T + T * 2 / 32; 2345 int px = x * Tw + Tw * 2 / 32;
2275 int py = y * T - T * 6 / 32; 2346 int py = y * Th - Th * 6 / 32;
2276 2347
2277 key_ov.texname = tex.name; 2348 key_ov.texname = tex.name;
2278 arr = rc_array (rc_ov, &key_ov); 2349 arr = rc_array (rc_ov, &key_ov);
2279 2350
2280 rc_t2f_v3f (arr, 0 , 0 , px , py , 0); 2351 rc_t2f_v3f (arr, 0 , 0 , px , py , 0);
2281 rc_t2f_v3f (arr, 0 , tex.t, px , py + T, 0); 2352 rc_t2f_v3f (arr, 0 , tex.t, px , py + Th, 0);
2282 rc_t2f_v3f (arr, tex.s, tex.t, px + T, py + T, 0); 2353 rc_t2f_v3f (arr, tex.s, tex.t, px + Tw, py + Th, 0);
2283 rc_t2f_v3f (arr, tex.s, 0 , px + T, py , 0); 2354 rc_t2f_v3f (arr, tex.s, 0 , px + Tw, py , 0);
2284 }
2285 } 2355 }
2286 } 2356 }
2287 } 2357 }
2288 } 2358 }
2289 2359
2316 if (!(bits & 0x1000) 2386 if (!(bits & 0x1000)
2317 && skey->level == level 2387 && skey->level == level
2318 && level > smooth_max [skey->x][skey->y]) 2388 && level > smooth_max [skey->x][skey->y])
2319 { 2389 {
2320 maptex tex = self->tex [skey->tile]; 2390 maptex tex = self->tex [skey->tile];
2321 int px = (((int)skey->x) - 1) * T; 2391 int px = (((int)skey->x) - 1) * Tw;
2322 int py = (((int)skey->y) - 1) * T; 2392 int py = (((int)skey->y) - 1) * Th;
2323 int border = bits & 15; 2393 int border = bits & 15;
2324 int corner = (bits >> 8) & ~(bits >> 4) & 15; 2394 int corner = (bits >> 8) & ~(bits >> 4) & 15;
2325 float dx = tex.s * .0625f; // 16 images/row 2395 float dx = tex.s * .0625f; // 16 images/row
2326 float dy = tex.t * .5f ; // 2 images/column 2396 float dy = tex.t * .5f ; // 2 images/column
2327 2397
2340 2410
2341 if (border) 2411 if (border)
2342 { 2412 {
2343 float ox = border * dx; 2413 float ox = border * dx;
2344 2414
2345 glTexCoord2f (ox , 0.f ); glVertex2i (px , py ); 2415 glTexCoord2f (ox , 0.f ); glVertex2i (px , py );
2346 glTexCoord2f (ox , dy ); glVertex2i (px , py + T); 2416 glTexCoord2f (ox , dy ); glVertex2i (px , py + Th);
2347 glTexCoord2f (ox + dx, dy ); glVertex2i (px + T, py + T); 2417 glTexCoord2f (ox + dx, dy ); glVertex2i (px + Tw, py + Th);
2348 glTexCoord2f (ox + dx, 0.f ); glVertex2i (px + T, py ); 2418 glTexCoord2f (ox + dx, 0.f ); glVertex2i (px + Tw, py );
2349 } 2419 }
2350 2420
2351 if (corner) 2421 if (corner)
2352 { 2422 {
2353 float ox = corner * dx; 2423 float ox = corner * dx;
2354 2424
2355 glTexCoord2f (ox , dy ); glVertex2i (px , py ); 2425 glTexCoord2f (ox , dy ); glVertex2i (px , py );
2356 glTexCoord2f (ox , dy * 2.f); glVertex2i (px , py + T); 2426 glTexCoord2f (ox , dy * 2.f); glVertex2i (px , py + Th);
2357 glTexCoord2f (ox + dx, dy * 2.f); glVertex2i (px + T, py + T); 2427 glTexCoord2f (ox + dx, dy * 2.f); glVertex2i (px + Tw, py + Th);
2358 glTexCoord2f (ox + dx, dy ); glVertex2i (px + T, py ); 2428 glTexCoord2f (ox + dx, dy ); glVertex2i (px + Tw, py );
2359 } 2429 }
2360 } 2430 }
2361 } 2431 }
2362 } 2432 }
2363 } 2433 }
2404 for (x = 0; x < sw; x++) 2474 for (x = 0; x < sw; x++)
2405 if (row->c0 <= x + mx && x + mx < row->c1) 2475 if (row->c0 <= x + mx && x + mx < row->c1)
2406 { 2476 {
2407 mapcell *cell = row->col + (x + mx - row->c0); 2477 mapcell *cell = row->col + (x + mx - row->c0);
2408 2478
2409 int px = x * T; 2479 int px = x * Tw;
2410 int py = y * T; 2480 int py = y * Th;
2411 2481
2412 if (expect_false (cell->player == player)) 2482 if (expect_false (cell->player == player))
2413 { 2483 {
2414 px += sdx; 2484 px += sdx;
2415 py += sdy; 2485 py += sdy;
2416 } 2486 }
2417 2487
2418 if (cell->stat_hp) 2488 if (cell->stat_hp)
2419 { 2489 {
2420 int width = cell->stat_width * T; 2490 int width = cell->stat_width * Tw;
2421 int thick = (sh * T / 32 + 27) / 28 + 1 + cell->stat_width; 2491 int thick = (sh * Th / 32 + 27) / 28 + 1 + cell->stat_width;
2422 2492
2423 glColor3ub (0, 0, 0); 2493 glColor3ub (0, 0, 0);
2424 glRectf (px + 1, py - thick - 2, 2494 glRectf (px + 1, py - thick - 2,
2425 px + width - 1, py); 2495 px + width - 1, py);
2426 2496
2463 int x, y; 2533 int x, y;
2464 2534
2465 glEnable (GL_TEXTURE_2D); 2535 glEnable (GL_TEXTURE_2D);
2466 /* GL_REPLACE would be correct, as we don't need to modulate alpha, 2536 /* GL_REPLACE would be correct, as we don't need to modulate alpha,
2467 * but the nvidia driver (185.18.14) mishandles alpha textures 2537 * but the nvidia driver (185.18.14) mishandles alpha textures
2468 * ansd takes the colour from god knows where instead of using 2538 * and takes the colour from god knows where instead of using
2469 * Cp. MODULATE results in the same colour, but slightly different 2539 * Cp. MODULATE results in the same colour, but slightly different
2470 * alpha, but atcually gives us the correct colour with nvidia. 2540 * alpha, but atcually gives us the correct colour with nvidia.
2471 */ 2541 */
2472 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 2542 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
2473 glEnable (GL_BLEND); 2543 glEnable (GL_BLEND);
2502void 2572void
2503fow_texture (DC::Map self, int mx, int my, int sw, int sh) 2573fow_texture (DC::Map self, int mx, int my, int sw, int sh)
2504 PPCODE: 2574 PPCODE:
2505{ 2575{
2506 int x, y; 2576 int x, y;
2507 int sw1 = sw + 2; 2577 int sw1 = sw + 2;
2508 int sh1 = sh + 2; 2578 int sh1 = sh + 2;
2509 int sh3 = sh * 3; 2579 int sh3 = sh * 3;
2510 int sw34 = (sw * 3 + 3) & ~3; 2580 int sw3 = sw * 3;
2581 SV *darkness3_sv = sv_2mortal (newSV (sw3 * sh3));
2582 uint8_t *darkness3 = (uint8_t *)SvPVX (darkness3_sv);
2511 uint8_t *darkness1 = (uint8_t *)malloc (sw1 * sh1); 2583 uint8_t *darkness1 = (uint8_t *)malloc (sw1 * sh1);
2512 SV *darkness3_sv = sv_2mortal (newSV (sw34 * sh3)); 2584 memset (darkness1, 0, sw1*sh1);
2513 uint8_t *darkness3 = (uint8_t *)SvPVX (darkness3_sv);
2514 2585
2515 SvPOK_only (darkness3_sv); 2586 SvPOK_only (darkness3_sv);
2516 SvCUR_set (darkness3_sv, sw34 * sh3); 2587 SvCUR_set (darkness3_sv, sw3 * sh3);
2517 2588
2518 mx += self->x - 1; 2589 mx += self->x - 1;
2519 my += self->y - 1; 2590 my += self->y - 1;
2520
2521 memset (darkness1, DARKNESS_ADJUST (255 - FOW_DARKNESS), sw1 * sh1);
2522 2591
2523 for (y = 0; y < sh1; y++) 2592 for (y = 0; y < sh1; y++)
2524 if (0 <= y + my && y + my < self->rows) 2593 if (0 <= y + my && y + my < self->rows)
2525 { 2594 {
2526 maprow *row = self->row + (y + my); 2595 maprow *row = self->row + (y + my);
2559 2628
2560 uint8_t r13 = (d13 + d23 + d12) / 3; 2629 uint8_t r13 = (d13 + d23 + d12) / 3;
2561 uint8_t r23 = d23; 2630 uint8_t r23 = d23;
2562 uint8_t r33 = (d23 + d33 + d32) / 3; 2631 uint8_t r33 = (d23 + d33 + d32) / 3;
2563 2632
2564 darkness3 [(y * 3 ) * sw34 + (x * 3 )] = MAX (d22, r11); 2633 darkness3 [(y * 3 ) * sw3 + (x * 3 )] = MAX (d22, r11);
2565 darkness3 [(y * 3 ) * sw34 + (x * 3 + 1)] = MAX (d22, r21); 2634 darkness3 [(y * 3 ) * sw3 + (x * 3 + 1)] = MAX (d22, r21);
2566 darkness3 [(y * 3 ) * sw34 + (x * 3 + 2)] = MAX (d22, r31); 2635 darkness3 [(y * 3 ) * sw3 + (x * 3 + 2)] = MAX (d22, r31);
2567 darkness3 [(y * 3 + 1) * sw34 + (x * 3 )] = MAX (d22, r12); 2636 darkness3 [(y * 3 + 1) * sw3 + (x * 3 )] = MAX (d22, r12);
2568 darkness3 [(y * 3 + 1) * sw34 + (x * 3 + 1)] = MAX (d22, r22); 2637 darkness3 [(y * 3 + 1) * sw3 + (x * 3 + 1)] = MAX (d22, r22); /* this MUST be == d22 */
2569 darkness3 [(y * 3 + 1) * sw34 + (x * 3 + 2)] = MAX (d22, r32); 2638 darkness3 [(y * 3 + 1) * sw3 + (x * 3 + 2)] = MAX (d22, r32);
2570 darkness3 [(y * 3 + 2) * sw34 + (x * 3 )] = MAX (d22, r13); 2639 darkness3 [(y * 3 + 2) * sw3 + (x * 3 )] = MAX (d22, r13);
2571 darkness3 [(y * 3 + 2) * sw34 + (x * 3 + 1)] = MAX (d22, r23); 2640 darkness3 [(y * 3 + 2) * sw3 + (x * 3 + 1)] = MAX (d22, r23);
2572 darkness3 [(y * 3 + 2) * sw34 + (x * 3 + 2)] = MAX (d22, r33); 2641 darkness3 [(y * 3 + 2) * sw3 + (x * 3 + 2)] = MAX (d22, r33);
2573 } 2642 }
2574 2643
2575 free (darkness1); 2644 free (darkness1);
2576 2645
2577 EXTEND (SP, 3); 2646 EXTEND (SP, 3);
2578 PUSHs (sv_2mortal (newSViv (sw34))); 2647 PUSHs (sv_2mortal (newSViv (sw3)));
2579 PUSHs (sv_2mortal (newSViv (sh3))); 2648 PUSHs (sv_2mortal (newSViv (sh3)));
2580 PUSHs (darkness3_sv); 2649 PUSHs (darkness3_sv);
2581} 2650}
2582 2651
2583SV * 2652SV *
2781 if (RETVAL < 0) 2850 if (RETVAL < 0)
2782 { 2851 {
2783 RETVAL = Mix_GroupOldest (-1); 2852 RETVAL = Mix_GroupOldest (-1);
2784 2853
2785 if (RETVAL < 0) 2854 if (RETVAL < 0)
2855 {
2856 // happens sometimes, maybe it just stopped playing(?)
2857 RETVAL = Mix_GroupAvailable (-1);
2858
2859 if (RETVAL < 0)
2786 XSRETURN_UNDEF; 2860 XSRETURN_UNDEF;
2787 2861 }
2862 else
2788 Mix_HaltChannel (RETVAL); 2863 Mix_HaltChannel (RETVAL);
2789 } 2864 }
2790 2865
2791 Mix_UnregisterAllEffects (RETVAL); 2866 Mix_UnregisterAllEffects (RETVAL);
2792 Mix_Volume (RETVAL, 128); 2867 Mix_Volume (RETVAL, 128);
2793} 2868}
2852 Mix_SetReverseStereo (self, flip); 2927 Mix_SetReverseStereo (self, flip);
2853 2928
2854MODULE = Deliantra::Client PACKAGE = DC::MixChunk 2929MODULE = Deliantra::Client PACKAGE = DC::MixChunk
2855 2930
2856PROTOTYPES: DISABLE 2931PROTOTYPES: DISABLE
2932
2933void
2934decoders ()
2935 PPCODE:
2936#if SDL_MIXER_MAJOR_VERSION > 1 || SDL_MIXER_MINOR_VERSION > 2 || SDL_MIXER_PATCHLEVEL >= 10
2937 int i, num = Mix_GetNumChunkDecoders ();
2938 EXTEND (SP, num);
2939 for (i = 0; i < num; ++i)
2940 PUSHs (sv_2mortal (newSVpv (Mix_GetChunkDecoder (i), 0)));
2941#else
2942 XPUSHs (sv_2mortal (newSVpv ("(sdl mixer too old)", 0)));
2943#endif
2857 2944
2858DC::MixChunk 2945DC::MixChunk
2859new (SV *class, DC::RW rwops) 2946new (SV *class, DC::RW rwops)
2860 CODE: 2947 CODE:
2861 RETVAL = Mix_LoadWAV_RW (rwops, 1); 2948 RETVAL = Mix_LoadWAV_RW (rwops, 1);
2894 OUTPUT: 2981 OUTPUT:
2895 RETVAL 2982 RETVAL
2896 2983
2897MODULE = Deliantra::Client PACKAGE = DC::MixMusic 2984MODULE = Deliantra::Client PACKAGE = DC::MixMusic
2898 2985
2986void
2987decoders ()
2988 PPCODE:
2989#if SDL_MIXER_MAJOR_VERSION > 1 || SDL_MIXER_MINOR_VERSION > 2 || SDL_MIXER_PATCHLEVEL >= 10
2990 int i, num = Mix_GetNumMusicDecoders ();
2991 EXTEND (SP, num);
2992 for (i = 0; i < num; ++i)
2993 PUSHs (sv_2mortal (newSVpv (Mix_GetMusicDecoder (i), 0)));
2994#else
2995 XPUSHs (sv_2mortal (newSVpv ("(sdl mixer too old)", 0)));
2996#endif
2997
2899int 2998int
2900volume (int volume = -1) 2999volume (int volume = -1)
2901 PROTOTYPE: ;$ 3000 PROTOTYPE: ;$
2902 CODE: 3001 CODE:
2903 if (items > 0) 3002 if (items > 0)
2913 3012
2914void 3013void
2915halt () 3014halt ()
2916 CODE: 3015 CODE:
2917 Mix_HaltMusic (); 3016 Mix_HaltMusic ();
3017
3018int
3019playing ()
3020 CODE:
3021 RETVAL = Mix_PlayingMusic ();
3022 OUTPUT:
3023 RETVAL
2918 3024
2919DC::MixMusic 3025DC::MixMusic
2920new (SV *class, DC::RW rwops) 3026new (SV *class, DC::RW rwops)
2921 CODE: 3027 CODE:
2922 RETVAL = Mix_LoadMUS_RW (rwops); 3028 RETVAL = Mix_LoadMUS_RW (rwops);
3062 const_iv (GL_FUNC_SUBTRACT), 3168 const_iv (GL_FUNC_SUBTRACT),
3063 const_iv (GL_FUNC_REVERSE_SUBTRACT), 3169 const_iv (GL_FUNC_REVERSE_SUBTRACT),
3064# undef const_iv 3170# undef const_iv
3065 }; 3171 };
3066 3172
3067 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; ) 3173 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ > const_iv; civ--)
3068 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv)); 3174 newCONSTSUB (stash, (char *)civ[-1].name, newSViv (civ[-1].iv));
3069 3175
3070 texture_av = newAV (); 3176 texture_av = newAV ();
3071 AvREAL_off (texture_av); 3177 AvREAL_off (texture_av);
3072} 3178}
3073 3179
3116 RETVAL 3222 RETVAL
3117 3223
3118int glGetError () 3224int glGetError ()
3119 3225
3120void glFinish () 3226void glFinish ()
3227
3228void glFlush ()
3121 3229
3122void glClear (int mask) 3230void glClear (int mask)
3123 3231
3124void glClearColor (float r, float g, float b, float a = 1.0) 3232void glClearColor (float r, float g, float b, float a = 1.0)
3125 PROTOTYPE: @ 3233 PROTOTYPE: @
3296void glNewList (int list, int mode = GL_COMPILE) 3404void glNewList (int list, int mode = GL_COMPILE)
3297 3405
3298void glEndList () 3406void glEndList ()
3299 3407
3300void glCallList (int list) 3408void glCallList (int list)
3409
3410void c_init ()
3411 CODE:
3412 glPixelStorei (GL_PACK_ALIGNMENT , 1);
3413 glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
3301 3414
3302MODULE = Deliantra::Client PACKAGE = DC::UI::Base 3415MODULE = Deliantra::Client PACKAGE = DC::UI::Base
3303 3416
3304PROTOTYPES: DISABLE 3417PROTOTYPES: DISABLE
3305 3418

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines