|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.