/*
  Copyright (C) 2010-2011  Charles Pence <charles@charlespence.net>
  Copyright (C) 1996-1997  Id Software, Inc.

  This program is free software: you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation, either version 3 of the License, or
  (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/
#include "pch.h"
#include "quakedef.h"

int            wad_numlumps;
lumpinfo_t    *wad_lumps;
byte        *wad_base;

void SwapPic (qpic_t *pic);

/*
==================
W_CleanupName

Lowercases name and pads with spaces and a terminating 0 to the length of
lumpinfo_t->name.
Used so lumpname lookups can proceed rapidly by comparing 4 chars at a time
Space padding is so names can be printed nicely in tables.
Can safely be performed in place.
==================
*/
void W_CleanupName (const char *in, char *out)
{
    int        i;
    int        c;

    for (i=0 ; i<16 ; i++ )
    {
        c = in[i];
        if (!c)
            break;

        if (c >= 'A' && c <= 'Z')
            c += ('a' - 'A');
        out[i] = c;
    }

    for ( ; i< 16 ; i++ )
        out[i] = 0;
}



/*
====================
W_LoadWadFile
====================
*/
void W_LoadWadFile (const char *filename)
{
    lumpinfo_t        *lump_p;
    wadinfo_t        *header;
    int                infotableofs;

    File fp;
    if (!fp.OpenRead(filename) || !(wad_base = fp.Read()))
        Sys_Error ("W_LoadWadFile: couldn't load %s", filename);
    fp.Close();

    header = (wadinfo_t *)wad_base;

    if (header->identification[0] != 'W' ||
        header->identification[1] != 'A' ||
        header->identification[2] != 'D' ||
        header->identification[3] != '2')
        Sys_Error ("Wad file %s doesn't have WAD2 id\n",filename);

    wad_numlumps = LittleLong(header->numlumps);
    infotableofs = LittleLong(header->infotableofs);
    wad_lumps = (lumpinfo_t *)(wad_base + infotableofs);

    lump_p = wad_lumps;
    for (int i = 0 ; i<wad_numlumps ; i++,lump_p++)
    {
        lump_p->filepos = LittleLong(lump_p->filepos);
        lump_p->size = LittleLong(lump_p->size);
        W_CleanupName (lump_p->name, lump_p->name);
        if (lump_p->type == TYP_QPIC)
            SwapPic ( (qpic_t *)(wad_base + lump_p->filepos));
    }
}


void W_UnloadWadFile()
{
    delete[] wad_base;
}


/*
=============
W_GetLumpinfo
=============
*/
lumpinfo_t    *W_GetLumpinfo (const char *name)
{
    int        i;
    lumpinfo_t    *lump_p;
    char    clean[16];

    W_CleanupName (name, clean);

    for (lump_p=wad_lumps, i=0 ; i<wad_numlumps ; i++,lump_p++)
    {
        if (!strcmp(clean, lump_p->name))
            return lump_p;
    }

    Sys_Error ("W_GetLumpinfo: %s not found", name);
    return NULL;
}

void *W_GetLumpName (const char *name)
{
    lumpinfo_t    *lump;

    lump = W_GetLumpinfo (name);

    return (void *)(wad_base + lump->filepos);
}

void *W_GetLumpNum (int num)
{
    lumpinfo_t    *lump;

    if (num < 0 || num > wad_numlumps)
        Sys_Error ("W_GetLumpNum: bad number: %i", num);

    lump = wad_lumps + num;

    return (void *)(wad_base + lump->filepos);
}

/*
=============================================================================

automatic byte swapping

=============================================================================
*/

void SwapPic (qpic_t *pic)
{
    pic->width = LittleLong(pic->width);
    pic->height = LittleLong(pic->height);
}
