]> git.zerfleddert.de Git - micropolis/blob - src/sim/w_keys.c
fix 24bit wire mode
[micropolis] / src / sim / w_keys.c
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 micropolis@laptop.org.
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 }
Impressum, Datenschutz