diff --git a/src/lib/commands/xdump.c b/src/lib/commands/xdump.c index 87851680..d5f53198 100644 --- a/src/lib/commands/xdump.c +++ b/src/lib/commands/xdump.c @@ -28,7 +28,7 @@ * xdump.c: Experimental extended dump * * Known contributors to this file: - * Markus Armbruster, 2004 + * Markus Armbruster, 2004-2006 */ #include @@ -181,6 +181,68 @@ xdftr(int n) pr("/%d\n", n); } +/* + * Is object P of type TYPE visible to the player? + * TODO: Fold this into interators. + */ +static int +xdvisible(int type, void *p) +{ + struct genitem *gp = p; + struct trtstr *tp = p; + struct lonstr *lp = p; + struct natstr *natp; + int tlev; + + switch (type) { + case EF_SECTOR: + return gp->own == player->cnum || player->god; + case EF_SHIP: + case EF_PLANE: + case EF_LAND: + case EF_NUKE: + case EF_LOST: + return gp->own != 0 && (gp->own == player->cnum || player->god); + case EF_NATION: + return ((struct natstr *)p)->nat_stat != 0 + && (gp->own == player->cnum || player->god); + case EF_NEWS: + return ((struct nwsstr *)p)->nws_vrb != 0 && !opt_HIDDEN; /* FIXME */ + case EF_TREATY: + return tp->trt_status != TS_FREE + && (tp->trt_cna == player->cnum || tp->trt_cnb == player->cnum); + case EF_LOAN: + if (lp->l_status == LS_FREE) + return 0; + if (lp->l_status == LS_SIGNED) + return 1; + return lp->l_loner == player->cnum || lp->l_lonee == player->cnum; + case EF_TRADE: + case EF_COMM: + return gp->own != 0; + case EF_SHIP_CHR: + tlev = ((struct mchrstr *)p)->m_tech; + goto tech; + case EF_PLANE_CHR: + tlev = ((struct plchrstr *)p)->pl_tech; + goto tech; + case EF_LAND_CHR: + tlev = ((struct lchrstr *)p)->l_tech; + goto tech; + case EF_NUKE_CHR: + tlev = ((struct nchrstr *)p)->n_tech; + tech: + natp = getnatp(player->cnum); + return tlev <= (int)(1.25 * natp->nat_level[NAT_TLEV]); + case EF_NEWS_CHR: + return ((struct rptstr *)p)->r_newspage != 0; + case EF_TABLE: + return ((struct empfile *)p)->cadef != NULL; + default: + return 1; + } +} + /* * Dump items of type TYPE selected by ARG. * Return RET_OK on success, RET_SYN on error. @@ -205,7 +267,7 @@ xditem(int type, char *arg) n = 0; while (nxtitem(&ni, buf)) { - if (check_owner && ((struct genitem *)buf)->own != player->cnum) + if (!xdvisible(type, buf)) continue; ++n; xdflds(ca, buf);