*
* Known contributors to this file:
* Ron Koenderink, 2007
- * Markus Armbruster, 2009
+ * Markus Armbruster, 2009-2011
*/
#include <config.h>
-#include "empobj.h"
#include "file.h"
#include "path.h"
#include "player.h"
#include "prototypes.h"
#include "unit.h"
+char *
+unit_nameof(struct empobj *gp)
+{
+ switch (gp->ef_type) {
+ case EF_SHIP:
+ return prship((struct shpstr *)gp);
+ case EF_PLANE:
+ return prplane((struct plnstr *)gp);
+ case EF_LAND:
+ return prland((struct lndstr *)gp);
+ case EF_NUKE:
+ return prnuke((struct nukstr *)gp);
+ }
+ CANT_REACH();
+ return "The Beast #666";
+}
+
void
unit_list(struct emp_qelem *unit_list)
{
&& unit->ef_type != EF_SHIP))
continue;
if (actor) {
- mpr(actor, "%s stopped at %s\n", obj_nameof(unit),
+ mpr(actor, "%s stopped at %s\n", unit_nameof(unit),
xyas(unit->x, unit->y, actor));
if (unit->ef_type == EF_LAND) {
if (ulp->mobil < -127)
{
coord destx;
coord desty;
- struct sctstr d_sect, sect;
+ struct sctstr sect;
size_t len;
- char *cp;
+ double c;
int mtype;
if (CANT_HAPPEN(unit->ef_type != EF_LAND && unit->ef_type != EF_SHIP))
return NULL;
if (!sarg_xy(buf, &destx, &desty))
- return NULL;
+ return buf;
if (!together) {
pr("Cannot go to a destination sector if not all starting in the same sector\n");
return NULL;
}
- if (!getsect(destx, desty, &d_sect)) {
- pr("%d,%d is not a sector\n", destx, desty);
- return NULL;
- }
if (unit->ef_type == EF_SHIP) {
- if (path_find(unit->x, unit->y, d_sect.sct_x, d_sect.sct_y,
- player->cnum, MOB_SAIL) < 0)
- cp = NULL;
- else {
- len = path_find_route(buf, 100, unit->x, unit->y,
- d_sect.sct_x, d_sect.sct_y);
- if (len >= 100)
- cp = NULL;
- else {
- if (len == 0)
- strcpy(buf, "h");
- cp = buf;
- }
- }
- if (!cp || unit->mobil <= 0) {
+ c = path_find(unit->x, unit->y, destx, desty,
+ player->cnum, MOB_SAIL);
+ if (c < 0 || unit->mobil <= 0) {
pr("Can't get to '%s' right now.\n",
- xyas(d_sect.sct_x, d_sect.sct_y, player->cnum));
+ xyas(destx, desty, player->cnum));
return NULL;
}
} else {
getsect(unit->x, unit->y, §);
mtype = lnd_mobtype((struct lndstr *)unit);
- buf[0] = 0;
/*
* Note: passing sect.sct_own for actor is funny, but works:
* its only effect is to confine the search to that nation's
* different for marching in allied land, and passing it would
* break path finding there.
*/
- if (path_find(sect.sct_x, sect.sct_y, d_sect.sct_x, d_sect.sct_y,
- sect.sct_own, mtype) < 0)
- cp = NULL;
- else {
- len = path_find_route(buf, 1024,
- sect.sct_x, sect.sct_y,
- d_sect.sct_x, d_sect.sct_y);
- if (len + 1 >= 1024)
- cp = NULL;
- else {
- strcpy(buf + len, "h");
- cp = buf;
- }
- }
- if (!cp) {
+ c = path_find(unit->x, unit->y, destx, desty, sect.sct_own, mtype);
+ if (c < 0) {
pr("No owned %s from %s to %s!\n",
mtype == MOB_RAIL ? "railway" : "path",
xyas(unit->x, unit->y, player->cnum),
- xyas(d_sect.sct_x, d_sect.sct_y, player->cnum));
+ xyas(destx, desty, player->cnum));
return NULL;
}
- pr("Using path '%s'\n", cp);
}
- return cp;
+ len = path_find_route(buf, sizeof(buf), unit->x, unit->y, destx, desty);
+ if (len == 0 || unit->ef_type == EF_LAND) {
+ if (len + 1 < sizeof(buf))
+ strcpy(buf + len, "h");
+ len++;
+ }
+ if (len >= sizeof(buf)) {
+ pr("Can't handle path to %s, it's too long, sorry\n",
+ xyas(destx, desty, player->cnum));
+ return NULL;
+ }
+ if (unit->ef_type == EF_LAND)
+ pr("Using path '%s'\n", buf);
+ return buf;
}
void
if (((struct mchrstr *)ulp->chrp)->m_flags & M_OIL)
pr("[oil:%d] ", sect.sct_oil);
}
- pr("%s @ %s %d%% %s\n", obj_nameof(&ulp->unit.gen),
+ pr("%s @ %s %d%% %s\n", unit_nameof(&ulp->unit.gen),
xyas(ulp->unit.gen.x, ulp->unit.gen.y, player->cnum),
sect.sct_effic, dchr[sect.sct_type].d_name);
}
snxtitem_cargo(&ni, cargo_type, carrier->ef_type, carrier->uid);
while (nxtitem(&ni, &obj)) {
if (!carrier->own) {
- mpr(obj.gen.own, "%s lost!\n", obj_nameof(&obj.gen));
+ mpr(obj.gen.own, "%s lost!\n", unit_nameof(&obj.gen));
obj.gen.effic = 0;
} else {
/* mission op-area centered on the obj travels with it */
break;
}
mpr(cargo.gen.own, "%s transferred off %s %d to %s\n",
- obj_nameof(&cargo.gen),
+ unit_nameof(&cargo.gen),
ef_nameof(unit->ef_type), unit->uid,
xyas(cargo.gen.x, cargo.gen.y, cargo.gen.own));
if (newown)
if (giver) {
mpr(unit->own, "%s given to %s\n",
- obj_nameof(unit), cname(recipient));
+ unit_nameof(unit), cname(recipient));
mpr(recipient, "%s given to you by %s\n",
- obj_nameof(unit), cname(giver));
+ unit_nameof(unit), cname(giver));
}
unit->own = recipient;