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.311 by root, Tue Dec 27 09:17:27 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 ("DC::Main::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 shared library 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
971
972void
973SDL_WM_SetCaption (const char *title, const char *icon)
967 974
968void 975void
969SDL_GL_SwapBuffers () 976SDL_GL_SwapBuffers ()
970 977
971char * 978char *
1147 RETVAL 1154 RETVAL
1148 1155
1149void 1156void
1150IMG_Init (int flags = IMG_INIT_JPG | IMG_INIT_PNG) 1157IMG_Init (int flags = IMG_INIT_JPG | IMG_INIT_PNG)
1151 1158
1159# MIX_INIT_MP3 gives smpeg + libstdc++ + libgcc_s
1152void 1160void
1153Mix_Init (int flags = MIX_INIT_MOD | MIX_INIT_MP3 | MIX_INIT_OGG) 1161Mix_Init (int flags = MIX_INIT_MOD | MIX_INIT_OGG)
1154 1162
1155void 1163void
1156load_image_inline (SV *image_) 1164load_image_inline (SV *image_)
1157 ALIAS: 1165 ALIAS:
1158 load_image_file = 1 1166 load_image_file = 1
1484 1492
1485void 1493void
1486set_height (DC::Layout self, int base_height) 1494set_height (DC::Layout self, int base_height)
1487 CODE: 1495 CODE:
1488 if (self->base_height != base_height) 1496 if (self->base_height != base_height)
1489 { 1497 {
1490 self->base_height = base_height; 1498 self->base_height = base_height;
1491 layout_update_font (self); 1499 layout_update_font (self);
1492 } 1500 }
1493 1501
1494void 1502void
2024 self->y += MAP_EXTEND_Y; 2032 self->y += MAP_EXTEND_Y;
2025 } 2033 }
2026} 2034}
2027 2035
2028SV * 2036SV *
2029map1a_update (DC::Map self, SV *data_, int extmap) 2037map1a_update (DC::Map self, SV *data_)
2030 CODE: 2038 CODE:
2031{ 2039{
2032 uint8_t *data = (uint8_t *)SvPVbyte_nolen (data_); 2040 uint8_t *data = (uint8_t *)SvPVbyte_nolen (data_);
2033 uint8_t *data_end = (uint8_t *)SvEND (data_); 2041 uint8_t *data_end = (uint8_t *)SvEND (data_);
2034 mapcell *cell; 2042 mapcell *cell;
2055 2063
2056 //TODO: don't trust server data to be in-range(!) 2064 //TODO: don't trust server data to be in-range(!)
2057 2065
2058 if (flags & 8) 2066 if (flags & 8)
2059 { 2067 {
2068 uint8_t ext, cmd;
2069
2060 if (extmap) 2070 do
2061 { 2071 {
2062 uint8_t ext, cmd; 2072 ext = *data++;
2073 cmd = ext & 0x7f;
2063 2074
2064 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
2065 { 2078 {
2066 ext = *data++;
2067 cmd = ext & 0x7f;
2068
2069 if (cmd < 4)
2070 cell->darkness = 255 - ext * 64 + 1; /* make sure this doesn't collide with FOW_DARKNESS */
2071 else if (cmd == 5) // health
2072 {
2073 cell->stat_width = 1; 2079 cell->stat_width = 1;
2074 cell->stat_hp = *data++; 2080 cell->stat_hp = *data++;
2075 }
2076 else if (cmd == 6) // monster width
2077 cell->stat_width = *data++ + 1;
2078 else if (cmd == 0x47)
2079 {
2080 if (*data == 1) cell->player = data [1];
2081 else if (*data == 2) cell->player = data [2] + (data [1] << 8);
2082 else if (*data == 3) cell->player = data [3] + (data [2] << 8) + (data [1] << 16);
2083 else if (*data == 4) cell->player = data [4] + (data [3] << 8) + (data [2] << 16) + (data [1] << 24);
2084
2085 data += *data + 1;
2086 }
2087 else if (cmd == 8) // cell flags
2088 cell->flags = *data++;
2089 else if (ext & 0x40) // unknown, multibyte => skip
2090 data += *data + 1;
2091 else
2092 data++;
2093 } 2081 }
2094 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++;
2095 } 2099 }
2096 else 2100 while (ext & 0x80);
2097 cell->darkness = *data++ + 1;
2098 } 2101 }
2099 2102
2100 for (z = 0; z <= 2; ++z) 2103 for (z = 0; z <= 2; ++z)
2101 if (flags & (4 >> z)) 2104 if (flags & (4 >> z))
2102 { 2105 {

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines