/* * Empire - A multi-player, client/server Internet based war game. * Copyright (C) 1986-2006, Dave Pare, Jeff Bailey, Thomas Ruschak, * Ken Stevens, Steve McClure * * This program 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 * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * 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 * * --- * * 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. * * --- * * edit.c: Edit things (sectors, ships, planes, units, nukes, countries) * * Known contributors to this file: * David Muir Sharnoff * Chad Zabel, 1994 * Steve McClure, 1998-2000 * Ron Koenderink, 2003-2004 * Markus Armbruster, 2003-2006 */ #include #include #include #include "commands.h" #include "item.h" #include "land.h" #include "lost.h" #include "news.h" #include "optlist.h" #include "plague.h" #include "plane.h" #include "ship.h" #define END -1 static void benefit(natid, int); static int docountry(char, int, char *, struct natstr *); static int doland(char, int, char *, struct sctstr *); static int doplane(char, int, char *, struct plnstr *); static int doship(char, int, char *, struct shpstr *); static int dounit(char, int, char *, struct lndstr *); static int getin(char *, char **); static void noise(struct sctstr *, char *, int, int); static void pr_land(struct lndstr *); static void pr_plane(struct plnstr *); static void pr_ship(struct shpstr *); static void prnat(struct natstr *); static void prsect(struct sctstr *); int edit(void) { struct sctstr sect; struct plnstr plane; struct shpstr ship; struct lndstr land; char *what; char *ptr; char thing; int num; int arg; int err; int arg_index = 3; coord x, y; struct natstr *np; char buf[1024]; char ewhat; if ((what = getstarg(player->argp[1], "Edit What (country, land, ship, plane, nuke, unit)? ", buf)) == 0) return RET_SYN; ewhat = what[0]; switch (ewhat) { case 'l': if (!(ptr = getstarg(player->argp[2], "Sector : ", buf))) return RET_FAIL; if (!sarg_xy(ptr, &x, &y)) return RET_FAIL; if (!getsect(x, y, §)) return RET_FAIL; break; case 'c': np = natargp(player->argp[2], "Country? "); if (!np) return RET_SYN; break; case 'p': if ((num = onearg(player->argp[2], "Plane number? ")) < 0) return RET_SYN; if (!getplane(num, &plane)) return RET_SYN; break; case 's': if ((num = onearg(player->argp[2], "Ship number? ")) < 0) return RET_SYN; if (!getship(num, &ship)) return RET_SYN; break; case 'u': if ((num = onearg(player->argp[2], "Unit number? ")) < 0) return RET_SYN; if (!getland(num, &land)) return RET_SYN; break; case 'n': pr("Not implemented yet.\n"); break; default: pr("huh?\n"); return RET_SYN; } if (player->argp[3] == 0) { switch (ewhat) { case 'l': prsect(§); break; case 'c': prnat(np); break; case 'p': pr_plane(&plane); break; case 's': pr_ship(&ship); break; case 'u': pr_land(&land); break; } } for (;;) { if (player->argp[arg_index] != 0) { if (player->argp[arg_index+1] != 0) { thing = player->argp[arg_index++][0]; ptr = player->argp[arg_index++]; arg = atoi(ptr); } else return RET_SYN; } else if (arg_index == 3) { err = getin(buf, &ptr); if (err < 0) return RET_SYN; if (err == 0) { switch (ewhat) { case 'c': prnat(np); break; case 'l': prsect(§); break; case 's': pr_ship(&ship); break; case 'u': pr_land(&land); break; case 'p': pr_plane(&plane); break; } return RET_OK; } thing = err; arg = atoi(ptr); } else return RET_OK; switch (ewhat) { case 'c': if ((err = docountry(thing, arg, ptr, np)) != RET_OK) return err; break; case 'l': if ((err = doland(thing, arg, ptr, §)) != RET_OK) return err; if (!putsect(§)) return RET_FAIL; break; case 's': if ((err = doship(thing, arg, ptr, &ship)) != RET_OK) return err; if (!ef_ensure_space(EF_SHIP, ship.shp_uid, 50)) return RET_FAIL; if (!putship(ship.shp_uid, &ship)) return RET_FAIL; break; case 'u': if ((err = dounit(thing, arg, ptr, &land)) != RET_OK) return err; if (!ef_ensure_space(EF_LAND, land.lnd_uid, 50)) return RET_FAIL; if (!putland(land.lnd_uid, &land)) return RET_FAIL; break; case 'p': if ((err = doplane(thing, arg, ptr, &plane)) != RET_OK) return err; if (!ef_ensure_space(EF_PLANE, plane.pln_uid, 50)) return RET_FAIL; if (!putplane(plane.pln_uid, &plane)) return RET_FAIL; break; } } } static void benefit(natid who, int good) { if (!opt_GODNEWS) return; if (good) { if (who) nreport(player->cnum, N_AIDS, who, 1); } else { if (who) nreport(player->cnum, N_HURTS, who, 1); } } static void noise(struct sctstr *sptr, char *name, int old, int new) { pr("%s of %s changed from %d to %d\n", name, xyas(sptr->sct_x, sptr->sct_y, player->cnum), old, new); if (sptr->sct_own) wu(player->cnum, sptr->sct_own, "%s in %s was changed from %d to %d by an act of %s\n", name, xyas(sptr->sct_x, sptr->sct_y, sptr->sct_own), old, new, cname(player->cnum)); benefit(sptr->sct_own, old < new); } static void prsect(struct sctstr *sect) { pr("Location : %s\t", xyas(sect->sct_x, sect->sct_y, player->cnum)); pr("Distribution sector : %s\n", xyas(sect->sct_dist_x, sect->sct_dist_y, player->cnum)); pr("Designation : %c\tNew designation : %c\n", dchr[sect->sct_type].d_mnem, dchr[sect->sct_newtype].d_mnem); pr("own oo eff mob min gld frt oil urn wrk lty che ctg plg ptime fall avail\n"); pr(" o O e m i g f c u w l x X p t F a\n"); pr("%3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %5d %4d %5d\n", sect->sct_own, sect->sct_oldown, sect->sct_effic, sect->sct_mobil, sect->sct_min, sect->sct_gmin, sect->sct_fertil, sect->sct_oil, sect->sct_uran, sect->sct_work, sect->sct_loyal, sect->sct_che, sect->sct_che_target, sect->sct_pstage, sect->sct_ptime, sect->sct_fallout, sect->sct_avail); pr("Mines : %d\n", sect->sct_mines); pr("Road %% : %d\t", sect->sct_road); pr("Rail %% : %d\t", sect->sct_rail); pr("Defense %% : %d\n", sect->sct_defense); } static void prnat(struct natstr *np) { int i; pr("Country #: %2d\n", np->nat_cnum); pr("Name : %-20s\t", np->nat_cnam); pr("Representative : %-20s\n", np->nat_pnam); pr("BTUs : %3d\t\t\t", np->nat_btu); pr("Reserves : %5ld\n", np->nat_reserve); pr("Capital : %s\t\t", xyas(np->nat_xcap, np->nat_ycap, player->cnum)); pr("Origin : %3s\n", xyas(np->nat_xorg, np->nat_yorg, player->cnum)); pr("Status : 0x%x\t\t\t", np->nat_stat); pr("Min Used : %3d\n", np->nat_minused); pr("Technology : %.2f\t\t", np->nat_level[NAT_TLEV]); pr("Research : %.2f\n", np->nat_level[NAT_RLEV]); pr("Education : %.2f\t\t", np->nat_level[NAT_ELEV]); pr("Happiness : %.2f\n", np->nat_level[NAT_HLEV]); pr("Money : $%6ld\n", np->nat_money); pr("Telegrams : %6d\n", np->nat_tgms); if (opt_DEMANDUPDATE) pr("Updates missed : %d\n", np->nat_missed); if (opt_HIDDEN) { pr("Countries contacted: "); for (i = 0; i < MAXNOC; i++) { if (getcontact(np, i)) pr("%d(%d) ", i, getcontact(np, i)); } pr("\n"); } } static void pr_plane(struct plnstr *plane) { pr("UID : %d\t\t", plane->pln_uid); pr("Owner : %d\t\t", plane->pln_own); pr("Location : %s\n", xyas(plane->pln_x, plane->pln_y, player->cnum)); pr("Efficiency : %d\t", plane->pln_effic); pr("Mobility : %d\n", plane->pln_mobil); pr("Tech : %d\t\t", plane->pln_tech); pr("Wing : %.1s\n", &plane->pln_wing); pr("Range : %d\t\t", plane->pln_range); pr("Flags : %d\n", plane->pln_flags); pr("Ship : %d\t\t", plane->pln_ship); pr("Land Unit : %d\t", plane->pln_land); pr("Nuke Type : %d\n", plane->pln_nuketype); } static void pr_land(struct lndstr *land) { pr("UID : %d\n", land->lnd_uid); pr("Owner : %d\n", land->lnd_own); pr("Location : %s\n", xyas(land->lnd_x, land->lnd_y, player->cnum)); pr("Efficiency : %d\t", land->lnd_effic); pr("Mobility : %d\n", land->lnd_mobil); pr("Tech : %d\t\t", land->lnd_tech); pr("Army : %.1s\n", &land->lnd_army); pr("Fortification : %d\t", land->lnd_harden); pr("Fuel : %d\n", land->lnd_fuel); pr("Land unit : %d\n", land->lnd_land); pr("Ship : %d\t\t", land->lnd_ship); pr("Radius

