|
|
1.1 ! root 1: /* w_budget.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: float roadPercent = 0.0; ! 66: float policePercent = 0.0; ! 67: float firePercent = 0.0; ! 68: QUAD roadValue; ! 69: QUAD policeValue; ! 70: QUAD fireValue; ! 71: QUAD roadMaxValue; ! 72: QUAD policeMaxValue; ! 73: QUAD fireMaxValue; ! 74: int MustDrawCurrPercents = 0; ! 75: int MustDrawBudgetWindow = 0; ! 76: int SetBudget(char *flowStr, char *previousStr, ! 77: char *currentStr, char *collectedStr, short tax); ! 78: ! 79: ! 80: void InitFundingLevel(void) ! 81: { ! 82: firePercent = 1.0; /* 1.0 */ ! 83: fireValue = 0; ! 84: policePercent = 1.0; /* 1.0 */ ! 85: policeValue = 0; ! 86: roadPercent = 1.0; /* 1.0 */ ! 87: roadValue = 0; ! 88: drawBudgetWindow(); ! 89: drawCurrPercents(); ! 90: } ! 91: ! 92: ! 93: DoBudget() ! 94: { ! 95: DoBudgetNow(0); ! 96: } ! 97: ! 98: ! 99: DoBudgetFromMenu() ! 100: { ! 101: DoBudgetNow(1); ! 102: } ! 103: ! 104: ! 105: DoBudgetNow(int fromMenu) ! 106: { ! 107: QUAD yumDuckets; ! 108: QUAD total; ! 109: QUAD moreDough; ! 110: QUAD fireInt, policeInt, roadInt; ! 111: ! 112: fireInt = (int)(((float)FireFund) * firePercent); ! 113: policeInt = (int)(((float)PoliceFund) * policePercent); ! 114: roadInt = (int)(((float)RoadFund) * roadPercent); ! 115: ! 116: total = fireInt + policeInt + roadInt; ! 117: ! 118: yumDuckets = TaxFund + TotalFunds; ! 119: ! 120: if (yumDuckets > total) { ! 121: fireValue = fireInt; ! 122: policeValue = policeInt; ! 123: roadValue = roadInt; ! 124: } else if (total > 0) { ! 125: if (yumDuckets > roadInt) { ! 126: roadValue = roadInt; ! 127: yumDuckets -= roadInt; ! 128: ! 129: if (yumDuckets > fireInt) { ! 130: fireValue = fireInt; ! 131: yumDuckets -= fireInt; ! 132: ! 133: if (yumDuckets > policeInt) { ! 134: policeValue = policeInt; ! 135: yumDuckets -= policeInt; ! 136: } else { ! 137: policeValue = yumDuckets; ! 138: if (yumDuckets > 0) ! 139: policePercent = ((float)yumDuckets) / ((float)PoliceFund); ! 140: else ! 141: policePercent = 0.0; ! 142: } ! 143: } else { ! 144: fireValue = yumDuckets; ! 145: policeValue = 0; ! 146: policePercent = 0.0; ! 147: if (yumDuckets > 0) ! 148: firePercent = ((float)yumDuckets) / ((float)FireFund); ! 149: else ! 150: firePercent = 0.0; ! 151: } ! 152: } else { ! 153: roadValue = yumDuckets; ! 154: if (yumDuckets > 0) ! 155: roadPercent = ((float)yumDuckets) / ((float)RoadFund); ! 156: else ! 157: roadPercent = 0.0; ! 158: ! 159: fireValue = 0; ! 160: policeValue = 0; ! 161: firePercent = 0.0; ! 162: policePercent = 0.0; ! 163: } ! 164: } else { ! 165: fireValue = 0; ! 166: policeValue = 0; ! 167: roadValue = 0; ! 168: firePercent = 1.0; ! 169: policePercent = 1.0; ! 170: roadPercent = 1.0; ! 171: } ! 172: ! 173: fireMaxValue = FireFund; ! 174: policeMaxValue = PoliceFund; ! 175: roadMaxValue = RoadFund; ! 176: ! 177: drawCurrPercents(); ! 178: ! 179: noMoney: ! 180: if ((!autoBudget) || fromMenu) { ! 181: if (!autoBudget) { ! 182: /* TODO: append the the current year to the budget string */ ! 183: } ! 184: ! 185: ShowBudgetWindowAndStartWaiting(); ! 186: ! 187: if (!fromMenu) { ! 188: FireSpend = fireValue; ! 189: PoliceSpend = policeValue; ! 190: RoadSpend = roadValue; ! 191: ! 192: total = FireSpend + PoliceSpend + RoadSpend; ! 193: moreDough = (QUAD)(TaxFund - total); ! 194: Spend(-moreDough); ! 195: } ! 196: drawBudgetWindow(); ! 197: drawCurrPercents(); ! 198: DoUpdateHeads(); ! 199: ! 200: } else { /* autoBudget & !fromMenu */ ! 201: if ((yumDuckets) > total) { ! 202: moreDough = (QUAD)(TaxFund - total); ! 203: Spend(-moreDough); ! 204: FireSpend = FireFund; ! 205: PoliceSpend = PoliceFund; ! 206: RoadSpend = RoadFund; ! 207: drawBudgetWindow(); ! 208: drawCurrPercents(); ! 209: DoUpdateHeads(); ! 210: } else { ! 211: autoBudget = 0; /* XXX: force autobudget */ ! 212: MustUpdateOptions = 1; ! 213: ClearMes(); ! 214: SendMes(29); ! 215: goto noMoney; ! 216: } ! 217: } ! 218: } ! 219: ! 220: ! 221: drawBudgetWindow(void) ! 222: { ! 223: MustDrawBudgetWindow = 1; ! 224: } ! 225: ! 226: ! 227: ReallyDrawBudgetWindow(void) ! 228: { ! 229: short cashFlow, cashFlow2; ! 230: char numStr[256], dollarStr[256], collectedStr[256], ! 231: flowStr[256], previousStr[256], currentStr[256]; ! 232: ! 233: cashFlow = TaxFund - fireValue - policeValue - roadValue; ! 234: ! 235: cashFlow2 = cashFlow; ! 236: if (cashFlow < 0) { ! 237: cashFlow = -cashFlow; ! 238: sprintf(numStr, "%d", cashFlow); ! 239: makeDollarDecimalStr(numStr, dollarStr); ! 240: sprintf(flowStr, "-%s", dollarStr); ! 241: } else { ! 242: sprintf(numStr, "%d", cashFlow); ! 243: makeDollarDecimalStr(numStr, dollarStr); ! 244: sprintf(flowStr, "+%s", dollarStr); ! 245: } ! 246: ! 247: sprintf(numStr, "%d", TotalFunds); ! 248: makeDollarDecimalStr(numStr, previousStr); ! 249: ! 250: sprintf(numStr, "%d", cashFlow2 + TotalFunds); ! 251: makeDollarDecimalStr(numStr, currentStr); ! 252: ! 253: sprintf(numStr, "%d", TaxFund); ! 254: makeDollarDecimalStr(numStr, collectedStr); ! 255: ! 256: SetBudget(flowStr, previousStr, currentStr, collectedStr, CityTax); ! 257: } ! 258: ! 259: ! 260: drawCurrPercents(void) ! 261: { ! 262: MustDrawCurrPercents = 1; ! 263: } ! 264: ! 265: ! 266: ReallyDrawCurrPercents(void) ! 267: { ! 268: char num[256]; ! 269: char fireWant[256], policeWant[256], roadWant[256]; ! 270: char fireGot[256], policeGot[256], roadGot[256]; ! 271: ! 272: sprintf(num, "%d", fireMaxValue); ! 273: makeDollarDecimalStr(num, fireWant); ! 274: ! 275: sprintf(num, "%d", policeMaxValue); ! 276: makeDollarDecimalStr(num, policeWant); ! 277: ! 278: sprintf(num, "%d", roadMaxValue); ! 279: makeDollarDecimalStr(num, roadWant); ! 280: ! 281: sprintf(num, "%d", (int)(fireMaxValue * firePercent)); ! 282: makeDollarDecimalStr(num, fireGot); ! 283: ! 284: sprintf(num, "%d", (int)(policeMaxValue * policePercent)); ! 285: makeDollarDecimalStr(num, policeGot); ! 286: ! 287: sprintf(num, "%d", (int)(roadMaxValue * roadPercent)); ! 288: makeDollarDecimalStr(num, roadGot); ! 289: ! 290: SetBudgetValues(roadGot, roadWant, ! 291: policeGot, policeWant, ! 292: fireGot, fireWant); ! 293: } ! 294: ! 295: ! 296: UpdateBudgetWindow() ! 297: { ! 298: if (MustDrawCurrPercents) { ! 299: ReallyDrawCurrPercents(); ! 300: MustDrawCurrPercents = 0; ! 301: } ! 302: if (MustDrawBudgetWindow) { ! 303: ReallyDrawBudgetWindow(); ! 304: MustDrawBudgetWindow = 0; ! 305: } ! 306: } ! 307: ! 308: ! 309: UpdateBudget() ! 310: { ! 311: drawCurrPercents(); ! 312: drawBudgetWindow(); ! 313: Eval("UIUpdateBudget"); ! 314: } ! 315: ! 316: ! 317: ShowBudgetWindowAndStartWaiting() ! 318: { ! 319: Eval("UIShowBudgetAndWait"); ! 320: ! 321: Pause(); ! 322: } ! 323: ! 324: ! 325: SetBudget(char *flowStr, char *previousStr, ! 326: char *currentStr, char *collectedStr, short tax) ! 327: { ! 328: char buf[256]; ! 329: ! 330: sprintf(buf, "UISetBudget {%s} {%s} {%s} {%s} {%d}", ! 331: flowStr, previousStr, currentStr, collectedStr, tax); ! 332: Eval(buf); ! 333: } ! 334: ! 335: ! 336: SetBudgetValues(char *roadGot, char *roadWant, ! 337: char *policeGot, char *policeWant, ! 338: char *fireGot, char *fireWant) ! 339: { ! 340: char buf[256]; ! 341: ! 342: sprintf(buf, "UISetBudgetValues {%s} {%s} %d {%s} {%s} %d {%s} {%s} %d", ! 343: roadGot, roadWant, (int)(roadPercent * 100), ! 344: policeGot, policeWant, (int)(policePercent * 100), ! 345: fireGot, fireWant, (int)(firePercent * 100)); ! 346: Eval(buf); ! 347: } ! 348: ! 349:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.