/*
* Empire - A multi-player, client/server Internet based war game.
- * Copyright (C) 1986-2009, 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/>.
*
* ---
*
*
* Known contributors to this file:
* Ken Stevens, 1995
+ * Markus Armbruster, 2011-2015
*/
#include <config.h>
#include "combat.h"
#include "commands.h"
#include "land.h"
-#include "mission.h"
-#include "path.h"
#include "retreat.h"
#include "ship.h"
struct sctstr sect;
struct lndstr land;
struct nstr_item ni;
- int foundland;
+ int foundland, def_uid;
+ natid def_own;
char *p;
char buf[1024];
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;
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);
}
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);
}
}