src/lib/commands/edit.c

Go to the documentation of this file.
00001 /*
00002  *  Empire - A multi-player, client/server Internet based war game.
00003  *  Copyright (C) 1986-2007, Dave Pare, Jeff Bailey, Thomas Ruschak,
00004  *                           Ken Stevens, Steve McClure
00005  *
00006  *  This program is free software; you can redistribute it and/or modify
00007  *  it under the terms of the GNU General Public License as published by
00008  *  the Free Software Foundation; either version 2 of the License, or
00009  *  (at your option) any later version.
00010  *
00011  *  This program is distributed in the hope that it will be useful,
00012  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014  *  GNU General Public License for more details.
00015  *
00016  *  You should have received a copy of the GNU General Public License
00017  *  along with this program; if not, write to the Free Software
00018  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00019  *
00020  *  ---
00021  *
00022  *  See files README, COPYING and CREDITS in the root of the source
00023  *  tree for related information and legal notices.  It is expected
00024  *  that future projects/authors will amend these files as needed.
00025  *
00026  *  ---
00027  *
00028  *  edit.c: Edit things (sectors, ships, planes, units, nukes, countries)
00029  * 
00030  *  Known contributors to this file:
00031  *     David Muir Sharnoff
00032  *     Chad Zabel, 1994
00033  *     Steve McClure, 1998-2000
00034  *     Ron Koenderink, 2003-2004
00035  *     Markus Armbruster, 2003-2006
00036  */
00037 
00038 #include <config.h>
00039 
00040 #include <ctype.h>
00041 #include <limits.h>
00042 #include "commands.h"
00043 #include "item.h"
00044 #include "land.h"
00045 #include "lost.h"
00046 #include "news.h"
00047 #include "optlist.h"
00048 #include "plague.h"
00049 #include "plane.h"
00050 #include "ship.h"
00051 
00052 #define END -1
00053 
00054 static void benefit(natid, int);
00055 static int docountry(char, int, char *, struct natstr *);
00056 static int doland(char, int, char *, struct sctstr *);
00057 static int doplane(char, int, char *, struct plnstr *);
00058 static int doship(char, int, char *, struct shpstr *);
00059 static int dounit(char, int, char *, struct lndstr *);
00060 static int getin(char *, char **);
00061 static void noise(struct sctstr *, char *, int, int);
00062 static void pr_land(struct lndstr *);
00063 static void pr_plane(struct plnstr *);
00064 static void pr_ship(struct shpstr *);
00065 static void prnat(struct natstr *);
00066 static void prsect(struct sctstr *);
00067 
00068 
00069 int
00070 edit(void)
00071 {
00072     struct sctstr sect;
00073     struct plnstr plane;
00074     struct shpstr ship;
00075     struct lndstr land;
00076     char *what;
00077     char *ptr;
00078     char thing;
00079     int num;
00080     int arg;
00081     int err;
00082     int arg_index = 3;
00083     coord x, y;
00084     struct natstr *np;
00085     char buf[1024];
00086     char ewhat;
00087 
00088     if ((what = getstarg(player->argp[1],
00089                          "Edit What (country, land, ship, plane, nuke, unit)? ",
00090                          buf)) == 0)
00091         return RET_SYN;
00092     ewhat = what[0];
00093     switch (ewhat) {
00094     case 'l':
00095         if (!(ptr = getstarg(player->argp[2], "Sector : ", buf)))
00096             return RET_FAIL;
00097         if (!sarg_xy(ptr, &x, &y))
00098             return RET_FAIL;
00099         if (!getsect(x, y, &sect))
00100             return RET_FAIL;
00101         break;
00102     case 'c':
00103         np = natargp(player->argp[2], "Country? ");
00104         if (!np)
00105             return RET_SYN;
00106         break;
00107     case 'p':
00108         if ((num = onearg(player->argp[2], "Plane number? ")) < 0)
00109             return RET_SYN;
00110         if (!getplane(num, &plane))
00111             return RET_SYN;
00112         break;
00113     case 's':
00114         if ((num = onearg(player->argp[2], "Ship number? ")) < 0)
00115             return RET_SYN;
00116         if (!getship(num, &ship))
00117             return RET_SYN;
00118         break;
00119     case 'u':
00120         if ((num = onearg(player->argp[2], "Unit number? ")) < 0)
00121             return RET_SYN;
00122         if (!getland(num, &land))
00123             return RET_SYN;
00124         break;
00125     case 'n':
00126         pr("Not implemented yet.\n");
00127         break;
00128     default:
00129         pr("huh?\n");
00130         return RET_SYN;
00131     }
00132     if (player->argp[3] == 0) {
00133         switch (ewhat) {
00134         case 'l':
00135             prsect(&sect);
00136             break;
00137         case 'c':
00138             prnat(np);
00139             break;
00140         case 'p':
00141             pr_plane(&plane);
00142             break;
00143         case 's':
00144             pr_ship(&ship);
00145             break;
00146         case 'u':
00147             pr_land(&land);
00148             break;
00149         }
00150     }
00151     for (;;) {
00152         if (player->argp[arg_index] != 0) {
00153             if (player->argp[arg_index+1] != 0) {
00154                 thing = player->argp[arg_index++][0];
00155                 ptr = player->argp[arg_index++];
00156                 arg = atoi(ptr);
00157             } else
00158                 return RET_SYN;
00159         } else if (arg_index == 3) {
00160             err = getin(buf, &ptr);
00161             if (err < 0)
00162                 return RET_SYN;
00163             if (err == 0) {
00164                 switch (ewhat) {
00165                 case 'c':
00166                     prnat(np);
00167                     break;
00168                 case 'l':
00169                     prsect(&sect);
00170                     break;
00171                 case 's':
00172                     pr_ship(&ship);
00173                     break;
00174                 case 'u':
00175                     pr_land(&land);
00176                     break;
00177                 case 'p':
00178                     pr_plane(&plane);
00179                     break;
00180                 }
00181                 return RET_OK;
00182             }
00183             thing = err;
00184             arg = atoi(ptr);
00185         } else
00186             return RET_OK;
00187 
00188         switch (ewhat) {
00189         case 'c':
00190             if ((err = docountry(thing, arg, ptr, np)) != RET_OK)
00191                 return err;
00192             break;
00193         case 'l':
00194             if ((err = doland(thing, arg, ptr, &sect)) != RET_OK)
00195                 return err;
00196             if (!putsect(&sect))
00197                 return RET_FAIL;
00198             break;
00199         case 's':
00200             if ((err = doship(thing, arg, ptr, &ship)) != RET_OK)
00201                 return err;
00202             if (!ef_ensure_space(EF_SHIP, ship.shp_uid, 50))
00203                 return RET_FAIL;
00204             if (!putship(ship.shp_uid, &ship))
00205                 return RET_FAIL;
00206             break;
00207         case 'u':
00208             if ((err = dounit(thing, arg, ptr, &land)) != RET_OK)
00209                 return err;
00210             if (!ef_ensure_space(EF_LAND, land.lnd_uid, 50))
00211                 return RET_FAIL;
00212             if (!putland(land.lnd_uid, &land))
00213                 return RET_FAIL;
00214             break;
00215         case 'p':
00216             if ((err = doplane(thing, arg, ptr, &plane)) != RET_OK)
00217                 return err;
00218             if (!ef_ensure_space(EF_PLANE, plane.pln_uid, 50))
00219                 return RET_FAIL;
00220             if (!putplane(plane.pln_uid, &plane))
00221                 return RET_FAIL;
00222             break;
00223         }
00224     }
00225 }
00226 
00227 static void
00228 benefit(natid who, int good)
00229 {
00230     if (!opt_GODNEWS)
00231         return;
00232 
00233     if (good) {
00234         if (who)
00235             nreport(player->cnum, N_AIDS, who, 1);
00236     } else {
00237         if (who)
00238             nreport(player->cnum, N_HURTS, who, 1);
00239     }
00240 }
00241 
00242 static void
00243 noise(struct sctstr *sptr, char *name, int old, int new)
00244 {
00245     pr("%s of %s changed from %d to %d\n",
00246        name, xyas(sptr->sct_x, sptr->sct_y, player->cnum), old, new);
00247     if (sptr->sct_own)
00248         wu(player->cnum, sptr->sct_own,
00249            "%s in %s was changed from %d to %d by an act of %s\n",
00250            name, xyas(sptr->sct_x, sptr->sct_y, sptr->sct_own),
00251            old, new, cname(player->cnum));
00252     benefit(sptr->sct_own, old < new);
00253 }
00254 
00255 static void
00256 prsect(struct sctstr *sect)
00257 {
00258     pr("Location <L>: %s\t", xyas(sect->sct_x, sect->sct_y, player->cnum));
00259     pr("Distribution sector <D>: %s\n",
00260        xyas(sect->sct_dist_x, sect->sct_dist_y, player->cnum));
00261     pr("Designation <s>: %c\tNew designation <S>: %c\n",
00262        dchr[sect->sct_type].d_mnem, dchr[sect->sct_newtype].d_mnem);
00263     pr("own  oo eff mob min gld frt oil urn wrk lty che ctg plg ptime fall avail\n");
00264     pr("  o   O   e   m   i   g   f   c   u   w   l   x   X   p     t    F     a\n");
00265     pr("%3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %5d %4d %5d\n",
00266        sect->sct_own, sect->sct_oldown, sect->sct_effic, sect->sct_mobil,
00267        sect->sct_min, sect->sct_gmin, sect->sct_fertil, sect->sct_oil,
00268        sect->sct_uran, sect->sct_work, sect->sct_loyal,
00269        sect->sct_che, sect->sct_che_target,
00270        sect->sct_pstage, sect->sct_ptime,
00271        sect->sct_fallout, sect->sct_avail);
00272 
00273     pr("Mines <M>: %d\n", sect->sct_mines);
00274     pr("Road %% <R>: %d\t", sect->sct_road);
00275     pr("Rail %% <r>: %d\t", sect->sct_rail);
00276     pr("Defense %% <d>: %d\n", sect->sct_defense);
00277 }
00278 
00279 
00280 static void
00281 prnat(struct natstr *np)
00282 {
00283     int i;
00284 
00285     pr("Country #: %2d\n", np->nat_cnum);
00286     pr("Name <n>: %-20s\t", np->nat_cnam);
00287     pr("Representative <r>: %-20s\n", np->nat_pnam);
00288     pr("BTUs <b>: %3d\t\t\t", np->nat_btu);
00289     pr("Reserves <m>: %5ld\n", np->nat_reserve);
00290     pr("Capital <c>: %s\t\t",
00291        xyas(np->nat_xcap, np->nat_ycap, player->cnum));
00292     pr("Origin <o>: %3s\n",
00293        xyas(np->nat_xorg, np->nat_yorg, player->cnum));
00294     pr("Status <s>: 0x%x\t\t\t", np->nat_stat);
00295     pr("Min Used <u>: %3d\n", np->nat_minused);
00296     pr("Technology <T>: %.2f\t\t", np->nat_level[NAT_TLEV]);
00297     pr("Research <R>: %.2f\n", np->nat_level[NAT_RLEV]);
00298     pr("Education <E>: %.2f\t\t", np->nat_level[NAT_ELEV]);
00299     pr("Happiness <H>: %.2f\n", np->nat_level[NAT_HLEV]);
00300     pr("Money <M>: $%6ld\n", np->nat_money);
00301     pr("Telegrams <t>: %6d\n", np->nat_tgms);
00302     if (opt_HIDDEN) {
00303         pr("Countries contacted: ");
00304         for (i = 0; i < MAXNOC; i++) {
00305             if (getcontact(np, i))
00306                 pr("%d(%d) ", i, getcontact(np, i));
00307         }
00308         pr("\n");
00309     }
00310 }
00311 
00312 static void
00313 pr_plane(struct plnstr *plane)
00314 {
00315     pr("UID <U>: %d\t\t", plane->pln_uid);
00316     pr("Owner <O>: %d\t\t", plane->pln_own);
00317     pr("Location <l>: %s\n",
00318        xyas(plane->pln_x, plane->pln_y, player->cnum));
00319     pr("Efficiency <e>: %d\t", plane->pln_effic);
00320     pr("Mobility <m>: %d\n", plane->pln_mobil);
00321     pr("Tech <t>: %d\t\t", plane->pln_tech);
00322     pr("Wing <w>: %.1s\n", &plane->pln_wing);
00323     pr("Range <r>: %d\t\t", plane->pln_range);
00324     pr("Flags <f>: %d\n", plane->pln_flags);
00325     pr("Ship <s>: %d\t\t", plane->pln_ship);
00326     pr("Land Unit <y>: %d\t", plane->pln_land);
00327     pr("Nuke Type <n>: %d\n", plane->pln_nuketype);
00328 }
00329 
00330 static void
00331 pr_land(struct lndstr *land)
00332 {
00333     pr("UID <U>: %d\n", land->lnd_uid);
00334     pr("Owner <O>: %d\n", land->lnd_own);
00335     pr("Location <L>: %s\n", xyas(land->lnd_x, land->lnd_y, player->cnum));
00336     pr("Efficiency <e>: %d\t", land->lnd_effic);
00337     pr("Mobility <M>: %d\n", land->lnd_mobil);
00338     pr("Tech <t>: %d\t\t", land->lnd_tech);
00339     pr("Army <a>: %.1s\n", &land->lnd_army);
00340     pr("Fortification <F>: %d\t", land->lnd_harden);
00341     pr("Fuel <B>: %d\n", land->lnd_fuel);
00342     pr("Land unit <Y>: %d\n", land->lnd_land);
00343     pr("Ship <S>: %d\t\t", land->lnd_ship);
00344     pr("Radius <P>: %d\n", land->lnd_rad_max);
00345     pr("Retreat percentage <Z>: %d\n", land->lnd_retreat);
00346     pr("Retreat path <R>: '%s'\t\tRetreat Flags <W>: %d\n",
00347        land->lnd_rpath, land->lnd_rflags);
00348     pr("civ mil  uw food shl gun  pet  irn  dst  oil  lcm  hcm rad\n");
00349     pr("  c   m   u    f   s   g    p    i    d    o    l    h   r\n");
00350     pr("%3d", land->lnd_item[I_CIVIL]);
00351     pr("%4d", land->lnd_item[I_MILIT]);
00352     pr("%4d", land->lnd_item[I_UW]);
00353     pr("%5d", land->lnd_item[I_FOOD]);
00354     pr("%4d", land->lnd_item[I_SHELL]);
00355     pr("%4d", land->lnd_item[I_GUN]);
00356     pr("%5d", land->lnd_item[I_PETROL]);
00357     pr("%5d", land->lnd_item[I_IRON]);
00358     pr("%5d", land->lnd_item[I_DUST]);
00359     pr("%5d", land->lnd_item[I_OIL]);
00360     pr("%5d", land->lnd_item[I_LCM]);
00361     pr("%5d", land->lnd_item[I_HCM]);
00362     pr("%4d", land->lnd_item[I_RAD]);
00363     pr("\n");
00364 }
00365 
00366 static void
00367 pr_ship(struct shpstr *ship)
00368 {
00369     struct natstr *natp;
00370 
00371     if ((natp = getnatp(ship->shp_own)) == 0)
00372         return;
00373     pr("%s (#%d) %s\n", natp->nat_cnam, ship->shp_own, prship(ship));
00374     pr("UID <U>: %d\n", ship->shp_uid);
00375     pr("Owner <O>: %d\t\t\t", ship->shp_own);
00376     pr("Location <L>: %s\n", xyas(ship->shp_x, ship->shp_y, player->cnum));
00377     pr("Tech <T>: %d\t\t\t", ship->shp_tech);
00378     pr("Efficiency <E>: %d\n", ship->shp_effic);
00379     pr("Mobility <M>: %d\t\t", ship->shp_mobil);
00380     pr("Fleet <F>: %.1s\n", &ship->shp_fleet);
00381     /* could depend on opt_FUEL - but a deity might want to set this
00382        up before enabling the option */
00383     pr("Fuel <B>: %d\n", ship->shp_fuel);
00384     pr("Retreat path <R>: '%s'\t\tRetreat Flags <W>: %d\n",
00385        ship->shp_rpath, ship->shp_rflags);
00386     pr("Plague Stage <a>: %d\t\t",ship->shp_pstage);
00387     pr("Plague Time <b>: %d\n", ship->shp_ptime);
00388     pr("civ mil  uw food shl gun  pet  irn  dst  oil  lcm  hcm rad\n");
00389     pr("  c   m   u    f   s   g    p    i    d    o    l    h   r\n");
00390     pr("%3d", ship->shp_item[I_CIVIL]);
00391     pr("%4d", ship->shp_item[I_MILIT]);
00392     pr("%4d", ship->shp_item[I_UW]);
00393     pr("%5d", ship->shp_item[I_FOOD]);
00394     pr("%4d", ship->shp_item[I_SHELL]);
00395     pr("%4d", ship->shp_item[I_GUN]);
00396     pr("%5d", ship->shp_item[I_PETROL]);
00397     pr("%5d", ship->shp_item[I_IRON]);
00398     pr("%5d", ship->shp_item[I_DUST]);
00399     pr("%5d", ship->shp_item[I_OIL]);
00400     pr("%5d", ship->shp_item[I_LCM]);
00401     pr("%5d", ship->shp_item[I_HCM]);
00402     pr("%4d", ship->shp_item[I_RAD]);
00403     pr("\n");
00404 }
00405 
00406 static int
00407 errcheck(int num, int min, int max)
00408 {
00409     if (num < min)
00410         return min;
00411     else if (num > max)
00412         return max;
00413     return num;
00414 }
00415 
00416 static int
00417 getin(char *buf, char **valp)
00418 {
00419     char *p;
00420     unsigned char thing;
00421 
00422     p = getstarg(NULL, "%c xxxxx -- thing value : ", buf);
00423     if (!p)
00424         return -1;
00425     if (!*p)
00426         return 0;
00427     for (; isspace(*p); p++) ;
00428     if (!*p)
00429         return -1;
00430     thing = *p;
00431     for (; *p && !isspace(*p); p++) ;
00432     for (; isspace(*p); p++) ;
00433     if (!*p)
00434         return -1;
00435     *valp = p;
00436     return thing;
00437 }
00438 
00439 static void
00440 warn_deprecated(char key)
00441 {
00442     pr("Key <%c> is deprecated and will go away in a future release\n", key);
00443 }
00444 
00445 static int
00446 doland(char op, int arg, char *p, struct sctstr *sect)
00447 {
00448     natid newown, oldown;
00449     coord newx, newy;
00450     int new, old;
00451     int des;
00452     switch (op) {
00453     case 'C':
00454         warn_deprecated(op);
00455         if (arg < 0)
00456             return RET_SYN;
00457         sect->sct_coastal = (arg ? 1 : 0);
00458         pr("Coastal flag of %s changed to %d\n",
00459            xyas(sect->sct_x, sect->sct_y, player->cnum),
00460            sect->sct_coastal);
00461         break;
00462     case 'o':
00463         if (arg < 0)
00464             return RET_SYN;
00465         newown = (natid)errcheck(arg, 0, MAXNOC - 1);
00466         pr("Owner of %s changed from %s (#%d) to %s (#%d).\n",
00467            xyas(sect->sct_x, sect->sct_y, player->cnum),
00468            cname(sect->sct_own), sect->sct_own, cname(newown), newown);
00469         if (sect->sct_own) {
00470             makelost(EF_SECTOR, sect->sct_own, 0,
00471                      sect->sct_x, sect->sct_y);
00472             wu(player->cnum, sect->sct_own,
00473                "Sector %s lost to deity intervention\n",
00474                xyas(sect->sct_x, sect->sct_y, sect->sct_own));
00475         }
00476         benefit(sect->sct_own, 0);
00477         sect->sct_own = newown;
00478         if (newown) {
00479             makenotlost(EF_SECTOR, newown, 0, sect->sct_x, sect->sct_y);
00480             wu(player->cnum, newown,
00481                "Sector %s gained from deity intervention\n",
00482                xyas(sect->sct_x, sect->sct_y, sect->sct_own));
00483         }
00484         benefit(newown, 1);
00485         break;
00486     case 'O':
00487         if (arg < 0)
00488             return RET_SYN;
00489         oldown = (natid)errcheck(arg, 0, MAXNOC - 1);
00490         pr("Old owner of %s changed from %s (#%d) to %s (#%d).\n",
00491            xyas(sect->sct_x, sect->sct_y, player->cnum),
00492            cname(sect->sct_oldown),
00493            sect->sct_oldown, cname(oldown), oldown);
00494         sect->sct_oldown = oldown;
00495         break;
00496     case 'e':
00497         new = errcheck(arg, 0, 100);
00498         noise(sect, "Efficiency", sect->sct_effic, new);
00499         sect->sct_effic = (unsigned char)new;
00500         break;
00501     case 'm':
00502         new = errcheck(arg, -127, 255);
00503         noise(sect, "Mobility", sect->sct_mobil, new);
00504         sect->sct_mobil = new;
00505         break;
00506     case 'i':
00507         new = errcheck(arg, 0, 127);
00508         noise(sect, "Iron ore content", sect->sct_min, new);
00509         sect->sct_min = (unsigned char)new;
00510         break;
00511     case 'g':
00512         new = errcheck(arg, 0, 127);
00513         noise(sect, "Gold content", sect->sct_gmin, new);
00514         sect->sct_gmin = (unsigned char)new;
00515         break;
00516     case 'f':
00517         new = errcheck(arg, 0, 127);
00518         noise(sect, "Fertility", sect->sct_fertil, new);
00519         sect->sct_fertil = (unsigned char)new;
00520         break;
00521     case 'c':
00522         new = errcheck(arg, 0, 127);
00523         noise(sect, "Oil content", sect->sct_oil, new);
00524         sect->sct_oil = (unsigned char)new;
00525         break;
00526     case 'u':
00527         new = errcheck(arg, 0, 127);
00528         noise(sect, "Uranium content", sect->sct_uran, new);
00529         sect->sct_uran = (unsigned char)new;
00530         break;
00531     case 'w':
00532         new = errcheck(arg, 0, 100);
00533         noise(sect, "Workforce percentage", sect->sct_work, new);
00534         sect->sct_work = (unsigned char)new;
00535         break;
00536     case 'l':
00537         new = errcheck(arg, 0, 127);
00538         pr("Loyalty of %s changed from %d to %d%%\n",
00539            xyas(sect->sct_x, sect->sct_y, player->cnum),
00540            sect->sct_loyal, new);
00541         sect->sct_loyal = (unsigned char)new;
00542         break;
00543     case 'x':
00544         old = sect->sct_che;
00545         new = errcheck(arg, 0, CHE_MAX);
00546         pr("Guerillas in %s changed from %d to %d\n",
00547            xyas(sect->sct_x, sect->sct_y, player->cnum), old, new);
00548         sect->sct_che = new;
00549         break;
00550     case 'X':
00551         old = sect->sct_che_target;
00552         new = errcheck(arg, 0, MAXNOC - 1);
00553         pr("Che target of %s changed from %s (#%d) to %s (#%d).\n",
00554            xyas(sect->sct_x, sect->sct_y, player->cnum),
00555            cname(old), old, cname(new), new);
00556         sect->sct_che_target = new;
00557         if (new == 0)
00558             sect->sct_che = 0;
00559         break;
00560     case 'p':
00561         old = sect->sct_pstage;
00562         new = errcheck(arg, 0, PLG_EXPOSED);
00563         pr("Plague stage of %s changed from %d to %d%%\n",
00564            xyas(sect->sct_x, sect->sct_y, player->cnum), old, new);
00565         sect->sct_pstage = new;
00566         break;
00567     case 't':
00568         old = sect->sct_ptime;
00569         new = errcheck(arg, 0, 255);
00570         pr("Plague time of %s changed from %d to %d%%\n",
00571            xyas(sect->sct_x, sect->sct_y, player->cnum), old, new);
00572         sect->sct_ptime = new;
00573         break;
00574     case 'F':
00575         old = sect->sct_fallout;
00576         new = errcheck(arg, 0, FALLOUT_MAX);
00577         pr("Fallout for sector %s changed from %d to %d\n",
00578            xyas(sect->sct_x, sect->sct_y, player->cnum), old, new);
00579         sect->sct_fallout = new;
00580         break;
00581     case 'a':
00582         new = errcheck(arg, 0, 9999);
00583         noise(sect, "Available workforce", sect->sct_avail, new);
00584         sect->sct_avail = new;
00585         break;
00586     case 'M':
00587         new = errcheck(arg, 0, MINES_MAX);
00588         sect->sct_mines = new;
00589         pr("Mines changed to %d\n", new);
00590         break;
00591     case 'L':
00592         if (!sarg_xy(p, &newx, &newy))
00593             return RET_SYN;
00594         sect->sct_x = newx;
00595         sect->sct_y = newy;
00596         break;
00597     case 'D':
00598         if (!sarg_xy(p, &newx, &newy))
00599             return RET_SYN;
00600         pr("Distribution Location for sector %s changed from %s to %s\n",
00601            xyas(sect->sct_x, sect->sct_y, player->cnum),
00602            xyas(sect->sct_dist_x, sect->sct_dist_y, player->cnum),
00603            xyas(newx, newy, player->cnum));
00604         sect->sct_dist_x = newx;
00605         sect->sct_dist_y = newy;
00606         break;
00607     case 's':
00608         des = sct_typematch(p);
00609         if (des < 0)
00610             return RET_SYN;
00611         pr("Designation for sector %s changed from %c to %c\n",
00612            xyas(sect->sct_x, sect->sct_y, player->cnum),
00613            dchr[sect->sct_type].d_mnem, dchr[des].d_mnem);
00614         set_coastal(sect, sect->sct_type, des);
00615         sect->sct_type = des;
00616         break;
00617     case 'S':
00618         des = sct_typematch(p);
00619         if (des < 0)
00620             return RET_SYN;
00621         pr("New Designation for sector %s changed from %c to %c\n",
00622            xyas(sect->sct_x, sect->sct_y, player->cnum),
00623            dchr[sect->sct_newtype].d_mnem, dchr[des].d_mnem);
00624         sect->sct_newtype = des;
00625         break;
00626     case 'R':
00627         if (arg > 100)
00628             arg = 100;
00629         if (arg < 0)
00630             arg = 0;
00631         noise(sect, "Road percentage", sect->sct_road, arg);
00632         sect->sct_road = arg;
00633         break;
00634     case 'r':
00635         if (arg > 100)
00636             arg = 100;
00637         if (arg < 0)
00638             arg = 0;
00639         noise(sect, "Rail percentage", sect->sct_rail, arg);
00640         sect->sct_rail = arg;
00641         break;
00642     case 'd':
00643         if (arg > 100)
00644             arg = 100;
00645         if (arg < 0)
00646             arg = 0;
00647         noise(sect, "Defense percentage", sect->sct_defense, arg);
00648         sect->sct_defense = arg;
00649         break;
00650     default:
00651         pr("huh? (%c)\n", op);
00652         return RET_SYN;
00653     }
00654     return RET_OK;
00655 }
00656 
00657 
00658 static int
00659 docountry(char op, int arg, char *p, struct natstr *np)
00660 {
00661     coord newx, newy;
00662     natid nat = np->nat_cnum;
00663     float farg = (float)atof(p);
00664 
00665     switch (op) {
00666     case 'n':
00667         pr("Country name changed from %s to %s\n", np->nat_cnam, p);
00668         strncpy(np->nat_cnam, p, sizeof(np->nat_cnam) - 1);
00669         break;
00670     case 'r':
00671         pr("Country representative changed from %s to %s\n",
00672            np->nat_pnam, p);
00673         strncpy(np->nat_pnam, p, sizeof(np->nat_pnam) - 1);
00674         break;
00675     case 't':
00676         np->nat_tgms = arg;
00677         break;
00678     case 'b':
00679         arg = errcheck(arg, 0, 1024);
00680         pr("BTU's changed from %d to %d\n", np->nat_btu, arg);
00681         np->nat_btu = arg;
00682         break;
00683     case 'm':
00684         benefit(nat, np->nat_reserve < arg);
00685         pr("Military Reserves changed from %ld to %d\n",
00686            np->nat_reserve, arg);
00687         wu(player->cnum, nat,
00688            "Military Reserves changed from %ld to %d by divine intervention.\n",
00689            np->nat_reserve, arg);
00690         np->nat_reserve = arg;
00691         break;
00692     case 'c':
00693         if (!sarg_xy(p, &newx, &newy))
00694             return RET_SYN;
00695         pr("Capital coordinates changed from %s to %s\n",
00696            xyas(np->nat_xcap, np->nat_ycap, player->cnum),
00697            xyas(newx, newy, player->cnum));
00698         np->nat_xcap = newx;
00699         np->nat_ycap = newy;
00700         break;
00701     case 'o':
00702         if (!sarg_xy(p, &newx, &newy))
00703             return RET_SYN;
00704         pr("Origin coordinates changed from %s to %s\n",
00705            xyas(np->nat_xorg, np->nat_yorg, player->cnum),
00706            xyas(newx, newy, player->cnum));
00707         np->nat_xorg = newx;
00708         np->nat_yorg = newy;
00709         break;
00710     case 's':
00711         np->nat_stat = (nat_status)errcheck(arg, STAT_UNUSED, STAT_GOD);
00712         break;
00713     case 'u':
00714         arg = errcheck(arg, 0, m_m_p_d);
00715         pr("Number of minutes used changed from %d to %d.\n",
00716            np->nat_minused, arg);
00717         np->nat_minused = arg;
00718         break;
00719     case 'M':
00720         pr("Money changed from %ld to %d\n", np->nat_money, arg);
00721         wu(player->cnum, nat,
00722            "Money changed from %ld to %d by divine intervention.\n",
00723            np->nat_money, arg);
00724         np->nat_money = arg;
00725         break;
00726     case 'T':
00727         pr("Tech changed from %.2f to %.2f.\n",
00728            np->nat_level[NAT_TLEV], farg);
00729         np->nat_level[NAT_TLEV] = farg;
00730         break;
00731     case 'R':
00732         pr("Research changed from %.2f to %.2f.\n",
00733            np->nat_level[NAT_RLEV], farg);
00734         np->nat_level[NAT_RLEV] = farg;
00735         break;
00736     case 'E':
00737         pr("Education changed from %.2f to %.2f.\n",
00738            np->nat_level[NAT_ELEV], farg);
00739         np->nat_level[NAT_ELEV] = farg;
00740         break;
00741     case 'H':
00742         pr("Happiness changed from %.2f to %.2f.\n",
00743            np->nat_level[NAT_HLEV], farg);
00744         np->nat_level[NAT_HLEV] = farg;
00745         break;
00746     case 'U':
00747         warn_deprecated(op);
00748         break;
00749     default:
00750         pr("huh? (%c)\n", op);
00751         break;
00752     }
00753     putnat(np);
00754     return RET_OK;
00755 }
00756 
00757 
00758 static int
00759 doship(char op, int arg, char *p, struct shpstr *ship)
00760 {
00761     coord newx, newy;
00762 
00763     newx = newy = 0;
00764     switch (op) {
00765     case 'a':
00766         ship->shp_pstage = arg;
00767         break;
00768     case 'b':
00769         ship->shp_ptime = arg;
00770         break;
00771     case 'R':
00772         strncpy(ship->shp_rpath, p, sizeof(ship->shp_rpath) - 1);
00773         break;
00774     case 'W':
00775         ship->shp_rflags = arg;
00776         break;
00777     case 'H':
00778         warn_deprecated(op);
00779         ship->shp_nchoppers = arg;
00780         break;
00781     case 'X':
00782         warn_deprecated(op);
00783         ship->shp_nxlight = arg;
00784         break;
00785     case 'U':
00786         ship->shp_uid = arg;
00787         break;
00788     case 'O':
00789         if (ship->shp_own)
00790             wu(player->cnum, ship->shp_own,
00791                "%s taken from you by deity intervention!\n", prship(ship));
00792         if (arg && arg < MAXNOC) {
00793             wu(player->cnum, (natid)arg,
00794                "%s given to you by deity intervention!\n", prship(ship));
00795             makelost(EF_SHIP, ship->shp_own, ship->shp_uid,
00796                      ship->shp_x, ship->shp_y);
00797             ship->shp_own = (natid)arg;
00798             makenotlost(EF_SHIP, ship->shp_own, ship->shp_uid,
00799                         ship->shp_x, ship->shp_y);
00800         } else if (!arg)
00801             ship->shp_effic = 0;
00802         break;
00803     case 'L':
00804         if (!sarg_xy(p, &newx, &newy))
00805             return RET_SYN;
00806         ship->shp_x = newx;
00807         ship->shp_y = newy;
00808         break;
00809     case 'T':
00810         shp_set_tech(ship,
00811                      errcheck(arg,
00812                               mchr[(int)ship->shp_type].m_tech, SHRT_MAX));
00813         break;
00814     case 'E':
00815         ship->shp_effic = errcheck(arg, SHIP_MINEFF, 100);
00816         break;
00817     case 'M':
00818         ship->shp_mobil = arg;
00819         break;
00820     case 'B':
00821         ship->shp_fuel = errcheck(arg, 0, 255);
00822         break;
00823     case 'F':
00824         if (p[0] == '~')
00825             ship->shp_fleet = 0;
00826         else if (isalpha(p[0]))
00827             ship->shp_fleet = p[0];
00828         else {
00829             pr("%c: invalid fleet\n", p[0]);
00830             return RET_FAIL;
00831         }
00832         break;
00833     case 'Y':
00834         warn_deprecated(op);
00835         ship->shp_nland = errcheck(arg, 0, 100);
00836         break;
00837     case 'P':
00838         warn_deprecated(op);
00839         ship->shp_nplane = errcheck(arg, 0, 100);
00840         break;
00841     case 'c':
00842         ship->shp_item[I_CIVIL] = arg;
00843         break;
00844     case 'm':
00845         ship->shp_item[I_MILIT] = arg;
00846         break;
00847     case 'u':
00848         ship->shp_item[I_UW] = arg;
00849         break;
00850     case 'f':
00851         ship->shp_item[I_FOOD] = arg;
00852         break;
00853     case 's':
00854         ship->shp_item[I_SHELL] = arg;
00855         break;
00856     case 'g':
00857         ship->shp_item[I_GUN] = arg;
00858         break;
00859     case 'p':
00860         ship->shp_item[I_PETROL] = arg;
00861         break;
00862     case 'i':
00863         ship->shp_item[I_IRON] = arg;
00864         break;
00865     case 'd':
00866         ship->shp_item[I_DUST] = arg;
00867         break;
00868     case 'o':
00869         ship->shp_item[I_OIL] = arg;
00870         break;
00871     case 'l':
00872         ship->shp_item[I_LCM] = arg;
00873         break;
00874     case 'h':
00875         ship->shp_item[I_HCM] = arg;
00876         break;
00877     case 'r':
00878         ship->shp_item[I_RAD] = arg;
00879         break;
00880     default:
00881         pr("huh? (%c)\n", op);
00882         return RET_FAIL;
00883     }
00884     return RET_OK;
00885 }
00886 
00887 static int
00888 dounit(char op, int arg, char *p, struct lndstr *land)
00889 {
00890     coord newx, newy;
00891 
00892     newx = newy = 0;
00893     switch (op) {
00894     case 'Y':
00895         land->lnd_land = arg;
00896         break;
00897     case 'U':
00898         land->lnd_uid = arg;
00899         break;
00900     case 'O':
00901         if (land->lnd_own)
00902             wu(player->cnum, land->lnd_own,
00903                "%s taken from you by deity intervention!\n", prland(land));
00904 
00905         if (arg && arg < MAXNOC) {
00906             wu(player->cnum, (natid)arg,
00907                "%s given to you by deity intervention!\n", prland(land));
00908             makelost(EF_LAND, land->lnd_own, land->lnd_uid,
00909                      land->lnd_x, land->lnd_y);
00910             land->lnd_own = (natid)arg;
00911             makenotlost(EF_LAND, land->lnd_own, land->lnd_uid,
00912                         land->lnd_x, land->lnd_y);
00913         } else if (!arg)
00914             land->lnd_effic = 0;
00915         break;
00916     case 'L':
00917         if (!sarg_xy(p, &newx, &newy))
00918             return RET_SYN;
00919         land->lnd_x = newx;
00920         land->lnd_y = newy;
00921         break;
00922     case 'e':
00923         land->lnd_effic = errcheck(arg, LAND_MINEFF, 100);
00924         break;
00925     case 'M':
00926         land->lnd_mobil = arg;
00927         break;
00928     case 't':
00929         lnd_set_tech(land,
00930                      errcheck(arg,
00931                               lchr[(int)land->lnd_type].l_tech, SHRT_MAX));
00932         break;
00933     case 'a':
00934         if (p[0] == '~')
00935             land->lnd_army = 0;
00936         else if (isalpha(p[0]))
00937             land->lnd_army = p[0];
00938         else {
00939             pr("%c: invalid army\n", p[0]);
00940             return RET_FAIL;
00941         }
00942         break;
00943     case 'F':
00944         land->lnd_harden = errcheck(arg, 0, 255);
00945         break;
00946     case 'B':
00947         land->lnd_fuel = errcheck(arg, 0, 255);
00948         break;
00949     case 'X':
00950         warn_deprecated(op);
00951         land->lnd_nxlight = arg;
00952         break;
00953     case 'S':
00954         land->lnd_ship = arg;
00955         break;
00956     case 'P':
00957         land->lnd_rad_max = arg;
00958         break;
00959     case 'Z':
00960         land->lnd_retreat = arg;
00961         break;
00962     case 'R':
00963         strncpy(land->lnd_rpath, p, sizeof(land->lnd_rpath) - 1);
00964         break;
00965     case 'W':
00966         land->lnd_rflags = arg;
00967         break;
00968     case 'c':
00969         land->lnd_item[I_CIVIL] = arg;
00970         break;
00971     case 'm':
00972         land->lnd_item[I_MILIT] = arg;
00973         break;
00974     case 'u':
00975         land->lnd_item[I_UW] = arg;
00976         break;
00977     case 'f':
00978         land->lnd_item[I_FOOD] = arg;
00979         break;
00980     case 's':
00981         land->lnd_item[I_SHELL] = arg;
00982         break;
00983     case 'g':
00984         land->lnd_item[I_GUN] = arg;
00985         break;
00986     case 'p':
00987         land->lnd_item[I_PETROL] = arg;
00988         break;
00989     case 'i':
00990         land->lnd_item[I_IRON] = arg;
00991         break;
00992     case 'd':
00993         land->lnd_item[I_DUST] = arg;
00994         break;
00995     case 'o':
00996         land->lnd_item[I_OIL] = arg;
00997         break;
00998     case 'l':
00999         land->lnd_item[I_LCM] = arg;
01000         break;
01001     case 'h':
01002         land->lnd_item[I_HCM] = arg;
01003         break;
01004     case 'r':
01005         land->lnd_item[I_RAD] = arg;
01006         break;
01007     default:
01008         pr("huh? (%c)\n", op);
01009         return RET_FAIL;
01010     }
01011     return RET_OK;
01012 }
01013 
01014 
01015 int
01016 doplane(char op, int arg, char *p, struct plnstr *plane)
01017 {
01018     coord newx, newy;
01019 
01020     switch (op) {
01021     case 'n':
01022         plane->pln_nuketype = arg;
01023         break;
01024     case 'U':
01025         plane->pln_uid = arg;
01026         break;
01027     case 'l':
01028         if (!sarg_xy(p, &newx, &newy))
01029             return RET_SYN;
01030         plane->pln_x = newx;
01031         plane->pln_y = newy;
01032         break;
01033     case 'O':
01034         if (plane->pln_own)
01035             wu(player->cnum, plane->pln_own,
01036                "%s taken from you by deity intervention!\n",
01037                prplane(plane));
01038         if (arg && arg < MAXNOC) {
01039             makelost(EF_PLANE, plane->pln_own, plane->pln_uid,
01040                      plane->pln_x, plane->pln_y);
01041             plane->pln_own = (natid)arg;
01042             makenotlost(EF_PLANE, plane->pln_own, plane->pln_uid,
01043                         plane->pln_x, plane->pln_y);
01044             wu(player->cnum, plane->pln_own,
01045                "%s given to you by deity intervention!\n", prplane(plane));
01046         } else if (!arg)
01047             plane->pln_effic = 0;
01048         break;
01049     case 'e':
01050         plane->pln_effic = errcheck(arg, PLANE_MINEFF, 100);
01051         break;
01052     case 'm':
01053         plane->pln_mobil = errcheck(arg, -127, 255);
01054         break;
01055     case 't':
01056         pln_set_tech(plane,
01057                      errcheck(arg,
01058                               plchr[(int)plane->pln_type].pl_tech, SHRT_MAX));
01059         break;
01060     case 'w':
01061         if (p[0] == '~')
01062             plane->pln_wing = 0;
01063         else if (isalpha(p[0]))
01064             plane->pln_wing = p[0];
01065         else {
01066             pr("%c: invalid wing\n", p[0]);
01067             return RET_FAIL;
01068         }
01069         break;
01070     case 'a':
01071         warn_deprecated(op);
01072         plane->pln_att = arg;
01073         break;
01074     case 'd':
01075         warn_deprecated(op);
01076         plane->pln_def = arg;
01077         break;
01078     case 'r':
01079         plane->pln_range = (unsigned char)arg;
01080         break;
01081     case 's':
01082         plane->pln_ship = arg;
01083         break;
01084     case 'y':
01085         plane->pln_land = arg;
01086         break;
01087     case 'f':
01088         plane->pln_flags = arg;
01089         break;
01090     default:
01091         pr("huh? (%c)\n", op);
01092         return RET_FAIL;
01093     }
01094     return RET_OK;
01095 }

Generated on Fri Mar 28 11:01:12 2008 for empserver by  doxygen 1.5.2