Annotation of micropolis/src/sim/s_msg.c, revision 1.1.1.1

1.1       root        1: /* s_msg.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: QUAD LastCityPop;
                     66: short LastCategory;
                     67: short LastPicNum;
                     68: short autoGo;
                     69: short HaveLastMessage = 0;
                     70: char LastMessage[256];
                     71: int DoAutoGoto(short x, short y, char *msg);
                     72: int DoShowPicture(short id);
                     73: 
                     74: /* comefrom: Simulate */
                     75: SendMessages(void)
                     76: {
                     77:   register z;
                     78:   short PowerPop;
                     79:   float TM;
                     80: 
                     81:   if ((ScenarioID) && (ScoreType) && (ScoreWait)) {
                     82:     ScoreWait--;
                     83:     if (!ScoreWait)
                     84:       DoScenarioScore(ScoreType);
                     85:   }
                     86: 
                     87:   CheckGrowth();
                     88: 
                     89:   TotalZPop = ResZPop + ComZPop + IndZPop;
                     90:   PowerPop = NuclearPop + CoalPop;
                     91: 
                     92:   z = CityTime & 63;
                     93: 
                     94:   switch(z) {
                     95: 
                     96:   case 1:
                     97:     if ((TotalZPop >>2) >= ResZPop)
                     98:       SendMes(1); /* need Res */
                     99:     break;
                    100:   case 5:
                    101:     if ((TotalZPop >>3) >= ComZPop)
                    102:       SendMes(2); /* need Com */
                    103:     break;
                    104:   case 10:
                    105:     if ((TotalZPop >>3) >= IndZPop)
                    106:       SendMes(3); /* need Ind */
                    107:     break;
                    108:   case 14:
                    109:     if ((TotalZPop > 10) && ((TotalZPop <<1) > RoadTotal))
                    110:       SendMes(4);
                    111:     break;
                    112:   case 18:
                    113:     if ((TotalZPop > 50) && (TotalZPop > RailTotal))
                    114:       SendMes(5);
                    115:     break;
                    116:   case 22:
                    117:     if ((TotalZPop > 10) && (PowerPop == 0))
                    118:       SendMes(6); /* need Power */
                    119:     break;
                    120:   case 26:
                    121:     if ((ResPop > 500) && (StadiumPop == 0)) {
                    122:       SendMes(7); /* need Stad */
                    123:       ResCap = 1;
                    124:     }
                    125:     else
                    126:       ResCap = 0;
                    127:     break;
                    128:   case 28:
                    129:     if ((IndPop > 70) && (PortPop == 0)) {
                    130:       SendMes(8);
                    131:       IndCap = 1;
                    132:     }
                    133:     else IndCap = 0;
                    134:     break;
                    135:   case 30:
                    136:     if ((ComPop > 100) && (APortPop == 0)) {
                    137:       SendMes(9);
                    138:       ComCap = 1;
                    139:     }
                    140:     else ComCap = 0;
                    141:     break;
                    142:   case 32:
                    143:     TM = unPwrdZCnt + PwrdZCnt;        /* dec score for unpowered zones */
                    144:     if (TM)  
                    145:       if ((PwrdZCnt / TM) < .7)
                    146:        SendMes(15);
                    147:     break;
                    148:   case 35:
                    149:     if (PolluteAverage > /* 80 */ 60)
                    150:       SendMes(-10);
                    151:     break;
                    152:   case 42:
                    153:     if (CrimeAverage > 100)
                    154:       SendMes(-11);
                    155:     break;
                    156:   case 45:
                    157:     if ((TotalPop > 60) && (FireStPop == 0))
                    158:       SendMes(13);
                    159:     break;
                    160:   case 48:
                    161:     if ((TotalPop > 60) && (PolicePop == 0))
                    162:       SendMes(14);
                    163:     break;
                    164:   case 51:
                    165:     if (CityTax > 12)
                    166:       SendMes(16);
                    167:     break;
                    168:   case 54:
                    169:     if ((RoadEffect < 20) && (RoadTotal > 30))
                    170:       SendMes(17);
                    171:     break;
                    172:   case 57:
                    173:     if ((FireEffect < 700) && (TotalPop > 20))
                    174:       SendMes(18);
                    175:     break;
                    176:   case 60:
                    177:     if ((PoliceEffect < 700) && (TotalPop > 20))
                    178:       SendMes(19);
                    179:     break;
                    180:   case 63:
                    181:     if (TrafficAverage > 60)
                    182:       SendMes(-12);
                    183:     break;
                    184:   }
                    185: }
                    186: 
                    187: 
                    188: /* comefrom: SendMessages */
                    189: CheckGrowth(void)
                    190: {
                    191:   QUAD ThisCityPop;
                    192:   short z;
                    193: 
                    194:   if (!(CityTime & 3)) {
                    195:     z = 0;
                    196:     ThisCityPop = ((ResPop) + (ComPop * 8L) + (IndPop * 8L)) * 20L;
                    197:     if (LastCityPop) {
                    198:       if ((LastCityPop < 2000) && (ThisCityPop >= 2000))       z = 35;
                    199:       if ((LastCityPop < 10000) && (ThisCityPop >= 10000))     z = 36;
                    200:       if ((LastCityPop < 50000L) && (ThisCityPop >= 50000L))   z = 37;
                    201:       if ((LastCityPop < 100000L) && (ThisCityPop >= 100000L)) z = 38;
                    202:       if ((LastCityPop < 500000L) && (ThisCityPop >= 500000L)) z = 39;
                    203:     }
                    204:     if (z)
                    205:       if (z != LastCategory) {
                    206:        SendMes(-z);
                    207:        LastCategory = z;
                    208:       }
                    209:     LastCityPop = ThisCityPop;
                    210:   }
                    211: }
                    212: 
                    213: 
                    214: /* comefrom: SendMessages */
                    215: DoScenarioScore(int type)
                    216: {
                    217:   short z;
                    218: 
                    219:   z = -200;    /* you lose */
                    220:   switch(type) {
                    221:   case 1:      /* Dullsville */
                    222:          if (CityClass >= 4)           z = -100;
                    223:          break;
                    224:   case 2:      /* San Francisco */
                    225:          if (CityClass >= 4)           z = -100;
                    226:          break;
                    227:   case 3:      /* Hamburg */
                    228:          if (CityClass >= 4)           z = -100;
                    229:          break;
                    230:   case 4:      /* Bern */
                    231:          if (TrafficAverage < 80)      z = -100;
                    232:          break;
                    233:   case 5:      /* Tokyo */
                    234:          if (CityScore > 500)          z = -100;
                    235:          break;
                    236:   case 6:      /* Detroit */
                    237:          if (CrimeAverage < 60)        z = -100;
                    238:          break;
                    239:   case 7:      /* Boston */
                    240:          if (CityScore > 500)          z = -100;
                    241:          break;
                    242:   case 8:      /* Rio de Janeiro */
                    243:          if (CityScore > 500)          z = -100;
                    244:          break;
                    245:   }
                    246:   ClearMes();
                    247:   SendMes(z);
                    248: 
                    249:   if (z == -200)
                    250:     DoLoseGame();
                    251: }
                    252: 
                    253: 
                    254: ClearMes(void)
                    255: {
                    256:   MessagePort = 0;
                    257:   MesX = 0;
                    258:   MesY = 0;
                    259:   LastPicNum = 0;
                    260: }
                    261: 
                    262: 
                    263: /* comefrom: MakeEarthquake MakeFire MakeFire MakeFlood SendMessages 
                    264:             CheckGrowth DoScenarioScore DoPowerScan */
                    265: SendMes(int Mnum)
                    266: {
                    267:   if (Mnum < 0) {
                    268:     if (Mnum != LastPicNum) {
                    269:       MessagePort = Mnum;
                    270:       MesX = 0;
                    271:       MesY = 0;
                    272:       LastPicNum = Mnum;
                    273:       return (1);
                    274:     }
                    275:   } else {
                    276:     if (!(MessagePort)) {
                    277:       MessagePort = Mnum;
                    278:       MesX = 0;
                    279:       MesY = 0;
                    280:       return(1);
                    281:     }
                    282:   }
                    283:   return(0);
                    284: }
                    285: 
                    286: 
                    287: /* comefrom: DoExplosion DoCopter ExplodeObject */
                    288: void SendMesAt(short Mnum, short x, short y)
                    289: {
                    290:   if (SendMes(Mnum)) {
                    291:     MesX = x;
                    292:     MesY = y;
                    293:   }
                    294: }
                    295: 
                    296: 
                    297: doMessage(void) 
                    298: {
                    299:   char messageStr[256];
                    300:   short pictId;
                    301:   short firstTime;
                    302: 
                    303:   messageStr[0] = 0;
                    304: 
                    305:   if (MessagePort) {
                    306:     MesNum = MessagePort;
                    307:     MessagePort = 0;
                    308:     LastMesTime = TickCount();
                    309:     firstTime = 1;
                    310:   } else {
                    311:     firstTime = 0;
                    312:     if (MesNum == 0)  return;
                    313:     if (MesNum < 0) {
                    314:       MesNum = -MesNum;
                    315:       LastMesTime = TickCount();
                    316:     } else if ((TickCount() - LastMesTime) > (60 * 30)) {
                    317:       MesNum = 0;
                    318:       return;
                    319:     }
                    320:   }
                    321:   if (firstTime) {
                    322:     switch ((MesNum < 0) ? -MesNum : MesNum) {
                    323:     case  12:
                    324:       if (Rand(5) == 1) {
                    325:        MakeSound("city", "HonkHonk-Med");
                    326:       } else if (Rand(5) == 1) {
                    327:        MakeSound("city", "HonkHonk-Low");
                    328:       } else if (Rand(5) == 1) {
                    329:        MakeSound("city", "HonkHonk-High");
                    330:       }
                    331:       break;
                    332:     case  11:
                    333:     case  20:
                    334:     case 22:
                    335:     case 23:
                    336:     case 24:
                    337:     case 25:
                    338:     case 26:
                    339:     case 27:
                    340:       MakeSound("city", "Siren");
                    341:       break;
                    342:     case  21:
                    343:       MakeSound("city", "Monster -speed [MonsterSpeed]");
                    344:       break;
                    345:     case 30:
                    346:       MakeSound("city", "Explosion-Low");
                    347:       MakeSound("city", "Siren");
                    348:       break;
                    349:     case  43:
                    350:       MakeSound("city", "Explosion-High");
                    351:       MakeSound("city", "Explosion-Low");
                    352:       MakeSound("city", "Siren");
                    353:       break;
                    354:     case  44:
                    355:       MakeSound("city", "Siren");
                    356:       break;
                    357:     }
                    358:   }
                    359: 
                    360:   if (MesNum >= 0) {
                    361:     if (MesNum == 0)
                    362:       return;
                    363: 
                    364:     if (MesNum > 60) {
                    365:       MesNum = 0;
                    366:       return;
                    367:     }
                    368: 
                    369:     GetIndString(messageStr, 301, MesNum);
                    370:     if (MesX || MesY) {
                    371:       /* TODO: draw goto button */
                    372:     }
                    373: 
                    374:     if (autoGo && (MesX || MesY)) {
                    375:       DoAutoGoto(MesX, MesY, messageStr);
                    376:       MesX = 0;
                    377:       MesY = 0;
                    378:     } else {
                    379:       SetMessageField(messageStr);
                    380:     }
                    381: 
                    382:   } else { /* picture message */
                    383:     pictId = -(MesNum);
                    384: 
                    385:     if (pictId < 43)
                    386:       GetIndString(messageStr, 301, pictId);
                    387:     else
                    388:       messageStr[0] = '\0';
                    389: 
                    390:     DoShowPicture(pictId);
                    391: 
                    392:     MessagePort = pictId; /* resend text message */
                    393: 
                    394:     if (autoGo && (MesX || MesY)) {
                    395:       
                    396:       DoAutoGoto(MesX, MesY, messageStr);
                    397:       MesX = 0;
                    398:       MesY = 0;
                    399:     }
                    400:   }
                    401: }
                    402: 
                    403: 
                    404: DoAutoGoto(short x, short y, char *msg)
                    405: {
                    406:   char buf[256];
                    407: 
                    408:   SetMessageField(msg);
                    409:   sprintf(buf, "UIAutoGoto %d %d", x, y);
                    410:   Eval(buf);
                    411: }
                    412: 
                    413: 
                    414: SetMessageField(char *str)
                    415: {
                    416:   char buf[256];
                    417: 
                    418:   if (!HaveLastMessage ||
                    419:       strcmp(LastMessage, str)) {
                    420:     strcpy(LastMessage, str);
                    421:     HaveLastMessage = 1;
                    422:     sprintf(buf, "UISetMessage {%s}", str);
                    423:     Eval(buf);
                    424:   }
                    425: }
                    426: 
                    427: 
                    428: DoShowPicture(short id)
                    429: {
                    430:   char buf[256];
                    431: 
                    432:   sprintf(buf, "UIShowPicture %d", id);
                    433:   Eval(buf);
                    434: }
                    435: 
                    436: 
                    437: DoLoseGame()
                    438: {
                    439:   Eval("UILoseGame");
                    440: }
                    441: 
                    442: 
                    443: DoWinGame()
                    444: {
                    445:   Eval("UIWinGame");
                    446: }
                    447: 
                    448: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.