|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.