|
|
1.1 ! root 1: /* s_gen.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: /* Generate Map */ ! 66: ! 67: ! 68: #define WATER_LOW RIVER /* 2 */ ! 69: #define WATER_HIGH LASTRIVEDGE /* 20 */ ! 70: #define WOODS_LOW TREEBASE /* 21 */ ! 71: #define WOODS_HIGH UNUSED_TRASH2 /* 39 */ ! 72: ! 73: ! 74: short XStart, YStart, MapX, MapY; ! 75: short Dir, LastDir; ! 76: int TreeLevel = -1; /* level for tree creation */ ! 77: int LakeLevel = -1; /* level for lake creation */ ! 78: int CurveLevel = -1; /* level for river curviness */ ! 79: int CreateIsland = -1; /* -1 => 10%, 0 => never, 1 => always */ ! 80: ! 81: ! 82: GenerateNewCity(void) ! 83: { ! 84: GenerateSomeCity(Rand16()); ! 85: } ! 86: ! 87: ! 88: GenerateSomeCity(int r) ! 89: { ! 90: if (CityFileName != NULL) { ! 91: ckfree(CityFileName); ! 92: CityFileName = NULL; ! 93: } ! 94: ! 95: gettimeofday(&start_time, NULL); ! 96: ! 97: GenerateMap(r); ! 98: ScenarioID = 0; ! 99: CityTime = 0; ! 100: InitSimLoad = 2; ! 101: DoInitialEval = 0; ! 102: ! 103: InitWillStuff(); ! 104: ResetMapState(); ! 105: ResetEditorState(); ! 106: InvalidateEditors(); ! 107: InvalidateMaps(); ! 108: UpdateFunds(); ! 109: DoSimInit(); ! 110: Eval("UIDidGenerateNewCity"); ! 111: Kick(); ! 112: } ! 113: ! 114: ! 115: ERand(short limit) ! 116: { ! 117: short x, z; ! 118: ! 119: z = Rand(limit); ! 120: x = Rand(limit); ! 121: if (z < x) ! 122: return (z); ! 123: return (x); ! 124: } ! 125: ! 126: ! 127: GenerateMap(int r) ! 128: { ! 129: SeedRand(r); ! 130: ! 131: if (CreateIsland < 0) { ! 132: if (Rand(100) < 10) { /* chance that island is generated */ ! 133: MakeIsland(); ! 134: return; ! 135: } ! 136: } ! 137: if (CreateIsland == 1) { ! 138: MakeNakedIsland(); ! 139: } else { ! 140: ClearMap(); ! 141: } ! 142: GetRandStart(); ! 143: if (CurveLevel != 0) { ! 144: DoRivers(); ! 145: } ! 146: if (LakeLevel != 0) { ! 147: MakeLakes(); ! 148: } ! 149: SmoothRiver(); ! 150: if (TreeLevel != 0) { ! 151: DoTrees(); ! 152: } ! 153: RandomlySeedRand(); ! 154: } ! 155: ! 156: ! 157: ClearMap(void) ! 158: { ! 159: register short x, y; ! 160: ! 161: for (x = 0; x < WORLD_X; x++) ! 162: for (y = 0; y < WORLD_Y; y++) ! 163: Map[x][y] = DIRT; ! 164: } ! 165: ! 166: ! 167: ClearUnnatural(void) ! 168: { ! 169: register short x, y; ! 170: ! 171: for (x = 0; x < WORLD_X; x++) { ! 172: for (y = 0; y < WORLD_Y; y++) { ! 173: if (Map[x][y] > WOODS) { ! 174: Map[x][y] = DIRT; ! 175: } ! 176: } ! 177: } ! 178: } ! 179: ! 180: ! 181: #define RADIUS 18 ! 182: ! 183: MakeNakedIsland() ! 184: { ! 185: register int x, y; ! 186: ! 187: for (x = 0; x < WORLD_X; x++) ! 188: for (y = 0; y < WORLD_Y; y++) ! 189: Map[x][y] = RIVER; ! 190: for (x = 5; x < WORLD_X - 5; x++) ! 191: for (y = 5; y < WORLD_Y - 5; y++) ! 192: Map[x][y] = DIRT; ! 193: for (x = 0; x < WORLD_X - 5; x += 2) { ! 194: MapX = x ; ! 195: MapY = ERand(RADIUS); ! 196: BRivPlop(); ! 197: MapY = (WORLD_Y - 10) - ERand(RADIUS); ! 198: BRivPlop(); ! 199: MapY = 0; ! 200: SRivPlop(); ! 201: MapY = (WORLD_Y - 6); ! 202: SRivPlop(); ! 203: } ! 204: for (y = 0; y < WORLD_Y - 5; y += 2) { ! 205: MapY = y ; ! 206: MapX = ERand(RADIUS); ! 207: BRivPlop(); ! 208: MapX = (WORLD_X - 10) - ERand(RADIUS); ! 209: BRivPlop(); ! 210: MapX = 0; ! 211: SRivPlop(); ! 212: MapX = (WORLD_X - 6); ! 213: SRivPlop(); ! 214: } ! 215: } ! 216: ! 217: ! 218: MakeIsland(void) ! 219: { ! 220: MakeNakedIsland(); ! 221: SmoothRiver(); ! 222: DoTrees(); ! 223: } ! 224: ! 225: ! 226: MakeLakes(void) ! 227: { ! 228: short Lim1, Lim2, t, z; ! 229: register short x, y; ! 230: ! 231: if (LakeLevel < 0) { ! 232: Lim1 = Rand(10); ! 233: } else { ! 234: Lim1 = LakeLevel / 2; ! 235: } ! 236: for (t = 0; t < Lim1; t++) { ! 237: x = Rand(WORLD_X - 21) + 10; ! 238: y = Rand(WORLD_Y - 20) + 10; ! 239: Lim2 = Rand(12) + 2; ! 240: for (z = 0; z < Lim2; z++) { ! 241: MapX = x - 6 + Rand(12); ! 242: MapY = y - 6 + Rand(12); ! 243: if (Rand(4)) ! 244: SRivPlop(); ! 245: else ! 246: BRivPlop(); ! 247: } ! 248: } ! 249: } ! 250: ! 251: ! 252: GetRandStart(void) ! 253: { ! 254: XStart = 40 + Rand(WORLD_X - 80); ! 255: YStart = 33 + Rand(WORLD_Y - 67); ! 256: MapX = XStart; ! 257: MapY = YStart; ! 258: } ! 259: ! 260: ! 261: MoveMap(short dir) ! 262: { ! 263: static short DirTab[2][8] = { { 0, 1, 1, 1, 0, -1, -1, -1}, ! 264: {-1,-1, 0, 1, 1, 1, 0, -1} }; ! 265: dir = dir & 7; ! 266: MapX += DirTab[0][dir]; ! 267: MapY += DirTab[1][dir]; ! 268: } ! 269: ! 270: ! 271: TreeSplash(short xloc, short yloc) ! 272: { ! 273: short dis, dir; ! 274: register short xoff, yoff, z; ! 275: ! 276: if (TreeLevel < 0) { ! 277: dis = Rand(150) + 50; ! 278: } else { ! 279: dis = Rand(100 + (TreeLevel * 2)) + 50; ! 280: } ! 281: MapX = xloc; ! 282: MapY = yloc; ! 283: for (z = 0; z < dis; z++) { ! 284: dir = Rand(7); ! 285: MoveMap(dir); ! 286: if (!(TestBounds(MapX, MapY))) ! 287: return; ! 288: if ((Map[MapX][MapY] & LOMASK) == DIRT) ! 289: Map[MapX][MapY] = WOODS + BLBNBIT; ! 290: } ! 291: } ! 292: ! 293: ! 294: DoTrees(void) ! 295: { ! 296: short Amount, x, xloc, yloc; ! 297: ! 298: if (TreeLevel < 0) { ! 299: Amount = Rand(100) + 50; ! 300: } else { ! 301: Amount = TreeLevel + 3; ! 302: } ! 303: for(x = 0; x < Amount; x++) { ! 304: xloc = Rand(WORLD_X - 1); ! 305: yloc = Rand(WORLD_Y - 1); ! 306: TreeSplash(xloc, yloc); ! 307: } ! 308: SmoothTrees(); ! 309: SmoothTrees(); ! 310: } ! 311: ! 312: ! 313: SmoothRiver(void) ! 314: { ! 315: static short DX[4] = {-1, 0, 1, 0}; ! 316: static short DY[4] = { 0, 1, 0,-1}; ! 317: static short REdTab[16] = { ! 318: 13+BULLBIT, 13+BULLBIT, 17+BULLBIT, 15+BULLBIT, ! 319: 5+BULLBIT, 2, 19+BULLBIT, 17+BULLBIT, ! 320: 9+BULLBIT, 11+BULLBIT, 2, 13+BULLBIT, ! 321: 7+BULLBIT, 9+BULLBIT, 5+BULLBIT, 2 }; ! 322: short bitindex, z, Xtem, Ytem; ! 323: register short temp, MapX, MapY; ! 324: ! 325: for (MapX = 0; MapX < WORLD_X; MapX++) { ! 326: for (MapY = 0; MapY < WORLD_Y; MapY++) { ! 327: if (Map[MapX][MapY] == REDGE) { ! 328: bitindex = 0; ! 329: for (z = 0; z < 4; z++) { ! 330: bitindex = bitindex << 1; ! 331: Xtem = MapX + DX[z]; ! 332: Ytem = MapY + DY[z]; ! 333: if (TestBounds(Xtem, Ytem) && ! 334: ((Map[Xtem][Ytem] & LOMASK) != DIRT) && ! 335: (((Map[Xtem][Ytem]&LOMASK) < WOODS_LOW) || ! 336: ((Map[Xtem][Ytem]&LOMASK) > WOODS_HIGH))) ! 337: bitindex++; ! 338: } ! 339: temp = REdTab[bitindex & 15]; ! 340: if ((temp != RIVER) && (Rand(1))) ! 341: temp++; ! 342: Map[MapX][MapY] = temp; ! 343: } ! 344: } ! 345: } ! 346: } ! 347: ! 348: ! 349: IsTree(int cell) ! 350: { ! 351: if (((cell & LOMASK) >= WOODS_LOW) && ! 352: ((cell & LOMASK) <= WOODS_HIGH)) ! 353: return TRUE; ! 354: return FALSE; ! 355: } ! 356: ! 357: ! 358: SmoothTrees(void) ! 359: { ! 360: static short DX[4] = {-1, 0, 1, 0}; ! 361: static short DY[4] = { 0, 1, 0,-1}; ! 362: static short TEdTab[16] = { 0, 0, 0, 34, ! 363: 0, 0, 36, 35, ! 364: 0, 32, 0, 33, ! 365: 30, 31, 29, 37 }; ! 366: short bitindex, z, Xtem, Ytem; ! 367: register short temp, MapX, MapY; ! 368: ! 369: for (MapX = 0; MapX < WORLD_X; MapX++) { ! 370: for (MapY = 0; MapY < WORLD_Y; MapY++) { ! 371: if (IsTree(Map[MapX][MapY])) { ! 372: bitindex = 0; ! 373: for (z = 0; z < 4; z++) { ! 374: bitindex = bitindex << 1; ! 375: Xtem = MapX + DX[z]; ! 376: Ytem = MapY + DY[z]; ! 377: if (TestBounds(Xtem, Ytem) && ! 378: IsTree(Map[Xtem][Ytem])) { ! 379: bitindex++; ! 380: } ! 381: } ! 382: temp = TEdTab[bitindex & 15]; ! 383: if (temp) { ! 384: if (temp != WOODS) ! 385: if ((MapX + MapY) & 1) ! 386: temp = temp - 8; ! 387: Map[MapX][MapY] = temp + BLBNBIT; ! 388: } ! 389: else Map[MapX][MapY] = temp; ! 390: } ! 391: } ! 392: } ! 393: } ! 394: ! 395: ! 396: DoRivers(void) ! 397: { ! 398: ! 399: LastDir = Rand(3); ! 400: Dir = LastDir; ! 401: DoBRiv(); ! 402: MapX = XStart; ! 403: MapY = YStart; ! 404: LastDir = LastDir ^ 4; ! 405: Dir = LastDir; ! 406: DoBRiv(); ! 407: MapX = XStart; ! 408: MapY = YStart; ! 409: LastDir = Rand(3); ! 410: DoSRiv(); ! 411: } ! 412: ! 413: ! 414: DoBRiv(void) ! 415: { ! 416: int r1, r2; ! 417: ! 418: if (CurveLevel < 0) { ! 419: r1 = 100; ! 420: r2 = 200; ! 421: } else { ! 422: r1 = CurveLevel + 10; ! 423: r2 = CurveLevel + 100; ! 424: } ! 425: ! 426: while (TestBounds (MapX + 4, MapY + 4)) { ! 427: BRivPlop(); ! 428: if (Rand(r1) < 10) { ! 429: Dir = LastDir; ! 430: } else { ! 431: if (Rand(r2) > 90) Dir++; ! 432: if (Rand(r2) > 90) Dir--; ! 433: } ! 434: MoveMap(Dir); ! 435: } ! 436: } ! 437: ! 438: ! 439: DoSRiv(void) ! 440: { ! 441: int r1, r2; ! 442: ! 443: if (CurveLevel < 0) { ! 444: r1 = 100; ! 445: r2 = 200; ! 446: } else { ! 447: r1 = CurveLevel + 10; ! 448: r2 = CurveLevel + 100; ! 449: } ! 450: ! 451: while (TestBounds (MapX + 3, MapY + 3)) { ! 452: SRivPlop(); ! 453: if (Rand(r1) < 10) { ! 454: Dir = LastDir; ! 455: } else { ! 456: if (Rand(r2) > 90) Dir++; ! 457: if (Rand(r2) > 90) Dir--; ! 458: } ! 459: MoveMap(Dir); ! 460: } ! 461: } ! 462: ! 463: ! 464: PutOnMap(short Mchar, short Xoff, short Yoff) ! 465: { ! 466: register short Xloc, Yloc, temp; ! 467: ! 468: if (Mchar == 0) ! 469: return; ! 470: Xloc = MapX + Xoff; ! 471: Yloc = MapY + Yoff; ! 472: if (TestBounds(Xloc, Yloc) == FALSE) ! 473: return; ! 474: if (temp = Map[Xloc][Yloc]) { ! 475: temp = temp & LOMASK; ! 476: if (temp == RIVER) ! 477: if (Mchar != CHANNEL) ! 478: return; ! 479: if (temp == CHANNEL) ! 480: return; ! 481: } ! 482: Map[Xloc][Yloc] = Mchar; ! 483: } ! 484: ! 485: ! 486: BRivPlop(void) ! 487: { ! 488: static short BRMatrix[9][9] = { ! 489: { 0, 0, 0, 3, 3, 3, 0, 0, 0 }, ! 490: { 0, 0, 3, 2, 2, 2, 3, 0, 0 }, ! 491: { 0, 3, 2, 2, 2, 2, 2, 3, 0 }, ! 492: { 3, 2, 2, 2, 2, 2, 2, 2, 3 }, ! 493: { 3, 2, 2, 2, 4, 2, 2, 2, 3 }, ! 494: { 3, 2, 2, 2, 2, 2, 2, 2, 3 }, ! 495: { 0, 3, 2, 2, 2, 2, 2, 3, 0 }, ! 496: { 0, 0, 3, 2, 2, 2, 3, 0, 0 }, ! 497: { 0, 0, 0, 3, 3, 3, 0, 0, 0 } }; ! 498: short x, y; ! 499: ! 500: for (x = 0; x < 9; x++) ! 501: for (y = 0; y < 9; y++) ! 502: PutOnMap(BRMatrix[y][x], x, y); ! 503: } ! 504: ! 505: ! 506: SRivPlop(void) ! 507: { ! 508: static short SRMatrix[6][6] = { ! 509: { 0, 0, 3, 3, 0, 0 }, ! 510: { 0, 3, 2, 2, 3, 0 }, ! 511: { 3, 2, 2, 2, 2, 3 }, ! 512: { 3, 2, 2, 2, 2, 3 }, ! 513: { 0, 3, 2, 2, 3, 0 }, ! 514: { 0, 0, 3, 3, 0, 0 } }; ! 515: short x, y; ! 516: ! 517: for (x = 0; x < 6; x++) ! 518: for (y = 0; y < 6; y++) ! 519: PutOnMap(SRMatrix[y][x], x, y); ! 520: } ! 521: ! 522: ! 523: SmoothWater() ! 524: { ! 525: int x, y; ! 526: ! 527: for(x = 0; x < WORLD_X; x++) { ! 528: for(y = 0; y < WORLD_Y; y++) { ! 529: /* If water: */ ! 530: if (((Map[x][y] & LOMASK) >= WATER_LOW) && ! 531: ((Map[x][y] & LOMASK) <= WATER_HIGH)) { ! 532: if (x > 0) { ! 533: /* If nearest object is not water: */ ! 534: if (((Map[x - 1][y] & LOMASK) < WATER_LOW) || ! 535: ((Map[x - 1][y] & LOMASK) > WATER_HIGH)) { ! 536: goto edge; ! 537: } ! 538: } ! 539: if (x < (WORLD_X - 1)) { ! 540: /* If nearest object is not water: */ ! 541: if (((Map[x+1][y]&LOMASK) < WATER_LOW) || ! 542: ((Map[x+1][y]&LOMASK) > WATER_HIGH)) { ! 543: goto edge; ! 544: } ! 545: } ! 546: if (y > 0) { ! 547: /* If nearest object is not water: */ ! 548: if (((Map[x][y - 1] & LOMASK) < WATER_LOW) || ! 549: ((Map[x][y-1]&LOMASK) > WATER_HIGH)) { ! 550: goto edge; ! 551: } ! 552: } ! 553: if (y < (WORLD_Y - 1)) { ! 554: /* If nearest object is not water: */ ! 555: if (((Map[x][y + 1] & LOMASK) < WATER_LOW) || ! 556: ((Map[x][y + 1] & LOMASK) > WATER_HIGH)) { ! 557: edge: ! 558: Map[x][y]=REDGE; /* set river edge */ ! 559: continue; ! 560: } ! 561: } ! 562: } ! 563: } ! 564: } ! 565: for (x = 0; x < WORLD_X; x++) { ! 566: for (y = 0; y < WORLD_Y; y++) { ! 567: /* If water which is not a channel: */ ! 568: if (((Map[x][y] & LOMASK) != CHANNEL) && ! 569: ((Map[x][y] & LOMASK) >= WATER_LOW) && ! 570: ((Map[x][y] & LOMASK) <= WATER_HIGH)) { ! 571: if (x > 0) { ! 572: /* If nearest object is not water; */ ! 573: if (((Map[x - 1][y] & LOMASK) < WATER_LOW) || ! 574: ((Map[x - 1][y] & LOMASK) > WATER_HIGH)) { ! 575: continue; ! 576: } ! 577: } ! 578: if (x < (WORLD_X - 1)) { ! 579: /* If nearest object is not water: */ ! 580: if (((Map[x + 1][y] & LOMASK) < WATER_LOW) || ! 581: ((Map[x + 1][y] & LOMASK) > WATER_HIGH)) { ! 582: continue; ! 583: } ! 584: } ! 585: if (y > 0) { ! 586: /* If nearest object is not water: */ ! 587: if (((Map[x][y - 1] & LOMASK) < WATER_LOW) || ! 588: ((Map[x][y - 1] & LOMASK) > WATER_HIGH)) { ! 589: continue; ! 590: } ! 591: } ! 592: if (y < (WORLD_Y - 1)) { ! 593: /* If nearest object is not water: */ ! 594: if (((Map[x][y + 1] & LOMASK) < WATER_LOW) || ! 595: ((Map[x][y + 1] & LOMASK) > WATER_HIGH)) { ! 596: continue; ! 597: } ! 598: } ! 599: Map[x][y] = RIVER; /* make it a river */ ! 600: } ! 601: } ! 602: } ! 603: for (x = 0; x < WORLD_X; x++) { ! 604: for (y = 0; y < WORLD_Y; y++) { ! 605: /* If woods: */ ! 606: if (((Map[x][y] & LOMASK) >= WOODS_LOW) && ! 607: ((Map[x][y] & LOMASK) <= WOODS_HIGH)) { ! 608: if (x > 0) { ! 609: /* If nearest object is water: */ ! 610: if ((Map[x - 1][y] == RIVER) || ! 611: (Map[x - 1][y] == CHANNEL)) { ! 612: Map[x][y] = REDGE; /* make it water's edge */ ! 613: continue; ! 614: } ! 615: } ! 616: if (x < (WORLD_X - 1)) { ! 617: /* If nearest object is water: */ ! 618: if ((Map[x + 1][y] == RIVER) || ! 619: (Map[x + 1][y] == CHANNEL)) { ! 620: Map[x][y] = REDGE; /* make it water's edge */ ! 621: continue; ! 622: } ! 623: } ! 624: if (y > 0) { ! 625: /* If nearest object is water: */ ! 626: if ((Map[x][y - 1] == RIVER) || ! 627: (Map[x][y - 1] == CHANNEL)) { ! 628: Map[x][y] = REDGE; /* make it water's edge */ ! 629: continue; ! 630: } ! 631: } ! 632: if (y < (WORLD_Y - 1)) { ! 633: /* If nearest object is water; */ ! 634: if ((Map[x][y + 1] == RIVER) || ! 635: (Map[x][y + 1] == CHANNEL)) { ! 636: Map[x][y] = REDGE; /* make it water's edge */ ! 637: continue; ! 638: } ! 639: } ! 640: } ! 641: } ! 642: } ! 643: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.