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

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: }

unix.superglobalmegacorp.com

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