X-Git-Url: http://git.pond.sub.org/?p=empserver;a=blobdiff_plain;f=src%2Flib%2Fcommands%2Flook.c;h=d8e31061ba0fc97c0dfe69c8343a937420fec895;hp=57447ee284d34d0f606c7525d14e12289f3363d4;hb=9b7adfbe;hpb=5f263a7753dc728809ff85c993af975f6c76e61e diff --git a/src/lib/commands/look.c b/src/lib/commands/look.c index 57447ee28..d8e31061b 100644 --- a/src/lib/commands/look.c +++ b/src/lib/commands/look.c @@ -47,275 +47,267 @@ #include "commands.h" #include "optlist.h" -static void look_ship(register struct shpstr *lookship); +static void look_ship(register struct shpstr *lookship); int look(void) { - register int i; - struct nstr_item ni; - struct shpstr myship; - struct sctstr sect; - int x, y; - int civ; - int mil; - u_char *bitmap; - int changed = 0; + register int i; + struct nstr_item ni; + struct shpstr myship; + struct sctstr sect; + int x, y; + int civ; + int mil; + u_char *bitmap; + int changed = 0; - if (!snxtitem(&ni, EF_SHIP, player->argp[1])) - return RET_SYN; - if ((bitmap = (u_char *)malloc((WORLD_X * WORLD_Y) / 8)) == 0) { - logerror("malloc failed in look\n"); - pr("Memory error. Tell the deity.\n"); - return RET_FAIL; + if (!snxtitem(&ni, EF_SHIP, player->argp[1])) + return RET_SYN; + if ((bitmap = (u_char *)malloc((WORLD_X * WORLD_Y) / 8)) == 0) { + logerror("malloc failed in look\n"); + pr("Memory error. Tell the deity.\n"); + return RET_FAIL; + } + bzero((s_char *)bitmap, (WORLD_X * WORLD_Y) / 8); + while (nxtitem(&ni, (s_char *)&myship)) { + if (!player->owner) + continue; + look_ship(&myship); + for (i = 0; i <= 6; i++) { + x = diroff[i][0] + myship.shp_x; + y = diroff[i][1] + myship.shp_y; + if (emp_getbit(x, y, bitmap)) + continue; + emp_setbit(x, y, bitmap); + getsect(x, y, §); + if (sect.sct_type == SCT_WATER) + continue; + if (player->owner) + pr("Your "); + else + pr("%s (#%d) ", cname(sect.sct_own), sect.sct_own); + pr(dchr[sect.sct_type].d_name); + changed += map_set(player->cnum, x, y, + dchr[sect.sct_type].d_mnem, 0); + pr(" %d%% efficient ", player->owner ? sect.sct_effic : + roundintby((int)sect.sct_effic, 10)); + civ = getvar(V_CIVIL, (s_char *)§, EF_SECTOR); + mil = getvar(V_MILIT, (s_char *)§, EF_SECTOR); + if (civ) + pr("with %s%d civ ", player->owner ? "" : "approx ", + player->owner ? civ : roundintby(civ, 10)); + if (mil) + pr("with %s%d mil ", player->owner ? "" : "approx ", + player->owner ? mil : roundintby(mil, 10)); + pr("@ %s\n", xyas(x, y, player->cnum)); + if (opt_HIDDEN) { + setcont(player->cnum, sect.sct_own, FOUND_LOOK); + } } - bzero((s_char *)bitmap, (WORLD_X * WORLD_Y) / 8); - while (nxtitem(&ni, (s_char *)&myship)) { - if (!player->owner) - continue; - look_ship(&myship); - for (i = 0; i <= 6; i++) { - x = diroff[i][0] + myship.shp_x; - y = diroff[i][1] + myship.shp_y; - if (emp_getbit(x, y, bitmap)) - continue; - emp_setbit(x, y, bitmap); - getsect(x, y, §); - if (sect.sct_type == SCT_WATER) - continue; - if (player->owner) - pr("Your "); - else - pr("%s (#%d) ", cname(sect.sct_own), - sect.sct_own); - pr(dchr[sect.sct_type].d_name); - changed += map_set(player->cnum, x, y, - dchr[sect.sct_type].d_mnem, 0); - pr(" %d%% efficient ", player->owner ? sect.sct_effic : - roundintby((int)sect.sct_effic, 10)); - civ = getvar(V_CIVIL, (s_char *)§, EF_SECTOR); - mil = getvar(V_MILIT, (s_char *)§, EF_SECTOR); - if (civ) - pr("with %s%d civ ", player->owner ? "" : "approx ", - player->owner ? civ : roundintby(civ, 10)); - if (mil) - pr("with %s%d mil ", player->owner ? "" : "approx ", - player->owner ? mil : roundintby(mil, 10)); - pr("@ %s\n", xyas(x, y, player->cnum)); - if (opt_HIDDEN) { - setcont(player->cnum, sect.sct_own, FOUND_LOOK); - } - } - } - if (changed) - writemap(player->cnum); - free((s_char *)bitmap); - return RET_OK; + } + if (changed) + writemap(player->cnum); + free((s_char *)bitmap); + return RET_OK; } static void look_ship(register struct shpstr *lookship) { - register struct shpstr *sp; - register struct mchrstr *smcp; - register struct mchrstr *tmcp; - extern int ship_max_interdiction_range; - struct sctstr sect; - int range; - int vrange; - int i; - int dist; + register struct shpstr *sp; + register struct mchrstr *smcp; + register struct mchrstr *tmcp; + extern int ship_max_interdiction_range; + struct sctstr sect; + int range; + int vrange; + int i; + int dist; - range = (int) techfact(lookship->shp_tech, - (double) mchr[(int)lookship->shp_type].m_vrnge); - range = range * (lookship->shp_effic / 100.0); - smcp = &mchr[(int)lookship->shp_type]; + range = (int)techfact(lookship->shp_tech, + (double)mchr[(int)lookship->shp_type].m_vrnge); + range = range * (lookship->shp_effic / 100.0); + smcp = &mchr[(int)lookship->shp_type]; + if (smcp->m_flags & M_SUB) + range = min(range, 1); + for (i = 0; NULL != (sp = getshipp(i)); i++) { + if (sp->shp_own == player->cnum || sp->shp_own == 0) + continue; + dist = mapdist(sp->shp_x, sp->shp_y, + lookship->shp_x, lookship->shp_y); + if (dist > ship_max_interdiction_range) + continue; + tmcp = &mchr[(int)sp->shp_type]; if (smcp->m_flags & M_SUB) - range = min(range, 1); - for (i=0; NULL != (sp = getshipp(i)); i++) { - if (sp->shp_own == player->cnum || sp->shp_own == 0) - continue; - dist = mapdist(sp->shp_x, sp->shp_y, - lookship->shp_x, lookship->shp_y); - if (dist > ship_max_interdiction_range) - continue; - tmcp = &mchr[(int)sp->shp_type]; - if (smcp->m_flags & M_SUB) - vrange = (int)(sp->shp_visib * range/30.0); - else - vrange = (int)(sp->shp_visib * range/20.0); - getsect(sp->shp_x, sp->shp_y, §); - if (sect.sct_type != SCT_WATER) - vrange = max(1, vrange); - if (dist > vrange) - continue; - if (smcp->m_flags & M_SUB) { - if (tmcp->m_flags & M_SONAR && dist < 2) { - if(sp->shp_own != 0) - wu(0, sp->shp_own, - "%s detected surfacing noises in %s.\n", - prship(sp), - xyas(lookship->shp_x, lookship->shp_y, - sp->shp_own)); - } - if (dist == 0 && (tmcp->m_flags & M_SUB) == 0) - if(sp->shp_own != 0) - wu(0, sp->shp_own, - "Periscope spotted in %s by %s\n", - xyas(lookship->shp_x, lookship->shp_y, - sp->shp_own), - prship(sp)); - } - /* subs at sea only seen by sonar */ - if (tmcp->m_flags & M_SUB && sect.sct_type == SCT_WATER) - continue; - pr("%s (#%d) %s @ %s\n", - cname(sp->shp_own), sp->shp_own, prship(sp), - xyas(sp->shp_x, sp->shp_y, player->cnum)); + vrange = (int)(sp->shp_visib * range / 30.0); + else + vrange = (int)(sp->shp_visib * range / 20.0); + getsect(sp->shp_x, sp->shp_y, §); + if (sect.sct_type != SCT_WATER) + vrange = max(1, vrange); + if (dist > vrange) + continue; + if (smcp->m_flags & M_SUB) { + if (tmcp->m_flags & M_SONAR && dist < 2) { + if (sp->shp_own != 0) + wu(0, sp->shp_own, + "%s detected surfacing noises in %s.\n", + prship(sp), + xyas(lookship->shp_x, lookship->shp_y, + sp->shp_own)); + } + if (dist == 0 && (tmcp->m_flags & M_SUB) == 0) + if (sp->shp_own != 0) + wu(0, sp->shp_own, + "Periscope spotted in %s by %s\n", + xyas(lookship->shp_x, lookship->shp_y, + sp->shp_own), prship(sp)); } + /* subs at sea only seen by sonar */ + if (tmcp->m_flags & M_SUB && sect.sct_type == SCT_WATER) + continue; + pr("%s (#%d) %s @ %s\n", + cname(sp->shp_own), sp->shp_own, prship(sp), + xyas(sp->shp_x, sp->shp_y, player->cnum)); + } } -static void look_land(register struct lndstr *lookland); +static void look_land(register struct lndstr *lookland); int llook(void) { - register int i; - struct nstr_item ni; - struct lndstr myland; - struct sctstr sect; - int x, y; - int civ; - int mil; - u_char *bitmap; - int changed = 0; + register int i; + struct nstr_item ni; + struct lndstr myland; + struct sctstr sect; + int x, y; + int civ; + int mil; + u_char *bitmap; + int changed = 0; - if (!snxtitem(&ni, EF_LAND, player->argp[1])) - return RET_SYN; - if ((bitmap = (u_char *)malloc((WORLD_X * WORLD_Y) / 8)) == 0) { - logerror("malloc failed in llook\n"); - pr("Memory error. Tell the deity.\n"); - return RET_FAIL; - } - bzero((s_char *)bitmap, (WORLD_X * WORLD_Y) / 8); - while (nxtitem(&ni, (s_char *)&myland)) { - if (!player->owner) - continue; - if (myland.lnd_ship >= 0) - continue; - if (myland.lnd_land >= 0) - continue; - /* Spies don't need military to do a "llook". Other - units do */ - if ((lnd_getmil(&myland) <= 0) && - !(lchr[(int)myland.lnd_type].l_flags & L_SPY)) - continue; - look_land(&myland); - for (i = 0; i <= 6; i++) { - x = diroff[i][0] + myland.lnd_x; - y = diroff[i][1] + myland.lnd_y; - if (emp_getbit(x, y, bitmap)) - continue; - emp_setbit(x, y, bitmap); - getsect(x, y, §); - if (sect.sct_type == SCT_WATER) - continue; - if (player->owner) - pr("Your "); - else - pr("%s (#%d) ", cname(sect.sct_own), - sect.sct_own); - pr(dchr[sect.sct_type].d_name); - changed += map_set(player->cnum, x, y, - dchr[sect.sct_type].d_mnem, 0); - pr(" %d%% efficient ", player->owner ? sect.sct_effic : - roundintby((int)sect.sct_effic, 10)); - civ = getvar(V_CIVIL, (s_char *)§, EF_SECTOR); - mil = getvar(V_MILIT, (s_char *)§, EF_SECTOR); - if (civ) - pr("with %s%d civ ", player->owner ? "" : - "approx ", - player->owner ? civ : roundintby(civ, 10)); - if (mil) - pr("with %s%d mil ", player->owner ? "" : - "approx ", - player->owner ? mil : roundintby(mil, 10)); - pr("@ %s\n", xyas(x, y, player->cnum)); - if (opt_HIDDEN) { - setcont(player->cnum, sect.sct_own, FOUND_LOOK); - } - } + if (!snxtitem(&ni, EF_LAND, player->argp[1])) + return RET_SYN; + if ((bitmap = (u_char *)malloc((WORLD_X * WORLD_Y) / 8)) == 0) { + logerror("malloc failed in llook\n"); + pr("Memory error. Tell the deity.\n"); + return RET_FAIL; + } + bzero((s_char *)bitmap, (WORLD_X * WORLD_Y) / 8); + while (nxtitem(&ni, (s_char *)&myland)) { + if (!player->owner) + continue; + if (myland.lnd_ship >= 0) + continue; + if (myland.lnd_land >= 0) + continue; + /* Spies don't need military to do a "llook". Other + units do */ + if ((lnd_getmil(&myland) <= 0) && + !(lchr[(int)myland.lnd_type].l_flags & L_SPY)) + continue; + look_land(&myland); + for (i = 0; i <= 6; i++) { + x = diroff[i][0] + myland.lnd_x; + y = diroff[i][1] + myland.lnd_y; + if (emp_getbit(x, y, bitmap)) + continue; + emp_setbit(x, y, bitmap); + getsect(x, y, §); + if (sect.sct_type == SCT_WATER) + continue; + if (player->owner) + pr("Your "); + else + pr("%s (#%d) ", cname(sect.sct_own), sect.sct_own); + pr(dchr[sect.sct_type].d_name); + changed += map_set(player->cnum, x, y, + dchr[sect.sct_type].d_mnem, 0); + pr(" %d%% efficient ", player->owner ? sect.sct_effic : + roundintby((int)sect.sct_effic, 10)); + civ = getvar(V_CIVIL, (s_char *)§, EF_SECTOR); + mil = getvar(V_MILIT, (s_char *)§, EF_SECTOR); + if (civ) + pr("with %s%d civ ", player->owner ? "" : + "approx ", player->owner ? civ : roundintby(civ, 10)); + if (mil) + pr("with %s%d mil ", player->owner ? "" : + "approx ", player->owner ? mil : roundintby(mil, 10)); + pr("@ %s\n", xyas(x, y, player->cnum)); + if (opt_HIDDEN) { + setcont(player->cnum, sect.sct_own, FOUND_LOOK); + } } - if (changed) - writemap(player->cnum); - free((s_char *)bitmap); - return RET_OK; + } + if (changed) + writemap(player->cnum); + free((s_char *)bitmap); + return RET_OK; } static void look_land(register struct lndstr *lookland) { - register struct plnstr *pp; - register struct lndstr *lp; - double drange; - int range; - int vrange; - int i; - int dist; - double techfact(int, double); - double odds; - - drange = techfact(lookland->lnd_tech, - (double) lookland->lnd_spy); - drange = (drange * ((double)lookland->lnd_effic / 100.0)); - range = ldround(drange,1); + register struct plnstr *pp; + register struct lndstr *lp; + double drange; + int range; + int vrange; + int i; + int dist; + double techfact(int, double); + double odds; - if (range == 0) - return; + drange = techfact(lookland->lnd_tech, (double)lookland->lnd_spy); + drange = (drange * ((double)lookland->lnd_effic / 100.0)); + range = ldround(drange, 1); - for (i=0; NULL != (lp = getlandp(i)); i++) { - if (lp->lnd_own == player->cnum || lp->lnd_own == 0) - continue; - if (lp->lnd_ship >= 0) - continue; - /* Don't always see spies */ - if (lchr[(int)lp->lnd_type].l_flags & L_SPY) { - /* If it's on a ship or unit, assume it's hidden - enough not to be seen */ - if (lp->lnd_ship >= 0 || lp->lnd_land >= 0) - continue; - odds = (double)(100 - lp->lnd_effic) + 0.10; - if (!(chance(odds))) - continue; - } - vrange = ldround((double)((lp->lnd_vis - * range)/20.0),1); - dist = mapdist(lp->lnd_x, lp->lnd_y, - lookland->lnd_x, lookland->lnd_y); - if (dist > vrange) - continue; + if (range == 0) + return; - pr("%s (#%d) %s (approx %d mil) @ %s\n", - cname(lp->lnd_own), lp->lnd_own, - prland(lp), ldround((double)total_mil(lp), 20), - xyas(lp->lnd_x, lp->lnd_y, player->cnum)); + for (i = 0; NULL != (lp = getlandp(i)); i++) { + if (lp->lnd_own == player->cnum || lp->lnd_own == 0) + continue; + if (lp->lnd_ship >= 0) + continue; + /* Don't always see spies */ + if (lchr[(int)lp->lnd_type].l_flags & L_SPY) { + /* If it's on a ship or unit, assume it's hidden + enough not to be seen */ + if (lp->lnd_ship >= 0 || lp->lnd_land >= 0) + continue; + odds = (double)(100 - lp->lnd_effic) + 0.10; + if (!(chance(odds))) + continue; } - for (i=0; NULL != (pp = getplanep(i)); i++) { - if (pp->pln_own == player->cnum || pp->pln_own == 0) - continue; - if (pp->pln_ship >= 0) - continue; - if (pp->pln_flags & PLN_LAUNCHED) - continue; - vrange = ldround((double)((10* range)/20.0),1); - dist = mapdist(pp->pln_x, pp->pln_y, - lookland->lnd_x, lookland->lnd_y); - if (dist > vrange) - continue; + vrange = ldround((double)((lp->lnd_vis * range) / 20.0), 1); + dist = mapdist(lp->lnd_x, lp->lnd_y, + lookland->lnd_x, lookland->lnd_y); + if (dist > vrange) + continue; - pr("%s (#%d) %s @ %s\n", - cname(pp->pln_own), pp->pln_own, - prplane(pp), - xyas(pp->pln_x, pp->pln_y, player->cnum)); - } + pr("%s (#%d) %s (approx %d mil) @ %s\n", + cname(lp->lnd_own), lp->lnd_own, + prland(lp), ldround((double)total_mil(lp), 20), + xyas(lp->lnd_x, lp->lnd_y, player->cnum)); + } + for (i = 0; NULL != (pp = getplanep(i)); i++) { + if (pp->pln_own == player->cnum || pp->pln_own == 0) + continue; + if (pp->pln_ship >= 0) + continue; + if (pp->pln_flags & PLN_LAUNCHED) + continue; + vrange = ldround((double)((10 * range) / 20.0), 1); + dist = mapdist(pp->pln_x, pp->pln_y, + lookland->lnd_x, lookland->lnd_y); + if (dist > vrange) + continue; + + pr("%s (#%d) %s @ %s\n", + cname(pp->pln_own), pp->pln_own, + prplane(pp), xyas(pp->pln_x, pp->pln_y, player->cnum)); + } }