Annotation of micropolis/src/sim/s_traf.c, revision 1.1

1.1     ! root        1: /* s_traf.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: /* Traffic Generation */
        !            66: 
        !            67: 
        !            68: #define MAXDIS 30
        !            69: 
        !            70: short PosStackN, SMapXStack[MAXDIS+1], SMapYStack[MAXDIS+1];
        !            71: short LDir;
        !            72: short Zsource;
        !            73: short TrafMaxX, TrafMaxY;
        !            74: 
        !            75: 
        !            76: /* comefrom: DoIndustrial DoCommercial DoResidential */
        !            77: MakeTraf(int Zt)
        !            78: {
        !            79:   short xtem, ytem;
        !            80: 
        !            81:   xtem = SMapX;
        !            82:   ytem = SMapY;
        !            83:   Zsource = Zt;
        !            84:   PosStackN = 0;
        !            85: 
        !            86: #if 0
        !            87:   if ((!Rand(2)) && FindPTele()) {
        !            88: /* printf("Telecommute!\n"); */
        !            89:     return (TRUE);
        !            90:   }
        !            91: #endif
        !            92: 
        !            93:   if (FindPRoad()) {           /* look for road on zone perimeter */
        !            94:     if (TryDrive()) {          /* attempt to drive somewhere */
        !            95:       SetTrafMem();            /* if sucessful, inc trafdensity */
        !            96:       SMapX = xtem;
        !            97:       SMapY = ytem;
        !            98:       return (TRUE);           /* traffic passed */
        !            99:     }
        !           100:     SMapX = xtem;
        !           101:     SMapY = ytem;
        !           102:     return (FALSE);            /* traffic failed */
        !           103:   }
        !           104:   else return (-1);            /* no road found */
        !           105: }
        !           106: 
        !           107: 
        !           108: /* comefrom: MakeTraf */
        !           109: SetTrafMem(void)
        !           110: {
        !           111:   register short x, z;
        !           112: 
        !           113:   for (x = PosStackN; x > 0; x--) {
        !           114:     PullPos();
        !           115:     if (TestBounds(SMapX, SMapY)) {
        !           116:       z = Map[SMapX][SMapY] & LOMASK;
        !           117:       if ((z >= ROADBASE) && (z < POWERBASE)) {
        !           118:        SimSprite *sprite;
        !           119: 
        !           120:        /* check for rail */
        !           121:        z = TrfDensity[SMapX >>1][SMapY >>1];
        !           122:        z += 50;
        !           123:        if ((z > 240) &&
        !           124:            (!Rand(5))) {
        !           125:          z = 240;
        !           126:          TrafMaxX = SMapX <<4;
        !           127:          TrafMaxY = SMapY <<4;
        !           128:          if (((sprite = GetSprite(COP)) != NULL) &&
        !           129:              (sprite->control == -1)) {
        !           130:            sprite->dest_x = TrafMaxX;
        !           131:            sprite->dest_y = TrafMaxY;
        !           132:          }
        !           133:        }
        !           134:        TrfDensity[SMapX >>1][SMapY >>1] = z;
        !           135:       }
        !           136:     }
        !           137:   }
        !           138: }
        !           139: 
        !           140: 
        !           141: /* comefrom: TryGo */
        !           142: PushPos(void)
        !           143: {
        !           144:   PosStackN++;
        !           145:   SMapXStack[PosStackN] = SMapX;
        !           146:   SMapYStack[PosStackN] = SMapY;
        !           147: }
        !           148: 
        !           149: 
        !           150: /* comefrom: SetTrafMem */
        !           151: PullPos(void)
        !           152: {
        !           153:   SMapX = SMapXStack[PosStackN];
        !           154:   SMapY = SMapYStack[PosStackN];
        !           155:   PosStackN--;
        !           156: }
        !           157: 
        !           158: 
        !           159: /* comefrom: DoSPZone MakeTraf */
        !           160: FindPRoad(void)                /* look for road on edges of zone   */
        !           161: {
        !           162:   static short PerimX[12] = {-1, 0, 1, 2, 2, 2, 1, 0,-1,-2,-2,-2};
        !           163:   static short PerimY[12] = {-2,-2,-2,-1, 0, 1, 2, 2, 2, 1, 0,-1};
        !           164:   register short tx, ty, z;
        !           165: 
        !           166:   for (z = 0; z < 12; z++) {
        !           167:          tx = SMapX + PerimX[z];
        !           168:          ty = SMapY + PerimY[z];
        !           169:          if (TestBounds(tx, ty)) {
        !           170:                  if (RoadTest(Map[tx][ty])) {
        !           171:                          SMapX = tx;
        !           172:                          SMapY = ty;
        !           173:                          return (TRUE);
        !           174:                  }
        !           175:          }
        !           176:   }
        !           177:   return (FALSE);
        !           178: }
        !           179: 
        !           180: 
        !           181: FindPTele(void)                /* look for telecommunication on edges of zone */
        !           182: {
        !           183:   static short PerimX[12] = {-1, 0, 1, 2, 2, 2, 1, 0,-1,-2,-2,-2};
        !           184:   static short PerimY[12] = {-2,-2,-2,-1, 0, 1, 2, 2, 2, 1, 0,-1};
        !           185:   register short tx, ty, z, tile;
        !           186: 
        !           187:   for (z = 0; z < 12; z++) {
        !           188:          tx = SMapX + PerimX[z];
        !           189:          ty = SMapY + PerimY[z];
        !           190:          if (TestBounds(tx, ty)) {
        !           191:                  tile = Map[tx][ty] & LOMASK;
        !           192:                  if ((tile >= TELEBASE) && (tile <= TELELAST)) {
        !           193:                          return (TRUE);
        !           194:                  }
        !           195:          }
        !           196:   }
        !           197:   return (FALSE);
        !           198: }
        !           199: 
        !           200: 
        !           201: /* comefrom: MakeTraf */
        !           202: TryDrive(void)
        !           203: {
        !           204:   short z;
        !           205: 
        !           206:   LDir = 5;
        !           207:   for (z = 0; z < MAXDIS; z++) {       /* Maximum distance to try */
        !           208:     if (TryGo(z)) {                    /* if it got a road */
        !           209:       if (DriveDone())                 /* if destination is reached */
        !           210:        return (TRUE);                  /* pass */
        !           211:     } else {
        !           212:       if (PosStackN) {                 /* deadend , backup */
        !           213:        PosStackN--;
        !           214:        z += 3;
        !           215:       }
        !           216:       else return (FALSE);             /* give up at start  */ 
        !           217:     }
        !           218:   }
        !           219:   return (FALSE);                      /* gone maxdis */
        !           220: }
        !           221: 
        !           222: 
        !           223: /* comefrom: TryDrive */
        !           224: TryGo(int z)
        !           225: {
        !           226:   short x, rdir, realdir;
        !           227: 
        !           228: #if 0
        !           229:   rdir = Rand(3); /* XXX: Heaviest user of Rand */
        !           230: #else
        !           231:   rdir = Rand16() & 3;
        !           232: #endif
        !           233:   for (x = rdir; x < (rdir + 4); x++) {        /* for the 4 directions */
        !           234:     realdir = x & 3;
        !           235:     if (realdir == LDir) continue;     /* skip last direction */
        !           236:     if (RoadTest(GetFromMap(realdir))) {
        !           237:       MoveMapSim(realdir);
        !           238:       LDir = (realdir + 2) & 3;
        !           239:       if (z & 1)                       /* save pos every other move */
        !           240:        PushPos();
        !           241:       return (TRUE);
        !           242:     }
        !           243:   }
        !           244:   return (FALSE);
        !           245: }
        !           246: 
        !           247: 
        !           248: /* comefrom: TryGo DriveDone */
        !           249: GetFromMap(int x)
        !           250: {
        !           251:   switch (x) {
        !           252:   case 0:
        !           253:     if (SMapY > 0)
        !           254:       return (Map[SMapX][SMapY - 1] & LOMASK);
        !           255:     return (FALSE);
        !           256:   case 1:
        !           257:     if (SMapX < (WORLD_X - 1))
        !           258:       return (Map[SMapX + 1][SMapY] & LOMASK);
        !           259:     return (FALSE);
        !           260:   case 2:
        !           261:     if (SMapY < (WORLD_Y - 1))
        !           262:       return (Map[SMapX][SMapY + 1] & LOMASK);
        !           263:     return (FALSE);
        !           264:   case 3:
        !           265:     if (SMapX > 0)
        !           266:       return (Map[SMapX - 1][SMapY] & LOMASK);
        !           267:     return (FALSE);
        !           268:   default: 
        !           269:     return (FALSE);
        !           270:   }
        !           271: }
        !           272: 
        !           273: 
        !           274: /* comefrom: TryDrive */
        !           275: DriveDone(void)
        !           276: {
        !           277:   static short TARGL[3] = {COMBASE, LHTHR, LHTHR};
        !           278:   static short TARGH[3] = {NUCLEAR, PORT, COMBASE};    /* for destinations */
        !           279:   register short x, z, l, h;
        !           280: 
        !           281: /* unwound -Don */
        !           282: #if 0
        !           283:   for (x = 0; x < 4; x++) {    /* R>C C>I I>R  */
        !           284:     z = GetFromMap(x);
        !           285:     if ((z >= TARGL[Zsource]) && (z <= TARGH[Zsource]))
        !           286:       return (TRUE);
        !           287:   }
        !           288: #else
        !           289:   l = TARGL[Zsource];
        !           290:   h = TARGH[Zsource];
        !           291: 
        !           292:   if (SMapY > 0) {
        !           293:     z = Map[SMapX][SMapY - 1] & LOMASK;
        !           294:     if ((z >= l) && (z <= h))
        !           295:       return (TRUE);
        !           296:   }
        !           297:   if (SMapX < (WORLD_X - 1)) {
        !           298:     z = Map[SMapX + 1][SMapY] & LOMASK;
        !           299:     if ((z >= l) && (z <= h))
        !           300:       return (TRUE);
        !           301:   }
        !           302:   if (SMapY < (WORLD_Y - 1)) {
        !           303:     z = Map[SMapX][SMapY + 1] & LOMASK;
        !           304:     if ((z >= l) && (z <= h))
        !           305:       return (TRUE);
        !           306:   }
        !           307:   if (SMapX > 0) {
        !           308:     z = Map[SMapX - 1][SMapY] & LOMASK;
        !           309:     if ((z >= l) && (z <= h))
        !           310:       return (TRUE);
        !           311:   }
        !           312: #endif
        !           313: 
        !           314:   return (FALSE);
        !           315: }
        !           316: 
        !           317: 
        !           318: /* comefrom: TryGo FindPRoad */
        !           319: RoadTest(int x)
        !           320: {
        !           321:   x = x & LOMASK;
        !           322:   if (x < ROADBASE)
        !           323:     return (FALSE);
        !           324:   if (x > LASTRAIL)
        !           325:     return (FALSE);
        !           326:   if ((x >= POWERBASE) && (x < RAILHPOWERV))
        !           327:     return (FALSE);
        !           328:   return (TRUE);
        !           329: }
        !           330: 

unix.superglobalmegacorp.com

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