From e41762ca49d270e48b77316eb8419f7e6c4103a4 Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Sun, 20 Jun 2010 16:19:22 +0200 Subject: [PATCH] Compute radar range in one place, rad_range() Before, a part was duplicated in radmap() and rad_map_set(), and another part in their callers. --- include/prototypes.h | 4 ++-- src/lib/commands/navi.c | 3 +-- src/lib/commands/rada.c | 16 ++++++++-------- src/lib/subs/radmap.c | 35 +++++++++++++++++++++++------------ src/lib/subs/shpsub.c | 6 ++---- 5 files changed, 36 insertions(+), 28 deletions(-) diff --git a/include/prototypes.h b/include/prototypes.h index d93c5c945..6c38ab285 100644 --- a/include/prototypes.h +++ b/include/prototypes.h @@ -583,8 +583,8 @@ extern int ufindpfx(char *, int); /* radmap.c */ extern int deltx(struct range *, coord); extern int delty(struct range *, coord); -extern void radmap(int, int, int, int, double); -extern void rad_map_set(natid, int, int, int, int); +extern void radmap(int, int, int, double, int, double); +extern void rad_map_set(natid, int, int, int, double, int); /* rej.c */ extern int setrel(natid, natid, int); extern int setcont(natid, natid, int); diff --git a/src/lib/commands/navi.c b/src/lib/commands/navi.c index 80588449f..588ebb048 100644 --- a/src/lib/commands/navi.c +++ b/src/lib/commands/navi.c @@ -158,8 +158,7 @@ do_unit_move(struct emp_qelem *ulist, int *together, } if (type == EF_SHIP) { rad_map_set(player->cnum, leader->x, leader->y, leader->effic, - (int)techfact(leader->tech, - mchr[leader->type].m_vrnge)); + leader->tech, mchr[leader->type].m_vrnge); } if (cp == NULL || *cp == '\0') cp = &dirch[DIR_STOP]; diff --git a/src/lib/commands/rada.c b/src/lib/commands/rada.c index 56b2fedd4..602d40427 100644 --- a/src/lib/commands/rada.c +++ b/src/lib/commands/rada.c @@ -54,7 +54,8 @@ radar(int type) { char *cp; double tf; - double tech; + double tlev; + int spy; struct nstr_item ni; struct nstr_sect ns; union empobj_storage item; @@ -73,14 +74,14 @@ radar(int type) case NS_AREA: if (!snxtsct(&ns, cp)) return RET_SYN; - tech = tfact(player->cnum, 8.0); + tlev = getnatp(player->cnum)->nat_level[NAT_TLEV]; while (nxtsct(&ns, &item.sect)) { if (item.sect.sct_type != SCT_RADAR) continue; if (!player->owner) continue; radmap(item.sect.sct_x, item.sect.sct_y, item.sect.sct_effic, - (int)(tech * 2.0), 0.0); + tlev, 16, 0.0); } break; case NS_LIST: @@ -97,8 +98,7 @@ radar(int type) if (type == EF_SHIP) { if (mchr[(int)item.ship.shp_type].m_flags & M_SONAR) tf = techfact(item.ship.shp_tech, 1.0); - tech = techfact(item.ship.shp_tech, - mchr[(int)item.ship.shp_type].m_vrnge); + spy = mchr[item.ship.shp_type].m_vrnge; } else { if (!(lchr[(int)item.land.lnd_type].l_flags & L_RADAR)) { pr("%s can't use radar!\n", prland(&item.land)); @@ -108,12 +108,12 @@ radar(int type) pr("Units on ships can't use radar!\n"); continue; } - tech = techfact(item.land.lnd_tech, - lchr[item.land.lnd_type].l_spy); + spy = lchr[item.land.lnd_type].l_spy; } pr("%s at ", obj_nameof(&item.gen)); - radmap(item.gen.x, item.gen.y, item.gen.effic, (int)tech, tf); + radmap(item.gen.x, item.gen.y, item.gen.effic, + item.gen.tech, spy, tf); } break; default: diff --git a/src/lib/subs/radmap.c b/src/lib/subs/radmap.c index 512a08fa9..8de75c01d 100644 --- a/src/lib/subs/radmap.c +++ b/src/lib/subs/radmap.c @@ -47,6 +47,8 @@ #include "ship.h" #include "xy.h" +static int rad_range(int, double, int); + /* More dynamic world sized buffers. We create 'em once, and then * never again. No need to keep creating/tearing apart. We may * want to do this in other places too where it doesn't matter. */ @@ -57,12 +59,11 @@ static signed char *visbuf; /* * Draw a radar map for radar at CX,CY. - * EFF is the radar's efficiency, and RANGE its range at 100% - * efficiency. + * EFF is the radar's efficiency, TLEV its tech level, SPY its power. * Submarines are detected at fraction SEESUB of the range. */ void -radmap(int cx, int cy, int eff, int range, double seesub) +radmap(int cx, int cy, int eff, double tlev, int spy, double seesub) { int visib, rng; struct sctstr sect; @@ -73,6 +74,7 @@ radmap(int cx, int cy, int eff, int range, double seesub) int x, y; int row; int n; + int range = rad_range(eff, tlev, spy); int changed = 0; if (!radbuf) @@ -99,9 +101,6 @@ radmap(int cx, int cy, int eff, int range, double seesub) } memset(visbuf, 0, (WORLD_Y * (WORLD_X + 1))); - range = (int)(range * (eff / 100.0)); - if (range < 1) - range = 1; pr("%s efficiency %d%%, max range %d\n", xyas(cx, cy, player->cnum), eff, range); snxtsct_dist(&ns, cx, cy, range); @@ -193,20 +192,17 @@ delty(struct range *r, coord y) /* * Update OWNER's bmap for radar at CX,CY. - * EFF is the radar's efficiency, and RANGE its range at 100% - * efficiency. + * EFF is the radar's efficiency, TLEV its tech level, SPY its power. */ void -rad_map_set(natid owner, int cx, int cy, int eff, int range) +rad_map_set(natid owner, int cx, int cy, int eff, double tlev, int spy) { struct nstr_sect ns; struct sctstr sect; + int range = rad_range(eff, tlev, spy); int changed = 0; char ch; - range = (int)(range * (eff / 100.0)); - if (range < 1) - range = 1; snxtsct_dist(&ns, cx, cy, range); while (nxtsct(&ns, §)) { if (sect.sct_own == owner @@ -222,3 +218,18 @@ rad_map_set(natid owner, int cx, int cy, int eff, int range) if (changed) writemap(owner); } + +/* + * Range of a radar with EFF efficiency, TLEV tech, and SPY power. + */ +static int +rad_range(int eff, double tlev, int spy) +{ + int range; + + range = (int)techfact(tlev, spy); + range = (int)(range * (eff / 100.0)); + if (range < 1) + range = 1; + return range; +} diff --git a/src/lib/subs/shpsub.c b/src/lib/subs/shpsub.c index 54dc821b9..d5063bc7b 100644 --- a/src/lib/subs/shpsub.c +++ b/src/lib/subs/shpsub.c @@ -732,7 +732,6 @@ shp_nav_one_sector(struct emp_qelem *list, int dir, natid actor, coord newy; int stopping = 0; double mobcost; - double tech; /* for mapping */ char dp[80]; int navigate; @@ -785,11 +784,10 @@ shp_nav_one_sector(struct emp_qelem *list, int dir, natid actor, putship(mlp->unit.ship.shp_uid, &mlp->unit.ship); /* Now update the map for this ship */ - tech = techfact(mlp->unit.ship.shp_tech, - ((struct mchrstr *)mlp->chrp)->m_vrnge); rad_map_set(mlp->unit.ship.shp_own, mlp->unit.ship.shp_x, mlp->unit.ship.shp_y, - mlp->unit.ship.shp_effic, (int)tech); + mlp->unit.ship.shp_effic, mlp->unit.ship.shp_tech, + ((struct mchrstr *)mlp->chrp)->m_vrnge); } if (QEMPTY(list)) return stopping; -- 2.43.0