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.243 by root, Thu Dec 27 06:54:36 2007 UTC vs.
Revision 1.270 by root, Sun Jul 20 15:05:13 2008 UTC

46 46
47#include <glib/gmacros.h> 47#include <glib/gmacros.h>
48 48
49#include <pango/pango.h> 49#include <pango/pango.h>
50 50
51#ifndef PANGO_VERSION_CHECK
52# define PANGO_VERSION_CHECK(a,b,c) 0
53#endif
54
55#if !PANGO_VERSION_CHECK (1, 15, 2)
56# define pango_layout_get_line_readonly pango_layout_get_line
57# define pango_layout_get_lines_readonly pango_layout_get_lines
58# define pango_layout_iter_get_line_readonly pango_layout_iter_get_line
59# define pango_layout_iter_get_run_readonly pango_layout_iter_get_run
60#endif
61
51#ifndef _WIN32 62#ifndef _WIN32
52# include <sys/types.h> 63# include <sys/types.h>
53# include <sys/socket.h> 64# include <sys/socket.h>
54# include <netinet/in.h> 65# include <netinet/in.h>
55# include <netinet/tcp.h> 66# include <netinet/tcp.h>
56# include <inttypes.h> 67# include <inttypes.h>
57#endif 68#endif
58 69
70#if __GNUC__ >= 4
71# define expect(expr,value) __builtin_expect ((expr),(value))
72#else
73# define expect(expr,value) (expr)
74#endif
75
76#define expect_false(expr) expect ((expr) != 0, 0)
77#define expect_true(expr) expect ((expr) != 0, 1)
78
59#define OBJ_STR "\xef\xbf\xbc" /* U+FFFC, object replacement character */ 79#define OBJ_STR "\xef\xbf\xbc" /* U+FFFC, object replacement character */
60 80
61#define FOW_DARKNESS 32 81#define FOW_DARKNESS 32
62 82
63#define MAP_EXTEND_X 32 83#define MAP_EXTEND_X 32
64#define MAP_EXTEND_Y 512 84#define MAP_EXTEND_Y 512
65 85
66#define MIN_FONT_HEIGHT 10 86#define MIN_FONT_HEIGHT 10
67 87
68#if 0 88/* mask out modifiers we are not interested in */
69# define PARACHUTE SDL_INIT_NOPARACHUTE 89#define MOD_MASK (KMOD_CTRL | KMOD_SHIFT | KMOD_ALT | KMOD_META)
70#else
71# define PARACHUTE 0
72#endif
73 90
74static AV *texture_av; 91static AV *texture_av;
75 92
76static struct 93static struct
77{ 94{
171 188
172static void 189static void
173layout_update_font (DC__Layout self) 190layout_update_font (DC__Layout self)
174{ 191{
175 /* use a random scale factor to account for unknown descenders, 0.8 works 192 /* use a random scale factor to account for unknown descenders, 0.8 works
176 * reasonably well with bitstream vera 193 * reasonably well with dejavu/bistream fonts
177 */ 194 */
178 PangoFontDescription *font = self->font ? self->font : default_font; 195 PangoFontDescription *font = self->font ? self->font : default_font;
179 196
180 pango_font_description_set_absolute_size (font, 197 pango_font_description_set_absolute_size (font,
181 MAX (MIN_FONT_HEIGHT, self->base_height) * (PANGO_SCALE * 8 / 10)); 198 MAX (MIN_FONT_HEIGHT, self->base_height) * (PANGO_SCALE * 8 / 10));
350 self->oy = 0; 367 self->oy = 0;
351 self->row = 0; 368 self->row = 0;
352 self->rows = 0; 369 self->rows = 0;
353} 370}
354 371
372#define CELL_CLEAR(cell) \
373 do { \
374 if ((cell)->player) \
375 (cell)->tile [2] = 0; \
376 (cell)->darkness = 0; \
377 (cell)->stat_hp = 0; \
378 (cell)->flags = 0; \
379 (cell)->player = 0; \
380 } while (0)
381
355static void 382static void
356map_blank (DC__Map self, int x0, int y0, int w, int h) 383map_blank (DC__Map self, int x0, int y0, int w, int h)
357{ 384{
358 int x, y; 385 int x, y;
359 maprow *row; 386 maprow *row;
373 if (x >= row->c1) 400 if (x >= row->c1)
374 break; 401 break;
375 402
376 cell = row->col + x - row->c0; 403 cell = row->col + x - row->c0;
377 404
378 cell->darkness = 0; 405 CELL_CLEAR (cell);
379 cell->stat_hp = 0;
380 cell->flags = 0;
381 cell->player = 0;
382 } 406 }
383 } 407 }
384} 408}
385 409
386typedef struct { 410typedef struct {
621 const_iv (KMOD_NUM), 645 const_iv (KMOD_NUM),
622 const_iv (KMOD_CAPS), 646 const_iv (KMOD_CAPS),
623 const_iv (KMOD_MODE), 647 const_iv (KMOD_MODE),
624 648
625 const_iv (MIX_DEFAULT_FORMAT), 649 const_iv (MIX_DEFAULT_FORMAT),
650
651 const_iv (SDL_INIT_TIMER),
652 const_iv (SDL_INIT_AUDIO),
653 const_iv (SDL_INIT_VIDEO),
654 const_iv (SDL_INIT_CDROM),
655 const_iv (SDL_INIT_JOYSTICK),
656 const_iv (SDL_INIT_EVERYTHING),
657 const_iv (SDL_INIT_NOPARACHUTE),
658 const_iv (SDL_INIT_EVENTTHREAD),
659
660 const_iv (SDL_GL_RED_SIZE),
661 const_iv (SDL_GL_GREEN_SIZE),
662 const_iv (SDL_GL_BLUE_SIZE),
663 const_iv (SDL_GL_ALPHA_SIZE),
664 const_iv (SDL_GL_DOUBLEBUFFER),
665 const_iv (SDL_GL_BUFFER_SIZE),
666 const_iv (SDL_GL_DEPTH_SIZE),
667 const_iv (SDL_GL_STENCIL_SIZE),
668 const_iv (SDL_GL_ACCUM_RED_SIZE),
669 const_iv (SDL_GL_ACCUM_GREEN_SIZE),
670 const_iv (SDL_GL_ACCUM_BLUE_SIZE),
671 const_iv (SDL_GL_ACCUM_ALPHA_SIZE),
672 const_iv (SDL_GL_STEREO),
673 const_iv (SDL_GL_MULTISAMPLEBUFFERS),
674 const_iv (SDL_GL_MULTISAMPLESAMPLES),
675 const_iv (SDL_GL_ACCELERATED_VISUAL),
676 const_iv (SDL_GL_SWAP_CONTROL),
677
678 const_iv (FOW_DARKNESS)
626# undef const_iv 679# undef const_iv
627 }; 680 };
628 681
629 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; ) 682 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; )
630 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv)); 683 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv));
648 701
649NV floor (NV x) 702NV floor (NV x)
650 703
651NV ceil (NV x) 704NV ceil (NV x)
652 705
706NV ceilabs (NV x)
707 CODE:
708 RETVAL = x < 0. ? - ceil (-x) : ceil (x);
709 OUTPUT:
710 RETVAL
711
653IV minpot (UV n) 712IV minpot (UV n)
654 713
655IV popcount (UV n) 714IV popcount (UV n)
656 715
657void 716void
659 CODE: 718 CODE:
660{ 719{
661 opengl_fontmap = pango_opengl_font_map_new (); 720 opengl_fontmap = pango_opengl_font_map_new ();
662 pango_opengl_font_map_set_default_substitute ((PangoOpenGLFontMap *)opengl_fontmap, substitute_func, 0, 0); 721 pango_opengl_font_map_set_default_substitute ((PangoOpenGLFontMap *)opengl_fontmap, substitute_func, 0, 0);
663 opengl_context = pango_opengl_font_map_create_context ((PangoOpenGLFontMap *)opengl_fontmap); 722 opengl_context = pango_opengl_font_map_create_context ((PangoOpenGLFontMap *)opengl_fontmap);
723 /*pango_context_set_font_description (opengl_context, default_font);*/
724#if PANGO_VERSION_CHECK (1, 15, 2)
725 pango_context_set_language (opengl_context, pango_language_from_string ("en"));
726 /*pango_context_set_base_dir (opengl_context, PANGO_DIRECTION_WEAK_LTR);*/
727#endif
664} 728}
665 729
666char *
667SDL_GetError () 730char *SDL_GetError ()
668 731
669int 732int SDL_Init (U32 flags)
670SDL_Init (U32 flags = SDL_INIT_VIDEO | SDL_INIT_AUDIO | PARACHUTE)
671 733
672void 734int SDL_InitSubSystem (U32 flags)
735
736void SDL_QuitSubSystem (U32 flags)
737
673SDL_Quit () 738void SDL_Quit ()
739
740int SDL_GL_SetAttribute (int attr, int value)
741
742int SDL_GL_GetAttribute (int attr)
743 CODE:
744 if (SDL_GL_GetAttribute (attr, &RETVAL))
745 XSRETURN_UNDEF;
746 OUTPUT:
747 RETVAL
674 748
675void 749void
676SDL_ListModes (int rgb, int alpha) 750SDL_ListModes (int rgb, int alpha)
677 PPCODE: 751 PPCODE:
678{ 752{
690 SDL_GL_SetAttribute (SDL_GL_ACCUM_GREEN_SIZE, 0); 764 SDL_GL_SetAttribute (SDL_GL_ACCUM_GREEN_SIZE, 0);
691 SDL_GL_SetAttribute (SDL_GL_ACCUM_BLUE_SIZE , 0); 765 SDL_GL_SetAttribute (SDL_GL_ACCUM_BLUE_SIZE , 0);
692 SDL_GL_SetAttribute (SDL_GL_ACCUM_ALPHA_SIZE, 0); 766 SDL_GL_SetAttribute (SDL_GL_ACCUM_ALPHA_SIZE, 0);
693 767
694 SDL_GL_SetAttribute (SDL_GL_DOUBLEBUFFER, 1); 768 SDL_GL_SetAttribute (SDL_GL_DOUBLEBUFFER, 1);
695#if SDL_VERSION_ATLEAST(1,2,10)
696 SDL_GL_SetAttribute (SDL_GL_ACCELERATED_VISUAL, 1);
697 SDL_GL_SetAttribute (SDL_GL_SWAP_CONTROL, 1); 769 SDL_GL_SetAttribute (SDL_GL_SWAP_CONTROL, 1);
698#endif
699 770
700 m = SDL_ListModes (0, SDL_FULLSCREEN | SDL_OPENGL); 771 m = SDL_ListModes (0, SDL_FULLSCREEN | SDL_OPENGL);
701 772
702 if (m && m != (SDL_Rect **)-1) 773 if (m && m != (SDL_Rect **)-1)
703 while (*m) 774 while (*m)
704 { 775 {
705 if ((*m)->w >= 800 && (*m)->h >= 480) 776 if ((*m)->w >= 400 && (*m)->h >= 300)
706 { 777 {
707 AV *av = newAV (); 778 AV *av = newAV ();
708 av_push (av, newSViv ((*m)->w)); 779 av_push (av, newSViv ((*m)->w));
709 av_push (av, newSViv ((*m)->h)); 780 av_push (av, newSViv ((*m)->h));
710 av_push (av, newSViv (rgb)); 781 av_push (av, newSViv (rgb));
752SDL_GetKeyName (int sym) 823SDL_GetKeyName (int sym)
753 824
754int 825int
755SDL_GetAppState () 826SDL_GetAppState ()
756 827
828int
829SDL_GetModState ()
830
757void 831void
758poll_events () 832poll_events ()
759 PPCODE: 833 PPCODE:
760{ 834{
761 SDL_Event ev; 835 SDL_Event ev;
770 { 844 {
771 case SDL_KEYDOWN: 845 case SDL_KEYDOWN:
772 case SDL_KEYUP: 846 case SDL_KEYUP:
773 hv_store (hv, "state", 5, newSViv (ev.key.state), 0); 847 hv_store (hv, "state", 5, newSViv (ev.key.state), 0);
774 hv_store (hv, "sym", 3, newSViv (ev.key.keysym.sym), 0); 848 hv_store (hv, "sym", 3, newSViv (ev.key.keysym.sym), 0);
775 hv_store (hv, "mod", 3, newSViv (ev.key.keysym.mod), 0); 849 hv_store (hv, "mod", 3, newSViv (ev.key.keysym.mod & MOD_MASK), 0);
776 hv_store (hv, "cmod", 4, newSViv (SDL_GetModState ()), 0); /* current mode */ 850 hv_store (hv, "cmod", 4, newSViv (SDL_GetModState () & MOD_MASK), 0); /* current mode */
777 hv_store (hv, "unicode", 7, newSViv (ev.key.keysym.unicode), 0); 851 hv_store (hv, "unicode", 7, newSViv (ev.key.keysym.unicode), 0);
778 break; 852 break;
779 853
780 case SDL_ACTIVEEVENT: 854 case SDL_ACTIVEEVENT:
781 hv_store (hv, "gain", 4, newSViv (ev.active.gain), 0); 855 hv_store (hv, "gain", 4, newSViv (ev.active.gain), 0);
799 x = ev.motion.x; 873 x = ev.motion.x;
800 y = ev.motion.y; 874 y = ev.motion.y;
801 SDL_PeepEvents (&ev, 1, SDL_GETEVENT, SDL_EVENTMASK (SDL_MOUSEMOTION)); 875 SDL_PeepEvents (&ev, 1, SDL_GETEVENT, SDL_EVENTMASK (SDL_MOUSEMOTION));
802 } 876 }
803 877
804 hv_store (hv, "mod", 3, newSViv (SDL_GetModState ()), 0); 878 hv_store (hv, "mod", 3, newSViv (SDL_GetModState () & MOD_MASK), 0);
805 hv_store (hv, "state", 5, newSViv (state), 0); 879 hv_store (hv, "state", 5, newSViv (state), 0);
806 hv_store (hv, "x", 1, newSViv (x), 0); 880 hv_store (hv, "x", 1, newSViv (x), 0);
807 hv_store (hv, "y", 1, newSViv (y), 0); 881 hv_store (hv, "y", 1, newSViv (y), 0);
808 hv_store (hv, "xrel", 4, newSViv (xrel), 0); 882 hv_store (hv, "xrel", 4, newSViv (xrel), 0);
809 hv_store (hv, "yrel", 4, newSViv (yrel), 0); 883 hv_store (hv, "yrel", 4, newSViv (yrel), 0);
810 } 884 }
811 break; 885 break;
812 886
813 case SDL_MOUSEBUTTONDOWN: 887 case SDL_MOUSEBUTTONDOWN:
814 case SDL_MOUSEBUTTONUP: 888 case SDL_MOUSEBUTTONUP:
815 hv_store (hv, "mod", 3, newSViv (SDL_GetModState ()), 0); 889 hv_store (hv, "mod", 3, newSViv (SDL_GetModState () & MOD_MASK), 0);
816 890
817 hv_store (hv, "button", 6, newSViv (ev.button.button), 0); 891 hv_store (hv, "button", 6, newSViv (ev.button.button), 0);
818 hv_store (hv, "state", 5, newSViv (ev.button.state), 0); 892 hv_store (hv, "state", 5, newSViv (ev.button.state), 0);
819 hv_store (hv, "x", 1, newSViv (ev.button.x), 0); 893 hv_store (hv, "x", 1, newSViv (ev.button.x), 0);
820 hv_store (hv, "y", 1, newSViv (ev.button.y), 0); 894 hv_store (hv, "y", 1, newSViv (ev.button.y), 0);
894 } 968 }
895 } 969 }
896#endif 970#endif
897} 971}
898 972
899void 973int
900add_font (char *file) 974add_font (char *file)
901 CODE: 975 CODE:
902 FcConfigAppFontAddFile (0, (const FcChar8 *)file); 976 RETVAL = FcConfigAppFontAddFile (0, (const FcChar8 *)file);
977 OUTPUT:
978 RETVAL
903 979
904void 980void
905load_image_inline (SV *image_) 981load_image_inline (SV *image_)
906 ALIAS: 982 ALIAS:
907 load_image_file = 1 983 load_image_file = 1
1165{ 1241{
1166 PangoLayoutIter *iter = pango_layout_get_iter (self->pl); 1242 PangoLayoutIter *iter = pango_layout_get_iter (self->pl);
1167 1243
1168 do 1244 do
1169 { 1245 {
1170 PangoLayoutRun *run = pango_layout_iter_get_run (iter); 1246 PangoLayoutRun *run = pango_layout_iter_get_run_readonly (iter);
1171 1247
1172 if (run && shape_attr_p (run)) 1248 if (run && shape_attr_p (run))
1173 { 1249 {
1174 PangoRectangle extents; 1250 PangoRectangle extents;
1175 pango_layout_iter_get_run_extents (iter, 0, &extents); 1251 pango_layout_iter_get_run_extents (iter, 0, &extents);
1279int 1355int
1280descent (DC::Layout self) 1356descent (DC::Layout self)
1281 CODE: 1357 CODE:
1282{ 1358{
1283 PangoRectangle rect; 1359 PangoRectangle rect;
1284 PangoLayoutLine *line = pango_layout_get_line (self->pl, 0); 1360 PangoLayoutLine *line = pango_layout_get_line_readonly (self->pl, 0);
1285 pango_layout_line_get_pixel_extents (line, 0, &rect); 1361 pango_layout_line_get_pixel_extents (line, 0, &rect);
1286 RETVAL = PANGO_DESCENT (rect); 1362 RETVAL = PANGO_DESCENT (rect);
1287} 1363}
1288 OUTPUT: 1364 OUTPUT:
1289 RETVAL 1365 RETVAL
1301 1377
1302void 1378void
1303cursor_pos (DC::Layout self, int index) 1379cursor_pos (DC::Layout self, int index)
1304 PPCODE: 1380 PPCODE:
1305{ 1381{
1306 PangoRectangle strong_pos; 1382 PangoRectangle pos;
1307 pango_layout_get_cursor_pos (self->pl, index, &strong_pos, 0); 1383 pango_layout_get_cursor_pos (self->pl, index, &pos, 0);
1308 1384
1309 EXTEND (SP, 3); 1385 EXTEND (SP, 3);
1310 PUSHs (sv_2mortal (newSViv (strong_pos.x / PANGO_SCALE))); 1386 PUSHs (sv_2mortal (newSViv (pos.x / PANGO_SCALE)));
1311 PUSHs (sv_2mortal (newSViv (strong_pos.y / PANGO_SCALE))); 1387 PUSHs (sv_2mortal (newSViv (pos.y / PANGO_SCALE)));
1312 PUSHs (sv_2mortal (newSViv (strong_pos.height / PANGO_SCALE))); 1388 PUSHs (sv_2mortal (newSViv (pos.height / PANGO_SCALE)));
1313} 1389}
1314 1390
1315void 1391void
1316index_to_line_x (DC::Layout self, int index, int trailing = 0) 1392index_to_line_x (DC::Layout self, int index, int trailing = 0)
1317 PPCODE: 1393 PPCODE:
1318{ 1394{
1319 int line, x; 1395 int line, x;
1320 1396
1321 pango_layout_index_to_line_x (self->pl, index, trailing, &line, &x); 1397 pango_layout_index_to_line_x (self->pl, index, trailing, &line, &x);
1398#if !PANGO_VERSION_CHECK (1, 17, 3)
1322 /* pango bug: line is between 1..numlines, not 0..numlines-1 */ 1399 /* pango bug: line is between 1..numlines, not 0..numlines-1 */
1323 1400 --line;
1401#endif
1324 EXTEND (SP, 2); 1402 EXTEND (SP, 2);
1325 PUSHs (sv_2mortal (newSViv (line - 1))); 1403 PUSHs (sv_2mortal (newSViv (line)));
1326 PUSHs (sv_2mortal (newSViv (x / PANGO_SCALE))); 1404 PUSHs (sv_2mortal (newSViv (x / PANGO_SCALE)));
1327} 1405}
1328 1406
1329void 1407void
1330line_x_to_index (DC::Layout self, int line, int x) 1408line_x_to_index (DC::Layout self, int line, int x)
1334 int index, trailing; 1412 int index, trailing;
1335 1413
1336 if (line < 0) 1414 if (line < 0)
1337 XSRETURN_EMPTY; 1415 XSRETURN_EMPTY;
1338 1416
1339 if (!(lp = pango_layout_get_line (self->pl, line))) 1417 if (!(lp = pango_layout_get_line_readonly (self->pl, line)))
1340 XSRETURN_EMPTY; /* do better */ 1418 XSRETURN_EMPTY; /* do better */
1341 1419
1342 pango_layout_line_x_to_index (lp, x * PANGO_SCALE, &index, &trailing); 1420 pango_layout_line_x_to_index (lp, x * PANGO_SCALE, &index, &trailing);
1343 1421
1344 EXTEND (SP, 2); 1422 EXTEND (SP, 2);
1661 uint8_t ext, cmd; 1739 uint8_t ext, cmd;
1662 1740
1663 do 1741 do
1664 { 1742 {
1665 ext = *data++; 1743 ext = *data++;
1666 cmd = ext & 0x3f; 1744 cmd = ext & 0x7f;
1667 1745
1668 if (cmd < 4) 1746 if (cmd < 4)
1669 cell->darkness = 255 - ext * 64 + 1; 1747 cell->darkness = 255 - ext * 64 + 1;
1670 else if (cmd == 5) // health 1748 else if (cmd == 5) // health
1671 { 1749 {
1674 } 1752 }
1675 else if (cmd == 6) // monster width 1753 else if (cmd == 6) // monster width
1676 cell->stat_width = *data++ + 1; 1754 cell->stat_width = *data++ + 1;
1677 else if (cmd == 0x47) 1755 else if (cmd == 0x47)
1678 { 1756 {
1679 if (*data == 4) 1757 if (*data == 1) cell->player = data [1];
1680 ; // decode player count 1758 else if (*data == 2) cell->player = data [2] + (data [1] << 8);
1759 else if (*data == 3) cell->player = data [3] + (data [2] << 8) + (data [1] << 16);
1760 else if (*data == 4) cell->player = data [4] + (data [3] << 8) + (data [2] << 16) + (data [1] << 24);
1681 1761
1682 data += *data + 1; 1762 data += *data + 1;
1683 } 1763 }
1684 else if (cmd == 8) // cell flags 1764 else if (cmd == 8) // cell flags
1685 cell->flags = *data++; 1765 cell->flags = *data++;
1715 } 1795 }
1716 } 1796 }
1717 } 1797 }
1718 } 1798 }
1719 else 1799 else
1720 cell->darkness = 0; 1800 CELL_CLEAR (cell);
1721 } 1801 }
1722} 1802}
1723 OUTPUT: 1803 OUTPUT:
1724 RETVAL 1804 RETVAL
1725 1805
1777} 1857}
1778 OUTPUT: 1858 OUTPUT:
1779 RETVAL 1859 RETVAL
1780 1860
1781void 1861void
1782draw (DC::Map self, int mx, int my, int sw, int sh, int T) 1862draw (DC::Map self, int mx, int my, int sw, int sh, int T, U32 player = 0xffffffff, int sdx = 0, int sdy = 0)
1783 CODE: 1863 CODE:
1784{ 1864{
1785 int x, y, z; 1865 int x, y, z;
1786 1866
1787 HV *smooth = (HV *)sv_2mortal ((SV *)newHV ()); 1867 HV *smooth = (HV *)sv_2mortal ((SV *)newHV ());
1788 uint32_t smooth_level[256 / 32]; // one bit for every possible smooth level 1868 uint32_t smooth_level[256 / 32]; // one bit for every possible smooth level
1789 static uint8_t smooth_max[256][256]; // egad, fast and wasteful on memory (64k) 1869 static uint8_t smooth_max[256][256]; // egad, fast and wasteful on memory (64k)
1790 smooth_key skey; 1870 smooth_key skey;
1791 1871 int pl_x, pl_y;
1872 maptex pl_tex;
1792 rc_t *rc = rc_alloc (); 1873 rc_t *rc = rc_alloc ();
1793 rc_key_t key; 1874 rc_key_t key;
1794 rc_array_t *arr; 1875 rc_array_t *arr;
1876
1877 pl_tex.name = 0;
1795 1878
1796 // thats current max. sorry. 1879 // thats current max. sorry.
1797 if (sw > 255) sw = 255; 1880 if (sw > 255) sw = 255;
1798 if (sh > 255) sh = 255; 1881 if (sh > 255) sh = 255;
1799 1882
1854 tileid tile = cell->tile [z]; 1937 tileid tile = cell->tile [z];
1855 1938
1856 if (tile) 1939 if (tile)
1857 { 1940 {
1858 maptex tex = self->tex [tile]; 1941 maptex tex = self->tex [tile];
1859 int px, py; 1942 int px = (x + 1) * T - tex.w;
1943 int py = (y + 1) * T - tex.h;
1860 1944
1861 if (key.texname != tex.name) 1945 if (key.texname != tex.name)
1862 { 1946 {
1863 if (!tex.name) 1947 if (!tex.name)
1864 tex = self->tex [2]; /* missing, replace by noface */ 1948 tex = self->tex [2]; /* missing, replace by noface */
1865 1949
1866 key.texname = tex.name; 1950 key.texname = tex.name;
1867 arr = rc_array (rc, &key); 1951 arr = rc_array (rc, &key);
1868 } 1952 }
1869 1953
1870 px = (x + 1) * T - tex.w; 1954 if (expect_false (cell->player == player) && expect_false (z == 2))
1871 py = (y + 1) * T - tex.h; 1955 {
1956 pl_x = px;
1957 pl_y = py;
1958 pl_tex = tex;
1959 continue;
1960 }
1872 1961
1873 rc_t2f_v3f (arr, 0 , 0 , px , py , 0); 1962 rc_t2f_v3f (arr, 0 , 0 , px , py , 0);
1874 rc_t2f_v3f (arr, 0 , tex.t, px , py + tex.h, 0); 1963 rc_t2f_v3f (arr, 0 , tex.t, px , py + tex.h, 0);
1875 rc_t2f_v3f (arr, tex.s, tex.t, px + tex.w, py + tex.h, 0); 1964 rc_t2f_v3f (arr, tex.s, tex.t, px + tex.w, py + tex.h, 0);
1876 rc_t2f_v3f (arr, tex.s, 0 , px + tex.w, py , 0); 1965 rc_t2f_v3f (arr, tex.s, 0 , px + tex.w, py , 0);
1877 1966
1878 if (cell->flags && z == 2) 1967 if (expect_false (cell->flags) && expect_false (z == 2))
1879 { 1968 {
1880 // overlays such as the speech bubble, probably more to come 1969 // overlays such as the speech bubble, probably more to come
1881 if (cell->flags & 1) 1970 if (cell->flags & 1)
1882 { 1971 {
1883 maptex tex = self->tex [1]; 1972 maptex tex = self->tex [1];
2022 } 2111 }
2023 2112
2024 hv_clear (smooth); 2113 hv_clear (smooth);
2025 } 2114 }
2026 2115
2116 if (pl_tex.name)
2117 {
2118 maptex tex = pl_tex;
2119 int px = pl_x + sdx;
2120 int py = pl_y + sdy;
2121
2122 key.texname = tex.name;
2123 arr = rc_array (rc, &key);
2124
2125 rc_t2f_v3f (arr, 0 , 0 , px , py , 0);
2126 rc_t2f_v3f (arr, 0 , tex.t, px , py + tex.h, 0);
2127 rc_t2f_v3f (arr, tex.s, tex.t, px + tex.w, py + tex.h, 0);
2128 rc_t2f_v3f (arr, tex.s, 0 , px + tex.w, py , 0);
2129
2130 rc_draw (rc);
2131 }
2132
2027 glDisable (GL_BLEND); 2133 glDisable (GL_BLEND);
2028 rc_free (rc); 2134 rc_free (rc);
2029 2135
2030 // top layer: overlays such as the health bar 2136 // top layer: overlays such as the health bar
2031 for (y = 0; y < sh; y++) 2137 for (y = 0; y < sh; y++)
2136 SvCUR_set (darkness3_sv, sw34 * sh3); 2242 SvCUR_set (darkness3_sv, sw34 * sh3);
2137 2243
2138 mx += self->x - 1; 2244 mx += self->x - 1;
2139 my += self->y - 1; 2245 my += self->y - 1;
2140 2246
2141 memset (darkness1, 255, sw1 * sh1); 2247 memset (darkness1, 255 - FOW_DARKNESS, sw1 * sh1);
2142 2248
2143 for (y = 0; y < sh1; y++) 2249 for (y = 0; y < sh1; y++)
2144 if (0 <= y + my && y + my < self->rows) 2250 if (0 <= y + my && y + my < self->rows)
2145 { 2251 {
2146 maprow *row = self->row + (y + my); 2252 maprow *row = self->row + (y + my);
2266 else 2372 else
2267 *data++ = 0; 2373 *data++ = 0;
2268 } 2374 }
2269 } 2375 }
2270 2376
2377 /* if size is w*h + 5 then no data has been found */
2378 if (data - (uint8_t *)SvPVX (data_sv) != w * h + 5)
2379 {
2271 SvPOK_only (data_sv); 2380 SvPOK_only (data_sv);
2272 SvCUR_set (data_sv, data - (uint8_t *)SvPVX (data_sv)); 2381 SvCUR_set (data_sv, data - (uint8_t *)SvPVX (data_sv));
2382 }
2383
2273 RETVAL = data_sv; 2384 RETVAL = data_sv;
2274} 2385}
2275 OUTPUT: 2386 OUTPUT:
2276 RETVAL 2387 RETVAL
2277 2388
2278void 2389void
2279set_rect (DC::Map self, int x0, int y0, uint8_t *data) 2390set_rect (DC::Map self, int x0, int y0, SV *data_sv)
2280 PPCODE: 2391 PPCODE:
2281{ 2392{
2282 int x, y, z; 2393 int x, y, z;
2283 int w, h; 2394 int w, h;
2284 int x1, y1; 2395 int x1, y1;
2396 STRLEN len;
2397 uint8_t *data, *end;
2398
2399 len = SvLEN (data_sv);
2400 SvGROW (data_sv, len + 8); // reserve at least 7+ bytes more
2401 data = SvPVbyte_nolen (data_sv);
2402 end = data + len + 8;
2403
2404 if (len < 5)
2405 XSRETURN_EMPTY;
2285 2406
2286 if (*data++ != 0) 2407 if (*data++ != 0)
2287 XSRETURN_EMPTY; /* version mismatch */ 2408 XSRETURN_EMPTY; /* version mismatch */
2288 2409
2289 w = *data++ << 8; w |= *data++; 2410 w = *data++ << 8; w |= *data++;
2304 { 2425 {
2305 maprow *row = map_get_row (self, y); 2426 maprow *row = map_get_row (self, y);
2306 2427
2307 for (x = x0; x < x1; x++) 2428 for (x = x0; x < x1; x++)
2308 { 2429 {
2430 uint8_t flags;
2431
2432 if (data + 7 >= end)
2433 XSRETURN_EMPTY;
2434
2309 uint8_t flags = *data++; 2435 flags = *data++;
2310 2436
2311 if (flags) 2437 if (flags)
2312 { 2438 {
2313 mapcell *cell = row_get_cell (row, x); 2439 mapcell *cell = row_get_cell (row, x);
2314 tileid tile[3] = { 0, 0, 0 }; 2440 tileid tile[3] = { 0, 0, 0 };
2317 if (flags & 2) { tile[1] = *data++ << 8; tile[1] |= *data++; } 2443 if (flags & 2) { tile[1] = *data++ << 8; tile[1] |= *data++; }
2318 if (flags & 4) { tile[2] = *data++ << 8; tile[2] |= *data++; } 2444 if (flags & 4) { tile[2] = *data++ << 8; tile[2] |= *data++; }
2319 2445
2320 if (cell->darkness == 0) 2446 if (cell->darkness == 0)
2321 { 2447 {
2322 cell->darkness = 0; 2448 /*cell->darkness = 0;*/
2449 EXTEND (SP, 3);
2323 2450
2324 for (z = 0; z <= 2; z++) 2451 for (z = 0; z <= 2; z++)
2325 { 2452 {
2326 tileid t = tile [z]; 2453 tileid t = tile [z];
2327 2454
2328 if (t >= self->texs || (t && !self->tex [t].name)) 2455 if (t >= self->texs || (t && !self->tex [t].name))
2329 { 2456 {
2330 XPUSHs (sv_2mortal (newSViv (t))); 2457 PUSHs (sv_2mortal (newSViv (t)));
2331 need_texid (self, t); 2458 need_texid (self, t);
2332 } 2459 }
2333 2460
2334 cell->tile [z] = t; 2461 cell->tile [z] = t;
2335 } 2462 }
2846void glSeparableFilter2D (int target, int internalformat, int width, int height, int format, int type, char *row, char *column) 2973void glSeparableFilter2D (int target, int internalformat, int width, int height, int format, int type, char *row, char *column)
2847 CODE: 2974 CODE:
2848 if (gl.SeparableFilter2D) 2975 if (gl.SeparableFilter2D)
2849 gl.SeparableFilter2D (target, internalformat, width, height, format, type, row, column); 2976 gl.SeparableFilter2D (target, internalformat, width, height, format, type, row, column);
2850 2977
2851void glTexImage2D (int target, int level, int internalformat, int width, int height, int border, int format, int type, char *data) 2978void glTexImage2D (int target, int level, int internalformat, int width, int height, int border, int format, int type, char *data = 0)
2852 2979
2853void glCopyTexImage2D (int target, int level, int internalformat, int x, int y, int width, int height, int border) 2980void glCopyTexImage2D (int target, int level, int internalformat, int x, int y, int width, int height, int border)
2854 2981
2855void glDrawPixels (int width, int height, int format, int type, char *pixels) 2982void glDrawPixels (int width, int height, int format, int type, char *pixels)
2856 2983

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines