]> git.zerfleddert.de Git - micropolis/blob - src/sim/w_util.c
Makefile: Micropolis build fixes for recent macOS
[micropolis] / src / sim / w_util.c
1 /* w_util.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 void UpdateGameLevel(void);
65
66
67 /* comefrom: drawTaxesCollected incBoxValue decBoxValue drawCurrentFunds
68 drawActualBox UpdateFunds updateCurrentCost */
69 void
70 makeDollarDecimalStr(char *numStr, char *dollarStr)
71 {
72 register short leftMostSet;
73 short numOfDigits;
74 short numOfChars;
75 register short numOfCommas;
76 register short dollarIndex = 0;
77 register short numIndex = 0;
78 register short x;
79
80 numOfDigits = strlen(numStr);
81
82 if (numOfDigits == 1) {
83 dollarStr[0] = '$';
84 dollarStr[1] = numStr[ 0 ];
85 dollarStr[2] = 0;
86 return;
87 } else if (numOfDigits == 2) {
88 dollarStr[0] = '$';
89 dollarStr[1] = numStr[0];
90 dollarStr[2] = numStr[1];
91 dollarStr[3] = 0;
92 return;
93 } else if (numOfDigits == 3) {
94 dollarStr[0] = '$';
95 dollarStr[1] = numStr[0];
96 dollarStr[2] = numStr[1];
97 dollarStr[3] = numStr[2];
98 dollarStr[4] = 0;
99 } else {
100 leftMostSet = numOfDigits % 3;
101 if (leftMostSet == 0)
102 leftMostSet = 3;
103
104 numOfCommas = (numOfDigits - 1) / 3;
105
106 /* add 1 for the dollar sign */
107 numOfChars = numOfDigits + numOfCommas + 1;
108
109 dollarStr[numOfChars] = 0;
110
111 dollarStr[dollarIndex++] = '$';
112
113 for (x = 1; x <= leftMostSet; x++) {
114 dollarStr[dollarIndex++] = numStr[numIndex++];
115 }
116
117 for (x = 1; x <= numOfCommas; x++) {
118 dollarStr[dollarIndex++] = ',';
119 dollarStr[dollarIndex++] = numStr[numIndex++];
120 dollarStr[dollarIndex++] = numStr[numIndex++];
121 dollarStr[dollarIndex++] = numStr[numIndex++];
122 }
123 }
124 }
125
126
127 void
128 Pause(void)
129 {
130 if (!sim_paused) {
131 sim_paused_speed = SimMetaSpeed;
132 setSpeed(0);
133 sim_paused = 1;
134 }
135 }
136
137
138 void
139 Resume(void)
140 {
141 if (sim_paused) {
142 sim_paused = 0;
143 setSpeed(sim_paused_speed);
144 }
145 }
146
147
148 void
149 setSpeed(short speed)
150 {
151 if (speed < 0) speed = 0;
152 else if (speed > 3) speed = 3;
153
154 SimMetaSpeed = speed;
155
156 if (sim_paused) {
157 sim_paused_speed = SimMetaSpeed;
158 speed = 0;
159 }
160
161 SimSpeed = speed;
162
163 if (speed == 0) {
164 StopMicropolisTimer();
165 } else {
166 StartMicropolisTimer();
167 }
168
169 { char buf[256];
170 sprintf(buf, "UISetSpeed %d", sim_paused ? 0 : SimMetaSpeed);
171 Eval(buf);
172 }
173 }
174
175
176 void
177 setSkips(int skips)
178 {
179 sim_skips = skips;
180 sim_skip = 0;
181 }
182
183
184 void
185 SetGameLevelFunds(short level)
186 {
187 switch (level) {
188 default:
189 case 0:
190 SetFunds(20000);
191 SetGameLevel(0);
192 break;
193 case 1:
194 SetFunds(10000);
195 SetGameLevel(1);
196 break;
197 case 2:
198 SetFunds(5000);
199 SetGameLevel(2);
200 break;
201 }
202 }
203
204
205 void
206 SetGameLevel(short level)
207 {
208 GameLevel = level;
209 UpdateGameLevel();
210 }
211
212
213 void
214 UpdateGameLevel(void)
215 {
216 char buf[256];
217
218 sprintf(buf, "UISetGameLevel %d", GameLevel);
219 Eval(buf);
220 }
221
222
223 void
224 setCityName(char *name)
225 {
226 char *cp = name;
227
228 while (*cp) {
229 if (!isalnum(*cp))
230 *cp = '_';
231 cp++;
232 }
233 setAnyCityName(name);
234 }
235
236
237 void
238 setAnyCityName(char *name)
239 {
240 char buf[1024];
241
242 CityName = name;
243 sprintf(buf, "UISetCityName {%s}", CityName);
244 Eval(buf);
245 }
246
247
248 void
249 SetYear(int year)
250 {
251 // Must prevent year from going negative, since it screws up the non-floored modulo arithmetic.
252 if (year < StartingYear) {
253 year = StartingYear;
254 }
255
256 year = (year - StartingYear) - (CityTime / 48);
257 CityTime += year * 48;
258 doTimeStuff();
259 }
260
261
262 int
263 CurrentYear(void)
264 {
265 return (CityTime/48 + StartingYear);
266 }
267
268
269 void
270 DoSetMapState(SimView *view, short state)
271 {
272 char buf[256];
273
274 view->map_state = state;
275 view->invalid = 1;
276 EventuallyRedrawView(view);
277
278 sprintf(buf, "UISetMapState %s %d", Tk_PathName(view->tkwin), state);
279 Eval(buf);
280 }
281
282
283 void
284 DoNewGame(void)
285 {
286 Eval("UINewGame");
287 }
288
289
290 void
291 DoGeneratedCityImage(char *name, int time, int pop, char *class, int score)
292 {
293 /* XXX: TODO: print city */
294 }
295
296
297 void
298 DoStartElmd()
299 {
300 /* XXX: TODO: start elm daemon */
301 }
302
303
304 void
305 DoPopUpMessage(char *msg)
306 {
307 char buf[1024];
308
309 sprintf(buf, "UIPopUpMessage {%s}", msg);
310 Eval(buf);
311 }
312
313
Impressum, Datenschutz