(shp_mobcost): New.

(use_ammo, eta_calc, torp, fire_torp, perform_mission, retreat_ship1)
(shp_sweep, shp_nav_one_sector, cost_ship): Use it.

(perform_mission): Fix mobility cost of torpedo: charged full sector
cost instead of half.
This commit is contained in:
Markus Armbruster 2006-05-20 19:28:29 +00:00
parent 2cd8e99f49
commit 16b9c41b39
8 changed files with 18 additions and 54 deletions

View file

@ -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_nav_one_sector(struct emp_qelem *, int, natid, int);
extern int shp_missile_defense(coord, coord, natid, int); extern int shp_missile_defense(coord, coord, natid, int);
extern void shp_missdef(struct shpstr *, natid); extern void shp_missdef(struct shpstr *, natid);
extern double shp_mobcost(struct shpstr *);
extern void shp_set_tech(struct shpstr *, int); extern void shp_set_tech(struct shpstr *, int);
/* snxtitem.c */ /* snxtitem.c */
extern int snxtitem(struct nstr_item *, int, char *); extern int snxtitem(struct nstr_item *, int, char *);

View file

@ -958,8 +958,6 @@ use_ammo(struct emp_qelem *list)
struct sctstr sect; struct sctstr sect;
int shell; int shell;
short *item; short *item;
double mobcost;
struct mchrstr *mcp;
/* use 1 shell from everyone */ /* use 1 shell from everyone */
for (qp = list->q_forw; qp != list; qp = next) { for (qp = list->q_forw; qp != list; qp = next) {
@ -975,13 +973,8 @@ use_ammo(struct emp_qelem *list)
shell = 0; shell = 0;
item[I_SHELL] = shell; item[I_SHELL] = shell;
putship(ship.shp_uid, &ship); 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 */ /* mob cost = 1/2 a sect's mob */
mobcost /= 2.0; ship.shp_mobil -= shp_mobcost(&ship) / 2.0;
ship.shp_mobil -= mobcost;
} }
} else if (fp->type == targ_land) { } else if (fp->type == targ_land) {
getsect(fp->x, fp->y, &sect); getsect(fp->x, fp->y, &sect);

View file

@ -330,8 +330,7 @@ eta_calc(struct shpstr *sp, char *path, int *len, int *nupdates)
*len = i; *len = i;
*nupdates = 1; *nupdates = 1;
mobcost = sp->shp_effic * 0.01 * sp->shp_speed; mobcost = shp_mobcost(sp);
mobcost = 480.0 / (mobcost + techfact(sp->shp_tech, mobcost));
mobil = sp->shp_mobil; mobil = sp->shp_mobil;
while (i) { while (i) {
if (mobil > 0) { if (mobil > 0) {

View file

@ -71,8 +71,6 @@ torp(void)
struct shpstr vship; struct shpstr vship;
struct shpstr sub; struct shpstr sub;
char *ptr; char *ptr;
double mobcost;
struct mchrstr *mcp;
struct nstr_item nbst; struct nstr_item nbst;
char buf[1024]; char buf[1024];
char *sav; char *sav;
@ -169,13 +167,8 @@ torp(void)
shells -= SHP_TORP_SHELLS; shells -= SHP_TORP_SHELLS;
sub.shp_item[I_SHELL] = shells; sub.shp_item[I_SHELL] = shells;
putship(sub.shp_uid, &sub); 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 */ /* Mob cost for a torp is equal to the cost of 1/2 sector of movement */
mobcost /= 2.0; sub.shp_mobil -= shp_mobcost(&sub) / 2.0;
sub.shp_mobil -= mobcost;
pr("Whooosh... "); pr("Whooosh... ");
getship(victno, &vship); getship(victno, &vship);
vshipown = vship.shp_own; vshipown = vship.shp_own;
@ -389,8 +382,6 @@ fire_torp(struct shpstr *sp, struct shpstr *targ, int range, int ntargets)
int dam; int dam;
int shells; int shells;
double hitchance; double hitchance;
double mobcost;
struct mchrstr *mcp;
shells = sp->shp_item[I_SHELL]; 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; sp->shp_item[I_SHELL] = shells;
putship(sp->shp_uid, sp); 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 */ /* Mob cost for a torp is equal to the cost of 1/2 sector of movement */
mobcost /= 2.0; sp->shp_mobil -= shp_mobcost(sp) / 2.0;
sp->shp_mobil -= mobcost;
hitchance = DTORP_HITCHANCE(range, sp->shp_visib); hitchance = DTORP_HITCHANCE(range, sp->shp_visib);

View file

@ -437,7 +437,7 @@ perform_mission(coord x, coord y, natid victim, struct emp_qelem *list,
int dam = 0, dam2, mission_flags, tech; int dam = 0, dam2, mission_flags, tech;
natid plane_owner = 0; natid plane_owner = 0;
int gun, shell, md, range, air_dam = 0; int gun, shell, md, range, air_dam = 0;
double prb, mobcost, hitchance, vrange; double prb, hitchance, vrange;
getsect(x, y, &sect); getsect(x, y, &sect);
@ -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)) if (!line_of_sight(NULL, x, y, gp->x, gp->y))
continue; continue;
sp->shp_item[I_SHELL] = shell - SHP_TORP_SHELLS; sp->shp_item[I_SHELL] = shell - SHP_TORP_SHELLS;
mobcost = sp->shp_effic * 0.01 * sp->shp_speed; sp->shp_mobil -= shp_mobcost(sp) / 2.0;
mobcost = (480.0 / (mobcost +
techfact(sp->shp_tech, mobcost)));
sp->shp_mobil -= mobcost;
putship(sp->shp_uid, sp); putship(sp->shp_uid, sp);
hitchance = DTORP_HITCHANCE(md, sp->shp_visib); hitchance = DTORP_HITCHANCE(md, sp->shp_visib);

View file

@ -246,8 +246,7 @@ retreat_ship1(struct shpstr *sp, char code, int orig)
mcp = &mchr[(int)sp->shp_type]; mcp = &mchr[(int)sp->shp_type];
newx = xnorm(sp->shp_x + dx); newx = xnorm(sp->shp_x + dx);
newy = ynorm(sp->shp_y + dy); newy = ynorm(sp->shp_y + dy);
mobcost = sp->shp_effic * 0.01 * sp->shp_speed; mobcost = shp_mobcost(sp);
mobcost = 480.0 / (mobcost + techfact(sp->shp_tech, mobcost));
getsect(newx, newy, &sect); getsect(newx, newy, &sect);
if (shp_check_nav(&sect, sp) != CN_NAVIGABLE || if (shp_check_nav(&sect, sp) != CN_NAVIGABLE ||

View file

@ -219,7 +219,6 @@ shp_sweep(struct emp_qelem *ship_list, int verbose, natid actor)
int mines, m, max, shells; int mines, m, max, shells;
int changed = 0; int changed = 0;
int stopping = 0; int stopping = 0;
double mobcost;
for (qp = ship_list->q_back; qp != ship_list; qp = next) { for (qp = ship_list->q_back; qp != ship_list; qp = next) {
next = qp->q_back; next = qp->q_back;
@ -242,10 +241,7 @@ shp_sweep(struct emp_qelem *ship_list, int verbose, natid actor)
prship(&mlp->ship)); prship(&mlp->ship));
continue; continue;
} }
mobcost = mlp->ship.shp_effic * 0.01 * mlp->ship.shp_speed; mlp->mobil -= shp_mobcost(&mlp->ship);
mobcost = 480.0 / (mobcost +
techfact(mlp->ship.shp_tech, mobcost));
mlp->mobil -= mobcost;
mlp->ship.shp_mobil = (int)mlp->mobil; mlp->ship.shp_mobil = (int)mlp->mobil;
putship(mlp->ship.shp_uid, &mlp->ship); putship(mlp->ship.shp_uid, &mlp->ship);
if (!(mines = sect.sct_mines)) 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); shp_mess("is out of mobility", mlp);
continue; continue;
} }
mobcost = mlp->ship.shp_effic * 0.01 * mlp->ship.shp_speed; mobcost = shp_mobcost(&mlp->ship);
mobcost = 480.0 /
(mobcost + techfact(mlp->ship.shp_tech, mobcost));
mlp->ship.shp_x = newx; mlp->ship.shp_x = newx;
mlp->ship.shp_y = newy; mlp->ship.shp_y = newy;
if (mlp->mobil - mobcost < -127) { if (mlp->mobil - mobcost < -127) {
@ -1062,6 +1056,13 @@ shp_missdef(struct shpstr *sp, natid victim)
free(mlp); 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. * Set SP's tech to TLEV along with everything else that depends on it.
*/ */

View file

@ -55,21 +55,9 @@ static void fltp_to_list(struct fltheadstr *, struct emp_qelem *);
static void static void
cost_ship(struct shpstr *sp, struct fltelemstr *ep, struct fltheadstr *fp) cost_ship(struct shpstr *sp, struct fltelemstr *ep, struct fltheadstr *fp)
{ {
double mobcost; double mobcost = shp_mobcost(sp);
int howfar; 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; howfar = 0;
if (mobcost > 0) { if (mobcost > 0) {
howfar = (int)sp->shp_mobil - (int)sp->shp_mobquota; howfar = (int)sp->shp_mobil - (int)sp->shp_mobquota;