Source release of Wolfenstein 3D Classic Platinum for iOS, 2.1

This commit is contained in:
Travis Bradshaw
2012-01-31 17:08:50 -06:00
parent 16304944b4
commit d7fff51d7d
235 changed files with 64191 additions and 1418 deletions

View File

@@ -0,0 +1,760 @@
/*
Copyright (C) 2004-2005 Michael Liebscher <johnnycanuck@users.sourceforge.net>
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 2
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, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/*
* wl6_name.c: Convert chunk number to string name.
*
* Author: Michael Liebscher <johnnycanuck@users.sourceforge.net>
*
* Acknowledgement:
* This code was derived from Wolfenstein 3-D, and was originally
* written by Id Software, Inc.
*
*/
#include <stdlib.h>
#include "wolf_def.h"
#include "../../../common/arch.h"
#include "../../../common/common_utils.h"
/*
-----------------------------------------------------------------------------
Function: GetLumpFileName_WL1() -Returns lump name string.
Parameters: chunk -[in] Chunk value to get string name for.
Returns: NULL on error, otherwise string name.
Notes:
-----------------------------------------------------------------------------
*/
PUBLIC char *GetLumpFileName_WL1( W32 chunk )
{
switch( chunk )
{
case WL1_H_BJPIC: return "H_BJPIC";
case WL1_H_CASTLEPIC: return "H_CASTLEPIC";
case WL1_H_KEYBOARDPIC: return "H_KEYBOARDPIC";
case WL1_H_CONTROLPIC: return "H_CONTROLPIC";
case WL1_H_HEALPIC: return "H_HEALPIC";
case WL1_H_BGPIC: return "H_BGPIC";
case WL1_H_GUNPIC: return "H_GUNPIC";
case WL1_H_KEYPIC: return "H_KEYPIC";
case WL1_H_BLAZEPIC: return "H_BLAZEPIC";
case WL1_H_WEAPON1234PIC: return "H_WEAPON1234PIC";
case WL1_H_WOLFLOGOPIC: return "H_WOLFLOGOPIC";
case WL1_H_VISAPIC: return "H_VISAPIC";
case WL1_H_MCPIC: return "H_MCPIC";
case WL1_H_IDLOGOPIC: return "H_IDLOGOPIC";
case WL1_H_TOPWINDOWPIC: return "H_TOPWINDOWPI";
case WL1_H_LEFTWINDOWPIC: return "H_LEFTWINDOWPIC";
case WL1_H_RIGHTWINDOWPIC: return "H_RIGHTWINDOWPIC";
case WL1_H_BOTTOMINFOPIC: return "H_BOTTOMINFOPIC";
case WL1_H_GAMEPIC: return "H_GAMEPIC";
case WL1_C_OPTIONSPIC: return "C_OPTIONSPIC";
case WL1_C_CURSOR1PIC: return "C_CURSOR0PIC";
case WL1_C_CURSOR2PIC: return "C_CURSOR1PIC";
case WL1_C_NOTSELECTEDPIC: return "C_NOTSELECTEDPIC";
case WL1_C_SELECTEDPIC: return "C_SELECTEDPIC";
case WL1_C_FXTITLEPIC: return "C_FXTITLEPIC";
case WL1_C_DIGITITLEPIC: return "C_DIGITITLEPIC";
case WL1_C_MUSICTITLEPIC: return "C_MUSICTITLEPIC";
case WL1_C_MOUSELBACKPIC: return "C_MOUSELBACKPIC";
case WL1_C_BABYMODEPIC: return "C_SKILL1PIC";
case WL1_C_EASYPIC: return "C_SKILL2PIC";
case WL1_C_NORMALPIC: return "C_SKILL3PIC";
case WL1_C_HARDPIC: return "C_SKILL4PIC";
case WL1_C_LOADSAVEDISKPIC: return "C_LOADSAVEDISKPIC";
case WL1_C_DISKLOADING1PIC: return "C_DISKLOADING0PIC";
case WL1_C_DISKLOADING2PIC: return "C_DISKLOADING1PIC";
case WL1_C_CONTROLPIC: return "C_CONTROLPIC";
case WL1_C_CUSTOMIZEPIC: return "C_CUSTOMIZEPIC";
case WL1_C_LOADGAMEPIC: return "C_LOADGAMEPIC";
case WL1_C_SAVEGAMEPIC: return "C_SAVEGAMEPIC";
case WL1_C_EPISODE1PIC: return "C_EPISODE1PIC";
case WL1_C_EPISODE2PIC: return "C_EPISODE2PIC";
case WL1_C_EPISODE3PIC: return "C_EPISODE3PIC";
case WL1_C_EPISODE4PIC: return "C_EPISODE4PIC";
case WL1_C_EPISODE5PIC: return "C_EPISODE5PIC";
case WL1_C_EPISODE6PIC: return "C_EPISODE6PIC";
case WL1_C_CODEPIC: return "C_CODEPIC";
case WL1_C_TIMECODEPIC: return "C_TIMECODEPIC";
case WL1_C_LEVELPIC: return "C_LEVELPIC";
case WL1_C_NAMEPIC: return "C_NAMEPIC";
case WL1_C_SCOREPIC: return "C_SCOREPIC";
case WL1_C_JOY1PIC: return "C_JOY1PIC";
case WL1_C_JOY2PIC: return "C_JOY2PIC";
case WL1_L_GUYPIC: return "L_GUY0PIC";
case WL1_L_COLONPIC:
case WL1_L_NUM0PIC:
case WL1_L_NUM1PIC:
case WL1_L_NUM2PIC:
case WL1_L_NUM3PIC:
case WL1_L_NUM4PIC:
case WL1_L_NUM5PIC:
case WL1_L_NUM6PIC:
case WL1_L_NUM7PIC:
case WL1_L_NUM8PIC:
case WL1_L_NUM9PIC:
case WL1_L_PERCENTPIC:
case WL1_L_APIC:
case WL1_L_BPIC:
case WL1_L_CPIC:
case WL1_L_DPIC:
case WL1_L_EPIC:
case WL1_L_FPIC:
case WL1_L_GPIC:
case WL1_L_HPIC:
case WL1_L_IPIC:
case WL1_L_JPIC:
case WL1_L_KPIC:
case WL1_L_LPIC:
case WL1_L_MPIC:
case WL1_L_NPIC:
case WL1_L_OPIC:
case WL1_L_PPIC:
case WL1_L_QPIC:
case WL1_L_RPIC:
case WL1_L_SPIC:
case WL1_L_TPIC:
case WL1_L_UPIC:
case WL1_L_VPIC:
case WL1_L_WPIC:
case WL1_L_XPIC:
case WL1_L_YPIC:
case WL1_L_ZPIC:
case WL1_L_EXPOINTPIC:
case WL1_L_APOSTROPHEPIC: return "L_FONTPIC";
case WL1_L_GUY2PIC: return "L_GUY1PIC";
case WL1_L_BJWINSPIC: return "L_BJWINSPIC";
case WL1_STATUSBARPIC: return "STATUSBARPIC";
case WL1_TITLEPIC: return "TITLEPIC";
case WL1_PG13PIC: return "PC13PIC";
case WL1_CREDITSPIC: return "CREDITSPIC";
case WL1_HIGHSCORESPIC: return "HIGHSCORESPIC";
case WL1_KNIFEPIC: return "KNIFEPIC";
case WL1_GUNPIC: return "GUNPIC";
case WL1_MACHINEGUNPIC: return "MACHINEGUNPIC";
case WL1_GATLINGGUNPIC: return "GATLINGGUNPIC";
case WL1_NOKEYPIC: return "NOKEYPIC";
case WL1_GOLDKEYPIC: return "GOLDKEYPIC";
case WL1_SILVERKEYPIC: return "SILVERKEYPIC";
case WL1_N_BLANKPIC: return "N_BLANKPIC";
case WL1_N_0PIC:
case WL1_N_1PIC:
case WL1_N_2PIC:
case WL1_N_3PIC:
case WL1_N_4PIC:
case WL1_N_5PIC:
case WL1_N_6PIC:
case WL1_N_7PIC:
case WL1_N_8PIC:
case WL1_N_9PIC: return "N_NUMPIC";
case WL1_FACE1APIC: return "FACE1APIC";
case WL1_FACE1BPIC: return "FACE1BPIC";
case WL1_FACE1CPIC: return "FACE1CPIC";
case WL1_FACE2APIC: return "FACE2APIC";
case WL1_FACE2BPIC: return "FACE2BPIC";
case WL1_FACE2CPIC: return "FACE2CPIC";
case WL1_FACE3APIC: return "FACE3APIC";
case WL1_FACE3BPIC: return "FACE3BPIC";
case WL1_FACE3CPIC: return "FACE3CPIC";
case WL1_FACE4APIC: return "FACE4APIC";
case WL1_FACE4BPIC: return "FACE4BPIC";
case WL1_FACE4CPIC: return "FACE4CPIC";
case WL1_FACE5APIC: return "FACE5APIC";
case WL1_FACE5BPIC: return "FACE5BPIC";
case WL1_FACE5CPIC: return "FACE5CPIC";
case WL1_FACE6APIC: return "FACE6APIC";
case WL1_FACE6BPIC: return "FACE6BPIC";
case WL1_FACE6CPIC: return "FACE6CPIC";
case WL1_FACE7APIC: return "FACE7APIC";
case WL1_FACE7BPIC: return "FACE7BPIC";
case WL1_FACE7CPIC: return "FACE7CPIC";
case WL1_FACE8APIC: return "FACE8APIC";
case WL1_GOTGATLINGPIC: return "GOTGATLINGPIC";
case WL1_MUTANTBJPIC: return "MUTANTBJPIC";
case WL1_PAUSEDPIC: return "PAUSEDPIC";
case WL1_GETPSYCHEDPIC: return "GETPSYCHEDPIC";
default: return NULL;
} // End switch chunk
}
/*
-----------------------------------------------------------------------------
Function: GetLumpFileName_WL6() -Returns lump name string.
Parameters: chunk -[in] Chunk value to get string name for.
Returns: NULL on error, otherwise string name.
Notes:
-----------------------------------------------------------------------------
*/
PUBLIC char *GetLumpFileName_WL6( W32 chunk )
{
switch( chunk )
{
case H_BJPIC: return "H_BJPIC";
case H_CASTLEPIC: return "H_CASTLEPIC";
case H_BLAZEPIC: return "H_BLAZEPIC";
case H_TOPWINDOWPIC: return "H_TOPWINDOWPIC";
case H_LEFTWINDOWPIC: return "H_LEFTWINDOWPIC";
case H_RIGHTWINDOWPIC: return "H_RIGHTWINDOWPIC";
case H_BOTTOMINFOPIC: return "H_BOTTOMINFOPIC";
case C_OPTIONSPIC: return "C_OPTIONSPIC";
case C_CURSOR1PIC: return "C_CURSOR0PIC";
case C_CURSOR2PIC: return "C_CURSOR1PIC";
case C_NOTSELECTEDPIC: return "C_NOTSELECTEDPIC";
case C_SELECTEDPIC: return "C_SELECTEDPIC";
case C_FXTITLEPIC: return "C_FXTITLEPIC";
case C_DIGITITLEPIC: return "C_DIGITITLEPIC";
case C_MUSICTITLEPIC: return "C_MUSICTITLEPIC";
case C_MOUSELBACKPIC: return "C_MOUSELBACKPIC";
case C_BABYMODEPIC: return "C_SKILL1PIC";
case C_EASYPIC: return "C_SKILL2PIC";
case C_NORMALPIC: return "C_SKILL3PIC";
case C_HARDPIC: return "C_SKILL4PIC";
case C_LOADSAVEDISKPIC: return "C_LOADSAVEDISKPIC";
case C_DISKLOADING1PIC: return "C_DISKLOADING0PIC";
case C_DISKLOADING2PIC: return "C_DISKLOADING1PIC";
case C_CONTROLPIC: return "C_CONTROLPIC";
case C_CUSTOMIZEPIC: return "C_CUSTOMIZEPIC";
case C_LOADGAMEPIC: return "C_LOADGAMEPIC";
case C_SAVEGAMEPIC: return "C_SAVEGAMEPIC";
case C_EPISODE1PIC: return "C_EPISODE1PIC";
case C_EPISODE2PIC: return "C_EPISODE2PIC";
case C_EPISODE3PIC: return "C_EPISODE3PIC";
case C_EPISODE4PIC: return "C_EPISODE4PIC";
case C_EPISODE5PIC: return "C_EPISODE5PIC";
case C_EPISODE6PIC: return "C_EPISODE6PIC";
case C_CODEPIC: return "C_CODEPIC";
case C_TIMECODEPIC: return "C_TIMECODEPIC";
case C_LEVELPIC: return "C_LEVELPIC";
case C_NAMEPIC: return "C_NAMEPIC";
case C_SCOREPIC: return "C_SCOREPIC";
case C_JOY1PIC: return "C_JOY1PIC";
case C_JOY2PIC: return "C_JOY2PIC";
case L_GUYPIC: return "L_GUY0PIC";
case L_COLONPIC:
case L_NUM0PIC:
case L_NUM1PIC:
case L_NUM2PIC:
case L_NUM3PIC:
case L_NUM4PIC:
case L_NUM5PIC:
case L_NUM6PIC:
case L_NUM7PIC:
case L_NUM8PIC:
case L_NUM9PIC:
case L_PERCENTPIC:
case L_APIC:
case L_BPIC:
case L_CPIC:
case L_DPIC:
case L_EPIC:
case L_FPIC:
case L_GPIC:
case L_HPIC:
case L_IPIC:
case L_JPIC:
case L_KPIC:
case L_LPIC:
case L_MPIC:
case L_NPIC:
case L_OPIC:
case L_PPIC:
case L_QPIC:
case L_RPIC:
case L_SPIC:
case L_TPIC:
case L_UPIC:
case L_VPIC:
case L_WPIC:
case L_XPIC:
case L_YPIC:
case L_ZPIC:
case L_EXPOINTPIC:
case L_APOSTROPHEPIC: return "L_FONTPIC";
case L_GUY2PIC: return "L_GUY1PIC";
case L_BJWINSPIC: return "L_BJWINSPIC";
case STATUSBARPIC: return "STATUSBARPIC";
case TITLEPIC: return "TITLEPIC";
case PG13PIC: return "PC13PIC";
case CREDITSPIC: return "CREDITSPIC";
case HIGHSCORESPIC: return "HIGHSCORESPIC";
case KNIFEPIC: return "KNIFEPIC";
case GUNPIC: return "GUNPIC";
case MACHINEGUNPIC: return "MACHINEGUNPIC";
case GATLINGGUNPIC: return "GATLINGGUNPIC";
case NOKEYPIC: return "NOKEYPIC";
case GOLDKEYPIC: return "GOLDKEYPIC";
case SILVERKEYPIC: return "SILVERKEYPIC";
case N_BLANKPIC: return "N_BLANKPIC";
case N_0PIC:
case N_1PIC:
case N_2PIC:
case N_3PIC:
case N_4PIC:
case N_5PIC:
case N_6PIC:
case N_7PIC:
case N_8PIC:
case N_9PIC: return "N_NUMPIC";
case FACE1APIC: return "FACE1APIC";
case FACE1BPIC: return "FACE1BPIC";
case FACE1CPIC: return "FACE1CPIC";
case FACE2APIC: return "FACE2APIC";
case FACE2BPIC: return "FACE2BPIC";
case FACE2CPIC: return "FACE2CPIC";
case FACE3APIC: return "FACE3APIC";
case FACE3BPIC: return "FACE3BPIC";
case FACE3CPIC: return "FACE3CPIC";
case FACE4APIC: return "FACE4APIC";
case FACE4BPIC: return "FACE4BPIC";
case FACE4CPIC: return "FACE4CPIC";
case FACE5APIC: return "FACE5APIC";
case FACE5BPIC: return "FACE5BPIC";
case FACE5CPIC: return "FACE5CPIC";
case FACE6APIC: return "FACE6APIC";
case FACE6BPIC: return "FACE6BPIC";
case FACE6CPIC: return "FACE6CPIC";
case FACE7APIC: return "FACE7APIC";
case FACE7BPIC: return "FACE7BPIC";
case FACE7CPIC: return "FACE7CPIC";
case FACE8APIC: return "FACE8APIC";
case GOTGATLINGPIC: return "GOTGATLINGPIC";
case MUTANTBJPIC: return "MUTANTBJPIC";
case PAUSEDPIC: return "PAUSEDPIC";
case GETPSYCHEDPIC: return "GETPSYCHEDPIC";
default: return NULL;
} // End switch chunk
}
/*
-----------------------------------------------------------------------------
Function: GetLumpFileName_SDM() -Returns lump name string.
Parameters: chunk -[in] Chunk value to get string name for.
Returns: NULL on error, otherwise string name.
Notes:
-----------------------------------------------------------------------------
*/
PUBLIC char *GetLumpFileName_SDM( W32 chunk )
{
switch( chunk )
{
case SDM_C_BACKDROPPIC: return "C_BACKDROPPIC";
case SDM_C_MOUSELBACKPIC: return "SC_MOUSELBACKPIC";
case SDM_C_CURSOR1PIC: return "SC_CURSOR0PIC";
case SDM_C_CURSOR2PIC: return "SC_CURSOR1PIC";
case SDM_C_NOTSELECTEDPIC: return "SC_NOTSELECTEDPIC";
case SDM_C_SELECTEDPIC: return "SC_SELECTEDPIC";
case SDM_C_CUSTOMIZEPIC: return "SC_CUSTOMIZEPIC";
case SDM_C_JOY1PIC: return "C_JOY1PIC";
case SDM_C_JOY2PIC: return "C_JOY2PIC";
case SDM_C_MOUSEPIC: return "C_MOUSEPIC";
case SDM_C_JOYSTICKPIC: return "C_JOYSTICKPIC";
case SDM_C_KEYBOARDPIC: return "C_KEYBOARDPIC";
case SDM_C_CONTROLPIC: return "SC_CONTROLPIC";
case SDM_C_OPTIONSPIC: return "SC_OPTIONSPIC";
case SDM_C_FXTITLEPIC: return "SC_FXTITLEPIC";
case SDM_C_DIGITITLEPIC: return "SC_DIGITITLEPIC";
case SDM_C_MUSICTITLEPIC: return "SC_MUSICTITLEPIC";
case SDM_C_HOWTOUGHPIC: return "C_HOWTOUGHPIC";
case SDM_C_BABYMODEPIC: return "SC_SKILL1PIC";
case SDM_C_EASYPIC: return "SC_SKILL2PIC";
case SDM_C_NORMALPIC: return "SC_SKILL3PIC";
case SDM_C_HARDPIC: return "SC_SKILL4PIC";
case SDM_C_DISKLOADING1PIC: return "C_DISKLOADING0PIC";
case SDM_C_DISKLOADING2PIC: return "C_DISKLOADING1PIC";
case SDM_C_LOADGAMEPIC: return "SC_LOADGAMEPIC";
case SDM_C_SAVEGAMEPIC: return "SC_SAVEGAMEPIC";
case SDM_HIGHSCORESPIC: return "SHIGHSCORESPIC";
case SDM_C_WONSPEARPIC: return "C_WONSPEARPIC";
case SDM_L_GUYPIC: return "L_GUY0PIC";
case SDM_L_COLONPIC:
case SDM_L_NUM0PIC:
case SDM_L_NUM1PIC:
case SDM_L_NUM2PIC:
case SDM_L_NUM3PIC:
case SDM_L_NUM4PIC:
case SDM_L_NUM5PIC:
case SDM_L_NUM6PIC:
case SDM_L_NUM7PIC:
case SDM_L_NUM8PIC:
case SDM_L_NUM9PIC:
case SDM_L_PERCENTPIC:
case SDM_L_APIC:
case SDM_L_BPIC:
case SDM_L_CPIC:
case SDM_L_DPIC:
case SDM_L_EPIC:
case SDM_L_FPIC:
case SDM_L_GPIC:
case SDM_L_HPIC:
case SDM_L_IPIC:
case SDM_L_JPIC:
case SDM_L_KPIC:
case SDM_L_LPIC:
case SDM_L_MPIC:
case SDM_L_NPIC:
case SDM_L_OPIC:
case SDM_L_PPIC:
case SDM_L_QPIC:
case SDM_L_RPIC:
case SDM_L_SPIC:
case SDM_L_TPIC:
case SDM_L_UPIC:
case SDM_L_VPIC:
case SDM_L_WPIC:
case SDM_L_XPIC:
case SDM_L_YPIC:
case SDM_L_ZPIC:
case SDM_L_EXPOINTPIC:
case SDM_L_APOSTROPHEPIC: return "L_FONTPIC";
case SDM_L_GUY2PIC: return "L_GUY1PIC";
case SDM_L_BJWINSPIC: return "L_BJWINSPIC";
case SDM_TITLE1PIC:
case SDM_TITLE2PIC: return "STITLEPIC";
case SDM_STATUSBARPIC: return "STATUSBARPIC";
case SDM_PG13PIC: return "PC13PIC";
case SDM_CREDITSPIC: return "SCREDITSPIC";
case SDM_KNIFEPIC: return "KNIFEPIC";
case SDM_GUNPIC: return "GUNPIC";
case SDM_MACHINEGUNPIC: return "MACHINEGUNPIC";
case SDM_GATLINGGUNPIC: return "GATLINGGUNPIC";
case SDM_NOKEYPIC: return "NOKEYPIC";
case SDM_GOLDKEYPIC: return "GOLDKEYPIC";
case SDM_SILVERKEYPIC: return "SILVERKEYPIC";
case SDM_N_BLANKPIC: return "N_BLANKPIC";
case SDM_N_0PIC:
case SDM_N_1PIC:
case SDM_N_2PIC:
case SDM_N_3PIC:
case SDM_N_4PIC:
case SDM_N_5PIC:
case SDM_N_6PIC:
case SDM_N_7PIC:
case SDM_N_8PIC:
case SDM_N_9PIC: return "N_NUMPIC";
case SDM_FACE1APIC: return "FACE1APIC";
case SDM_FACE1BPIC: return "FACE1BPIC";
case SDM_FACE1CPIC: return "FACE1CPIC";
case SDM_FACE2APIC: return "FACE2APIC";
case SDM_FACE2BPIC: return "FACE2BPIC";
case SDM_FACE2CPIC: return "FACE2CPIC";
case SDM_FACE3APIC: return "FACE3APIC";
case SDM_FACE3BPIC: return "FACE3BPIC";
case SDM_FACE3CPIC: return "FACE3CPIC";
case SDM_FACE4APIC: return "FACE4APIC";
case SDM_FACE4BPIC: return "FACE4BPIC";
case SDM_FACE4CPIC: return "FACE4CPIC";
case SDM_FACE5APIC: return "FACE5APIC";
case SDM_FACE5BPIC: return "FACE5BPIC";
case SDM_FACE5CPIC: return "FACE5CPIC";
case SDM_FACE6APIC: return "FACE6APIC";
case SDM_FACE6BPIC: return "FACE6BPIC";
case SDM_FACE6CPIC: return "FACE6CPIC";
case SDM_FACE7APIC: return "FACE7APIC";
case SDM_FACE7BPIC: return "FACE7BPIC";
case SDM_FACE7CPIC: return "FACE7CPIC";
case SDM_FACE8APIC: return "FACE8APIC";
case SDM_GOTGATLINGPIC: return "GOTGATLINGPIC";
case SDM_GODMODEFACE1PIC: return "GODMODEFACE0PIC";
case SDM_GODMODEFACE2PIC: return "GODMODEFACE1PIC";
case SDM_GODMODEFACE3PIC: return "GODMODEFACE2PIC";
case SDM_BJWAITING1PIC: return "BJWAITING0PIC";
case SDM_BJWAITING2PIC: return "BJWAITING1PIC";
case SDM_BJOUCHPIC: return "BJOUCHPIC";
case SDM_PAUSEDPIC: return "PAUSEDPIC";
case SDM_GETPSYCHEDPIC: return "GETPSYCHEDPIC";
default: return NULL;
} // End switch chunk
}
/*
-----------------------------------------------------------------------------
Function: GetLumpFileName_SOD() -Returns lump name string.
Parameters: chunk -[in] Chunk value to get string name for.
Returns: NULL on error, otherwise string name.
Notes:
-----------------------------------------------------------------------------
*/
PUBLIC char *GetLumpFileName_SOD( W32 chunk )
{
switch( chunk )
{
case SOD_C_BACKDROPPIC: return "C_BACKDROPPIC";
case SOD_C_MOUSELBACKPIC: return "SC_MOUSELBACKPIC";
case SOD_C_CURSOR1PIC: return "SC_CURSOR0PIC";
case SOD_C_CURSOR2PIC: return "SC_CURSOR1PIC";
case SOD_C_NOTSELECTEDPIC: return "SC_NOTSELECTEDPIC";
case SOD_C_SELECTEDPIC: return "SC_SELECTEDPIC";
case SOD_C_CUSTOMIZEPIC: return "SC_CUSTOMIZEPIC";
case SOD_C_JOY1PIC: return "C_JOY1PIC";
case SOD_C_JOY2PIC: return "C_JOY2PIC";
case SOD_C_MOUSEPIC: return "C_MOUSEPIC";
case SOD_C_JOYSTICKPIC: return "C_JOYSTICKPIC";
case SOD_C_KEYBOARDPIC: return "C_KEYBOARDPIC";
case SOD_C_CONTROLPIC: return "SC_CONTROLPIC";
case SOD_C_OPTIONSPIC: return "SC_OPTIONSPIC";
case SOD_C_FXTITLEPIC: return "SC_FXTITLEPIC";
case SOD_C_DIGITITLEPIC: return "SC_DIGITITLEPIC";
case SOD_C_MUSICTITLEPIC: return "SC_MUSICTITLEPIC";
case SOD_C_HOWTOUGHPIC: return "C_HOWTOUGHPIC";
case SOD_C_BABYMODEPIC: return "SC_SKILL1PIC";
case SOD_C_EASYPIC: return "SC_SKILL2PIC";
case SOD_C_NORMALPIC: return "SC_SKILL3PIC";
case SOD_C_HARDPIC: return "SC_SKILL4PIC";
case SOD_C_DISKLOADING1PIC: return "C_DISKLOADING0PIC";
case SOD_C_DISKLOADING2PIC: return "C_DISKLOADING1PIC";
case SOD_C_LOADGAMEPIC: return "SC_LOADGAMEPIC";
case SOD_C_SAVEGAMEPIC: return "SC_SAVEGAMEPIC";
case SOD_HIGHSCORESPIC: return "SHIGHSCORESPIC";
case SOD_C_WONSPEARPIC: return "C_WONSPEARPIC";
case SOD_BJCOLLAPSE1PIC: return "BJCOLLAPSE1PIC";
case SOD_BJCOLLAPSE2PIC: return "BJCOLLAPSE2PIC";
case SOD_BJCOLLAPSE3PIC: return "BJCOLLAPSE3PIC";
case SOD_BJCOLLAPSE4PIC: return "BJCOLLAPSE4PIC";
case SOD_ENDPICPIC: return "ENDPICPIC";
case SOD_L_GUYPIC: return "L_GUY0PIC";
case SOD_L_COLONPIC:
case SOD_L_NUM0PIC:
case SOD_L_NUM1PIC:
case SOD_L_NUM2PIC:
case SOD_L_NUM3PIC:
case SOD_L_NUM4PIC:
case SOD_L_NUM5PIC:
case SOD_L_NUM6PIC:
case SOD_L_NUM7PIC:
case SOD_L_NUM8PIC:
case SOD_L_NUM9PIC:
case SOD_L_PERCENTPIC:
case SOD_L_APIC:
case SOD_L_BPIC:
case SOD_L_CPIC:
case SOD_L_DPIC:
case SOD_L_EPIC:
case SOD_L_FPIC:
case SOD_L_GPIC:
case SOD_L_HPIC:
case SOD_L_IPIC:
case SOD_L_JPIC:
case SOD_L_KPIC:
case SOD_L_LPIC:
case SOD_L_MPIC:
case SOD_L_NPIC:
case SOD_L_OPIC:
case SOD_L_PPIC:
case SOD_L_QPIC:
case SOD_L_RPIC:
case SOD_L_SPIC:
case SOD_L_TPIC:
case SOD_L_UPIC:
case SOD_L_VPIC:
case SOD_L_WPIC:
case SOD_L_XPIC:
case SOD_L_YPIC:
case SOD_L_ZPIC:
case SOD_L_EXPOINTPIC:
case SOD_L_APOSTROPHEPIC: return "L_FONTPIC";
case SOD_L_GUY2PIC: return "L_GUY1PIC";
case SOD_L_BJWINSPIC: return "L_BJWINSPIC";
case SOD_TITLE1PIC:
case SOD_TITLE2PIC: return "STITLEPIC";
case SOD_ENDSCREEN11PIC: return "ENDSCREEN11PIC";
case SOD_ENDSCREEN12PIC: return "ENDSCREEN12PIC";
case SOD_ENDSCREEN3PIC: return "ENDSCREEN3PIC";
case SOD_ENDSCREEN4PIC: return "ENDSCREEN4PIC";
case SOD_ENDSCREEN5PIC: return "ENDSCREEN5PIC";
case SOD_ENDSCREEN6PIC: return "ENDSCREEN6PIC";
case SOD_ENDSCREEN7PIC: return "ENDSCREEN7PIC";
case SOD_ENDSCREEN8PIC: return "ENDSCREEN8PIC";
case SOD_ENDSCREEN9PIC: return "ENDSCREEN9PIC";
case SOD_STATUSBARPIC: return "STATUSBARPIC";
case SOD_PG13PIC: return "PC13PIC";
case SOD_CREDITSPIC: return "SCREDITSPIC";
case SOD_IDGUYS1PIC:
case SOD_IDGUYS2PIC: return "IDGUYSPIC";
case SOD_COPYPROTTOPPIC: return "COPYPROTTOPPIC";
case SOD_COPYPROTBOXPIC: return "COPYPROTBOXPIC";
case SOD_BOSSPIC1PIC: return "BOSSPIC1PIC";
case SOD_BOSSPIC2PIC: return "BOSSPIC2PIC";
case SOD_BOSSPIC3PIC: return "BOSSPIC3PIC";
case SOD_BOSSPIC4PIC: return "BOSSPIC4PIC";
case SOD_KNIFEPIC: return "KNIFEPIC";
case SOD_GUNPIC: return "GUNPIC";
case SOD_MACHINEGUNPIC: return "MACHINEGUNPIC";
case SOD_GATLINGGUNPIC: return "GATLINGGUNPIC";
case SOD_NOKEYPIC: return "NOKEYPIC";
case SOD_GOLDKEYPIC: return "GOLDKEYPIC";
case SOD_SILVERKEYPIC: return "SILVERKEYPIC";
case SOD_N_BLANKPIC: return "N_BLANKPIC";
case SOD_N_0PIC:
case SOD_N_1PIC:
case SOD_N_2PIC:
case SOD_N_3PIC:
case SOD_N_4PIC:
case SOD_N_5PIC:
case SOD_N_6PIC:
case SOD_N_7PIC:
case SOD_N_8PIC:
case SOD_N_9PIC: return "N_NUMPIC";
case SOD_FACE1APIC: return "FACE1APIC";
case SOD_FACE1BPIC: return "FACE1BPIC";
case SOD_FACE1CPIC: return "FACE1CPIC";
case SOD_FACE2APIC: return "FACE2APIC";
case SOD_FACE2BPIC: return "FACE2BPIC";
case SOD_FACE2CPIC: return "FACE2CPIC";
case SOD_FACE3APIC: return "FACE3APIC";
case SOD_FACE3BPIC: return "FACE3BPIC";
case SOD_FACE3CPIC: return "FACE3CPIC";
case SOD_FACE4APIC: return "FACE4APIC";
case SOD_FACE4BPIC: return "FACE4BPIC";
case SOD_FACE4CPIC: return "FACE4CPIC";
case SOD_FACE5APIC: return "FACE5APIC";
case SOD_FACE5BPIC: return "FACE5BPIC";
case SOD_FACE5CPIC: return "FACE5CPIC";
case SOD_FACE6APIC: return "FACE6APIC";
case SOD_FACE6BPIC: return "FACE6BPIC";
case SOD_FACE6CPIC: return "FACE6CPIC";
case SOD_FACE7APIC: return "FACE7APIC";
case SOD_FACE7BPIC: return "FACE7BPIC";
case SOD_FACE7CPIC: return "FACE7CPIC";
case SOD_FACE8APIC: return "FACE8APIC";
case SOD_GOTGATLINGPIC: return "GOTGATLINGPIC";
case SOD_GODMODEFACE1PIC: return "GODMODEFACE0PIC";
case SOD_GODMODEFACE2PIC: return "GODMODEFACE1PIC";
case SOD_GODMODEFACE3PIC: return "GODMODEFACE2PIC";
case SOD_BJWAITING1PIC: return "BJWAITING0PIC";
case SOD_BJWAITING2PIC: return "BJWAITING1PIC";
case SOD_BJOUCHPIC: return "BJOUCHPIC";
case SOD_PAUSEDPIC: return "PAUSEDPIC";
case SOD_GETPSYCHEDPIC: return "GETPSYCHEDPIC";
default: return NULL;
} // End switch chunk
}
PUBLIC char *GetMusicFileName_WL6( W32 chunk )
{
switch( chunk )
{
case CORNER_MUS: return "CORNER";
case DUNGEON_MUS: return "DUNGEON";
case WARMARCH_MUS: return "WARMARCH";
case GETTHEM_MUS: return "GETTHEM";
case HEADACHE_MUS: return "HEADACHE";
case HITLWLTZ_MUS: return "HITLWLTZ";
case INTROCW3_MUS: return "INTROCW3";
case NAZI_NOR_MUS: return "NAZI_NOR";
case NAZI_OMI_MUS: return "NAZI_OMI";
case POW_MUS: return "POW";
case SALUTE_MUS: return "SALUTE";
case SEARCHN_MUS: return "SEARCHN";
case SUSPENSE_MUS: return "SUSPENSE";
case VICTORS_MUS: return "VICTORS";
case WONDERIN_MUS: return "WONDERIN";
case FUNKYOU_MUS: return "FUNKYOU";
case ENDLEVEL_MUS: return "ENDLEVEL";
case GOINGAFT_MUS: return "GOINGAFT";
case PREGNANT_MUS: return "PREGNANT";
case ULTIMATE_MUS: return "ULTIMATE";
case NAZI_RAP_MUS: return "NAZI_RAP";
case ZEROHOUR_MUS: return "ZEROHOUR";
case TWELFTH_MUS: return "TWELFTH";
case ROSTER_MUS: return "ROSTER";
case URAHERO_MUS: return "URAHERO";
case VICMARCH_MUS: return "VICMARCH";
case PACMAN_MUS: return "PACMAN";
default: return NULL;
} // End switch chunk
}
PUBLIC char *GetMusicFileName_SOD( W32 chunk )
{
switch( chunk )
{
case SOD_XFUNKIE_MUS: return "XFUNKIE";
case SOD_DUNGEON_MUS: return "DUNGEON";
case SOD_XDEATH_MUS: return "XDEATH";
case SOD_GETTHEM_MUS: return "GETTHEM";
case SOD_XTIPTOE_MUS: return "XTIPTOE";
case SOD_GOINGAFT_MUS: return "GOINGAFT";
case SOD_URAHERO_MUS: return "URAHERO";
case SOD_XTHEEND_MUS: return "XTHEEND";
case SOD_NAZI_OMI_MUS: return "NAZI_OMI";
case SOD_POW_MUS: return "POW";
case SOD_TWELFTH_MUS: return "TWELFTH";
case SOD_SEARCHN_MUS: return "SEARCHN";
case SOD_SUSPENSE_MUS: return "SUSPENSE";
case SOD_ZEROHOUR_MUS: return "ZEROHOUR";
case SOD_WONDERIN_MUS: return "WONDERIN";
case SOD_ULTIMATE_MUS: return "ULTIMATE";
case SOD_ENDLEVEL_MUS: return "ENDLEVEL";
case SOD_XEVIL_MUS: return "XEVIL";
case SOD_XJAZNAZI_MUS: return "XJAZNAZI";
case SOD_COPYPRO_MUS: return "COPYPRO";
case SOD_XAWARD_MUS: return "XAWARD";
case SOD_XPUTIT_MUS: return "XPUTIT";
case SOD_XGETYOU_MUS: return "XGETYOU";
case SOD_XTOWER2_MUS: return "XTOWER2";
default: return NULL;
} // End switch chunk
}

