int
attack_val(int combat_mode, struct lndstr *lp)
{
- extern double assault_penalty;
- int men;
- int value;
- struct lchrstr *lcp;
-
- if (((int)lp->lnd_effic) < LAND_MINEFF){
- makelost(EF_LAND, lp->lnd_own, lp->lnd_uid, lp->lnd_x, lp->lnd_y);
- lp->lnd_own=0;
- putland(lp->lnd_uid,lp);
- return 0;
- }
+ extern double assault_penalty;
+ int men;
+ int value;
+ struct lchrstr *lcp;
+
+ if (((int)lp->lnd_effic) < LAND_MINEFF) {
+ makelost(EF_LAND, lp->lnd_own, lp->lnd_uid, lp->lnd_x, lp->lnd_y);
+ lp->lnd_own = 0;
+ putland(lp->lnd_uid, lp);
+ return 0;
+ }
- lcp = &lchr[(int)lp->lnd_type];
+ lcp = &lchr[(int)lp->lnd_type];
/* Spies always count as 1 during assaults. If they are the only ones
in the assault, they get to sneak on anyway. */
- if (lcp->l_flags & L_SPY && combat_mode == A_ASSAULT)
- return 1;
-
- men = total_mil(lp);
+ if (lcp->l_flags & L_SPY && combat_mode == A_ASSAULT)
+ return 1;
- value = ldround(((double)men*(double)lp->lnd_att),1);
+ men = total_mil(lp);
- value = (int)((double)value * ((double)lp->lnd_effic / 100.0));
+ value = ldround(((double)men * (double)lp->lnd_att), 1);
- switch (combat_mode) {
- case A_ATTACK:
- return value;
- case A_ASSAULT:
- if (!(lcp->l_flags & L_MARINE))
- return (int)(assault_penalty * value);
- break;
- case A_BOARD:
- if (!(lcp->l_flags & L_MARINE))
- return (int)(assault_penalty * men);
- }
+ value = (int)((double)value * ((double)lp->lnd_effic / 100.0));
+ switch (combat_mode) {
+ case A_ATTACK:
return value;
+ case A_ASSAULT:
+ if (!(lcp->l_flags & L_MARINE))
+ return (int)(assault_penalty * value);
+ break;
+ case A_BOARD:
+ if (!(lcp->l_flags & L_MARINE))
+ return (int)(assault_penalty * men);
+ }
+
+ return value;
}
+
int
defense_val(struct lndstr *lp)
{
- extern int land_mob_max;
- int men;
- double value;
- struct lchrstr *lcp;
-
- if (((int)lp->lnd_effic) < LAND_MINEFF){
- makelost(EF_LAND, lp->lnd_own, lp->lnd_uid, lp->lnd_x, lp->lnd_y);
- lp->lnd_own=0;
- putland(lp->lnd_uid,lp);
- return 0;
- }
+ extern int land_mob_max;
+ int men;
+ double value;
+ struct lchrstr *lcp;
+
+ if (((int)lp->lnd_effic) < LAND_MINEFF) {
+ makelost(EF_LAND, lp->lnd_own, lp->lnd_uid, lp->lnd_x, lp->lnd_y);
+ lp->lnd_own = 0;
+ putland(lp->lnd_uid, lp);
+ return 0;
+ }
- lcp = &lchr[(int)lp->lnd_type];
+ lcp = &lchr[(int)lp->lnd_type];
- men = total_mil(lp);
+ men = total_mil(lp);
- if (men < 0)
- men = 0;
- if ((lp->lnd_ship >= 0 || lp->lnd_land >= 0) &&
- !(lcp->l_flags & L_MARINE))
- return men;
+ if (men < 0)
+ men = 0;
+ if ((lp->lnd_ship >= 0 || lp->lnd_land >= 0) &&
+ !(lcp->l_flags & L_MARINE))
+ return men;
- value = men * lp->lnd_def;
+ value = men * lp->lnd_def;
- value *= ((double)land_mob_max + lp->lnd_harden) / (double)land_mob_max;
- value = (int)((double)value * ((double)lp->lnd_effic / 100.0));
- value = (int)ldround(value, 1);
+ value *=
+ ((double)land_mob_max + lp->lnd_harden) / (double)land_mob_max;
+ value = (int)((double)value * ((double)lp->lnd_effic / 100.0));
+ value = (int)ldround(value, 1);
- /* If there are military on the unit, you get at least a 1
- man defensive unit, except for spies */
- if (value < 1.0 && men > 0 && !(lcp->l_flags & L_SPY))
- return 1;
+ /* If there are military on the unit, you get at least a 1
+ man defensive unit, except for spies */
+ if (value < 1.0 && men > 0 && !(lcp->l_flags & L_SPY))
+ return 1;
- return (int)(value);
+ return (int)(value);
}
+
int
total_mil(struct lndstr *lp)
{
- struct lchrstr *lcp;
- double men;
+ struct lchrstr *lcp;
+ double men;
- lcp = &lchr[(int)lp->lnd_type];
+ lcp = &lchr[(int)lp->lnd_type];
- men = lnd_getmil(lp);
+ men = lnd_getmil(lp);
/* men *= ((double)lp->lnd_effic)/100.0;*/
- return ldround(men,1);
+ return ldround(men, 1);
}
void
lnd_print(struct llist *llp, s_char *s)
{
- if (llp->land.lnd_own == player->cnum)
- pr("%s %s\n",prland(&llp->land), s);
- else
- wu(0, llp->land.lnd_own,
- "%s %s\n",prland(&llp->land),s);
+ if (llp->land.lnd_own == player->cnum)
+ pr("%s %s\n", prland(&llp->land), s);
+ else
+ wu(0, llp->land.lnd_own, "%s %s\n", prland(&llp->land), s);
}
void
lnd_delete(struct llist *llp, s_char *s)
{
- if (s)
- lnd_print(llp, s);
- putland(llp->land.lnd_uid, &llp->land);
- emp_remque((struct emp_qelem *)llp);
- free((s_char *)llp);
+ if (s)
+ lnd_print(llp, s);
+ putland(llp->land.lnd_uid, &llp->land);
+ emp_remque((struct emp_qelem *)llp);
+ free((s_char *)llp);
}
+
int
lnd_take_casualty(int combat_mode, struct llist *llp, int cas)
- /* attacking or assaulting or paratrooping? */
-
- /* number of casualties to take */
+ /* attacking or assaulting or paratrooping? */
+ /* number of casualties to take */
{
- int eff_eq;
- int n;
- int biggest;
- int civs;
- int nowned;
- coord ret_x, ret_y;
- coord bx, by;
- struct sctstr sect;
- int ret_chance;
- s_char buf[1024];
- int taken;
- int nowhere_to_go = 0;
- struct sctstr rsect;
- double mobcost;
- s_char orig;
- int mob;
-
-
-
- taken = lnd_getmil(&(llp->land));
- /* Spies always die */
- if (llp->lcp->l_flags & L_SPY) {
- eff_eq = 100;
- llp->land.lnd_effic = 0;
- } else {
- eff_eq = ldround((((double)cas*100.0) / (double)llp->lcp->l_mil),1);
- llp->land.lnd_effic -= eff_eq;
- lnd_submil(&(llp->land), cas);
- }
-
- if (llp->land.lnd_effic < LAND_MINEFF) {
- sprintf(buf, "dies %s %s!",
- combat_mode?att_mode[combat_mode]:(s_char*) "defending",
- xyas(llp->land.lnd_x, llp->land.lnd_y, llp->land.lnd_own));
- lnd_delete(llp, buf);
- /* Since we killed the unit, we killed all the mil on it */
- return taken;
- } else {
- /* Ok, now, how many did we take off? (sould be the diff) */
- taken = taken - lnd_getmil(&(llp->land));
- }
-
- if (llp->land.lnd_effic >= llp->land.lnd_retreat)
- return taken;
+ int eff_eq;
+ int n;
+ int biggest;
+ int civs;
+ int nowned;
+ coord ret_x, ret_y;
+ coord bx, by;
+ struct sctstr sect;
+ int ret_chance;
+ s_char buf[1024];
+ int taken;
+ int nowhere_to_go = 0;
+ struct sctstr rsect;
+ double mobcost;
+ s_char orig;
+ int mob;
+
+
+
+ taken = lnd_getmil(&(llp->land));
+ /* Spies always die */
+ if (llp->lcp->l_flags & L_SPY) {
+ eff_eq = 100;
+ llp->land.lnd_effic = 0;
+ } else {
+ eff_eq =
+ ldround((((double)cas * 100.0) / (double)llp->lcp->l_mil), 1);
+ llp->land.lnd_effic -= eff_eq;
+ lnd_submil(&(llp->land), cas);
+ }
+
+ if (llp->land.lnd_effic < LAND_MINEFF) {
+ sprintf(buf, "dies %s %s!",
+ combat_mode ? att_mode[combat_mode] : (s_char *)
+ "defending", xyas(llp->land.lnd_x, llp->land.lnd_y,
+ llp->land.lnd_own));
+ lnd_delete(llp, buf);
+ /* Since we killed the unit, we killed all the mil on it */
+ return taken;
+ } else {
+ /* Ok, now, how many did we take off? (sould be the diff) */
+ taken = taken - lnd_getmil(&(llp->land));
+ }
- /* we're being boarded */
- if (llp->land.lnd_ship >= 0 && combat_mode == A_DEFEND)
- return taken;
+ if (llp->land.lnd_effic >= llp->land.lnd_retreat)
+ return taken;
- /* we're being boarded */
- if (llp->land.lnd_land >= 0 && combat_mode == A_DEFEND)
- return taken;
+ /* we're being boarded */
+ if (llp->land.lnd_ship >= 0 && combat_mode == A_DEFEND)
+ return taken;
- /* Have to make a retreat check */
+ /* we're being boarded */
+ if (llp->land.lnd_land >= 0 && combat_mode == A_DEFEND)
+ return taken;
- ret_chance = llp->land.lnd_retreat - llp->land.lnd_effic;
- if (roll(100) < ret_chance) {
- pr("\n");
- lnd_print(llp, "fails morale check!");
- llp->land.lnd_mission = 0;
- llp->land.lnd_harden = 0;
- if (llp->land.lnd_ship >= 0 || llp->land.lnd_land >= 0)
- nowhere_to_go = 1;
- else if (combat_mode == A_DEFEND) {
- /*
- * defending unit.. find a place to send it
- * strategy: look for the most-populated
- * adjacent sector that is owned by the unit
- * player->owner. Charge mob..
- */
- biggest = -1;
- nowned = 0;
- for(n = 1; n <= 6; ++n) {
- ret_x = llp->land.lnd_x + diroff[n][0];
- ret_y = llp->land.lnd_y + diroff[n][1];
- getsect(ret_x, ret_y, §);
- if (sect.sct_own != llp->land.lnd_own)
- continue;
- if (sect.sct_type == SCT_MOUNT)
- continue;
- ++nowned;
- civs = getvar(V_CIVIL, (s_char *)§, EF_SECTOR);
- if (civs > biggest){
- biggest = civs;
- bx = sect.sct_x;
- by = sect.sct_y;
- }
- }
- if (!nowned)
- nowhere_to_go = 1;
- else {
- /* retreat to bx,by */
- llp->land.lnd_x = bx;
- llp->land.lnd_y = by;
- getsect(bx,by,&rsect);
- mobcost = lnd_mobcost(&llp->land, &rsect, MOB_ROAD);
- mob = llp->land.lnd_mobil-(int)mobcost;
- if (mob < -127)
- mob = -127;
- orig = llp->land.lnd_mobil;
- llp->land.lnd_mobil = (s_char)mob;
- if (llp->land.lnd_mobil > orig)
- llp->land.lnd_mobil = (-127);
- sprintf(buf, "retreats at %d%% efficiency to %s!",
- llp->land.lnd_effic,
- xyas(bx,by,llp->land.lnd_own));
- lnd_delete(llp, buf);
- }
- } else { /* attacking from a sector */
- sprintf(buf, "leaves the battlefield at %d%% efficiency",
- llp->land.lnd_effic);
- if ((llp->land.lnd_mobil - (int)llp->mobil) < -127)
- llp->land.lnd_mobil = -127;
- else
- llp->land.lnd_mobil -= (int)llp->mobil;
- llp->mobil = 0.0;
- lnd_delete(llp, buf);
+ /* Have to make a retreat check */
+
+ ret_chance = llp->land.lnd_retreat - llp->land.lnd_effic;
+ if (roll(100) < ret_chance) {
+ pr("\n");
+ lnd_print(llp, "fails morale check!");
+ llp->land.lnd_mission = 0;
+ llp->land.lnd_harden = 0;
+ if (llp->land.lnd_ship >= 0 || llp->land.lnd_land >= 0)
+ nowhere_to_go = 1;
+ else if (combat_mode == A_DEFEND) {
+ /*
+ * defending unit.. find a place to send it
+ * strategy: look for the most-populated
+ * adjacent sector that is owned by the unit
+ * player->owner. Charge mob..
+ */
+ biggest = -1;
+ nowned = 0;
+ for (n = 1; n <= 6; ++n) {
+ ret_x = llp->land.lnd_x + diroff[n][0];
+ ret_y = llp->land.lnd_y + diroff[n][1];
+ getsect(ret_x, ret_y, §);
+ if (sect.sct_own != llp->land.lnd_own)
+ continue;
+ if (sect.sct_type == SCT_MOUNT)
+ continue;
+ ++nowned;
+ civs = getvar(V_CIVIL, (s_char *)§, EF_SECTOR);
+ if (civs > biggest) {
+ biggest = civs;
+ bx = sect.sct_x;
+ by = sect.sct_y;
}
+ }
+ if (!nowned)
+ nowhere_to_go = 1;
+ else {
+ /* retreat to bx,by */
+ llp->land.lnd_x = bx;
+ llp->land.lnd_y = by;
+ getsect(bx, by, &rsect);
+ mobcost = lnd_mobcost(&llp->land, &rsect, MOB_ROAD);
+ mob = llp->land.lnd_mobil - (int)mobcost;
+ if (mob < -127)
+ mob = -127;
+ orig = llp->land.lnd_mobil;
+ llp->land.lnd_mobil = (s_char)mob;
+ if (llp->land.lnd_mobil > orig)
+ llp->land.lnd_mobil = (-127);
+ sprintf(buf, "retreats at %d%% efficiency to %s!",
+ llp->land.lnd_effic,
+ xyas(bx, by, llp->land.lnd_own));
+ lnd_delete(llp, buf);
+ }
+ } else { /* attacking from a sector */
+ sprintf(buf, "leaves the battlefield at %d%% efficiency",
+ llp->land.lnd_effic);
+ if ((llp->land.lnd_mobil - (int)llp->mobil) < -127)
+ llp->land.lnd_mobil = -127;
+ else
+ llp->land.lnd_mobil -= (int)llp->mobil;
+ llp->mobil = 0.0;
+ lnd_delete(llp, buf);
}
- if (nowhere_to_go) {
- /* nowhere to go.. take more casualties */
- llp->land.lnd_effic -= 10;
- lnd_submil(&llp->land, llp->lcp->l_mil / 10);
- if (llp->land.lnd_effic < LAND_MINEFF)
- lnd_delete(llp, "has nowhere to retreat, and dies!");
- else
- lnd_print(llp, "has nowhere to retreat and takes extra losses!");
- }
+ }
+ if (nowhere_to_go) {
+ /* nowhere to go.. take more casualties */
+ llp->land.lnd_effic -= 10;
+ lnd_submil(&llp->land, llp->lcp->l_mil / 10);
+ if (llp->land.lnd_effic < LAND_MINEFF)
+ lnd_delete(llp, "has nowhere to retreat, and dies!");
+ else
+ lnd_print(llp,
+ "has nowhere to retreat and takes extra losses!");
+ }
- return taken;
+ return taken;
}
void
lnd_takemob(struct emp_qelem *list, double loss)
{
- extern double combat_mob;
- struct emp_qelem *qp, *next;
- struct llist *llp;
- int new;
- int mcost = ldround(combat_mob * loss, 1);
-
- for (qp = list->q_forw; qp != list; qp = next) {
- next = qp->q_forw;
- llp = (struct llist *)qp;
+ extern double combat_mob;
+ struct emp_qelem *qp, *next;
+ struct llist *llp;
+ int new;
+ int mcost = ldround(combat_mob * loss, 1);
+
+ for (qp = list->q_forw; qp != list; qp = next) {
+ next = qp->q_forw;
+ llp = (struct llist *)qp;
/*
if (chance(loss))
use_supply(&llp->land);
new = llp->land.lnd_mobil - mcost/2;
else
*/
- new = llp->land.lnd_mobil - mcost;
- if (new < -127)
- new = -127;
- llp->land.lnd_mobil = (s_char)new;
- }
+ new = llp->land.lnd_mobil - mcost;
+ if (new < -127)
+ new = -127;
+ llp->land.lnd_mobil = (s_char)new;
+ }
}
int
lnd_getmil(struct lndstr *lp)
{
- int vec[I_MAX+1];
+ int vec[I_MAX + 1];
getvec(VT_ITEM, vec, (s_char *)lp, EF_LAND);
return vec[I_MILIT];
void
lnd_submil(struct lndstr *lp, int num)
{
- int vec[I_MAX+1];
+ int vec[I_MAX + 1];
getvec(VT_ITEM, vec, (s_char *)lp, EF_LAND);
vec[I_MILIT] -= num;
vec[I_MILIT] = 0;
putvec(VT_ITEM, vec, (s_char *)lp, EF_LAND);
}
+
int
lnd_spyval(struct lndstr *lp)
{
- if (lchr[(int)lp->lnd_type].l_flags & L_RECON)
- return (lp->lnd_spy * (lp->lnd_effic/100.0))+2;
- else
- return (lp->lnd_spy * (lp->lnd_effic/100.0));
+ if (lchr[(int)lp->lnd_type].l_flags & L_RECON)
+ return (lp->lnd_spy * (lp->lnd_effic / 100.0)) + 2;
+ else
+ return (lp->lnd_spy * (lp->lnd_effic / 100.0));
}
int
-intelligence_report(int destination, struct lndstr *lp, int spy, s_char *mess)
+intelligence_report(int destination, struct lndstr *lp, int spy,
+ s_char *mess)
{
- struct lchrstr *lcp;
- s_char buf1[80],buf2[80],buf3[80];
- double estimate = 0.0; /* estimated defense value */
+ struct lchrstr *lcp;
+ s_char buf1[80], buf2[80], buf3[80];
+ double estimate = 0.0; /* estimated defense value */
+
+ if (destination == 0)
+ return 0;
- if (destination == 0)
- return 0;
+ if (lp->lnd_own == 0)
+ return 0;
+
+ lcp = &lchr[(int)lp->lnd_type];
+
+ bzero(buf1, 80);
+ bzero(buf2, 80);
+ bzero(buf3, 80);
+ if (chance((double)(spy + lp->lnd_vis) / 10.0)) {
+ if (destination == player->cnum)
+ pr("%s %s", mess, prland(lp));
+ else
+ sprintf(buf1, "%s %s", mess, prland(lp));
+
+ estimate = lnd_getmil(lp);
- if (lp->lnd_own == 0)
- return 0;
+ if (chance((double)(spy + lp->lnd_vis) / 20.0)) {
- lcp = &lchr[(int)lp->lnd_type];
+ if (destination == player->cnum)
+ pr(" (eff %d, mil %d", roundintby(lp->lnd_effic, 5),
+ roundintby(lnd_getmil(lp), 10));
+ else
+ sprintf(buf2, " (eff %d, mil %d",
+ roundintby(lp->lnd_effic, 5),
+ roundintby(lnd_getmil(lp), 10));
+ estimate = lnd_getmil(lp) * lp->lnd_effic / 100.0;
- bzero(buf1,80);
- bzero(buf2,80);
- bzero(buf3,80);
- if (chance((double)(spy+lp->lnd_vis)/10.0)){
+ if (chance((double)(spy + lp->lnd_vis) / 20.0)) {
+ int t;
+ t = lp->lnd_tech - 20 + roll(40);
+ t = max(t, 0);
+ if (destination == player->cnum)
+ pr(", tech %d)\n", t);
+ else
+ sprintf(buf3, ", tech %d)\n", t);
+ } else {
if (destination == player->cnum)
- pr("%s %s", mess, prland(lp));
+ pr(")\n");
else
- sprintf(buf1,"%s %s", mess, prland(lp));
-
- estimate = lnd_getmil(lp);
-
- if (chance((double)(spy+lp->lnd_vis)/20.0)){
-
- if (destination == player->cnum)
- pr(" (eff %d, mil %d", roundintby(lp->lnd_effic,5), roundintby(lnd_getmil(lp),10));
- else
- sprintf(buf2," (eff %d, mil %d", roundintby(lp->lnd_effic,5), roundintby(lnd_getmil(lp),10));
- estimate = lnd_getmil(lp) * lp->lnd_effic / 100.0;
-
- if (chance((double)(spy+lp->lnd_vis)/20.0)){
- int t;
- t = lp->lnd_tech - 20 + roll(40);
- t = max(t,0);
- if (destination == player->cnum)
- pr(", tech %d)\n",t);
- else
- sprintf(buf3,", tech %d)\n",t);
- }else{
- if (destination == player->cnum)
- pr(")\n");
- else
- sprintf(buf3,")\n");
- }
- }else{
- if (destination == player->cnum)
- pr("\n");
- else
- sprintf(buf2,"\n");
- }
+ sprintf(buf3, ")\n");
+ }
+ } else {
+ if (destination == player->cnum)
+ pr("\n");
+ else
+ sprintf(buf2, "\n");
}
+ }
- if (destination != player->cnum){
- wu(0, destination, "%s%s%s",buf1,buf2,buf3);
- }
+ if (destination != player->cnum) {
+ wu(0, destination, "%s%s%s", buf1, buf2, buf3);
+ }
- if (lp->lnd_ship < 0 || lcp->l_flags & L_MARINE)
- estimate *= lp->lnd_def;
+ if (lp->lnd_ship < 0 || lcp->l_flags & L_MARINE)
+ estimate *= lp->lnd_def;
- return (int)estimate;
+ return (int)estimate;
}
/* Used by the spy command to count land units in a sector. If used
int
count_sect_units(struct sctstr *sp)
{
- int count = 0;
- double odds;
- struct nstr_item ni;
- struct lndstr land;
-
- snxtitem_all(&ni, EF_LAND);
- while (nxtitem(&ni, (s_char *)&land)) {
- if (!land.lnd_own)
- continue;
- if (land.lnd_x != sp->sct_x || land.lnd_y != sp->sct_y)
- continue;
- /* Don't always see spies */
- if (lchr[(int)land.lnd_type].l_flags & L_SPY) {
- odds = (double)(100 - land.lnd_effic) + 0.10;
- if (!(chance(odds)))
- continue;
- }
- /* Got here, report it */
- ++count;
+ int count = 0;
+ double odds;
+ struct nstr_item ni;
+ struct lndstr land;
+
+ snxtitem_all(&ni, EF_LAND);
+ while (nxtitem(&ni, (s_char *)&land)) {
+ if (!land.lnd_own)
+ continue;
+ if (land.lnd_x != sp->sct_x || land.lnd_y != sp->sct_y)
+ continue;
+ /* Don't always see spies */
+ if (lchr[(int)land.lnd_type].l_flags & L_SPY) {
+ odds = (double)(100 - land.lnd_effic) + 0.10;
+ if (!(chance(odds)))
+ continue;
}
+ /* Got here, report it */
+ ++count;
+ }
- return count;
+ return count;
}
void
count_units(struct shpstr *sp)
{
- struct nstr_item ni;
- struct lndstr land;
- int nland = 0;
-
- if (sp->shp_effic < SHIP_MINEFF)
- return;
-
- snxtitem_xy(&ni, EF_LAND, sp->shp_x, sp->shp_y);
- while (nxtitem(&ni, (s_char *)&land)){
- if (land.lnd_own == 0)
- continue;
- if (land.lnd_ship == sp->shp_uid)
- nland++;
- }
-
- if (sp->shp_nland != nland) {
- sp->shp_nland = nland;
- putship(sp->shp_uid,sp);
- }
+ struct nstr_item ni;
+ struct lndstr land;
+ int nland = 0;
+
+ if (sp->shp_effic < SHIP_MINEFF)
+ return;
+
+ snxtitem_xy(&ni, EF_LAND, sp->shp_x, sp->shp_y);
+ while (nxtitem(&ni, (s_char *)&land)) {
+ if (land.lnd_own == 0)
+ continue;
+ if (land.lnd_ship == sp->shp_uid)
+ nland++;
+ }
+
+ if (sp->shp_nland != nland) {
+ sp->shp_nland = nland;
+ putship(sp->shp_uid, sp);
+ }
}
void
lnd_count_units(struct lndstr *lp)
{
- struct nstr_item ni;
- struct lndstr land;
- int nland = 0;
-
- if (lp->lnd_effic < LAND_MINEFF)
- return;
-
- snxtitem_xy(&ni, EF_LAND, lp->lnd_x, lp->lnd_y);
- while (nxtitem(&ni, (s_char *)&land)){
- if (land.lnd_own == 0)
- continue;
- if (land.lnd_land == lp->lnd_uid)
- nland++;
- }
-
- if (lp->lnd_nland != nland) {
- lp->lnd_nland = nland;
- putland(lp->lnd_uid,lp);
- }
+ struct nstr_item ni;
+ struct lndstr land;
+ int nland = 0;
+
+ if (lp->lnd_effic < LAND_MINEFF)
+ return;
+
+ snxtitem_xy(&ni, EF_LAND, lp->lnd_x, lp->lnd_y);
+ while (nxtitem(&ni, (s_char *)&land)) {
+ if (land.lnd_own == 0)
+ continue;
+ if (land.lnd_land == lp->lnd_uid)
+ nland++;
+ }
+
+ if (lp->lnd_nland != nland) {
+ lp->lnd_nland = nland;
+ putland(lp->lnd_uid, lp);
+ }
}
void
lnd_sel(struct nstr_item *ni, struct emp_qelem *list)
-
-
+
+
/* int wantflags;
int nowantflags;
*/
{
- struct lndstr land;
- struct lchrstr *lcp;
- struct llist *llp;
-
- emp_initque(list);
- while (nxtitem(ni, (s_char *)&land)) {
- if (!player->owner)
- continue;
- if (opt_MARKET) {
- if (ontradingblock(EF_LAND, (int *)&land)) {
- pr("unit #%d inelligible - it's for sale.\n", land.lnd_uid);
- continue;
- }
- }
- lcp = &lchr[(int)land.lnd_type];
+ struct lndstr land;
+ struct lchrstr *lcp;
+ struct llist *llp;
+
+ emp_initque(list);
+ while (nxtitem(ni, (s_char *)&land)) {
+ if (!player->owner)
+ continue;
+ if (opt_MARKET) {
+ if (ontradingblock(EF_LAND, (int *)&land)) {
+ pr("unit #%d inelligible - it's for sale.\n",
+ land.lnd_uid);
+ continue;
+ }
+ }
+ lcp = &lchr[(int)land.lnd_type];
/* if (wantflags && (lcp->m_flags & wantflags) != wantflags)
continue;
if (nowantflags && lcp->m_flags & nowantflags)
continue;
*/
/* This abuse is better fixed by building a unit with the normal negative
- mobility that everything else is built with */
+ mobility that everything else is built with */
/* Just so that the player can't build a bunch of land units, and them
march them a few minutes later... */
/*
}
}
*/
- land.lnd_mission = 0;
- land.lnd_rflags = 0;
- land.lnd_harden = 0;
- bzero(land.lnd_rpath,RET_LEN);
- putland(land.lnd_uid, &land);
- llp = (struct llist *) malloc(sizeof(struct llist));
- llp->lcp = lcp;
- bcopy((s_char *)&land, (s_char *)&llp->land,
- sizeof(struct lndstr));
- llp->mobil = (double)land.lnd_mobil;
- emp_insque(&llp->queue, list);
- }
+ land.lnd_mission = 0;
+ land.lnd_rflags = 0;
+ land.lnd_harden = 0;
+ bzero(land.lnd_rpath, RET_LEN);
+ putland(land.lnd_uid, &land);
+ llp = (struct llist *)malloc(sizeof(struct llist));
+ llp->lcp = lcp;
+ bcopy((s_char *)&land, (s_char *)&llp->land,
+ sizeof(struct lndstr));
+ llp->mobil = (double)land.lnd_mobil;
+ emp_insque(&llp->queue, list);
+ }
}
/* This function assumes that the list was created by lnd_sel */
void
-lnd_mar(struct emp_qelem *list, double *minmobp, double *maxmobp, int *togetherp, natid actor)
+lnd_mar(struct emp_qelem *list, double *minmobp, double *maxmobp,
+ int *togetherp, natid actor)
{
- struct emp_qelem *qp;
- struct emp_qelem *next;
- struct llist *llp;
- struct sctstr sect;
- struct lndstr land;
- coord allx;
- coord ally;
- int first=1;
- s_char mess[128];
- int rel;
-
- *minmobp = 9876.0;
- *maxmobp = -9876.0;
- *togetherp = 1;
- for (qp = list->q_back; qp != list; qp = next) {
- next = qp->q_back;
- llp = (struct llist *) qp;
- getland(llp->land.lnd_uid, &land);
- if (land.lnd_own != actor) {
- mpr(actor, "%s was disbanded at %s\n",
- prland(&land),
- xyas(land.lnd_x, land.lnd_y, land.lnd_own));
- emp_remque((struct emp_qelem *)llp);
- free((s_char *)llp);
- continue;
- }
- if (land.lnd_ship >= 0) {
- lnd_mess("is on a ship", llp);
- continue;
- }
- if (land.lnd_land >= 0) {
- lnd_mess("is on a unit", llp);
- continue;
- }
- if (!getsect(land.lnd_x, land.lnd_y, §)) {
- lnd_mess("was sucked into the sky by a strange looking spaceland", llp); /* heh -KHS */
- continue;
- }
- if (!(lchr[(int)llp->land.lnd_type].l_flags & L_SPY) &&
- !(lchr[(int)llp->land.lnd_type].l_flags & L_TRAIN) &&
- lnd_getmil(&llp->land) == 0) {
- lnd_mess("has no mil on it to guide it", llp);
- continue;
- }
- rel = getrel(getnatp(sect.sct_own), player->cnum);
- if (sect.sct_own != land.lnd_own && rel != ALLIED &&
- !(lchr[(int)llp->land.lnd_type].l_flags & L_SPY) &&
- sect.sct_own) {
- sprintf(mess, "has been kidnapped by %s", cname(sect.sct_own));
- lnd_mess(mess, llp);
- continue;
- }
- if (first){
- allx = land.lnd_x;
- ally = land.lnd_y;
- first = 0;
- }
- if (land.lnd_x != allx ||
- land.lnd_y != ally)
- *togetherp = 0;
- if (land.lnd_mobil + 1 < (int)llp->mobil) {
- llp->mobil = (double)land.lnd_mobil;
- }
- if (llp->mobil < *minmobp)
- *minmobp = llp->mobil;
- if (llp->mobil > *maxmobp)
- *maxmobp = llp->mobil;
- bcopy((s_char *)&land, (s_char *)&llp->land,
- sizeof(struct lndstr));
+ struct emp_qelem *qp;
+ struct emp_qelem *next;
+ struct llist *llp;
+ struct sctstr sect;
+ struct lndstr land;
+ coord allx;
+ coord ally;
+ int first = 1;
+ s_char mess[128];
+ int rel;
+
+ *minmobp = 9876.0;
+ *maxmobp = -9876.0;
+ *togetherp = 1;
+ for (qp = list->q_back; qp != list; qp = next) {
+ next = qp->q_back;
+ llp = (struct llist *)qp;
+ getland(llp->land.lnd_uid, &land);
+ if (land.lnd_own != actor) {
+ mpr(actor, "%s was disbanded at %s\n",
+ prland(&land), xyas(land.lnd_x, land.lnd_y, land.lnd_own));
+ emp_remque((struct emp_qelem *)llp);
+ free((s_char *)llp);
+ continue;
+ }
+ if (land.lnd_ship >= 0) {
+ lnd_mess("is on a ship", llp);
+ continue;
+ }
+ if (land.lnd_land >= 0) {
+ lnd_mess("is on a unit", llp);
+ continue;
+ }
+ if (!getsect(land.lnd_x, land.lnd_y, §)) {
+ lnd_mess("was sucked into the sky by a strange looking spaceland", llp); /* heh -KHS */
+ continue;
+ }
+ if (!(lchr[(int)llp->land.lnd_type].l_flags & L_SPY) &&
+ !(lchr[(int)llp->land.lnd_type].l_flags & L_TRAIN) &&
+ lnd_getmil(&llp->land) == 0) {
+ lnd_mess("has no mil on it to guide it", llp);
+ continue;
}
+ rel = getrel(getnatp(sect.sct_own), player->cnum);
+ if (sect.sct_own != land.lnd_own && rel != ALLIED &&
+ !(lchr[(int)llp->land.lnd_type].l_flags & L_SPY) &&
+ sect.sct_own) {
+ sprintf(mess, "has been kidnapped by %s", cname(sect.sct_own));
+ lnd_mess(mess, llp);
+ continue;
+ }
+ if (first) {
+ allx = land.lnd_x;
+ ally = land.lnd_y;
+ first = 0;
+ }
+ if (land.lnd_x != allx || land.lnd_y != ally)
+ *togetherp = 0;
+ if (land.lnd_mobil + 1 < (int)llp->mobil) {
+ llp->mobil = (double)land.lnd_mobil;
+ }
+ if (llp->mobil < *minmobp)
+ *minmobp = llp->mobil;
+ if (llp->mobil > *maxmobp)
+ *maxmobp = llp->mobil;
+ bcopy((s_char *)&land, (s_char *)&llp->land,
+ sizeof(struct lndstr));
+ }
}
void
lnd_put(struct emp_qelem *list, natid actor)
{
- register struct emp_qelem *qp;
- register struct emp_qelem *newqp;
- struct llist *llp;
-
- qp = list->q_back;
- while (qp != list) {
- llp = (struct llist *) qp;
- if (actor) {
- mpr(actor, "%s stopped at %s\n", prland(&llp->land),
- xyas(llp->land.lnd_x, llp->land.lnd_y, llp->land.lnd_own));
- if (llp->mobil < -127)
- llp->mobil = -127;
- llp->land.lnd_mobil = llp->mobil;
- }
- putland(llp->land.lnd_uid, &llp->land);
- newqp = qp->q_back;
- emp_remque(qp);
- free((s_char *)qp);
- qp = newqp;
+ register struct emp_qelem *qp;
+ register struct emp_qelem *newqp;
+ struct llist *llp;
+
+ qp = list->q_back;
+ while (qp != list) {
+ llp = (struct llist *)qp;
+ if (actor) {
+ mpr(actor, "%s stopped at %s\n", prland(&llp->land),
+ xyas(llp->land.lnd_x, llp->land.lnd_y, llp->land.lnd_own));
+ if (llp->mobil < -127)
+ llp->mobil = -127;
+ llp->land.lnd_mobil = llp->mobil;
}
+ putland(llp->land.lnd_uid, &llp->land);
+ newqp = qp->q_back;
+ emp_remque(qp);
+ free((s_char *)qp);
+ qp = newqp;
+ }
}
void
-lnd_sweep(struct emp_qelem *land_list, int verbose, int takemob, natid actor)
+lnd_sweep(struct emp_qelem *land_list, int verbose, int takemob,
+ natid actor)
{
- struct emp_qelem *qp;
- struct emp_qelem *next;
- struct llist *llp;
- struct sctstr sect;
- int mines, m, max, sshells, lshells;
- double mobcost;
-
- for (qp=land_list->q_back;qp!=land_list;qp=next) {
- next = qp->q_back;
- llp = (struct llist *) qp;
- if (!(llp->lcp->l_flags & L_ENGINEER)) {
- if (verbose)
- mpr(actor, "%s is not an engineer!\n",
- prland(&llp->land));
- continue;
- }
- if (takemob && llp->mobil < 0.0) {
- if (verbose)
- lnd_mess("is out of mobility", llp);
- continue;
- }
- getsect(llp->land.lnd_x,llp->land.lnd_y,§);
- if (sect.sct_oldown == llp->land.lnd_own) {
- if (verbose)
- mpr(actor, "%s is in a sector completely owned by you. Don't bother digging up mines there!\n",
- prland(&llp->land));
- continue;
- }
- if (sect.sct_type == SCT_BSPAN) {
- if (verbose)
- mpr(actor, "%s is on a bridge. No mines there!\n", prland(&llp->land));
- continue;
- }
- if (takemob) {
+ struct emp_qelem *qp;
+ struct emp_qelem *next;
+ struct llist *llp;
+ struct sctstr sect;
+ int mines, m, max, sshells, lshells;
+ double mobcost;
+
+ for (qp = land_list->q_back; qp != land_list; qp = next) {
+ next = qp->q_back;
+ llp = (struct llist *)qp;
+ if (!(llp->lcp->l_flags & L_ENGINEER)) {
+ if (verbose)
+ mpr(actor, "%s is not an engineer!\n", prland(&llp->land));
+ continue;
+ }
+ if (takemob && llp->mobil < 0.0) {
+ if (verbose)
+ lnd_mess("is out of mobility", llp);
+ continue;
+ }
+ getsect(llp->land.lnd_x, llp->land.lnd_y, §);
+ if (sect.sct_oldown == llp->land.lnd_own) {
+ if (verbose)
+ mpr(actor,
+ "%s is in a sector completely owned by you. Don't bother digging up mines there!\n",
+ prland(&llp->land));
+ continue;
+ }
+ if (sect.sct_type == SCT_BSPAN) {
+ if (verbose)
+ mpr(actor, "%s is on a bridge. No mines there!\n",
+ prland(&llp->land));
+ continue;
+ }
+ if (takemob) {
/* mobcost = llp->land.lnd_effic * 0.01 * llp->lcp->l_spd;*/
- mobcost = llp->land.lnd_spd;
- mobcost = 480.0 / (mobcost +
- techfact(llp->land.lnd_tech,mobcost));
- llp->mobil -= mobcost;
- llp->land.lnd_mobil = (int)llp->mobil;
- }
- putland(llp->land.lnd_uid, &llp->land);
- if (!(mines=getvar(V_MINE,(s_char *)§,EF_SECTOR)))
- continue;
- max = vl_find(V_SHELL, llp->lcp->l_vtype,
- llp->lcp->l_vamt, (int)llp->lcp->l_nv);
- lshells = getvar(V_SHELL, (s_char *)&llp->land, EF_LAND);
- sshells = getvar(V_SHELL, (s_char *)§, EF_SECTOR);
- for (m=0; mines > 0 && m < max * 2; m++) {
- if (chance(0.5 * llp->lcp->l_att)) {
- mpr(actor, "Sweep...\n");
- mines--;
- if (lshells < max)
- ++lshells;
- else
- ++sshells;
- }
- }
- putvar(V_MINE, mines, (s_char *)§, EF_SECTOR);
- putvar(V_SHELL, lshells, (s_char *)&llp->land, EF_LAND);
- putvar(V_SHELL, sshells, (s_char *)§, EF_SECTOR);
- putland(llp->land.lnd_uid, &llp->land);
- putsect(§);
+ mobcost = llp->land.lnd_spd;
+ mobcost = 480.0 / (mobcost +
+ techfact(llp->land.lnd_tech, mobcost));
+ llp->mobil -= mobcost;
+ llp->land.lnd_mobil = (int)llp->mobil;
}
+ putland(llp->land.lnd_uid, &llp->land);
+ if (!(mines = getvar(V_MINE, (s_char *)§, EF_SECTOR)))
+ continue;
+ max = vl_find(V_SHELL, llp->lcp->l_vtype,
+ llp->lcp->l_vamt, (int)llp->lcp->l_nv);
+ lshells = getvar(V_SHELL, (s_char *)&llp->land, EF_LAND);
+ sshells = getvar(V_SHELL, (s_char *)§, EF_SECTOR);
+ for (m = 0; mines > 0 && m < max * 2; m++) {
+ if (chance(0.5 * llp->lcp->l_att)) {
+ mpr(actor, "Sweep...\n");
+ mines--;
+ if (lshells < max)
+ ++lshells;
+ else
+ ++sshells;
+ }
+ }
+ putvar(V_MINE, mines, (s_char *)§, EF_SECTOR);
+ putvar(V_SHELL, lshells, (s_char *)&llp->land, EF_LAND);
+ putvar(V_SHELL, sshells, (s_char *)§, EF_SECTOR);
+ putland(llp->land.lnd_uid, &llp->land);
+ putsect(§);
+ }
}
static int
contains_engineer(struct emp_qelem *list)
{
- struct emp_qelem *qp;
- struct emp_qelem *next;
- struct llist *llp;
-
- for (qp=list->q_back;qp!=list;qp=next) {
- next = qp->q_back;
- llp = (struct llist *) qp;
- if (llp->lcp->l_flags & L_ENGINEER)
- return 1;
- }
- return 0;
+ struct emp_qelem *qp;
+ struct emp_qelem *next;
+ struct llist *llp;
+
+ for (qp = list->q_back; qp != list; qp = next) {
+ next = qp->q_back;
+ llp = (struct llist *)qp;
+ if (llp->lcp->l_flags & L_ENGINEER)
+ return 1;
+ }
+ return 0;
}
int
lnd_check_mines(struct emp_qelem *land_list)
{
- struct emp_qelem *qp;
- struct emp_qelem *next;
- struct llist *llp;
- struct sctstr sect;
- int mines;
- int stopping = 0;
- int has_engineers = contains_engineer(land_list);
-
- for (qp=land_list->q_back;qp!=land_list;qp=next) {
- next = qp->q_back;
- llp = (struct llist *) qp;
- getsect(llp->land.lnd_x,llp->land.lnd_y,§);
- if (sect.sct_oldown == llp->land.lnd_own)
- continue;
- if (sect.sct_type == SCT_BSPAN)
- continue;
- if (!(mines=getvar(V_MINE,(s_char *)§,EF_SECTOR)))
- continue;
- if (chance(DMINE_LHITCHANCE(mines)/(1 + 2*has_engineers))) {
- lnd_hit_mine(&llp->land, llp->lcp);
- mines--;
- putvar(V_MINE,mines,(s_char *)§,EF_SECTOR);
- putsect(§);
- putland(llp->land.lnd_uid, (s_char *)&llp->land);
- if (!llp->land.lnd_own) {
- stopping = 1;
- emp_remque(qp);
- free((s_char *)qp);
- }
- }
+ struct emp_qelem *qp;
+ struct emp_qelem *next;
+ struct llist *llp;
+ struct sctstr sect;
+ int mines;
+ int stopping = 0;
+ int has_engineers = contains_engineer(land_list);
+
+ for (qp = land_list->q_back; qp != land_list; qp = next) {
+ next = qp->q_back;
+ llp = (struct llist *)qp;
+ getsect(llp->land.lnd_x, llp->land.lnd_y, §);
+ if (sect.sct_oldown == llp->land.lnd_own)
+ continue;
+ if (sect.sct_type == SCT_BSPAN)
+ continue;
+ if (!(mines = getvar(V_MINE, (s_char *)§, EF_SECTOR)))
+ continue;
+ if (chance(DMINE_LHITCHANCE(mines) / (1 + 2 * has_engineers))) {
+ lnd_hit_mine(&llp->land, llp->lcp);
+ mines--;
+ putvar(V_MINE, mines, (s_char *)§, EF_SECTOR);
+ putsect(§);
+ putland(llp->land.lnd_uid, (s_char *)&llp->land);
+ if (!llp->land.lnd_own) {
+ stopping = 1;
+ emp_remque(qp);
+ free((s_char *)qp);
+ }
}
- return stopping;
+ }
+ return stopping;
}
void
lnd_list(struct emp_qelem *land_list)
{
- struct emp_qelem *qp;
- struct emp_qelem *next;
- struct llist *llp;
- struct lndstr *lnd;
- int vec[I_MAX+1];
-
- pr("lnd# land type x,y a eff sh gun xl mu tech retr fuel\n");
-
- for (qp=land_list->q_back;qp!=land_list;qp=next) {
- next = qp->q_back;
- llp = (struct llist *) qp;
- lnd = &llp->land;
- pr("%4d ", lnd->lnd_uid);
- pr("%-16.16s ", llp->lcp->l_name);
- prxy("%4d,%-4d ", lnd->lnd_x, lnd->lnd_y, llp->land.lnd_own);
- pr("%1c", lnd->lnd_army);
- pr("%4d%%", lnd->lnd_effic);
- getvec(VT_ITEM, vec, (s_char *)lnd, EF_LAND);
- pr("%4d", vec[I_SHELL]);
- pr("%4d", vec[I_GUN]);
- count_land_planes(lnd);
- pr("%3d",lnd->lnd_nxlight);
- pr("%4d", lnd->lnd_mobil);
- pr("%4d", lnd->lnd_tech);
- pr("%4d%%", lnd->lnd_retreat);
- pr("%5d\n", lnd->lnd_fuel);
- }
+ struct emp_qelem *qp;
+ struct emp_qelem *next;
+ struct llist *llp;
+ struct lndstr *lnd;
+ int vec[I_MAX + 1];
+
+ pr("lnd# land type x,y a eff sh gun xl mu tech retr fuel\n");
+
+ for (qp = land_list->q_back; qp != land_list; qp = next) {
+ next = qp->q_back;
+ llp = (struct llist *)qp;
+ lnd = &llp->land;
+ pr("%4d ", lnd->lnd_uid);
+ pr("%-16.16s ", llp->lcp->l_name);
+ prxy("%4d,%-4d ", lnd->lnd_x, lnd->lnd_y, llp->land.lnd_own);
+ pr("%1c", lnd->lnd_army);
+ pr("%4d%%", lnd->lnd_effic);
+ getvec(VT_ITEM, vec, (s_char *)lnd, EF_LAND);
+ pr("%4d", vec[I_SHELL]);
+ pr("%4d", vec[I_GUN]);
+ count_land_planes(lnd);
+ pr("%3d", lnd->lnd_nxlight);
+ pr("%4d", lnd->lnd_mobil);
+ pr("%4d", lnd->lnd_tech);
+ pr("%4d%%", lnd->lnd_retreat);
+ pr("%5d\n", lnd->lnd_fuel);
+ }
}
-void
+void
lnd_mess(s_char *str, struct llist *llp)
{
- mpr(llp->land.lnd_own, "%s %s & stays in %s\n",
- prland(&llp->land),
- str, xyas(llp->land.lnd_x, llp->land.lnd_y, llp->land.lnd_own));
- if (llp->mobil < -127)
- llp->mobil = -127;
- llp->land.lnd_mobil = llp->mobil;
- putland(llp->land.lnd_uid, &llp->land);
- emp_remque((struct emp_qelem *)llp);
- free((s_char *)llp);
+ mpr(llp->land.lnd_own, "%s %s & stays in %s\n",
+ prland(&llp->land),
+ str, xyas(llp->land.lnd_x, llp->land.lnd_y, llp->land.lnd_own));
+ if (llp->mobil < -127)
+ llp->mobil = -127;
+ llp->land.lnd_mobil = llp->mobil;
+ putland(llp->land.lnd_uid, &llp->land);
+ emp_remque((struct emp_qelem *)llp);
+ free((s_char *)llp);
}
static int
lnd_count(struct emp_qelem *list)
{
- struct emp_qelem *qp;
- struct emp_qelem *next;
- struct llist *llp;
- int count = 0;
-
- for (qp = list->q_back; qp != list; qp = next) {
- next = qp->q_back;
- llp = (struct llist *) qp;
- ++count;
- }
- return count;
+ struct emp_qelem *qp;
+ struct emp_qelem *next;
+ struct llist *llp;
+ int count = 0;
+
+ for (qp = list->q_back; qp != list; qp = next) {
+ next = qp->q_back;
+ llp = (struct llist *)qp;
+ ++count;
+ }
+ return count;
}
static int
lnd_damage(struct emp_qelem *list, int totdam)
{
- struct emp_qelem *qp;
- struct emp_qelem *next;
- struct llist *llp;
- int dam;
- int count;
-
- if (!totdam || !(count = lnd_count(list)))
- return 0;
- dam = ldround(((double)totdam/(double)count),1);
- for (qp = list->q_back; qp != list; qp = next) {
- next = qp->q_back;
- llp = (struct llist *) qp;
- /* have to get it again because of collateral damage */
- getland(llp->land.lnd_uid, &llp->land);
- landdamage(&llp->land, dam);
- putland(llp->land.lnd_uid, &llp->land);
- if (!llp->land.lnd_own) {
- emp_remque(qp);
- free((s_char *)qp);
- }
+ struct emp_qelem *qp;
+ struct emp_qelem *next;
+ struct llist *llp;
+ int dam;
+ int count;
+
+ if (!totdam || !(count = lnd_count(list)))
+ return 0;
+ dam = ldround(((double)totdam / (double)count), 1);
+ for (qp = list->q_back; qp != list; qp = next) {
+ next = qp->q_back;
+ llp = (struct llist *)qp;
+ /* have to get it again because of collateral damage */
+ getland(llp->land.lnd_uid, &llp->land);
+ landdamage(&llp->land, dam);
+ putland(llp->land.lnd_uid, &llp->land);
+ if (!llp->land.lnd_own) {
+ emp_remque(qp);
+ free((s_char *)qp);
}
- return dam;
+ }
+ return dam;
}
-static int lnd_easiest_target(struct emp_qelem *list)
+static int
+lnd_easiest_target(struct emp_qelem *list)
{
- struct emp_qelem *qp;
- struct emp_qelem *next;
- struct llist *llp;
- int hard;
- int easiest = 9876; /* things start great for victim */
- int count = 0;
-
- for (qp = list->q_back; qp != list; qp = next) {
- next = qp->q_back;
- llp = (struct llist *) qp;
- hard = lnd_hardtarget(&llp->land);
- if (hard < easiest)
- easiest = hard; /* things get worse for victim */
- ++count;
- }
- return easiest - count;
+ struct emp_qelem *qp;
+ struct emp_qelem *next;
+ struct llist *llp;
+ int hard;
+ int easiest = 9876; /* things start great for victim */
+ int count = 0;
+
+ for (qp = list->q_back; qp != list; qp = next) {
+ next = qp->q_back;
+ llp = (struct llist *)qp;
+ hard = lnd_hardtarget(&llp->land);
+ if (hard < easiest)
+ easiest = hard; /* things get worse for victim */
+ ++count;
+ }
+ return easiest - count;
}
static int
-lnd_missile_interdiction(struct emp_qelem *list, coord newx, coord newy, natid victim)
+lnd_missile_interdiction(struct emp_qelem *list, coord newx, coord newy,
+ natid victim)
{
- int dam;
- struct emp_qelem msl_list, *qp, *newqp;
-
- msl_sel(&msl_list, newx, newy, victim, P_T, P_MAR, MI_INTERDICT);
-
- dam = msl_launch_mindam(&msl_list, newx, newy,
- lnd_easiest_target(list), EF_LAND,
- lnd_count(list) * 20, "troops", victim,
- MI_INTERDICT);
- if (dam) {
- mpr(victim, "missile interdiction mission does %d damage!\n", dam);
- collateral_damage(newx, newy, dam, 0);
- }
- qp = msl_list.q_forw;
- while(qp != msl_list.q_forw) {
- newqp=qp->q_forw;
- emp_remque(qp);
- free(qp);
- qp = newqp;
- }
- return dam;
+ int dam;
+ struct emp_qelem msl_list, *qp, *newqp;
+
+ msl_sel(&msl_list, newx, newy, victim, P_T, P_MAR, MI_INTERDICT);
+
+ dam = msl_launch_mindam(&msl_list, newx, newy,
+ lnd_easiest_target(list), EF_LAND,
+ lnd_count(list) * 20, "troops", victim,
+ MI_INTERDICT);
+ if (dam) {
+ mpr(victim, "missile interdiction mission does %d damage!\n", dam);
+ collateral_damage(newx, newy, dam, 0);
+ }
+ qp = msl_list.q_forw;
+ while (qp != msl_list.q_forw) {
+ newqp = qp->q_forw;
+ emp_remque(qp);
+ free(qp);
+ qp = newqp;
+ }
+ return dam;
}
#if 0
/* risner: allow forts to interdict land units. */
static int
lnd_fort_interdiction(struct emp_qelem *list,
- coord newx, coord newy, natid victim)
+ coord newx, coord newy, natid victim)
{
- extern int fort_max_interdiction_range;
- struct nstr_sect ns;
- struct sctstr fsect;
- int trange;
- double range, range2, guneff;
- int shell, gun;
- int dam;
- int totdam = 0;
- int i;
-
- snxtsct_dist(&ns, newx, newy, fort_max_interdiction_range);
- while (nxtsct(&ns,&fsect)) {
- if (fsect.sct_own == 0)
- continue;
- if (fsect.sct_own == victim)
- continue;
- if (fsect.sct_type != SCT_FORTR)
- continue;
- if (getrel(getnatp(fsect.sct_own), victim) >= NEUTRAL)
- continue;
- gun = getvar(V_GUN,(s_char *)&fsect,EF_SECTOR);
- if (gun < 1)
- continue;
- range = tfactfire(fsect.sct_own,(double)min(gun,7));
- if (fsect.sct_effic > 59)
- range++;
- range2 = roundrange(range);
- trange = mapdist(newx, newy,
- fsect.sct_x, fsect.sct_y);
- if (trange > range2)
- continue;
- if (getvar(V_MILIT,(s_char *)&fsect,EF_SECTOR)<5)
- continue;
- shell = getvar(V_SHELL,(s_char *)&fsect,EF_SECTOR);
- if (shell < 1)
- shell += supply_commod(fsect.sct_own,
- fsect.sct_x,fsect.sct_y,I_SHELL,
- 1);
- if (shell < 1)
- continue;
- shell--;
- putvar(V_SHELL, shell, (s_char *)&fsect, EF_SECTOR);
- putsect(&fsect);
- if (gun > 7)
- gun = 7;
- guneff = landgun((int)fsect.sct_effic, gun);
- dam = (int)guneff;
- totdam += dam;
- mpr(victim, "Incoming fire does %d damage!\n", dam);
- wu(0,fsect.sct_own,
- "%s fires at %s land units in %s for %d!\n",
- xyas(fsect.sct_x,fsect.sct_y,
- fsect.sct_own),
- cname(victim),
- xyas(newx,newy,fsect.sct_own), dam);
- nreport(fsect.sct_own, N_SCT_SHELL, victim, 1);
- }
- if (totdam > 0)
- return lnd_damage(list, totdam);
- return 0;
+ extern int fort_max_interdiction_range;
+ struct nstr_sect ns;
+ struct sctstr fsect;
+ int trange;
+ double range, range2, guneff;
+ int shell, gun;
+ int dam;
+ int totdam = 0;
+ int i;
+
+ snxtsct_dist(&ns, newx, newy, fort_max_interdiction_range);
+ while (nxtsct(&ns, &fsect)) {
+ if (fsect.sct_own == 0)
+ continue;
+ if (fsect.sct_own == victim)
+ continue;
+ if (fsect.sct_type != SCT_FORTR)
+ continue;
+ if (getrel(getnatp(fsect.sct_own), victim) >= NEUTRAL)
+ continue;
+ gun = getvar(V_GUN, (s_char *)&fsect, EF_SECTOR);
+ if (gun < 1)
+ continue;
+ range = tfactfire(fsect.sct_own, (double)min(gun, 7));
+ if (fsect.sct_effic > 59)
+ range++;
+ range2 = roundrange(range);
+ trange = mapdist(newx, newy, fsect.sct_x, fsect.sct_y);
+ if (trange > range2)
+ continue;
+ if (getvar(V_MILIT, (s_char *)&fsect, EF_SECTOR) < 5)
+ continue;
+ shell = getvar(V_SHELL, (s_char *)&fsect, EF_SECTOR);
+ if (shell < 1)
+ shell += supply_commod(fsect.sct_own,
+ fsect.sct_x, fsect.sct_y, I_SHELL, 1);
+ if (shell < 1)
+ continue;
+ shell--;
+ putvar(V_SHELL, shell, (s_char *)&fsect, EF_SECTOR);
+ putsect(&fsect);
+ if (gun > 7)
+ gun = 7;
+ guneff = landgun((int)fsect.sct_effic, gun);
+ dam = (int)guneff;
+ totdam += dam;
+ mpr(victim, "Incoming fire does %d damage!\n", dam);
+ wu(0, fsect.sct_own,
+ "%s fires at %s land units in %s for %d!\n",
+ xyas(fsect.sct_x, fsect.sct_y,
+ fsect.sct_own),
+ cname(victim), xyas(newx, newy, fsect.sct_own), dam);
+ nreport(fsect.sct_own, N_SCT_SHELL, victim, 1);
+ }
+ if (totdam > 0)
+ return lnd_damage(list, totdam);
+ return 0;
}
#endif
int
lnd_interdict(struct emp_qelem *list, coord newx, coord newy, natid victim)
{
- int stopping = 0;
+ int stopping = 0;
#if 0
- if (!opt_NO_FORT_FIRE)
+ if (!opt_NO_FORT_FIRE)
/* Steve M. - commented out for now until abuse is decided upon */
- stopping |= lnd_fort_interdiction(list, newx, newy, victim);
+ stopping |= lnd_fort_interdiction(list, newx, newy, victim);
#endif
- stopping |= lnd_damage(list, unit_interdict(newx,newy,victim,"land units", lnd_easiest_target(list), MI_INTERDICT));
+ stopping |=
+ lnd_damage(list,
+ unit_interdict(newx, newy, victim, "land units",
+ lnd_easiest_target(list), MI_INTERDICT));
- stopping |= lnd_damage(list, lnd_missile_interdiction(list,newx,newy,victim));
- return stopping;
+ stopping |=
+ lnd_damage(list,
+ lnd_missile_interdiction(list, newx, newy, victim));
+ return stopping;
}
/* high value of hardtarget is harder to hit */
int
lnd_hardtarget(struct lndstr *lp)
{
- struct sctstr sect;
+ struct sctstr sect;
- getsect(lp->lnd_x, lp->lnd_y, §);
- return (int)(((double)lp->lnd_effic/100.0) *
- (10 + dchr[sect.sct_type].d_dstr * 2 +
- (double)lp->lnd_spd/2.0 - lp->lnd_vis));
+ getsect(lp->lnd_x, lp->lnd_y, §);
+ return (int)(((double)lp->lnd_effic / 100.0) *
+ (10 + dchr[sect.sct_type].d_dstr * 2 +
+ (double)lp->lnd_spd / 2.0 - lp->lnd_vis));
}
int
lnd_hit_mine(struct lndstr *lp, struct lchrstr *lcp)
{
- double m;
+ double m;
- mpr(lp->lnd_own, "Blammo! Landmines detected in %s! ",
- xyas(lp->lnd_x, lp->lnd_y, lp->lnd_own));
+ mpr(lp->lnd_own, "Blammo! Landmines detected in %s! ",
+ xyas(lp->lnd_x, lp->lnd_y, lp->lnd_own));
- nreport(lp->lnd_own, N_LHIT_MINE, 0, 1);
+ nreport(lp->lnd_own, N_LHIT_MINE, 0, 1);
- m = roll(20) + 10;
- if (lcp->l_flags & L_ENGINEER)
- m /= 2.0;
+ m = roll(20) + 10;
+ if (lcp->l_flags & L_ENGINEER)
+ m /= 2.0;
- landdamage(lp, ldround(m,1));
+ landdamage(lp, ldround(m, 1));
- return (int)m;
+ return (int)m;
}
double
lnd_mobcost(struct lndstr *lp, struct sctstr *sp, int mobtype)
{
- double mobcost;
- double smobcost;
-
- /* supply unit's speed depends on their eff, since
- that is their purpose */
- if (lchr[(int)lp->lnd_type].l_flags & L_SUPPLY)
- mobcost = lp->lnd_effic * 0.01 * lp->lnd_spd;
- else
- mobcost = lp->lnd_spd;
- if (mobcost < 0.01)
- mobcost = 0.01;
+ double mobcost;
+ double smobcost;
+
+ /* supply unit's speed depends on their eff, since
+ that is their purpose */
+ if (lchr[(int)lp->lnd_type].l_flags & L_SUPPLY)
+ mobcost = lp->lnd_effic * 0.01 * lp->lnd_spd;
+ else
+ mobcost = lp->lnd_spd;
+ if (mobcost < 0.01)
+ mobcost = 0.01;
/* sector_mcost now takes 2 different arguments, a sector pointer, and
whether or not to figure in the highway bonus, rail bonus or none.
bridge heads, bridges and highways have built-in highways bonus
because they are a 1, and this will discount that. */
- smobcost = (double)sector_mcost(sp, mobtype);
- if (smobcost < 0.01)
- smobcost = 0.01;
+ smobcost = (double)sector_mcost(sp, mobtype);
+ if (smobcost < 0.01)
+ smobcost = 0.01;
/* marching through 0 mobility conquered sectors takes lots of mobility,
unless you are a train. Capturing railways is a good thing. */
- if (sp->sct_own != sp->sct_oldown && sp->sct_mobil <= 0 &&
- smobcost < LND_MINMOBCOST && mobtype != MOB_RAIL)
- smobcost = LND_MINMOBCOST;
+ if (sp->sct_own != sp->sct_oldown && sp->sct_mobil <= 0 &&
+ smobcost < LND_MINMOBCOST && mobtype != MOB_RAIL)
+ smobcost = LND_MINMOBCOST;
- mobcost = smobcost * 5.0 * 480.0 /
- (mobcost + techfact(lp->lnd_tech, mobcost));
+ mobcost = smobcost * 5.0 * 480.0 /
+ (mobcost + techfact(lp->lnd_tech, mobcost));
- return mobcost;
+ return mobcost;
}
int
-lnd_mar_one_sector(struct emp_qelem *list, int dir, natid actor, int together)
+lnd_mar_one_sector(struct emp_qelem *list, int dir, natid actor,
+ int together)
{
- struct sctstr sect, osect;
- struct emp_qelem *qp;
- struct emp_qelem *qp2;
- struct emp_qelem *next;
- struct llist *llp;
- coord dx;
- coord dy;
- coord newx;
- coord newy;
- int stopping = 0;
- int visible = 0;
- int stop;
- s_char dp[80];
- int rel;
- double odds;
- int oldown;
-
- if (dir <= DIR_STOP || dir >= DIR_VIEW) {
- lnd_put(list, actor);
+ struct sctstr sect, osect;
+ struct emp_qelem *qp;
+ struct emp_qelem *qp2;
+ struct emp_qelem *next;
+ struct llist *llp;
+ coord dx;
+ coord dy;
+ coord newx;
+ coord newy;
+ int stopping = 0;
+ int visible = 0;
+ int stop;
+ s_char dp[80];
+ int rel;
+ double odds;
+ int oldown;
+
+ if (dir <= DIR_STOP || dir >= DIR_VIEW) {
+ lnd_put(list, actor);
+ return 1;
+ }
+ dx = diroff[dir][0];
+ dy = diroff[dir][1];
+ for (qp = list->q_back; qp != list; qp = next) {
+ next = qp->q_back;
+ llp = (struct llist *)qp;
+ getsect(llp->land.lnd_x, llp->land.lnd_y, &osect);
+ oldown = osect.sct_own;
+ newx = xnorm(llp->land.lnd_x + dx);
+ newy = ynorm(llp->land.lnd_y + dy);
+ getsect(newx, newy, §);
+ rel = getrel(getnatp(sect.sct_own), player->cnum);
+ if ((sect.sct_own != actor && rel != ALLIED &&
+ !(lchr[(int)llp->land.lnd_type].l_flags & L_SPY) &&
+ sect.sct_own) || (sect.sct_type == SCT_WATER ||
+ sect.sct_type == SCT_SANCT ||
+ sect.sct_type == SCT_WASTE)) {
+ if (together) {
+ pr("can't go to %s\n", xyas(newx, newy, actor));
return 1;
+ } else {
+ sprintf(dp, "can't go to %s", xyas(newx, newy, actor));
+ lnd_mess(dp, llp);
+ continue;
+ }
}
- dx = diroff[dir][0];
- dy = diroff[dir][1];
- for (qp=list->q_back;qp!=list;qp=next) {
- next = qp->q_back;
- llp = (struct llist *)qp;
- getsect(llp->land.lnd_x, llp->land.lnd_y, &osect);
- oldown = osect.sct_own;
- newx = xnorm(llp->land.lnd_x + dx);
- newy = ynorm(llp->land.lnd_y + dy);
- getsect(newx, newy, §);
- rel = getrel(getnatp(sect.sct_own), player->cnum);
- if ((sect.sct_own != actor && rel != ALLIED &&
- !(lchr[(int)llp->land.lnd_type].l_flags & L_SPY) &&
- sect.sct_own) || (sect.sct_type == SCT_WATER ||
- sect.sct_type == SCT_SANCT ||
- sect.sct_type == SCT_WASTE)) {
- if (together) {
- pr("can't go to %s\n",xyas(newx, newy, actor));
- return 1;
- } else {
- sprintf(dp, "can't go to %s",
- xyas(newx, newy, actor));
- lnd_mess(dp, llp);
- continue;
- }
- }
- if (!(lchr[(int)llp->land.lnd_type].l_flags & L_SPY)) visible = 1;
- if (sect.sct_rail == 0 &&
- lchr[(int)llp->land.lnd_type].l_flags & L_TRAIN) {
- if (together) {
- pr("no rail system in %s\n",xyas(newx, newy, actor));
- return 1;
- } else {
- sprintf(dp, "has no rail system in %s",
- xyas(newx, newy, actor));
- lnd_mess(dp, llp);
- continue;
- }
- }
- /* Note we check would_abandon first because we don't want
- to always have to do these checks */
- if (would_abandon(&osect, V_CIVIL, 0, &(llp->land))) {
- stop = 0;
- if (!want_to_abandon(&osect, V_CIVIL, 0, &(llp->land))) {
- stop = 1;
- }
- /* now check stuff */
- if (!check_sect_ok(§))
- return 1;
- if (!check_sect_ok(&osect))
- return 1;
- for (qp2 = list->q_back; qp2 != list; qp2 = qp2->q_back) {
- if (!check_land_ok(&(((struct llist *)qp2)->land)))
- return 1;
- }
- if (stop) {
- lnd_mess("stops", llp);
- continue;
- }
- }
- if (llp->mobil <= 0.0) {
- lnd_mess("is out of mobility", llp);
- continue;
- }
- llp->land.lnd_x = newx;
- llp->land.lnd_y = newy;
- if (lchr[(int)llp->land.lnd_type].l_flags & L_TRAIN) {
- llp->mobil -= lnd_mobcost(&llp->land, §, MOB_RAIL);
- } else {
- llp->mobil -= lnd_mobcost(&llp->land, §, MOB_ROAD);
- }
- llp->land.lnd_mobil = (int)llp->mobil;
- putland(llp->land.lnd_uid, &llp->land);
- putsect(&osect);
- getsect(osect.sct_x, osect.sct_y, &osect);
- if (osect.sct_own != oldown && oldown == player->cnum) {
- /* It was your sector, now it's not. Simple :) */
- pr("You no longer own %s\n",
- xyas(osect.sct_x, osect.sct_y, player->cnum));
- }
- if (rel != ALLIED && sect.sct_own != actor && sect.sct_own) { /* must be a spy */
- /* Always a 10% chance of getting caught. */
- odds = (100 - llp->land.lnd_effic) + .10;
- if (chance(odds)) {
- if (rel == NEUTRAL || rel == FRIENDLY) {
- wu(0, sect.sct_own,
- "%s unit spotted in %s\n", cname(player->cnum),
- xyas(sect.sct_x, sect.sct_y, sect.sct_own));
- setrel(sect.sct_own, llp->land.lnd_own, HOSTILE);
- } else if (rel == HOSTILE || rel == AT_WAR ||
- rel == SITZKRIEG || rel == MOBILIZATION) {
- wu(0, sect.sct_own,
- "%s spy shot in %s\n", cname(player->cnum),
- xyas(sect.sct_x, sect.sct_y, sect.sct_own));
- pr("%s was shot and killed.\n", prland(&llp->land));
- llp->land.lnd_effic = 0;
- putland(llp->land.lnd_uid, &llp->land);
- lnd_delete(llp, 0);
- }
- }
+ if (!(lchr[(int)llp->land.lnd_type].l_flags & L_SPY))
+ visible = 1;
+ if (sect.sct_rail == 0 &&
+ lchr[(int)llp->land.lnd_type].l_flags & L_TRAIN) {
+ if (together) {
+ pr("no rail system in %s\n", xyas(newx, newy, actor));
+ return 1;
+ } else {
+ sprintf(dp, "has no rail system in %s",
+ xyas(newx, newy, actor));
+ lnd_mess(dp, llp);
+ continue;
+ }
+ }
+ /* Note we check would_abandon first because we don't want
+ to always have to do these checks */
+ if (would_abandon(&osect, V_CIVIL, 0, &(llp->land))) {
+ stop = 0;
+ if (!want_to_abandon(&osect, V_CIVIL, 0, &(llp->land))) {
+ stop = 1;
+ }
+ /* now check stuff */
+ if (!check_sect_ok(§))
+ return 1;
+ if (!check_sect_ok(&osect))
+ return 1;
+ for (qp2 = list->q_back; qp2 != list; qp2 = qp2->q_back) {
+ if (!check_land_ok(&(((struct llist *)qp2)->land)))
+ return 1;
+ }
+ if (stop) {
+ lnd_mess("stops", llp);
+ continue;
+ }
+ }
+ if (llp->mobil <= 0.0) {
+ lnd_mess("is out of mobility", llp);
+ continue;
+ }
+ llp->land.lnd_x = newx;
+ llp->land.lnd_y = newy;
+ if (lchr[(int)llp->land.lnd_type].l_flags & L_TRAIN) {
+ llp->mobil -= lnd_mobcost(&llp->land, §, MOB_RAIL);
+ } else {
+ llp->mobil -= lnd_mobcost(&llp->land, §, MOB_ROAD);
+ }
+ llp->land.lnd_mobil = (int)llp->mobil;
+ putland(llp->land.lnd_uid, &llp->land);
+ putsect(&osect);
+ getsect(osect.sct_x, osect.sct_y, &osect);
+ if (osect.sct_own != oldown && oldown == player->cnum) {
+ /* It was your sector, now it's not. Simple :) */
+ pr("You no longer own %s\n",
+ xyas(osect.sct_x, osect.sct_y, player->cnum));
+ }
+ if (rel != ALLIED && sect.sct_own != actor && sect.sct_own) { /* must be a spy */
+ /* Always a 10% chance of getting caught. */
+ odds = (100 - llp->land.lnd_effic) + .10;
+ if (chance(odds)) {
+ if (rel == NEUTRAL || rel == FRIENDLY) {
+ wu(0, sect.sct_own,
+ "%s unit spotted in %s\n", cname(player->cnum),
+ xyas(sect.sct_x, sect.sct_y, sect.sct_own));
+ setrel(sect.sct_own, llp->land.lnd_own, HOSTILE);
+ } else if (rel == HOSTILE || rel == AT_WAR ||
+ rel == SITZKRIEG || rel == MOBILIZATION) {
+ wu(0, sect.sct_own,
+ "%s spy shot in %s\n", cname(player->cnum),
+ xyas(sect.sct_x, sect.sct_y, sect.sct_own));
+ pr("%s was shot and killed.\n", prland(&llp->land));
+ llp->land.lnd_effic = 0;
+ putland(llp->land.lnd_uid, &llp->land);
+ lnd_delete(llp, 0);
}
+ }
}
- if (QEMPTY(list))
- return stopping;
- lnd_sweep(list, 0, 1, actor);
- stopping |= lnd_check_mines(list);
- if (QEMPTY(list))
- return stopping;
- if (visible) stopping |= lnd_interdict(list, newx, newy, actor);
+ }
+ if (QEMPTY(list))
+ return stopping;
+ lnd_sweep(list, 0, 1, actor);
+ stopping |= lnd_check_mines(list);
+ if (QEMPTY(list))
return stopping;
+ if (visible)
+ stopping |= lnd_interdict(list, newx, newy, actor);
+ return stopping;
}
/*
int
lnd_support(natid victim, natid attacker, coord x, coord y)
{
- struct nstr_item ni;
- struct lndstr land;
- int rel, rel2;
- double dam = 0.0;
- int dist;
- int shell;
- int gun;
- double range, range2;
-
- snxtitem_all(&ni,EF_LAND);
- while(nxtitem(&ni,(s_char *)&land)){
- if (land.lnd_frg == 0)
- continue;
- if ((land.lnd_x == x) && (land.lnd_y == y))
- continue;
- if (land.lnd_ship >= 0)
- continue;
- if (land.lnd_land >= 0)
- continue;
- if (land.lnd_mission > 0)
- continue;
- if (land.lnd_effic < LAND_MINFIREEFF)
- continue;
- /* Do we have mil? */
- if (getvar(V_MILIT, (s_char *)&land, EF_LAND) <= 0)
- continue;
- rel = getrel(getnatp(land.lnd_own),attacker);
- rel2 = getrel(getnatp(land.lnd_own),victim);
- if ((land.lnd_own != attacker) &&
- ((rel != ALLIED) || (rel2 != AT_WAR)))
- continue;
-
- /* do we have supplies? */
- if (!has_supply(&land))
- continue;
-
- /* are we in range? */
- dist=mapdist(land.lnd_x,land.lnd_y,x,y);
-
- range=techfact((int)land.lnd_tech,
- (double)land.lnd_frg / 2.0);
-
- range2=roundrange(range);
- if (dist>range2)
- continue;
-
- shell = getvar(V_SHELL, (s_char *)&land, EF_LAND);
- gun = getvar(V_GUN, (s_char *)&land, EF_LAND);
-
- if (shell == 0 || gun == 0)
- continue;
-
- use_supply(&land);
- nreport(land.lnd_own,N_FIRE_L_ATTACK,victim,1);
- if (roll(100) < land.lnd_acc){
- dam += landunitgun(land.lnd_effic, land.lnd_dam, gun,
- land.lnd_ammo, shell) / 2;
- } else {
- dam += landunitgun(land.lnd_effic, land.lnd_dam, gun,
- land.lnd_ammo, shell);
- }
- if (land.lnd_own != attacker)
- wu(0,land.lnd_own,
- "%s supported %s at %s\n",
- prland(&land),
- cname(attacker),xyas(x,y,land.lnd_own));
+ struct nstr_item ni;
+ struct lndstr land;
+ int rel, rel2;
+ double dam = 0.0;
+ int dist;
+ int shell;
+ int gun;
+ double range, range2;
+
+ snxtitem_all(&ni, EF_LAND);
+ while (nxtitem(&ni, (s_char *)&land)) {
+ if (land.lnd_frg == 0)
+ continue;
+ if ((land.lnd_x == x) && (land.lnd_y == y))
+ continue;
+ if (land.lnd_ship >= 0)
+ continue;
+ if (land.lnd_land >= 0)
+ continue;
+ if (land.lnd_mission > 0)
+ continue;
+ if (land.lnd_effic < LAND_MINFIREEFF)
+ continue;
+ /* Do we have mil? */
+ if (getvar(V_MILIT, (s_char *)&land, EF_LAND) <= 0)
+ continue;
+ rel = getrel(getnatp(land.lnd_own), attacker);
+ rel2 = getrel(getnatp(land.lnd_own), victim);
+ if ((land.lnd_own != attacker) &&
+ ((rel != ALLIED) || (rel2 != AT_WAR)))
+ continue;
+
+ /* do we have supplies? */
+ if (!has_supply(&land))
+ continue;
+
+ /* are we in range? */
+ dist = mapdist(land.lnd_x, land.lnd_y, x, y);
+
+ range = techfact((int)land.lnd_tech, (double)land.lnd_frg / 2.0);
+
+ range2 = roundrange(range);
+ if (dist > range2)
+ continue;
+
+ shell = getvar(V_SHELL, (s_char *)&land, EF_LAND);
+ gun = getvar(V_GUN, (s_char *)&land, EF_LAND);
+
+ if (shell == 0 || gun == 0)
+ continue;
+
+ use_supply(&land);
+ nreport(land.lnd_own, N_FIRE_L_ATTACK, victim, 1);
+ if (roll(100) < land.lnd_acc) {
+ dam += landunitgun(land.lnd_effic, land.lnd_dam, gun,
+ land.lnd_ammo, shell) / 2;
+ } else {
+ dam += landunitgun(land.lnd_effic, land.lnd_dam, gun,
+ land.lnd_ammo, shell);
}
- return (int)dam;
+ if (land.lnd_own != attacker)
+ wu(0, land.lnd_own,
+ "%s supported %s at %s\n",
+ prland(&land), cname(attacker), xyas(x, y, land.lnd_own));
+ }
+ return (int)dam;
}
s_char *
lnd_path(int together, struct lndstr *lp, s_char *buf)
{
- coord destx;
- coord desty;
- struct sctstr d_sect, sect;
- s_char *cp;
- double dummy;
-
- if (!sarg_xy(buf, &destx, &desty))
- return 0;
- if (!together){
- pr("Cannot go to a destination sector if not all starting in the same sector\n");
- return 0;
- }
- if (!getsect(destx, desty, &d_sect)) {
- pr("%d,%d is not a sector\n", destx, desty);
- return 0;
- }
- getsect(lp->lnd_x, lp->lnd_y, §);
- if (lchr[(int)lp->lnd_type].l_flags & L_TRAIN)
- cp = (s_char *)BestLandPath(buf, §, &d_sect, &dummy, MOB_RAIL);
- else
- cp = (s_char *)BestLandPath(buf, §, &d_sect, &dummy, MOB_ROAD);
- if (!cp) {
- pr("No owned path from %s to %s!\n",
- xyas(lp->lnd_x,lp->lnd_y,player->cnum),
- xyas(d_sect.sct_x,d_sect.sct_y,player->cnum));
- return 0;
- }
- pr("Using path '%s'\n",cp);
- return cp;
+ coord destx;
+ coord desty;
+ struct sctstr d_sect, sect;
+ s_char *cp;
+ double dummy;
+
+ if (!sarg_xy(buf, &destx, &desty))
+ return 0;
+ if (!together) {
+ pr("Cannot go to a destination sector if not all starting in the same sector\n");
+ return 0;
+ }
+ if (!getsect(destx, desty, &d_sect)) {
+ pr("%d,%d is not a sector\n", destx, desty);
+ return 0;
+ }
+ getsect(lp->lnd_x, lp->lnd_y, §);
+ if (lchr[(int)lp->lnd_type].l_flags & L_TRAIN)
+ cp = (s_char *)BestLandPath(buf, §, &d_sect, &dummy, MOB_RAIL);
+ else
+ cp = (s_char *)BestLandPath(buf, §, &d_sect, &dummy, MOB_ROAD);
+ if (!cp) {
+ pr("No owned path from %s to %s!\n",
+ xyas(lp->lnd_x, lp->lnd_y, player->cnum),
+ xyas(d_sect.sct_x, d_sect.sct_y, player->cnum));
+ return 0;
+ }
+ pr("Using path '%s'\n", cp);
+ return cp;
}
int
lnd_can_attack(struct lndstr *lp)
{
- struct lchrstr *lcp = &lchr[(int)lp->lnd_type];
-
+ struct lchrstr *lcp = &lchr[(int)lp->lnd_type];
+
/* if (lcp->l_flags & L_SUPPLY ||
lcp->l_flags & L_SECURITY ||
lcp->l_flags & L_FLAK ||
lcp->l_frg)
return 0; */
- if (lcp->l_flags & L_SUPPLY)
- return 0;
+ if (lcp->l_flags & L_SUPPLY)
+ return 0;
- return 1;
+ return 1;
}