: %d\n", land->lnd_rad_max); pr("Retreat percentage : %d\n", land->lnd_retreat); pr("Retreat path : '%s'\t\tRetreat Flags : %d\n", land->lnd_rpath, land->lnd_rflags); pr("civ mil uw food shl gun pet irn dst oil lcm hcm rad\n"); pr(" c m u f s g p i d o l h r\n"); pr("%3d", land->lnd_item[I_CIVIL]); pr("%4d", land->lnd_item[I_MILIT]); pr("%4d", land->lnd_item[I_UW]); pr("%5d", land->lnd_item[I_FOOD]); pr("%4d", land->lnd_item[I_SHELL]); pr("%4d", land->lnd_item[I_GUN]); pr("%5d", land->lnd_item[I_PETROL]); pr("%5d", land->lnd_item[I_IRON]); pr("%5d", land->lnd_item[I_DUST]); pr("%5d", land->lnd_item[I_OIL]); pr("%5d", land->lnd_item[I_LCM]); pr("%5d", land->lnd_item[I_HCM]); pr("%4d", land->lnd_item[I_RAD]); pr("\n"); } static void pr_ship(struct shpstr *ship) { struct natstr *natp; if ((natp = getnatp(ship->shp_own)) == 0) return; pr("%s (#%d) %s\n", natp->nat_cnam, ship->shp_own, prship(ship)); pr("UID : %d\n", ship->shp_uid); pr("Owner : %d\t\t\t", ship->shp_own); pr("Location : %s\n", xyas(ship->shp_x, ship->shp_y, player->cnum)); pr("Tech : %d\t\t\t", ship->shp_tech); pr("Efficiency : %d\n", ship->shp_effic); pr("Mobility : %d\t\t", ship->shp_mobil); pr("Fleet : %.1s\n", &ship->shp_fleet); /* could depend on opt_FUEL - but a deity might want to set this up before enabling the option */ pr("Fuel : %d\n", ship->shp_fuel); pr("Retreat path : '%s'\t\tRetreat Flags : %d\n", ship->shp_rpath, ship->shp_rflags); pr("Plague Stage : %d\t\t",ship->shp_pstage); pr("Plague Time : %d\n", ship->shp_ptime); pr("civ mil uw food shl gun pet irn dst oil lcm hcm rad\n"); pr(" c m u f s g p i d o l h r\n"); pr("%3d", ship->shp_item[I_CIVIL]); pr("%4d", ship->shp_item[I_MILIT]); pr("%4d", ship->shp_item[I_UW]); pr("%5d", ship->shp_item[I_FOOD]); pr("%4d", ship->shp_item[I_SHELL]); pr("%4d", ship->shp_item[I_GUN]); pr("%5d", ship->shp_item[I_PETROL]); pr("%5d", ship->shp_item[I_IRON]); pr("%5d", ship->shp_item[I_DUST]); pr("%5d", ship->shp_item[I_OIL]); pr("%5d", ship->shp_item[I_LCM]); pr("%5d", ship->shp_item[I_HCM]); pr("%4d", ship->shp_item[I_RAD]); pr("\n"); } static int errcheck(int num, int min, int max) { if (num < min) return min; else if (num > max) return max; return num; } static int getin(char *buf, char **valp) { char *p; unsigned char thing; p = getstarg(NULL, "%c xxxxx -- thing value : ", buf); if (!p) return -1; if (!*p) return 0; for (; isspace(*p); p++) ; if (!*p) return -1; thing = *p; for (; *p && !isspace(*p); p++) ; for (; isspace(*p); p++) ; if (!*p) return -1; *valp = p; return thing; } static void warn_deprecated(char key) { pr("Key <%c> is deprecated and will go away in a future release\n", key); } static int doland(char op, int arg, char *p, struct sctstr *sect) { natid newown, oldown; coord newx, newy; int new, old; int des; switch (op) { case 'C': warn_deprecated(op); if (arg < 0) return RET_SYN; sect->sct_coastal = (arg ? 1 : 0); pr("Coastal flag of %s changed to %d\n", xyas(sect->sct_x, sect->sct_y, player->cnum), sect->sct_coastal); break; case 'o': if (arg < 0) return RET_SYN; newown = (natid)errcheck(arg, 0, MAXNOC - 1); pr("Owner of %s changed from %s (#%d) to %s (#%d).\n", xyas(sect->sct_x, sect->sct_y, player->cnum), cname(sect->sct_own), sect->sct_own, cname(newown), newown); if (sect->sct_own) { makelost(EF_SECTOR, sect->sct_own, 0, sect->sct_x, sect->sct_y); wu(player->cnum, sect->sct_own, "Sector %s lost to deity intervention\n", xyas(sect->sct_x, sect->sct_y, sect->sct_own)); } benefit(sect->sct_own, 0); sect->sct_own = newown; if (newown) { makenotlost(EF_SECTOR, newown, 0, sect->sct_x, sect->sct_y); wu(player->cnum, newown, "Sector %s gained from deity intervention\n", xyas(sect->sct_x, sect->sct_y, sect->sct_own)); } benefit(newown, 1); break; case 'O': if (arg < 0) return RET_SYN; oldown = (natid)errcheck(arg, 0, MAXNOC - 1); pr("Old owner of %s changed from %s (#%d) to %s (#%d).\n", xyas(sect->sct_x, sect->sct_y, player->cnum), cname(sect->sct_oldown), sect->sct_oldown, cname(oldown), oldown); sect->sct_oldown = oldown; break; case 'e': new = errcheck(arg, 0, 100); noise(sect, "Efficiency", sect->sct_effic, new); sect->sct_effic = (unsigned char)new; break; case 'm': new = errcheck(arg, -127, 255); noise(sect, "Mobility", sect->sct_mobil, new); sect->sct_mobil = new; break; case 'i': new = errcheck(arg, 0, 127); noise(sect, "Iron ore content", sect->sct_min, new); sect->sct_min = (unsigned char)new; break; case 'g': new = errcheck(arg, 0, 127); noise(sect, "Gold content", sect->sct_gmin, new); sect->sct_gmin = (unsigned char)new; break; case 'f': new = errcheck(arg, 0, 127); noise(sect, "Fertility", sect->sct_fertil, new); sect->sct_fertil = (unsigned char)new; break; case 'c': new = errcheck(arg, 0, 127); noise(sect, "Oil content", sect->sct_oil, new); sect->sct_oil = (unsigned char)new; break; case 'u': new = errcheck(arg, 0, 127); noise(sect, "Uranium content", sect->sct_uran, new); sect->sct_uran = (unsigned char)new; break; case 'w': new = errcheck(arg, 0, 100); noise(sect, "Workforce percentage", sect->sct_work, new); sect->sct_work = (unsigned char)new; break; case 'l': new = errcheck(arg, 0, 127); pr("Loyalty of %s changed from %d to %d%%\n", xyas(sect->sct_x, sect->sct_y, player->cnum), sect->sct_loyal, new); sect->sct_loyal = (unsigned char)new; break; case 'x': old = sect->sct_che; new = errcheck(arg, 0, CHE_MAX); pr("Guerillas in %s changed from %d to %d\n", xyas(sect->sct_x, sect->sct_y, player->cnum), old, new); sect->sct_che = new; break; case 'X': old = sect->sct_che_target; new = errcheck(arg, 0, MAXNOC - 1); pr("Che target of %s changed from %s (#%d) to %s (#%d).\n", xyas(sect->sct_x, sect->sct_y, player->cnum), cname(old), old, cname(new), new); sect->sct_che_target = new; if (new == 0) sect->sct_che = 0; break; case 'p': old = sect->sct_pstage; new = errcheck(arg, 0, PLG_EXPOSED); pr("Plague stage of %s changed from %d to %d%%\n", xyas(sect->sct_x, sect->sct_y, player->cnum), old, new); sect->sct_pstage = new; break; case 't': old = sect->sct_ptime; new = errcheck(arg, 0, 255); pr("Plague time of %s changed from %d to %d%%\n", xyas(sect->sct_x, sect->sct_y, player->cnum), old, new); sect->sct_ptime = new; break; case 'F': old = sect->sct_fallout; new = errcheck(arg, 0, FALLOUT_MAX); pr("Fallout for sector %s changed from %d to %d\n", xyas(sect->sct_x, sect->sct_y, player->cnum), old, new); sect->sct_fallout = new; break; case 'a': new = errcheck(arg, 0, 9999); noise(sect, "Available workforce", sect->sct_avail, new); sect->sct_avail = new; break; case 'M': new = errcheck(arg, 0, MINES_MAX); sect->sct_mines = new; pr("Mines changed to %d\n", new); break; case 'L': if (!sarg_xy(p, &newx, &newy)) return RET_SYN; sect->sct_x = newx; sect->sct_y = newy; break; case 'D': if (!sarg_xy(p, &newx, &newy)) return RET_SYN; pr("Distribution Location for sector %s changed from %s to %s\n", xyas(sect->sct_x, sect->sct_y, player->cnum), xyas(sect->sct_dist_x, sect->sct_dist_y, player->cnum), xyas(newx, newy, player->cnum)); sect->sct_dist_x = newx; sect->sct_dist_y = newy; break; case 's': des = sct_typematch(p); if (des < 0) return RET_SYN; pr("Designation for sector %s changed from %c to %c\n", xyas(sect->sct_x, sect->sct_y, player->cnum), dchr[sect->sct_type].d_mnem, dchr[des].d_mnem); set_coastal(sect, des); sect->sct_type = des; break; case 'S': des = sct_typematch(p); if (des < 0) return RET_SYN; pr("New Designation for sector %s changed from %c to %c\n", xyas(sect->sct_x, sect->sct_y, player->cnum), dchr[sect->sct_newtype].d_mnem, dchr[des].d_mnem); sect->sct_newtype = des; break; case 'R': if (arg > 100) arg = 100; if (arg < 0) arg = 0; noise(sect, "Road percentage", sect->sct_road, arg); sect->sct_road = arg; break; case 'r': if (arg > 100) arg = 100; if (arg < 0) arg = 0; noise(sect, "Rail percentage", sect->sct_rail, arg); sect->sct_rail = arg; break; case 'd': if (arg > 100) arg = 100; if (arg < 0) arg = 0; noise(sect, "Defense percentage", sect->sct_defense, arg); sect->sct_defense = arg; break; default: pr("huh? (%c)\n", op); return RET_SYN; } return RET_OK; } static int docountry(char op, int arg, char *p, struct natstr *np) { coord newx, newy; natid nat = np->nat_cnum; float farg = (float)atof(p); switch (op) { case 'n': pr("Country name changed from %s to %s\n", np->nat_cnam, p); strncpy(np->nat_cnam, p, sizeof(np->nat_cnam) - 1); break; case 'r': pr("Country representative changed from %s to %s\n", np->nat_pnam, p); strncpy(np->nat_pnam, p, sizeof(np->nat_pnam) - 1); break; case 't': np->nat_tgms = arg; break; case 'b': arg = errcheck(arg, 0, 1024); pr("BTU's changed from %d to %d\n", np->nat_btu, arg); np->nat_btu = arg; break; case 'm': benefit(nat, np->nat_reserve < arg); pr("Military Reserves changed from %ld to %d\n", np->nat_reserve, arg); wu(player->cnum, nat, "Military Reserves changed from %ld to %d by divine intervention.\n", np->nat_reserve, arg); np->nat_reserve = arg; break; case 'c': if (!sarg_xy(p, &newx, &newy)) return RET_SYN; pr("Capital coordinates changed from %s to %s\n", xyas(np->nat_xcap, np->nat_ycap, player->cnum), xyas(newx, newy, player->cnum)); np->nat_xcap = newx; np->nat_ycap = newy; break; case 'o': if (!sarg_xy(p, &newx, &newy)) return RET_SYN; pr("Origin coordinates changed from %s to %s\n", xyas(np->nat_xorg, np->nat_yorg, player->cnum), xyas(newx, newy, player->cnum)); np->nat_xorg = newx; np->nat_yorg = newy; break; case 's': np->nat_stat = (nat_status)errcheck(arg, STAT_UNUSED, STAT_GOD); break; case 'u': arg = errcheck(arg, 0, m_m_p_d); pr("Number of minutes used changed from %d to %d.\n", np->nat_minused, arg); np->nat_minused = arg; break; case 'M': pr("Money changed from %ld to %d\n", np->nat_money, arg); wu(player->cnum, nat, "Money changed from %ld to %d by divine intervention.\n", np->nat_money, arg); np->nat_money = arg; break; case 'T': pr("Tech changed from %.2f to %.2f.\n", np->nat_level[NAT_TLEV], farg); np->nat_level[NAT_TLEV] = farg; break; case 'R': pr("Research changed from %.2f to %.2f.\n", np->nat_level[NAT_RLEV], farg); np->nat_level[NAT_RLEV] = farg; break; case 'E': pr("Education changed from %.2f to %.2f.\n", np->nat_level[NAT_ELEV], farg); np->nat_level[NAT_ELEV] = farg; break; case 'H': pr("Happiness changed from %.2f to %.2f.\n", np->nat_level[NAT_HLEV], farg); np->nat_level[NAT_HLEV] = farg; break; case 'U': np->nat_missed = arg; break; default: pr("huh? (%c)\n", op); break; } putnat(np); return RET_OK; } static int doship(char op, int arg, char *p, struct shpstr *ship) { coord newx, newy; newx = newy = 0; switch (op) { case 'a': ship->shp_pstage = arg; break; case 'b': ship->shp_ptime = arg; break; case 'R': strncpy(ship->shp_rpath, p, sizeof(ship->shp_rpath) - 1); break; case 'W': ship->shp_rflags = arg; break; case 'H': warn_deprecated(op); ship->shp_nchoppers = arg; break; case 'X': warn_deprecated(op); ship->shp_nxlight = arg; break; case 'U': ship->shp_uid = arg; break; case 'O': if (ship->shp_own) wu(player->cnum, ship->shp_own, "%s taken from you by deity intervention!\n", prship(ship)); if (arg && arg < MAXNOC) { wu(player->cnum, (natid)arg, "%s given to you by deity intervention!\n", prship(ship)); makelost(EF_SHIP, ship->shp_own, ship->shp_uid, ship->shp_x, ship->shp_y); ship->shp_own = (natid)arg; makenotlost(EF_SHIP, ship->shp_own, ship->shp_uid, ship->shp_x, ship->shp_y); } else if (!arg) ship->shp_effic = 0; break; case 'L': if (!sarg_xy(p, &newx, &newy)) return RET_SYN; ship->shp_x = newx; ship->shp_y = newy; break; case 'T': shp_set_tech(ship, errcheck(arg, mchr[(int)ship->shp_type].m_tech, SHRT_MAX)); break; case 'E': ship->shp_effic = errcheck(arg, SHIP_MINEFF, 100); break; case 'M': ship->shp_mobil = arg; break; case 'B': ship->shp_fuel = errcheck(arg, 0, 255); break; case 'F': if (p[0] == '~') ship->shp_fleet = 0; else if (isalpha(p[0])) ship->shp_fleet = p[0]; else { pr("%c: invalid fleet\n", p[0]); return RET_FAIL; } break; case 'Y': warn_deprecated(op); ship->shp_nland = errcheck(arg, 0, 100); break; case 'P': warn_deprecated(op); ship->shp_nplane = errcheck(arg, 0, 100); break; case 'c': ship->shp_item[I_CIVIL] = arg; break; case 'm': ship->shp_item[I_MILIT] = arg; break; case 'u': ship->shp_item[I_UW] = arg; break; case 'f': ship->shp_item[I_FOOD] = arg; break; case 's': ship->shp_item[I_SHELL] = arg; break; case 'g': ship->shp_item[I_GUN] = arg; break; case 'p': ship->shp_item[I_PETROL] = arg; break; case 'i': ship->shp_item[I_IRON] = arg; break; case 'd': ship->shp_item[I_DUST] = arg; break; case 'o': ship->shp_item[I_OIL] = arg; break; case 'l': ship->shp_item[I_LCM] = arg; break; case 'h': ship->shp_item[I_HCM] = arg; break; case 'r': ship->shp_item[I_RAD] = arg; break; default: pr("huh? (%c)\n", op); return RET_FAIL; } return RET_OK; } static int dounit(char op, int arg, char *p, struct lndstr *land) { coord newx, newy; newx = newy = 0; switch (op) { case 'Y': land->lnd_land = arg; break; case 'U': land->lnd_uid = arg; break; case 'O': if (land->lnd_own) wu(player->cnum, land->lnd_own, "%s taken from you by deity intervention!\n", prland(land)); if (arg && arg < MAXNOC) { wu(player->cnum, (natid)arg, "%s given to you by deity intervention!\n", prland(land)); makelost(EF_LAND, land->lnd_own, land->lnd_uid, land->lnd_x, land->lnd_y); land->lnd_own = (natid)arg; makenotlost(EF_LAND, land->lnd_own, land->lnd_uid, land->lnd_x, land->lnd_y); } else if (!arg) land->lnd_effic = 0; break; case 'L': if (!sarg_xy(p, &newx, &newy)) return RET_SYN; land->lnd_x = newx; land->lnd_y = newy; break; case 'e': land->lnd_effic = errcheck(arg, LAND_MINEFF, 100); break; case 'M': land->lnd_mobil = arg; break; case 't': lnd_set_tech(land, errcheck(arg, lchr[(int)land->lnd_type].l_tech, SHRT_MAX)); break; case 'a': if (p[0] == '~') land->lnd_army = 0; else if (isalpha(p[0])) land->lnd_army = p[0]; else { pr("%c: invalid army\n", p[0]); return RET_FAIL; } break; case 'F': land->lnd_harden = errcheck(arg, 0, 255); break; case 'B': land->lnd_fuel = errcheck(arg, 0, 255); break; case 'X': warn_deprecated(op); land->lnd_nxlight = arg; break; case 'S': land->lnd_ship = arg; break; case 'P': land->lnd_rad_max = arg; break; case 'Z': land->lnd_retreat = arg; break; case 'R': strncpy(land->lnd_rpath, p, sizeof(land->lnd_rpath) - 1); break; case 'W': land->lnd_rflags = arg; break; case 'c': land->lnd_item[I_CIVIL] = arg; break; case 'm': land->lnd_item[I_MILIT] = arg; break; case 'u': land->lnd_item[I_UW] = arg; break; case 'f': land->lnd_item[I_FOOD] = arg; break; case 's': land->lnd_item[I_SHELL] = arg; break; case 'g': land->lnd_item[I_GUN] = arg; break; case 'p': land->lnd_item[I_PETROL] = arg; break; case 'i': land->lnd_item[I_IRON] = arg; break; case 'd': land->lnd_item[I_DUST] = arg; break; case 'o': land->lnd_item[I_OIL] = arg; break; case 'l': land->lnd_item[I_LCM] = arg; break; case 'h': land->lnd_item[I_HCM] = arg; break; case 'r': land->lnd_item[I_RAD] = arg; break; default: pr("huh? (%c)\n", op); return RET_FAIL; } return RET_OK; } int doplane(char op, int arg, char *p, struct plnstr *plane) { coord newx, newy; switch (op) { case 'n': plane->pln_nuketype = arg; break; case 'U': plane->pln_uid = arg; break; case 'l': if (!sarg_xy(p, &newx, &newy)) return RET_SYN; plane->pln_x = newx; plane->pln_y = newy; break; case 'O': if (plane->pln_own) wu(player->cnum, plane->pln_own, "%s taken from you by deity intervention!\n", prplane(plane)); if (arg && arg < MAXNOC) { makelost(EF_PLANE, plane->pln_own, plane->pln_uid, plane->pln_x, plane->pln_y); plane->pln_own = (natid)arg; makenotlost(EF_PLANE, plane->pln_own, plane->pln_uid, plane->pln_x, plane->pln_y); wu(player->cnum, plane->pln_own, "%s given to you by deity intervention!\n", prplane(plane)); } else if (!arg) plane->pln_effic = 0; break; case 'e': plane->pln_effic = errcheck(arg, PLANE_MINEFF, 100); break; case 'm': plane->pln_mobil = errcheck(arg, -127, 255); break; case 't': pln_set_tech(plane, errcheck(arg, plchr[(int)plane->pln_type].pl_tech, SHRT_MAX)); break; case 'w': if (p[0] == '~') plane->pln_wing = 0; else if (isalpha(p[0])) plane->pln_wing = p[0]; else { pr("%c: invalid wing\n", p[0]); return RET_FAIL; } break; case 'a': warn_deprecated(op); plane->pln_att = arg; break; case 'd': warn_deprecated(op); plane->pln_def = arg; break; case 'r': plane->pln_range = (unsigned char)arg; break; case 's': plane->pln_ship = arg; break; case 'y': plane->pln_land = arg; break; case 'f': plane->pln_flags = arg; break; default: pr("huh? (%c)\n", op); return RET_FAIL; } return RET_OK; }