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.260 by root, Tue May 20 20:29:47 2008 UTC vs.
Revision 1.270 by root, Sun Jul 20 15:05:13 2008 UTC

65# include <netinet/in.h> 65# include <netinet/in.h>
66# include <netinet/tcp.h> 66# include <netinet/tcp.h>
67# include <inttypes.h> 67# include <inttypes.h>
68#endif 68#endif
69 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
70#define OBJ_STR "\xef\xbf\xbc" /* U+FFFC, object replacement character */ 79#define OBJ_STR "\xef\xbf\xbc" /* U+FFFC, object replacement character */
71 80
72#define FOW_DARKNESS 32 81#define FOW_DARKNESS 32
73 82
74#define MAP_EXTEND_X 32 83#define MAP_EXTEND_X 32
76 85
77#define MIN_FONT_HEIGHT 10 86#define MIN_FONT_HEIGHT 10
78 87
79/* mask out modifiers we are not interested in */ 88/* mask out modifiers we are not interested in */
80#define MOD_MASK (KMOD_CTRL | KMOD_SHIFT | KMOD_ALT | KMOD_META) 89#define MOD_MASK (KMOD_CTRL | KMOD_SHIFT | KMOD_ALT | KMOD_META)
81
82#if 0
83# define PARACHUTE SDL_INIT_NOPARACHUTE
84#else
85# define PARACHUTE 0
86#endif
87 90
88static AV *texture_av; 91static AV *texture_av;
89 92
90static struct 93static struct
91{ 94{
364 self->oy = 0; 367 self->oy = 0;
365 self->row = 0; 368 self->row = 0;
366 self->rows = 0; 369 self->rows = 0;
367} 370}
368 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
369static void 382static void
370map_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)
371{ 384{
372 int x, y; 385 int x, y;
373 maprow *row; 386 maprow *row;
387 if (x >= row->c1) 400 if (x >= row->c1)
388 break; 401 break;
389 402
390 cell = row->col + x - row->c0; 403 cell = row->col + x - row->c0;
391 404
392 cell->darkness = 0; 405 CELL_CLEAR (cell);
393 cell->stat_hp = 0;
394 cell->flags = 0;
395 cell->player = 0;
396 } 406 }
397 } 407 }
398} 408}
399 409
400typedef struct { 410typedef struct {
635 const_iv (KMOD_NUM), 645 const_iv (KMOD_NUM),
636 const_iv (KMOD_CAPS), 646 const_iv (KMOD_CAPS),
637 const_iv (KMOD_MODE), 647 const_iv (KMOD_MODE),
638 648
639 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)
640# undef const_iv 679# undef const_iv
641 }; 680 };
642 681
643 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; )
644 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv)); 683 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv));
661 RETVAL 700 RETVAL
662 701
663NV floor (NV x) 702NV floor (NV x)
664 703
665NV ceil (NV x) 704NV ceil (NV x)
705
706NV ceilabs (NV x)
707 CODE:
708 RETVAL = x < 0. ? - ceil (-x) : ceil (x);
709 OUTPUT:
710 RETVAL
666 711
667IV minpot (UV n) 712IV minpot (UV n)
668 713
669IV popcount (UV n) 714IV popcount (UV n)
670 715
680 pango_context_set_language (opengl_context, pango_language_from_string ("en")); 725 pango_context_set_language (opengl_context, pango_language_from_string ("en"));
681 /*pango_context_set_base_dir (opengl_context, PANGO_DIRECTION_WEAK_LTR);*/ 726 /*pango_context_set_base_dir (opengl_context, PANGO_DIRECTION_WEAK_LTR);*/
682#endif 727#endif
683} 728}
684 729
685char *
686SDL_GetError () 730char *SDL_GetError ()
687 731
688int 732int SDL_Init (U32 flags)
689SDL_Init (U32 flags = SDL_INIT_VIDEO | SDL_INIT_AUDIO | PARACHUTE)
690 733
691void 734int SDL_InitSubSystem (U32 flags)
735
736void SDL_QuitSubSystem (U32 flags)
737
692SDL_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
693 748
694void 749void
695SDL_ListModes (int rgb, int alpha) 750SDL_ListModes (int rgb, int alpha)
696 PPCODE: 751 PPCODE:
697{ 752{
709 SDL_GL_SetAttribute (SDL_GL_ACCUM_GREEN_SIZE, 0); 764 SDL_GL_SetAttribute (SDL_GL_ACCUM_GREEN_SIZE, 0);
710 SDL_GL_SetAttribute (SDL_GL_ACCUM_BLUE_SIZE , 0); 765 SDL_GL_SetAttribute (SDL_GL_ACCUM_BLUE_SIZE , 0);
711 SDL_GL_SetAttribute (SDL_GL_ACCUM_ALPHA_SIZE, 0); 766 SDL_GL_SetAttribute (SDL_GL_ACCUM_ALPHA_SIZE, 0);
712 767
713 SDL_GL_SetAttribute (SDL_GL_DOUBLEBUFFER, 1); 768 SDL_GL_SetAttribute (SDL_GL_DOUBLEBUFFER, 1);
714#if SDL_VERSION_ATLEAST(1,2,10)
715 SDL_GL_SetAttribute (SDL_GL_ACCELERATED_VISUAL, 1);
716 SDL_GL_SetAttribute (SDL_GL_SWAP_CONTROL, 1); 769 SDL_GL_SetAttribute (SDL_GL_SWAP_CONTROL, 1);
717#endif
718 770
719 m = SDL_ListModes (0, SDL_FULLSCREEN | SDL_OPENGL); 771 m = SDL_ListModes (0, SDL_FULLSCREEN | SDL_OPENGL);
720 772
721 if (m && m != (SDL_Rect **)-1) 773 if (m && m != (SDL_Rect **)-1)
722 while (*m) 774 while (*m)
723 { 775 {
724 if ((*m)->w >= 800 && (*m)->h >= 480) 776 if ((*m)->w >= 400 && (*m)->h >= 300)
725 { 777 {
726 AV *av = newAV (); 778 AV *av = newAV ();
727 av_push (av, newSViv ((*m)->w)); 779 av_push (av, newSViv ((*m)->w));
728 av_push (av, newSViv ((*m)->h)); 780 av_push (av, newSViv ((*m)->h));
729 av_push (av, newSViv (rgb)); 781 av_push (av, newSViv (rgb));
1687 uint8_t ext, cmd; 1739 uint8_t ext, cmd;
1688 1740
1689 do 1741 do
1690 { 1742 {
1691 ext = *data++; 1743 ext = *data++;
1692 cmd = ext & 0x3f; 1744 cmd = ext & 0x7f;
1693 1745
1694 if (cmd < 4) 1746 if (cmd < 4)
1695 cell->darkness = 255 - ext * 64 + 1; 1747 cell->darkness = 255 - ext * 64 + 1;
1696 else if (cmd == 5) // health 1748 else if (cmd == 5) // health
1697 { 1749 {
1700 } 1752 }
1701 else if (cmd == 6) // monster width 1753 else if (cmd == 6) // monster width
1702 cell->stat_width = *data++ + 1; 1754 cell->stat_width = *data++ + 1;
1703 else if (cmd == 0x47) 1755 else if (cmd == 0x47)
1704 { 1756 {
1705 if (*data == 4) 1757 if (*data == 1) cell->player = data [1];
1706 ; // 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);
1707 1761
1708 data += *data + 1; 1762 data += *data + 1;
1709 } 1763 }
1710 else if (cmd == 8) // cell flags 1764 else if (cmd == 8) // cell flags
1711 cell->flags = *data++; 1765 cell->flags = *data++;
1741 } 1795 }
1742 } 1796 }
1743 } 1797 }
1744 } 1798 }
1745 else 1799 else
1746 cell->darkness = 0; 1800 CELL_CLEAR (cell);
1747 } 1801 }
1748} 1802}
1749 OUTPUT: 1803 OUTPUT:
1750 RETVAL 1804 RETVAL
1751 1805
1803} 1857}
1804 OUTPUT: 1858 OUTPUT:
1805 RETVAL 1859 RETVAL
1806 1860
1807void 1861void
1808draw (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)
1809 CODE: 1863 CODE:
1810{ 1864{
1811 int x, y, z; 1865 int x, y, z;
1812 1866
1813 HV *smooth = (HV *)sv_2mortal ((SV *)newHV ()); 1867 HV *smooth = (HV *)sv_2mortal ((SV *)newHV ());
1814 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
1815 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)
1816 smooth_key skey; 1870 smooth_key skey;
1817 1871 int pl_x, pl_y;
1872 maptex pl_tex;
1818 rc_t *rc = rc_alloc (); 1873 rc_t *rc = rc_alloc ();
1819 rc_key_t key; 1874 rc_key_t key;
1820 rc_array_t *arr; 1875 rc_array_t *arr;
1876
1877 pl_tex.name = 0;
1821 1878
1822 // thats current max. sorry. 1879 // thats current max. sorry.
1823 if (sw > 255) sw = 255; 1880 if (sw > 255) sw = 255;
1824 if (sh > 255) sh = 255; 1881 if (sh > 255) sh = 255;
1825 1882
1880 tileid tile = cell->tile [z]; 1937 tileid tile = cell->tile [z];
1881 1938
1882 if (tile) 1939 if (tile)
1883 { 1940 {
1884 maptex tex = self->tex [tile]; 1941 maptex tex = self->tex [tile];
1885 int px, py; 1942 int px = (x + 1) * T - tex.w;
1943 int py = (y + 1) * T - tex.h;
1886 1944
1887 if (key.texname != tex.name) 1945 if (key.texname != tex.name)
1888 { 1946 {
1889 if (!tex.name) 1947 if (!tex.name)
1890 tex = self->tex [2]; /* missing, replace by noface */ 1948 tex = self->tex [2]; /* missing, replace by noface */
1891 1949
1892 key.texname = tex.name; 1950 key.texname = tex.name;
1893 arr = rc_array (rc, &key); 1951 arr = rc_array (rc, &key);
1894 } 1952 }
1895 1953
1896 px = (x + 1) * T - tex.w; 1954 if (expect_false (cell->player == player) && expect_false (z == 2))
1897 py = (y + 1) * T - tex.h; 1955 {
1956 pl_x = px;
1957 pl_y = py;
1958 pl_tex = tex;
1959 continue;
1960 }
1898 1961
1899 rc_t2f_v3f (arr, 0 , 0 , px , py , 0); 1962 rc_t2f_v3f (arr, 0 , 0 , px , py , 0);
1900 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);
1901 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);
1902 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);
1903 1966
1904 if (cell->flags && z == 2) 1967 if (expect_false (cell->flags) && expect_false (z == 2))
1905 { 1968 {
1906 // overlays such as the speech bubble, probably more to come 1969 // overlays such as the speech bubble, probably more to come
1907 if (cell->flags & 1) 1970 if (cell->flags & 1)
1908 { 1971 {
1909 maptex tex = self->tex [1]; 1972 maptex tex = self->tex [1];
2048 } 2111 }
2049 2112
2050 hv_clear (smooth); 2113 hv_clear (smooth);
2051 } 2114 }
2052 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
2053 glDisable (GL_BLEND); 2133 glDisable (GL_BLEND);
2054 rc_free (rc); 2134 rc_free (rc);
2055 2135
2056 // top layer: overlays such as the health bar 2136 // top layer: overlays such as the health bar
2057 for (y = 0; y < sh; y++) 2137 for (y = 0; y < sh; y++)
2162 SvCUR_set (darkness3_sv, sw34 * sh3); 2242 SvCUR_set (darkness3_sv, sw34 * sh3);
2163 2243
2164 mx += self->x - 1; 2244 mx += self->x - 1;
2165 my += self->y - 1; 2245 my += self->y - 1;
2166 2246
2167 memset (darkness1, 255, sw1 * sh1); 2247 memset (darkness1, 255 - FOW_DARKNESS, sw1 * sh1);
2168 2248
2169 for (y = 0; y < sh1; y++) 2249 for (y = 0; y < sh1; y++)
2170 if (0 <= y + my && y + my < self->rows) 2250 if (0 <= y + my && y + my < self->rows)
2171 { 2251 {
2172 maprow *row = self->row + (y + my); 2252 maprow *row = self->row + (y + my);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines