(load_comm_ship, load_comm_land): Partial rewrite for clarity. Fix
`are we loading' tests. Closes #752493 and #965504.
This commit is contained in:
parent
abd1fd2c1e
commit
5ec624514a
1 changed files with 47 additions and 82 deletions
|
@ -735,12 +735,9 @@ load_comm_ship(struct sctstr *sectp, struct shpstr *sp,
|
||||||
struct ichrstr *ich, int load_unload, int *nshipsp)
|
struct ichrstr *ich, int load_unload, int *nshipsp)
|
||||||
{
|
{
|
||||||
register int item = ich->i_vtype;
|
register int item = ich->i_vtype;
|
||||||
register int max_amt;
|
struct mchrstr *mcp = &mchr[(int)sp->shp_type];
|
||||||
register int move_amt;
|
int ship_amt, ship_max, sect_amt, move_amt;
|
||||||
register int ship_amt;
|
|
||||||
register int sect_amt;
|
|
||||||
int amount;
|
int amount;
|
||||||
int upto = 0, abs_max;
|
|
||||||
s_char prompt[512];
|
s_char prompt[512];
|
||||||
s_char *p;
|
s_char *p;
|
||||||
s_char buf[1024];
|
s_char buf[1024];
|
||||||
|
@ -756,44 +753,31 @@ load_comm_ship(struct sctstr *sectp, struct shpstr *sp,
|
||||||
if (!still_ok_ship(sectp, sp))
|
if (!still_ok_ship(sectp, sp))
|
||||||
return RET_SYN;
|
return RET_SYN;
|
||||||
|
|
||||||
amount = atoi(p);
|
|
||||||
if (amount < 0) {
|
|
||||||
/* We want to load up to this amount */
|
|
||||||
upto = -(amount);
|
|
||||||
load_unload = LOAD;
|
|
||||||
} else if (!amount)
|
|
||||||
return 0;
|
|
||||||
ship_amt = sp->shp_item[item];
|
ship_amt = sp->shp_item[item];
|
||||||
|
ship_max = vl_find(item, mcp->m_vtype, mcp->m_vamt, mcp->m_nv);
|
||||||
sect_amt = sectp->sct_item[item];
|
sect_amt = sectp->sct_item[item];
|
||||||
if (sectp->sct_oldown != player->cnum && item == V_CIVIL) {
|
amount = atoi(p);
|
||||||
pr("%s civilians refuse to %s at %s!\n",
|
if (amount < 0)
|
||||||
load_unload == UNLOAD ? "Your" : "Foreign",
|
move_amt = -amount - ship_amt;
|
||||||
load_unload == UNLOAD ?
|
else
|
||||||
"disembark" : "board",
|
move_amt = load_unload == LOAD ? amount : -amount;
|
||||||
xyas(sectp->sct_x, sectp->sct_y, player->cnum));
|
if (move_amt > ship_max - ship_amt)
|
||||||
return 0;
|
move_amt = ship_max - ship_amt;
|
||||||
}
|
if (move_amt < -ship_amt)
|
||||||
if (load_unload == UNLOAD) {
|
move_amt = -ship_amt;
|
||||||
abs_max = max_amt = min(9999 - sect_amt, ship_amt);
|
|
||||||
} else {
|
|
||||||
struct mchrstr *vbase;
|
|
||||||
vbase = &mchr[(int)sp->shp_type];
|
|
||||||
abs_max = max_amt = vl_find(item, vbase->m_vtype,
|
|
||||||
vbase->m_vamt, (int)vbase->m_nv);
|
|
||||||
max_amt = min(sect_amt, max_amt - ship_amt);
|
|
||||||
}
|
|
||||||
if (max_amt <= 0 && !upto)
|
|
||||||
return 0;
|
|
||||||
if (upto) {
|
|
||||||
move_amt = upto - ship_amt;
|
|
||||||
if (move_amt > sect_amt)
|
if (move_amt > sect_amt)
|
||||||
move_amt = sect_amt;
|
move_amt = sect_amt;
|
||||||
if (ship_amt + move_amt > abs_max)
|
if (move_amt < sect_amt - 9999)
|
||||||
move_amt = abs_max - ship_amt;
|
move_amt = sect_amt - 9999;
|
||||||
} else
|
|
||||||
move_amt = load_unload * min(amount, max_amt);
|
|
||||||
if (!move_amt)
|
if (!move_amt)
|
||||||
return 0;
|
return RET_OK;
|
||||||
|
if (sectp->sct_oldown != player->cnum && item == V_CIVIL) {
|
||||||
|
pr("%s civilians refuse to %s at %s!\n",
|
||||||
|
move_amt < 0 ? "Your" : "Foreign",
|
||||||
|
move_amt < 0 ? "disembark" : "board",
|
||||||
|
xyas(sectp->sct_x, sectp->sct_y, player->cnum));
|
||||||
|
return RET_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
if (!want_to_abandon(sectp, item, move_amt, 0))
|
if (!want_to_abandon(sectp, item, move_amt, 0))
|
||||||
return RET_FAIL;
|
return RET_FAIL;
|
||||||
|
@ -801,7 +785,7 @@ load_comm_ship(struct sctstr *sectp, struct shpstr *sp,
|
||||||
return RET_SYN;
|
return RET_SYN;
|
||||||
sectp->sct_item[item] = sect_amt - move_amt;
|
sectp->sct_item[item] = sect_amt - move_amt;
|
||||||
sp->shp_item[item] = ship_amt + move_amt;
|
sp->shp_item[item] = ship_amt + move_amt;
|
||||||
if (load_unload == LOAD) {
|
if (move_amt >= 0) {
|
||||||
pr("%d %s loaded onto %s at %s\n",
|
pr("%d %s loaded onto %s at %s\n",
|
||||||
move_amt,
|
move_amt,
|
||||||
ich->i_name,
|
ich->i_name,
|
||||||
|
@ -954,12 +938,9 @@ load_comm_land(struct sctstr *sectp, struct lndstr *lp,
|
||||||
struct ichrstr *ich, int load_unload, int *nunitsp)
|
struct ichrstr *ich, int load_unload, int *nunitsp)
|
||||||
{
|
{
|
||||||
register int item = ich->i_vtype;
|
register int item = ich->i_vtype;
|
||||||
register int max_amt;
|
struct lchrstr *lcp = &lchr[(int)lp->lnd_type];
|
||||||
register int move_amt;
|
int land_amt, land_max, sect_amt, move_amt;
|
||||||
register int land_amt;
|
|
||||||
register int sect_amt;
|
|
||||||
int amount;
|
int amount;
|
||||||
int upto = 0, abs_max;
|
|
||||||
s_char prompt[512];
|
s_char prompt[512];
|
||||||
s_char *p;
|
s_char *p;
|
||||||
s_char buf[1024];
|
s_char buf[1024];
|
||||||
|
@ -975,58 +956,43 @@ load_comm_land(struct sctstr *sectp, struct lndstr *lp,
|
||||||
if (!still_ok_land(sectp, lp))
|
if (!still_ok_land(sectp, lp))
|
||||||
return RET_SYN;
|
return RET_SYN;
|
||||||
|
|
||||||
amount = atoi(p);
|
|
||||||
if (amount < 0) {
|
|
||||||
/* We want to load up to this amount */
|
|
||||||
upto = -(amount);
|
|
||||||
load_unload = LOAD;
|
|
||||||
} else if (!amount)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (sectp->sct_own != player->cnum && load_unload == LOAD) {
|
|
||||||
pr("Sector %s is not yours.\n",
|
|
||||||
xyas(lp->lnd_x, lp->lnd_y, player->cnum));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
land_amt = lp->lnd_item[item];
|
land_amt = lp->lnd_item[item];
|
||||||
|
land_max = vl_find(item, lcp->l_vtype, lcp->l_vamt, lcp->l_nv);
|
||||||
sect_amt = sectp->sct_item[item];
|
sect_amt = sectp->sct_item[item];
|
||||||
if (sectp->sct_oldown != player->cnum && item == V_CIVIL) {
|
amount = atoi(p);
|
||||||
pr("%s civilians refuse to %s at %s!\n",
|
if (amount < 0)
|
||||||
load_unload == UNLOAD ? "Your" : "Foreign",
|
move_amt = -amount - land_amt;
|
||||||
load_unload == UNLOAD ?
|
else
|
||||||
"disembark" : "board",
|
move_amt = load_unload == LOAD ? amount : -amount;
|
||||||
xyas(sectp->sct_x, sectp->sct_y, player->cnum));
|
if (move_amt > land_max - land_amt)
|
||||||
return 0;
|
move_amt = land_max - land_amt;
|
||||||
}
|
if (move_amt < -land_amt)
|
||||||
if (load_unload == UNLOAD) {
|
move_amt = -land_amt;
|
||||||
abs_max = max_amt = min(9999 - sect_amt, land_amt);
|
|
||||||
} else {
|
|
||||||
struct lchrstr *vbase;
|
|
||||||
vbase = &lchr[(int)lp->lnd_type];
|
|
||||||
abs_max = max_amt = vl_find(item, vbase->l_vtype,
|
|
||||||
vbase->l_vamt, (int)vbase->l_nv);
|
|
||||||
max_amt = min(sect_amt, max_amt - land_amt);
|
|
||||||
}
|
|
||||||
if ((max_amt <= 0) && (upto == 0))
|
|
||||||
return 0;
|
|
||||||
if (upto) {
|
|
||||||
move_amt = upto - land_amt;
|
|
||||||
if (land_amt + move_amt > abs_max)
|
|
||||||
move_amt = abs_max - land_amt;
|
|
||||||
if (move_amt > sect_amt)
|
if (move_amt > sect_amt)
|
||||||
move_amt = sect_amt;
|
move_amt = sect_amt;
|
||||||
} else
|
if (move_amt < sect_amt - 9999)
|
||||||
move_amt = load_unload * min(amount, max_amt);
|
move_amt = sect_amt - 9999;
|
||||||
if (move_amt == 0)
|
if (!move_amt)
|
||||||
return 0;
|
return RET_OK;
|
||||||
|
if (sectp->sct_own != player->cnum && move_amt > 0) {
|
||||||
|
pr("Sector %s is not yours.\n",
|
||||||
|
xyas(lp->lnd_x, lp->lnd_y, player->cnum));
|
||||||
|
return RET_FAIL;
|
||||||
|
}
|
||||||
|
if (sectp->sct_oldown != player->cnum && item == V_CIVIL) {
|
||||||
|
pr("%s civilians refuse to %s at %s!\n",
|
||||||
|
move_amt < 0 ? "Your" : "Foreign",
|
||||||
|
move_amt < 0 ? "disembark" : "board",
|
||||||
|
xyas(sectp->sct_x, sectp->sct_y, player->cnum));
|
||||||
|
return RET_FAIL;
|
||||||
|
}
|
||||||
sectp->sct_item[item] = sect_amt - move_amt;
|
sectp->sct_item[item] = sect_amt - move_amt;
|
||||||
lp->lnd_item[item] = land_amt + move_amt;
|
lp->lnd_item[item] = land_amt + move_amt;
|
||||||
|
|
||||||
/* Did we put mils onto this unit? If so, reset the fortification */
|
/* Did we put mils onto this unit? If so, reset the fortification */
|
||||||
if (item == V_MILIT && move_amt > 0)
|
if (item == V_MILIT && move_amt > 0)
|
||||||
lp->lnd_harden = 0;
|
lp->lnd_harden = 0;
|
||||||
if (load_unload == LOAD) {
|
if (move_amt >= 0) {
|
||||||
pr("%d %s loaded onto %s at %s\n",
|
pr("%d %s loaded onto %s at %s\n",
|
||||||
move_amt,
|
move_amt,
|
||||||
ich->i_name,
|
ich->i_name,
|
||||||
|
@ -1054,7 +1020,6 @@ load_comm_land(struct sctstr *sectp, struct lndstr *lp,
|
||||||
wu(0, sectp->sct_own, buf);
|
wu(0, sectp->sct_own, buf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
++(*nunitsp);
|
++(*nunitsp);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue