00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
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, §))
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(§);
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(§);
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, §)) != RET_OK)
00195 return err;
00196 if (!putsect(§))
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
00382
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 }