View File

@@ -0,0 +1,507 @@
/*
Copyright (C) 2004 Michael Liebscher
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 2
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, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/*
* wolf_aud.c: Decode Wolfenstein 3-D Adlib audio data.
*
* Author: Michael Liebscher <johnnycanuck@users.sourceforge.net>
* Date: 2004
*
* Acknowledgement:
* This code was derived from Wolfenstein 3-D, and was originally
* written by Id Software, Inc.
*
*/
#include <stdio.h>
#include <stdlib.h>
#include "wolf_def.h"
#include "../string/com_string.h"
#include "../adlib/adlib.h"
#include "../adlib/fmopl.h"
#include "../loaders/wav.h"
#include "../filesys/file.h"
#include "../../../common/common_utils.h"
#include "../../../common/arch.h"
#include "../memory/memory.h"
#define AHEADFNAME "AUDIOHED"
#define AUDIOFNAME "AUDIOT"
#define MAX_CHUNK_SIZE 500
#define WL6_STARTMUSIC 262
#define SOD_STARTMUSIC 243
PRIVATE FILE *audiohandle;
PRIVATE W32 *audiostarts;
/*
-----------------------------------------------------------------------------
Function: CAL_SetupAudioFile() -Setup for decoding audio data.
Parameters: fextension -[in] Pointer to string with file extension.
Returns: Non-zero on success, otherwise zero.
Notes:
-----------------------------------------------------------------------------
*/
PRIVATE W8 CAL_SetupAudioFile( const char *fextension )
{
FILE *handle;
SW32 length;
W32 count;
char fname[ 13 ];
if( ! fextension || ! *fextension )
{
printf( "NULL extension passed into CAL_SetupAudioFile!\n" );
return 0;
}
//
// load audiohed.XXX (offsets and lengths for audio file)
//
cs_strlcpy( fname, AHEADFNAME, sizeof( fname ) );
cs_strlcat( fname, fextension, sizeof( fname ) );
handle = fopen( cs_strupr( fname ), "rb" );
if( handle == NULL )
{
handle = fopen( cs_strlwr( fname ), "rb" );
if( handle == NULL )
{
printf( "Can not open file (%s) for read!\n", fname );
return 0;
}
}
length = FS_FileLength( handle );
if( length < 4 )
{
fclose( handle );
printf( "Incorrect audio header size on file: %s\n", fname );
return 0;
}
audiostarts = (PW32) MM_MALLOC( length );
if( audiostarts == NULL )
{
return 0;
}
count = fread( audiostarts, sizeof( W32 ), length >> 2, handle );
if( count != (W32)(length >> 2) )
{
fclose( handle );
printf( "[Error]: Read error on file: (%s)", fname );
return 0;
}
fclose( handle );
//
// open the Audio data file
//
cs_strlcpy( fname, AUDIOFNAME, sizeof( fname ) );
cs_strlcat( fname, fextension, sizeof( fname ) );
audiohandle = fopen( cs_strupr( fname ), "rb" );
if( audiohandle == NULL )
{
audiohandle = fopen( cs_strlwr( fname ), "rb" );
if( audiohandle == NULL )
{
printf( "Could not open file (%s) for read!\n", fname );
return 0;
}
}
return 1;
}
/*
-----------------------------------------------------------------------------
Function: CA_CacheAudioChunk() -Cache audio data.
Parameters: chunk -[in] Chunk number to cache.
BuffChunk -[in] Allocated memory block to hold data.
Returns: Non-zero on success, otherwise zero.
Notes:
-----------------------------------------------------------------------------
*/
PRIVATE W8 CA_CacheAudioChunk( W32 chunk, W8 *BuffChunk )
{
W32 pos, length, count;
//
// load the chunk into a buffer
//
pos = audiostarts[ chunk ];
length = audiostarts[ chunk+1 ] - pos;
if( length < 1 || length > MAX_CHUNK_SIZE )
{
printf( "[CA_CacheAudioChunk]: Chunk length not valid\n" );
return 0;
}
if( fseek( audiohandle, pos, SEEK_SET ) != 0 )
{
printf( "[CA_CacheAudioChunk]: Could not seek!\n" );
return 0;
}
count = fread( BuffChunk, 1, length, audiohandle );
if( count != length )
{
printf( "[CA_CacheAudioChunk]: Read error!\n" );
return 0;
}
return 1;
}
/*
-----------------------------------------------------------------------------
Function: CA_SaveAudioChunk() -Decode and save audio data.
Parameters: chunk -[in] Chunk number to cache.
filename -[in] Save as filename.
BuffChunk -[in] Sound data to decode.
BuffWav -[in] Allocated memory block to hold decoded data.
Returns: Nothing.
Notes:
-----------------------------------------------------------------------------
*/
PRIVATE void CA_SaveAudioChunk( W32 chunk, const char *filename,
W8 *BuffChunk, W8 *BuffWav )
{
W32 length;
if( ! filename || ! *filename )
{
return;
}
if( ! CA_CacheAudioChunk( chunk, BuffChunk ) )
{
return;
}
if( ADLIB_DecodeSound( (AdLibSound *)BuffChunk, BuffWav, &length ) == 0 )
{
return;
}
write_wav( filename, BuffWav, length, 1, 22050, 2 );
}
extern W32 ADLIB_UpdateMusic( W32 size, void *buffer );
extern W32 ADLIB_getLength( void *musbuffer );
extern void ADLIB_LoadMusic( void *musbuffer );
extern int vorbis_encode( const char *filename, void *data, W32 size, W32 in_channels, W32 in_samplesize,
W32 rate, W32 quality, W32 max_bitrate, W32 min_bitrate );
#define NCH 1 // channels
#define BPS 16 // bit per second
PRIVATE void CA_SaveMusicChunk( W32 chunk, const char *filename )
{
W8 *data, *BuffWav;
W32 pos, length, uncompr_length;
W32 len;
pos = audiostarts[ chunk ];
length = audiostarts[ chunk+1 ] - pos;
data = MM_MALLOC( length );
if( data == NULL )
{
return;
}
if( fseek( audiohandle, pos, SEEK_SET ) != 0 )
{
printf( "[CA_SaveMusicChunk]: Could not seek!\n" );
MM_FREE( data );
return;
}
if( fread( data, 1, length, audiohandle ) != length )
{
printf( "[CA_SaveMusicChunk]: Read error!\n" );
MM_FREE( data );
return;
}
uncompr_length = ADLIB_getLength( data );
if( uncompr_length == 1 )
{
MM_FREE( data );
return;
}
ADLIB_LoadMusic( data );
BuffWav = MM_MALLOC( uncompr_length * 64 * 2 );
if( BuffWav == NULL )
{
MM_FREE( data );
return;
}
len = ADLIB_UpdateMusic( uncompr_length, BuffWav );
#if 1
vorbis_encode( filename, BuffWav, len, 1, 16, 44100, 0, 0, 0 );
#else
write_wav( filename, BuffWav, len, 1, 44100, 2 );
#endif
MM_FREE( BuffWav );
MM_FREE( data );
}
/*
-----------------------------------------------------------------------------
Function: CAL_ShutdownAudioFile() -Decode and save audio data.
Parameters: Nothing.
Returns: Nothing.
Notes:
-----------------------------------------------------------------------------
*/
PRIVATE void CAL_ShutdownAudioFile()
{
if( audiohandle )
{
fclose( audiohandle );
audiohandle = NULL;
}
if( audiostarts )
{
MM_FREE( audiostarts );
}
}
/*
-----------------------------------------------------------------------------
Function: AudioRipper() -Interface to audio decoder.
Parameters: fextension -[in] file extension string.
start -[in] Chunk number for start of audio data.
end -[in] Chunk number for end of audio data.
Returns: Nothing.
Notes:
-----------------------------------------------------------------------------
*/
PUBLIC _boolean AudioRipper( const char *fextension,
W32 start, W32 end, W16 version )
{
W32 i, j;
char filename[ 64 ];
W8 *buffChunk;
W8 *buffWav;
W32 startofmusic = WL6_STARTMUSIC - 1;
W32 endofmusic = LASTMUSIC;
//
// Setup
//
if( version == SOD_PAK || version == SDM_PAK )
{
if( 0 == FS_Mkdir( SODLSFXDIR ) )
{
printf( "[%s] Could not create directory (%s)!\n", "wolf_aud.c", SODLSFXDIR );
return false;
}
startofmusic = SOD_STARTMUSIC;
endofmusic = SOD_LASTMUSIC;
}
else
{
if( 0 == FS_Mkdir( LSFXDIR ) )
{
printf( "[%s] Could not create directory (%s)!\n", "wolf_aud.c", LSFXDIR );
return false;
}
}
if( 0 == FS_Mkdir( MUSICDIR ) )
{
printf( "[%s] Could not create directory (%s)!\n", "wolf_aud.c", LSFXDIR );
return false;
}
if( ! CAL_SetupAudioFile( fextension ) )
{
CAL_ShutdownAudioFile();
return false;
}
if( ! ADLIB_Init( 22050 ) )
{
CAL_ShutdownAudioFile();
return false;
}
//
// Allocate buffers
//
buffChunk = MM_MALLOC( MAX_CHUNK_SIZE );
if( buffChunk == NULL )
{
ADLIB_Shutdown();
CAL_ShutdownAudioFile();
return false;
}
buffWav = MM_MALLOC( MAX_WAV_SIZE );
if( buffWav == NULL )
{
ADLIB_Shutdown();
CAL_ShutdownAudioFile();
MM_FREE( buffChunk );
return false;
}
//
// Decode Audio data
//
printf( "Decoding Audio Data...\n" );
for( i = start, j = 0; i < end; ++i, ++j )
{
if( version == SOD_PAK || version == SDM_PAK )
{
cs_snprintf( filename, sizeof( filename ), "%s/%.3d.wav", SODLSFXDIR, j );
}
else
{
cs_snprintf( filename, sizeof( filename ), "%s/%.3d.wav", LSFXDIR, j );
}
CA_SaveAudioChunk( i, filename, buffChunk, buffWav );
}
ADLIB_Shutdown();
MM_FREE( buffWav );
MM_FREE( buffChunk );
//
// Decode Music data
//
if( ! ADLIB_Init( 44100 ) )
{
CAL_ShutdownAudioFile();
return false;
}
printf( "Decoding Music Data...\n" );
for( i = 0 ; i < endofmusic ; ++i )
{
if( version == SOD_PAK || version == SDM_PAK )
{
cs_snprintf( filename, sizeof( filename ), "%s/%s.ogg", MUSICDIR, GetMusicFileName_SOD( i ) );
}
else
{
cs_snprintf( filename, sizeof( filename ), "%s/%s.ogg", MUSICDIR, GetMusicFileName_WL6( i ) );
}
CA_SaveMusicChunk( startofmusic + i, filename );
}
ADLIB_Shutdown();
//
// Shutdown
//
CAL_ShutdownAudioFile();
return true;
}

View File

@@ -0,0 +1,919 @@
/*
Copyright (C) 2004 Michael Liebscher
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 2
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, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/*
* wolf_def.h: Valid chunk numbers for Wolfenstein 3-D and Spear of Destiny.
*
* Author: Michael Liebscher <johnnycanuck@users.sourceforge.net>
* Date: 2004
*
* Acknowledgement:
* This code was derived from Wolfenstein 3-D, and was originally
* written by Id Software, Inc.
*
*/
/*
Notes:
This module is implemented by wolf_aud.c, wolf_gfx.c, wolf_map.c,
wolf_pal.c, wolf_pm.c and wl6_name.c.
*/
#ifndef __WOLF_DEF_H__
#define __WOLF_DEF_H__
#include "../../../common/arch.h"
#define WL1_PAK (1<<0)
#define WL6_PAK (1<<1)
#define SDM_PAK (1<<2)
#define SOD_PAK (1<<3)
#define MAC_PAK (1<<4)
#define THREEDO_PAK (1<<5)
#define WL1_FEXT "*.WL1"
#define WL6_FEXT "*.WL6"
#define SDM_FEXT "*.SDM"
#define SOD_FEXT "*.SOD"
#define MAC_FEXT "*.MAC"
#define GFXWALLDIR "walls"
#define GFXSPRITEDIR "sprites"
#define SFXDIR "sfx"
#define SODGFXSPRITEDIR "sodsprites"
#define SODSFXDIR "sodsfx"
#define MAPDIR "maps"
#define LGFXDIR "pics"
#define LSFXDIR "lsfx"
#define SODLSFXDIR "sodlsfx"
#define MUSICDIR "music"
typedef enum
{
// Lump Start
WL1_H_BJPIC = 3,
WL1_H_CASTLEPIC, // 4
WL1_H_KEYBOARDPIC, // 5
WL1_H_CONTROLPIC, // 6
WL1_H_HEALPIC, // 7
WL1_H_BGPIC, // 8
WL1_H_GUNPIC, // 9
WL1_H_KEYPIC, // 10
WL1_H_BLAZEPIC, // 11
WL1_H_WEAPON1234PIC, // 12
WL1_H_WOLFLOGOPIC, // 13
WL1_H_VISAPIC, // 14
WL1_H_MCPIC, // 15
WL1_H_IDLOGOPIC, // 16
WL1_H_TOPWINDOWPIC, // 17
WL1_H_LEFTWINDOWPIC, // 18
WL1_H_RIGHTWINDOWPIC, // 19
WL1_H_BOTTOMINFOPIC, // 20
WL1_H_GAMEPIC, // 21
// Lump Start
WL1_C_OPTIONSPIC, // 22
WL1_C_CURSOR1PIC, // 23
WL1_C_CURSOR2PIC, // 24
WL1_C_NOTSELECTEDPIC, // 25
WL1_C_SELECTEDPIC, // 26
WL1_C_FXTITLEPIC, // 27
WL1_C_DIGITITLEPIC, // 28
WL1_C_MUSICTITLEPIC, // 29
WL1_C_MOUSELBACKPIC, // 30
WL1_C_BABYMODEPIC, // 31
WL1_C_EASYPIC, // 32
WL1_C_NORMALPIC, // 33
WL1_C_HARDPIC, // 34
WL1_C_LOADSAVEDISKPIC, // 35
WL1_C_DISKLOADING1PIC, // 36
WL1_C_DISKLOADING2PIC, // 37
WL1_C_CONTROLPIC, // 38
WL1_C_CUSTOMIZEPIC, // 39
WL1_C_LOADGAMEPIC, // 40
WL1_C_SAVEGAMEPIC, // 41
WL1_C_EPISODE1PIC, // 42
WL1_C_EPISODE2PIC, // 43
WL1_C_EPISODE3PIC, // 44
WL1_C_EPISODE4PIC, // 45
WL1_C_EPISODE5PIC, // 46
WL1_C_EPISODE6PIC, // 47
WL1_C_CODEPIC, // 48
WL1_C_TIMECODEPIC, // 49
WL1_C_LEVELPIC, // 50
WL1_C_NAMEPIC, // 51
WL1_C_SCOREPIC, // 52
WL1_C_JOY1PIC, // 53
WL1_C_JOY2PIC, // 54
// Lump Start
WL1_L_GUYPIC, // 55
WL1_L_COLONPIC, // 56
WL1_L_NUM0PIC, // 57
WL1_L_NUM1PIC, // 58
WL1_L_NUM2PIC, // 59
WL1_L_NUM3PIC, // 60
WL1_L_NUM4PIC, // 61
WL1_L_NUM5PIC, // 62
WL1_L_NUM6PIC, // 63
WL1_L_NUM7PIC, // 64
WL1_L_NUM8PIC, // 65
WL1_L_NUM9PIC, // 66
WL1_L_PERCENTPIC, // 67
WL1_L_APIC, // 68
WL1_L_BPIC, // 69
WL1_L_CPIC, // 70
WL1_L_DPIC, // 71
WL1_L_EPIC, // 72
WL1_L_FPIC, // 73
WL1_L_GPIC, // 74
WL1_L_HPIC, // 75
WL1_L_IPIC, // 76
WL1_L_JPIC, // 77
WL1_L_KPIC, // 78
WL1_L_LPIC, // 79
WL1_L_MPIC, // 80
WL1_L_NPIC, // 81
WL1_L_OPIC, // 82
WL1_L_PPIC, // 83
WL1_L_QPIC, // 84
WL1_L_RPIC, // 85
WL1_L_SPIC, // 86
WL1_L_TPIC, // 87
WL1_L_UPIC, // 88
WL1_L_VPIC, // 89
WL1_L_WPIC, // 90
WL1_L_XPIC, // 91
WL1_L_YPIC, // 92
WL1_L_ZPIC, // 93
WL1_L_EXPOINTPIC, // 94
WL1_L_APOSTROPHEPIC, // 95
WL1_L_GUY2PIC, // 96
WL1_L_BJWINSPIC, // 97
WL1_STATUSBARPIC, // 98
WL1_TITLEPIC, // 99
WL1_PG13PIC, // 100
WL1_CREDITSPIC, // 101
WL1_HIGHSCORESPIC, // 102
// Lump Start
WL1_KNIFEPIC, // 103
WL1_GUNPIC, // 104
WL1_MACHINEGUNPIC, // 105
WL1_GATLINGGUNPIC, // 106
WL1_NOKEYPIC, // 107
WL1_GOLDKEYPIC, // 108
WL1_SILVERKEYPIC, // 109
WL1_N_BLANKPIC, // 110
WL1_N_0PIC, // 111
WL1_N_1PIC, // 112
WL1_N_2PIC, // 113
WL1_N_3PIC, // 114
WL1_N_4PIC, // 115
WL1_N_5PIC, // 116
WL1_N_6PIC, // 117
WL1_N_7PIC, // 118
WL1_N_8PIC, // 119
WL1_N_9PIC, // 120
WL1_FACE1APIC, // 121
WL1_FACE1BPIC, // 122
WL1_FACE1CPIC, // 123
WL1_FACE2APIC, // 124
WL1_FACE2BPIC, // 125
WL1_FACE2CPIC, // 126
WL1_FACE3APIC, // 127
WL1_FACE3BPIC, // 128
WL1_FACE3CPIC, // 129
WL1_FACE4APIC, // 130
WL1_FACE4BPIC, // 131
WL1_FACE4CPIC, // 132
WL1_FACE5APIC, // 133
WL1_FACE5BPIC, // 134
WL1_FACE5CPIC, // 135
WL1_FACE6APIC, // 136
WL1_FACE6BPIC, // 137
WL1_FACE6CPIC, // 138
WL1_FACE7APIC, // 139
WL1_FACE7BPIC, // 140
WL1_FACE7CPIC, // 141
WL1_FACE8APIC, // 142
WL1_GOTGATLINGPIC, // 143
WL1_MUTANTBJPIC, // 144
WL1_PAUSEDPIC, // 145
WL1_GETPSYCHEDPIC, // 146
WL1_ENUMEND
} wl1_graphicnums;
typedef enum
{
// Lump Start
H_BJPIC = 3,
H_CASTLEPIC, // 4
H_BLAZEPIC, // 5
H_TOPWINDOWPIC, // 6
H_LEFTWINDOWPIC, // 7
H_RIGHTWINDOWPIC, // 8
H_BOTTOMINFOPIC, // 9
// Lump Start
C_OPTIONSPIC, // 10
C_CURSOR1PIC, // 11
C_CURSOR2PIC, // 12
C_NOTSELECTEDPIC, // 13
C_SELECTEDPIC, // 14
C_FXTITLEPIC, // 15
C_DIGITITLEPIC, // 16
C_MUSICTITLEPIC, // 17
C_MOUSELBACKPIC, // 18
C_BABYMODEPIC, // 19
C_EASYPIC, // 20
C_NORMALPIC, // 21
C_HARDPIC, // 22
C_LOADSAVEDISKPIC, // 23
C_DISKLOADING1PIC, // 24
C_DISKLOADING2PIC, // 25
C_CONTROLPIC, // 26
C_CUSTOMIZEPIC, // 27
C_LOADGAMEPIC, // 28
C_SAVEGAMEPIC, // 29
C_EPISODE1PIC, // 30
C_EPISODE2PIC, // 31
C_EPISODE3PIC, // 32
C_EPISODE4PIC, // 33
C_EPISODE5PIC, // 34
C_EPISODE6PIC, // 35
C_CODEPIC, // 36
C_TIMECODEPIC, // 37
C_LEVELPIC, // 38
C_NAMEPIC, // 39
C_SCOREPIC, // 40
C_JOY1PIC, // 41
C_JOY2PIC, // 42
// Lump Start
L_GUYPIC, // 43
L_COLONPIC, // 44
L_NUM0PIC, // 45
L_NUM1PIC, // 46
L_NUM2PIC, // 47
L_NUM3PIC, // 48
L_NUM4PIC, // 49
L_NUM5PIC, // 50
L_NUM6PIC, // 51
L_NUM7PIC, // 52
L_NUM8PIC, // 53
L_NUM9PIC, // 54
L_PERCENTPIC, // 55
L_APIC, // 56
L_BPIC, // 57
L_CPIC, // 58
L_DPIC, // 59
L_EPIC, // 60
L_FPIC, // 61
L_GPIC, // 62
L_HPIC, // 63
L_IPIC, // 64
L_JPIC, // 65
L_KPIC, // 66
L_LPIC, // 67
L_MPIC, // 68
L_NPIC, // 69
L_OPIC, // 70
L_PPIC, // 71
L_QPIC, // 72
L_RPIC, // 73
L_SPIC, // 74
L_TPIC, // 75
L_UPIC, // 76
L_VPIC, // 77
L_WPIC, // 78
L_XPIC, // 79
L_YPIC, // 80
L_ZPIC, // 81
L_EXPOINTPIC, // 82
L_APOSTROPHEPIC, // 83
L_GUY2PIC, // 84
L_BJWINSPIC, // 85
STATUSBARPIC, // 86
TITLEPIC, // 87
PG13PIC, // 88
CREDITSPIC, // 89
HIGHSCORESPIC, // 90
// Lump Start
KNIFEPIC, // 91
GUNPIC, // 92
MACHINEGUNPIC, // 93
GATLINGGUNPIC, // 94
NOKEYPIC, // 95
GOLDKEYPIC, // 96
SILVERKEYPIC, // 97
N_BLANKPIC, // 98
N_0PIC, // 99
N_1PIC, // 100
N_2PIC, // 101
N_3PIC, // 102
N_4PIC, // 103
N_5PIC, // 104
N_6PIC, // 105
N_7PIC, // 106
N_8PIC, // 107
N_9PIC, // 108
FACE1APIC, // 109
FACE1BPIC, // 110
FACE1CPIC, // 111
FACE2APIC, // 112
FACE2BPIC, // 113
FACE2CPIC, // 114
FACE3APIC, // 115
FACE3BPIC, // 116
FACE3CPIC, // 117
FACE4APIC, // 118
FACE4BPIC, // 119
FACE4CPIC, // 120
FACE5APIC, // 121
FACE5BPIC, // 122
FACE5CPIC, // 123
FACE6APIC, // 124
FACE6BPIC, // 125
FACE6CPIC, // 126
FACE7APIC, // 127
FACE7BPIC, // 128
FACE7CPIC, // 129
FACE8APIC, // 130
GOTGATLINGPIC, // 131
MUTANTBJPIC, // 132
PAUSEDPIC, // 133
GETPSYCHEDPIC, // 134
ORDERSCREEN=136,
ERRORSCREEN, // 137
T_HELPART, // 138
T_DEMO0, // 139
T_DEMO1, // 140
T_DEMO2, // 141
T_DEMO3, // 142
T_ENDART1, // 143
T_ENDART2, // 144
T_ENDART3, // 145
T_ENDART4, // 146
T_ENDART5, // 147
T_ENDART6, // 148
ENUMEND
} graphicnums;
typedef enum
{
// Lump Start
SDM_C_BACKDROPPIC = 3,
SDM_C_MOUSELBACKPIC, // 4
SDM_C_CURSOR1PIC, // 5
SDM_C_CURSOR2PIC, // 6
SDM_C_NOTSELECTEDPIC, // 7
SDM_C_SELECTEDPIC, // 8
// Lump Start
SDM_C_CUSTOMIZEPIC, // 9
SDM_C_JOY1PIC, // 10
SDM_C_JOY2PIC, // 11
SDM_C_MOUSEPIC, // 12
SDM_C_JOYSTICKPIC, // 13
SDM_C_KEYBOARDPIC, // 14
SDM_C_CONTROLPIC, // 15
// Lump Start
SDM_C_OPTIONSPIC, // 16
// Lump Start
SDM_C_FXTITLEPIC, // 17
SDM_C_DIGITITLEPIC, // 18
SDM_C_MUSICTITLEPIC, // 19
// Lump Start
SDM_C_HOWTOUGHPIC, // 20
SDM_C_BABYMODEPIC, // 21
SDM_C_EASYPIC, // 22
SDM_C_NORMALPIC, // 23
SDM_C_HARDPIC, // 24
// Lump Start
SDM_C_DISKLOADING1PIC, // 25
SDM_C_DISKLOADING2PIC, // 26
SDM_C_LOADGAMEPIC, // 27
SDM_C_SAVEGAMEPIC, // 28
// Lump Start
SDM_HIGHSCORESPIC, // 29
SDM_C_WONSPEARPIC, // 30
// Lump Start
SDM_L_GUYPIC, // 31
SDM_L_COLONPIC, // 32
SDM_L_NUM0PIC, // 33
SDM_L_NUM1PIC, // 34
SDM_L_NUM2PIC, // 35
SDM_L_NUM3PIC, // 36
SDM_L_NUM4PIC, // 37
SDM_L_NUM5PIC, // 38
SDM_L_NUM6PIC, // 39
SDM_L_NUM7PIC, // 40
SDM_L_NUM8PIC, // 41
SDM_L_NUM9PIC, // 42
SDM_L_PERCENTPIC, // 43
SDM_L_APIC, // 44
SDM_L_BPIC, // 45
SDM_L_CPIC, // 46
SDM_L_DPIC, // 47
SDM_L_EPIC, // 48
SDM_L_FPIC, // 49
SDM_L_GPIC, // 50
SDM_L_HPIC, // 51
SDM_L_IPIC, // 52
SDM_L_JPIC, // 53
SDM_L_KPIC, // 54
SDM_L_LPIC, // 55
SDM_L_MPIC, // 56
SDM_L_NPIC, // 57
SDM_L_OPIC, // 58
SDM_L_PPIC, // 59
SDM_L_QPIC, // 60
SDM_L_RPIC, // 61
SDM_L_SPIC, // 62
SDM_L_TPIC, // 63
SDM_L_UPIC, // 64
SDM_L_VPIC, // 65
SDM_L_WPIC, // 66
SDM_L_XPIC, // 67
SDM_L_YPIC, // 68
SDM_L_ZPIC, // 69
SDM_L_EXPOINTPIC, // 70
SDM_L_APOSTROPHEPIC, // 71
SDM_L_GUY2PIC, // 72
SDM_L_BJWINSPIC, // 73
// Lump Start
SDM_TITLE1PIC, // 74
SDM_TITLE2PIC, // 75
SDM_STATUSBARPIC, // 76
SDM_PG13PIC, // 77
SDM_CREDITSPIC, // 78
// Lump Start
SDM_KNIFEPIC, // 79
SDM_GUNPIC, // 80
SDM_MACHINEGUNPIC, // 81
SDM_GATLINGGUNPIC, // 82
SDM_NOKEYPIC, // 83
SDM_GOLDKEYPIC, // 84
SDM_SILVERKEYPIC, // 85
SDM_N_BLANKPIC, // 86
SDM_N_0PIC, // 87
SDM_N_1PIC, // 88
SDM_N_2PIC, // 89
SDM_N_3PIC, // 90
SDM_N_4PIC, // 91
SDM_N_5PIC, // 92
SDM_N_6PIC, // 93
SDM_N_7PIC, // 94
SDM_N_8PIC, // 95
SDM_N_9PIC, // 96
SDM_FACE1APIC, // 97
SDM_FACE1BPIC, // 98
SDM_FACE1CPIC, // 99
SDM_FACE2APIC, // 100
SDM_FACE2BPIC, // 101
SDM_FACE2CPIC, // 102
SDM_FACE3APIC, // 103
SDM_FACE3BPIC, // 104
SDM_FACE3CPIC, // 105
SDM_FACE4APIC, // 106
SDM_FACE4BPIC, // 107
SDM_FACE4CPIC, // 108
SDM_FACE5APIC, // 109
SDM_FACE5BPIC, // 110
SDM_FACE5CPIC, // 111
SDM_FACE6APIC, // 112
SDM_FACE6BPIC, // 113
SDM_FACE6CPIC, // 114
SDM_FACE7APIC, // 115
SDM_FACE7BPIC, // 116
SDM_FACE7CPIC, // 117
SDM_FACE8APIC, // 118
SDM_GOTGATLINGPIC, // 119
SDM_GODMODEFACE1PIC, // 120
SDM_GODMODEFACE2PIC, // 121
SDM_GODMODEFACE3PIC, // 122
SDM_BJWAITING1PIC, // 123
SDM_BJWAITING2PIC, // 124
SDM_BJOUCHPIC, // 125
SDM_PAUSEDPIC, // 126
SDM_GETPSYCHEDPIC, // 127
SDM_ORDERSCREEN = 129,
SDM_ERRORSCREEN, // 130
SDM_TITLEPALETTE, // 131
SDM_T_DEMO0, // 132
SDM_ENUMEND
} sdm_graphicnums;
typedef enum
{
// Lump Start
SOD_C_BACKDROPPIC = 3,
SOD_C_MOUSELBACKPIC, // 4
SOD_C_CURSOR1PIC, // 5
SOD_C_CURSOR2PIC, // 6
SOD_C_NOTSELECTEDPIC, // 7
SOD_C_SELECTEDPIC, // 8
// Lump Start
SOD_C_CUSTOMIZEPIC, // 9
SOD_C_JOY1PIC, // 10
SOD_C_JOY2PIC, // 11
SOD_C_MOUSEPIC, // 12
SOD_C_JOYSTICKPIC, // 13
SOD_C_KEYBOARDPIC, // 14
SOD_C_CONTROLPIC, // 15
// Lump Start
SOD_C_OPTIONSPIC, // 16
// Lump Start
SOD_C_FXTITLEPIC, // 17
SOD_C_DIGITITLEPIC, // 18
SOD_C_MUSICTITLEPIC, // 19
// Lump Start
SOD_C_HOWTOUGHPIC, // 20
SOD_C_BABYMODEPIC, // 21
SOD_C_EASYPIC, // 22
SOD_C_NORMALPIC, // 23
SOD_C_HARDPIC, // 24
// Lump Start
SOD_C_DISKLOADING1PIC, // 25
SOD_C_DISKLOADING2PIC, // 26
SOD_C_LOADGAMEPIC, // 27
SOD_C_SAVEGAMEPIC, // 28
// Lump Start
SOD_HIGHSCORESPIC, // 29
SOD_C_WONSPEARPIC, // 30
// Lump Start
SOD_BJCOLLAPSE1PIC, // 31
SOD_BJCOLLAPSE2PIC, // 32
SOD_BJCOLLAPSE3PIC, // 33
SOD_BJCOLLAPSE4PIC, // 34
SOD_ENDPICPIC, // 35
// Lump Start
SOD_L_GUYPIC, // 36
SOD_L_COLONPIC, // 37
SOD_L_NUM0PIC, // 38
SOD_L_NUM1PIC, // 39
SOD_L_NUM2PIC, // 40
SOD_L_NUM3PIC, // 41
SOD_L_NUM4PIC, // 42
SOD_L_NUM5PIC, // 43
SOD_L_NUM6PIC, // 44
SOD_L_NUM7PIC, // 45
SOD_L_NUM8PIC, // 46
SOD_L_NUM9PIC, // 47
SOD_L_PERCENTPIC, // 48
SOD_L_APIC, // 49
SOD_L_BPIC, // 50
SOD_L_CPIC, // 51
SOD_L_DPIC, // 52
SOD_L_EPIC, // 53
SOD_L_FPIC, // 54
SOD_L_GPIC, // 55
SOD_L_HPIC, // 56
SOD_L_IPIC, // 57
SOD_L_JPIC, // 58
SOD_L_KPIC, // 59
SOD_L_LPIC, // 60
SOD_L_MPIC, // 61
SOD_L_NPIC, // 62
SOD_L_OPIC, // 63
SOD_L_PPIC, // 64
SOD_L_QPIC, // 65
SOD_L_RPIC, // 66
SOD_L_SPIC, // 67
SOD_L_TPIC, // 68
SOD_L_UPIC, // 69
SOD_L_VPIC, // 70
SOD_L_WPIC, // 71
SOD_L_XPIC, // 72
SOD_L_YPIC, // 73
SOD_L_ZPIC, // 74
SOD_L_EXPOINTPIC, // 75
SOD_L_APOSTROPHEPIC, // 76
SOD_L_GUY2PIC, // 77
SOD_L_BJWINSPIC, // 78
// Lump Start
SOD_TITLE1PIC, // 79
SOD_TITLE2PIC, // 80
// Lump Start
SOD_ENDSCREEN11PIC, // 81
// Lump Start
SOD_ENDSCREEN12PIC, // 82
SOD_ENDSCREEN3PIC, // 83
SOD_ENDSCREEN4PIC, // 84
SOD_ENDSCREEN5PIC, // 85
SOD_ENDSCREEN6PIC, // 86
SOD_ENDSCREEN7PIC, // 87
SOD_ENDSCREEN8PIC, // 88
SOD_ENDSCREEN9PIC, // 89
SOD_STATUSBARPIC, // 90
SOD_PG13PIC, // 91
SOD_CREDITSPIC, // 92
// Lump Start
SOD_IDGUYS1PIC, // 93
SOD_IDGUYS2PIC, // 94
// Lump Start
SOD_COPYPROTTOPPIC, // 95
SOD_COPYPROTBOXPIC, // 96
SOD_BOSSPIC1PIC, // 97
SOD_BOSSPIC2PIC, // 98
SOD_BOSSPIC3PIC, // 99
SOD_BOSSPIC4PIC, // 100
// Lump Start
SOD_KNIFEPIC, // 101
SOD_GUNPIC, // 102
SOD_MACHINEGUNPIC, // 103
SOD_GATLINGGUNPIC, // 104
SOD_NOKEYPIC, // 105
SOD_GOLDKEYPIC, // 106
SOD_SILVERKEYPIC, // 107
SOD_N_BLANKPIC, // 108
SOD_N_0PIC, // 109
SOD_N_1PIC, // 110
SOD_N_2PIC, // 111
SOD_N_3PIC, // 112
SOD_N_4PIC, // 113
SOD_N_5PIC, // 114
SOD_N_6PIC, // 115
SOD_N_7PIC, // 116
SOD_N_8PIC, // 117
SOD_N_9PIC, // 118
SOD_FACE1APIC, // 119
SOD_FACE1BPIC, // 120
SOD_FACE1CPIC, // 121
SOD_FACE2APIC, // 122
SOD_FACE2BPIC, // 123
SOD_FACE2CPIC, // 124
SOD_FACE3APIC, // 125
SOD_FACE3BPIC, // 126
SOD_FACE3CPIC, // 127
SOD_FACE4APIC, // 128
SOD_FACE4BPIC, // 129
SOD_FACE4CPIC, // 130
SOD_FACE5APIC, // 131
SOD_FACE5BPIC, // 132
SOD_FACE5CPIC, // 133
SOD_FACE6APIC, // 134
SOD_FACE6BPIC, // 135
SOD_FACE6CPIC, // 136
SOD_FACE7APIC, // 137
SOD_FACE7BPIC, // 138
SOD_FACE7CPIC, // 139
SOD_FACE8APIC, // 140
SOD_GOTGATLINGPIC, // 141
SOD_GODMODEFACE1PIC, // 142
SOD_GODMODEFACE2PIC, // 143
SOD_GODMODEFACE3PIC, // 144
SOD_BJWAITING1PIC, // 145
SOD_BJWAITING2PIC, // 146
SOD_BJOUCHPIC, // 147
SOD_PAUSEDPIC, // 148
SOD_GETPSYCHEDPIC, // 149
SOD_ORDERSCREEN = 151,
SOD_ERRORSCREEN, // 152
SOD_TITLEPALETTE, // 153
SOD_END1PALETTE, // 154
SOD_END2PALETTE, // 155
SOD_END3PALETTE, // 156
SOD_END4PALETTE, // 157
SOD_END5PALETTE, // 158
SOD_END6PALETTE, // 159
SOD_END7PALETTE, // 160
SOD_END8PALETTE, // 161
SOD_END9PALETTE, // 162
SOD_IDGUYSPALETTE, // 163
SOD_T_DEMO0, // 164
SOD_T_DEMO1, // 165
SOD_T_DEMO2, // 166
SOD_T_DEMO3, // 167
SOD_T_ENDART1, // 168
SOD_ENUMEND
} sod_graphicnums;
typedef enum
{
CORNER_MUS, // 0
DUNGEON_MUS, // 1
WARMARCH_MUS, // 2
GETTHEM_MUS, // 3
HEADACHE_MUS, // 4
HITLWLTZ_MUS, // 5
INTROCW3_MUS, // 6
NAZI_NOR_MUS, // 7
NAZI_OMI_MUS, // 8
POW_MUS, // 9
SALUTE_MUS, // 10
SEARCHN_MUS, // 11
SUSPENSE_MUS, // 12
VICTORS_MUS, // 13
WONDERIN_MUS, // 14
FUNKYOU_MUS, // 15
ENDLEVEL_MUS, // 16
GOINGAFT_MUS, // 17
PREGNANT_MUS, // 18
ULTIMATE_MUS, // 19
NAZI_RAP_MUS, // 20
ZEROHOUR_MUS, // 21
TWELFTH_MUS, // 22
ROSTER_MUS, // 23
URAHERO_MUS, // 24
VICMARCH_MUS, // 25
PACMAN_MUS, // 26
LASTMUSIC
} wl6_musicnames;
typedef enum
{
SOD_XFUNKIE_MUS, // 0
SOD_DUNGEON_MUS, // 1
SOD_XDEATH_MUS, // 2
SOD_GETTHEM_MUS, // 3
SOD_XTIPTOE_MUS, // 4
SOD_GOINGAFT_MUS, // 5
SOD_URAHERO_MUS, // 6
SOD_XTHEEND_MUS, // 7
SOD_NAZI_OMI_MUS, // 8
SOD_POW_MUS, // 9
SOD_TWELFTH_MUS, // 10
SOD_SEARCHN_MUS, // 11
SOD_SUSPENSE_MUS, // 12
SOD_ZEROHOUR_MUS, // 13
SOD_WONDERIN_MUS, // 14
SOD_ULTIMATE_MUS, // 15
SOD_ENDLEVEL_MUS, // 16
SOD_XEVIL_MUS, // 17
SOD_XJAZNAZI_MUS, // 18
SOD_COPYPRO_MUS, // 19
SOD_XAWARD_MUS, // 20
SOD_XPUTIT_MUS, // 21
SOD_XGETYOU_MUS, // 22
SOD_XTOWER2_MUS, // 23
SOD_LASTMUSIC
} sod_musicnames;
/////////////////////////////////////////////////////////////////////
//
// WL1
//
/////////////////////////////////////////////////////////////////////
//
// Data LUMPs
//
#define WL1_README_LUMP_START 3
#define WL1_README_LUMP_END 25
#define WL1_CONTROLS_LUMP_START 26
#define WL1_CONTROLS_LUMP_END 52
#define WL1_LEVELEND_LUMP_START 53
#define WL1_LEVELEND_LUMP_END 93
#define WL1_LATCHPICS_LUMP_START 99
#define WL1_LATCHPICS_LUMP_END 141
/////////////////////////////////////////////////////////////////////
//
// WL6
//
/////////////////////////////////////////////////////////////////////
//
// Data LUMPs
//
#define WL6_README_LUMP_START 3
#define WL6_README_LUMP_END 9
#define WL6_CONTROLS_LUMP_START 10
#define WL6_CONTROLS_LUMP_END 42
#define WL6_LEVELEND_LUMP_START 43
#define WL6_LEVELEND_LUMP_END 85
#define WL6_LATCHPICS_LUMP_START 91
#define WL6_LATCHPICS_LUMP_END 134
//
// Amount of each data item
//
#define NUMFONT 2
#define NUMFONTM 0
#define NUMPICM 0
#define NUMSPRITES 0
#define NUMTILE8 72
#define NUMTILE8M 0
#define NUMTILE16 0
#define NUMTILE16M 0
#define NUMTILE32 0
#define NUMTILE32M 0
#define NUMEXTERNS 13
//
// File offsets for data items
//
#define STRUCTPIC 0
#define STARTFONT 1
#define STARTFONTM 3
#define STARTPICS 3
#define STARTPICM 135
#define STARTSPRITES 135
#define STARTTILE8 135
#define STARTTILE8M 136
#define STARTTILE16 136
#define STARTTILE16M 136
#define STARTTILE32 136
#define STARTTILE32M 136
#define STARTEXTERNS 136
/////////////////////////////////////////////////////////////////////
//
// Spear of Destiny
//
/////////////////////////////////////////////////////////////////////
//
// Amount of each data item
//
#define NUMCHUNKS 169
#define NUMPICS 147
#define SOD_NUMEXTERNS 18
//
// File offsets for data items
//
#define SOD_STARTDIFF 15
//// End SOD
extern _boolean LumpExtractor( const char *fextension, W32 limit, W16 version );
extern _boolean PExtractor( const char *extension, W16 version );
extern _boolean AudioRipper( const char *fextension, W32 start, W32 end, W16 version );
extern _boolean MapRipper( const char *fextension, W16 version );
extern char *GetMusicFileName_WL6( W32 chunk );
extern char *GetMusicFileName_SOD( W32 chunk );
extern char *GetLumpFileName_WL1( W32 chunk );
extern char *GetLumpFileName_WL6( W32 chunk );
extern char *GetLumpFileName_SDM( W32 chunk );
extern char *GetLumpFileName_SOD( W32 chunk );
#endif /* __WOLF_DEF_H__ */

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,692 @@
/*
Copyright (C) 2004-2005 Michael Liebscher
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 2
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, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/*
* wolf_map.c: Decode Wolfenstein 3-D Map data.
*
* Author: Michael Liebscher <johnnycanuck@users.sourceforge.net>
* Date: 2004
*
* Acknowledgement:
* This code was derived from Wolfenstein 3-D, and was originally
* written by Id Software, Inc.
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "wolf_def.h"
#include "../string/com_string.h"
#include "../loaders/tga.h"
#include "../filesys/file.h"
#include "../../../common/arch.h"
#include "../memory/memory.h"
#include "../../../common/common_utils.h"
#define MAPHEADNAME "MAPHEAD"
#define MAPNAME "GAMEMAPS"
PRIVATE FILE *maphandle;
PRIVATE W32 headeroffsets[ 100 ];
PRIVATE W32 TotalMaps;
PRIVATE W16 RLEWtag;
PRIVATE W16 gameversion;
PRIVATE const W32 vgaCeilingWL6[] =
{
0x1d1d,0x1d1d,0x1d1d,0x1d1d,0x1d1d,0x1d1d,0x1d1d,0x1d1d,0x1d1d,0xbfbf,
0x4e4e,0x4e4e,0x4e4e,0x1d1d,0x8d8d,0x4e4e,0x1d1d,0x2d2d,0x1d1d,0x8d8d,
0x1d1d,0x1d1d,0x1d1d,0x1d1d,0x1d1d,0x2d2d,0xdddd,0x1d1d,0x1d1d,0x9898,
0x1d1d,0x9d9d,0x2d2d,0xdddd,0xdddd,0x9d9d,0x2d2d,0x4d4d,0x1d1d,0xdddd,
0x7d7d,0x1d1d,0x2d2d,0x2d2d,0xdddd,0xd7d7,0x1d1d,0x1d1d,0x1d1d,0x2d2d,
0x1d1d,0x1d1d,0x1d1d,0x1d1d,0xdddd,0xdddd,0x7d7d,0xdddd,0xdddd,0xdddd
};
PRIVATE const W32 vgaCeilingSOD[] =
{
0x6f6f,0x4f4f,0x1d1d,0xdede,0xdfdf,0x2e2e,0x7f7f,0x9e9e,0xaeae,0x7f7f,
0x1d1d,0xdede,0xdfdf,0xdede,0xdfdf,0xdede,0xe1e1,0xdcdc,0x2e2e,0x1d1d,0xdcdc
};
PRIVATE W32 WL6_songs[] =
{
//
// Episode One
//
GETTHEM_MUS,
SEARCHN_MUS,
POW_MUS,
SUSPENSE_MUS,
GETTHEM_MUS,
SEARCHN_MUS,
POW_MUS,
SUSPENSE_MUS,
WARMARCH_MUS, // Boss level
CORNER_MUS, // Secret level
//
// Episode Two
//
NAZI_OMI_MUS,
PREGNANT_MUS,
GOINGAFT_MUS,
HEADACHE_MUS,
NAZI_OMI_MUS,
PREGNANT_MUS,
HEADACHE_MUS,
GOINGAFT_MUS,
WARMARCH_MUS, // Boss level
DUNGEON_MUS, // Secret level
//
// Episode Three
//
INTROCW3_MUS,
NAZI_RAP_MUS,
TWELFTH_MUS,
ZEROHOUR_MUS,
INTROCW3_MUS,
NAZI_RAP_MUS,
TWELFTH_MUS,
ZEROHOUR_MUS,
ULTIMATE_MUS, // Boss level
PACMAN_MUS, // Secret level
//
// Episode Four
//
GETTHEM_MUS,
SEARCHN_MUS,
POW_MUS,
SUSPENSE_MUS,
GETTHEM_MUS,
SEARCHN_MUS,
POW_MUS,
SUSPENSE_MUS,
WARMARCH_MUS, // Boss level
CORNER_MUS, // Secret level
//
// Episode Five
//
NAZI_OMI_MUS,
PREGNANT_MUS,
GOINGAFT_MUS,
HEADACHE_MUS,
NAZI_OMI_MUS,
PREGNANT_MUS,
HEADACHE_MUS,
GOINGAFT_MUS,
WARMARCH_MUS, // Boss level
DUNGEON_MUS, // Secret level
//
// Episode Six
//
INTROCW3_MUS,
NAZI_RAP_MUS,
TWELFTH_MUS,
ZEROHOUR_MUS,
INTROCW3_MUS,
NAZI_RAP_MUS,
TWELFTH_MUS,
ZEROHOUR_MUS,
ULTIMATE_MUS, // Boss level
FUNKYOU_MUS // Secret level
};
PRIVATE W32 SOD_songs[] =
{
SOD_XTIPTOE_MUS,
SOD_XFUNKIE_MUS,
SOD_XDEATH_MUS,
SOD_XGETYOU_MUS, // DON'T KNOW
SOD_ULTIMATE_MUS, // Trans Grosse
SOD_DUNGEON_MUS,
SOD_GOINGAFT_MUS,
SOD_POW_MUS,
SOD_TWELFTH_MUS,
SOD_ULTIMATE_MUS, // Barnacle Wilhelm BOSS
SOD_NAZI_OMI_MUS,
SOD_GETTHEM_MUS,
SOD_SUSPENSE_MUS,
SOD_SEARCHN_MUS,
SOD_ZEROHOUR_MUS,
SOD_ULTIMATE_MUS, // Super Mutant BOSS
SOD_XPUTIT_MUS,
SOD_ULTIMATE_MUS, // Death Knight BOSS
SOD_XJAZNAZI_MUS, // Secret level
SOD_XFUNKIE_MUS, // Secret level (DON'T KNOW)
SOD_XEVIL_MUS // Angel of Death BOSS
};
typedef struct
{
float time;
char timestr[ 6 ];
} times;
PRIVATE times parTimesWL6[] =
{
//
// Episode One Par Times
//
{ 1.5, "01:30" },
{ 2, "02:00" },
{ 2, "02:00" },
{ 3.5, "03:30" },
{ 3, "03:00" },
{ 3, "03:00" },
{ 2.5, "02:30" },
{ 2.5, "02:30" },
{ 0, "??:??" }, // Boss level
{ 0, "??:??" }, // Secret level
//
// Episode Two Par Times
//
{ 1.5, "01:30" },
{ 3.5, "03:30" },
{ 3, "03:00" },
{ 2, "02:00" },
{ 4, "04:00" },
{ 6, "06:00" },
{ 1, "01:00" },
{ 3, "03:00" },
{ 0, "??:??" },
{ 0, "??:??" },
//
// Episode Three Par Times
//
{ 1.5, "01:30" },
{ 1.5, "01:30" },
{ 2.5, "02:30" },
{ 2.5, "02:30" },
{ 3.5, "03:30" },
{ 2.5, "02:30" },
{ 2, "02:00" },
{ 6, "06:00" },
{ 0, "??:??" },
{ 0, "??:??" },
//
// Episode Four Par Times
//
{ 2, "02:00" },
{ 2, "02:00" },
{ 1.5, "01:30" },
{ 1, "01:00" },
{ 4.5, "04:30" },
{ 3.5, "03:30" },
{ 2, "02:00" },
{ 4.5, "04:30" },
{ 0, "??:??" },
{ 0, "??:??" },
//
// Episode Five Par Times
//
{ 2.5, "02:30" },
{ 1.5, "01:30" },
{ 2.5, "02:30" },
{ 2.5, "02:30" },
{ 4, "04:00" },
{ 3, "03:00" },
{ 4.5, "04:30" },
{ 3.5, "03:30" },
{ 0, "??:??" },
{ 0, "??:??" },
//
// Episode Six Par Times
//
{ 6.5, "06:30" },
{ 4, "04:00" },
{ 4.5, "04:30" },
{ 6, "06:00" },
{ 5, "05:00" },
{ 5.5, "05:30" },
{ 5.5, "05:30" },
{ 8.5, "08:30" },
{ 0, "??:??" },
{ 0, "??:??" }
};
PRIVATE times parTimesSOD[] =
{
//
// SPEAR OF DESTINY TIMES
//
{ 1.5, "01:30" },
{ 3.5, "03:30" },
{ 2.75,"02:45" },
{ 3.5, "03:30" },
{ 0, "??:??" }, // Boss 1
{ 4.5, "04:30" },
{ 3.25,"03:15" },
{ 2.75,"02:45" },
{ 4.75,"04:45" },
{ 0, "??:??" }, // Boss 2
{ 6.5, "06:30" },
{ 4.5, "04:30" },
{ 2.75,"02:45" },
{ 4.5, "04:30" },
{ 6, "06:00" },
{ 0, "??:??" }, // Boss 3
{ 6, "06:00" },
{ 0, "??:??" }, // Boss 4
{ 0, "??:??" }, // Secret level 1
{ 0, "??:??" }, // Secret level 2
};
/*
-----------------------------------------------------------------------------
Function: CAL_SetupMapFile -Setup map files for decoding.
Parameters: extension -[in] file extension for map data files.
Returns: Non-zero on success, zero otherwise.
Notes:
-----------------------------------------------------------------------------
*/
PRIVATE W8 CAL_SetupMapFile( const char *extension )
{
FILE *handle;
SW32 length;
char fname[ 13 ];
//
// load maphead.xxx (offsets and tileinfo for map file)
//
cs_strlcpy( fname, MAPHEADNAME, sizeof( fname ) );
cs_strlcat( fname, extension, sizeof( fname ) );
handle = fopen( cs_strupr( fname ), "rb" );
if( handle == NULL )
{
handle = fopen( cs_strlwr( fname ), "rb" );
if( handle == NULL )
{
printf( "Could not open file (%s) for read!\n", fname );
return 0;
}
}
length = FS_FileLength( handle );
fread( &RLEWtag, 2, 1, handle );
for( TotalMaps = 0 ; TotalMaps < length ; ++TotalMaps )
{
fread( &headeroffsets[ TotalMaps ], 4, 1, handle );
if( ! headeroffsets[ TotalMaps ] )
{
break;
}
}
fclose( handle );
cs_strlcpy( fname, MAPNAME, sizeof( fname ) );
cs_strlcat( fname, extension, sizeof( fname ) );
maphandle = fopen( cs_strupr( fname ), "rb");
if( NULL == maphandle )
{
maphandle = fopen( cs_strlwr( fname ), "rb");
if( NULL == maphandle )
{
return 0;
}
}
return 1;
}
/*
-----------------------------------------------------------------------------
Function: CAL_ShutdownMapFile -Shutdown map file.
Parameters: Nothing.
Returns: Nothing.
Notes:
-----------------------------------------------------------------------------
*/
PRIVATE void CAL_ShutdownMapFile( void )
{
if( maphandle )
{
fclose( maphandle );
}
}
/*
-----------------------------------------------------------------------------
Function: CA_CacheMap -Cache and save map data.
Parameters:
ChunkOffset -[in] Chunk offset.
Chunklength -[in] Length of chunk.
filename -[in] File name to save map as.
index -[in] File name index number.
Returns: Non-zero on success, otherwise zero.
Notes:
-----------------------------------------------------------------------------
*/
PRIVATE W8 CA_CacheMap( W32 ChunkOffset, W32 Chunklength, const char *filename, W32 index )
{
W32 offset[ 3 ];
W32 offsetin[ 3 ];
W32 temp;
W16 length[ 3 ];
W8 sig[ 5 ];
W16 w, h;
W8 *data;
W32 ceiling;
W32 floor;
FILE *fout;
float ftime;
char *stime;
char name[ 32 ];
char musicName[ 64 ];
extern char gamepal[];
SW32 jmp;
if( gameversion == SOD_PAK )
{
temp = (vgaCeilingSOD[ index ] & 0xff) * 3;
ceiling = ( (gamepal[ temp ] << 2) << 16 ) | ( (gamepal[ temp+1 ] << 2 ) << 8) | (gamepal[ temp+2 ]<<2);
temp = 0x19 * 3;
floor = ( (gamepal[ temp ] << 2) << 16 ) | ( (gamepal[ temp+1 ] << 2 ) << 8) | (gamepal[ temp+2 ]<<2);
ftime = parTimesSOD[ index ].time;
stime = parTimesSOD[ index ].timestr;
cs_snprintf( musicName, sizeof( musicName ), "music/%s.ogg", GetMusicFileName_SOD( SOD_songs[ index ] ) );
}
else
{
temp = (vgaCeilingWL6[ index ] & 0xff) * 3;
ceiling = ( (gamepal[ temp ] << 2) << 16 ) | ( (gamepal[ temp+1 ] << 2 ) << 8) | (gamepal[ temp+2 ]<<2);
temp = 0x19 * 3;
floor = ( (gamepal[ temp ] << 2) << 16 ) | ( (gamepal[ temp+1 ] << 2 ) << 8) | (gamepal[ temp+2 ]<<2);
ftime = parTimesWL6[ index ].time;
stime = parTimesWL6[ index ].timestr;
cs_snprintf( musicName, sizeof( musicName ), "music/%s.ogg", GetMusicFileName_WL6( WL6_songs[ index ] ) );
}
fout = fopen( filename, "wb");
if( NULL == fout )
{
return 0;
}
fseek( maphandle, ChunkOffset, SEEK_SET );
fread( &offsetin, sizeof( W32 ), 3, maphandle );
fread( &length, sizeof( W16 ), 3, maphandle );
fread( &w, sizeof( W16 ), 1, maphandle );
fread( &h, sizeof( W16 ), 1, maphandle );
fread( name, sizeof( W8 ), 16, maphandle );
fread( sig, sizeof( W8 ), 4, maphandle );
//
// Output header
//
// Map file header signature
fwrite( sig, sizeof( W8 ), 4, fout );
// RLE Word tag
fwrite( &RLEWtag, sizeof( W16 ), 1, fout );
// Max Width
fwrite( &w, sizeof( W16 ), 1, fout );
// Max Height
fwrite( &h, sizeof( W16 ), 1, fout );
// Ceiling Colour
fwrite( &ceiling, sizeof( W32 ), 1, fout );
// Floor Colour
fwrite( &floor, sizeof( W32 ), 1, fout );
// Length of layers
temp = length[ 0 ];
fwrite( &temp, sizeof( W16 ), 1, fout ); // Length One
temp = length[ 1 ];
fwrite( &temp, sizeof( W16 ), 1, fout ); // Length Two
temp = length[ 2 ];
fwrite( &temp, sizeof( W16 ), 1, fout ); // Length Three
jmp = ftell( fout );
temp = 0;
fwrite( &temp, sizeof( W32 ), 1, fout ); // Offset One
fwrite( &temp, sizeof( W32 ), 1, fout ); // Offset Two
fwrite( &temp, sizeof( W32 ), 1, fout ); // Offset Three
// Map name length
temp = strlen( name );
fwrite( &temp, sizeof( W16 ), 1, fout );
// Music name length
temp = strlen( musicName );
fwrite( &temp, sizeof( W16 ), 1, fout );
// Par time Float
fwrite( &ftime, sizeof( float ), 1, fout );
// Par time string
fwrite( stime, sizeof( W8 ), 5 , fout );
// Map name
fwrite( name, sizeof( W8 ), strlen( name ), fout );
// Music file name
fwrite( musicName, sizeof( W8 ), strlen( musicName ), fout );
data = MM_MALLOC( length[ 0 ] );
if( data == NULL )
{
return 0;
}
offset[ 0 ] = ftell( fout );
fseek( maphandle, offsetin[ 0 ], SEEK_SET );
fread( data, 1, length[ 0 ], maphandle );
fwrite( data, 1, length[ 0 ], fout );
data = MM_REALLOC( data, length[ 1 ] );
if( data == NULL )
{
return 0;
}
offset[ 1 ] = ftell( fout );
fseek( maphandle, offsetin[ 1 ], SEEK_SET );
fread( data, 1, length[ 1 ], maphandle );
fwrite( data, 1, length[ 1 ], fout );
data = MM_REALLOC( data, length[ 2 ] );
if( data == NULL )
{
return 0;
}
offset[ 2 ] = ftell( fout );
fseek( maphandle, offsetin[ 2 ], SEEK_SET );
fread( data, 1, length[ 2 ], maphandle );
fwrite( data, 1, length[ 2 ], fout );
MM_FREE( data );
fseek( fout, jmp, SEEK_SET );
temp = offset[ 0 ];
fwrite( &temp, sizeof( W32 ), 1, fout ); // Offset One
temp = offset[ 1 ];
fwrite( &temp, sizeof( W32 ), 1, fout ); // Offset Two
temp = offset[ 2 ];
fwrite( &temp, sizeof( W32 ), 1, fout ); // Offset Three
fclose( fout );
return 1;
}
/*
-----------------------------------------------------------------------------
Function: MapRipper -Re-encode map data.
Parameters: extension -[in] file extension for map data files.
Returns: Nothing.
Notes:
-----------------------------------------------------------------------------
*/
PUBLIC _boolean MapRipper( const char *fextension, W16 version )
{
W32 i;
char fname[ 32 ];
gameversion = version;
//
// Setup
//
if( 0 == FS_Mkdir( MAPDIR ) )
{
printf( "[%s] Could not create directory (%s)!\n", "wolf_map.c", MAPDIR );
return false;
}
if( ! CAL_SetupMapFile( fextension ) )
{
CAL_ShutdownMapFile();
return false;
}
//
// Decode Map data
//
printf( "Decoding Map Data...\n" );
for( i = 0 ; i < TotalMaps ; ++i )
{
cs_snprintf( fname, sizeof( fname ), "%s/%c%.2d.map", MAPDIR, TOLOWER( fextension[ 1 ] ), i );
CA_CacheMap( headeroffsets[ i ],
headeroffsets[ i + 1 ] - headeroffsets[ i ],
fname, i );
}
//
// Shutdown
//
CAL_ShutdownMapFile();
return true;
}

View File

@@ -0,0 +1,263 @@
char gamepal[ 768 ] = {
0, 0, 0,
0, 0, 42,
0, 42, 0,
0, 42, 42,
42, 0, 0,
42, 0, 42,
42, 21, 0,
42, 42, 42,
21, 21, 21,
21, 21, 63,
21, 63, 21,
21, 63, 63,
63, 21, 21,
63, 21, 63,
63, 63, 21,
63, 63, 63,
59, 59, 59,
55, 55, 55,
52, 52, 52,
48, 48, 48,
45, 45, 45,
42, 42, 42,
38, 38, 38,
35, 35, 35,
31, 31, 31,
28, 28, 28,
25, 25, 25,
21, 21, 21,
18, 18, 18,
14, 14, 14,
11, 11, 11,
8, 8, 8,
63, 0, 0,
59, 0, 0,
56, 0, 0,
53, 0, 0,
50, 0, 0,
47, 0, 0,
44, 0, 0,
41, 0, 0,
38, 0, 0,
34, 0, 0,
31, 0, 0,
28, 0, 0,
25, 0, 0,
22, 0, 0,
19, 0, 0,
16, 0, 0,
63, 54, 54,
63, 46, 46,
63, 39, 39,
63, 31, 31,
63, 23, 23,
63, 16, 16,
63, 8, 8,
63, 0, 0,
63, 42, 23,
63, 38, 16,
63, 34, 8,
63, 30, 0,
57, 27, 0,
51, 24, 0,
45, 21, 0,
39, 19, 0,
63, 63, 54,
63, 63, 46,
63, 63, 39,
63, 63, 31,
63, 62, 23,
63, 61, 16,
63, 61, 8,
63, 61, 0,
57, 54, 0,
51, 49, 0,
45, 43, 0,
39, 39, 0,
33, 33, 0,
28, 27, 0,
22, 21, 0,
16, 16, 0,
52, 63, 23,
49, 63, 16,
45, 63, 8,
40, 63, 0,
36, 57, 0,
32, 51, 0,
29, 45, 0,
24, 39, 0,
54, 63, 54,
47, 63, 46,
39, 63, 39,
32, 63, 31,
24, 63, 23,
16, 63, 16,
8, 63, 8,
0, 63, 0,
0, 63, 0,
0, 59, 0,
0, 56, 0,
0, 53, 0,
1, 50, 0,
1, 47, 0,
1, 44, 0,
1, 41, 0,
1, 38, 0,
1, 34, 0,
1, 31, 0,
1, 28, 0,
1, 25, 0,
1, 22, 0,
1, 19, 0,
1, 16, 0,
54, 63, 63,
46, 63, 63,
39, 63, 63,
31, 63, 62,
23, 63, 63,
16, 63, 63,
8, 63, 63,
0, 63, 63,
0, 57, 57,
0, 51, 51,
0, 45, 45,
0, 39, 39,
0, 33, 33,
0, 28, 28,
0, 22, 22,
0, 16, 16,
23, 47, 63,
16, 44, 63,
8, 42, 63,
0, 39, 63,
0, 35, 57,
0, 31, 51,
0, 27, 45,
0, 23, 39,
54, 54, 63,
46, 47, 63,
39, 39, 63,
31, 32, 63,
23, 24, 63,
16, 16, 63,
8, 9, 63,
0, 1, 63,
0, 0, 63,
0, 0, 59,
0, 0, 56,
0, 0, 53,
0, 0, 50,
0, 0, 47,
0, 0, 44,
0, 0, 41,
0, 0, 38,
0, 0, 34,
0, 0, 31,
0, 0, 28,
0, 0, 25,
0, 0, 22,
0, 0, 19,
0, 0, 16,
10, 10, 10,
63, 56, 13,
63, 53, 9,
63, 51, 6,
63, 48, 2,
63, 45, 0,
// 45, 8, 63, //hmmmm
// 42, 0, 63, //hmmmm
0, 14, 0,
0, 10, 0,
38, 0, 57,
32, 0, 51,
29, 0, 45,
24, 0, 39,
20, 0, 33,
17, 0, 28,
13, 0, 22,
10, 0, 16,
63, 54, 63,
63, 46, 63,
63, 39, 63,
63, 31, 63,
63, 23, 63,
63, 16, 63,
63, 8, 63,
63, 0, 63,
56, 0, 57,
50, 0, 51,
45, 0, 45,
39, 0, 39,
33, 0, 33,
27, 0, 28,
22, 0, 22,
16, 0, 16,
63, 58, 55,
63, 56, 52,
63, 54, 49,
63, 53, 47,
63, 51, 44,
63, 49, 41,
63, 47, 39,
63, 46, 36,
63, 44, 32,
63, 41, 28,
63, 39, 24,
60, 37, 23,
58, 35, 22,
55, 34, 21,
52, 32, 20,
50, 31, 19,
47, 30, 18,
45, 28, 17,
42, 26, 16,
40, 25, 15,
39, 24, 14,
36, 23, 13,
34, 22, 12,
32, 20, 11,
29, 19, 10,
27, 18, 9,
23, 16, 8,
21, 15, 7,
18, 14, 6,
16, 12, 6,
14, 11, 5,
10, 8, 3,
24, 0, 25,
0, 25, 25,
0, 24, 24,
0, 0, 7,
0, 0, 11,
12, 9, 4,
18, 0, 18,
20, 0, 20,
0, 0, 13,
7, 7, 7,
19, 19, 19,
23, 23, 23,
16, 16, 16,
12, 12, 12,
13, 13, 13,
54, 61, 61,
46, 58, 58,
39, 55, 55,
29, 50, 50,
18, 48, 48,
8, 45, 45,
8, 44, 44,
0, 41, 41,
0, 38, 38,
0, 35, 35,
0, 33, 33,
0, 31, 31,
0, 30, 30,
0, 29, 29,
0, 28, 28,
0, 27, 27,
38, 0, 34
};

View File

@@ -0,0 +1,943 @@
/*
Copyright (C) 2004-2005 Michael Liebscher <johnnycanuck@users.sourceforge.net>
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 2
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, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/*
* wolf_pm.c: Decode Wolfenstein3-D Page data.
*
* Author: Michael Liebscher <johnnycanuck@users.sourceforge.net>
*
* Acknowledgement:
* This code was derived from Wolfenstein 3-D, and was originally
* written by Id Software, Inc.
*
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "wolf_def.h"
#include "../../../common/arch.h"
#include "../../../common/common_utils.h"
#include "../loaders/tga.h"
#include "../hq2x.h"
#include "../loaders/wav.h"
#include "../filesys/file.h"
#include "../string/com_string.h"
#include "../memory/memory.h"
extern char gamepal[];
#define PAGEFNAME "VSWAP"
#define SAMPLERATE 7000 // In Hz
typedef struct
{
W32 offset; // Offset of chunk into file
W16 length; // Length of the chunk
} PageList_t;
typedef struct
{
W16 leftpix, rightpix;
W16 dataofs[ 64 ];
// table data after dataofs[ rightpix - leftpix + 1 ]
} t_compshape;
PRIVATE PageList_t *PMPages;
PRIVATE FILE *PageFile = NULL;
PRIVATE W16 PMNumBlocks;
PRIVATE W16 PMSpriteStart, PMSoundStart;
/*
-----------------------------------------------------------------------------
Function: CAL_GetGrChunkLength() -Opens the page file and sets up
the page info.
Parameters: extension -[in] Pointer to a null-terminated string that
specifies the file extension.
(must be in '.XXX' format)
Returns: 1 on success, otherwise 0.
Notes:
-----------------------------------------------------------------------------
*/
PRIVATE W8 PML_OpenPageFile( const char *extension )
{
W32 i;
W32 size;
void *buf;
char filename[ 16 ];
W32 *offsetptr;
W16 *lengthptr;
PageList_t *page;
if( ! extension || ! *extension )
{
printf( "Invalid file extension passed to PML_OpenPageFile()\n" );
return 0;
}
cs_strlcpy( filename, PAGEFNAME, sizeof( filename ) );
cs_strlcat( filename, extension, sizeof( filename ) );
PageFile = fopen( cs_strupr( filename ), "rb" );
if( PageFile == NULL )
{
PageFile = fopen( cs_strlwr( filename ), "rb" );
if( PageFile == NULL )
{
printf( "Could not open file (%s) for read!\n", filename );
return 0;
}
}
// Read in header variables
fread( &PMNumBlocks, sizeof( PMNumBlocks ), 1, PageFile );
fread( &PMSpriteStart, sizeof( PMSpriteStart ), 1, PageFile );
fread( &PMSoundStart, sizeof( PMSoundStart ), 1, PageFile );
// Allocate and clear the page list
PMPages = (PageList_t *) MM_MALLOC( sizeof( PageList_t ) * PMNumBlocks );
if( PMPages == NULL )
{
return 0;
}
memset( PMPages, 0, sizeof( PageList_t ) * PMNumBlocks );
// Read in the chunk offsets
size = sizeof( W32 ) * PMNumBlocks;
buf = MM_MALLOC( size );
if( buf == NULL )
{
return 0;
}
if( fread( buf, 1, size, PageFile ) == 0 )
{
printf( "PML_OpenPageFile: Length read failed\n" );
}
offsetptr = (PW32) buf;
for( i = 0, page = PMPages; i < PMNumBlocks; i++, page++ )
{
page->offset = *offsetptr++;
}
MM_FREE( buf );
// Read in the chunk lengths
size = sizeof( W16 ) * PMNumBlocks;
buf = MM_MALLOC( size );
if( buf == NULL )
{
return 0;
}
if( fread( buf, 1, size, PageFile ) == 0 )
{
printf( "PML_OpenPageFile: Length read failed\n" );
}
lengthptr = (PW16)buf;
for( i = 0, page = PMPages; i < PMNumBlocks; ++i, page++ )
{
page->length = *lengthptr++;
}
MM_FREE( buf );
return 1;
}
/*
-----------------------------------------------------------------------------
Function: PML_ReadFromFile() -Reads in data from Page file.
Parameters: buf -[out] Storage location for data.
offset -[in] Number of bytes from beginning of file.
length -[in] Maximum number of items to be read.
Returns: Nothing.
Notes:
-----------------------------------------------------------------------------
*/
PRIVATE void PML_ReadFromFile( W8 *buf, SW32 offset, W16 length )
{
if( ! buf )
{
printf( "[PML_ReadFromFile]: NULL pointer\n" );
return;
}
if( ! offset )
{
printf( "[PML_ReadFromFile]: Zero offset\n" );
return;
}
if( fseek( PageFile, offset, SEEK_SET ) )
{
printf( "[PML_ReadFromFile]: Seek failed\n" );
return;
}
if( ! fread( buf, 1, length, PageFile ) )
{
printf( "[PML_ReadFromFile]: Read failed\n" );
return;
}
}
/*
-----------------------------------------------------------------------------
Function: PML_LoadPage() -Reads in data from Page file.
Parameters: buf -[out] Storage location for data.
offset -[in] Number of bytes from beginning of file.
clength -[in] Maximum number of items to be read.
Returns: Nothing.
Notes:
-----------------------------------------------------------------------------
*/
PRIVATE void *PML_LoadPage( W32 pagenum, W16 *clength )
{
W8 *addr;
PageList_t *page;
page = &PMPages[ pagenum ];
if( page->length == 0 )
{
return NULL;
}
*clength = page->length;
addr = MM_MALLOC( page->length );
if( addr == NULL )
{
return NULL;
}
PML_ReadFromFile( addr, page->offset, page->length );
return addr;
}
void OutlineImage( W8 *rgba, int width, int height ) {
W8 *data_p;
W8 *copy_p;
W8 *copy = (W8 *)_alloca( width * height * 4 );
int x, y;
memcpy( copy, rgba, width * height * 4 );
data_p = rgba;
copy_p = copy;
for ( y = 0 ; y < height ; y++ ) {
for ( x = 0 ; x < width ; x++, data_p+=4, copy_p+=4 ) {
if ( data_p[3] != 0 ) {
continue;
}
if ( x < width-1 && copy_p[7] != 0 ) {
*(int *)data_p = ((int *)copy_p)[1];
} else if ( x > 0 && copy_p[-1] != 0 ) {
*(int *)data_p = ((int *)copy_p)[-1];
} else if ( y < height-1 && copy_p[width*4+3] != 0 ) {
*(int *)data_p = ((int *)copy_p)[width];
} else if ( y > 0 && copy_p[-width*4+3] != 0 ) {
*(int *)data_p = ((int *)copy_p)[-width];
}
data_p[3] = 1;
}
}
}
typedef struct {
int hasAlpha;
int srcWidth;
int srcHeight;
int uploadWidth;
int uploadHeight;
// track the outlines of up to two boxes of non-transparent pixels.
// The reason for two boxes is that the common lights have something
// at the top and something at the bottom, with nothing inbetween.
// These are inclusive bounds of the rows / columns with non-0 alpha
int numBounds;
int bounds[2][2][2];
} picHeader_t;
int RowClear( W8 *rgba, int w, int h, int y ) {
int x;
for ( x = 0 ; x < w ; x++ ) {
if ( rgba[(y*w+x)*4+3] != 0 ) {
return 0;
}
}
return 1;
}
void Write5551( const char *tgaName, int w, int h, W8 *rgba, int hasAlpha ) {
unsigned short *s = _alloca( w*h*4 );
FILE *f;
picHeader_t *header = (picHeader_t *)s;
unsigned short *s_p;
int i;
int shorts;
W8 *tempMip;
W8 *rgba_p;
int b, x, y, c;
char newName[1024];
char *ext;
memset( header, 0, sizeof( *header ) );
header->hasAlpha = hasAlpha;
header->srcWidth = w;
header->srcHeight = h;
header->uploadWidth = w;
header->uploadHeight = h;
if ( !hasAlpha ) {
// convert from 24 bit to 32 bit
W8 *newPic = _alloca( w * h * 4 );
for ( i = 0 ; i < w*h ; i++ ) {
newPic[i*4+0] = rgba[i*3+0];
newPic[i*4+1] = rgba[i*3+1];
newPic[i*4+2] = rgba[i*3+2];
newPic[i*4+3] = 255;
}
rgba = newPic;
}
// find the bounding boxes for more efficient drawing
header->numBounds = 1;
for ( y = 0 ; y < h ; y++ ) {
if ( !RowClear( rgba, w, h, y ) ) {
// this row is needed
header->bounds[0][0][1] = y;
break;
}
}
for ( y = h-1 ; y >= 0 ; y-- ) {
if ( !RowClear( rgba, w, h, y ) ) {
// this row is needed
header->bounds[0][1][1] = y;
break;
}
}
// if the middle row is clear, make two boxes
// We could make a better test, but this catches the ones we care about...
if ( header->bounds[0][0][1] < h/2 && header->bounds[0][1][1] > h / 2 && RowClear( rgba, w, h, h/2 ) ) {
header->numBounds = 2;
header->bounds[1][1][1] = header->bounds[0][1][1];
for ( y = h/2-1 ; y >= 0 ; y-- ) {
if ( !RowClear( rgba, w, h, y ) ) {
header->bounds[0][1][1] = y;
break;
}
}
for ( y = h/2+1 ; y < h ; y++ ) {
if ( !RowClear( rgba, w, h, y ) ) {
header->bounds[1][0][1] = y;
break;
}
}
}
for ( b = 0 ; b < header->numBounds ; b++ ) {
for ( x = 0 ; x < w ; x++ ) {
for ( y = header->bounds[b][0][1] ; y <= header->bounds[b][1][1] ; y++ ) {
if ( rgba[(y*w+x)*4+3] != 0 ) {
// this column is needed
header->bounds[b][0][0] = x;
break;
}
}
if ( y <= header->bounds[b][1][1] ) {
break;
}
}
for ( x = w-1 ; x >= 0 ; x-- ) {
for ( y = header->bounds[b][0][1] ; y <= header->bounds[b][1][1] ; y++ ) {
if ( rgba[(y*w+x)*4+3] != 0 ) {
// this column is needed
header->bounds[b][1][0] = x;
break;
}
}
if ( y <= header->bounds[b][1][1] ) {
break;
}
}
}
s_p = (unsigned short *)(header+1);
while ( 1 ) {
rgba_p = rgba;
// convert to 5551
for ( i = 0 ; i < w*h ; i++, rgba_p+=4 ) {
int r = rgba_p[0];
int g = rgba_p[1];
int b = rgba_p[2];
int a = rgba_p[3];
*s_p++ = ((r>>3)<<11) | ((g>>3)<<6) | ((b>>3)<<1) | (a>>7);
}
if ( w == 1 && h == 1 ) {
break;
}
// mip map
w >>= 1;
if ( w == 0 ) {
w = 1;
}
h >>= 1;
if ( h == 0 ) {
h = 1;
}
tempMip = _alloca( w * h * 4 );
for ( y = 0 ; y < h ; y++ ) {
for ( x = 0 ; x < w ; x++ ) {
for ( c = 0 ; c < 4 ; c++ ) {
tempMip[(y*w+x)*4+c] = (
rgba[((y*2+0)*w*2+(x*2+0))*4+c] +
rgba[((y*2+0)*w*2+(x*2+1))*4+c] +
rgba[((y*2+1)*w*2+(x*2+0))*4+c] +
rgba[((y*2+1)*w*2+(x*2+1))*4+c] ) >> 2;
}
}
}
rgba = tempMip;
}
shorts = s_p - s;
// byte swap
#if 0
for ( i = 0 ; i < shorts ; i++ ) {
int temp = ((W8 *)s)[i*2+0];
((W8 *)s)[i*2+0] = ((W8 *)s)[i*2+1];
((W8 *)s)[i*2+1] = temp;
}
#endif
// write
strcpy( newName, tgaName );
ext = strstr( newName, ".tga" );
strcpy( ext, ".5551" );
f = fopen( newName, "wb" );
if( f == NULL ) {
printf( "Could not open file (%s) for write!\n", newName );
return;
}
fwrite( s, 2, shorts, f );
fclose( f );
}
#include <assert.h>
void UpdateSingleSprite( const char *srcTGA, const char *destTGA ) {
W8 *rgba;
int width, height;
int i;
// HACK HACK HACK just to convert the single health pack sprite without the
// trademarked "red cross"
LoadTGA( srcTGA, &rgba, &width, &height );
assert( rgba );
assert( width == 64 && height == 64 );
// JDC: outline the image to avoid dark halos with filtering
for ( i = 0 ; i < 8 ; i++ ) {
OutlineImage( rgba, 64, 64 );
}
for ( i = 0 ; i < 64*64 ; i++ ) {
if ( rgba[i*4+3] == 1 ) {
rgba[i*4+3] = 0;
}
}
WriteTGA( destTGA, 32, 64, 64, rgba, 0, 1 );
Write5551( destTGA, 64, 64, rgba, 1 );
}
/*
-----------------------------------------------------------------------------
Function: PML_LoadPage() -Save image data from page file.
Parameters: nPage -[in] Page number to save.
filename -[in] Pointer to string with filename.
buffer -[in] Allocated memory buffer to hold image data.
buffer2 -[in] Allocated memory buffer to hold hq2x data.
Returns: Non-zero on success, otherwise zero.
Notes:
-----------------------------------------------------------------------------
*/
PRIVATE W8 PML_SaveGFXPage( W32 nPage, const char *filename,
W8 *buffer, W8 *buffer2, _boolean iswall, W32 GunFlash )
{
W16 x, y;
W8 *data;
W8 *ptr;
W16 temp;
W8 r,g,b;
W16 clength; // Chunk length
data = (PW8)PML_LoadPage( nPage, &clength );
if( data == NULL )
{
return 0;
}
if( nPage < PMSpriteStart )
{
// simple 64x64 image
W8 *rgb = (W8 *)_alloca( 64*64*3 );
for( x = 0; x < 64; ++x )
{
for( y = 0; y < 64; ++y )
{
temp = ( data[ (x<<6)+y ] ) * 3;
// gamepal is in 6 bit color
r = gamepal[ temp ];
g = gamepal[ temp+1 ];
b = gamepal[ temp+2 ];
ptr = rgb + ( ( (y << 6) + x ) * 3 );
ptr[ 0 ] = ( r << 2 ) | ( r >> 4 );
ptr[ 1 ] = ( g << 2 ) | ( g >> 4 );
ptr[ 2 ] = ( b << 2 ) | ( b >> 4 );
}
}
WriteTGA( filename, 24, 64, 64, rgb, 0, 1 );
Write5551( filename, 64, 64, rgb, 0 );
}
else if( nPage >= PMSpriteStart && nPage < PMSoundStart )
{
W16 *cmdptr;
short *linecmds;
t_compshape *shape;
int x, y;
W8 *rgba = (W8 *)_alloca( 64*64*4 );
int i;
// all transparent at the beginning
memset( rgba, 0, 64*64*4 );
// draw the spans into the buffer
shape = (t_compshape *)data;
cmdptr = shape->dataofs;
for( x = shape->leftpix; x <= shape->rightpix; ++x )
{
linecmds = (short *)( data + *cmdptr++ );
for( ; *linecmds; linecmds += 3 )
{
i = linecmds[ 2 ] / 2 + linecmds[ 1 ];
for( y = linecmds[ 2 ] / 2; y < linecmds[ 0 ] / 2; ++y, ++i )
{
temp = ( data[ i ] ) * 3;
r = gamepal[ temp ];
g = gamepal[ temp+1 ];
b = gamepal[ temp+2 ];
ptr = rgba + ( (y * 64 + x) * 4 );
ptr[ 0 ] = ( r << 2 ) | ( r >> 4 );
ptr[ 1 ] = ( g << 2 ) | ( g >> 4 );
ptr[ 2 ] = ( b << 2 ) | ( b >> 4 );
ptr[ 3 ] = 255;
}
}
}
// JDC: outline the image to avoid dark halos with filtering
for ( i = 0 ; i < 8 ; i++ ) {
OutlineImage( rgba, 64, 64 );
}
for ( i = 0 ; i < 64*64 ; i++ ) {
if ( rgba[i*4+3] == 1 ) {
rgba[i*4+3] = 0;
}
}
WriteTGA( filename, 32, 64, 64, rgba, 0, 1 );
Write5551( filename, 64, 64, rgba, 1 );
}
else
{
MM_FREE( data );
printf( "Out of bounds page number passed into PML_SavePage()!\n" );
return 0;
}
MM_FREE( data );
return 1;
}
/*
-----------------------------------------------------------------------------
Function: PML_SaveSoundPage() -Save sound data from Page file.
Parameters: nPage -[in] Page number to save.
filename -[in] Pointer to string with filename.
buffer -[in] Allocated memory buffer to hold sound data.
size -[in] Size of allocated memory buffer.
Returns: Non-zero on success, otherwise zero.
Notes:
-----------------------------------------------------------------------------
*/
PRIVATE W8 PML_SaveSoundPage( W32 nPage, char *filename,
W8 *buffer,
W32 size )
{
static W16 totallength = 0;
W8 *data;
W16 clength; // Chunk length
if( nPage < PMSoundStart || nPage > PMNumBlocks )
{
printf( "Out of bounds page number passed into PML_SaveSound()!\n" );
return 1;
}
data = (PW8) PML_LoadPage( nPage, &clength );
if( data == NULL )
{
return 1;
}
if( totallength > size )
{
printf( "[wolf_pmc] Buffer not large enough!\n" );
return 2;
}
memcpy( buffer + totallength, data, clength );
totallength += clength;
if( clength < 4096 )
{
write_wav( filename, buffer, totallength, 1, SAMPLERATE, 1 );
totallength = 0;
}
MM_FREE( data );
return 0;
}
/*
-----------------------------------------------------------------------------
Function: PML_Shutdown() -Shutdown page cache.
Parameters: Nothing.
Returns: Nothing.
Notes:
-----------------------------------------------------------------------------
*/
PRIVATE void PML_Shutdown()
{
if( PageFile )
{
fclose( PageFile );
PageFile = NULL;
}
if( PMPages )
{
MM_FREE( PMPages );
}
}
/*
-----------------------------------------------------------------------------
Function: PExtractor() -Interface to page manager.
Parameters: extension -[in] Ponter to string with file extenion of data
files.
Returns: Nothing.
Notes:
-----------------------------------------------------------------------------
*/
PUBLIC _boolean PExtractor( const char *extension, W16 version )
{
W32 i, j;
char filename[ 256 ];
W8 *buffer, *buffer2;
W32 Flash;
//
// Setup
//
if( 0 == FS_Mkdir( GFXWALLDIR ) )
{
printf( "[%s] Could not create directory (%s)!\n", "PExtractor", GFXWALLDIR );
return false;
}
if( version == SOD_PAK || version == SDM_PAK )
{
if( 0 == FS_Mkdir( SODGFXSPRITEDIR ) )
{
printf( "[%s] Could not create directory (%s)!\n", "PExtractor", GFXSPRITEDIR );
return false;
}
if( 0 == FS_Mkdir( SODSFXDIR ) )
{
printf( "[%s] Could not create directory (%s)!\n", "PExtractor", SODSFXDIR );
return false;
}
}
else
{
if( 0 == FS_Mkdir( GFXSPRITEDIR ) )
{
printf( "[%s] Could not create directory (%s)!\n", "PExtractor", GFXSPRITEDIR );
return false;
}
if( 0 == FS_Mkdir( SFXDIR ) )
{
printf( "[%s] Could not create directory (%s)!\n", "PExtractor", SFXDIR );
return false;
}
}
if( ! PML_OpenPageFile( extension ) )
{
PML_Shutdown();
return false;
}
//
// Allocate buffers
//
buffer = MM_MALLOC( 64 * 64 * 2 );
if( buffer == NULL )
{
PML_Shutdown();
return false;
}
buffer2 = MM_MALLOC( 128 * 128 * 4 );
if( buffer2 == NULL )
{
MM_FREE( buffer );
PML_Shutdown();
return false;
}
//
// Decode Page data
//
printf( "Decoding Page Data...\n" );
for( i = 0, j = 0; i < PMSpriteStart; ++i, ++j )
{
// Hacks
if( version == WL6_PAK || version == WL1_PAK )
{
if( 98 == j )
{
j = 126;
}
}
cs_snprintf( filename, sizeof( filename ), "%s/%.3d.tga", GFXWALLDIR, j );
PML_SaveGFXPage( i, filename, buffer, buffer2, 1, 0 );
}
for( i = PMSpriteStart, j = 0; i < PMSoundStart; ++i, ++j )
{
// Hacks
if( version == WL1_PAK )
{
if( j == 50 )
{
j = 54;
}
if( j == 191 )
{
j = 300;
i += 109;
}
if( j == 311 )
{
j = 431;
i += 101;
}
if( j == 439 )
{
j = 514;
}
}
if( version == WL6_PAK )
{
if( j == 50 )
{
j = 54;
}
if( j == 389 )
{
j = 408;
}
if( j == 439 )
{
j = 514;
}
}
if( version == SDM_PAK )
{
if( j == 401 )
{
j = 514;
}
}
if( version == SOD_PAK )
{
if( j == 292 )
{
j = 374;
}
if( j == 408 )
{
j = 439;
}
}
if( version == SOD_PAK || version == SDM_PAK )
{
cs_snprintf( filename, sizeof( filename ), "%s/%.3d.tga", SODGFXSPRITEDIR, j );
}
else
{
cs_snprintf( filename, sizeof( filename ), "%s/%.3d.tga", GFXSPRITEDIR, j );
}
if( j == 531 ||
j == 532 ||
j == 526 ||
j == 521 )
{
Flash = j;
}
else
{
Flash = 0;
}
PML_SaveGFXPage( i, filename, buffer, buffer2, 0, Flash );
}
for( i = PMSoundStart, j = 0; i < PMNumBlocks-1; ++i, ++j )
{
if( version == SOD_PAK || version == SDM_PAK )
{
cs_snprintf( filename, sizeof( filename ), "%s/%.3d.wav", SODSFXDIR, j );
}
else
{
cs_snprintf( filename, sizeof( filename ), "%s/%.3d.wav", SFXDIR, j );
}
PML_SaveSoundPage( i, filename, buffer2, 128 * 128 * 4 );
}
//
// Shutdown
//
MM_FREE( buffer );
MM_FREE( buffer2 );
PML_Shutdown();
return true;
}