Annotation of micropolis/src/sim/g_setup.c, revision 1.1.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.