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

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

unix.superglobalmegacorp.com

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