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.307 by root, Thu Oct 14 03:44:18 2010 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{
457 ev.code = 1; 479 ev.code = 1;
458 ev.data1 = (void *)(long)channel; 480 ev.data1 = (void *)(long)channel;
459 ev.data2 = 0; 481 ev.data2 = 0;
460 482
461 SDL_PushEvent ((SDL_Event *)&ev); 483 SDL_PushEvent ((SDL_Event *)&ev);
484}
485
486static unsigned int
487div255 (unsigned int n)
488{
489 return (n + (n >> 8)) >> 8;
462} 490}
463 491
464static unsigned int 492static unsigned int
465minpot (unsigned int n) 493minpot (unsigned int n)
466{ 494{
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
1021 1052
1022 XPUSHs (sv_2mortal (sv_bless (newRV_noinc ((SV *)hv), gv_stashpv ("DC::UI::Event", 1)))); 1053 XPUSHs (sv_2mortal (sv_bless (newRV_noinc ((SV *)hv), gv_stashpv ("DC::UI::Event", 1))));
1023 } 1054 }
1024} 1055}
1025 1056
1057char *
1058SDL_AudioDriverName ()
1059 CODE:
1060{
1061 char buf [256];
1062 if (!SDL_AudioDriverName (buf, sizeof (buf)))
1063 XSRETURN_UNDEF;
1064
1065 RETVAL = buf;
1066}
1067 OUTPUT:
1068 RETVAL
1069
1026int 1070int
1027Mix_OpenAudio (int frequency = 44100, int format = MIX_DEFAULT_FORMAT, int channels = 2, int chunksize = 4096) 1071Mix_OpenAudio (int frequency = 44100, int format = MIX_DEFAULT_FORMAT, int channels = 2, int chunksize = 4096)
1028 POSTCALL: 1072 POSTCALL:
1029 Mix_HookMusicFinished (music_finished); 1073 Mix_HookMusicFinished (music_finished);
1030 Mix_ChannelFinished (channel_finished); 1074 Mix_ChannelFinished (channel_finished);
1092add_font (char *file) 1136add_font (char *file)
1093 CODE: 1137 CODE:
1094 RETVAL = FcConfigAppFontAddFile (0, (const FcChar8 *)file); 1138 RETVAL = FcConfigAppFontAddFile (0, (const FcChar8 *)file);
1095 OUTPUT: 1139 OUTPUT:
1096 RETVAL 1140 RETVAL
1141
1142void
1143IMG_Init (int flags = IMG_INIT_JPG | IMG_INIT_PNG)
1097 1144
1098void 1145void
1099load_image_inline (SV *image_) 1146load_image_inline (SV *image_)
1100 ALIAS: 1147 ALIAS:
1101 load_image_file = 1 1148 load_image_file = 1
1665 glDisable (GL_BLEND); 1712 glDisable (GL_BLEND);
1666 } 1713 }
1667} 1714}
1668 1715
1669void 1716void
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) 1717draw_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: @ 1718 PROTOTYPE: @
1672 CODE: 1719 CODE:
1673{ 1720{
1721 glEnable (GL_BLEND);
1722 glBlendFunc (intensity ? GL_SRC_ALPHA : GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
1674 glEnable (GL_TEXTURE_2D); 1723 glEnable (GL_TEXTURE_2D);
1675 glEnable (GL_BLEND);
1676 glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
1677 glBindTexture (GL_TEXTURE_2D, name1); 1724 glBindTexture (GL_TEXTURE_2D, name1);
1678 1725
1679 glColor3f (intensity, intensity, intensity); 1726 glColor3f (intensity, intensity, intensity);
1680 glPushMatrix (); 1727 glPushMatrix ();
1681 glScalef (1./3, 1./3, 1.); 1728 glScalef (1./3, 1./3, 1.);
1682 1729
1683 if (blend > 0.f) 1730 if (blend > 0.f)
1684 { 1731 {
1685 float S2, T2; /* 0. 0. for texture 2 */ 1732 float dx3 = dx * -3.f / w;
1686 float w = w1 > w2 ? w1 : w2; 1733 float dy3 = dy * -3.f / h;
1687 float h = h1 > h2 ? h1 : h2;
1688 GLfloat env_color[4] = { 0., 0., 0., blend }; 1734 GLfloat env_color[4] = { 0., 0., 0., blend };
1689 1735
1690 /* interpolate the two shadow textures */ 1736 /* interpolate the two shadow textures */
1691 /* stage 0 == rgb(glcolor) + alpha(t0) */ 1737 /* stage 0 == rgb(glcolor) + alpha(t0) */
1692 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 1738 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
1697 glBindTexture (GL_TEXTURE_2D, name2); 1743 glBindTexture (GL_TEXTURE_2D, name2);
1698 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); 1744 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
1699 1745
1700 /* rgb == rgb(glcolor) */ 1746 /* rgb == rgb(glcolor) */
1701 glTexEnvi (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE); 1747 glTexEnvi (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);
1702 glTexEnvi (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_CONSTANT); 1748 glTexEnvi (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PRIMARY_COLOR);
1703 glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR); 1749 glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
1704 1750
1705 /* alpha = interpolate t0, t1 by env_alpha */ 1751 /* alpha = interpolate t0, t1 by env_alpha */
1706 glTexEnvfv (GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, env_color); 1752 glTexEnvfv (GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, env_color);
1707 1753
1713 glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA); 1759 glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA);
1714 1760
1715 glTexEnvi (GL_TEXTURE_ENV, GL_SOURCE2_ALPHA, GL_CONSTANT); 1761 glTexEnvi (GL_TEXTURE_ENV, GL_SOURCE2_ALPHA, GL_CONSTANT);
1716 glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND2_ALPHA, GL_SRC_ALPHA); 1762 glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND2_ALPHA, GL_SRC_ALPHA);
1717 1763
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); 1764 glBegin (GL_QUADS);
1730 gl.MultiTexCoord2f (GL_TEXTURE0, 0, 0); gl.MultiTexCoord2f (GL_TEXTURE1, dx , dy ); glVertex2f ( 0, 0); 1765 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); 1766 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); 1767 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); 1768 gl.MultiTexCoord2f (GL_TEXTURE0, s, 0); gl.MultiTexCoord2f (GL_TEXTURE1, dx3 + s, dy3 ); glVertex2i (w, 0);
1734 glEnd (); 1769 glEnd ();
1735 1770
1736 glDisable (GL_TEXTURE_2D); 1771 glDisable (GL_TEXTURE_2D);
1737 gl.ActiveTexture (GL_TEXTURE0); 1772 gl.ActiveTexture (GL_TEXTURE0);
1738 } 1773 }
1740 { 1775 {
1741 /* simple blending of one texture, also opengl <1.3 path */ 1776 /* simple blending of one texture, also opengl <1.3 path */
1742 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 1777 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
1743 1778
1744 glBegin (GL_QUADS); 1779 glBegin (GL_QUADS);
1745 glTexCoord2f ( 0, 0); glVertex2f ( 0, 0); 1780 glTexCoord2f (0, 0); glVertex2f (0, 0);
1746 glTexCoord2f ( 0, t1); glVertex2f ( 0, h1); 1781 glTexCoord2f (0, t); glVertex2f (0, h);
1747 glTexCoord2f (s1, t1); glVertex2f (w1, h1); 1782 glTexCoord2f (s, t); glVertex2f (w, h);
1748 glTexCoord2f (s1, 0); glVertex2f (w1, 0); 1783 glTexCoord2f (s, 0); glVertex2f (w, 0);
1749 glEnd (); 1784 glEnd ();
1750 } 1785 }
1786
1787 /* draw ?-marks or equivalent, this is very clumsy code :/ */
1788 {
1789 int x, y;
1790 int dx3 = dx * 3;
1791 int dy3 = dy * 3;
1792
1793 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
1794 glBindTexture (GL_TEXTURE_2D, hidden_tex);
1795 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
1796 glTranslatef (-1., -1., 0);
1797 glBegin (GL_QUADS);
1798
1799 for (y = 1; y < h; y += 3)
1800 {
1801 int y1 = y - dy3;
1802 int y1valid = y1 >= 0 && y1 < h;
1803
1804 for (x = 1; x < w; x += 3)
1805 {
1806 int x1 = x - dx3;
1807 uint8_t h1 = data1 [x + y * w] == DARKNESS_ADJUST (255 - FOW_DARKNESS);
1808 uint8_t h2;
1809
1810 if (y1valid && x1 >= 0 && x1 < w)
1811 h2 = data2 [x1 + y1 * w] == DARKNESS_ADJUST (255 - FOW_DARKNESS);
1812 else
1813 h2 = 1; /* out of range == invisible */
1814
1815 if (h1 || h2)
1816 {
1817 float alpha = h1 == h2 ? 1.f : h1 ? 1.f - blend : blend;
1818 glColor4f (1., 1., 1., alpha);
1819
1820 glTexCoord2f (0, 0.); glVertex2i (x , y );
1821 glTexCoord2f (0, 1.); glVertex2i (x , y + 3);
1822 glTexCoord2f (1, 1.); glVertex2i (x + 3, y + 3);
1823 glTexCoord2f (1, 0.); glVertex2i (x + 3, y );
1824 }
1825 }
1826 }
1827 }
1828
1829 glEnd ();
1751 1830
1752 glPopMatrix (); 1831 glPopMatrix ();
1753 1832
1754 glDisable (GL_TEXTURE_2D); 1833 glDisable (GL_TEXTURE_2D);
1755 glDisable (GL_BLEND); 1834 glDisable (GL_BLEND);
1976 { 2055 {
1977 ext = *data++; 2056 ext = *data++;
1978 cmd = ext & 0x7f; 2057 cmd = ext & 0x7f;
1979 2058
1980 if (cmd < 4) 2059 if (cmd < 4)
1981 cell->darkness = 255 - ext * 64 + 1; 2060 cell->darkness = 255 - ext * 64 + 1; /* make sure this doesn't collide with FOW_DARKNESS */
1982 else if (cmd == 5) // health 2061 else if (cmd == 5) // health
1983 { 2062 {
1984 cell->stat_width = 1; 2063 cell->stat_width = 1;
1985 cell->stat_hp = *data++; 2064 cell->stat_hp = *data++;
1986 } 2065 }
2061 ? self->row + y 2140 ? self->row + y
2062 : 0; 2141 : 0;
2063 2142
2064 for (x = x0; x < x1; x++) 2143 for (x = x0; x < x1; x++)
2065 { 2144 {
2066 int r = 32, g = 32, b = 32, a = 192; 2145 unsigned int r = 32, g = 32, b = 32, a = 192;
2067 2146
2068 if (row && row->c0 <= x && x < row->c1) 2147 if (row && row->c0 <= x && x < row->c1)
2069 { 2148 {
2070 mapcell *cell = row->col + (x - row->c0); 2149 mapcell *cell = row->col + (x - row->c0);
2071 2150
2073 { 2152 {
2074 maptex tex = self->tex [cell->tile [z]]; 2153 maptex tex = self->tex [cell->tile [z]];
2075 int a0 = 255 - tex.a; 2154 int a0 = 255 - tex.a;
2076 int a1 = tex.a; 2155 int a1 = tex.a;
2077 2156
2078 r = (r * a0 + tex.r * a1) / 255; 2157 r = div255 (r * a0 + tex.r * a1);
2079 g = (g * a0 + tex.g * a1) / 255; 2158 g = div255 (g * a0 + tex.g * a1);
2080 b = (b * a0 + tex.b * a1) / 255; 2159 b = div255 (b * a0 + tex.b * a1);
2081 a = (a * a0 + tex.a * a1) / 255; 2160 a = div255 (a * a0 + tex.a * a1);
2082 } 2161 }
2083 } 2162 }
2084 2163
2085 *map++ = (r ) 2164 *map++ = (r )
2086 | (g << 8) 2165 | (g << 8)
2093} 2172}
2094 OUTPUT: 2173 OUTPUT:
2095 RETVAL 2174 RETVAL
2096 2175
2097void 2176void
2098draw (DC::Map self, int mx, int my, int sw, int sh, int T, U32 player = 0xffffffff, int sdx = 0, int sdy = 0) 2177draw (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: 2178 CODE:
2100{ 2179{
2101 int x, y, z; 2180 int x, y, z;
2102 2181
2103 HV *smooth = (HV *)sv_2mortal ((SV *)newHV ()); 2182 HV *smooth = (HV *)sv_2mortal ((SV *)newHV ());
2107 int pl_x, pl_y; 2186 int pl_x, pl_y;
2108 maptex pl_tex; 2187 maptex pl_tex;
2109 rc_t *rc = rc_alloc (); 2188 rc_t *rc = rc_alloc ();
2110 rc_t *rc_ov = rc_alloc (); 2189 rc_t *rc_ov = rc_alloc ();
2111 rc_key_t key; 2190 rc_key_t key;
2112 rc_array_t *arr, *arr_hidden; 2191 rc_array_t *arr;
2113 2192
2114 pl_tex.name = 0; 2193 pl_tex.name = 0;
2115 2194
2116 // that's current max. sorry. 2195 // that's current max. sorry.
2117 if (sw > 255) sw = 255; 2196 if (sw > 255) sw = 255;
2154 } 2233 }
2155 2234
2156 glEnable (GL_BLEND); 2235 glEnable (GL_BLEND);
2157 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 2236 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
2158 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 2237 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 2238
2163 for (z = 0; z <= 2; z++) 2239 for (z = 0; z <= 2; z++)
2164 { 2240 {
2165 memset (smooth_level, 0, sizeof (smooth_level)); 2241 memset (smooth_level, 0, sizeof (smooth_level));
2166 key.texname = -1; 2242 key.texname = -1;
2190 2266
2191 key.texname = tex.name; 2267 key.texname = tex.name;
2192 arr = rc_array (rc, &key); 2268 arr = rc_array (rc, &key);
2193 } 2269 }
2194 2270
2195 px = (x + 1) * T - tex.w; 2271 px = (x + 1) * Th - tex.w;
2196 py = (y + 1) * T - tex.h; 2272 py = (y + 1) * Tw - tex.h;
2197 2273
2198 if (expect_false (cell->player == player) && expect_false (z == 2)) 2274 if (expect_false (cell->player == player) && expect_false (z == 2))
2199 { 2275 {
2200 pl_x = px; 2276 pl_x = px;
2201 pl_y = py; 2277 pl_y = py;
2246 skey.x = x ; skey.y = y ; smooth_or_bits (smooth, &skey, 0x0400); 2322 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); 2323 skey.x = x + 2; skey.y = y ; smooth_or_bits (smooth, &skey, 0x0800);
2248 } 2324 }
2249 } 2325 }
2250 2326
2251 if (expect_false (z == 2)) 2327 if (expect_false (z == 2) && expect_false (cell->flags))
2252 { 2328 {
2253 /* draw question marks on top of hidden spaces */ 2329 // overlays such as the speech bubble, probably more to come
2254 if (!cell->darkness) 2330 if (cell->flags & 1)
2255 { 2331 {
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; 2332 rc_key_t key_ov = key;
2272 maptex tex = self->tex [TEXID_SPEECH]; 2333 maptex tex = self->tex [TEXID_SPEECH];
2273 rc_array_t *arr; 2334 rc_array_t *arr;
2274 int px = x * T + T * 2 / 32; 2335 int px = x * Tw + Tw * 2 / 32;
2275 int py = y * T - T * 6 / 32; 2336 int py = y * Th - Th * 6 / 32;
2276 2337
2277 key_ov.texname = tex.name; 2338 key_ov.texname = tex.name;
2278 arr = rc_array (rc_ov, &key_ov); 2339 arr = rc_array (rc_ov, &key_ov);
2279 2340
2280 rc_t2f_v3f (arr, 0 , 0 , px , py , 0); 2341 rc_t2f_v3f (arr, 0 , 0 , px , py , 0);
2281 rc_t2f_v3f (arr, 0 , tex.t, px , py + T, 0); 2342 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); 2343 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); 2344 rc_t2f_v3f (arr, tex.s, 0 , px + Tw, py , 0);
2284 }
2285 } 2345 }
2286 } 2346 }
2287 } 2347 }
2288 } 2348 }
2289 2349
2316 if (!(bits & 0x1000) 2376 if (!(bits & 0x1000)
2317 && skey->level == level 2377 && skey->level == level
2318 && level > smooth_max [skey->x][skey->y]) 2378 && level > smooth_max [skey->x][skey->y])
2319 { 2379 {
2320 maptex tex = self->tex [skey->tile]; 2380 maptex tex = self->tex [skey->tile];
2321 int px = (((int)skey->x) - 1) * T; 2381 int px = (((int)skey->x) - 1) * Tw;
2322 int py = (((int)skey->y) - 1) * T; 2382 int py = (((int)skey->y) - 1) * Th;
2323 int border = bits & 15; 2383 int border = bits & 15;
2324 int corner = (bits >> 8) & ~(bits >> 4) & 15; 2384 int corner = (bits >> 8) & ~(bits >> 4) & 15;
2325 float dx = tex.s * .0625f; // 16 images/row 2385 float dx = tex.s * .0625f; // 16 images/row
2326 float dy = tex.t * .5f ; // 2 images/column 2386 float dy = tex.t * .5f ; // 2 images/column
2327 2387
2340 2400
2341 if (border) 2401 if (border)
2342 { 2402 {
2343 float ox = border * dx; 2403 float ox = border * dx;
2344 2404
2345 glTexCoord2f (ox , 0.f ); glVertex2i (px , py ); 2405 glTexCoord2f (ox , 0.f ); glVertex2i (px , py );
2346 glTexCoord2f (ox , dy ); glVertex2i (px , py + T); 2406 glTexCoord2f (ox , dy ); glVertex2i (px , py + Th);
2347 glTexCoord2f (ox + dx, dy ); glVertex2i (px + T, py + T); 2407 glTexCoord2f (ox + dx, dy ); glVertex2i (px + Tw, py + Th);
2348 glTexCoord2f (ox + dx, 0.f ); glVertex2i (px + T, py ); 2408 glTexCoord2f (ox + dx, 0.f ); glVertex2i (px + Tw, py );
2349 } 2409 }
2350 2410
2351 if (corner) 2411 if (corner)
2352 { 2412 {
2353 float ox = corner * dx; 2413 float ox = corner * dx;
2354 2414
2355 glTexCoord2f (ox , dy ); glVertex2i (px , py ); 2415 glTexCoord2f (ox , dy ); glVertex2i (px , py );
2356 glTexCoord2f (ox , dy * 2.f); glVertex2i (px , py + T); 2416 glTexCoord2f (ox , dy * 2.f); glVertex2i (px , py + Th);
2357 glTexCoord2f (ox + dx, dy * 2.f); glVertex2i (px + T, py + T); 2417 glTexCoord2f (ox + dx, dy * 2.f); glVertex2i (px + Tw, py + Th);
2358 glTexCoord2f (ox + dx, dy ); glVertex2i (px + T, py ); 2418 glTexCoord2f (ox + dx, dy ); glVertex2i (px + Tw, py );
2359 } 2419 }
2360 } 2420 }
2361 } 2421 }
2362 } 2422 }
2363 } 2423 }
2404 for (x = 0; x < sw; x++) 2464 for (x = 0; x < sw; x++)
2405 if (row->c0 <= x + mx && x + mx < row->c1) 2465 if (row->c0 <= x + mx && x + mx < row->c1)
2406 { 2466 {
2407 mapcell *cell = row->col + (x + mx - row->c0); 2467 mapcell *cell = row->col + (x + mx - row->c0);
2408 2468
2409 int px = x * T; 2469 int px = x * Tw;
2410 int py = y * T; 2470 int py = y * Th;
2411 2471
2412 if (expect_false (cell->player == player)) 2472 if (expect_false (cell->player == player))
2413 { 2473 {
2414 px += sdx; 2474 px += sdx;
2415 py += sdy; 2475 py += sdy;
2416 } 2476 }
2417 2477
2418 if (cell->stat_hp) 2478 if (cell->stat_hp)
2419 { 2479 {
2420 int width = cell->stat_width * T; 2480 int width = cell->stat_width * Tw;
2421 int thick = (sh * T / 32 + 27) / 28 + 1 + cell->stat_width; 2481 int thick = (sh * Th / 32 + 27) / 28 + 1 + cell->stat_width;
2422 2482
2423 glColor3ub (0, 0, 0); 2483 glColor3ub (0, 0, 0);
2424 glRectf (px + 1, py - thick - 2, 2484 glRectf (px + 1, py - thick - 2,
2425 px + width - 1, py); 2485 px + width - 1, py);
2426 2486
2463 int x, y; 2523 int x, y;
2464 2524
2465 glEnable (GL_TEXTURE_2D); 2525 glEnable (GL_TEXTURE_2D);
2466 /* GL_REPLACE would be correct, as we don't need to modulate alpha, 2526 /* GL_REPLACE would be correct, as we don't need to modulate alpha,
2467 * but the nvidia driver (185.18.14) mishandles alpha textures 2527 * but the nvidia driver (185.18.14) mishandles alpha textures
2468 * ansd takes the colour from god knows where instead of using 2528 * and takes the colour from god knows where instead of using
2469 * Cp. MODULATE results in the same colour, but slightly different 2529 * Cp. MODULATE results in the same colour, but slightly different
2470 * alpha, but atcually gives us the correct colour with nvidia. 2530 * alpha, but atcually gives us the correct colour with nvidia.
2471 */ 2531 */
2472 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 2532 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
2473 glEnable (GL_BLEND); 2533 glEnable (GL_BLEND);
2502void 2562void
2503fow_texture (DC::Map self, int mx, int my, int sw, int sh) 2563fow_texture (DC::Map self, int mx, int my, int sw, int sh)
2504 PPCODE: 2564 PPCODE:
2505{ 2565{
2506 int x, y; 2566 int x, y;
2507 int sw1 = sw + 2; 2567 int sw1 = sw + 2;
2508 int sh1 = sh + 2; 2568 int sh1 = sh + 2;
2509 int sh3 = sh * 3; 2569 int sh3 = sh * 3;
2510 int sw34 = (sw * 3 + 3) & ~3; 2570 int sw3 = sw * 3;
2571 SV *darkness3_sv = sv_2mortal (newSV (sw3 * sh3));
2572 uint8_t *darkness3 = (uint8_t *)SvPVX (darkness3_sv);
2511 uint8_t *darkness1 = (uint8_t *)malloc (sw1 * sh1); 2573 uint8_t *darkness1 = (uint8_t *)malloc (sw1 * sh1);
2512 SV *darkness3_sv = sv_2mortal (newSV (sw34 * sh3)); 2574 memset (darkness1, 0, sw1*sh1);
2513 uint8_t *darkness3 = (uint8_t *)SvPVX (darkness3_sv);
2514 2575
2515 SvPOK_only (darkness3_sv); 2576 SvPOK_only (darkness3_sv);
2516 SvCUR_set (darkness3_sv, sw34 * sh3); 2577 SvCUR_set (darkness3_sv, sw3 * sh3);
2517 2578
2518 mx += self->x - 1; 2579 mx += self->x - 1;
2519 my += self->y - 1; 2580 my += self->y - 1;
2520
2521 memset (darkness1, DARKNESS_ADJUST (255 - FOW_DARKNESS), sw1 * sh1);
2522 2581
2523 for (y = 0; y < sh1; y++) 2582 for (y = 0; y < sh1; y++)
2524 if (0 <= y + my && y + my < self->rows) 2583 if (0 <= y + my && y + my < self->rows)
2525 { 2584 {
2526 maprow *row = self->row + (y + my); 2585 maprow *row = self->row + (y + my);
2559 2618
2560 uint8_t r13 = (d13 + d23 + d12) / 3; 2619 uint8_t r13 = (d13 + d23 + d12) / 3;
2561 uint8_t r23 = d23; 2620 uint8_t r23 = d23;
2562 uint8_t r33 = (d23 + d33 + d32) / 3; 2621 uint8_t r33 = (d23 + d33 + d32) / 3;
2563 2622
2564 darkness3 [(y * 3 ) * sw34 + (x * 3 )] = MAX (d22, r11); 2623 darkness3 [(y * 3 ) * sw3 + (x * 3 )] = MAX (d22, r11);
2565 darkness3 [(y * 3 ) * sw34 + (x * 3 + 1)] = MAX (d22, r21); 2624 darkness3 [(y * 3 ) * sw3 + (x * 3 + 1)] = MAX (d22, r21);
2566 darkness3 [(y * 3 ) * sw34 + (x * 3 + 2)] = MAX (d22, r31); 2625 darkness3 [(y * 3 ) * sw3 + (x * 3 + 2)] = MAX (d22, r31);
2567 darkness3 [(y * 3 + 1) * sw34 + (x * 3 )] = MAX (d22, r12); 2626 darkness3 [(y * 3 + 1) * sw3 + (x * 3 )] = MAX (d22, r12);
2568 darkness3 [(y * 3 + 1) * sw34 + (x * 3 + 1)] = MAX (d22, r22); 2627 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); 2628 darkness3 [(y * 3 + 1) * sw3 + (x * 3 + 2)] = MAX (d22, r32);
2570 darkness3 [(y * 3 + 2) * sw34 + (x * 3 )] = MAX (d22, r13); 2629 darkness3 [(y * 3 + 2) * sw3 + (x * 3 )] = MAX (d22, r13);
2571 darkness3 [(y * 3 + 2) * sw34 + (x * 3 + 1)] = MAX (d22, r23); 2630 darkness3 [(y * 3 + 2) * sw3 + (x * 3 + 1)] = MAX (d22, r23);
2572 darkness3 [(y * 3 + 2) * sw34 + (x * 3 + 2)] = MAX (d22, r33); 2631 darkness3 [(y * 3 + 2) * sw3 + (x * 3 + 2)] = MAX (d22, r33);
2573 } 2632 }
2574 2633
2575 free (darkness1); 2634 free (darkness1);
2576 2635
2577 EXTEND (SP, 3); 2636 EXTEND (SP, 3);
2578 PUSHs (sv_2mortal (newSViv (sw34))); 2637 PUSHs (sv_2mortal (newSViv (sw3)));
2579 PUSHs (sv_2mortal (newSViv (sh3))); 2638 PUSHs (sv_2mortal (newSViv (sh3)));
2580 PUSHs (darkness3_sv); 2639 PUSHs (darkness3_sv);
2581} 2640}
2582 2641
2583SV * 2642SV *
2781 if (RETVAL < 0) 2840 if (RETVAL < 0)
2782 { 2841 {
2783 RETVAL = Mix_GroupOldest (-1); 2842 RETVAL = Mix_GroupOldest (-1);
2784 2843
2785 if (RETVAL < 0) 2844 if (RETVAL < 0)
2845 {
2846 // happens sometimes, maybe it just stopped playing(?)
2847 RETVAL = Mix_GroupAvailable (-1);
2848
2849 if (RETVAL < 0)
2786 XSRETURN_UNDEF; 2850 XSRETURN_UNDEF;
2787 2851 }
2852 else
2788 Mix_HaltChannel (RETVAL); 2853 Mix_HaltChannel (RETVAL);
2789 } 2854 }
2790 2855
2791 Mix_UnregisterAllEffects (RETVAL); 2856 Mix_UnregisterAllEffects (RETVAL);
2792 Mix_Volume (RETVAL, 128); 2857 Mix_Volume (RETVAL, 128);
2793} 2858}
2852 Mix_SetReverseStereo (self, flip); 2917 Mix_SetReverseStereo (self, flip);
2853 2918
2854MODULE = Deliantra::Client PACKAGE = DC::MixChunk 2919MODULE = Deliantra::Client PACKAGE = DC::MixChunk
2855 2920
2856PROTOTYPES: DISABLE 2921PROTOTYPES: DISABLE
2922
2923void
2924decoders ()
2925 PPCODE:
2926#if SDL_MIXER_MAJOR_VERSION > 1 || SDL_MIXER_MINOR_VERSION > 2 || SDL_MIXER_PATCHLEVEL >= 10
2927 int i, num = Mix_GetNumChunkDecoders ();
2928 EXTEND (SP, num);
2929 for (i = 0; i < num; ++i)
2930 PUSHs (sv_2mortal (newSVpv (Mix_GetChunkDecoder (i), 0)));
2931#else
2932 XPUSHs (sv_2mortal (newSVpv ("(sdl mixer too old)", 0)));
2933#endif
2857 2934
2858DC::MixChunk 2935DC::MixChunk
2859new (SV *class, DC::RW rwops) 2936new (SV *class, DC::RW rwops)
2860 CODE: 2937 CODE:
2861 RETVAL = Mix_LoadWAV_RW (rwops, 1); 2938 RETVAL = Mix_LoadWAV_RW (rwops, 1);
2894 OUTPUT: 2971 OUTPUT:
2895 RETVAL 2972 RETVAL
2896 2973
2897MODULE = Deliantra::Client PACKAGE = DC::MixMusic 2974MODULE = Deliantra::Client PACKAGE = DC::MixMusic
2898 2975
2976void
2977decoders ()
2978 PPCODE:
2979#if SDL_MIXER_MAJOR_VERSION > 1 || SDL_MIXER_MINOR_VERSION > 2 || SDL_MIXER_PATCHLEVEL >= 10
2980 int i, num = Mix_GetNumMusicDecoders ();
2981 EXTEND (SP, num);
2982 for (i = 0; i < num; ++i)
2983 PUSHs (sv_2mortal (newSVpv (Mix_GetMusicDecoder (i), 0)));
2984#else
2985 XPUSHs (sv_2mortal (newSVpv ("(sdl mixer too old)", 0)));
2986#endif
2987
2899int 2988int
2900volume (int volume = -1) 2989volume (int volume = -1)
2901 PROTOTYPE: ;$ 2990 PROTOTYPE: ;$
2902 CODE: 2991 CODE:
2903 if (items > 0) 2992 if (items > 0)
2913 3002
2914void 3003void
2915halt () 3004halt ()
2916 CODE: 3005 CODE:
2917 Mix_HaltMusic (); 3006 Mix_HaltMusic ();
3007
3008int
3009playing ()
3010 CODE:
3011 RETVAL = Mix_PlayingMusic ();
3012 OUTPUT:
3013 RETVAL
2918 3014
2919DC::MixMusic 3015DC::MixMusic
2920new (SV *class, DC::RW rwops) 3016new (SV *class, DC::RW rwops)
2921 CODE: 3017 CODE:
2922 RETVAL = Mix_LoadMUS_RW (rwops); 3018 RETVAL = Mix_LoadMUS_RW (rwops);
3117 3213
3118int glGetError () 3214int glGetError ()
3119 3215
3120void glFinish () 3216void glFinish ()
3121 3217
3218void glFlush ()
3219
3122void glClear (int mask) 3220void glClear (int mask)
3123 3221
3124void glClearColor (float r, float g, float b, float a = 1.0) 3222void glClearColor (float r, float g, float b, float a = 1.0)
3125 PROTOTYPE: @ 3223 PROTOTYPE: @
3126 3224
3296void glNewList (int list, int mode = GL_COMPILE) 3394void glNewList (int list, int mode = GL_COMPILE)
3297 3395
3298void glEndList () 3396void glEndList ()
3299 3397
3300void glCallList (int list) 3398void glCallList (int list)
3399
3400void c_init ()
3401 CODE:
3402 glPixelStorei (GL_PACK_ALIGNMENT , 1);
3403 glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
3301 3404
3302MODULE = Deliantra::Client PACKAGE = DC::UI::Base 3405MODULE = Deliantra::Client PACKAGE = DC::UI::Base
3303 3406
3304PROTOTYPES: DISABLE 3407PROTOTYPES: DISABLE
3305 3408

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines