/*
* Empire - A multi-player, client/server Internet based war game.
- * Copyright (C) 1986-2006, Dave Pare, Jeff Bailey, Thomas Ruschak,
- * Ken Stevens, Steve McClure
+ * Copyright (C) 1986-2011, Dave Pare, Jeff Bailey, Thomas Ruschak,
+ * Ken Stevens, Steve McClure, Markus Armbruster
*
- * This program is free software; you can redistribute it and/or modify
+ * Empire is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
+ * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* ---
*
* ---
*
* retreat.c: Retreat subroutines
- *
+ *
* Known contributors to this file:
* Steve McClure, 2000
*/
#include <config.h>
-#include <string.h>
+#include "damage.h"
+#include "file.h"
+#include "land.h"
+#include "map.h"
#include "misc.h"
-#include "player.h"
#include "nat.h"
-#include "retreat.h"
-#include "ship.h"
-#include "land.h"
-#include "sect.h"
#include "news.h"
-#include "xy.h"
#include "nsc.h"
+#include "optlist.h"
#include "path.h"
-#include "file.h"
-#include "damage.h"
#include "prototypes.h"
-#include "optlist.h"
+#include "retreat.h"
+#include "sect.h"
+#include "ship.h"
+#include "xy.h"
static int findcondition(char);
static int retreat_land1(struct lndstr *, char, int);
char *desc[2];
};
-struct ccode conditions[] = {
+static struct ccode conditions[] = {
{ 'i', { "retreated with a damaged friend",
"was damaged" } },
{ 't', { "retreated with a torpedoed ship",
if (sp->shp_own == 0)
return 0;
- n = 0;
if (sp->shp_effic < SHIP_MINEFF) {
wu(0, sp->shp_own,
"%s %s,\nbut it died in the attack, and so couldn't retreat!\n",
return 0;
}
- n = (-1 * MAX_RETREAT);
+ n = -MAX_RETREAT;
stopping = 0;
while (!stopping && n) {
dx = dy = 0;
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 ||
- (sect.sct_own && sect.sct_own != sp->shp_own &&
- getrel(getnatp(sect.sct_own), sp->shp_own) < FRIENDLY)) {
+ (sect.sct_own
+ && relations_with(sect.sct_own, sp->shp_own) < FRIENDLY)) {
wu(0, sp->shp_own, "%s %s,\nbut could not retreat to %s!\n",
prship(sp), conditions[findcondition(code)].desc[orig],
xyas(newx, newy, sp->shp_own));
mines = sect.sct_mines;
changed = 0;
- if ((mcp->m_flags & M_SWEEP) && sect.sct_type == SCT_WATER) {
- sp->shp_mobil -= mobcost;
+ if (sect.sct_type != SCT_WATER || mines <= 0)
+ continue;
+ if (mcp->m_flags & M_SWEEP) {
max = mcp->m_item[I_SHELL];
shells = sp->shp_item[I_SHELL];
for (m = 0; mines > 0 && m < 5; m++) {
if (sect.sct_mines != mines) {
wu(0, sp->shp_own,
"%s cleared %d mine%s in %s while retreating\n",
- prship(sp), sect.sct_mines-mines, splur(sect.sct_mines-mines),
+ prship(sp), sect.sct_mines - mines,
+ splur(sect.sct_mines - mines),
xyas(newx, newy, sp->shp_own));
sect.sct_mines = mines;
sp->shp_item[I_SHELL] = shells;
if (changed)
writemap(sp->shp_own);
}
- if (sect.sct_type == SCT_WATER && mines > 0
- && chance(DMINE_HITCHANCE(mines))) {
+ if (chance(DMINE_HITCHANCE(mines))) {
wu(0, sp->shp_own,
"%s %s,\nand hit a mine in %s while retreating!\n",
prship(sp), conditions[findcondition(code)].desc[orig],
}
if (orig) {
- wu(0, sp->shp_own, "%s %s, and retreated to %s\n", prship(sp),
- conditions[findcondition(code)].desc[orig],
+ wu(0, sp->shp_own, "%s %s, and retreated to %s\n",
+ prship(sp), conditions[findcondition(code)].desc[orig],
xyas(sp->shp_x, sp->shp_y, sp->shp_own));
} else {
wu(0, sp->shp_own, "%s %s, and ended up at %s\n",
if (lp->lnd_own == 0)
return 0;
- n = 0;
if (lp->lnd_effic < LAND_MINEFF) {
wu(0, lp->lnd_own,
"%s %s,\nbut it died in the attack, and so couldn't retreat!\n",
return 0;
}
- n = (-1 * MAX_RETREAT);
+ n = -MAX_RETREAT;
stopping = 0;
while (!stopping && n) {
dx = dy = 0;
newy = ynorm(lp->lnd_y + dy);
getsect(newx, newy, §);
- if ((sect.sct_type == SCT_WATER) ||
- (sect.sct_type == SCT_MOUNT) ||
- (sect.sct_type == SCT_SANCT) ||
- (sect.sct_type == SCT_WASTE) ||
- (sect.sct_own != lp->lnd_own)) {
+ mobcost = lnd_mobcost(lp, §);
+ if (mobcost < 0
+ || sect.sct_type == SCT_MOUNT
+ || sect.sct_own != lp->lnd_own) {
wu(0, lp->lnd_own, "%s %s,\nbut could not retreat to %s!\n",
prland(lp),
conditions[findcondition(code)].desc[orig],
putland(lp->lnd_uid, lp);
return 0;
}
- mobcost = lnd_mobcost(lp, §, MOB_ROAD);
lp->lnd_x = newx;
lp->lnd_y = newy;
lp->lnd_mobil -= mobcost;
if (stopping)
continue;
- mines = sect.sct_mines;
- if ((lcp->l_flags & L_ENGINEER) && mines > 0 &&
- (sect.sct_oldown != lp->lnd_own)) {
+ mines = SCT_LANDMINES(§);
+ if (mines <= 0 || sect.sct_oldown == lp->lnd_own)
+ continue;
+ if (lcp->l_flags & L_ENGINEER) {
max = lcp->l_item[I_SHELL];
shells = lp->lnd_item[I_SHELL];
for (m = 0; mines > 0 && m < 5; m++) {
lp->lnd_item[I_SHELL] = shells;
putsect(§);
}
- if (mines > 0 && (sect.sct_oldown != lp->lnd_own) &&
- chance(DMINE_LHITCHANCE(mines))) {
+ if (chance(DMINE_LHITCHANCE(mines))) {
wu(0, lp->lnd_own,
"%s %s,\nand hit a mine in %s while retreating!\n",
prland(lp),
xyas(newx, newy, lp->lnd_own));
nreport(lp->lnd_own, N_LHIT_MINE, 0, 1);
m = MINE_LDAMAGE();
+ if (lcp->l_flags & L_ENGINEER)
+ m /= 2;
landdamage(lp, m);
mines--;
sect.sct_mines = mines;