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