]>
cvs.zerfleddert.de Git - micropolis/blob - src/sim/s_eval.c
   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. 
   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. 
  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/>. 
  21  *             ADDITIONAL TERMS per GNU GPL Section 7 
  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. 
  29  * Any propagation or conveyance of this program must include this 
  30  * copyright notice and these terms. 
  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. 
  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. 
  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 
  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
; 
  76 short CityClass
;                        /*  0..5  */ 
  77 short CityScore
, deltaCityScore
, AverageCityScore
; 
  82 void VoteProblems(void); 
  83 void DoProblems(void); 
  85 void GetAssValue(void); 
  88 /* comefrom: SpecialInit Simulate */ 
 108 /* comefrom: CityEvaluation SetCommonInits */ 
 124   for (x 
= 0; x 
< PROBNUM
; x
++) 
 126   for (x 
= 0; x 
< 4; x
++) 
 131 /* comefrom: CityEvaluation */ 
 139   z 
+= PolicePop 
* 1000; 
 140   z 
+= FireStPop 
* 1000; 
 142   z 
+= StadiumPop 
* 3000; 
 144   z 
+= APortPop 
* 10000; 
 146   z 
+= NuclearPop 
* 6000; 
 147   CityAssValue 
= z 
* 1000; 
 151 /* comefrom: CityEvaluation */ 
 157   OldCityPop 
= CityPop
; 
 158   CityPop 
= ((ResPop
) + (ComPop 
* 8L) + (IndPop 
*8L)) * 20L; 
 159   if (OldCityPop 
== -1) { 
 160     OldCityPop 
= CityPop
; 
 162   deltaCityPop 
= CityPop 
- OldCityPop
; 
 164   CityClass 
= 0;                        /* village */ 
 165   if (CityPop 
> 2000)   CityClass
++;    /* town */ 
 166   if (CityPop 
> 10000)  CityClass
++;    /* city */ 
 167   if (CityPop 
> 50000)  CityClass
++;    /* capital */ 
 168   if (CityPop 
> 100000) CityClass
++;    /* metropolis */ 
 169   if (CityPop 
> 500000) CityClass
++;    /* megalopolis */ 
 173 /* comefrom: CityEvaluation */ 
 178   short ThisProb 
= 0, Max
; 
 180   for (z 
= 0; z 
< PROBNUM
; z
++) 
 182   ProblemTable
[0] = CrimeAverage
;               /* Crime */ 
 183   ProblemTable
[1] = PolluteAverage
;             /* Pollution */ 
 184   ProblemTable
[2] = LVAverage 
* .7;             /* Housing */ 
 185   ProblemTable
[3] = CityTax 
* 10;               /* Taxes */ 
 186   ProblemTable
[4] = AverageTrf();               /* Traffic */ 
 187   ProblemTable
[5] = GetUnemployment();          /* Unemployment */ 
 188   ProblemTable
[6] = GetFire();                  /* Fire */ 
 190   for (z 
= 0; z 
< PROBNUM
; z
++) 
 192   for (z 
= 0; z 
< 4; z
++) { 
 194     for (x 
= 0; x 
< 7; x
++) { 
 195       if ((ProblemVotes
[x
] > Max
) && (!ProblemTaken
[x
])) { 
 197         Max 
= ProblemVotes
[x
]; 
 201       ProblemTaken
[ThisProb
] = 1; 
 202       ProblemOrder
[z
] = ThisProb
; 
 212 /* comefrom: DoProblems */ 
 216   register int x
, z
, count
; 
 218   for (z 
= 0; z 
< PROBNUM
; z
++) 
 224   while ((z 
< 100) && (count 
< 600)) { 
 225     if (Rand(300) < ProblemTable
[x
]) { 
 230     if (x 
> PROBNUM
) x 
= 0; 
 236 /* comefrom: DoProblems */ 
 241   register short x
, y
, count
; 
 245   for (x
=0; x 
< HWLDX
; x
++) 
 246     for (y
=0; y 
< HWLDY
; y
++)    
 247       if (LandValueMem
[x
][y
]) { 
 248         TrfTotal 
+= TrfDensity
[x
][y
]; 
 252   TrafficAverage 
= (TrfTotal 
/ count
) * 2.4; 
 253   return(TrafficAverage
); 
 257 /* comefrom: DoProblems */ 
 259 GetUnemployment(void) 
 264   b 
= (ComPop 
+ IndPop
) << 3; 
 266     r 
= ((float)ResPop
) / b
; 
 277 /* comefrom: DoProblems GetScore */ 
 291 /* comefrom: CityEvaluation */ 
 299   OldCityScore 
= CityScore
; 
 301   for (z 
= 0; z 
< 7; z
++) 
 302     x 
+= ProblemTable
[z
];       /* add 7 probs */ 
 304   x 
= x 
/ 3;                    /* 7 + 2 average */ 
 305   if (x 
> 256) x 
= 256; 
 308   if (z 
> 1000) z 
= 1000; 
 311   if (ResCap
) z 
= z 
* .85; 
 312   if (ComCap
) z 
= z 
* .85; 
 313   if (IndCap
) z 
= z 
* .85; 
 314   if (RoadEffect 
< 32)  z 
= z 
- (32 - RoadEffect
); 
 315   if (PoliceEffect 
< 1000) z 
= z 
* (.9 + (PoliceEffect 
/ 10000.1)); 
 316   if (FireEffect 
< 1000) z 
= z 
* (.9 + (FireEffect 
/ 10000.1)); 
 317   if (RValve 
< -1000) z 
= z 
* .85; 
 318   if (CValve 
< -1000) z 
= z 
* .85; 
 319   if (IValve 
< -1000) z 
= z 
* .85; 
 322   if ((CityPop 
== 0) || (deltaCityPop 
== 0)) 
 324   else if (deltaCityPop 
== CityPop
) 
 326   else if (deltaCityPop 
> 0) 
 327     SM 
= ((float)deltaCityPop
/CityPop
) + 1.0; 
 328   else if (deltaCityPop 
< 0)   
 329     SM 
= .95 + ((float) deltaCityPop
/(CityPop 
- deltaCityPop
)); 
 331   z 
= z 
- GetFire();            /* dec score for fires */ 
 334   TM 
= unPwrdZCnt 
+ PwrdZCnt
;   /* dec score for unpowered zones */ 
 335   if (TM
) SM 
= PwrdZCnt 
/ TM
; 
 339   if (z 
> 1000) z 
= 1000; 
 342   CityScore 
= (CityScore 
+ z
) / 2;  
 344   deltaCityScore 
= CityScore 
- OldCityScore
; 
 348 /* comefrom: CityEvaluation */ 
 356   for (z 
= 0; z 
< 100; z
++) { 
 357     if (Rand(1000) < CityScore
)