--- emp4/include/prototypes.h Mon Aug 7 20:59:08 2000 +++ emp4/include/prototypes.h Wed Jul 31 19:40:15 2002 @@ -383,6 +383,7 @@ extern int bmaps_intersect(natid , natid ); extern int share_bmap(natid , natid , struct nstr_sect * , s_char , s_char * ); +extern int dump_map(int , s_char , int , struct nstr_sect * , int ); /* move.c */ extern double sector_mcost(struct sctstr * , int ); /* nstr_subs.c */ --- emp4/src/lib/commands/map.c Sat Mar 11 05:36:42 2000 +++ emp4/src/lib/commands/map.c Wed Jul 31 20:07:34 2002 @@ -112,6 +112,8 @@ case 'L': map_flags |= MAP_LAND; break; case 'p': case 'P': map_flags |= MAP_PLANE; break; + case 'H': + case 'h': map_flags |= MAP_HIGH; break; case '*': map_flags |= MAP_ALL; break; case '0': case '1': @@ -142,4 +144,85 @@ } return draw_map(bmap, origin, map_flags, &ns, as_country); +} + +int +mdump(void) +{ + register s_char *b; + int unit_type = 0; + int bmap = 0; + struct natstr *np; + s_char *str; + struct nstr_sect ns; + s_char origin = '\0'; + int as_country; + int map_flags = 0; + int i; + int where = 2; + s_char what[64]; + s_char buf[1024]; + + if (**player->argp != 'm') { + if (**player->argp == 'b') + bmap = EF_BMAP; + else if (**player->argp == 'n') + bmap = EF_NMAP; + else { + if (player->argp[0][1] == 'b') + bmap = EF_BMAP; + } + } + + if (player->argp[1] == (s_char *) 0) { + if ((str = getstring("(sects)? ", buf)) == 0) + return RET_SYN; + } else { + str = player->argp[1]; + } + + np = getnatp(player->cnum); + if (*str == '*') { + sprintf(what, "%d:%d,%d:%d", + -WORLD_X/2, WORLD_X/2-1, + -WORLD_Y/2, WORLD_Y/2-1); + if (!snxtsct(&ns, what)) + return RET_FAIL; + } else if (!snxtsct(&ns, str)) { + i=atoi(str); + if (unit_map(unit_type, i, &ns, &origin)) + return RET_FAIL; + } + b = player->argp[2]; + while (b != (s_char *)0 && (*b)){ + where = 3; + switch(*b){ + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': where = 2; break; + case 't': bmap = EF_MAP; *(b+1)=0;break; + default: pr("Bad flag %c!\n",*b); + break; + } + b++; + } + + as_country = player->cnum; + if (player->god){ + if (player->argp[where] != (s_char *) 0) { + as_country=atoi(player->argp[where]); + if ((as_country < 0) || (as_country > MAXNOC)){ + as_country = player->cnum; + } + } + } + + return dump_map(bmap, origin, map_flags, &ns, as_country); } --- emp4/src/lib/player/empmod.c Thu Aug 9 01:01:45 2001 +++ emp4/src/lib/player/empmod.c Wed Jul 31 21:10:23 2002 @@ -70,6 +70,7 @@ extern int load(); extern int look(); extern int map(); +extern int mdump(); extern int mine(); extern int move(); extern int nati(); @@ -244,6 +245,7 @@ { "bestpath ", 0, best, 0, NORM }, { "bestdistpath ", 0, best, 0, NORM }, { "bmap [s|l|p|r|t*]", 0, map, C_MOD, NORM }, +{ "bmdump [t]", 0, mdump, C_MOD, NORM }, { "board [|]", 3, boar, C_MOD, NORM+MONEY+CAP }, { "bomb ",2,bomb,C_MOD, NORM+MONEY+CAP }, { "break {sanctuary}", 1, brea, C_MOD, SANCT }, @@ -323,6 +325,7 @@ { "market [COMM]", 0, mark, 0, VIS }, { "map ", 0, map, C_MOD, VIS }, { "march ", 1, march, C_MOD, NORM+CAP }, +{ "mdump ", 0, mdump, C_MOD, NORM }, { "mine ", 2, mine, C_MOD, NORM+MONEY+CAP }, { "mission []", 2,mission,C_MOD, NORM+CAP }, { "mobupdate ", 0, mobupdate, C_MOD, GOD }, @@ -339,6 +342,7 @@ { "neweff ", 0, newe, C_MOD, NORM }, { "newspaper [days]", 0, news, 0, VIS }, { "nmap ", 0, map, C_MOD, VIS }, +{ "nmdump ", 0, mdump, C_MOD, NORM }, { "nuke ", 0, nuke, 0, NORM }, { "offer [ ]",1,offe,C_MOD, NORM+MONEY+CAP }, { "offset ", 0, offs, C_MOD, GOD }, --- emp4/src/lib/common/maps.c Fri Oct 6 20:19:51 2000 +++ emp4/src/lib/common/maps.c Wed Jul 31 21:09:45 2002 @@ -252,6 +252,25 @@ wmap[y][x] = (*lchr[(int)land.lnd_type].l_name) & ~0x20; } } + if (map_flags & MAP_HIGH){ + register s_char *ptr; + struct sctstr sect; + + snxtsct_rewind(nsp); + if ((!player->god || country)) { + bzero((s_char *)bitmap, (WORLD_X * WORLD_Y) / 8); + bitinit2(nsp, bitmap, country); + } + while (nxtsct(nsp, §) && !player->aborted) { + if ((!player->god || country) && !emp_getbit(nsp->x, nsp->y, bitmap)) { + if (!player->god) + continue; + } + ptr = &wmap[nsp->dy][nsp->dx]; + if (sect.sct_own == player->cnum) + *ptr |= 0x80; + } + } if (origin) wmap[5][10] = origin & ~0x20; for (y=nsp->range.ly, i=0; i < nsp->range.height; y++, i++) { @@ -418,3 +437,183 @@ return n; } +int +dump_map(int bmap, s_char origin, int map_flags, struct nstr_sect *nsp, int country) +{ + struct natstr *np; + struct range range; + struct nstr_item ni; + struct shpstr ship; + struct lndstr land; + struct plnstr plane; + coord x,y; + int i, count; + time_t now; + /* Note this is not re-entrant anyway, so we keep the buffers + around */ + static u_char *bitmap = (u_char *)0; + static s_char *wmapbuf = (s_char *)0; + static s_char **wmap = (s_char **)0; + + if (!wmapbuf) + wmapbuf = (s_char *)malloc((WORLD_Y * MAPWIDTH(1)) * sizeof(s_char)); + if (!wmap) { + wmap = (s_char **)malloc(WORLD_Y * sizeof(s_char *)); + if (wmap && wmapbuf) { + for (i = 0; i < WORLD_Y; i++) + wmap[i] = &wmapbuf[MAPWIDTH(1) * i]; + } else if (wmap) { + free((s_char *)wmap); + wmap = (s_char **)0; + } + } + if (!bitmap) + bitmap = (u_char *)malloc((WORLD_X * WORLD_Y) / 8); + if (!wmapbuf || !wmap || !bitmap) { + pr("Memory error, tell the deity.\n"); + logerror("malloc failed in draw_map\n"); + return RET_FAIL; + } + + if (bmap == EF_MAP + EF_BMAP) { + if (!confirm("Are you sure you want to revert your bmap? ")) + return RET_OK; + } + if (!player->command->c_flags & C_MOD) { + logerror("%s command needs C_MOD flag set",player->command->c_form); + player->command->c_flags |= C_MOD; + } + np = getnatp(country); + /* zap any conditionals */ + nsp->ncond = 0; + xyrelrange(np, &nsp->range, &range); + blankfill((s_char *)wmapbuf, &nsp->range, 1); + if (bmap) { + register int c; + switch (bmap) { + case EF_BMAP: + while (bmnxtsct(nsp) && !player->aborted) { + if (0 != (c = player->bmap[sctoff(nsp->x, nsp->y)])) + wmap[nsp->dy][nsp->dx] = c; + } + break; + case EF_MAP: + while (bmnxtsct(nsp) && !player->aborted) { + if (0 != (c = player->map[sctoff(nsp->x, nsp->y)])) + wmap[nsp->dy][nsp->dx] = c; + } + break; + case EF_NMAP: + do { + register s_char *ptr; + struct sctstr sect; + + if ((!player->god || country)) { + bzero((s_char *)bitmap, (WORLD_X * WORLD_Y) / 8); + bitinit2(nsp, bitmap, country); + } + while (nxtsct(nsp, §) && !player->aborted) { + if ((!player->god || country) && + !emp_getbit(nsp->x, nsp->y, bitmap)) { + if (!player->god) + continue; + } + ptr = &wmap[nsp->dy][nsp->dx]; + if (sect.sct_newtype > SCT_MAXDEF) { + *ptr = '?'; + } else { + *ptr = dchr[sect.sct_newtype].d_mnem; + switch (sect.sct_newtype) { + case SCT_WATER: + case SCT_RURAL: + case SCT_MOUNT: + case SCT_WASTE: + case SCT_PLAINS: + break; + default: + if (sect.sct_own != country && + (!player->god || country)) { + if (!player->god) + *ptr = '?'; + } + break; + } + } + } + } while (0); + break; + } + } else { + register s_char *ptr; + struct sctstr sect; + int changed = 0; + + if ((!player->god || country)) { + bzero((s_char *)bitmap, (WORLD_X * WORLD_Y) / 8); + bitinit2(nsp, bitmap, country); + } + while (nxtsct(nsp, §) && !player->aborted) { + if ((!player->god || country) && !emp_getbit(nsp->x, nsp->y, bitmap)) { + if (!player->god) + continue; + } + ptr = &wmap[nsp->dy][nsp->dx]; + if (sect.sct_type > SCT_MAXDEF) { + *ptr = '?'; + } else { + *ptr = dchr[sect.sct_type].d_mnem; + switch (sect.sct_type) { + case SCT_WATER: + case SCT_RURAL: + case SCT_MOUNT: + case SCT_WASTE: + case SCT_PLAINS: + break; + default: + if (sect.sct_own != country && + (!player->god || country)) { + if(!player->god) + *ptr = '?'; + } + break; + } + changed += map_set(player->cnum, nsp->x, nsp->y, *ptr, 0); + } + } + if (changed) + writemap(player->cnum); + } + if (player->aborted) + return RET_OK; + if (origin) + wmap[5][10] = origin & ~0x20; + + prdate(); + time(&now); + pr("DUMP MSECTOR %d\n", now); + pr("x y des\n"); + count = 0; + for (y=nsp->range.ly, i=0; i < nsp->range.height; y++, i++) { + int xval, yval, j; + + if (y >= WORLD_Y) + y -= WORLD_Y; + yval = yrel(np, y); + for (j=0; j < nsp->range.width; j++) + { + if (wmap[i][j] != ' ') + { + xval = xrel(np, nsp->range.lx + 2 * (j / 2)); + xval += ((xval + yval) & 0x1); + if (xval >= WORLD_X) + x -= WORLD_X; + + pr("%d %d %c\n", xval, yval, wmap[i][j]); + count++; + } + } + wmap[i][nsp->range.width] = '\0'; + } + pr("%d sector%s\n", count, ((1 == count) ? "" : "s")); + return RET_OK; +} +++ emp4/include/map.h Sat Mar 11 05:14:55 2000 --- emp4/include/map.h Sat May 25 17:35:38 2002 @@ -52,6 +52,7 @@ #define MAP_SHIP bit(0) #define MAP_LAND bit(1) #define MAP_PLANE bit(2) +#define MAP_HIGH bit(3) #define MAP_ALL MAP_SHIP | MAP_LAND | MAP_PLANE struct mapstr {