Update of /cvsroot/netrek/client/netrekxp/src In directory sc8-pr-cvs7.sourceforge.net:/tmp/cvs-serv32534/src Modified Files: local.c map.c option.c Log Message: Adds weaponsOnMap functionality. Mirrors how xsg handles weapons, though also adds support for plasmas and torp/plasma explosions. Sets up clearzones similiar to how local() does it. Also adds several checkRedraw() checks so planets don't get overwritten. Index: map.c =================================================================== RCS file: /cvsroot/netrek/client/netrekxp/src/map.c,v retrieving revision 1.29 retrieving revision 1.30 diff -u -d -r1.29 -r1.30 --- map.c 17 Mar 2007 17:12:09 -0000 1.29 +++ map.c 17 Mar 2007 22:40:06 -0000 1.30 @@ -55,6 +55,12 @@ static signed char roughMap4[DETAIL][DETAIL]; static int initialized = 0; static int maplockline[4]; /* Coordinates for lock line on map */ +static int mclearlcount; /* For phasers */ +static int mclearline[4][MAXPLAYER + 2 * MAXPLAYER]; +static int mclearpcount; /* For torps */ +static int mclearpoint[2][(MAXTORP + 1) * MAXPLAYER]; +static int mclearacount; /* For torp explosions, plasmas, and plasma explosions */ +static int mcleararea[4][(MAXTORP + 1) * MAXPLAYER + (MAXPLASMA + 1) * MAXPLAYER]; /* * Global Variables: @@ -755,7 +761,7 @@ /******************************************************************************/ /*** map() /******************************************************************************/ -void +inline void map (void) /* * Update the 'galactic' map. @@ -786,6 +792,7 @@ if (doubleBuffering) W_Win2Mem (mapSDB); #endif + clearMap (); dx = (me->p_x) / (GWIDTH / WINSIDE); dy = (me->p_y) / (GWIDTH / WINSIDE); @@ -1020,6 +1027,132 @@ #endif } + /* Draw weapons */ + if (weaponsOnMap) + { + register int h; + register struct phaser *ph; + register struct torp *k; + register struct plasmatorp *pt; + int tx, ty; + + for (i = 0, j = &players[i]; i < MAXPLAYER; i++, j++) + { + if (j->p_status == PFREE) + continue; + + dx = j->p_x * WINSIDE / GWIDTH; + dy = j->p_y * WINSIDE / GWIDTH; + + /* phasers */ + ph = &phasers[j->p_no]; + if (ph->ph_status != PHFREE && + (j->p_status == PALIVE || j->p_status == PEXPLODE || j->p_status == PDEAD)) + { + switch(ph->ph_status) + { + case PHMISS: + /* Here I will have to compute end coordinate */ + tx = (int) (j->p_x + PHASEDIST * j->p_ship.s_phaserdamage / 100 + * Cos[ph->ph_dir]) * WINSIDE / GWIDTH; + ty = (int) (j->p_y + PHASEDIST * j->p_ship.s_phaserdamage / 100 + * Sin[ph->ph_dir]) * WINSIDE / GWIDTH; + break; + case PHHIT2: + tx = ph->ph_x * WINSIDE / GWIDTH; + ty = ph->ph_y * WINSIDE / GWIDTH; + break; + default: + tx = players[ph->ph_target].p_x * WINSIDE / GWIDTH; + ty = players[ph->ph_target].p_y * WINSIDE / GWIDTH; + break; + } + W_MakeLine(mapw, dx, dy, tx, ty, phaserColor(ph)); + mclearline[0][mclearlcount] = dx; + mclearline[1][mclearlcount] = dy; + mclearline[2][mclearlcount] = tx; + mclearline[3][mclearlcount] = ty; + mclearlcount++; + /* Check for overwriting planets, corrected from view scale*/ + checkRedraw(j->p_x, j->p_y); + checkRedraw(tx * (GWIDTH / WINSIDE), ty * (GWIDTH / WINSIDE)); + } + + if (!j->p_ntorp && !j->p_nplasmatorp) + continue; + + /* torps */ + for (h = 0, k = &torps[MAXTORP * i + h]; h < MAXTORP; h++, k++) + { + if (!k->t_status) + continue; + if (k->t_x < 0 || k->t_y < 0) + continue; + dx = k->t_x * WINSIDE / GWIDTH; + dy = k->t_y * WINSIDE / GWIDTH; + + if (k->t_status == TEXPLODE) + { + /* Use frame 0 (smallest) to limit size of torp explosions + on the galactic */ + W_WriteBitmap (dx - (BMP_TORPDET_WIDTH / 2), dy - (BMP_TORPDET_HEIGHT / 2), + cloud[0], torpColor (k), mapw); + mcleararea[0][mclearacount] = dx - (BMP_TORPDET_WIDTH / 2); + mcleararea[1][mclearacount] = dy - (BMP_TORPDET_HEIGHT / 2); + mcleararea[2][mclearacount] = BMP_TORPDET_WIDTH; + mcleararea[3][mclearacount] = BMP_TORPDET_HEIGHT; + mclearacount++; + } + else + { + W_MakePoint(mapw, dx, dy, torpColor (k)); + mclearpoint[0][mclearpcount] = dx; + mclearpoint[1][mclearpcount] = dy; + mclearpcount++; + } + /* Check for overwriting planets */ + checkRedraw(k->t_x, k->t_y); + } + + /* plasmas */ + for (h = 0, pt = &plasmatorps[MAXPLASMA * i + h]; h < MAXPLASMA; h++, pt++) + { + if (!pt->pt_status) + continue; + if (pt->pt_x < 0 || pt->pt_y < 0) + continue; + dx = pt->pt_x * WINSIDE / GWIDTH; + dy = pt->pt_y * WINSIDE / GWIDTH; + + if (pt->pt_status == TEXPLODE) + { + /* Use frame 0 (smallest) of the TORP animations to limit size of plasma + explosions galactic. Plasma explosion bitmaps are just too big */ + W_WriteBitmap (dx - (BMP_TORPDET_WIDTH / 2), dy - (BMP_TORPDET_HEIGHT / 2), + cloud[0], plasmatorpColor (pt), mapw); + mcleararea[0][mclearacount] = dx - (BMP_TORPDET_WIDTH / 2); + mcleararea[1][mclearacount] = dy - (BMP_TORPDET_HEIGHT / 2); + mcleararea[2][mclearacount] = BMP_TORPDET_WIDTH; + mcleararea[3][mclearacount] = BMP_TORPDET_HEIGHT; + mclearacount++; + } + else + { + /* Draw plasmas as a 2x2 pixel torp */ + W_MakeLine(mapw, dx, dy, dx + 1, dy, plasmatorpColor (pt)); + W_MakeLine(mapw, dx, dy + 1, dx + 1, dy + 1, plasmatorpColor (pt)); + mcleararea[0][mclearacount] = dx; + mcleararea[1][mclearacount] = dy; + mcleararea[2][mclearacount] = 2; + mcleararea[3][mclearacount] = 2; + mclearacount++; + } + /* Check for overwriting planets */ + checkRedraw(pt->pt_x, pt->pt_y); + } + } + } + /* Draw the lock symbol (if needed) */ if ((me->p_flags & PFPLOCK) && (showLock & 1)) @@ -1103,4 +1236,27 @@ if (doubleBuffering) W_Mem2Win (mapSDB); #endif -} \ No newline at end of file +} + + +inline void +clearMap (void) +/* + Clear the weapons fire on the galactic map (intelligently rather than + just simply wiping the map). Similar to clearLocal(). +*/ +{ + int i; + + W_ClearAreas (mapw, mcleararea[0], mcleararea[1], mcleararea[2], + mcleararea[3], mclearacount); + mclearacount = 0; + + for (i = 0; i < mclearpcount; i++) + W_MakePoint (mapw, mclearpoint[0][i], mclearpoint[1][i], backColor); + mclearpcount = 0; + + W_MakeLines (mapw, mclearline[0], mclearline[1], mclearline[2], + mclearline[3], mclearlcount, backColor); + mclearlcount = 0; +} Index: option.c =================================================================== RCS file: /cvsroot/netrek/client/netrekxp/src/option.c,v retrieving revision 1.36 retrieving revision 1.37 diff -u -d -r1.36 -r1.37 --- option.c 17 Mar 2007 08:03:08 -0000 1.36 +++ option.c 17 Mar 2007 22:40:06 -0000 1.37 @@ -273,6 +273,7 @@ {0, "Weapons Menu", &MenuPage, 0, 0, 0, NULL, &Menus_Range}, {1, "Page %d (click to change)", &MenuPage, 0, 0, 0, NULL, &Menus_Range}, {1, "use color weapon bitmaps", &colorWeapons, 0, 0, 0, NULL, NULL}, + {1, "show weapons on galactic", &weaponsOnMap, 0, 0, 0, NULL, NULL}, #ifdef JUBILEE_PHASERS {1, "use colorful phasers", &colorfulPhasers, 0, 0, 0, NULL, NULL}, #endif @@ -295,7 +296,6 @@ {1, "rotate new planets", &rotatePlanets, 0, 0, 0, NULL, NULL}, {1, "show planet names on local", &showPlanetNames, 0, 0, 0, NULL, NULL}, {1, "show army count on orbit", &showArmy, 0, 0, 0, NULL, NULL}, - {1, "show weapons on galactic", &weaponsOnMap, 0, 0, 0, NULL, NULL}, {1, "show owner on galactic", &showPlanetOwner, 0, 0, 0, NULL, NULL}, {1, "show IND planets", &showIND, 0, 0, 0, NULL, NULL}, {1, "show AGRI in caps on map", &agriCAPS, 0, 0, 0, NULL, NULL}, Index: local.c =================================================================== RCS file: /cvsroot/netrek/client/netrekxp/src/local.c,v retrieving revision 1.75 retrieving revision 1.76 diff -u -d -r1.75 -r1.76 --- local.c 17 Mar 2007 04:46:23 -0000 1.75 +++ local.c 17 Mar 2007 22:40:06 -0000 1.76 @@ -1949,9 +1949,9 @@ } else { - if (colorWeapons) - { - k->t_fuse++; + if (colorWeapons) + { + k->t_fuse++; frame = k->t_fuse * 10 / server_ups; @@ -1996,7 +1996,6 @@ dy - (BMP_CTORP_HEIGHT / 2), mtorpC[torpTeam][frame], torpColor (k), w); } - clearzone[0][clearcount] = dx - (BMP_CTORP_WIDTH / 2); clearzone[1][clearcount] = dy - (BMP_CTORP_HEIGHT / 2); clearzone[2][clearcount] = BMP_CTORP_WIDTH;