Example #1
0
void loadmap(void)
{
    FILE *handle;
    int c;

    if (!strlen(mapname)) return;
    handle = fopen(mapname, "rb");
    if (!handle) return;
    /* Load map header */
    fread(&map, sizeof(MAPHEADER), 1, handle);
    /* Load each layer */
    for (c = 0; c < MAX_LAYERS; c++)
    {
        layer[c].xsize = freadle32(handle);
        layer[c].ysize = freadle32(handle);
        layer[c].xdivisor = fread8(handle);
        layer[c].ydivisor = fread8(handle);
        layer[c].xwrap = fread8(handle);
        layer[c].ywrap = fread8(handle);
        if ((layer[c].xsize) && (layer[c].ysize))
        {
            int d;
            for (d = 0; d < layer[c].xsize * layer[c].ysize; d++)
            {
                layerdataptr[c][d] = freadle16(handle);
            }
        }
    }
    fclose(handle);
    /* Load correct blocks & palette */
    gfx_loadblocks((char *)map.blocksname);
    minxsize = (gfx_virtualxsize + (gfx_blockxsize-1)) / gfx_blockxsize;
    minysize = (gfx_virtualysize + (gfx_blockysize-1)) / gfx_blockysize;
    gfx_loadpalette((char *)map.palettename);
    gfx_calcpalette(64, 0, 0, 0);
    gfx_setpalette();
}
Example #2
0
int main(int argc, char** argv)
{
    int c,d;
    int actuallevels = 0;
    int offset = 0;
    int screens = 0;
    int blocks = 0;

    for (c = 0; c < MAX_LEVELS; c++)
    {
        int length;
        int numact;
        int numobj;
        int actualnumobj;
        int numpersistentobj;
        char namebuf[256];

        sprintf(namebuf, "bg/level%02d.lva", c);
        FILE* in = fopen(namebuf, "rb");
        if (!in)
            break;
        fseek(in, 0, SEEK_END);
        length = ftell(in);
        fseek(in, 0, SEEK_SET);
        numact = length / 5;
        memset(lvlactt, 0, sizeof lvlactt);
        fread(&lvlactx[0], numact, 1, in);
        fread(&lvlacty[0], numact, 1, in);
        fread(&lvlactf[0], numact, 1, in);
        fread(&lvlactt[0], numact, 1, in);
        fread(&lvlactw[0], numact, 1, in);
        fclose(in);
        for (d = MAX_LVLACT-1; d >= 0; d--)
        {
            if (lvlactt[d])
                break;
        }
        printf("Level %d has %d actors\n", c, d+1);
        if (d < 0) d = 0; // Always have some data per level
        numlvlact[c] = d+1;
        numbytes[c] = (numlvlact[c] + 7) / 8;
        bitareasize += numbytes[c];

        sprintf(namebuf, "bg/level%02d.lvo", c);
        in = fopen(namebuf, "rb");
        if (!in)
            break;
        fseek(in, 0, SEEK_END);
        length = ftell(in);
        fseek(in, 0, SEEK_SET);
        numobj = length / 4;
        memset(lvlobjx, 0, sizeof lvlobjx);
        memset(lvlobjy, 0, sizeof lvlobjy);
        fread(&lvlobjx[0], numobj, 1, in);
        fread(&lvlobjy[0], numobj, 1, in);
        fread(&lvlobjb[0], numobj, 1, in);
        fread(&lvlobjd[0], numobj, 1, in);
        fclose(in);
        numpersistentobj = 0;
        actualnumobj = 0;
        for (d = 0; d < MAX_LVLOBJ; d++)
        {
            if ((lvlobjx[d] || lvlobjy[d]) && (lvlobjx[d] != 0xff))
            {
                actualnumobj++;
                // If object is animated without auto-deactivation,
                // it needs to be persisted. Note: game must obey exact same criteria
                // for decoding the object indices
                if ((lvlobjb[d] & 0x20) == 0x00 && (lvlobjy[d] & 0x80))
                    numpersistentobj++;
            }
        }
        printf("Level %d has %d objects, %d persistent\n", c, actualnumobj, numpersistentobj);
        // Always have some data per level
        if (!numpersistentobj) numpersistentobj++;
        numlvlobj[c] = numpersistentobj;
        numlvlobjbytes[c] = (numlvlobj[c] + 7) / 8;
        lvlobjbitareasize += numlvlobjbytes[c];

        sprintf(namebuf, "bg/level%02d.map", c);
        in = fopen(namebuf, "rb");
        if (!in)
            break;
        {
            int datasize = freadle16(in);
            int activezones = fread8(in);
            int zoneoffsets[MAX_ZONES];
            int y,x;
    
            for (d = 0; d < activezones; d++)
            {
                zoneoffsets[d] = freadle16(in) + 3;
            }
    
            for (d = 0; d < activezones; d++)
            {
              int zonel, zoner, zoneu, zoned, x, y;
              fseek(in, zoneoffsets[d], SEEK_SET);

              zonel = fread8(in);
              zoner = fread8(in);
              zoneu = fread8(in);
              zoned = fread8(in);
              
              blocks += (zoner-zonel)*(zoned-zoneu);
            }
            close(in);
        }

        actuallevels++;
    }
    
    screens = blocks*16 / (22*40);
    printf("Total actor bitarea size is %d\n", bitareasize);
    printf("Total levelobject bitarea size is %d\n", lvlobjbitareasize);
    printf("Total gameworld size %d blocks %d screens\n", blocks, screens);

    FILE* out = fopen("levelactors.s", "wt");
    fprintf(out, "LVLDATAACTTOTALSIZE = %d\n\n", bitareasize);
    fprintf(out, "LVLOBJTOTALSIZE = %d\n\n", lvlobjbitareasize);
    fprintf(out, "lvlDataActBitsStart:\n");
    for (c = 0; c < actuallevels; c++)
    {
        fprintf(out, "                dc.b %d\n", offset);
        offset += numbytes[c];
    }
    fprintf(out, "lvlDataActBitsLen:\n");
    for  (c = 0; c < actuallevels; c++)
    {
        fprintf(out, "                dc.b %d\n", numbytes[c]);
    }
    offset = 0;
    fprintf(out, "lvlObjBitsStart:\n");
    for (c = 0; c < actuallevels; c++)
    {
        fprintf(out, "                dc.b %d\n", offset);
        offset += numlvlobjbytes[c];
    }
    fprintf(out, "lvlObjBitsLen:\n");
    for  (c = 0; c < actuallevels; c++)
    {
        fprintf(out, "                dc.b %d\n", numlvlobjbytes[c]);
    }
    fclose(out);
}