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.309 by root, Mon Dec 26 22:30:21 2011 UTC vs.
Revision 1.317 by root, Fri Nov 23 12:39:05 2012 UTC

577 577
578 return mod; 578 return mod;
579} 579}
580 580
581static void 581static void
582deliantra_main () 582deliantra_main (SV *real_main)
583{ 583{
584 char *argv[] = { 0 }; 584 dSP;
585 call_argv ("::main", G_DISCARD | G_VOID, argv); 585
586 PUSHMARK (SP);
587 call_sv (real_main, G_DISCARD | G_VOID);
586} 588}
587 589
588#ifdef __MACOSX__ 590#ifdef __MACOSX__
591 static SV *real_main;
592
589 /* to due surprising braindamage on the side of SDL design, we 593 /* to due surprising braindamage on the side of SDL design, we
590 * do some mind-boggling hack here: SDL requires a custom main() 594 * do some mind-boggling hack here: SDL requires a custom main()
591 * on OS X, so... we provide one and call the original main(), which, 595 * on OS X, so... we provide one and call the original main(), which,
592 * due to share dlibrary magic, calls -lSDLmain's main, not perl's main, 596 * due to shared library magic, calls -lSDLmain's main, not perl's main,
593 * and which calls our main (== SDL_main) back. 597 * and which calls our main (== SDL_main) back.
594 */ 598 */
595 extern C_LINKAGE int 599 extern C_LINKAGE int
596 main (int argc, char *argv[]) 600 main (int argc, char *argv[])
597 { 601 {
598 deliantra_main (); 602 deliantra_main (real_main);
599 } 603 }
600 604
601 #undef main 605 #undef main
602 606
603 extern C_LINKAGE int main (int argc, char *argv[]); 607 extern C_LINKAGE int main (int argc, char *argv[]);
604 608
605 static void 609 static void
606 SDL_braino (void) 610 SDL_main_hack (SV *real_main_)
607 { 611 {
612 real_main = real_main_;
613
608 char *argv[] = { "deliantra client", 0 }; 614 char *argv[] = { "deliantra client", 0 };
609 (main) (1, argv); 615 (main) (1, argv);
610 } 616 }
611#else 617#else
612 static void 618 static void
613 SDL_braino (void) 619 SDL_main_hack (SV *real_main)
614 { 620 {
615 deliantra_main (); 621 deliantra_main (real_main);
616 } 622 }
617#endif 623#endif
618 624
619MODULE = Deliantra::Client PACKAGE = DC 625MODULE = Deliantra::Client PACKAGE = DC
620 626
871#endif 877#endif
872} 878}
873 879
874char *SDL_GetError () 880char *SDL_GetError ()
875 881
876void SDL_braino () 882void SDL_main_hack (SV *real_main)
883 PROTOTYPE: &
877 884
878int SDL_Init (U32 flags) 885int SDL_Init (U32 flags)
879 886
880int SDL_InitSubSystem (U32 flags) 887int SDL_InitSubSystem (U32 flags)
881 888
950 ); 957 );
951 958
952 if (RETVAL) 959 if (RETVAL)
953 { 960 {
954 av_clear (texture_av); 961 av_clear (texture_av);
955
956 SDL_WM_SetCaption ("Deliantra MORPG Client " VERSION, "Deliantra");
957#define GL_FUNC(ptr,name) gl.name = (ptr)SDL_GL_GetProcAddress ("gl" # name); 962#define GL_FUNC(ptr,name) gl.name = (ptr)SDL_GL_GetProcAddress ("gl" # name);
958#include "glfunc.h" 963#include "glfunc.h"
959#undef GL_FUNC 964#undef GL_FUNC
960
961 if (!gl.ActiveTexture ) gl.ActiveTexture = gl.ActiveTextureARB; 965 if (!gl.ActiveTexture ) gl.ActiveTexture = gl.ActiveTextureARB;
962 if (!gl.MultiTexCoord2f) gl.MultiTexCoord2f = gl.MultiTexCoord2fARB; 966 if (!gl.MultiTexCoord2f) gl.MultiTexCoord2f = gl.MultiTexCoord2fARB;
963 } 967 }
964} 968}
965 OUTPUT: 969 OUTPUT:
966 RETVAL 970 RETVAL
967 971
968void 972void
973SDL_WM_SetCaption (const char *title, const char *icon)
974
975void
969SDL_GL_SwapBuffers () 976SDL_GL_SwapBuffers ()
970 977
971char * 978char *
972SDL_GetKeyName (int sym) 979SDL_GetKeyName (int sym)
973 980
975SDL_GetAppState () 982SDL_GetAppState ()
976 983
977int 984int
978SDL_GetModState () 985SDL_GetModState ()
979 986
987int
988SDL_WaitEvent ()
989 C_ARGS: 0
990
980void 991void
992SDL_PumpEvents ()
993
994void
981poll_events () 995peep_events ()
982 PPCODE: 996 PPCODE:
983{ 997{
984 SDL_Event ev; 998 SDL_Event ev;
985 999
986 SDL_PumpEvents (); 1000 SDL_PumpEvents ();
1140 RETVAL 1154 RETVAL
1141 1155
1142void 1156void
1143IMG_Init (int flags = IMG_INIT_JPG | IMG_INIT_PNG) 1157IMG_Init (int flags = IMG_INIT_JPG | IMG_INIT_PNG)
1144 1158
1159# MIX_INIT_MP3 gives smpeg + libstdc++ + libgcc_s
1145void 1160void
1146Mix_Init (int flags = MIX_INIT_MOD | MIX_INIT_MP3 | MIX_INIT_OGG) 1161Mix_Init (int flags = MIX_INIT_MOD | MIX_INIT_OGG)
1147 1162
1148void 1163void
1149load_image_inline (SV *image_) 1164load_image_inline (SV *image_)
1150 ALIAS: 1165 ALIAS:
1151 load_image_file = 1 1166 load_image_file = 1
1477 1492
1478void 1493void
1479set_height (DC::Layout self, int base_height) 1494set_height (DC::Layout self, int base_height)
1480 CODE: 1495 CODE:
1481 if (self->base_height != base_height) 1496 if (self->base_height != base_height)
1482 { 1497 {
1483 self->base_height = base_height; 1498 self->base_height = base_height;
1484 layout_update_font (self); 1499 layout_update_font (self);
1485 } 1500 }
1486 1501
1487void 1502void
2017 self->y += MAP_EXTEND_Y; 2032 self->y += MAP_EXTEND_Y;
2018 } 2033 }
2019} 2034}
2020 2035
2021SV * 2036SV *
2022map1a_update (DC::Map self, SV *data_, int extmap) 2037map1a_update (DC::Map self, SV *data_)
2023 CODE: 2038 CODE:
2024{ 2039{
2025 uint8_t *data = (uint8_t *)SvPVbyte_nolen (data_); 2040 uint8_t *data = (uint8_t *)SvPVbyte_nolen (data_);
2026 uint8_t *data_end = (uint8_t *)SvEND (data_); 2041 uint8_t *data_end = (uint8_t *)SvEND (data_);
2027 mapcell *cell; 2042 mapcell *cell;
2048 2063
2049 //TODO: don't trust server data to be in-range(!) 2064 //TODO: don't trust server data to be in-range(!)
2050 2065
2051 if (flags & 8) 2066 if (flags & 8)
2052 { 2067 {
2068 uint8_t ext, cmd;
2069
2053 if (extmap) 2070 do
2054 { 2071 {
2055 uint8_t ext, cmd; 2072 ext = *data++;
2073 cmd = ext & 0x7f;
2056 2074
2057 do 2075 if (cmd < 4)
2076 cell->darkness = 255 - ext * 64 + 1; /* make sure this doesn't collide with FOW_DARKNESS */
2077 else if (cmd == 5) // health
2058 { 2078 {
2059 ext = *data++;
2060 cmd = ext & 0x7f;
2061
2062 if (cmd < 4)
2063 cell->darkness = 255 - ext * 64 + 1; /* make sure this doesn't collide with FOW_DARKNESS */
2064 else if (cmd == 5) // health
2065 {
2066 cell->stat_width = 1; 2079 cell->stat_width = 1;
2067 cell->stat_hp = *data++; 2080 cell->stat_hp = *data++;
2068 }
2069 else if (cmd == 6) // monster width
2070 cell->stat_width = *data++ + 1;
2071 else if (cmd == 0x47)
2072 {
2073 if (*data == 1) cell->player = data [1];
2074 else if (*data == 2) cell->player = data [2] + (data [1] << 8);
2075 else if (*data == 3) cell->player = data [3] + (data [2] << 8) + (data [1] << 16);
2076 else if (*data == 4) cell->player = data [4] + (data [3] << 8) + (data [2] << 16) + (data [1] << 24);
2077
2078 data += *data + 1;
2079 }
2080 else if (cmd == 8) // cell flags
2081 cell->flags = *data++;
2082 else if (ext & 0x40) // unknown, multibyte => skip
2083 data += *data + 1;
2084 else
2085 data++;
2086 } 2081 }
2087 while (ext & 0x80); 2082 else if (cmd == 6) // monster width
2083 cell->stat_width = *data++ + 1;
2084 else if (cmd == 0x47)
2085 {
2086 if (*data == 1) cell->player = data [1];
2087 else if (*data == 2) cell->player = data [2] + (data [1] << 8);
2088 else if (*data == 3) cell->player = data [3] + (data [2] << 8) + (data [1] << 16);
2089 else if (*data == 4) cell->player = data [4] + (data [3] << 8) + (data [2] << 16) + (data [1] << 24);
2090
2091 data += *data + 1;
2092 }
2093 else if (cmd == 8) // cell flags
2094 cell->flags = *data++;
2095 else if (ext & 0x40) // unknown, multibyte => skip
2096 data += *data + 1;
2097 else
2098 data++;
2088 } 2099 }
2089 else 2100 while (ext & 0x80);
2090 cell->darkness = *data++ + 1;
2091 } 2101 }
2092 2102
2093 for (z = 0; z <= 2; ++z) 2103 for (z = 0; z <= 2; ++z)
2094 if (flags & (4 >> z)) 2104 if (flags & (4 >> z))
2095 { 2105 {

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines