Annotation of micropolis/src/sim/w_sim.c, revision 1.1.1.1

1.1       root        1: /* w_sim.c
                      2:  *
                      3:  * Micropolis, Unix Version.  This game was released for the Unix platform
                      4:  * in or about 1990 and has been modified for inclusion in the One Laptop
                      5:  * Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
                      6:  * you need assistance with this program, you may contact:
                      7:  *   http://wiki.laptop.org/go/Micropolis  or email  [email protected].
                      8:  * 
                      9:  * This program is free software: you can redistribute it and/or modify
                     10:  * it under the terms of the GNU General Public License as published by
                     11:  * the Free Software Foundation, either version 3 of the License, or (at
                     12:  * your option) any later version.
                     13:  * 
                     14:  * This program is distributed in the hope that it will be useful, but
                     15:  * WITHOUT ANY WARRANTY; without even the implied warranty of
                     16:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
                     17:  * General Public License for more details.  You should have received a
                     18:  * copy of the GNU General Public License along with this program.  If
                     19:  * not, see <http://www.gnu.org/licenses/>.
                     20:  * 
                     21:  *             ADDITIONAL TERMS per GNU GPL Section 7
                     22:  * 
                     23:  * No trademark or publicity rights are granted.  This license does NOT
                     24:  * give you any right, title or interest in the trademark SimCity or any
                     25:  * other Electronic Arts trademark.  You may not distribute any
                     26:  * modification of this program using the trademark SimCity or claim any
                     27:  * affliation or association with Electronic Arts Inc. or its employees.
                     28:  * 
                     29:  * Any propagation or conveyance of this program must include this
                     30:  * copyright notice and these terms.
                     31:  * 
                     32:  * If you convey this program (or any modifications of it) and assume
                     33:  * contractual liability for the program to recipients of it, you agree
                     34:  * to indemnify Electronic Arts for any liability that those contractual
                     35:  * assumptions impose on Electronic Arts.
                     36:  * 
                     37:  * You may not misrepresent the origins of this program; modified
                     38:  * versions of the program must be marked as such and not identified as
                     39:  * the original program.
                     40:  * 
                     41:  * This disclaimer supplements the one included in the General Public
                     42:  * License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
                     43:  * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
                     44:  * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
                     45:  * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
                     46:  * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
                     47:  * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
                     48:  * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
                     49:  * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
                     50:  * USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
                     51:  * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
                     52:  * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
                     53:  * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
                     54:  * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
                     55:  * CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
                     56:  * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
                     57:  * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
                     58:  * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
                     59:  * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
                     60:  * NOT APPLY TO YOU.
                     61:  */
                     62: #include "sim.h"
                     63: 
                     64: 
                     65: Tcl_HashTable SimCmds;
                     66: 
                     67: 
                     68: #define SIMCMD_CALL(proc) \
                     69:   int SimCmd##proc(ARGS) { proc(); return (TCL_OK); }
                     70: 
                     71: #define SIMCMD_CALL_KICK(proc) \
                     72:   int SimCmd##proc(ARGS) { proc(); Kick(); return (TCL_OK); }
                     73: 
                     74: #define SIMCMD_CALL_INT(proc) \
                     75:   int SimCmd##proc(ARGS) { \
                     76:     int val; \
                     77:     if (argc != 3) return (TCL_ERROR); \
                     78:     if ((Tcl_GetInt(interp, argv[2], &val) != TCL_OK)) return (TCL_ERROR); \
                     79:     proc(val); \
                     80:     return (TCL_OK); \
                     81:   }
                     82: 
                     83: #define SIMCMD_CALL_STR(proc) \
                     84:   int SimCmd##proc(ARGS) { \
                     85:     if (argc != 3) return (TCL_ERROR); \
                     86:     proc(argv[2]); \
                     87:     return (TCL_OK); \
                     88:   }
                     89: 
                     90: #define SIMCMD_CALL_TILEXY(proc) \
                     91:   int SimCmd##proc(ARGS) { \
                     92:     int x, y; \
                     93:     if (argc != 4) return (TCL_ERROR); \
                     94:     if ((Tcl_GetInt(interp, argv[2], &x) != TCL_OK) || \
                     95:        (x < 0) || (x >= WORLD_X)) return (TCL_ERROR); \
                     96:     if ((Tcl_GetInt(interp, argv[3], &y) != TCL_OK) || \
                     97:        (y < 0) || (y >= WORLD_Y)) return (TCL_ERROR); \
                     98:     proc(x, y); \
                     99:     return (TCL_OK); \
                    100:   }
                    101: 
                    102: #define SIMCMD_ACCESS_INT(var) \
                    103:   int SimCmd##var(ARGS) { \
                    104:     int val; \
                    105:     if ((argc != 2) && (argc != 3)) return (TCL_ERROR); \
                    106:     if (argc == 3) { \
                    107:       if (Tcl_GetInt(interp, argv[2], &val) != TCL_OK) return (TCL_ERROR); \
                    108:       var = val; \
                    109:     } \
                    110:     sprintf(interp->result, "%d", var); \
                    111:     return (TCL_OK); \
                    112:   }
                    113: 
                    114: #define SIMCMD_GET_INT(var) \
                    115:   int SimCmd##var(ARGS) { \
                    116:     sprintf(interp->result, "%d", var); \
                    117:     return (TCL_OK); \
                    118:   }
                    119: 
                    120: #define SIMCMD_GET_STR(var) \
                    121:   int SimCmd##var(ARGS) { \
                    122:     sprintf(interp->result, "%s", var); \
                    123:     return (TCL_OK); \
                    124:   }
                    125: 
                    126: 
                    127: SIMCMD_CALL_KICK(GameStarted)
                    128: SIMCMD_CALL_KICK(InitGame)
                    129: SIMCMD_CALL(SaveCity)
                    130: SIMCMD_CALL(ReallyQuit)
                    131: SIMCMD_CALL_KICK(UpdateHeads)
                    132: SIMCMD_CALL_KICK(UpdateMaps)
                    133: SIMCMD_CALL_KICK(UpdateEditors)
                    134: SIMCMD_CALL_KICK(RedrawMaps)
                    135: SIMCMD_CALL_KICK(RedrawEditors)
                    136: SIMCMD_CALL_KICK(UpdateGraphs)
                    137: SIMCMD_CALL_KICK(UpdateEvaluation)
                    138: SIMCMD_CALL_KICK(UpdateBudget)
                    139: SIMCMD_CALL_KICK(UpdateBudgetWindow)
                    140: SIMCMD_CALL_KICK(DoBudget)
                    141: SIMCMD_CALL_KICK(DoBudgetFromMenu)
                    142: SIMCMD_CALL_KICK(Pause)
                    143: SIMCMD_CALL_KICK(Resume)
                    144: SIMCMD_CALL(StartBulldozer)
                    145: SIMCMD_CALL(StopBulldozer)
                    146: SIMCMD_CALL(MakeFire)
                    147: SIMCMD_CALL(MakeFlood)
                    148: SIMCMD_CALL(MakeTornado)
                    149: SIMCMD_CALL(MakeEarthquake)
                    150: SIMCMD_CALL(MakeMonster)
                    151: SIMCMD_CALL(MakeMeltdown)
                    152: SIMCMD_CALL(FireBomb)
                    153: SIMCMD_CALL(SoundOff)
                    154: SIMCMD_CALL(GenerateNewCity)
                    155: SIMCMD_CALL_INT(GenerateSomeCity)
                    156: SIMCMD_ACCESS_INT(LakeLevel)
                    157: SIMCMD_ACCESS_INT(TreeLevel)
                    158: SIMCMD_ACCESS_INT(CurveLevel)
                    159: SIMCMD_ACCESS_INT(CreateIsland)
                    160: SIMCMD_CALL_KICK(SmoothTrees)
                    161: SIMCMD_CALL_KICK(SmoothWater)
                    162: SIMCMD_CALL_KICK(SmoothRiver)
                    163: SIMCMD_CALL_KICK(ClearMap)
                    164: SIMCMD_CALL_KICK(ClearUnnatural)
                    165: SIMCMD_CALL_INT(LoadScenario)
                    166: SIMCMD_CALL_STR(LoadCity)
                    167: SIMCMD_CALL_STR(SaveCityAs)
                    168: SIMCMD_CALL_TILEXY(MakeExplosion)
                    169: SIMCMD_CALL(EraseOverlay)
                    170: SIMCMD_ACCESS_INT(OverRide)
                    171: SIMCMD_ACCESS_INT(Expensive)
                    172: SIMCMD_ACCESS_INT(Players)
                    173: SIMCMD_ACCESS_INT(Votes)
                    174: SIMCMD_ACCESS_INT(BobHeight)
                    175: SIMCMD_ACCESS_INT(PendingTool)
                    176: SIMCMD_ACCESS_INT(PendingX)
                    177: SIMCMD_ACCESS_INT(PendingY)
                    178: SIMCMD_GET_STR(Displays)
                    179: 
                    180: 
                    181: int SimCmdCityName(ARGS)
                    182: {
                    183:   if ((argc != 2) && (argc != 3)) {
                    184:     return (TCL_ERROR);
                    185:   }
                    186: 
                    187:   if (argc == 3) {
                    188:     setCityName(argv[2]);
                    189:   }
                    190: 
                    191:   sprintf(interp->result, "%s", CityName);
                    192:   return (TCL_OK);
                    193: }
                    194: 
                    195: 
                    196: int SimCmdCityFileName(ARGS)
                    197: {
                    198:   if ((argc != 2) && (argc != 3)) {
                    199:     return (TCL_ERROR);
                    200:   }
                    201: 
                    202:   if (argc == 3) {
                    203:     if (CityFileName != NULL) {
                    204:       ckfree(CityFileName);
                    205:       CityFileName = NULL;
                    206:     }
                    207:     if (argv[2][0] != '\0') {
                    208:       CityFileName = (char *)ckalloc(strlen(argv[0]) + 1);
                    209:       strcpy(CityFileName, argv[2]);
                    210:     }
                    211:   }
                    212: 
                    213:   sprintf(interp->result, "%s", CityFileName ? CityFileName : "");
                    214:   return (TCL_OK);
                    215: }
                    216: 
                    217: 
                    218: int SimCmdGameLevel(ARGS)
                    219: {
                    220:   int level;
                    221: 
                    222:   if ((argc != 2) && (argc != 3)) {
                    223:     return (TCL_ERROR);
                    224:   }
                    225: 
                    226:   if (argc == 3) {
                    227:     if ((Tcl_GetInt(interp, argv[2], &level) != TCL_OK) ||
                    228:        (level < 0) || (level > 2)) {
                    229:       return (TCL_ERROR);
                    230:     }
                    231:     SetGameLevelFunds(level);
                    232:   }
                    233: 
                    234:   sprintf(interp->result, "%d", GameLevel);
                    235:   return (TCL_OK);
                    236: }
                    237: 
                    238: 
                    239: int SimCmdSpeed(ARGS)
                    240: {
                    241:   int speed;
                    242: 
                    243:   if ((argc != 2) && (argc != 3)) {
                    244:     return (TCL_ERROR);
                    245:   }
                    246: 
                    247:   if (argc == 3) {
                    248:     if ((Tcl_GetInt(interp, argv[2], &speed) != TCL_OK) ||
                    249:        (speed < 0) || (speed > 7)) {
                    250:       return (TCL_ERROR);
                    251:     }
                    252:     setSpeed(speed); Kick();
                    253:   }
                    254: 
                    255:   sprintf(interp->result, "%d", SimSpeed);
                    256:   return (TCL_OK);
                    257: }
                    258: 
                    259: 
                    260: int SimCmdSkips(ARGS)
                    261: {
                    262:   int skips;
                    263: 
                    264:   if ((argc != 2) && (argc != 3)) {
                    265:     return (TCL_ERROR);
                    266:   }
                    267: 
                    268:   if (argc == 3) {
                    269:     if ((Tcl_GetInt(interp, argv[2], &skips) != TCL_OK) ||
                    270:        (skips < 0)) {
                    271:       return (TCL_ERROR);
                    272:     }
                    273:     setSkips(skips); Kick();
                    274:   }
                    275: 
                    276:   sprintf(interp->result, "%d", sim_skips);
                    277: 
                    278:   return (TCL_OK);
                    279: }
                    280: 
                    281: 
                    282: int SimCmdSkip(ARGS)
                    283: {
                    284:   int skip;
                    285: 
                    286:   if ((argc != 2) && (argc != 3)) {
                    287:     return (TCL_ERROR);
                    288:   }
                    289: 
                    290:   if (argc == 3) {
                    291:     if ((Tcl_GetInt(interp, argv[2], &skip) != TCL_OK) ||
                    292:        (skip < 0)) {
                    293:       return (TCL_ERROR);
                    294:     }
                    295:     sim_skip = skip;
                    296:   }
                    297: 
                    298:   sprintf(interp->result, "%d", sim_skip);
                    299: 
                    300:   return (TCL_OK);
                    301: }
                    302: 
                    303: 
                    304: int SimCmdDelay(ARGS)
                    305: {
                    306:   int delay;
                    307: 
                    308:   if ((argc != 2) && (argc != 3)) {
                    309:     return (TCL_ERROR);
                    310:   }
                    311: 
                    312:   if (argc == 3) {
                    313:     if ((Tcl_GetInt(interp, argv[2], &delay) != TCL_OK) ||
                    314:        (delay < 0)) {
                    315:       return (TCL_ERROR);
                    316:     }
                    317:     sim_delay = delay; Kick();
                    318:   }
                    319: 
                    320:   sprintf(interp->result, "%d", sim_delay);
                    321:   return (TCL_OK);
                    322: }
                    323: 
                    324: 
                    325: int SimCmdWorldX(ARGS)
                    326: {
                    327:   int val;
                    328: 
                    329:   if (argc != 2) {
                    330:     return (TCL_ERROR);
                    331:   }
                    332: 
                    333:   sprintf(interp->result, "%d", WORLD_X);
                    334:   return (TCL_OK);
                    335: }
                    336: 
                    337: 
                    338: int SimCmdWorldY(ARGS)
                    339: {
                    340:   int val;
                    341: 
                    342:   if (argc != 2) {
                    343:     return (TCL_ERROR);
                    344:   }
                    345: 
                    346:   sprintf(interp->result, "%d", WORLD_Y);
                    347:   return (TCL_OK);
                    348: }
                    349: 
                    350: 
                    351: int SimCmdHeatSteps(ARGS)
                    352: {
                    353:   int steps;
                    354: 
                    355:   if ((argc != 2) && (argc != 3)) {
                    356:     return (TCL_ERROR);
                    357:   }
                    358: 
                    359:   if (argc == 3) {
                    360:     if ((Tcl_GetInt(interp, argv[2], &steps) != TCL_OK) ||
                    361:        (steps < 0)) {
                    362:       return (TCL_ERROR);
                    363:     }
                    364:     heat_steps = steps; Kick();
                    365:   }
                    366: 
                    367:   sprintf(interp->result, "%d", heat_steps);
                    368:   return (TCL_OK);
                    369: }
                    370: 
                    371: 
                    372: int SimCmdHeatFlow(ARGS)
                    373: {
                    374:   int flow;
                    375: 
                    376:   if ((argc != 2) && (argc != 3)) {
                    377:     return (TCL_ERROR);
                    378:   }
                    379: 
                    380:   if (argc == 3) {
                    381:     if (Tcl_GetInt(interp, argv[2], &flow) != TCL_OK) {
                    382:       return (TCL_ERROR);
                    383:     }
                    384:     heat_flow = flow;
                    385:   }
                    386: 
                    387:   sprintf(interp->result, "%d", heat_flow);
                    388:   return (TCL_OK);
                    389: }
                    390: 
                    391: 
                    392: int SimCmdHeatRule(ARGS)
                    393: {
                    394:   int rule;
                    395: 
                    396:   if ((argc != 2) && (argc != 3)) {
                    397:     return (TCL_ERROR);
                    398:   }
                    399: 
                    400:   if (argc == 3) {
                    401:     if (Tcl_GetInt(interp, argv[2], &rule) != TCL_OK) {
                    402:       return (TCL_ERROR);
                    403:     }
                    404:     heat_rule = rule;
                    405:   }
                    406: 
                    407:   sprintf(interp->result, "%d", heat_rule);
                    408:   return (TCL_OK);
                    409: }
                    410: 
                    411: 
                    412: #ifdef CAM
                    413: 
                    414: int SimCmdJustCam(ARGS)
                    415: {
                    416:   int cam;
                    417: 
                    418:   if ((argc != 2) && (argc != 3)) {
                    419:     return (TCL_ERROR);
                    420:   }
                    421: 
                    422:   if (argc == 3) {
                    423:     if (Tcl_GetInt(interp, argv[2], &cam) != TCL_OK) {
                    424:       return (TCL_ERROR);
                    425:     }
                    426:     sim_just_cam = cam;
                    427:   }
                    428: 
                    429:   sprintf(interp->result, "%d", sim_just_cam);
                    430:   return (TCL_OK);
                    431: }
                    432: 
                    433: #endif
                    434: 
                    435: 
                    436: #ifdef NET
                    437: 
                    438: int SimCmdListenTo(ARGS)
                    439: {
                    440:   int port, sock;
                    441: 
                    442:   if (argc != 3) {
                    443:     return (TCL_ERROR);
                    444:   }
                    445: 
                    446:   if (Tcl_GetInt(interp, argv[2], &port) != TCL_OK) {
                    447:     return (TCL_ERROR);
                    448:   }
                    449: 
                    450: #ifdef NET
                    451:   sock = udp_listen(port);
                    452: #endif  
                    453: 
                    454:   sprintf(interp->result, "%d", sock);
                    455: 
                    456:   return (TCL_OK);
                    457: }
                    458: 
                    459: 
                    460: int SimCmdHearFrom(ARGS)
                    461: {
                    462:   int sock;
                    463: 
                    464:   if (argc != 3) {
                    465:     return (TCL_ERROR);
                    466:   }
                    467: 
                    468:   if ((argv[2][0] != 'f') ||
                    469:       (argv[2][1] != 'i') ||
                    470:       (argv[2][2] != 'l') ||
                    471:       (argv[2][3] != 'e') ||
                    472:       (Tcl_GetInt(interp, argv[2] + 4, &sock) != TCL_OK)) {
                    473:     return (TCL_ERROR);
                    474:   }
                    475: 
                    476: #ifdef NET
                    477:   udp_hear(sock);
                    478: #endif  
                    479: 
                    480:   return (TCL_OK);
                    481: }
                    482: 
                    483: #endif /* NET */
                    484: 
                    485: 
                    486: int SimCmdFunds(ARGS)
                    487: {
                    488:   int funds;
                    489: 
                    490:   if ((argc != 2) && (argc != 3)) {
                    491:     return (TCL_ERROR);
                    492:   }
                    493: 
                    494:   if (argc == 3) {
                    495:     if ((Tcl_GetInt(interp, argv[2], &funds) != TCL_OK) ||
                    496:        (funds < 0)) {
                    497:       return (TCL_ERROR);
                    498:     }
                    499:     TotalFunds = funds;
                    500:     MustUpdateFunds = 1;
                    501:     Kick();
                    502:   }
                    503: 
                    504:   sprintf(interp->result, "%d", TotalFunds);
                    505:   return (TCL_OK);
                    506: }
                    507: 
                    508: 
                    509: int SimCmdTaxRate(ARGS)
                    510: {
                    511:   int tax;
                    512: 
                    513:   if ((argc != 2) && (argc != 3)) {
                    514:     return (TCL_ERROR);
                    515:   }
                    516: 
                    517:   if (argc == 3) {
                    518:     if ((Tcl_GetInt(interp, argv[2], &tax) != TCL_OK) ||
                    519:        (tax < 0) || (tax > 20)) {
                    520:       return (TCL_ERROR);
                    521:     }
                    522:     CityTax = tax;
                    523:     drawBudgetWindow(); Kick();
                    524:   }
                    525: 
                    526:   sprintf(interp->result, "%d", CityTax);
                    527:   return (TCL_OK);
                    528: }
                    529: 
                    530: 
                    531: int SimCmdFireFund(ARGS)
                    532: {
                    533:   int percent;
                    534: 
                    535:   if ((argc != 2) && (argc != 3)) {
                    536:     return (TCL_ERROR);
                    537:   }
                    538: 
                    539:   if (argc == 3) {
                    540:     if ((Tcl_GetInt(interp, argv[2], &percent) != TCL_OK) ||
                    541:        (percent < 0) || (percent > 100)) {
                    542:       return (TCL_ERROR);
                    543:     }
                    544:     firePercent = percent / 100.0;
                    545:     FireSpend = (fireMaxValue * percent) / 100;
                    546:     UpdateFundEffects(); Kick();
                    547:   }
                    548: 
                    549:   sprintf(interp->result, "%d", (int)(firePercent * 100.0));
                    550:   return (TCL_OK);
                    551: }
                    552: 
                    553: 
                    554: int SimCmdPoliceFund(ARGS)
                    555: {
                    556:   int percent;
                    557: 
                    558:   if ((argc != 2) && (argc != 3)) {
                    559:     return (TCL_ERROR);
                    560:   }
                    561: 
                    562:   if (argc == 3) {
                    563:     if ((Tcl_GetInt(interp, argv[2], &percent) != TCL_OK) ||
                    564:        (percent < 0) || (percent > 100)) {
                    565:       return (TCL_ERROR);
                    566:     }
                    567:     policePercent = percent / 100.0;
                    568:     PoliceSpend = (policeMaxValue * percent) / 100;
                    569:     UpdateFundEffects(); Kick();
                    570:   }
                    571: 
                    572:   sprintf(interp->result, "%d", (int)(policePercent * 100.0));
                    573:   return (TCL_OK);
                    574: }
                    575: 
                    576: 
                    577: int SimCmdRoadFund(ARGS)
                    578: {
                    579:   int percent;
                    580: 
                    581:   if ((argc != 2) && (argc != 3)) {
                    582:     return (TCL_ERROR);
                    583:   }
                    584: 
                    585:   if (argc == 3) {
                    586:     if ((Tcl_GetInt(interp, argv[2], &percent) != TCL_OK) ||
                    587:        (percent < 0) || (percent > 100)) {
                    588:       return (TCL_ERROR);
                    589:     }
                    590:     roadPercent = percent / 100.0;
                    591:     RoadSpend = (roadMaxValue * percent) / 100;
                    592:     UpdateFundEffects(); Kick();
                    593:   }
                    594: 
                    595:   sprintf(interp->result, "%d", (int)(roadPercent * 100.0));
                    596:   return (TCL_OK);
                    597: }
                    598: 
                    599: 
                    600: int SimCmdYear(ARGS)
                    601: {
                    602:   int year;
                    603: 
                    604:   if ((argc != 2) && (argc != 3)) {
                    605:     return (TCL_ERROR);
                    606:   }
                    607: 
                    608:   if (argc == 3) {
                    609:     if ((Tcl_GetInt(interp, argv[2], &year) != TCL_OK)) {
                    610:       return (TCL_ERROR);
                    611:     }
                    612:     SetYear(year);
                    613:   }
                    614: 
                    615:   sprintf(interp->result, "%d", CurrentYear());
                    616:   return (TCL_OK);
                    617: }
                    618: 
                    619: 
                    620: int SimCmdAutoBudget(ARGS)
                    621: {
                    622:   int val;
                    623: 
                    624:   if ((argc != 2) && (argc != 3)) {
                    625:     return (TCL_ERROR);
                    626:   }
                    627: 
                    628:   if (argc == 3) {
                    629:     if ((Tcl_GetInt(interp, argv[2], &val) != TCL_OK) ||
                    630:        (val < 0) || (val > 1)) {
                    631:       return (TCL_ERROR);
                    632:     }
                    633:     autoBudget = val;
                    634:     MustUpdateOptions = 1; Kick();
                    635:     UpdateBudget();
                    636:   }
                    637: 
                    638:   sprintf(interp->result, "%d", autoBudget);
                    639:   return (TCL_OK);
                    640: }
                    641: 
                    642: 
                    643: int SimCmdAutoGoto(ARGS)
                    644: {
                    645:   int val;
                    646: 
                    647:   if ((argc != 2) && (argc != 3)) {
                    648:     return (TCL_ERROR);
                    649:   }
                    650: 
                    651:   if (argc == 3) {
                    652:     if ((Tcl_GetInt(interp, argv[2], &val) != TCL_OK) ||
                    653:        (val < 0) || (val > 1)) {
                    654:       return (TCL_ERROR);
                    655:     }
                    656:     autoGo = val;
                    657:     MustUpdateOptions = 1; Kick();
                    658:   }
                    659: 
                    660:   sprintf(interp->result, "%d", autoGo);
                    661:   return (TCL_OK);
                    662: }
                    663: 
                    664: 
                    665: int SimCmdAutoBulldoze(ARGS)
                    666: {
                    667:   int val;
                    668: 
                    669:   if ((argc != 2) && (argc != 3)) {
                    670:     return (TCL_ERROR);
                    671:   }
                    672: 
                    673:   if (argc == 3) {
                    674:     if ((Tcl_GetInt(interp, argv[2], &val) != TCL_OK) ||
                    675:        (val < 0) || (val > 1)) {
                    676:       return (TCL_ERROR);
                    677:     }
                    678:     autoBulldoze = val;
                    679:     MustUpdateOptions = 1; Kick();
                    680:   }
                    681: 
                    682:   sprintf(interp->result, "%d", autoBulldoze);
                    683:   return (TCL_OK);
                    684: }
                    685: 
                    686: 
                    687: int SimCmdDisasters(ARGS)
                    688: {
                    689:   int val;
                    690: 
                    691:   if ((argc != 2) && (argc != 3)) {
                    692:     return (TCL_ERROR);
                    693:   }
                    694: 
                    695:   if (argc == 3) {
                    696:     if ((Tcl_GetInt(interp, argv[2], &val) != TCL_OK) ||
                    697:        (val < 0) || (val > 1)) {
                    698:       return (TCL_ERROR);
                    699:     }
                    700:     NoDisasters = val ? 0 : 1;
                    701:     MustUpdateOptions = 1; Kick();
                    702:   }
                    703: 
                    704:   sprintf(interp->result, "%d", NoDisasters ? 0 : 1);
                    705:   return (TCL_OK);
                    706: }
                    707: 
                    708: 
                    709: int SimCmdSound(ARGS)
                    710: {
                    711:   int val;
                    712: 
                    713:   if ((argc != 2) && (argc != 3)) {
                    714:     return (TCL_ERROR);
                    715:   }
                    716: 
                    717:   if (argc == 3) {
                    718:     if ((Tcl_GetInt(interp, argv[2], &val) != TCL_OK) ||
                    719:        (val < 0) || (val > 1)) {
                    720:       return (TCL_ERROR);
                    721:     }
                    722:     UserSoundOn = val;
                    723:     MustUpdateOptions = 1; Kick();
                    724:   }
                    725: 
                    726:   sprintf(interp->result, "%d", UserSoundOn);
                    727:   return (TCL_OK);
                    728: }
                    729: 
                    730: 
                    731: int SimCmdFlush(ARGS)
                    732: {
                    733:   int style;
                    734: 
                    735:   if (argc != 2) {
                    736:     return (TCL_ERROR);
                    737:   }
                    738:   
                    739:   return (TCL_OK);
                    740: }
                    741: 
                    742: 
                    743: int SimCmdFlushStyle(ARGS)
                    744: {
                    745:   int style;
                    746: 
                    747:   if ((argc != 2) && (argc != 3)) {
                    748:     return (TCL_ERROR);
                    749:   }
                    750: 
                    751:   if (argc == 3) {
                    752:     if ((Tcl_GetInt(interp, argv[2], &style) != TCL_OK) ||
                    753:        (style < 0)) {
                    754:       return (TCL_ERROR);
                    755:     }
                    756:     FlushStyle = style;
                    757:   }
                    758: 
                    759:   sprintf(interp->result, "%d", FlushStyle);
                    760:   return (TCL_OK);
                    761: }
                    762: 
                    763: 
                    764: int SimCmdDonDither(ARGS)
                    765: {
                    766:   int dd;
                    767: 
                    768:   if ((argc != 2) && (argc != 3)) {
                    769:     return (TCL_ERROR);
                    770:   }
                    771: 
                    772:   if (argc == 3) {
                    773:     if ((Tcl_GetInt(interp, argv[2], &dd) != TCL_OK) ||
                    774:        (dd < 0)) {
                    775:       return (TCL_ERROR);
                    776:     }
                    777:     DonDither = dd;
                    778:   }
                    779: 
                    780:   sprintf(interp->result, "%d", DonDither);
                    781:   return (TCL_OK);
                    782: }
                    783: 
                    784: 
                    785: int SimCmdDoOverlay(ARGS)
                    786: {
                    787:   int dd;
                    788: 
                    789:   if ((argc != 2) && (argc != 3)) {
                    790:     return (TCL_ERROR);
                    791:   }
                    792: 
                    793:   if (argc == 3) {
                    794:     if ((Tcl_GetInt(interp, argv[2], &dd) != TCL_OK) ||
                    795:        (dd < 0)) {
                    796:       return (TCL_ERROR);
                    797:     }
                    798:     DoOverlay = dd;
                    799:   }
                    800: 
                    801:   sprintf(interp->result, "%d", DoOverlay);
                    802:   return (TCL_OK);
                    803: }
                    804: 
                    805: 
                    806: int SimCmdMonsterGoal(ARGS)
                    807: {
                    808:   SimSprite *sprite;
                    809:   int x, y;
                    810: 
                    811:   if (argc != 4) {
                    812:     return (TCL_ERROR);
                    813:   }
                    814: 
                    815:   if (Tcl_GetInt(interp, argv[2], &x) != TCL_OK) {
                    816:     return (TCL_ERROR);
                    817:   }
                    818:   if (Tcl_GetInt(interp, argv[3], &y) != TCL_OK) {
                    819:     return (TCL_ERROR);
                    820:   }
                    821:   if ((sprite = GetSprite(GOD)) == NULL) {
                    822:     MakeMonster();
                    823:     if ((sprite = GetSprite(GOD)) == NULL)
                    824:       return (TCL_ERROR);
                    825:   }
                    826:   sprite->dest_x = x;
                    827:   sprite->dest_y = y;
                    828:   sprite->control = -2;
                    829:   sprite->count = -1;
                    830: 
                    831:   return (TCL_OK);
                    832: }
                    833: 
                    834: 
                    835: int SimCmdHelicopterGoal(ARGS)
                    836: {
                    837:   int x, y;
                    838:   SimSprite *sprite;
                    839: 
                    840:   if (argc != 4) {
                    841:     return (TCL_ERROR);
                    842:   }
                    843: 
                    844:   if (Tcl_GetInt(interp, argv[2], &x) != TCL_OK) {
                    845:     return (TCL_ERROR);
                    846:   }
                    847:   if (Tcl_GetInt(interp, argv[3], &y) != TCL_OK) {
                    848:     return (TCL_ERROR);
                    849:   }
                    850:   
                    851:   if ((sprite = GetSprite(COP)) == NULL) {
                    852:     GenerateCopter(x, y);
                    853:     if ((sprite = GetSprite(COP)) == NULL) {
                    854:       return (TCL_ERROR);
                    855:     }
                    856:   }
                    857:   sprite->dest_x = x;
                    858:   sprite->dest_y = y;
                    859: 
                    860:   return (TCL_OK);
                    861: }
                    862: 
                    863: 
                    864: int SimCmdMonsterDirection(ARGS)
                    865: {
                    866:   int dir;
                    867:   SimSprite *sprite;
                    868: 
                    869:   if (argc != 3) {
                    870:     return (TCL_ERROR);
                    871:   }
                    872: 
                    873:   if ((Tcl_GetInt(interp, argv[2], &dir) != TCL_OK) ||
                    874:       (dir < -1) || (dir > 7)) {
                    875:     return (TCL_ERROR);
                    876:   }
                    877:   if ((sprite = GetSprite(GOD)) == NULL) {
                    878:     MakeMonster();
                    879:     if ((sprite = GetSprite(GOD)) == NULL) {
                    880:       return (TCL_ERROR);
                    881:     }
                    882:   }
                    883:   sprite->control = dir;
                    884: 
                    885:   return (TCL_OK);
                    886: }
                    887: 
                    888: 
                    889: int SimCmdTile(ARGS)
                    890: {
                    891:   int x, y, tile;
                    892: 
                    893:   if ((argc != 4) && (argc != 5)) {
                    894:     return (TCL_ERROR);
                    895:   }
                    896:   if ((Tcl_GetInt(interp, argv[2], &x) != TCL_OK) ||
                    897:       (x < 0) ||
                    898:       (x >= WORLD_X) ||
                    899:       (Tcl_GetInt(interp, argv[3], &y) != TCL_OK) ||
                    900:       (y < 0) ||
                    901:       (y >= WORLD_Y)) {
                    902:     return (TCL_ERROR);
                    903:   }
                    904:   if (argc == 5) {
                    905:     if (Tcl_GetInt(interp, argv[4], &tile) != TCL_OK) {
                    906:       return (TCL_ERROR);
                    907:     }
                    908:     Map[x][y] = tile;
                    909:   }
                    910:   sprintf(interp->result, "%d", Map[x][y]);
                    911:   return (TCL_OK);
                    912: }
                    913: 
                    914: 
                    915: int SimCmdFill(ARGS)
                    916: {
                    917:   int tile, x, y;
                    918: 
                    919:   if (argc != 3) {
                    920:     return (TCL_ERROR);
                    921:   }
                    922:   if (Tcl_GetInt(interp, argv[2], &tile) != TCL_OK) {
                    923:     return (TCL_ERROR);
                    924:   }
                    925:   for (x = 0; x < WORLD_X; x++) {
                    926:     for (y = 0; y < WORLD_Y; y++) {
                    927:       Map[x][y] = tile;
                    928:     }
                    929:   }
                    930:   sprintf(interp->result, "%d", tile);
                    931:   return (TCL_OK);
                    932: }
                    933: 
                    934: 
                    935: int SimCmdDynamicData(ARGS)
                    936: {
                    937:   int index, val;
                    938: 
                    939:   if ((argc != 3) && (argc != 4)) {
                    940:     return (TCL_ERROR);
                    941:   }
                    942: 
                    943:   if ((Tcl_GetInt(interp, argv[2], &index) != TCL_OK) ||
                    944:       (index < 0) ||
                    945:       (index >= 32)) {
                    946:     return (TCL_ERROR);
                    947:   }
                    948: 
                    949:   if (argc == 4) {
                    950:     int val;
                    951: 
                    952:     if (Tcl_GetInt(interp, argv[3], &val) != TCL_OK) {
                    953:       return (TCL_ERROR);
                    954:     }
                    955:     DynamicData[index] = val;
                    956:     NewMapFlags[DYMAP] = 1;
                    957:     Kick();
                    958:   }
                    959: 
                    960:   sprintf(interp->result, "%d", DynamicData[index]);
                    961:   return (TCL_OK);
                    962: }
                    963: 
                    964: 
                    965: int SimCmdResetDynamic(ARGS)
                    966: {
                    967:   int i;
                    968: 
                    969:   for (i = 0; i < 16; i++) {
                    970:     DynamicData[i] = (i & 1) ? 99999 : -99999;
                    971:   }
                    972:   NewMapFlags[DYMAP] = 1;
                    973:   Kick();
                    974:   return (TCL_OK);
                    975: }
                    976: 
                    977: 
                    978: int SimCmdPerformance(ARGS)
                    979: {
                    980:   SimView *view;
                    981: 
                    982:   PerformanceTiming = 1;
                    983:   FlushTime = 0.0;
                    984:   for (view = sim->editor; view != NULL; view = view->next) {
                    985:     view->updates = 0;
                    986:     view->update_real = view->update_user = view->update_system = 0.0;
                    987:   }
                    988:   return (TCL_OK);
                    989: }
                    990: 
                    991: 
                    992: int SimCmdCollapseMotion(ARGS)
                    993: {
                    994:   int val;
                    995: 
                    996:   if ((argc != 2) && (argc != 3)) {
                    997:     return (TCL_ERROR);
                    998:   }
                    999: 
                   1000:   if (argc == 3) {
                   1001:     if ((Tcl_GetInt(interp, argv[2], &val) != TCL_OK)) {
                   1002:       return (TCL_ERROR);
                   1003:     }
                   1004:     tkCollapseMotion = val;
                   1005:   }
                   1006: 
                   1007:   sprintf(interp->result, "%d", tkCollapseMotion);
                   1008:   return (TCL_OK);
                   1009: }
                   1010: 
                   1011: 
                   1012: int SimCmdUpdate(ARGS)
                   1013: {
                   1014:   sim_update();
                   1015:   return (TCL_OK);
                   1016: }
                   1017: 
                   1018: 
                   1019: int SimCmdLandValue(ARGS)
                   1020: {
                   1021:   int val;
                   1022: 
                   1023:   if (argc != 2) {
                   1024:     return (TCL_ERROR);
                   1025:   }
                   1026: 
                   1027:   sprintf(interp->result, "%d", LVAverage);
                   1028:   return (TCL_OK);
                   1029: }
                   1030: 
                   1031: 
                   1032: int SimCmdTraffic(ARGS)
                   1033: {
                   1034:   int val;
                   1035: 
                   1036:   if (argc != 2) {
                   1037:     return (TCL_ERROR);
                   1038:   }
                   1039: 
                   1040:   sprintf(interp->result, "%d", AverageTrf());
                   1041:   return (TCL_OK);
                   1042: }
                   1043: 
                   1044: 
                   1045: int SimCmdCrime(ARGS)
                   1046: {
                   1047:   int val;
                   1048: 
                   1049:   if (argc != 2) {
                   1050:     return (TCL_ERROR);
                   1051:   }
                   1052: 
                   1053:   sprintf(interp->result, "%d", CrimeAverage);
                   1054:   return (TCL_OK);
                   1055: }
                   1056: 
                   1057: 
                   1058: int SimCmdUnemployment(ARGS)
                   1059: {
                   1060:   int val;
                   1061: 
                   1062:   if (argc != 2) {
                   1063:     return (TCL_ERROR);
                   1064:   }
                   1065: 
                   1066:   sprintf(interp->result, "%d", GetUnemployment());
                   1067:   return (TCL_OK);
                   1068: }
                   1069: 
                   1070: 
                   1071: int SimCmdFires(ARGS)
                   1072: {
                   1073:   int val;
                   1074: 
                   1075:   if (argc != 2) {
                   1076:     return (TCL_ERROR);
                   1077:   }
                   1078: 
                   1079:   sprintf(interp->result, "%d", GetFire());
                   1080:   return (TCL_OK);
                   1081: }
                   1082: 
                   1083: 
                   1084: int SimCmdPollution(ARGS)
                   1085: {
                   1086:   int val;
                   1087: 
                   1088:   if (argc != 2) {
                   1089:     return (TCL_ERROR);
                   1090:   }
                   1091: 
                   1092:   sprintf(interp->result, "%d", PolluteAverage);
                   1093:   return (TCL_OK);
                   1094: }
                   1095: 
                   1096: 
                   1097: int SimCmdPolMaxX(ARGS)
                   1098: {
                   1099:   int val;
                   1100: 
                   1101:   if (argc != 2) {
                   1102:     return (TCL_ERROR);
                   1103:   }
                   1104: 
                   1105:   sprintf(interp->result, "%d", (PolMaxX <<4) + 8);
                   1106:   return (TCL_OK);
                   1107: }
                   1108: 
                   1109: 
                   1110: int SimCmdPolMaxY(ARGS)
                   1111: {
                   1112:   int val;
                   1113: 
                   1114:   if (argc != 2) {
                   1115:     return (TCL_ERROR);
                   1116:   }
                   1117: 
                   1118:   sprintf(interp->result, "%d", (PolMaxY <<4) + 8);
                   1119:   return (TCL_OK);
                   1120: }
                   1121: 
                   1122: 
                   1123: int SimCmdTrafMaxX(ARGS)
                   1124: {
                   1125:   int val;
                   1126: 
                   1127:   if (argc != 2) {
                   1128:     return (TCL_ERROR);
                   1129:   }
                   1130: 
                   1131:   sprintf(interp->result, "%d", TrafMaxX);
                   1132:   return (TCL_OK);
                   1133: }
                   1134: 
                   1135: 
                   1136: int SimCmdTrafMaxY(ARGS)
                   1137: {
                   1138:   int val;
                   1139: 
                   1140:   if (argc != 2) {
                   1141:     return (TCL_ERROR);
                   1142:   }
                   1143: 
                   1144:   sprintf(interp->result, "%d", TrafMaxY);
                   1145:   return (TCL_OK);
                   1146: }
                   1147: 
                   1148: 
                   1149: int SimCmdMeltX(ARGS)
                   1150: {
                   1151:   int val;
                   1152: 
                   1153:   if (argc != 2) {
                   1154:     return (TCL_ERROR);
                   1155:   }
                   1156: 
                   1157:   sprintf(interp->result, "%d", (MeltX <<4) + 8);
                   1158:   return (TCL_OK);
                   1159: }
                   1160: 
                   1161: 
                   1162: int SimCmdMeltY(ARGS)
                   1163: {
                   1164:   int val;
                   1165: 
                   1166:   if (argc != 2) {
                   1167:     return (TCL_ERROR);
                   1168:   }
                   1169: 
                   1170:   sprintf(interp->result, "%d", (MeltY <<4) + 8);
                   1171:   return (TCL_OK);
                   1172: }
                   1173: 
                   1174: 
                   1175: int SimCmdCrimeMaxX(ARGS)
                   1176: {
                   1177:   int val;
                   1178: 
                   1179:   if (argc != 2) {
                   1180:     return (TCL_ERROR);
                   1181:   }
                   1182: 
                   1183:   sprintf(interp->result, "%d", (CrimeMaxX <<4) + 8);
                   1184:   return (TCL_OK);
                   1185: }
                   1186: 
                   1187: 
                   1188: int SimCmdCrimeMaxY(ARGS)
                   1189: {
                   1190:   int val;
                   1191: 
                   1192:   if (argc != 2) {
                   1193:     return (TCL_ERROR);
                   1194:   }
                   1195: 
                   1196:   sprintf(interp->result, "%d", (CrimeMaxY <<4) + 8);
                   1197:   return (TCL_OK);
                   1198: }
                   1199: 
                   1200: 
                   1201: int SimCmdCenterX(ARGS)
                   1202: {
                   1203:   int val;
                   1204: 
                   1205:   if (argc != 2) {
                   1206:     return (TCL_ERROR);
                   1207:   }
                   1208: 
                   1209:   sprintf(interp->result, "%d", (CCx <<4) + 8);
                   1210:   return (TCL_OK);
                   1211: }
                   1212: 
                   1213: 
                   1214: int SimCmdCenterY(ARGS)
                   1215: {
                   1216:   int val;
                   1217: 
                   1218:   if (argc != 2) {
                   1219:     return (TCL_ERROR);
                   1220:   }
                   1221: 
                   1222:   sprintf(interp->result, "%d", (CCy <<4) + 8);
                   1223:   return (TCL_OK);
                   1224: }
                   1225: 
                   1226: 
                   1227: int SimCmdFloodX(ARGS)
                   1228: {
                   1229:   int val;
                   1230: 
                   1231:   if (argc != 2) {
                   1232:     return (TCL_ERROR);
                   1233:   }
                   1234: 
                   1235:   sprintf(interp->result, "%d", (FloodX <<4) + 8);
                   1236:   return (TCL_OK);
                   1237: }
                   1238: 
                   1239: 
                   1240: int SimCmdFloodY(ARGS)
                   1241: {
                   1242:   int val;
                   1243: 
                   1244:   if (argc != 2) {
                   1245:     return (TCL_ERROR);
                   1246:   }
                   1247: 
                   1248:   sprintf(interp->result, "%d", (FloodY <<4) + 8);
                   1249:   return (TCL_OK);
                   1250: }
                   1251: 
                   1252: 
                   1253: int SimCmdCrashX(ARGS)
                   1254: {
                   1255:   int val;
                   1256: 
                   1257:   if (argc != 2) {
                   1258:     return (TCL_ERROR);
                   1259:   }
                   1260: 
                   1261:   sprintf(interp->result, "%d", (CrashX <<4) + 8);
                   1262:   return (TCL_OK);
                   1263: }
                   1264: 
                   1265: 
                   1266: int SimCmdCrashY(ARGS)
                   1267: {
                   1268:   int val;
                   1269: 
                   1270:   if (argc != 2) {
                   1271:     return (TCL_ERROR);
                   1272:   }
                   1273: 
                   1274:   sprintf(interp->result, "%d", (CrashY <<4) + 8);
                   1275:   return (TCL_OK);
                   1276: }
                   1277: 
                   1278: 
                   1279: int SimCmdDollars(ARGS)
                   1280: {
                   1281:   int val;
                   1282: 
                   1283:   if (argc != 2) {
                   1284:     return (TCL_ERROR);
                   1285:   }
                   1286: 
                   1287:   makeDollarDecimalStr(argv[1], interp->result);
                   1288:   return (TCL_OK);
                   1289: }
                   1290: 
                   1291: 
                   1292: int SimCmdDoAnimation(ARGS)
                   1293: {
                   1294:   int val;
                   1295: 
                   1296:   if ((argc != 2) && (argc != 3)) {
                   1297:     return (TCL_ERROR);
                   1298:   }
                   1299: 
                   1300:   if (argc == 3) {
                   1301:     if ((Tcl_GetInt(interp, argv[2], &val) != TCL_OK)) {
                   1302:       return (TCL_ERROR);
                   1303:     }
                   1304:     DoAnimation = val;
                   1305:     MustUpdateOptions = 1; Kick();
                   1306:   }
                   1307: 
                   1308:   sprintf(interp->result, "%d", DoAnimation);
                   1309:   return (TCL_OK);
                   1310: }
                   1311: 
                   1312: 
                   1313: int SimCmdDoMessages(ARGS)
                   1314: {
                   1315:   int val;
                   1316: 
                   1317:   if ((argc != 2) && (argc != 3)) {
                   1318:     return (TCL_ERROR);
                   1319:   }
                   1320: 
                   1321:   if (argc == 3) {
                   1322:     if ((Tcl_GetInt(interp, argv[2], &val) != TCL_OK)) {
                   1323:       return (TCL_ERROR);
                   1324:     }
                   1325:     DoMessages = val;
                   1326:     MustUpdateOptions = 1; Kick();
                   1327:   }
                   1328: 
                   1329:   sprintf(interp->result, "%d", DoMessages);
                   1330:   return (TCL_OK);
                   1331: }
                   1332: 
                   1333: 
                   1334: int SimCmdDoNotices(ARGS)
                   1335: {
                   1336:   int val;
                   1337: 
                   1338:   if ((argc != 2) && (argc != 3)) {
                   1339:     return (TCL_ERROR);
                   1340:   }
                   1341: 
                   1342:   if (argc == 3) {
                   1343:     if ((Tcl_GetInt(interp, argv[2], &val) != TCL_OK)) {
                   1344:       return (TCL_ERROR);
                   1345:     }
                   1346:     DoNotices = val;
                   1347:     MustUpdateOptions = 1; Kick();
                   1348:   }
                   1349: 
                   1350:   sprintf(interp->result, "%d", DoNotices);
                   1351:   return (TCL_OK);
                   1352: }
                   1353: 
                   1354: 
                   1355: int SimCmdRand(ARGS)
                   1356: {
                   1357:   int val, r;
                   1358: 
                   1359:   if ((argc != 2) && (argc != 3)) {
                   1360:     return (TCL_ERROR);
                   1361:   }
                   1362: 
                   1363:   if (argc == 3) {
                   1364:     if ((Tcl_GetInt(interp, argv[2], &val) != TCL_OK)) {
                   1365:       return (TCL_ERROR);
                   1366:     }
                   1367:     r = Rand(val);
                   1368:   } else {
                   1369:     r = Rand16();
                   1370:   }
                   1371: 
                   1372:   sprintf(interp->result, "%d", r);
                   1373:   return (TCL_OK);
                   1374: }
                   1375: 
                   1376: 
                   1377: int SimCmdPlatform(ARGS)
                   1378: {
                   1379: 
                   1380: #ifdef MSDOS
                   1381:   sprintf(interp->result, "msdos");
                   1382: #else
                   1383:   sprintf(interp->result, "unix");
                   1384: #endif
                   1385: 
                   1386:   return (TCL_OK);
                   1387: }
                   1388: 
                   1389: 
                   1390: int SimCmdVersion(ARGS)
                   1391: {
                   1392:   sprintf(interp->result, MicropolisVersion);
                   1393: 
                   1394:   return (TCL_OK);
                   1395: }
                   1396: 
                   1397: 
                   1398: int SimCmdOpenWebBrowser(ARGS)
                   1399: {
                   1400:   int result = 1;
                   1401:   char buf[512];
                   1402: 
                   1403:   if ((argc != 3) ||
                   1404:       (strlen(argv[2]) > 255)) {
                   1405:     return (TCL_ERROR);
                   1406:   }
                   1407: 
                   1408:   sprintf(buf, 
                   1409:          "netscape -no-about-splash '%s' &",
                   1410:          argv[2]);
                   1411: 
                   1412:   result = system(buf);
                   1413:   
                   1414:   sprintf(interp->result, "%d", result);
                   1415: 
                   1416:   return (TCL_OK);
                   1417: }
                   1418: 
                   1419: 
                   1420: int SimCmdQuoteURL(ARGS)
                   1421: {
                   1422:   int result = 1;
                   1423:   char buf[2048];
                   1424:   char *from, *to;
                   1425:   int ch;
                   1426:   static char *hexDigits =
                   1427:     "0123456789ABCDEF";
                   1428: 
                   1429:   if ((argc != 3) ||
                   1430:       (strlen(argv[2]) > 255)) {
                   1431:     return (TCL_ERROR);
                   1432:   }
                   1433: 
                   1434:   from = argv[2];
                   1435:   to = buf;
                   1436: 
                   1437:   while ((ch = *(from++)) != '\0') {
                   1438:     if ((ch < 32) ||
                   1439:        (ch >= 128) ||
                   1440:        (ch == '+') ||
                   1441:        (ch == '%') ||
                   1442:        (ch == '&') ||
                   1443:        (ch == '<') ||
                   1444:        (ch == '>') ||
                   1445:        (ch == '"') ||
                   1446:        (ch == '\'')) {
                   1447:       *to++ = '%';
                   1448:       *to++ = hexDigits[(ch >> 4) & 0x0f];
                   1449:       *to++ = hexDigits[ch & 0x0f];
                   1450:     } else if (ch == 32) {
                   1451:       *to++ = '+';
                   1452:     } else {
                   1453:       *to++ = ch;
                   1454:     } // if
                   1455:   } // while
                   1456:   
                   1457:   *to = '\0';
                   1458: 
                   1459:   sprintf(interp->result, "%s", buf);
                   1460: 
                   1461:   return (TCL_OK);
                   1462: }
                   1463: 
                   1464: 
                   1465: int SimCmdNeedRest(ARGS)
                   1466: {
                   1467:   int needRest;
                   1468: 
                   1469:   if ((argc != 2) && (argc != 3)) {
                   1470:     return (TCL_ERROR);
                   1471:   }
                   1472: 
                   1473:   if (argc == 3) {
                   1474:     if (Tcl_GetInt(interp, argv[2], &needRest) != TCL_OK) {
                   1475:       return (TCL_ERROR);
                   1476:     }
                   1477:     NeedRest = needRest;
                   1478:   }
                   1479: 
                   1480:   sprintf(interp->result, "%d", NeedRest);
                   1481:   return (TCL_OK);
                   1482: }
                   1483: 
                   1484: 
                   1485: int SimCmdMultiPlayerMode(ARGS)
                   1486: {
                   1487:   /* This is read-only because it's specified on
                   1488:      the command line and effects how the user 
                   1489:      interface is initialized. */
                   1490: 
                   1491:   if (argc != 2) {
                   1492:     return (TCL_ERROR);
                   1493:   }
                   1494: 
                   1495:   sprintf(interp->result, "%d", MultiPlayerMode);
                   1496:   return (TCL_OK);
                   1497: }
                   1498: 
                   1499: 
                   1500: int SimCmdSugarMode(ARGS)
                   1501: {
                   1502:   /* This is read-only because it's specified on
                   1503:      the command line and effects how the user 
                   1504:      interface is initialized. */
                   1505: 
                   1506:   if (argc != 2) {
                   1507:     return (TCL_ERROR);
                   1508:   }
                   1509: 
                   1510:   sprintf(interp->result, "%d", SugarMode);
                   1511:   return (TCL_OK);
                   1512: }
                   1513: 
                   1514: 
                   1515: /************************************************************************/
                   1516: 
                   1517: int
                   1518: SimCmd(CLIENT_ARGS)
                   1519: {
                   1520:   Tcl_HashEntry *ent;
                   1521:   int result = TCL_OK;
                   1522:   int (*cmd)();
                   1523: 
                   1524:   if (argc < 2) {
                   1525:     return TCL_ERROR;
                   1526:   }
                   1527: 
                   1528:   if (ent = Tcl_FindHashEntry(&SimCmds, argv[1])) {
                   1529:     cmd = (int (*)())ent->clientData;
                   1530:     result = cmd(interp, argc, argv);
                   1531:   } else {
                   1532:     result = TCL_ERROR;
                   1533:   }
                   1534:   return result;
                   1535: }
                   1536: 
                   1537: 
                   1538: sim_command_init()
                   1539: {
                   1540:   int new;
                   1541: 
                   1542:   Tcl_CreateCommand(tk_mainInterp, "sim", SimCmd,
                   1543:                    (ClientData)MainWindow, (void (*)()) NULL);
                   1544: 
                   1545:   Tcl_InitHashTable(&SimCmds, TCL_STRING_KEYS);
                   1546: 
                   1547: #define SIM_CMD(name) HASHED_CMD(Sim, name)
                   1548: 
                   1549:   SIM_CMD(GameStarted);
                   1550:   SIM_CMD(InitGame);
                   1551:   SIM_CMD(SaveCity);
                   1552:   SIM_CMD(ReallyQuit);
                   1553:   SIM_CMD(UpdateHeads);
                   1554:   SIM_CMD(UpdateMaps);
                   1555:   SIM_CMD(RedrawEditors);
                   1556:   SIM_CMD(RedrawMaps);
                   1557:   SIM_CMD(UpdateEditors);
                   1558:   SIM_CMD(UpdateGraphs);
                   1559:   SIM_CMD(UpdateEvaluation);
                   1560:   SIM_CMD(UpdateBudget);
                   1561:   SIM_CMD(UpdateBudgetWindow);
                   1562:   SIM_CMD(DoBudget);
                   1563:   SIM_CMD(DoBudgetFromMenu);
                   1564:   SIM_CMD(Pause);
                   1565:   SIM_CMD(Resume);
                   1566:   SIM_CMD(StartBulldozer);
                   1567:   SIM_CMD(StopBulldozer);
                   1568:   SIM_CMD(MakeFire);
                   1569:   SIM_CMD(MakeFlood);
                   1570:   SIM_CMD(MakeTornado);
                   1571:   SIM_CMD(MakeEarthquake);
                   1572:   SIM_CMD(MakeMonster);
                   1573:   SIM_CMD(MakeMeltdown);
                   1574:   SIM_CMD(FireBomb);
                   1575:   SIM_CMD(SoundOff);
                   1576:   SIM_CMD(GenerateNewCity);
                   1577:   SIM_CMD(GenerateSomeCity);
                   1578:   SIM_CMD(TreeLevel);
                   1579:   SIM_CMD(LakeLevel);
                   1580:   SIM_CMD(CurveLevel);
                   1581:   SIM_CMD(CreateIsland);
                   1582:   SIM_CMD(ClearMap);
                   1583:   SIM_CMD(ClearUnnatural);
                   1584:   SIM_CMD(SmoothTrees);
                   1585:   SIM_CMD(SmoothWater);
                   1586:   SIM_CMD(SmoothRiver);
                   1587:   SIM_CMD(LoadScenario);
                   1588:   SIM_CMD(LoadCity);
                   1589:   SIM_CMD(SaveCityAs);
                   1590:   SIM_CMD(MakeExplosion);
                   1591:   SIM_CMD(CityName);
                   1592:   SIM_CMD(CityFileName);
                   1593:   SIM_CMD(GameLevel);
                   1594:   SIM_CMD(Speed);
                   1595:   SIM_CMD(Skips);
                   1596:   SIM_CMD(Skip);
                   1597:   SIM_CMD(WorldX);
                   1598:   SIM_CMD(WorldY);
                   1599:   SIM_CMD(Delay);
                   1600:   SIM_CMD(HeatSteps);
                   1601:   SIM_CMD(HeatFlow);
                   1602:   SIM_CMD(HeatRule);
                   1603: #ifdef CAM
                   1604:   SIM_CMD(JustCam);
                   1605: #endif
                   1606: #ifdef NET
                   1607:   SIM_CMD(ListenTo);
                   1608:   SIM_CMD(HearFrom);
                   1609: #endif
                   1610:   SIM_CMD(Funds);
                   1611:   SIM_CMD(TaxRate);
                   1612:   SIM_CMD(FireFund);
                   1613:   SIM_CMD(PoliceFund);
                   1614:   SIM_CMD(RoadFund);
                   1615:   SIM_CMD(Year);
                   1616:   SIM_CMD(AutoBudget);
                   1617:   SIM_CMD(AutoGoto);
                   1618:   SIM_CMD(AutoBulldoze);
                   1619:   SIM_CMD(Disasters);
                   1620:   SIM_CMD(Sound);
                   1621:   SIM_CMD(Flush);
                   1622:   SIM_CMD(FlushStyle);
                   1623:   SIM_CMD(DonDither);
                   1624:   SIM_CMD(DoOverlay);
                   1625:   SIM_CMD(MonsterGoal);
                   1626:   SIM_CMD(HelicopterGoal);
                   1627:   SIM_CMD(MonsterDirection);
                   1628:   SIM_CMD(EraseOverlay);
                   1629:   SIM_CMD(Tile);
                   1630:   SIM_CMD(Fill);
                   1631:   SIM_CMD(DynamicData);
                   1632:   SIM_CMD(ResetDynamic);
                   1633:   SIM_CMD(Performance);
                   1634:   SIM_CMD(CollapseMotion);
                   1635:   SIM_CMD(Update);
                   1636:   SIM_CMD(OverRide);
                   1637:   SIM_CMD(Expensive);
                   1638:   SIM_CMD(Players);
                   1639:   SIM_CMD(Votes);
                   1640:   SIM_CMD(BobHeight);
                   1641:   SIM_CMD(PendingTool);
                   1642:   SIM_CMD(PendingX);
                   1643:   SIM_CMD(PendingY);
                   1644:   SIM_CMD(Displays);
                   1645:   SIM_CMD(LandValue);
                   1646:   SIM_CMD(Traffic);
                   1647:   SIM_CMD(Crime);
                   1648:   SIM_CMD(Unemployment);
                   1649:   SIM_CMD(Fires);
                   1650:   SIM_CMD(Pollution);
                   1651:   SIM_CMD(PolMaxX);
                   1652:   SIM_CMD(PolMaxY);
                   1653:   SIM_CMD(TrafMaxX);
                   1654:   SIM_CMD(TrafMaxY);
                   1655:   SIM_CMD(MeltX);
                   1656:   SIM_CMD(MeltY);
                   1657:   SIM_CMD(CrimeMaxX);
                   1658:   SIM_CMD(CrimeMaxY);
                   1659:   SIM_CMD(CenterX);
                   1660:   SIM_CMD(CenterY);
                   1661:   SIM_CMD(FloodX);
                   1662:   SIM_CMD(FloodY);
                   1663:   SIM_CMD(CrashX);
                   1664:   SIM_CMD(CrashY);
                   1665:   SIM_CMD(Dollars);
                   1666:   SIM_CMD(DoAnimation);
                   1667:   SIM_CMD(DoMessages);
                   1668:   SIM_CMD(DoNotices);
                   1669:   SIM_CMD(Rand);
                   1670:   SIM_CMD(Platform);
                   1671:   SIM_CMD(Version);
                   1672:   SIM_CMD(OpenWebBrowser);
                   1673:   SIM_CMD(QuoteURL);
                   1674:   SIM_CMD(NeedRest);
                   1675:   SIM_CMD(MultiPlayerMode);
                   1676:   SIM_CMD(SugarMode);
                   1677: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.