--- deliantra/Deliantra-Client/Client.xs 2006/08/19 02:49:53 1.146 +++ deliantra/Deliantra-Client/Client.xs 2006/11/07 22:41:27 1.164 @@ -3,7 +3,9 @@ # define _WIN32_WINNT 0x0500 // needed to get win2000 api calls # include # include +# include # pragma warning(disable:4244) +# pragma warning(disable:4761) #endif #include "EXTERN.h" @@ -38,16 +40,9 @@ # include # include # include -#else - typedef unsigned char uint8_t; - typedef unsigned short uint16_t; - typedef unsigned int uint32_t; - typedef signed char int8_t; - typedef signed short int16_t; - typedef signed int int32_t; #endif -#define OBJ_STR "\xef\xbf\xbc" /* U+FFFC, objetc replacement character */ +#define OBJ_STR "\xef\xbf\xbc" /* U+FFFC, object replacement character */ #define FOW_DARKNESS 32 @@ -171,9 +166,10 @@ } maptex; typedef struct { - uint16_t darkness; + uint32_t player; mapface face[3]; - uint8_t stat_hp; + uint16_t darkness; + uint8_t stat_width, stat_hp, flags; } mapcell; typedef struct { @@ -316,6 +312,8 @@ cell->darkness = 0; cell->stat_hp = 0; + cell->flags = 0; + cell->player = 0; } } } @@ -650,6 +648,35 @@ #endif void +win32_proxy_info () + PPCODE: +{ +#ifdef _WIN32 + char buffer[2048]; + DWORD buflen; + + EXTEND (SP, 3); + + buflen = sizeof (buffer); + if (InternetQueryOption (0, INTERNET_OPTION_PROXY, (void *)buffer, &buflen)) + if (((INTERNET_PROXY_INFO *)buffer)->dwAccessType == INTERNET_OPEN_TYPE_PROXY) + { + PUSHs (newSVpv (((INTERNET_PROXY_INFO *)buffer)->lpszProxy, 0)); + + buflen = sizeof (buffer); + if (InternetQueryOption (0, INTERNET_OPTION_PROXY_USERNAME, (void *)buffer, &buflen)) + { + PUSHs (newSVpv (buffer, 0)); + + buflen = sizeof (buffer); + if (InternetQueryOption (0, INTERNET_OPTION_PROXY_PASSWORD, (void *)buffer, &buflen)) + PUSHs (newSVpv (buffer, 0)); + } + } +#endif +} + +void add_font (char *file) CODE: FcConfigAppFontAddFile (0, (const FcChar8 *)file); @@ -761,9 +788,13 @@ _exit (1); void -_exit (int retval) +_exit (int retval = 0) CODE: +#ifdef WIN32 + ExitThread (retval); // unclean, please beam me up +#else _exit (retval); +#endif MODULE = CFPlus PACKAGE = CFPlus::Font @@ -1139,13 +1170,13 @@ MODULE = CFPlus PACKAGE = CFPlus::Map CFPlus::Map -new (SV *class, int map_width, int map_height) +new (SV *class) CODE: New (0, RETVAL, 1, struct map); RETVAL->x = 0; RETVAL->y = 0; - RETVAL->w = map_width; - RETVAL->h = map_height; + RETVAL->w = 0; + RETVAL->h = 0; RETVAL->ox = 0; RETVAL->oy = 0; RETVAL->faces = 8192; @@ -1168,6 +1199,12 @@ } void +resize (CFPlus::Map self, int map_width, int map_height) + CODE: + self->w = map_width; + self->h = map_height; + +void clear (CFPlus::Map self) CODE: map_clear (self); @@ -1245,14 +1282,14 @@ CODE: { if (dx > 0) - map_blank (self, self->x, self->y, dx - 1, self->h); + map_blank (self, self->x, self->y, dx, self->h); else if (dx < 0) - map_blank (self, self->x + self->w + dx + 1, self->y, 1 - dx, self->h); + map_blank (self, self->x + self->w + dx + 1, self->y, -dx, self->h); if (dy > 0) - map_blank (self, self->x, self->y, self->w, dy - 1); + map_blank (self, self->x, self->y, self->w, dy); else if (dy < 0) - map_blank (self, self->x, self->y + self->h + dy + 1, self->w, 1 - dy); + map_blank (self, self->x, self->y + self->h + dy + 1, self->w, -dy); self->ox += dx; self->x += dx; self->oy += dy; self->y += dy; @@ -1275,7 +1312,7 @@ mapcell *cell; int x, y, flags; - while (data < data_end) + while (data < data_end - 1) { flags = (data [0] << 8) + data [1]; data += 2; @@ -1288,10 +1325,8 @@ { if (!cell->darkness) { + memset (cell, 0, sizeof (*cell)); cell->darkness = 256; - cell->face [0] = 0; - cell->face [1] = 0; - cell->face [2] = 0; } //TODO: don't trust server data to be in-range(!) @@ -1307,14 +1342,30 @@ ext = *data++; cmd = ext & 0x3f; - if (ext < 4) + if (cmd < 4) cell->darkness = 255 - ext * 64 + 1; - else if (ext == 5) // health - cell->stat_hp = *data++; + else if (cmd == 5) // health + { + cell->stat_width = 1; + cell->stat_hp = *data++; + } + else if (cmd == 6) // monster width + cell->stat_width = *data++ + 1; + else if (cmd == 0x47) // monster width + { + if (*data == 4) + ; // decode player tag + + data += *data + 1; + } + else if (cmd == 8) // cell flags + cell->flags = *data++; else if (ext & 0x40) // unknown, multibyte => skip data += *data + 1; + else + data++; } - while (cmd & 0x80); + while (ext & 0x80); } else cell->darkness = *data++ + 1; @@ -1336,10 +1387,7 @@ } } else - { - cell->darkness = 0; - cell->stat_hp = 0; - } + cell->darkness = 0; } } @@ -1404,27 +1452,13 @@ RETVAL void -draw (CFPlus::Map self, int shift_x, int shift_y, int x0, int y0, int sw, int sh) +draw (CFPlus::Map self, int mx, int my, int sw, int sh) CODE: { - int vx, vy; int x, y, z; int last_name; mapface face; - vx = self->x + self->w / 2 - sw / 2 - shift_x; - vy = self->y + self->h / 2 - sh / 2 - shift_y; - - /* - int vx = self->vx = self->w >= sw - ? self->x + (self->w - sw) / 2 - : MIN (self->x, MAX (self->x + self->w - sw + 1, self->vx)); - - int vy = self->vy = self->h >= sh - ? self->y + (self->h - sh) / 2 - : MIN (self->y, MAX (self->y + self->h - sh + 1, self->vy)); - */ - glColor4ub (255, 255, 255, 255); glEnable (GL_BLEND); @@ -1436,31 +1470,32 @@ last_name = 0; + mx += self->x; + my += self->y; + for (z = 0; z < 3; z++) for (y = 0; y < sh; y++) - if (0 <= y + vy && y + vy < self->rows) + if (0 <= y + my && y + my < self->rows) { - maprow *row = self->row + (y + vy); + maprow *row = self->row + (y + my); for (x = 0; x < sw; x++) - if (row->c0 <= x + vx && x + vx < row->c1) + if (row->c0 <= x + mx && x + mx < row->c1) { - mapcell *cell = row->col + (x + vx - row->c0); + mapcell *cell = row->col + (x + mx - row->c0); face = cell->face [z]; if (face && face < self->texs) { maptex tex = self->tex [face]; - int px = (x + 1) * 32 - tex.w; int py = (y + 1) * 32 - tex.h; if (last_name != tex.name) { glEnd (); - last_name = tex.name; - glBindTexture (GL_TEXTURE_2D, last_name); + glBindTexture (GL_TEXTURE_2D, last_name = tex.name); glBegin (GL_QUADS); } @@ -1469,6 +1504,25 @@ glTexCoord2f (tex.s, tex.t); glVertex2f (px + tex.w, py + tex.h); glTexCoord2f (tex.s, 0 ); glVertex2f (px + tex.w, py ); } + + if (cell->flags && z == 2) + { + if (cell->flags & 1) + { + maptex tex = self->tex [1]; + int px = (x + 1) * 32 - tex.w + 2; + int py = (y + 1) * 32 - tex.h - 6; + + glEnd (); + glBindTexture (GL_TEXTURE_2D, last_name = tex.name); + glBegin (GL_QUADS); + + glTexCoord2f (0 , 0 ); glVertex2f (px , py ); + glTexCoord2f (0 , tex.t); glVertex2f (px , py + tex.h); + glTexCoord2f (tex.s, tex.t); glVertex2f (px + tex.w, py + tex.h); + glTexCoord2f (tex.s, 0 ); glVertex2f (px + tex.w, py ); + } + } } } @@ -1479,27 +1533,31 @@ // top layer: overlays such as the health bar for (y = 0; y < sh; y++) - if (0 <= y + vy && y + vy < self->rows) + if (0 <= y + my && y + my < self->rows) { - maprow *row = self->row + (y + vy); + maprow *row = self->row + (y + my); for (x = 0; x < sw; x++) - if (row->c0 <= x + vx && x + vx < row->c1) + if (row->c0 <= x + mx && x + mx < row->c1) { - mapcell *cell = row->col + (x + vx - row->c0); + mapcell *cell = row->col + (x + mx - row->c0); int px = x * 32; int py = y * 32; if (cell->stat_hp) { - int width = sh / 28 + 1; + int width = cell->stat_width * 32; + int thick = sh / 28 + 1 + cell->stat_width; glColor3ub (0, 0, 0); - glRectf (px + 1, py, px + 31, py + width + 2); + glRectf (px + 1, py - thick - 2, + px + width - 1, py); glColor3ub (cell->stat_hp, 255 - cell->stat_hp, 0); - glRectf (px + 2, py + 1, px + 30 - cell->stat_hp * 28 / 255, py + width + 1); + glRectf (px + 2, + py - thick - 1, + px + width - 2 - cell->stat_hp * (width - 4) / 255, py - 1); } } } @@ -1566,10 +1624,9 @@ } void -fow_texture (CFPlus::Map self, int shift_x, int shift_y, int x0, int y0, int sw, int sh) +fow_texture (CFPlus::Map self, int mx, int my, int sw, int sh) PPCODE: { - int vx, vy; int x, y; int sw4 = (sw + 3) & ~3; SV *darkness_sv = sv_2mortal (newSV (sw4 * sh)); @@ -1579,18 +1636,18 @@ SvPOK_only (darkness_sv); SvCUR_set (darkness_sv, sw4 * sh); - vx = self->x + (self->w - sw + 1) / 2 - shift_x; - vy = self->y + (self->h - sh + 1) / 2 - shift_y; + mx += self->x; + my += self->y; for (y = 0; y < sh; y++) - if (0 <= y + vy && y + vy < self->rows) + if (0 <= y + my && y + my < self->rows) { - maprow *row = self->row + (y + vy); + maprow *row = self->row + (y + my); for (x = 0; x < sw; x++) - if (row->c0 <= x + vx && x + vx < row->c1) + if (row->c0 <= x + mx && x + mx < row->c1) { - mapcell *cell = row->col + (x + vx - row->c0); + mapcell *cell = row->col + (x + mx - row->c0); darkness[y * sw4 + x] = cell->darkness ? 255 - (cell->darkness - 1)