/*
* Empire - A multi-player, client/server Internet based war game.
- * Copyright (C) 1986-2000, Dave Pare, Jeff Bailey, Thomas Ruschak,
- * Ken Stevens, Steve McClure
+ * Copyright (C) 1986-2020, 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/>.
*
* ---
*
- * See the "LEGAL", "LICENSE", "CREDITS" and "README" files for all the
- * related information and legal notices. It is expected that any future
- * projects/authors will amend these files as needed.
+ * See files README, COPYING and CREDITS in the root of the source
+ * tree for related information and legal notices. It is expected
+ * that future projects/authors will amend these files as needed.
*
* ---
*
* boar.c: Board an enemy ship
- *
+ *
* Known contributors to this file:
* Ken Stevens, 1995
+ * Markus Armbruster, 2011-2015
*/
-#include <math.h>
-#include "misc.h"
-#include "player.h"
-#include "file.h"
-#include "var.h"
-#include "sect.h"
-#include "path.h"
-#include "news.h"
-#include "treaty.h"
-#include "nat.h"
-#include "xy.h"
-#include "land.h"
-#include "nsc.h"
-#include "mission.h"
-#include "ship.h"
+#include <config.h>
+
#include "combat.h"
-#include "retreat.h"
#include "commands.h"
+#include "land.h"
+#include "retreat.h"
+#include "ship.h"
int
boar(void)
struct sctstr sect;
struct lndstr land;
struct nstr_item ni;
- int foundland;
- s_char *p;
- s_char buf[1024];
+ int foundland, def_uid;
+ natid def_own;
+ char *p;
+ char buf[1024];
att_combat_init(def, EF_SHIP);
/*
*/
/* What are we boarding? */
-
- if (!(p = getstarg(player->argp[1], "Victim ship #? ", buf)) ||
- (def->shp_uid = atoi(p)) < 0)
+ p = getstarg(player->argp[1], "Victim ship #? ", buf);
+ if (!p || (def->shp_uid = atoi(p)) < 0)
return RET_SYN;
/*
/* Look for land units with mobility */
snxtitem_xy(&ni, EF_LAND, off->x, off->y);
foundland = 0;
- while (nxtitem(&ni, (s_char *)&land)) {
+ while (nxtitem(&ni, &land)) {
if (land.lnd_own != player->cnum)
continue;
- if (land.lnd_ship >= 0)
+ if (land.lnd_ship >= 0 || land.lnd_land >= 0)
continue;
if (land.lnd_mobil <= 0)
continue;
foundland = 1;
}
if (!foundland) {
- pr("You don't have any mobility (sector or land units) in %s!\n", xyas(off->x, off->y, player->cnum));
+ pr("You don't have any mobility (sector or land units) in %s!\n",
+ xyas(off->x, off->y, player->cnum));
return RET_SYN;
}
}
return RET_OK;
}
- /* Show what we're boarding, and check treaties */
-
- if (att_show(def))
- return RET_FAIL;
+ /* Show what we're boarding */
+ att_show(def);
/* Ask the player what he wants to board with */
if (att_abort(A_BOARD, off, def)) {
pr("Board aborted\n");
att_empty_attack(A_BOARD, 0, def);
- return att_free_lists(&olist, 0);
+ return att_free_lists(&olist, NULL);
}
- /*
- * Estimate the defense strength and give the player a chance to abort
- */
-
- ototal = att_estimate_defense(A_BOARD, off, &olist, def, a_spy);
+ ototal = att_get_offense(A_BOARD, off, &olist, def);
if (att_abort(A_BOARD, off, def)) {
pr("Board aborted\n");
att_empty_attack(A_BOARD, 0, def);
- return att_free_lists(&olist, 0);
+ return att_free_lists(&olist, NULL);
}
/*
* Death, carnage, and destruction.
*/
+ /*
+ * Careful: when the fight sinks the ship, put_combat() clobbers
+ * *def (see FIXME there).
+ */
+ def_uid = def->shp_uid;
+ def_own = def->own;
if (!(att_fight(A_BOARD, off, &olist, 1.0, def, &dlist, 1.0))) {
- getship(def->shp_uid, &ship);
+ getship(def_uid, &ship);
if (ship.shp_rflags & RET_BOARDED) {
- retreat_ship(&ship, 'u');
- putship(def->shp_uid, &ship);
+ retreat_ship(&ship, def_own, 'u');
+ putship(def_uid, &ship);
}
}