|
|
1.1 ! root 1: /* w_keys.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: static char LastKeys[5]; ! 66: ! 67: ! 68: /* TODO: ! 69: <n> new city ! 70: <l> load city ! 71: <s> save city ! 72: <q> quit ! 73: <a> autobulldoze ! 74: <0><1><2><3>... game speed ! 75: <m> map window ! 76: <g> graph window ! 77: <b> budget window ! 78: <e> evaluation window ! 79: */ ! 80: ! 81: ! 82: ResetLastKeys() ! 83: { ! 84: LastKeys[0] = ' '; ! 85: LastKeys[1] = ' '; ! 86: LastKeys[2] = ' '; ! 87: LastKeys[3] = ' '; ! 88: LastKeys[4] = '\0'; ! 89: PunishCnt = 0; ! 90: } ! 91: ! 92: ! 93: /* comefrom: processEvent */ ! 94: doKeyDown(SimView *view, short charCode) ! 95: { ! 96: LastKeys[0] = LastKeys[1]; ! 97: LastKeys[1] = LastKeys[2]; ! 98: LastKeys[2] = LastKeys[3]; ! 99: LastKeys[3] = tolower(charCode); ! 100: ! 101: if (strcmp(LastKeys, "fund") == 0) { ! 102: Spend(-10000); ! 103: PunishCnt++; /* punish for cheating */ ! 104: if (PunishCnt == 5) { ! 105: PunishCnt = 0; ! 106: MakeEarthquake(); ! 107: } ! 108: LastKeys[0] = '\0'; ! 109: } else if (strcmp(LastKeys, "fart") == 0) { ! 110: MakeSound("city", "Explosion-High"); ! 111: MakeSound("city", "Explosion-Low"); ! 112: MakeFire(); ! 113: MakeFlood(); ! 114: MakeTornado(); ! 115: MakeEarthquake(); ! 116: MakeMonster(); ! 117: LastKeys[0] = '\0'; ! 118: } else if (strcmp(LastKeys, "nuke") == 0) { ! 119: int i, j; ! 120: MakeSound("city", "Explosion-High"); ! 121: MakeSound("city", "Explosion-Low"); ! 122: for (i = 0; i < WORLD_X; i++) { ! 123: for (j = 0; j < WORLD_Y; j++) { ! 124: short tile = Map[i][j] & LOMASK; ! 125: if ((tile >= RUBBLE) && ! 126: ((tile < CHURCH - 4) || ! 127: (tile > CHURCH + 4))) { ! 128: if ((tile >= HBRIDGE && tile <= VBRIDGE) || ! 129: (tile >= BRWH && tile <= LTRFBASE + 1) || ! 130: (tile >= BRWV && tile <= BRWV + 2) || ! 131: (tile >= BRWXXX1 && tile <= BRWXXX1 + 2) || ! 132: (tile >= BRWXXX2 && tile <= BRWXXX2 + 2) || ! 133: (tile >= BRWXXX3 && tile <= BRWXXX3 + 2) || ! 134: (tile >= BRWXXX4 && tile <= BRWXXX4 + 2) || ! 135: (tile >= BRWXXX5 && tile <= BRWXXX5 + 2) || ! 136: (tile >= BRWXXX6 && tile <= BRWXXX6 + 2) || ! 137: (tile >= BRWXXX7 && tile <= BRWXXX7 + 2)) { ! 138: Map[i][j] = RIVER; ! 139: } else { ! 140: Map[i][j] = TINYEXP + ANIMBIT + BULLBIT + Rand(2); ! 141: } ! 142: } ! 143: } ! 144: } ! 145: LastKeys[0] = '\0'; ! 146: } else if (strcmp(LastKeys, "stop") == 0) { ! 147: heat_steps = 0; ! 148: LastKeys[0] = '\0'; ! 149: Kick(); ! 150: } else if (strcmp(LastKeys, "will") == 0) { ! 151: int i; ! 152: int n = 500; ! 153: for (i = 0; i < n; i++) { ! 154: int x1 = Rand(WORLD_X - 1); ! 155: int y1 = Rand(WORLD_Y - 1); ! 156: int x2 = Rand(WORLD_X - 1); ! 157: int y2 = Rand(WORLD_Y - 1); ! 158: short temp = ! 159: Map[x1][y1]; ! 160: Map[x1][y1] = ! 161: Map[x2][y2]; ! 162: Map[x2][y2] = ! 163: temp; ! 164: } ! 165: Kick(); ! 166: } else if (strcmp(LastKeys, "bobo") == 0) { ! 167: heat_steps = 1; ! 168: heat_flow = -1; ! 169: heat_rule = 0; ! 170: LastKeys[0] = '\0'; ! 171: Kick(); ! 172: } else if (strcmp(LastKeys, "boss") == 0) { ! 173: heat_steps = 1; ! 174: heat_flow = 1; ! 175: heat_rule = 0; ! 176: LastKeys[0] = '\0'; ! 177: Kick(); ! 178: } else if (strcmp(LastKeys, "mack") == 0) { ! 179: heat_steps = 1; ! 180: heat_flow = 0; ! 181: heat_rule = 0; ! 182: LastKeys[0] = '\0'; ! 183: Kick(); ! 184: } else if (strcmp(LastKeys, "donh") == 0) { ! 185: heat_steps = 1; ! 186: heat_flow = -1; ! 187: heat_rule = 1; ! 188: LastKeys[0] = '\0'; ! 189: Kick(); ! 190: } else if (strcmp(LastKeys, "patb") == 0) { ! 191: heat_steps = 1; ! 192: heat_flow = Rand(40) - 20; ! 193: heat_rule = 0; ! 194: LastKeys[0] = '\0'; ! 195: Kick(); ! 196: } else if (strcmp(LastKeys, "lucb") == 0) { ! 197: heat_steps = 1; ! 198: heat_flow = Rand(1000) - 500; ! 199: heat_rule = 0; ! 200: LastKeys[0] = '\0'; ! 201: Kick(); ! 202: } else if (strcmp(LastKeys, "olpc") == 0) { ! 203: Spend(-1000000); ! 204: } ! 205: ! 206: switch (charCode) { ! 207: ! 208: case 'X': ! 209: case 'x': { ! 210: short s = view->tool_state; ! 211: if (++s > lastState) { ! 212: s = firstState; ! 213: } ! 214: setWandState(view, s); ! 215: break; ! 216: } ! 217: ! 218: case 'Z': ! 219: case 'z': { ! 220: short s = view->tool_state; ! 221: if (--s < firstState) { ! 222: s = lastState; ! 223: } ! 224: setWandState(view, s); ! 225: break; ! 226: } ! 227: ! 228: /***** shift wand state to bull dozer *****/ ! 229: case 'B': ! 230: case 'b': ! 231: case 'B'-'@': { ! 232: if (view->tool_state_save == -1) { ! 233: view->tool_state_save = view->tool_state; ! 234: } ! 235: setWandState(view, dozeState); ! 236: break; ! 237: } ! 238: ! 239: /***** shift wand state to roads *****/ ! 240: case 'R': ! 241: case 'r': ! 242: case 'R'-'@': { ! 243: if (view->tool_state_save == -1) { ! 244: view->tool_state_save = view->tool_state; ! 245: } ! 246: setWandState(view, roadState); ! 247: break; ! 248: } ! 249: ! 250: /***** shift wand state to power *****/ ! 251: case 'P': ! 252: case 'p': ! 253: case 'P'-'@': { ! 254: if (view->tool_state_save == -1) { ! 255: view->tool_state_save = view->tool_state; ! 256: } ! 257: setWandState(view, wireState); ! 258: break; ! 259: } ! 260: ! 261: /***** shift wand state to transit *****/ ! 262: case 'T': ! 263: case 't': ! 264: case 'T'-'@': { ! 265: if (view->tool_state_save == -1) { ! 266: view->tool_state_save = view->tool_state; ! 267: } ! 268: setWandState(view, rrState); ! 269: break; ! 270: } ! 271: ! 272: #if 0 ! 273: /***** shift wand state to query *****/ ! 274: case 'Q': ! 275: case 'q': ! 276: case 'Q'-'@': { ! 277: if (view->tool_state_save == -1) ! 278: view->tool_state_save = view->tool_state; ! 279: setWandState(view, queryState); ! 280: break; ! 281: } ! 282: #endif ! 283: ! 284: case 27: { ! 285: SoundOff(); ! 286: break; ! 287: } ! 288: ! 289: } ! 290: } ! 291: ! 292: ! 293: /* comefrom: processEvent */ ! 294: doKeyUp(SimView *view, short charCode) ! 295: { ! 296: switch(charCode) { ! 297: ! 298: case 'b': ! 299: case 'B': ! 300: case 'B'-'@': ! 301: case 'R': ! 302: case 'r': ! 303: case 'R'-'@': ! 304: case 'P': ! 305: case 'p': ! 306: case 'P'-'@': ! 307: case 'T': ! 308: case 't': ! 309: case 'T'-'@': ! 310: case 'q': ! 311: case 'Q': ! 312: case 'Q'-'@': { ! 313: if (view->tool_state_save != -1) { ! 314: setWandState(view, view->tool_state_save); ! 315: } ! 316: view->tool_state_save = -1; ! 317: break; ! 318: } ! 319: ! 320: default: { ! 321: break; ! 322: } ! 323: ! 324: } ! 325: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.