|
|
1.1 ! root 1: /* g_setup.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: #define SIM_SMTILE 385 ! 66: #define SIM_BWTILE 386 ! 67: #define SIM_GSMTILE 388 ! 68: #define SIM_LGTILE 544 ! 69: ! 70: ! 71: #define gray25_width 16 ! 72: #define gray25_height 16 ! 73: static unsigned char gray25_bits[] = { ! 74: 0x77, 0x77, ! 75: 0xdd, 0xdd, ! 76: 0x77, 0x77, ! 77: 0xdd, 0xdd, ! 78: 0x77, 0x77, ! 79: 0xdd, 0xdd, ! 80: 0x77, 0x77, ! 81: 0xdd, 0xdd, ! 82: 0x77, 0x77, ! 83: 0xdd, 0xdd, ! 84: 0x77, 0x77, ! 85: 0xdd, 0xdd, ! 86: 0x77, 0x77, ! 87: 0xdd, 0xdd, ! 88: 0x77, 0x77, ! 89: 0xdd, 0xdd, ! 90: }; ! 91: ! 92: ! 93: #define gray50_width 16 ! 94: #define gray50_height 16 ! 95: static unsigned char gray50_bits[] = { ! 96: 0x55, 0x55, ! 97: 0xaa, 0xaa, ! 98: 0x55, 0x55, ! 99: 0xaa, 0xaa, ! 100: 0x55, 0x55, ! 101: 0xaa, 0xaa, ! 102: 0x55, 0x55, ! 103: 0xaa, 0xaa, ! 104: 0x55, 0x55, ! 105: 0xaa, 0xaa, ! 106: 0x55, 0x55, ! 107: 0xaa, 0xaa, ! 108: 0x55, 0x55, ! 109: 0xaa, 0xaa, ! 110: 0x55, 0x55, ! 111: 0xaa, 0xaa, ! 112: }; ! 113: ! 114: ! 115: #define gray75_width 16 ! 116: #define gray75_height 16 ! 117: static unsigned char gray75_bits[] = { ! 118: 0x88, 0x88, ! 119: 0x22, 0x22, ! 120: 0x88, 0x88, ! 121: 0x22, 0x22, ! 122: 0x88, 0x88, ! 123: 0x22, 0x22, ! 124: 0x88, 0x88, ! 125: 0x22, 0x22, ! 126: 0x88, 0x88, ! 127: 0x22, 0x22, ! 128: 0x88, 0x88, ! 129: 0x22, 0x22, ! 130: 0x88, 0x88, ! 131: 0x22, 0x22, ! 132: 0x88, 0x88, ! 133: 0x22, 0x22, ! 134: }; ! 135: ! 136: #define vert_width 16 ! 137: #define vert_height 16 ! 138: static unsigned char vert_bits[] = { ! 139: 0xaa, 0xaa, ! 140: 0xaa, 0xaa, ! 141: 0xaa, 0xaa, ! 142: 0xaa, 0xaa, ! 143: 0xaa, 0xaa, ! 144: 0xaa, 0xaa, ! 145: 0xaa, 0xaa, ! 146: 0xaa, 0xaa, ! 147: 0xaa, 0xaa, ! 148: 0xaa, 0xaa, ! 149: 0xaa, 0xaa, ! 150: 0xaa, 0xaa, ! 151: 0xaa, 0xaa, ! 152: 0xaa, 0xaa, ! 153: 0xaa, 0xaa, ! 154: 0xaa, 0xaa, ! 155: }; ! 156: ! 157: ! 158: #define horiz_width 16 ! 159: #define horiz_height 16 ! 160: static unsigned char horiz_bits[] = { ! 161: 0xff, 0xff, ! 162: 0x00, 0x00, ! 163: 0xff, 0xff, ! 164: 0x00, 0x00, ! 165: 0xff, 0xff, ! 166: 0x00, 0x00, ! 167: 0xff, 0xff, ! 168: 0x00, 0x00, ! 169: 0xff, 0xff, ! 170: 0x00, 0x00, ! 171: 0xff, 0xff, ! 172: 0x00, 0x00, ! 173: 0xff, 0xff, ! 174: 0x00, 0x00, ! 175: 0xff, 0xff, ! 176: 0x00, 0x00, ! 177: }; ! 178: ! 179: ! 180: #define diag_width 16 ! 181: #define diag_height 16 ! 182: static unsigned char diag_bits[] = { ! 183: 0x55, 0x55, ! 184: 0xee, 0xee, ! 185: 0x55, 0x55, ! 186: 0xba, 0xbb, ! 187: 0x55, 0x55, ! 188: 0xee, 0xee, ! 189: 0x55, 0x55, ! 190: 0xba, 0xbb, ! 191: 0x55, 0x55, ! 192: 0xee, 0xee, ! 193: 0x55, 0x55, ! 194: 0xba, 0xbb, ! 195: 0x55, 0x55, ! 196: 0xee, 0xee, ! 197: 0x55, 0x55, ! 198: 0xba, 0xbb, ! 199: }; ! 200: ! 201: ! 202: Ptr MickGetHexa(short theID) ! 203: { ! 204: Handle theData; ! 205: ! 206: theData = GetResource("hexa", theID); ! 207: return ((Ptr)*theData); ! 208: } ! 209: ! 210: ! 211: Pixmap * ! 212: GetObjectXpms(XDisplay *xd, int id, int frames) ! 213: { ! 214: int i; ! 215: Pixmap *pixmaps = (Pixmap *)ckalloc(2 * frames * sizeof (Pixmap)); ! 216: XpmAttributes attributes; ! 217: char name[256]; ! 218: ! 219: attributes.visual = Tk_DefaultVisual(xd->screen); ! 220: attributes.colormap = Tk_DefaultColormap(xd->screen); ! 221: attributes.depth = Tk_DefaultDepth(xd->screen); ! 222: attributes.valuemask = XpmVisual | XpmColormap | XpmDepth; ! 223: ! 224: for (i = 0; i < frames; i++) { ! 225: sprintf(name, "%s/images/obj%d-%d.xpm", HomeDir, id, i); ! 226: if (XpmReadFileToPixmap(xd->dpy, ! 227: RootWindowOfScreen(xd->screen), ! 228: name, ! 229: &pixmaps[i + i], &pixmaps[i + i + 1], ! 230: &attributes) < 0) { ! 231: fprintf(stderr, ! 232: "Uh oh, Micropolis couldn't read the pixmap file \"%s\".\n", ! 233: name); ! 234: sim_exit(1); // Just sets tkMustExit and ExitReturn ! 235: return NULL; ! 236: } ! 237: } ! 238: return (pixmaps); ! 239: } ! 240: ! 241: ! 242: GetPixmaps(XDisplay *xd) ! 243: { ! 244: if (xd->gray25_stipple == None) { ! 245: xd->gray25_stipple = ! 246: XCreatePixmapFromBitmapData(xd->dpy, xd->root, ! 247: gray25_bits, gray25_width, gray25_height, ! 248: 1, 0, 1); ! 249: xd->gray50_stipple = ! 250: XCreatePixmapFromBitmapData(xd->dpy, xd->root, ! 251: gray50_bits, gray50_width, gray50_height, ! 252: 1, 0, 1); ! 253: xd->gray75_stipple = ! 254: XCreatePixmapFromBitmapData(xd->dpy, xd->root, ! 255: gray75_bits, gray75_width, gray75_height, ! 256: 1, 0, 1); ! 257: xd->vert_stipple = ! 258: XCreatePixmapFromBitmapData(xd->dpy, xd->root, ! 259: vert_bits, vert_width, vert_height, ! 260: 1, 0, 1); ! 261: xd->horiz_stipple = ! 262: XCreatePixmapFromBitmapData(xd->dpy, xd->root, ! 263: horiz_bits, horiz_width, horiz_height, ! 264: 1, 0, 1); ! 265: xd->diag_stipple = ! 266: XCreatePixmapFromBitmapData(xd->dpy, xd->root, ! 267: diag_bits, diag_width, diag_height, ! 268: 1, 0, 1); ! 269: } ! 270: ! 271: if (xd->objects == NULL) { ! 272: Pixmap **pm; ! 273: ! 274: xd->objects = pm = (Pixmap **)ckalloc(OBJN * sizeof (Pixmap *)); ! 275: ! 276: pm[0] = NULL; /* no object number 0 */ ! 277: pm[TRA] = GetObjectXpms(xd, TRA, 5); ! 278: pm[COP] = GetObjectXpms(xd, COP, 8); ! 279: pm[AIR] = GetObjectXpms(xd, AIR, 11); ! 280: pm[SHI] = GetObjectXpms(xd, SHI, 8); ! 281: pm[GOD] = GetObjectXpms(xd, GOD, 16); ! 282: pm[TOR] = GetObjectXpms(xd, TOR, 3); ! 283: pm[EXP] = GetObjectXpms(xd, EXP, 6); ! 284: pm[BUS] = GetObjectXpms(xd, BUS, 4); ! 285: } ! 286: } ! 287: ! 288: ! 289: GetViewTiles(SimView *view) ! 290: { ! 291: char name[256]; ! 292: XpmAttributes attributes; ! 293: ! 294: attributes.visual = Tk_DefaultVisual(view->x->screen); ! 295: attributes.colormap = Tk_DefaultColormap(view->x->screen); ! 296: attributes.depth = Tk_DefaultDepth(view->x->screen); ! 297: attributes.valuemask = XpmVisual | XpmColormap | XpmDepth; ! 298: ! 299: if (view->class == Editor_Class) { ! 300: ! 301: sprintf(name, "%s/images/%s", HomeDir, ! 302: view->x->color ? "tiles.xpm" : "tilesbw.xpm"); ! 303: ! 304: switch (view->type) { ! 305: ! 306: case X_Mem_View: ! 307: if (view->x->big_tile_image == NULL) { ! 308: if (XpmReadFileToImage(view->x->dpy, name, ! 309: &view->x->big_tile_image, NULL, ! 310: &attributes) < 0) { ! 311: fprintf(stderr, ! 312: "Uh oh, Micropolis couldn't read the pixmap file \"%s\".\n", ! 313: name); ! 314: sim_exit(1); // Just sets tkMustExit and ExitReturn ! 315: return; ! 316: } ! 317: } ! 318: view->bigtiles = (unsigned char *)view->x->big_tile_image->data; ! 319: break; ! 320: ! 321: case X_Wire_View: ! 322: if (view->x->big_tile_pixmap == None) { ! 323: if (XpmReadFileToPixmap(view->x->dpy, ! 324: RootWindowOfScreen(view->x->screen), ! 325: name, ! 326: &view->x->big_tile_pixmap, NULL, ! 327: &attributes) < 0) { ! 328: fprintf(stderr, ! 329: "Uh oh, Micropolis couldn't read the pixmap file \"%s\".\n", ! 330: name); ! 331: sim_exit(1); // Just sets tkMustExit and ExitReturn ! 332: return; ! 333: } ! 334: } ! 335: break; ! 336: ! 337: } ! 338: ! 339: } else if (view->class == Map_Class) { ! 340: ! 341: if (view->x->small_tile_image == NULL) { ! 342: if (view->x->color) { ! 343: ! 344: sprintf(name, "%s/images/%s", HomeDir, "tilessm.xpm"); ! 345: if (XpmReadFileToImage(view->x->dpy, name, ! 346: &view->x->small_tile_image, NULL, ! 347: &attributes) < 0) { ! 348: fprintf(stderr, ! 349: "Uh oh, Micropolis couldn't read the pixmap file \"%s\".\n", ! 350: name); ! 351: sim_exit(1); // Just sets tkMustExit and ExitReturn ! 352: return; ! 353: } ! 354: ! 355: } else { ! 356: ! 357: view->x->small_tile_image = ! 358: XCreateImage(view->x->dpy, view->x->visual, 8, ! 359: ZPixmap, ! 360: 0, (char *)MickGetHexa(SIM_GSMTILE), ! 361: 4, 3 * TILE_COUNT, 8, 4); ! 362: ! 363: } ! 364: } ! 365: ! 366: { int x, y, b, tile; ! 367: unsigned char *from, *to; ! 368: int pixelBytes = view->pixel_bytes; ! 369: int rowBytes = view->x->small_tile_image->bytes_per_line; ! 370: ! 371: if (pixelBytes == 0) { ! 372: /* handle the case of monochrome display (8 bit map) */ ! 373: pixelBytes = 1; ! 374: } ! 375: ! 376: /* from is 4 pixels wide per 3 pixel wide tile */ ! 377: from = (unsigned char *)view->x->small_tile_image->data; ! 378: to = (unsigned char *)ckalloc(4 * 4 * TILE_COUNT * pixelBytes); ! 379: view->smalltiles = to; ! 380: ! 381: switch (pixelBytes) { ! 382: ! 383: case 1: ! 384: for (tile = 0; tile < TILE_COUNT; tile++) { ! 385: for (y = 0; y < 3; y++) { ! 386: for (x = 0; x < 4; x++) { ! 387: *to++ = *from++; ! 388: } ! 389: } ! 390: for (x = 0; x < 4; x++) { ! 391: *to++ = 0; ! 392: } ! 393: } ! 394: break; ! 395: ! 396: case 2: ! 397: for (tile = 0; tile < TILE_COUNT; tile++) { ! 398: for (y = 0; y < 3; y++) { ! 399: for (x = 0; x < 4; x++) { ! 400: *to++ = *from++; ! 401: *to++ = *from++; ! 402: } ! 403: } ! 404: for (x = 0; x < 4; x++) { ! 405: *to++ = 0; ! 406: *to++ = 0; ! 407: } ! 408: } ! 409: break; ! 410: ! 411: case 3: ! 412: case 4: ! 413: for (tile = 0; tile < TILE_COUNT; tile++) { ! 414: for (y = 0; y < 3; y++) { ! 415: for (x = 0; x < 4; x++) { ! 416: *to++ = *from++; ! 417: *to++ = *from++; ! 418: *to++ = *from++; ! 419: if (pixelBytes == 4) { ! 420: *to++ = *from++; ! 421: } ! 422: } ! 423: } ! 424: for (x = 0; x < 4; x++) { ! 425: *to++ = 0; ! 426: *to++ = 0; ! 427: *to++ = 0; ! 428: if (pixelBytes == 4) { ! 429: *to++ = 0; ! 430: } ! 431: } ! 432: } ! 433: break; ! 434: ! 435: default: ! 436: assert(0); /* Undefined depth */ ! 437: break; ! 438: ! 439: } ! 440: ! 441: } ! 442: } ! 443: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.