Annotation of micropolis/src/sim/s_eval.c, revision 1.1

1.1     ! root        1: /* s_eval.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: /* City Evaluation */
        !            66: 
        !            67: 
        !            68: short EvalValid;
        !            69: short CityYes, CityNo;
        !            70: short ProblemTable[PROBNUM];
        !            71: short ProblemTaken[PROBNUM];
        !            72: short ProblemVotes[PROBNUM];           /* these are the votes for each  */
        !            73: short ProblemOrder[4];                 /* sorted index to above  */
        !            74: QUAD CityPop, deltaCityPop;
        !            75: QUAD CityAssValue;
        !            76: short CityClass;                       /*  0..5  */
        !            77: short CityScore, deltaCityScore, AverageCityScore;
        !            78: short TrafficAverage;
        !            79: 
        !            80: 
        !            81: /* comefrom: SpecialInit Simulate */
        !            82: CityEvaluation(void)
        !            83: {
        !            84:   EvalValid = 0;
        !            85:   if (TotalPop) {
        !            86:     GetAssValue();
        !            87:     DoPopNum();
        !            88:     DoProblems();
        !            89:     GetScore();
        !            90:     DoVotes();
        !            91:     ChangeEval();
        !            92:   } else {
        !            93:     EvalInit();
        !            94:     ChangeEval();
        !            95:   }
        !            96:   EvalValid = 1;
        !            97: }
        !            98: 
        !            99: 
        !           100: /* comefrom: CityEvaluation SetCommonInits */
        !           101: EvalInit(void)
        !           102: {
        !           103:   register short x, z;
        !           104: 
        !           105:   z = 0;
        !           106:   CityYes = z;
        !           107:   CityNo = z;
        !           108:   CityPop = z; 
        !           109:   deltaCityPop = z;
        !           110:   CityAssValue = z;
        !           111:   CityClass = z;
        !           112:   CityScore = 500; 
        !           113:   deltaCityScore = z;
        !           114:   EvalValid = 1;
        !           115:   for (x = 0; x < PROBNUM; x++)
        !           116:     ProblemVotes[x] = z;
        !           117:   for (x = 0; x < 4; x++)
        !           118:     ProblemOrder[x] = z;
        !           119: }
        !           120: 
        !           121: 
        !           122: /* comefrom: CityEvaluation */
        !           123: GetAssValue(void)
        !           124: {
        !           125:   QUAD z;
        !           126: 
        !           127:   z = RoadTotal * 5;
        !           128:   z += RailTotal * 10;
        !           129:   z += PolicePop * 1000;
        !           130:   z += FireStPop * 1000;
        !           131:   z += HospPop * 400;
        !           132:   z += StadiumPop * 3000;
        !           133:   z += PortPop * 5000;
        !           134:   z += APortPop * 10000;
        !           135:   z += CoalPop * 3000;
        !           136:   z += NuclearPop * 6000;
        !           137:   CityAssValue = z * 1000;
        !           138: }
        !           139: 
        !           140: 
        !           141: /* comefrom: CityEvaluation */
        !           142: DoPopNum(void)
        !           143: {
        !           144:   QUAD OldCityPop;
        !           145: 
        !           146:   OldCityPop = CityPop;
        !           147:   CityPop = ((ResPop) + (ComPop * 8L) + (IndPop *8L)) * 20L;
        !           148:   if (OldCityPop == -1) {
        !           149:     OldCityPop = CityPop;
        !           150:   }
        !           151:   deltaCityPop = CityPop - OldCityPop;
        !           152: 
        !           153:   CityClass = 0;                       /* village */
        !           154:   if (CityPop > 2000)  CityClass++;    /* town */
        !           155:   if (CityPop > 10000) CityClass++;    /* city */
        !           156:   if (CityPop > 50000) CityClass++;    /* capital */
        !           157:   if (CityPop > 100000)        CityClass++;    /* metropolis */
        !           158:   if (CityPop > 500000)        CityClass++;    /* megalopolis */
        !           159: }
        !           160: 
        !           161: 
        !           162: /* comefrom: CityEvaluation */
        !           163: DoProblems(void)
        !           164: {
        !           165:   register short x, z;
        !           166:   short ThisProb, Max;
        !           167: 
        !           168:   for (z = 0; z < PROBNUM; z++)
        !           169:     ProblemTable[z] = 0;
        !           170:   ProblemTable[0] = CrimeAverage;              /* Crime */
        !           171:   ProblemTable[1] = PolluteAverage;            /* Pollution */
        !           172:   ProblemTable[2] = LVAverage * .7;            /* Housing */
        !           173:   ProblemTable[3] = CityTax * 10;              /* Taxes */
        !           174:   ProblemTable[4] = AverageTrf();              /* Traffic */
        !           175:   ProblemTable[5] = GetUnemployment();         /* Unemployment */
        !           176:   ProblemTable[6] = GetFire();                 /* Fire */
        !           177:   VoteProblems();
        !           178:   for (z = 0; z < PROBNUM; z++)
        !           179:     ProblemTaken[z] = 0;
        !           180:   for (z = 0; z < 4; z++) {
        !           181:     Max = 0;
        !           182:     for (x = 0; x < 7; x++) {
        !           183:       if ((ProblemVotes[x] > Max) && (!ProblemTaken[x])) {
        !           184:        ThisProb = x;
        !           185:        Max = ProblemVotes[x];
        !           186:       }
        !           187:     }
        !           188:     if (Max) {
        !           189:       ProblemTaken[ThisProb] = 1;
        !           190:       ProblemOrder[z] = ThisProb;
        !           191:     }
        !           192:     else {
        !           193:       ProblemOrder[z] = 7;
        !           194:       ProblemTable[7] = 0;
        !           195:     }
        !           196:   }
        !           197: }
        !           198: 
        !           199: 
        !           200: /* comefrom: DoProblems */
        !           201: VoteProblems(void)
        !           202: {
        !           203:   register x, z, count;
        !           204: 
        !           205:   for (z = 0; z < PROBNUM; z++)
        !           206:     ProblemVotes[z] = 0;
        !           207: 
        !           208:   x = 0;
        !           209:   z = 0;
        !           210:   count = 0;
        !           211:   while ((z < 100) && (count < 600)) {
        !           212:     if (Rand(300) < ProblemTable[x]) {
        !           213:       ProblemVotes[x]++;
        !           214:       z++;
        !           215:     }
        !           216:     x++;
        !           217:     if (x > PROBNUM) x = 0;
        !           218:     count++;
        !           219:   }
        !           220: }
        !           221: 
        !           222: 
        !           223: /* comefrom: DoProblems */
        !           224: AverageTrf(void)
        !           225: {
        !           226:   QUAD TrfTotal;
        !           227:   register short x, y, count;
        !           228: 
        !           229:   TrfTotal = 0;
        !           230:   count = 1;
        !           231:   for (x=0; x < HWLDX; x++)
        !           232:     for (y=0; y < HWLDY; y++)  
        !           233:       if (LandValueMem[x][y]) {
        !           234:        TrfTotal += TrfDensity[x][y];
        !           235:        count++;
        !           236:       }
        !           237: 
        !           238:   TrafficAverage = (TrfTotal / count) * 2.4;
        !           239:   return(TrafficAverage);
        !           240: }
        !           241: 
        !           242: 
        !           243: /* comefrom: DoProblems */
        !           244: GetUnemployment(void)
        !           245: {
        !           246:   float r;
        !           247:   short b;
        !           248: 
        !           249:   b = (ComPop + IndPop) << 3;
        !           250:   if (b)
        !           251:     r = ((float)ResPop) / b;
        !           252:   else
        !           253:     return(0);
        !           254: 
        !           255:   b = (r - 1) * 255;
        !           256:   if (b > 255)
        !           257:     b = 255;
        !           258:   return (b);
        !           259: }
        !           260: 
        !           261: 
        !           262: /* comefrom: DoProblems GetScore */
        !           263: GetFire(void)
        !           264: {
        !           265:   short z;
        !           266: 
        !           267:   z = FirePop * 5;
        !           268:   if (z > 255)
        !           269:     return(255);
        !           270:   else
        !           271:     return(z);
        !           272: }
        !           273: 
        !           274: 
        !           275: /* comefrom: CityEvaluation */
        !           276: GetScore(void)
        !           277: {
        !           278:   register x, z;
        !           279:   short OldCityScore;
        !           280:   float SM, TM;
        !           281: 
        !           282:   OldCityScore = CityScore;
        !           283:   x = 0;
        !           284:   for (z = 0; z < 7; z++)
        !           285:     x += ProblemTable[z];      /* add 7 probs */
        !           286: 
        !           287:   x = x / 3;                   /* 7 + 2 average */
        !           288:   if (x > 256) x = 256;
        !           289: 
        !           290:   z = (256 - x) * 4;
        !           291:   if (z > 1000) z = 1000;
        !           292:   if (z < 0 ) z = 0;
        !           293: 
        !           294:   if (ResCap) z = z * .85;
        !           295:   if (ComCap) z = z * .85;
        !           296:   if (IndCap) z = z * .85;
        !           297:   if (RoadEffect < 32)  z = z - (32 - RoadEffect);
        !           298:   if (PoliceEffect < 1000) z = z * (.9 + (PoliceEffect / 10000.1));
        !           299:   if (FireEffect < 1000) z = z * (.9 + (FireEffect / 10000.1));
        !           300:   if (RValve < -1000) z = z * .85;
        !           301:   if (CValve < -1000) z = z * .85;
        !           302:   if (IValve < -1000) z = z * .85;
        !           303: 
        !           304:   SM = 1.0;
        !           305:   if ((CityPop == 0) || (deltaCityPop == 0))
        !           306:     SM = 1.0;
        !           307:   else if (deltaCityPop == CityPop)
        !           308:     SM = 1.0;
        !           309:   else if (deltaCityPop > 0)
        !           310:     SM = ((float)deltaCityPop/CityPop) + 1.0;
        !           311:   else if (deltaCityPop < 0)  
        !           312:     SM = .95 + ((float) deltaCityPop/(CityPop - deltaCityPop));
        !           313:   z = z * SM;
        !           314:   z = z - GetFire();           /* dec score for fires */
        !           315:   z = z - (CityTax);
        !           316: 
        !           317:   TM = unPwrdZCnt + PwrdZCnt;  /* dec score for unpowered zones */
        !           318:   if (TM) SM = PwrdZCnt / TM;
        !           319:   else SM = 1.0;
        !           320:   z = z * SM; 
        !           321: 
        !           322:   if (z > 1000) z = 1000;
        !           323:   if (z < 0 ) z = 0;
        !           324: 
        !           325:   CityScore = (CityScore + z) / 2; 
        !           326: 
        !           327:   deltaCityScore = CityScore - OldCityScore;
        !           328: }
        !           329: 
        !           330: 
        !           331: /* comefrom: CityEvaluation */
        !           332: DoVotes(void)
        !           333: {
        !           334:   register z;
        !           335: 
        !           336:   CityYes = 0;
        !           337:   CityNo = 0;
        !           338:   for (z = 0; z < 100; z++) {
        !           339:     if (Rand(1000) < CityScore)
        !           340:       CityYes++;
        !           341:     else
        !           342:       CityNo++;
        !           343:   }
        !           344: }

unix.superglobalmegacorp.com

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