blankart/src/info.c

236 lines
5.6 KiB
C

// BLANKART
//-----------------------------------------------------------------------------
// Copyright (C) 1993-1996 by id Software, Inc.
// Copyright (C) 1998-2000 by DooM Legacy Team.
// Copyright (C) 1999-2020 by Sonic Team Junior.
//
// This program is free software distributed under the
// terms of the GNU General Public License, version 2.
// See the 'LICENSE' file for more details.
//-----------------------------------------------------------------------------
/// \file info.c
/// \brief Thing frame/state LUT
// Data.
#include "info.h"
#include "doomdef.h"
#include "z_zone.h"
#include "w_wad.h"
#include "dehacked.h"
#include "d_main.h"
#include "m_menu.h"
#include "deh_tables.h"
// Hey, moron! If you wanna change this table, you can just change the sprite enum in info/sprites.h,
// so you don't have to copy and paste the list of sprite names back in here :^)
char sprnames[NUMSPRITES + 1][5] =
{
#define _(name, ...) #name,
#include "info/sprites.h"
#undef _
};
char spr2names[NUMPLAYERSPRITES][5] =
{
#define _(name, ...) #name,
#include "info/sprite2.h"
#undef _
};
playersprite_t free_spr2 = SPR2_FIRSTFREESLOT;
playersprite_t spr2defaults[NUMPLAYERSPRITES] = {
0, // SPR2_STIN
SPR2_STIN, // SPR2_STIL
SPR2_STIN, // SPR2_STIR
SPR2_STIN, // SPR2_STGL
SPR2_STIN, // SPR2_STGR
SPR2_STGL, // SPR2_STLL
SPR2_STGR, // SPR2_STLR
0, // SPR2_SLWN
SPR2_SLWN, // SPR2_SLWL
SPR2_SLWN, // SPR2_SLWR
SPR2_SLWN, // SPR2_SLGL
SPR2_SLWN, // SPR2_SLGR
SPR2_SLGL, // SPR2_SLLL
SPR2_SLGR, // SPR2_SLLR
0, // SPR2_FSTN
SPR2_FSTN, // SPR2_FSTL
SPR2_FSTN, // SPR2_FSTR
SPR2_FSTN, // SPR2_FSGL
SPR2_FSTN, // SPR2_FSGR
SPR2_FSGL, // SPR2_FSLL
SPR2_FSGR, // SPR2_FSLR
0, // SPR2_DRLN
SPR2_DRLN, // SPR2_DRLO
SPR2_DRLN, // SPR2_DRLI
0, // SPR2_DRRN
SPR2_DRRN, // SPR2_DRRO
SPR2_DRRN, // SPR2_DRRI
0, // SPR2_SPIN
0, // SPR2_DEAD
0, // SPR2_SIGN
0, // SPR2_XTRA
0, // SPR2_KART
};
// Doesn't work with g++, needs actionf_p1 (don't modify this comment)
state_t states[NUMSTATES] = {0};
UINT16 numstates;
mobjinfo_t mobjinfo[NUMMOBJTYPES] = {0};
UINT16 nummobjtypes;
skincolor_t skincolors[MAXSKINCOLORS] = {0};
#if NUMSPRITEFREESLOTS > 9999 //tempname numbering actually starts at SPR_FIRSTFREESLOT, so the limit is actually 9999 + SPR_FIRSTFREESLOT-1, but the preprocessor doesn't understand enums, so its left at 9999 for safety
#error "Update P_PatchInfoTables, you big dumb head"
#endif
static const char *hardcodemobjs =
#define _(name, ...) #name "\0"
#include "info/mobjs.h"
#undef _
;
static const char *hardcodestates =
#define _(name, ...) #name "\0"
#include "info/states.h"
#undef _
;
static const char *hardcodeskincolors =
#define _(name, ...) #name "\0"
#include "info/skincolors.h"
#undef _
;
static const char *hardcodemenus =
#define _(name, ...) #name "\0"
#include "info/menus.h"
#undef _
;
void P_ResetData(INT32 flags)
{
INT32 i;
UINT16 lumpnum;
boolean init = numwadfiles == 0;
const char *name;
// sprnames
if (flags & 1)
{
memset(used_spr,0,sizeof(UINT8) * ((NUMSPRITEFREESLOTS / 8) + 1));
// vanilla sprnames are immutable
for (i = SPR_FIRSTFREESLOT; i <= SPR_LASTFREESLOT; i++)
{
char *tempname = sprnames[i];
tempname[0] = (char)('0' + (char)((i-SPR_FIRSTFREESLOT+1)/1000));
tempname[1] = (char)('0' + (char)(((i-SPR_FIRSTFREESLOT+1)/100)%10));
tempname[2] = (char)('0' + (char)(((i-SPR_FIRSTFREESLOT+1)/10)%10));
tempname[3] = (char)('0' + (char)((i-SPR_FIRSTFREESLOT+1)%10));
tempname[4] = '\0';
}
sprnames[i][0] = '\0'; // i == NUMSPRITES
}
// states
if (flags & 2)
{
if (!init)
memset(states, 0, sizeof(states));
numstates = S_FIRSTFREESLOT;
if (statenames)
Z_Free(statenames);
statenames = strbuf_alloc();
name = hardcodestates;
for (i = 0; i < S_FIRSTFREESLOT; i++, name += strlen(name)+1)
DEH_Link(name, &states[i].info, &statenames);
if (!init)
{
lumpnum = W_CheckNumForLongNamePwadNoUpper("states", MAINWAD_MAIN, 0);
DEH_LoadDehackedLumpPwad(MAINWAD_MAIN, lumpnum, true);
}
}
// mobjinfo
if (flags & 4)
{
if (!init)
memset(mobjinfo, 0, sizeof(mobjinfo));
nummobjtypes = MT_FIRSTFREESLOT;
if (mobjnames)
Z_Free(mobjnames);
mobjnames = strbuf_alloc();
name = hardcodemobjs;
for (i = 0; i < MT_FIRSTFREESLOT; i++, name += strlen(name)+1)
DEH_Link(name, &mobjinfo[i].info, &mobjnames);
for (i = MT_FIRSTFREESLOT; i <= MT_LASTFREESLOT; i++)
mobjinfo[i].doomednum = -1;
if (!init)
{
lumpnum = W_CheckNumForLongNamePwadNoUpper("mobjs", MAINWAD_MAIN, 0);
DEH_LoadDehackedLumpPwad(MAINWAD_MAIN, lumpnum, true);
}
}
// skincolors
if (flags & 8)
{
if (!init)
memset(skincolors, 0, sizeof(skincolors));
numskincolors = SKINCOLOR_FIRSTFREESLOT;
if (skincolornames)
Z_Free(skincolornames);
skincolornames = strbuf_alloc();
name = hardcodeskincolors;
for (i = 0; i < SKINCOLOR_FIRSTFREESLOT; i++, name += strlen(name)+1)
DEH_Link(name, &skincolors[i].info, &skincolornames);
for (i = SKINCOLOR_FIRSTFREESLOT; i <= SKINCOLOR_LASTFREESLOT; i++)
{
skincolors[i].accessible = false;
skincolors[i].name[0] = '\0';
}
if (!init)
{
lumpnum = W_CheckNumForLongNamePwadNoUpper("skincolors", MAINWAD_MAIN, 0);
DEH_LoadDehackedLumpPwad(MAINWAD_MAIN, lumpnum, true);
}
}
// menudefs (TODO: actually reset this with resetdata?)
if (init)
{
memset(menudefs, 0, sizeof(menudefs));
M_InitMenuPresTables();
for (i = 0; i < MAXMENUTYPES; i++)
menudefs[i].drawroutine = MD_DrawGenericMenu;
nummenutypes = MN_FIRSTFREESLOT;
if (menunames)
Z_Free(menunames);
menunames = strbuf_alloc();
name = hardcodemenus;
for (i = 0; i < MN_FIRSTFREESLOT; i++, name += strlen(name)+1)
DEH_Link(name, &menudefs[i].info, &menunames);
}
}