diff --git a/include/prototypes.h b/include/prototypes.h index 6c181cf1..8701cae7 100644 --- a/include/prototypes.h +++ b/include/prototypes.h @@ -673,6 +673,7 @@ extern void shp_view(struct emp_qelem *); extern int shp_nav_one_sector(struct emp_qelem *, int, natid, int); extern int shp_missile_defense(coord, coord, natid, int); extern void shp_missdef(struct shpstr *, natid); +extern double shp_mobcost(struct shpstr *); extern void shp_set_tech(struct shpstr *, int); /* snxtitem.c */ extern int snxtitem(struct nstr_item *, int, char *); diff --git a/src/lib/commands/mfir.c b/src/lib/commands/mfir.c index 70cd0f4a..e645b79d 100644 --- a/src/lib/commands/mfir.c +++ b/src/lib/commands/mfir.c @@ -958,8 +958,6 @@ use_ammo(struct emp_qelem *list) struct sctstr sect; int shell; short *item; - double mobcost; - struct mchrstr *mcp; /* use 1 shell from everyone */ for (qp = list->q_forw; qp != list; qp = next) { @@ -975,13 +973,8 @@ use_ammo(struct emp_qelem *list) shell = 0; item[I_SHELL] = shell; putship(ship.shp_uid, &ship); - mcp = &mchr[(int)ship.shp_type]; - mobcost = ship.shp_effic * 0.01 * ship.shp_speed; - mobcost = (480.0 / (mobcost + - techfact(ship.shp_tech, mobcost))); /* mob cost = 1/2 a sect's mob */ - mobcost /= 2.0; - ship.shp_mobil -= mobcost; + ship.shp_mobil -= shp_mobcost(&ship) / 2.0; } } else if (fp->type == targ_land) { getsect(fp->x, fp->y, §); diff --git a/src/lib/commands/orde.c b/src/lib/commands/orde.c index f087ea6a..72fe1d97 100644 --- a/src/lib/commands/orde.c +++ b/src/lib/commands/orde.c @@ -330,8 +330,7 @@ eta_calc(struct shpstr *sp, char *path, int *len, int *nupdates) *len = i; *nupdates = 1; - mobcost = sp->shp_effic * 0.01 * sp->shp_speed; - mobcost = 480.0 / (mobcost + techfact(sp->shp_tech, mobcost)); + mobcost = shp_mobcost(sp); mobil = sp->shp_mobil; while (i) { if (mobil > 0) { diff --git a/src/lib/commands/torp.c b/src/lib/commands/torp.c index 4e563955..747faabf 100644 --- a/src/lib/commands/torp.c +++ b/src/lib/commands/torp.c @@ -71,8 +71,6 @@ torp(void) struct shpstr vship; struct shpstr sub; char *ptr; - double mobcost; - struct mchrstr *mcp; struct nstr_item nbst; char buf[1024]; char *sav; @@ -169,13 +167,8 @@ torp(void) shells -= SHP_TORP_SHELLS; sub.shp_item[I_SHELL] = shells; putship(sub.shp_uid, &sub); - mcp = &mchr[(int)sub.shp_type]; - mobcost = sub.shp_effic * 0.01 * sub.shp_speed; - mobcost = (480.0 / (mobcost + techfact(sub.shp_tech, mobcost))); - /* Mob cost for a torp is equal to the cost of 1/2 sector of movement */ - mobcost /= 2.0; - sub.shp_mobil -= mobcost; + sub.shp_mobil -= shp_mobcost(&sub) / 2.0; pr("Whooosh... "); getship(victno, &vship); vshipown = vship.shp_own; @@ -389,8 +382,6 @@ fire_torp(struct shpstr *sp, struct shpstr *targ, int range, int ntargets) int dam; int shells; double hitchance; - double mobcost; - struct mchrstr *mcp; shells = sp->shp_item[I_SHELL]; @@ -415,13 +406,8 @@ fire_torp(struct shpstr *sp, struct shpstr *targ, int range, int ntargets) sp->shp_item[I_SHELL] = shells; putship(sp->shp_uid, sp); - mcp = &mchr[(int)sp->shp_type]; - mobcost = sp->shp_effic * 0.01 * sp->shp_speed; - mobcost = (480.0 / (mobcost + techfact(sp->shp_tech, mobcost))); - /* Mob cost for a torp is equal to the cost of 1/2 sector of movement */ - mobcost /= 2.0; - sp->shp_mobil -= mobcost; + sp->shp_mobil -= shp_mobcost(sp) / 2.0; hitchance = DTORP_HITCHANCE(range, sp->shp_visib); diff --git a/src/lib/subs/mission.c b/src/lib/subs/mission.c index 5765665d..74c568f6 100644 --- a/src/lib/subs/mission.c +++ b/src/lib/subs/mission.c @@ -437,7 +437,7 @@ perform_mission(coord x, coord y, natid victim, struct emp_qelem *list, int dam = 0, dam2, mission_flags, tech; natid plane_owner = 0; int gun, shell, md, range, air_dam = 0; - double prb, mobcost, hitchance, vrange; + double prb, hitchance, vrange; getsect(x, y, §); @@ -559,10 +559,7 @@ perform_mission(coord x, coord y, natid victim, struct emp_qelem *list, if (!line_of_sight(NULL, x, y, gp->x, gp->y)) continue; sp->shp_item[I_SHELL] = shell - SHP_TORP_SHELLS; - mobcost = sp->shp_effic * 0.01 * sp->shp_speed; - mobcost = (480.0 / (mobcost + - techfact(sp->shp_tech, mobcost))); - sp->shp_mobil -= mobcost; + sp->shp_mobil -= shp_mobcost(sp) / 2.0; putship(sp->shp_uid, sp); hitchance = DTORP_HITCHANCE(md, sp->shp_visib); diff --git a/src/lib/subs/retreat.c b/src/lib/subs/retreat.c index 7d9f1acc..ea9ecce9 100644 --- a/src/lib/subs/retreat.c +++ b/src/lib/subs/retreat.c @@ -246,8 +246,7 @@ retreat_ship1(struct shpstr *sp, char code, int orig) mcp = &mchr[(int)sp->shp_type]; newx = xnorm(sp->shp_x + dx); newy = ynorm(sp->shp_y + dy); - mobcost = sp->shp_effic * 0.01 * sp->shp_speed; - mobcost = 480.0 / (mobcost + techfact(sp->shp_tech, mobcost)); + mobcost = shp_mobcost(sp); getsect(newx, newy, §); if (shp_check_nav(§, sp) != CN_NAVIGABLE || diff --git a/src/lib/subs/shpsub.c b/src/lib/subs/shpsub.c index 58a0db8c..eb2a4ec6 100644 --- a/src/lib/subs/shpsub.c +++ b/src/lib/subs/shpsub.c @@ -219,7 +219,6 @@ shp_sweep(struct emp_qelem *ship_list, int verbose, natid actor) int mines, m, max, shells; int changed = 0; int stopping = 0; - double mobcost; for (qp = ship_list->q_back; qp != ship_list; qp = next) { next = qp->q_back; @@ -242,10 +241,7 @@ shp_sweep(struct emp_qelem *ship_list, int verbose, natid actor) prship(&mlp->ship)); continue; } - mobcost = mlp->ship.shp_effic * 0.01 * mlp->ship.shp_speed; - mobcost = 480.0 / (mobcost + - techfact(mlp->ship.shp_tech, mobcost)); - mlp->mobil -= mobcost; + mlp->mobil -= shp_mobcost(&mlp->ship); mlp->ship.shp_mobil = (int)mlp->mobil; putship(mlp->ship.shp_uid, &mlp->ship); if (!(mines = sect.sct_mines)) @@ -859,9 +855,7 @@ shp_nav_one_sector(struct emp_qelem *list, int dir, natid actor, shp_mess("is out of mobility", mlp); continue; } - mobcost = mlp->ship.shp_effic * 0.01 * mlp->ship.shp_speed; - mobcost = 480.0 / - (mobcost + techfact(mlp->ship.shp_tech, mobcost)); + mobcost = shp_mobcost(&mlp->ship); mlp->ship.shp_x = newx; mlp->ship.shp_y = newy; if (mlp->mobil - mobcost < -127) { @@ -1062,6 +1056,13 @@ shp_missdef(struct shpstr *sp, natid victim) free(mlp); } +double +shp_mobcost(struct shpstr *sp) +{ + double effspd = sp->shp_effic * 0.01 * sp->shp_speed; + return 480.0 / (effspd + techfact(sp->shp_tech, effspd)); +} + /* * Set SP's tech to TLEV along with everything else that depends on it. */ diff --git a/src/lib/update/sail.c b/src/lib/update/sail.c index 4c24f5d2..1f746087 100644 --- a/src/lib/update/sail.c +++ b/src/lib/update/sail.c @@ -55,21 +55,9 @@ static void fltp_to_list(struct fltheadstr *, struct emp_qelem *); static void cost_ship(struct shpstr *sp, struct fltelemstr *ep, struct fltheadstr *fp) { - double mobcost; + double mobcost = shp_mobcost(sp); int howfar; - mobcost = 0.0; - if (sp->shp_effic > 0) { - mobcost = sp->shp_effic * sp->shp_speed * 0.01; - mobcost = 480.0 / (mobcost * (1 + (50 + sp->shp_tech) / - (double)(200 + sp->shp_tech))); - } -/* the next two lines are not necessary since shp_mobquota is unsigned -and therefore cannot be less than 0. - if (sp->shp_mobquota<0) - sp->shp_mobquota=0; -*/ - howfar = 0; if (mobcost > 0) { howfar = (int)sp->shp_mobil - (int)sp->shp_mobquota;