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

1.1       root        1: /* s_zone.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: /* Zone Stuff */
                     66: 
                     67: 
                     68: DoZone(void)
                     69: {
                     70:   short ZonePwrFlg;
                     71: 
                     72:   ZonePwrFlg = SetZPower();    /* Set Power Bit in Map from PowerMap */
                     73:   if (ZonePwrFlg) PwrdZCnt++;
                     74:   else unPwrdZCnt++;
                     75: 
                     76:   if (CChr9 > PORTBASE) {      /* do Special Zones  */
                     77:     DoSPZone(ZonePwrFlg);
                     78:     return;
                     79:   }
                     80:   if (CChr9 < HOSPITAL) {      
                     81:     DoResidential(ZonePwrFlg);
                     82:     return;
                     83:   }
                     84:   if (CChr9 < COMBASE) {
                     85:     DoHospChur();
                     86:     return;
                     87:   }
                     88:   if (CChr9 < INDBASE)  {
                     89:     DoCommercial(ZonePwrFlg);
                     90:     return;
                     91:   }
                     92:   DoIndustrial(ZonePwrFlg);
                     93:   return;
                     94: }
                     95: 
                     96: 
                     97: DoHospChur(void)
                     98: {
                     99:   if (CChr9 == HOSPITAL) {
                    100:     HospPop++;
                    101:     if (!(CityTime & 15)) RepairZone (HOSPITAL, 3); /*post*/
                    102:     if (NeedHosp == -1)
                    103:       if (!Rand(20))
                    104:        ZonePlop(RESBASE);
                    105:   }
                    106:   if (CChr9 == CHURCH) {
                    107:     ChurchPop++;
                    108:     if (!(CityTime & 15)) RepairZone (CHURCH, 3); /*post*/
                    109:     if (NeedChurch == -1)
                    110:       if (!Rand(20))
                    111:        ZonePlop(RESBASE);
                    112:   }
                    113: }
                    114: 
                    115: 
                    116: #define T 1
                    117: #define F 0
                    118: #define ASCBIT (ANIMBIT | CONDBIT | BURNBIT)
                    119: #define REGBIT (CONDBIT | BURNBIT)
                    120: 
                    121: SetSmoke(int ZonePower)
                    122: {
                    123:   static short AniThis[8] = {    T,    F,    T,    T,    F,    F,    T,    T };
                    124:   static short DX1[8]    = {   -1,    0,    1,    0,    0,    0,    0,    1 };
                    125:   static short DY1[8]    = {   -1,    0,   -1,   -1,    0,    0,   -1,   -1 };
                    126:   static short DX2[8]    = {   -1,    0,    1,    1,    0,    0,    1,    1 };
                    127:   static short DY2[8]    = {   -1,    0,    0,   -1,    0,    0,   -1,    0 };
                    128:   static short AniTabA[8] = {    0,    0,   32,   40,    0,    0,   48,   56 };
                    129:   static short AniTabB[8] = {    0,    0,   36,   44,    0,    0,   52,   60 };
                    130:   static short AniTabC[8] = { IND1,    0, IND2, IND4,    0,    0, IND6, IND8 };
                    131:   static short AniTabD[8] = { IND1,    0, IND3, IND5,    0,    0, IND7, IND9 };
                    132:   register short z;
                    133: 
                    134:   if (CChr9 < IZB) return;
                    135:   z = (CChr9 - IZB) >>3;
                    136:   z = z & 7;
                    137:   if (AniThis[z]) {
                    138:     int xx = SMapX + DX1[z];
                    139:     int yy = SMapY + DY1[z];
                    140:     if (TestBounds(xx, yy)) {
                    141:       if (ZonePower) {
                    142:        if ((Map[xx][yy] & LOMASK) == AniTabC[z]) {
                    143:          Map[xx][yy] =
                    144:            ASCBIT | (SMOKEBASE + AniTabA[z]);
                    145:          Map[xx][yy] =
                    146:            ASCBIT | (SMOKEBASE + AniTabB[z]);
                    147:        }
                    148:       } else {
                    149:        if ((Map[xx][yy] & LOMASK) > AniTabC[z]) {
                    150:          Map[xx][yy] =
                    151:            REGBIT | AniTabC[z];
                    152:          Map[xx][yy] =
                    153:            REGBIT | AniTabD[z];
                    154:        }
                    155:       }
                    156:     }
                    157:   }
                    158: }
                    159: 
                    160: 
                    161: DoIndustrial(int ZonePwrFlg)
                    162: {
                    163:   short tpop, zscore, TrfGood;
                    164: 
                    165:   IndZPop++;
                    166:   SetSmoke(ZonePwrFlg);
                    167:   tpop = IZPop(CChr9);
                    168:   IndPop += tpop;
                    169:   if (tpop > Rand(5)) TrfGood = MakeTraf(2);
                    170:   else TrfGood = TRUE;
                    171: 
                    172:   if (TrfGood == -1) {
                    173:     DoIndOut(tpop, Rand16() & 1);
                    174:     return;
                    175:   }
                    176: 
                    177:   if (!(Rand16() & 7)) {
                    178:     zscore = IValve + EvalInd(TrfGood);
                    179:     if (!ZonePwrFlg) zscore = -500;
                    180:     if ((zscore > -350) &&
                    181:        (((short)(zscore - 26380)) > ((short)Rand16Signed()))) {
                    182:       DoIndIn(tpop, Rand16() & 1);
                    183:       return;
                    184:     }
                    185:     if ((zscore < 350) &&
                    186:        (((short)(zscore + 26380)) < ((short)Rand16Signed())))
                    187:       DoIndOut(tpop, Rand16() & 1);
                    188:   }
                    189: }
                    190: 
                    191: 
                    192: DoCommercial(int ZonePwrFlg)
                    193: {
                    194:   register short tpop, TrfGood;
                    195:   short zscore, locvalve,value;
                    196: 
                    197:   ComZPop++;
                    198:   tpop = CZPop(CChr9);
                    199:   ComPop += tpop;
                    200:   if (tpop > Rand(5)) TrfGood = MakeTraf(1);
                    201:   else TrfGood = TRUE;
                    202: 
                    203:   if (TrfGood == -1) {
                    204:     value = GetCRVal();
                    205:     DoComOut(tpop, value);
                    206:     return;
                    207:   }
                    208: 
                    209:   if (!(Rand16() & 7)) {
                    210:     locvalve = EvalCom(TrfGood);
                    211:     zscore = CValve + locvalve;
                    212:     if (!ZonePwrFlg) zscore = -500;
                    213: 
                    214:     if (TrfGood &&
                    215:        (zscore > -350) &&
                    216:        (((short)(zscore - 26380)) > ((short)Rand16Signed()))) {
                    217:       value = GetCRVal();
                    218:       DoComIn(tpop, value);
                    219:       return;
                    220:     }
                    221:     if ((zscore < 350) &&
                    222:        (((short)(zscore + 26380)) < ((short)Rand16Signed()))) {
                    223:       value = GetCRVal();
                    224:       DoComOut(tpop, value);
                    225:     }
                    226:   }
                    227: }
                    228: 
                    229: 
                    230: DoResidential(int ZonePwrFlg)
                    231: {
                    232:   short tpop, zscore, locvalve, value, TrfGood;
                    233: 
                    234:   ResZPop++;
                    235:   if (CChr9 == FREEZ) tpop = DoFreePop();
                    236:   else tpop = RZPop(CChr9);
                    237: 
                    238:   ResPop += tpop;
                    239:   if (tpop > Rand(35)) TrfGood = MakeTraf(0);
                    240:   else TrfGood = TRUE;
                    241: 
                    242:   if (TrfGood == -1) {
                    243:     value = GetCRVal();
                    244:     DoResOut(tpop, value);
                    245:     return;
                    246:   }
                    247: 
                    248:   if ((CChr9 == FREEZ) || (!(Rand16() & 7))) {
                    249:     locvalve = EvalRes(TrfGood);
                    250:     zscore = RValve + locvalve;
                    251:     if (!ZonePwrFlg) zscore = -500;
                    252: 
                    253:     if ((zscore > -350) &&
                    254:        (((short)(zscore - 26380)) > ((short)Rand16Signed()))) {
                    255:       if ((!tpop) && (!(Rand16() & 3))) {
                    256:        MakeHosp();
                    257:        return;
                    258:       }
                    259:       value = GetCRVal();
                    260:       DoResIn(tpop, value);
                    261:       return;
                    262:     }
                    263:     if ((zscore < 350) &&
                    264:        (((short)(zscore + 26380)) < ((short)Rand16Signed()))) {
                    265:            value = GetCRVal();
                    266:            DoResOut(tpop, value);
                    267:     }
                    268:   }
                    269: }
                    270: 
                    271: 
                    272: MakeHosp(void)
                    273: {
                    274:   if (NeedHosp > 0) {
                    275:     ZonePlop(HOSPITAL - 4);
                    276:     NeedHosp = FALSE;
                    277:     return;
                    278:   }
                    279:   if (NeedChurch > 0) {
                    280:     ZonePlop(CHURCH - 4);
                    281:     NeedChurch = FALSE;
                    282:     return;
                    283:   }
                    284: }
                    285: 
                    286: 
                    287: GetCRVal(void)
                    288: {
                    289:   register short LVal;
                    290: 
                    291:   LVal = LandValueMem[SMapX >>1][SMapY >>1];
                    292:   LVal -= PollutionMem[SMapX >>1][SMapY >>1];
                    293:   if (LVal < 30) return (0);
                    294:   if (LVal < 80) return (1);
                    295:   if (LVal < 150) return (2);
                    296:   return (3);
                    297: }
                    298: 
                    299: 
                    300: DoResIn(int pop, int value)
                    301: {
                    302:   short z;
                    303: 
                    304:   z = PollutionMem[SMapX >>1][SMapY >>1];
                    305:   if (z > 128) return;
                    306: 
                    307:   if (CChr9 == FREEZ) {
                    308:     if (pop < 8) {
                    309:       BuildHouse(value);
                    310:       IncROG(1);
                    311:       return;
                    312:     }
                    313:     if (PopDensity[SMapX >>1][SMapY >>1] > 64) {
                    314:       ResPlop(0, value);
                    315:       IncROG(8);
                    316:       return;
                    317:     }
                    318:     return;
                    319:   }
                    320:   if (pop < 40) {
                    321:     ResPlop((pop / 8) - 1, value);
                    322:     IncROG(8);
                    323:   }
                    324: }
                    325: 
                    326: 
                    327: DoComIn(int pop, int value)
                    328: {
                    329:   register short z;
                    330: 
                    331:   z = LandValueMem[SMapX >>1][SMapY >>1];
                    332:   z = z >>5;
                    333:   if (pop > z) return;
                    334: 
                    335:   if (pop < 5) {
                    336:     ComPlop(pop, value);
                    337:     IncROG(8);
                    338:   }
                    339: }
                    340: 
                    341: 
                    342: DoIndIn(int pop, int value)
                    343: {
                    344:   if (pop < 4) {
                    345:     IndPlop(pop, value);
                    346:     IncROG(8);
                    347:   }
                    348: }
                    349: 
                    350: 
                    351: IncROG(int amount)
                    352: {
                    353:   RateOGMem[SMapX>>3][SMapY>>3] += amount<<2;
                    354: }
                    355: 
                    356: 
                    357: DoResOut(int pop, int value)
                    358: {
                    359:   static short Brdr[9] = {0,3,6,1,4,7,2,5,8};
                    360:   register short x, y, loc, z;
                    361: 
                    362:   if (!pop) return;
                    363:   if (pop > 16) {
                    364:     ResPlop(((pop - 24) / 8), value);
                    365:     IncROG(-8);
                    366:     return;
                    367:   }
                    368:   if (pop == 16) {
                    369:     IncROG(-8);
                    370:     Map[SMapX][SMapY] = (FREEZ | BLBNCNBIT | ZONEBIT);
                    371:     for (x = SMapX - 1; x <= SMapX + 1; x++)
                    372:       for (y = SMapY - 1; y <= SMapY + 1; y++)
                    373:        if (x >= 0 && x < WORLD_X &&
                    374:            y >= 0 && y < WORLD_Y) {
                    375:          if ((Map[x][y] & LOMASK) != FREEZ)
                    376:            Map[x][y] = LHTHR + value +
                    377:              Rand(2) + BLBNCNBIT;
                    378:        }
                    379:   }
                    380:   if (pop < 16) {
                    381:     IncROG(-1);
                    382:     z = 0;
                    383:     for (x = SMapX - 1; x <= SMapX + 1; x++)
                    384:       for (y = SMapY - 1; y <= SMapY + 1; y++) {
                    385:        if (x >= 0 && x < WORLD_X &&
                    386:            y >= 0 && y < WORLD_Y) {
                    387:          loc = Map[x][y] & LOMASK;
                    388:          if ((loc >= LHTHR) && (loc <= HHTHR)) {
                    389:            Map[x][y] = Brdr[z] +
                    390:              BLBNCNBIT + FREEZ - 4;
                    391:            return;
                    392:          }
                    393:        }
                    394:        z++;
                    395:       }
                    396:   }
                    397: }
                    398: 
                    399: 
                    400: DoComOut(int pop, int value)
                    401: {
                    402:   if (pop > 1) {
                    403:     ComPlop(pop - 2, value);
                    404:     IncROG(-8);
                    405:     return;
                    406:   }
                    407:   if (pop == 1) {
                    408:     ZonePlop(COMBASE);
                    409:     IncROG(-8);
                    410:   }
                    411: }
                    412: 
                    413: 
                    414: DoIndOut(int pop, int value)
                    415: {
                    416:   if (pop > 1) {
                    417:     IndPlop(pop - 2, value);
                    418:     IncROG(-8);
                    419:     return;
                    420:   }
                    421:   if (pop == 1) {
                    422:     ZonePlop(INDCLR - 4);
                    423:     IncROG(-8);
                    424:   }
                    425: }
                    426: 
                    427: 
                    428: RZPop(int Ch9)
                    429: {
                    430:   short CzDen;
                    431: 
                    432:   CzDen = (((Ch9 - RZB) / 9) % 4);
                    433:   return ((CzDen * 8) + 16);
                    434: }
                    435: 
                    436: 
                    437: CZPop(int Ch9)
                    438: {
                    439:   short CzDen;
                    440: 
                    441:   if (Ch9 == COMCLR) return (0);
                    442:   CzDen = (((Ch9 - CZB) / 9) % 5) + 1;
                    443:   return (CzDen);
                    444: }
                    445: 
                    446: 
                    447: IZPop(int Ch9)
                    448: {
                    449:   short CzDen;
                    450: 
                    451:   if (Ch9 == INDCLR) return (0);
                    452:   CzDen = (((Ch9 - IZB) / 9) % 4) + 1;
                    453:   return (CzDen);
                    454: }
                    455: 
                    456: 
                    457: BuildHouse(int value)
                    458: {
                    459:   short z, score, hscore, BestLoc;
                    460:   static short ZeX[9] = { 0,-1, 0, 1,-1, 1,-1, 0, 1};
                    461:   static short ZeY[9] = { 0,-1,-1,-1, 0, 0, 1, 1, 1};
                    462: 
                    463:   BestLoc = 0;
                    464:   hscore = 0;
                    465:   for (z = 1; z < 9; z++) {
                    466:     int xx = SMapX + ZeX[z];
                    467:     int yy = SMapY + ZeY[z];
                    468:     if (TestBounds(xx, yy)) {
                    469:       score = EvalLot(xx, yy);
                    470:       if (score != 0) {
                    471:        if (score > hscore) {
                    472:          hscore = score;
                    473:          BestLoc = z;
                    474:        }
                    475:        if ((score == hscore) && !(Rand16() & 7))
                    476:          BestLoc = z;
                    477:       }
                    478:     }
                    479:   }
                    480:   if (BestLoc) {
                    481:     int xx = SMapX + ZeX[BestLoc];
                    482:     int yy = SMapY + ZeY[BestLoc];
                    483:     if (TestBounds(xx, yy)) {
                    484:       Map[xx][yy] = HOUSE + BLBNCNBIT + Rand(2) + (value * 3);
                    485:     }
                    486:   }
                    487: }
                    488: 
                    489: 
                    490: ResPlop (int Den, int Value)
                    491: {
                    492:   short base;
                    493: 
                    494:   base = (((Value * 4) + Den) * 9) + RZB - 4;
                    495:   ZonePlop(base);
                    496: }
                    497: 
                    498: 
                    499: ComPlop (int Den, int Value)
                    500: {
                    501:   short base;
                    502:        
                    503:   base = (((Value * 5) + Den) * 9) + CZB - 4;
                    504:   ZonePlop(base);
                    505: }
                    506: 
                    507: 
                    508: IndPlop (int Den, int Value)
                    509: {
                    510:   short base;
                    511:        
                    512:   base = (((Value * 4) + Den) * 9) + (IZB - 4);
                    513:   ZonePlop (base);
                    514: }
                    515: 
                    516: 
                    517: EvalLot (int x, int y)
                    518: {
                    519:   short z, score;
                    520:   static short DX[4] = { 0, 1, 0,-1};
                    521:   static short DY[4] = {-1, 0, 1, 0};
                    522: 
                    523:   /* test for clear lot */
                    524:   z = Map[x][y] & LOMASK;
                    525:   if (z && ((z < RESBASE) || (z > RESBASE + 8)))
                    526:     return (-1);
                    527:   score = 1;
                    528:   for (z = 0; z < 4; z++) {
                    529:     int xx = x + DX[z];
                    530:     int yy = y + DY[z];
                    531:     if (TestBounds(xx, yy) && 
                    532:        Map[xx][yy] &&
                    533:        ((Map[xx][yy] & LOMASK) <= LASTROAD)) {
                    534:       score++;         /* look for road */
                    535:     }
                    536:   }
                    537:   return (score);
                    538: }
                    539: 
                    540: 
                    541: ZonePlop (int base)
                    542: {
                    543:   short z, x;
                    544:   static short Zx[9] = {-1, 0, 1,-1, 0, 1,-1, 0, 1};
                    545:   static short Zy[9] = {-1,-1,-1, 0, 0, 0, 1, 1, 1};
                    546: 
                    547:   for (z = 0; z < 9; z++) {            /* check for fire  */
                    548:     int xx = SMapX + Zx[z];
                    549:     int yy = SMapY + Zy[z];
                    550:     if (TestBounds(xx, yy)) {
                    551:       x = Map[xx][yy] & LOMASK;
                    552:       if ((x >= FLOOD) && (x < ROADBASE)) return (FALSE);
                    553:     }
                    554:   }
                    555:   for (z = 0; z < 9; z++) {
                    556:     int xx = SMapX + Zx[z];
                    557:     int yy = SMapY + Zy[z];
                    558:     if (TestBounds(xx, yy)) {
                    559:       Map[xx][yy] = base + BNCNBIT;
                    560:     }
                    561:   base++;
                    562:   }
                    563:   CChr = Map[SMapX][SMapY];
                    564:   SetZPower();
                    565:   Map[SMapX][SMapY] |= ZONEBIT + BULLBIT;
                    566: }
                    567: 
                    568: 
                    569: EvalRes (int traf)
                    570: {
                    571:   register short Value;
                    572: 
                    573:   if (traf < 0) return (-3000);
                    574: 
                    575:   Value = LandValueMem[SMapX >>1][SMapY >>1];
                    576:   Value -= PollutionMem[SMapX >>1][SMapY >>1];
                    577: 
                    578:   if (Value < 0) Value = 0;            /* Cap at 0 */
                    579:   else Value = Value <<5;
                    580: 
                    581:   if (Value > 6000) Value = 6000;      /* Cap at 6000 */
                    582: 
                    583:   Value = Value - 3000;
                    584:   return (Value);
                    585: }
                    586: 
                    587: 
                    588: EvalCom (int traf)
                    589: {
                    590:   short Value;
                    591: 
                    592:   if (traf < 0) return (-3000);
                    593:   Value = ComRate[SMapX >>3][SMapY >>3];
                    594:   return (Value);
                    595: }
                    596: 
                    597: 
                    598: EvalInd (int traf)
                    599: {
                    600:   if (traf < 0) return (-1000);
                    601:   return (0);
                    602: }
                    603: 
                    604: 
                    605: DoFreePop (void)
                    606: {
                    607:   short count;
                    608:   register short loc, x, y;
                    609: 
                    610:   count = 0;
                    611:   for (x = SMapX - 1; x <= SMapX + 1; x++)
                    612:     for (y = SMapY - 1; y <= SMapY + 1; y++) {
                    613:       if (x >= 0 && x < WORLD_X &&
                    614:          y >= 0 && y < WORLD_Y) {
                    615:        loc = Map[x][y] & LOMASK;
                    616:        if ((loc >= LHTHR) && (loc <= HHTHR))
                    617:          count++;
                    618:       }
                    619:     }
                    620:   return (count);
                    621: }
                    622: 
                    623: 
                    624: SetZPower(void)                /* set bit in MapWord depending on powermap  */
                    625: {
                    626:   short z;
                    627:   QUAD PowerWrd;
                    628: 
                    629: /* TestPowerBit was taking alot of time so I inlined it. -Don */
                    630: 
                    631: #if 0
                    632: 
                    633:   if (z = TestPowerBit())
                    634:     Map[SMapX][SMapY] = CChr | PWRBIT;
                    635:   else
                    636:     Map[SMapX][SMapY] = CChr & (~PWRBIT);
                    637:   return (z);
                    638: 
                    639: #else
                    640: 
                    641:   if ((CChr9 == NUCLEAR) ||
                    642:       (CChr9 == POWERPLANT) ||
                    643:       (
                    644: #if 1
                    645:        (PowerWrd = POWERWORD(SMapX, SMapY)),
                    646: #else
                    647:        (PowerWrd = (SMapX >>4) + (SMapY <<3)),
                    648: #endif
                    649:        ((PowerWrd < PWRMAPSIZE) &&
                    650:        (PowerMap[PowerWrd] & (1 << (SMapX & 15)))))) {
                    651:     Map[SMapX][SMapY] = CChr | PWRBIT;
                    652:     return 1;
                    653:   } else {
                    654:     Map[SMapX][SMapY] = CChr & (~PWRBIT);
                    655:     return 0;
                    656:   }
                    657: 
                    658: #endif
                    659: }

unix.superglobalmegacorp.com

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