raze-gles/polymer/eduke32/source/sw/src/jnstub.c

3744 lines
99 KiB
C
Raw Normal View History

//-------------------------------------------------------------------------
/*
Copyright (C) 1996, 2005 - 3D Realms Entertainment
This file is NOT part of Shadow Warrior version 1.2
However, it is either an older version of a file that is, or is
some test code written during the development of Shadow Warrior.
This file is provided purely for educational interest.
Shadow Warrior 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
#include "build.h"
#include "editor.h"
#include "cache1d.h"
#include "keys.h"
#include "names2.h"
#include "game.h"
#include "tags.h"
#include "pal.h"
#include "common.h"
#include "common_game.h"
#define M_RED 102
#define M_BLUE 198
void ToggleFAF(void); // brooms.c
void FAF_AfterDrawRooms(void); // brooms.c
void ResetBuildFAF(void); // brooms.c
// Jim's Vars
#define BUILD_DEV_VER 0 // True if this is the developer version of build.
// Idle time counter
//int idleclock=0; // How much time is spent not touching the keyboard.
//int slackerclock=0; // Accumulated no keyboard time, adds every 30 secs
//int oldtotalclock=0;
// Sprite lists
int numsprite[MAXSPRITES], multisprite[MAXSPRITES];
// Next available tag tracking vars
short siNextTag = 1; // Shows next available tag if there
// is an open gap in tagging
short siNextEndTag = 1; // Shows the hightest possible next
// tag
int loaded_numwalls;
// Boolean flags used for sprite searching
SWBOOL bFindPicNum = TRUE; // Default
SWBOOL bFindHiTag = FALSE;
SWBOOL bFindLowTag = FALSE;
SWBOOL bVoxelsOn = TRUE; // Turn voxels on by default
SWBOOL bSpinBobVoxels = TRUE; // Do twizzly stuff to voxels
SWBOOL bAutoSize = TRUE; // Autosizing on/off
int nextvoxid = 0;
// Globals used to hold current sprite type being searched for.
short FindPicNum = 0;
short FindSpriteNum = 0;
// My Function Prototypes
void ContextHelp(short spritenum);
void LoadKVXFromScript(char *filename);
//void LogUserTime( SWBOOL bIsLoggingIn );
// voxelarray format is:
// spritenumber, voxelnumber
extern int aVoxelArray[MAXTILES];
// Ken ALT highlighted array
extern short highlightsector[MAXSECTORS];
extern short highlightsectorcnt;
int DispMono = FALSE;
//
// KENS setup variables
//
#define MAX_STAG_INFO 1024
typedef struct
{
char name[64];
int flags;
} STAG_INFO, *STAG_INFOp;
STAG_INFO StagInfo[MAX_STAG_INFO];
void PrintStatus(char *string, int num, char x, char y, char color);
#define NUMOPTIONS 8
char option[NUMOPTIONS] = {0, 0, 0, 0, 0, 0, 1, 0};
char default_buildkeys[NUMBUILDKEYS] =
{
0xc8, 0xd0, 0xcb, 0xcd, 0x2a, 0x9d, 0x1d, 0x39,
0x1e, 0x2c, 0xd1, 0xc9, 0x33, 0x34,
0x9c, 0x1c, 0xd, 0xc, 0xf, 0x45
};
#define MODE_3D 200
extern short pointhighlight, linehighlight;
extern short asksave;
short ExtSectorTag[MAXSECTORS][4];
static char tempbuf[256];
char ds[256];
enum
{
CAPTION_NONE,
CAPTION_DEFAULT,
CAPTION_NAMES,
CAPTION_MOST,
CAPTION_ALL,
CAPTION_MAX,
};
short CaptionMode = CAPTION_NAMES;
// RIGHT ALT selection key
extern short highlightsector[MAXSECTORS];
extern short highlightsectorcnt;
// RIGHT SHIFT selection key
#define SPRITE_FLAG 16384
extern short highlight[MAXWALLS+MAXSPRITES]; // sprite nums are + 16348
extern short highlightcnt;
// Variables copied with the tab key
extern int32_t temppicnum, tempcstat, templotag, temphitag, tempextra;
void SectorMoveFloorZ(int);
void SectorMoveCeilingZ(int);
void BuildStagTable(void);
void Message(char *string, char color);
void ShowMessage(void);
void ShadeMenu(void);
void FindNextTag(void);
void ShowNextTag(void);
void FindSprite(short picnum, short findspritenum);
void FindNextSprite(short picnum);
void SetClipdist2D(void);
void DrawClipBox(short spritenum);
//printext16 parameters:
//printext16(int xpos, int ypos, short col, short backcol,
// char name[82], char fontsize)
// xpos 0-639 (top left)
// ypos 0-479 (top left)
// col 0-15
// backcol 0-15, -1 is transparent background
// name
// fontsize 0=8*8, 1=3*5
//drawline16 parameters:
// drawline16(int x1, int y1, int x2, int y2, char col)
// x1, x2 0-639
// y1, y2 0-143 (status bar is 144 high, origin is top-left of STATUS BAR)
// col 0-15
//Detecting 2D / 3D mode:
// qsetmode is 200 in 3D mode
// qsetmode is 350/480 in 2D mode
//
//You can read these variables when F5-F8 is pressed in 3D mode only:
//
// If (searchstat == 0) WALL searchsector=sector, searchwall=wall
// If (searchstat == 1) CEILING searchsector=sector
// If (searchstat == 2) FLOOR searchsector=sector
// If (searchstat == 3) SPRITE searchsector=sector, searchwall=sprite
// If (searchstat == 4) MASKED WALL searchsector=sector, searchwall=wall
//
// searchsector is the sector of the selected item for all 5 searchstat's
//
// searchwall is undefined if searchstat is 1 or 2
// searchwall is the wall if searchstat = 0 or 4
// searchwall is the sprite if searchstat = 3 (Yeah, I know - it says wall,
// but trust me, it's the sprite number)
void
ResetKeys(void)
{
unsigned i;
for (i = 0; i < SIZ(keystatus); i++)
{
KEY_PRESSED(i) = 0;
}
}
void ExtPreCheckKeys(void)
{
ToggleFAF();
}
// Toggle sprites on/off. Good for frame rate checks.
SWBOOL DebugActorFreeze = 0;
void
ToggleSprites()
{
spritetype *tspr;
DebugActorFreeze++;
if (DebugActorFreeze > 2)
DebugActorFreeze = 0;
// Don't show any sprites, period
if (DebugActorFreeze == 2)
{
short i;
for (i = 0, tspr = &sprite[0]; i < MAXSPRITES; i++, tspr++)
{
SET(tspr->cstat, CSTAT_SPRITE_INVISIBLE);
// if (TEST(tspr->cstat, CSTAT_SPRITE_BLOCK))
// {
// SET(tspr->extra, SPRX_BLOCK);
// RESET(tspr->cstat, CSTAT_SPRITE_BLOCK);
// }
}
}
// Show all sprites except actors and ST's
if (DebugActorFreeze == 1)
{
short i;
for (i = 0, tspr = &sprite[0]; i < MAXSPRITES; i++, tspr++)
{
switch (tspr->picnum)
{
case COOLIE_RUN_R0:
case ZOMBIE_RUN_R0:
case NINJA_RUN_R0:
case SERP_RUN_R0:
case LAVA_RUN_R0:
case SKEL_RUN_R0:
case GORO_RUN_R0:
case HORNET_RUN_R0:
case SKULL_R0:
case RIPPER_RUN_R0:
case 2307: // ST1
case 2308: // ST2
case 2309: // QJ
case 2310: // QJD
case 2311: // QSJ
case 2312: // QSCN
case 2313: // QEXIT
SET(tspr->cstat, CSTAT_SPRITE_INVISIBLE);
// if (TEST(tspr->cstat, CSTAT_SPRITE_BLOCK))
// {
// SET(tspr->extra, SPRX_BLOCK);
// RESET(tspr->cstat, CSTAT_SPRITE_BLOCK);
// }
break;
}
}
}
// Show all sprites
if (DebugActorFreeze == FALSE)
{
short i;
for (i = 0, tspr = &sprite[0]; i < MAXSPRITES; i++, tspr++)
{
RESET(tspr->cstat, CSTAT_SPRITE_INVISIBLE);
// if (TEST(tspr->extra, SPRX_BLOCK))
// SET(tspr->cstat, CSTAT_SPRITE_BLOCK);
}
}
}
void
DoAutoSize(spritetype *tspr)
{
short i;
if (!bAutoSize)
return;
switch (tspr->picnum)
{
case ICON_STAR: // 1793
break;
case ICON_UZI: // 1797
tspr->xrepeat = 43;
tspr->yrepeat = 40;
break;
case ICON_UZIFLOOR: // 1807
tspr->xrepeat = 43;
tspr->yrepeat = 40;
break;
case ICON_LG_UZI_AMMO: // 1799
break;
case ICON_HEART: // 1824
break;
case ICON_HEART_LG_AMMO: // 1820
break;
case ICON_GUARD_HEAD: // 1814
break;
case ICON_FIREBALL_LG_AMMO: // 3035
break;
case ICON_ROCKET: // 1843
break;
case ICON_SHOTGUN: // 1794
tspr->xrepeat = 57;
tspr->yrepeat = 58;
break;
case ICON_LG_ROCKET: // 1796
break;
case ICON_LG_SHOTSHELL: // 1823
break;
case ICON_MICRO_GUN: // 1818
break;
case ICON_MICRO_BATTERY: // 1800
break;
case ICON_GRENADE_LAUNCHER: // 1817
tspr->xrepeat = 54;
tspr->yrepeat = 52;
break;
case ICON_LG_GRENADE: // 1831
break;
case ICON_LG_MINE: // 1842
break;
case ICON_RAIL_GUN: // 1811
tspr->xrepeat = 50;
tspr->yrepeat = 54;
break;
case ICON_RAIL_AMMO: // 1812
break;
case ICON_SM_MEDKIT: // 1802
break;
case ICON_MEDKIT: // 1803
break;
case ICON_CHEMBOMB:
tspr->xrepeat = 64;
tspr->yrepeat = 47;
break;
case ICON_FLASHBOMB:
tspr->xrepeat = 32;
tspr->yrepeat = 34;
break;
case ICON_NUKE:
break;
case ICON_CALTROPS:
tspr->xrepeat = 37;
tspr->yrepeat = 30;
break;
case ICON_BOOSTER: // 1810
tspr->xrepeat = 30;
tspr->yrepeat = 38;
break;
case ICON_HEAT_CARD: // 1819
tspr->xrepeat = 46;
tspr->yrepeat = 47;
break;
case ICON_REPAIR_KIT: // 1813
break;
case ICON_EXPLOSIVE_BOX: // 1801
break;
case ICON_ENVIRON_SUIT: // 1837
break;
case ICON_FLY: // 1782
break;
case ICON_CLOAK: // 1826
break;
case ICON_NIGHT_VISION: // 3031
tspr->xrepeat = 59;
tspr->yrepeat = 71;
break;
case ICON_NAPALM: // 3046
break;
case ICON_RING: // 3050
break;
case ICON_RINGAMMO: // 3054
break;
case ICON_NAPALMAMMO: // 3058
break;
case ICON_GRENADE: // 3059
break;
case ICON_ARMOR: // 3030
tspr->xrepeat = 82;
tspr->yrepeat = 84;
break;
case BLUE_KEY: // 1766
break;
case RED_KEY: // 1770
break;
case GREEN_KEY: // 1774
break;
case YELLOW_KEY: // 1778
break;
case BLUE_CARD:
case RED_CARD:
case GREEN_CARD:
case YELLOW_CARD:
tspr->xrepeat = 36;
tspr->yrepeat = 33;
break;
case GOLD_SKELKEY:
case SILVER_SKELKEY:
case BRONZE_SKELKEY:
case RED_SKELKEY:
tspr->xrepeat = 39;
tspr->yrepeat = 45;
break;
case SKEL_LOCKED:
case SKEL_UNLOCKED:
tspr->xrepeat = 47;
tspr->yrepeat = 40;
break;
case RAMCARD_LOCKED:
case RAMCARD_UNLOCKED:
case CARD_LOCKED:
case CARD_UNLOCKED:
break;
default:
break;
}
}
// Rotation angles for sprites
short rotang = 0;
void
ExtAnalyzeSprites(int32_t ourx, int32_t oury, int32_t oura, int32_t smoothr)
{
int i, currsprite;
spritetype *tspr;
UNREFERENCED_PARAMETER(ourx);
UNREFERENCED_PARAMETER(oury);
UNREFERENCED_PARAMETER(oura);
UNREFERENCED_PARAMETER(smoothr);
rotang += 4;
if (rotang > 2047)
rotang = 0;
for (i = 0, tspr = &tsprite[0]; i < spritesortcnt; i++, tspr++)
{
// Take care of autosizing
DoAutoSize(tspr);
tspr->shade += 6;
if (sector[tspr->sectnum].ceilingstat & 1)
tspr->shade += sector[tspr->sectnum].ceilingshade;
else
tspr->shade += sector[tspr->sectnum].floorshade;
if (tspr->picnum == ICON_ARMOR)
{
if (tspr->pal != 19) // Red
tspr->pal = 17; // Gray
}
// Check for voxels
if (bVoxelsOn)
{
if (bSpinBobVoxels)
{
switch (tspr->picnum)
{
case ICON_STAR: // 1793
case ICON_UZI: // 1797
case ICON_UZIFLOOR: // 1807
case ICON_LG_UZI_AMMO: // 1799
case ICON_HEART: // 1824
case ICON_HEART_LG_AMMO: // 1820
case ICON_GUARD_HEAD: // 1814
case ICON_FIREBALL_LG_AMMO: // 3035
case ICON_ROCKET: // 1843
case ICON_SHOTGUN: // 1794
case ICON_LG_ROCKET: // 1796
case ICON_LG_SHOTSHELL: // 1823
case ICON_MICRO_GUN: // 1818
case ICON_MICRO_BATTERY: // 1800
case ICON_GRENADE_LAUNCHER: // 1817
case ICON_LG_GRENADE: // 1831
case ICON_LG_MINE: // 1842
case ICON_RAIL_GUN: // 1811
case ICON_RAIL_AMMO: // 1812
case ICON_SM_MEDKIT: // 1802
case ICON_MEDKIT: // 1803
case ICON_BOOSTER: // 1810
case ICON_HEAT_CARD: // 1819
case ICON_REPAIR_KIT: // 1813
case ICON_EXPLOSIVE_BOX: // 1801
case ICON_ENVIRON_SUIT: // 1837
case ICON_FLY: // 1782
case ICON_CLOAK: // 1826
case ICON_NIGHT_VISION: // 3031
case ICON_NAPALM: // 3046
case ICON_RING: // 3050
// case ICON_GOROAMMO: // 3035
// case ICON_HEARTAMMO: // 1820
case ICON_RINGAMMO: // 3054
case ICON_NAPALMAMMO: // 3058
case ICON_GRENADE: // 3059
// case ICON_OXYGEN: // 1800
case ICON_ARMOR: // 3030
case BLUE_KEY: // 1766
case RED_KEY: // 1770
case GREEN_KEY: // 1774
case YELLOW_KEY: // 1778
case ICON_CHEMBOMB:
case ICON_FLASHBOMB:
case ICON_NUKE:
case ICON_CALTROPS:
tspr->ang = rotang;
// tspr->z+=(sintable[(rotang*2)%2047]/16);
break;
}
}
if (aVoxelArray[tspr->picnum] >= 0)
{
// Turn on voxels
tspr->picnum = aVoxelArray[tspr->picnum]; // Get the voxel number
tspr->cstat |= 48; // Set stat to voxelize sprite
}
}
}
}
uint8_t*
BKeyPressed(void)
{
uint8_t* k;
for (k = (uint8_t*) & KEY_PRESSED(0); k < (uint8_t*) &KEY_PRESSED(SIZ(keystatus)); k++)
{
if (*k)
return k;
}
return NULL;
}
uint8_t*
KeyPressedRange(uint8_t* kb, uint8_t* ke)
{
uint8_t* k;
for (k = kb; k <= ke; k++)
{
if (*k)
return k;
}
return NULL;
}
void
ResetKeyRange(uint8_t* kb, uint8_t* ke)
{
uint8_t* k;
for (k = kb; k <= ke; k++)
{
*k = 0;
}
}
#if 0
void
ExtInit(void)
{
void InitPalette(void);
int i, fil;
initgroupfile(G_GrpFile());
if ((fil = open("setup.dat", O_BINARY | O_RDWR, S_IREAD)) != -1)
{
read(fil, &option[0], NUMOPTIONS);
read(fil, &default_buildkeys[0], NUMKEYS);
memcpy((void *) buildkeys, (void *) default_buildkeys, NUMKEYS); // Trick to make build
// use setup.dat keys
close(fil);
}
if (option[4] > 0)
option[4] = 0;
initmouse();
initengine();
vidoption = option[0];
xdim = vesares[option[6] & 15][0];
ydim = vesares[option[6] & 15][1];
#if 0
switch (option[0])
{
case 0:
initengine(0, chainxres[option[6] & 15], chainyres[option[6] >> 4]);
break;
case 1:
initengine(1, vesares[option[6] & 15][0], vesares[option[6] & 15][1]);
break;
default:
initengine(option[0], 320L, 200L);
}
#endif
InitPalette();
kensplayerheight = 58;
zmode = 0;
}
#endif
char *startwin_labeltext = "Starting Build Editor for Shadow Warrior...";
int
ExtInit(void)
{
int rv = 0;
#ifndef BUILD_DEV_VER
char ch;
printf("\n------------------------------------------------------------------------------\n");
printf("BUILD.EXE for Shadow Warrior\n\n");
printf("Copyright (c) 1993 - 1997, 3D Realms Entertainment.\n");
printf("\n");
printf("IMPORTANT: This editor and associated tools and utilities are NOT\n");
printf("shareware and may NOT be freely distributed to any BBS, CD, floppy, or\n");
printf("any other media. These tools may NOT be sold or repackaged for sale in\n");
printf("a commercial product.\n");
printf("\n");
printf("Any levels created with these editors and tools may only be used with the\n");
printf("full (registered) copy of Shadow Warrior, and not the shareware version.\n");
printf("Please refer to LICENSE.DOC for further information on levels created with\n");
printf("BUILD.EXE.\n");
printf("\n");
printf("Press <Y> if you have read and accepted the terms of LICENSE.DOC,\n");
printf("or any other key to abort the program. \n");
printf("\n");
ch = getch();
if (ch == 'y' || ch == 'Y') // if user press Y
{
#endif
void InitPalette(void);
int i, fil;
// Store user log in time
//LogUserTime(TRUE); // Send true because user is logging
// in.
#ifdef _WIN32
if (!access("user_profiles_enabled", F_OK))
#endif
{
char cwd[BMAX_PATH];
char *homedir;
int asperr;
#if defined(__linux) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
addsearchpath("/usr/share/games/jfsw");
addsearchpath("/usr/local/share/games/jfsw");
#elif defined(__APPLE__)
addsearchpath("/Library/Application Support/JFShadowWarrior");
#endif
if (getcwd(cwd,BMAX_PATH)) addsearchpath(cwd);
if ((homedir = Bgethomedir()))
{
Bsnprintf(cwd,sizeof(cwd),"%s/"
#if defined(_WIN32)
"JFShadowWarrior"
#elif defined(__APPLE__)
"Library/Application Support/JFShadowWarrior"
#else
".jfsw"
#endif
,homedir);
asperr = addsearchpath(cwd);
if (asperr == -2)
{
if (Bmkdir(cwd,S_IRWXU) == 0) asperr = addsearchpath(cwd);
else asperr = -1;
}
if (asperr == 0)
chdir(cwd);
free(homedir);
}
}
if (g_grpNamePtr == NULL)
{
const char *cp = getenv("SWGRP");
if (cp)
{
clearGrpNamePtr();
g_grpNamePtr = dup_filename(cp);
initprintf("Using \"%s\" as main GRP file\n", g_grpNamePtr);
}
}
initgroupfile(G_GrpFile());
/*
if ((fil = open("setup.dat", O_BINARY | O_RDWR, S_IREAD)) != -1)
{
read(fil, &option[0], NUMOPTIONS);
read(fil, &default_buildkeys[0], NUMKEYS);
memcpy((void *) buildkeys, (void *) default_buildkeys, NUMKEYS); // Trick to make build
// use setup.dat keys
close(fil);
}
*/
bpp = 8;
if (loadsetup("build.cfg") < 0) buildputs("Configuration file not found, using defaults.\n"), rv = 1;
Bmemcpy((void *)buildkeys,(void *)default_buildkeys,NUMBUILDKEYS); //Trick to make build use setup.dat keys
if (option[4] > 0)
option[4] = 0;
if (initengine())
{
wm_msgbox("Build Engine Initialisation Error",
"There was a problem initialising the Build engine: %s", engineerrstr);
return -1;
}
initinput();
initmouse();
InitPalette();
SW_InitMultiPsky();
kensplayerheight = 58;
zmode = 0;
#ifndef BUILD_DEV_VER
} // end user press Y
else
{
printf("------------------------------------------------------------------------------\n");
exit(0);
}
#endif
return rv;
}
void ExtPostInit(void)
{
}
void
ExtUnInit(void)
{
uninitgroupfile();
writesetup("build.cfg");
// Store user log in time
//LogUserTime(FALSE); // FALSE means user is logging out
// now.
}
void
SetSpriteExtra(void)
{
SPRITEp sp;
int i;
#define DEFAULT_SKILL 2
// for (sp = sprite; sp < &sprite[MAXSPRITES]; sp++)
for (sp = sprite; sp < &sprite[MAXSPRITES]; sp++)
{
if (sp->picnum == ST1)
{
if (sp->owner == -1)
sp->owner = 0;
}
else
{
sp->owner = -1;
}
if (sp->extra == -1)
{
sp->extra = 0;
SET(sp->extra, DEFAULT_SKILL);
}
}
// loaded_numwalls is what numwalls is after a load
// only new walls get their extra's set
if (loaded_numwalls != numwalls)
{
for (i = 0; i < numwalls; i++)
{
if (wall[i].extra != 0)
wall[i].extra = 0;
}
}
loaded_numwalls = numwalls;
}
void
ResetSpriteFound(void)
{
SPRITEp sp;
for (sp = sprite; sp < &sprite[MAXSPRITES]; sp++)
{
RESET(sp->extra, SPRX_FOUND);
}
}
// imported from allen code
void
Keys3D(void)
{
int i;
// 'PGUP - Move a floor/ceiling sector up 8 pixels.
if (keystatus[KEYSC_RCTRL] && keystatus[KEYSC_PGUP])
{
switch (searchstat)
{
case 1: // Ceiling
sector[searchsector].ceilingz -= (1024 * 8);
keystatus[KEYSC_PGUP] = 0;
break;
case 2: // Floor
sector[searchsector].floorz -= (1024 * 8);
keystatus[KEYSC_PGUP] = 0;
break;
}
}
// 'PGDN - Move a floor/ceiling sector down 8 pixels.
if (keystatus[KEYSC_RCTRL] && keystatus[KEYSC_PGDN])
{
switch (searchstat)
{
case 1: // Ceiling
sector[searchsector].ceilingz += (1024 * 8);
keystatus[KEYSC_PGDN] = 0;
break;
case 2: // Floor
sector[searchsector].floorz += (1024 * 8);
keystatus[KEYSC_PGDN] = 0;
break;
}
}
// R - Set relative mode on a floor/ceiling.
if (!keystatus[KEYSC_ENTER] && !keystatus[KEYSC_QUOTE] && keystatus[KEYSC_R])
{
switch (searchstat)
{
case 0:
case 4: // Wall
break;
case 1: // Ceiling
if (sector[searchsector].ceilingstat & 65)
Message("Ceiling Relative OFF", M_RED);
else
Message("Ceiling Relative ON", M_BLUE);
break;
case 2: // Floor
if (sector[searchsector].floorstat & 65)
Message("Floor Relative OFF", M_RED);
else
Message("Floor Relative ON", M_BLUE);
break;
case 3: // Sprite
break;
}
}
// '+ = Shade down a floor ceiling while keeping sprites constant
if (keystatus[KEYSC_QUOTE] && keystatus[KEYSC_GPLUS])
{
SWBOOL dospriteshade = FALSE;
keystatus[KEYSC_GPLUS] = 0;
switch (searchstat)
{
case 1:
if (sector[searchsector].ceilingstat & 1)
dospriteshade = TRUE;
if (sector[searchsector].ceilingshade > -128)
sector[searchsector].ceilingshade--;
break;
case 2:
if (!(sector[searchsector].ceilingstat & 1))
dospriteshade = TRUE;
if (sector[searchsector].floorshade > -128)
sector[searchsector].floorshade--;
break;
default:
break;
}
if (dospriteshade)
{
for (i = 0; i < MAXSPRITES; i++)
{
if (sprite[i].sectnum == searchsector)
{
if (sprite[i].shade < 127)
sprite[i].shade++;
}
}
}
}
// '- = Shade down a floor ceiling while keeping sprites constant
if (keystatus[KEYSC_QUOTE] && keystatus[KEYSC_GMINUS])
{
SWBOOL dospriteshade = FALSE;
keystatus[KEYSC_GMINUS] = 0;
switch (searchstat)
{
case 1:
if (sector[searchsector].ceilingstat & 1)
dospriteshade = TRUE;
if (sector[searchsector].ceilingshade < 127)
sector[searchsector].ceilingshade++;
break;
case 2:
if (!(sector[searchsector].ceilingstat & 1))
dospriteshade = TRUE;
if (sector[searchsector].floorshade < 127)
sector[searchsector].floorshade++;
break;
default:
break;
}
if (dospriteshade)
{
for (i = 0; i < MAXSPRITES; i++)
{
if (sprite[i].sectnum == searchsector)
{
if (sprite[i].shade > -128)
sprite[i].shade--;
}
}
}
}
// 'ENTER - Copies only the bitmap in the copy buffer to
// wall/ceiling/floor/sprite,
// whatever the cursor is pointing to. Does not copy x/y repeats etc.,
// like ENTER does.
if (keystatus[KEYSC_QUOTE] && keystatus[KEYSC_ENTER]) // ' ENTER
{
printext256(0, 0, 15, 0, "Put Graphic ONLY", 0);
keystatus[KEYSC_ENTER] = 0;
switch (searchstat)
{
case 0:
wall[searchwall].picnum = temppicnum;
break;
case 1:
sector[searchsector].ceilingpicnum = temppicnum;
break;
case 2:
sector[searchsector].floorpicnum = temppicnum;
break;
case 3:
sprite[searchwall].picnum = temppicnum;
break;
case 4:
wall[searchwall].overpicnum = temppicnum;
break;
}
}
// ;S
if (keystatus[KEYSC_SEMI] && keystatus[KEYSC_S]) // ; S
{
keystatus[KEYSC_S] = 0;
switch (searchstat)
{
case 0:
case 4:
for (i = 0; i < MAXWALLS; i++)
{
if (wall[i].picnum == temppicnum)
{
wall[i].shade = tempshade;
}
}
break;
case 1:
case 2:
for (i = 0; i < MAXSECTORS; i++)
{
if (searchstat)
if (sector[i].ceilingpicnum == temppicnum)
{
sector[i].ceilingshade = tempshade;
}
if (searchstat == 2)
if (sector[i].floorpicnum == temppicnum)
{
sector[i].floorshade = tempshade;
}
}
break;
case 3:
for (i = 0; i < MAXSPRITES; i++)
{
if (sprite[i].picnum == temppicnum)
{
sprite[i].shade = tempshade;
}
}
break;
}
}
// 'C - Does a global tile replacement using bitmap only, no x/y repeat,
// etc....
// Works for walls, sectors, or sprites.
if (keystatus[KEYSC_QUOTE] && keystatus[KEYSC_C]) // ' C
{
short searchpicnum = 0;
short w, start_wall, end_wall, currsector;
keystatus[KEYSC_C] = 0;
switch (searchstat)
{
case 0:
case 4:
searchpicnum = wall[searchwall].picnum;
if (highlightsectorcnt <= 0)
{
for (i = 0; i < MAXWALLS; i++)
{
if (wall[i].picnum == searchpicnum)
{
wall[i].picnum = temppicnum;
}
}
}
else
{
for (i = 0; i < highlightsectorcnt; i++)
{
currsector = highlightsector[i];
start_wall = sector[currsector].wallptr;
end_wall = start_wall + sector[currsector].wallnum;
for (w = start_wall; w < end_wall; w++)
{
if (wall[w].picnum == searchpicnum)
wall[w].picnum = temppicnum;
}
}
}
break;
case 1:
if (highlightsectorcnt <= 0)
{
searchpicnum = sector[searchsector].ceilingpicnum;
for (i = 0; i < MAXSECTORS; i++)
{
if (sector[i].ceilingpicnum == searchpicnum)
{
sector[i].ceilingpicnum = temppicnum;
}
}
}
else
{
for (i = 0; i < highlightsectorcnt; i++)
{
currsector = highlightsector[i];
if (sector[currsector].ceilingpicnum == searchpicnum)
sector[currsector].ceilingpicnum = temppicnum;
}
}
case 2:
searchpicnum = sector[searchsector].floorpicnum;
if (highlightsectorcnt <= 0)
{
for (i = 0; i < MAXSECTORS; i++)
{
if (sector[i].floorpicnum == searchpicnum)
{
sector[i].floorpicnum = temppicnum;
}
}
}
else
{
for (i = 0; i < highlightsectorcnt; i++)
{
currsector = highlightsector[i];
if (sector[currsector].floorpicnum == searchpicnum)
sector[currsector].floorpicnum = temppicnum;
}
}
break;
case 3:
searchpicnum = sprite[searchwall].picnum;
if (highlightsectorcnt <= 0)
{
for (i = 0; i < MAXSPRITES; i++)
{
if (sprite[i].picnum == searchpicnum)
sprite[i].picnum = temppicnum;
}
}
break;
default:
break;
}
}
// 'T - Set's the low tag of a wall/sector/sprite.
if (keystatus[KEYSC_QUOTE] && keystatus[KEYSC_T]) // ' T
{
keystatus[KEYSC_T] = 0;
switch (searchstat)
{
case 0:
case 4:
strcpy(tempbuf, "Wall lotag: ");
wall[searchwall].lotag =
getnumber256(tempbuf, wall[searchwall].lotag, 65536L, 1);
break;
case 1:
case 2:
strcpy(tempbuf, "Sector lotag: ");
sector[searchsector].lotag =
getnumber256(tempbuf, sector[searchsector].lotag, 65536L, 1);
break;
case 3:
strcpy(tempbuf, "Sprite lotag: ");
sprite[searchwall].lotag =
getnumber256(tempbuf, sprite[searchwall].lotag, 65536L, 1);
// Find the next lotag
if (sprite[searchwall].picnum == ST1)
{
FindNextTag();
ShowNextTag();
}
break;
}
}
// 'H - Sets the high tag of a wall/sector/sprite.
if (keystatus[KEYSC_QUOTE] && keystatus[KEYSC_H]) // ' H
{
keystatus[KEYSC_H] = 0;
switch (searchstat)
{
case 0:
case 4:
strcpy(tempbuf, "Wall hitag: ");
wall[searchwall].hitag =
getnumber256(tempbuf, wall[searchwall].hitag, 65536L, 1);
break;
case 1:
case 2:
strcpy(tempbuf, "Sector hitag: ");
sector[searchsector].hitag =
getnumber256(tempbuf, sector[searchsector].hitag, 65536L, 1);
break;
case 3:
strcpy(tempbuf, "Sprite hitag: ");
sprite[searchwall].hitag =
getnumber256(tempbuf, sprite[searchwall].hitag, 65536L, 1);
break;
}
}
// 'S - Sets the shade of a wall/sector/sprite using an entered input
// value
// between 0-65536.
if (keystatus[KEYSC_QUOTE] && keystatus[KEYSC_S]) // ' S
{
keystatus[KEYSC_S] = 0;
switch (searchstat)
{
case 0:
case 4:
strcpy(tempbuf, "Wall shade: ");
wall[searchwall].shade =
getnumber256(tempbuf, wall[searchwall].shade, 65536L, 1);
break;
case 1:
case 2:
strcpy(tempbuf, "Sector shade: ");
if (searchstat == 1)
sector[searchsector].ceilingshade =
getnumber256(tempbuf, sector[searchsector].ceilingshade, 65536L, 1);
if (searchstat == 2)
sector[searchsector].floorshade =
getnumber256(tempbuf, sector[searchsector].floorshade, 65536L, 1);
break;
case 3:
strcpy(tempbuf, "Sprite shade: ");
sprite[searchwall].shade =
getnumber256(tempbuf, sprite[searchwall].shade, 65536L, 1);
break;
}
}
// 'V - Sets sector visibility on a sector using an input value between
// 0-65536.
if (keystatus[KEYSC_QUOTE] && keystatus[KEYSC_V]) // ' V
{
keystatus[KEYSC_V] = 0;
switch (searchstat)
{
case 1:
case 2:
strcpy(tempbuf, "Sector visibility: ");
sector[searchsector].visibility =
getnumber256(tempbuf, sector[searchsector].visibility, 65536L, 1);
break;
}
}
// 'X - Toggles voxel sprites on/off
if (keystatus[KEYSC_QUOTE] && keystatus[KEYSC_X]) // ' X
{
keystatus[KEYSC_X] = 0;
bVoxelsOn = !bVoxelsOn;
}
// 'Z - Toggles voxel rotation on/off
if (keystatus[KEYSC_QUOTE] && keystatus[KEYSC_Z]) // ' Z
{
keystatus[KEYSC_Z] = 0;
bSpinBobVoxels = !bSpinBobVoxels;
}
// 'A - Toggles sprite autosizing on/off
if (keystatus[KEYSC_QUOTE] && keystatus[KEYSC_A]) // ' A
{
keystatus[KEYSC_A] = 0;
bAutoSize = !bAutoSize;
}
// 'M - Toggles sprites on/off
if (keystatus[KEYSC_QUOTE] && keystatus[KEYSC_M]) // ' M
{
keystatus[KEYSC_M] = 0;
ToggleSprites();
}
// 'P - Will copy palette to all sectors highlighted with R-Alt key
if (keystatus[KEYSC_QUOTE] && keystatus[KEYSC_P]) // ' P
{
short w, start_wall, end_wall, currsector;
keystatus[KEYSC_P] = 0;
for (i = 0; i < highlightsectorcnt; i++)
{
currsector = highlightsector[i];
sector[currsector].ceilingpal = temppal;
sector[currsector].floorpal = temppal;
// Do all the walls in the sector
start_wall = sector[currsector].wallptr;
end_wall = start_wall + sector[currsector].wallnum;
for (w = start_wall; w < end_wall; w++)
{
wall[w].pal = temppal;
}
}
}
// ;P - Will copy palette to all sectors highlighted with R-Alt key
if (keystatus[KEYSC_SEMI] && keystatus[KEYSC_P]) // ; P
{
short w, start_wall, end_wall, currsector;
keystatus[KEYSC_P] = 0;
for (i = 0; i < highlightsectorcnt; i++)
{
currsector = highlightsector[i];
if ((sector[currsector].ceilingpal == temppal && temppal != 0) || (temppal == 0 && sector[currsector].ceilingpal != 0))
sector[currsector].ceilingshade = 127;
if ((sector[currsector].floorpal == temppal && temppal != 0) || (temppal == 0 && sector[currsector].ceilingpal != 0))
sector[currsector].floorshade = 127;
// Do all the walls in the sector
start_wall = sector[currsector].wallptr;
end_wall = start_wall + sector[currsector].wallnum;
for (w = start_wall; w < end_wall; w++)
{
if ((wall[w].pal == temppal && temppal != 0) || (temppal == 0 && wall[w].pal != 0))
wall[w].shade = 127;
}
}
}
ShowMessage();
} // end Keys3D()
// Used to help print out the item status list
void
PrintStatus(char *string, int num, char x, char y, char color)
{
sprintf(tempbuf, "%s %d", string, num);
printext16(x * 8, ydim16+y * 8, color, -1, tempbuf, 0);
}
static int32_t sw_getnumber256(const char *namestart, int32_t num, int32_t maxnumber, char sign)
{
return _getnumber256(namestart, num, maxnumber, sign, NULL);
}
static int32_t sw_getnumber16(const char *namestart, int32_t num, int32_t maxnumber, char sign)
{
return _getnumber16(namestart, num, maxnumber, sign, NULL);
}
static void sw_printmessage256(const char *text)
{
printmessage256(0, 0, text);
}
static void sw_printmessage16(const char *text)
{
lastpm16time = totalclock;
_printmessage16(text);
}
void
MoreKeys(short searchstat, short searchwall, short searchsector, short pointhighlight)
{
typedef int32_t GET_NUM_FUNC (const char *, int32_t, int32_t, char);
typedef GET_NUM_FUNC *GET_NUM_FUNCp;
typedef void PRINT_MSG_FUNC (const char *);
typedef PRINT_MSG_FUNC *PRINT_MSG_FUNCp;
SPRITEp sp;
int i;
int value;
GET_NUM_FUNCp getnumber;
PRINT_MSG_FUNCp printmessage;
if (qsetmode == MODE_3D)
{
getnumber = sw_getnumber256;
printmessage = sw_printmessage256;
}
else
{
getnumber = sw_getnumber16;
printmessage = sw_printmessage16;
if (TEST(pointhighlight, SPRITE_FLAG))
{
searchstat = 3;
searchwall = RESET(pointhighlight, SPRITE_FLAG);
}
else
{
// for now make search stat invalid
searchstat = 5;
}
}
sp = &sprite[searchwall];
if (KEY_PRESSED(KEYSC_RALT) && KEY_PRESSED(KEYSC_RCTRL))
{
if (KEY_PRESSED(KEYSC_KPMINUS))
{
KEY_PRESSED(KEYSC_KPMINUS) = 0;
g_visibility = g_visibility - (g_visibility >> 3);
if (g_visibility < 0)
g_visibility = 16348;
}
else if (KEY_PRESSED(KEYSC_KPPLUS))
{
KEY_PRESSED(KEYSC_KPPLUS) = 0;
g_visibility = g_visibility + (g_visibility >> 3);
if (g_visibility > 16348)
g_visibility = 0;
}
}
if (keystatus[KEYSC_QUOTE])
{
if (keystatus[KEYSC_K]) // ' K
{
short data;
SPRITEp sp = &sprite[searchwall];
keystatus[KEYSC_K] = 0;
switch (searchstat)
{
case 3:
data = TEST(sp->extra, SPRX_SKILL);
//data = getnumber256(tempbuf, data, 65536L);
data++; // Toggle
if (data > 3)
data = 0;
RESET(sp->extra, SPRX_SKILL);
SET(sp->extra, data);
break;
}
}
if (keystatus[KEYSC_RSHIFT] || keystatus[KEYSC_LSHIFT])
{
if (keystatus[KEYSC_1])
{
keystatus[KEYSC_1] = 0;
keystatus[KEYSC_SEMI] = 0;
switch (searchstat)
{
case 3:
sprintf(tempbuf, "Sprite tag 11 (shade) (snum = %d): ", searchwall);
SPRITE_TAG11(searchwall) =
getnumber(tempbuf, SPRITE_TAG11(searchwall), 65536L, 0);
break;
}
printmessage(" ");
}
if (keystatus[KEYSC_2])
{
keystatus[KEYSC_2] = 0;
keystatus[KEYSC_SEMI] = 0;
switch (searchstat)
{
case 3:
strcpy(tempbuf, "Sprite tag 12 (pal): ");
SPRITE_TAG12(searchwall) =
getnumber(tempbuf, SPRITE_TAG12(searchwall), 65536L, 0);
break;
}
printmessage(" ");
}
if (keystatus[KEYSC_3])
{
keystatus[KEYSC_3] = 0;
switch (searchstat)
{
case 3:
strcpy(tempbuf, "Sprite tag 13 (xoffset/yoffset): ");
i = getnumber(tempbuf, SPRITE_TAG13(searchwall), 65536L, 0);
SET_SPRITE_TAG13(searchwall, i);
break;
}
printmessage(" ");
}
if (keystatus[KEYSC_4])
{
keystatus[KEYSC_4] = 0;
switch (searchstat)
{
case 3:
strcpy(tempbuf, "Sprite tag 14 (xrepeat/yrepeat): ");
i = getnumber(tempbuf, SPRITE_TAG14(searchwall), 65536L, 0);
SET_SPRITE_TAG14(searchwall, i);
break;
}
printmessage(" ");
}
if (keystatus[KEYSC_5])
{
keystatus[KEYSC_5] = 0;
switch (searchstat)
{
case 3:
strcpy(tempbuf, "Sprite tag 15 (z): ");
SPRITE_TAG15(searchwall) =
getnumber(tempbuf, SPRITE_TAG15(searchwall), 65536L, 0);
break;
}
printmessage(" ");
}
}
if (keystatus[KEYSC_1])
{
keystatus[KEYSC_1] = 0;
switch (searchstat)
{
case 0:
case 4:
strcpy(tempbuf, "Wall tag 1 (hitag): ");
wall[searchwall].hitag =
getnumber(tempbuf, wall[searchwall].hitag, 65536L, 0);
break;
case 1:
case 2:
strcpy(tempbuf, "Sector tag 1 (hitag): ");
sector[searchsector].hitag =
getnumber(tempbuf, sector[searchsector].hitag, 65536L, 0);
break;
case 3:
strcpy(tempbuf, "Sprite tag 1 (hitag): ");
SPRITE_TAG1(searchwall) =
getnumber(tempbuf, SPRITE_TAG1(searchwall), 65536L, 0);
break;
}
printmessage(" ");
}
if (keystatus[KEYSC_2])
{
keystatus[KEYSC_2] = 0;
switch (searchstat)
{
case 0:
case 4:
strcpy(tempbuf, "Wall tag 2 (lotag): ");
wall[searchwall].lotag =
getnumber(tempbuf, wall[searchwall].lotag, 65536L, 0);
break;
case 1:
case 2:
strcpy(tempbuf, "Sector tag 2 (lotag): ");
sector[searchsector].lotag =
getnumber(tempbuf, sector[searchsector].lotag, 65536L, 0);
break;
case 3:
strcpy(tempbuf, "Sprite tag 2 (lotag): ");
SPRITE_TAG2(searchwall) =
getnumber(tempbuf, SPRITE_TAG2(searchwall), 65536L, 0);
// Find the next lotag
if (sprite[searchwall].picnum == ST1)
{
FindNextTag();
ShowNextTag();
}
break;
}
printmessage(" ");
}
if (keystatus[KEYSC_3])
{
keystatus[KEYSC_3] = 0;
switch (searchstat)
{
case 0:
case 4:
strcpy(tempbuf, "Wall tag 3 (xpanning): ");
wall[searchwall].xpanning =
getnumber(tempbuf, wall[searchwall].xpanning, 65536L, 0);
break;
case 1:
case 2:
strcpy(tempbuf, "Sector tag 3 (ceilingxpanning): ");
sector[searchsector].ceilingxpanning =
getnumber(tempbuf, sector[searchsector].ceilingxpanning, 65536L, 0);
break;
case 3:
strcpy(tempbuf, "Sprite tag 3 (clipdist) : ");
SPRITE_TAG3(searchwall) =
getnumber(tempbuf, SPRITE_TAG3(searchwall), 65536L, 0);
break;
}
printmessage(" ");
}
if (keystatus[KEYSC_4])
{
keystatus[KEYSC_4] = 0;
switch (searchstat)
{
case 0:
case 4:
strcpy(tempbuf, "Wall tag 4 (ypanning): ");
wall[searchwall].ypanning =
getnumber(tempbuf, wall[searchwall].ypanning, 65536L, 0);
break;
case 1:
case 2:
strcpy(tempbuf, "Sector tag 4 (ceilingypanning): ");
sector[searchsector].ceilingypanning =
getnumber(tempbuf, sector[searchsector].ceilingypanning, 65536L, 0);
break;
case 3:
strcpy(tempbuf, "Sprite tag 4 (ang) : ");
SPRITE_TAG4(searchwall) =
getnumber(tempbuf, SPRITE_TAG4(searchwall), 65536L, 0);
break;
}
printmessage(" ");
}
if (keystatus[KEYSC_5])
{
keystatus[KEYSC_5] = 0;
switch (searchstat)
{
case 0:
case 4:
break;
case 1:
case 2:
strcpy(tempbuf, "Sector tag 5 (floorxpanning): ");
sector[searchsector].floorxpanning =
getnumber(tempbuf, sector[searchsector].floorxpanning, 65536L, 0);
break;
case 3:
strcpy(tempbuf, "Sprite tag 5 (xvel) : ");
SPRITE_TAG5(searchwall) =
getnumber(tempbuf, SPRITE_TAG5(searchwall), 65536L, 0);
break;
}
printmessage(" ");
}
if (keystatus[KEYSC_6])
{
keystatus[KEYSC_6] = 0;
switch (searchstat)
{
case 0:
case 4:
break;
case 1:
case 2:
strcpy(tempbuf, "Sector tag 6 (floorypanning): ");
sector[searchsector].floorypanning =
getnumber(tempbuf, sector[searchsector].floorypanning, 65536L, 0);
break;
case 3:
strcpy(tempbuf, "Sprite tag 6 (yvel) : ");
SPRITE_TAG6(searchwall) =
getnumber(tempbuf, SPRITE_TAG6(searchwall), 65536L, 0);
break;
}
printmessage(" ");
}
if (keystatus[KEYSC_7])
{
keystatus[KEYSC_7] = 0;
switch (searchstat)
{
case 0:
case 4:
break;
case 1:
case 2:
strcpy(tempbuf, "Sector tag 7 (floorypanning): ");
sector[searchsector].floorypanning =
getnumber(tempbuf, sector[searchsector].floorypanning, 65536L, 0);
break;
case 3:
strcpy(tempbuf, "Sprite tag 7 (zvel 1) <0-255> : ");
SPRITE_TAG7(searchwall) =
getnumber(tempbuf, SPRITE_TAG7(searchwall), 65536L, 0);
break;
}
printmessage(" ");
}
if (keystatus[KEYSC_8])
{
keystatus[KEYSC_8] = 0;
switch (searchstat)
{
case 0:
case 4:
break;
case 1:
case 2:
break;
case 3:
strcpy(tempbuf, "Sprite tag 8 (zvel 2) <0-255> : ");
SPRITE_TAG8(searchwall) =
getnumber(tempbuf, SPRITE_TAG8(searchwall), 65536L, 0);
break;
}
printmessage(" ");
}
if (keystatus[KEYSC_9])
{
keystatus[KEYSC_9] = 0;
switch (searchstat)
{
case 0:
case 4:
break;
case 1:
case 2:
break;
case 3:
strcpy(tempbuf, "Sprite tag 9 (owner 1) <0-255> : ");
SPRITE_TAG9(searchwall) =
getnumber(tempbuf, SPRITE_TAG9(searchwall), 65536L, 0);
break;
}
printmessage(" ");
}
if (keystatus[KEYSC_0])
{
keystatus[KEYSC_0] = 0;
switch (searchstat)
{
case 0:
case 4:
break;
case 1:
case 2:
break;
case 3:
strcpy(tempbuf, "Sprite tag 10 (owner 2) <0-255> : ");
SPRITE_TAG10(searchwall) =
getnumber(tempbuf, SPRITE_TAG10(searchwall), 65536L, 0);
break;
}
printmessage(" ");
}
}
if (!keystatus[KEYSC_SEMI])
return;
if (keystatus[KEYSC_RSHIFT] || keystatus[KEYSC_LSHIFT])
{
if (keystatus[KEYSC_1])
{
keystatus[KEYSC_1] = 0;
switch (searchstat)
{
case 3:
strcpy(tempbuf, "Boolean Sprite tag 11 (0 or 1): ");
value = !!TEST_BOOL11(sp);
value = getnumber(tempbuf, value, 65536L, 0);
if (value)
SET_BOOL11(sp);
else
RESET_BOOL11(sp);
break;
}
printmessage(" ");
}
}
else
{
if (keystatus[KEYSC_1])
{
keystatus[KEYSC_1] = 0;
switch (searchstat)
{
case 3:
strcpy(tempbuf, "Boolean Sprite tag 1 (0 or 1): ");
value = !!TEST_BOOL1(sp);
value = getnumber(tempbuf, value, 65536L, 0);
if (value)
SET_BOOL1(sp);
else
RESET_BOOL1(sp);
break;
}
printmessage(" ");
}
if (keystatus[KEYSC_2])
{
keystatus[KEYSC_2] = 0;
switch (searchstat)
{
case 3:
strcpy(tempbuf, "Boolean Sprite tag 2 (0 or 1): ");
value = !!TEST_BOOL2(sp);
value = getnumber(tempbuf, value, 65536L, 0);
if (value)
SET_BOOL2(sp);
else
RESET_BOOL2(sp);
break;
}
printmessage(" ");
}
if (keystatus[KEYSC_3])
{
keystatus[KEYSC_3] = 0;
switch (searchstat)
{
case 3:
strcpy(tempbuf, "Boolean Sprite tag 3 (0 or 1): ");
value = !!TEST_BOOL3(sp);
value = getnumber(tempbuf, value, 65536L, 0);
if (value)
SET_BOOL3(sp);
else
RESET_BOOL3(sp);
break;
}
printmessage(" ");
}
if (keystatus[KEYSC_4])
{
keystatus[KEYSC_4] = 0;
switch (searchstat)
{
case 3:
strcpy(tempbuf, "Boolean Sprite tag 4 (0 or 1): ");
value = !!TEST_BOOL4(sp);
value = getnumber(tempbuf, value, 65536L, 0);
if (value)
SET_BOOL4(sp);
else
RESET_BOOL4(sp);
break;
}
printmessage(" ");
}
if (keystatus[KEYSC_5])
{
keystatus[KEYSC_5] = 0;
switch (searchstat)
{
case 3:
strcpy(tempbuf, "Boolean Sprite tag 5 (0 or 1): ");
value = !!TEST_BOOL5(sp);
value = getnumber(tempbuf, value, 65536L, 0);
if (value)
SET_BOOL5(sp);
else
RESET_BOOL5(sp);
break;
}
printmessage(" ");
}
if (keystatus[KEYSC_6])
{
keystatus[KEYSC_6] = 0;
switch (searchstat)
{
case 3:
strcpy(tempbuf, "Boolean Sprite tag 6 (0 or 1): ");
value = !!TEST_BOOL6(sp);
value = getnumber(tempbuf, value, 65536L, 0);
if (value)
SET_BOOL6(sp);
else
RESET_BOOL6(sp);
break;
}
printmessage(" ");
}
if (keystatus[KEYSC_7])
{
keystatus[KEYSC_7] = 0;
switch (searchstat)
{
case 3:
strcpy(tempbuf, "Boolean Sprite tag 7 (0 or 1): ");
value = !!TEST_BOOL7(sp);
value = getnumber(tempbuf, value, 65536L, 0);
if (value)
SET_BOOL7(sp);
else
RESET_BOOL7(sp);
break;
}
printmessage(" ");
}
if (keystatus[KEYSC_8])
{
keystatus[KEYSC_8] = 0;
switch (searchstat)
{
case 3:
strcpy(tempbuf, "Boolean Sprite tag 8 (0 or 1): ");
value = !!TEST_BOOL8(sp);
value = getnumber(tempbuf, value, 65536L, 0);
if (value)
SET_BOOL8(sp);
else
RESET_BOOL8(sp);
break;
}
printmessage(" ");
}
if (keystatus[KEYSC_9])
{
keystatus[KEYSC_9] = 0;
switch (searchstat)
{
case 3:
strcpy(tempbuf, "Boolean Sprite tag 9 (0 or 1): ");
value = !!TEST_BOOL9(sp);
value = getnumber(tempbuf, value, 65536L, 0);
if (value)
SET_BOOL9(sp);
else
RESET_BOOL9(sp);
break;
}
printmessage(" ");
}
if (keystatus[KEYSC_0])
{
keystatus[KEYSC_0] = 0;
switch (searchstat)
{
case 3:
strcpy(tempbuf, "Boolean Sprite tag 10 (0 or 1): ");
value = !!TEST_BOOL10(sp);
value = getnumber(tempbuf, value, 65536L, 0);
if (value)
SET_BOOL10(sp);
else
RESET_BOOL10(sp);
break;
}
printmessage(" ");
}
}
}
#define COINCURSOR 2440
int intro;
void
ExtCheckKeysNotice(void)
{
#if 0
if (qsetmode == 200) // In 3D mode
{
if (intro < 600)
{
intro++;
sprintf(tempbuf, BUILD_VER_MSG);
printext256(46 * 8, (24 * 8) - 1, 0, -1, tempbuf, 1);
printext256(46 * 8, 24 * 8, 15, -1, tempbuf, 1);
rotatesprite((320 - 8) << 16, (200 - 8) << 16, 64 << 9, 0, COINCURSOR + (((4 - totalclock >> 3)) & 7), 0, 0, 0, 0, 0, xdim - 1, ydim - 1);
}
}
#endif
} // end
void
ExtCheckKeys(void)
{
extern short f_c;
// int ticdiff=0;
// Display BUILD notice
ExtCheckKeysNotice();
FAF_AfterDrawRooms();
// try it every time through the loop
SetSpriteExtra();
sector[0].extra = g_visibility;
// if(!BKeyPressed())
// ticdiff = totalclock-oldtotalclock; // Difference in tics from last time
// oldtotalclock = totalclock; // Set old clock to new time
// slackerclock += ticdiff;
// ticdiff = 0; // Set it back to 0!
if (qsetmode == 200) // In 3D mode
{
#define AVERAGEFRAMES 16
static int frameval[AVERAGEFRAMES], framecnt = 0;
int i;
i = totalclock;
if (i != frameval[framecnt])
{
sprintf(tempbuf, "%d", ((120 * AVERAGEFRAMES) / (i - frameval[framecnt])) + f_c);
printext256(0L, 0L, 1, -1, tempbuf, 1);
frameval[framecnt] = i;
}
framecnt = ((framecnt + 1) & (AVERAGEFRAMES - 1));
}
MoreKeys(searchstat, searchwall, searchsector, pointhighlight);
if (qsetmode == 200) // In 3D mode
{
Keys3D();
if (KEY_PRESSED(KEYSC_W))
{
KEY_PRESSED(KEYSC_W) = 0;
switch (searchstat)
{
case 0:
case 4:
wall[searchwall].picnum = temppicnum;
break;
case 1:
sector[searchsector].ceilingpicnum = temppicnum;
break;
case 2:
sector[searchsector].floorpicnum = temppicnum;
break;
case 3:
sprite[searchwall].picnum = temppicnum;
break;
}
}
// calling this twice seems to speed up the movement
editinput();
editinput();
}
else
{
if (KEY_PRESSED(KEYSC_QUOTE) && KEY_PRESSED(KEYSC_M))
{
KEY_PRESSED(KEYSC_M) = FALSE;
ShadeMenu();
}
// greater than & less than keys
// if (KEY_PRESSED(KEYSC_COMMA) || KEY_PRESSED(KEYSC_PERIOD))
// {
// KEY_PRESSED(KEYSC_COMMA) = KEY_PRESSED(KEYSC_PERIOD) = FALSE;
// }
// c for clip boxes
// will find out
if (KEY_PRESSED(KEYSC_QUOTE) && KEY_PRESSED(KEYSC_V))
{
KEY_PRESSED(KEYSC_V) = FALSE;
CaptionMode++;
if (CaptionMode >= CAPTION_MAX)
CaptionMode = 0;
}
if (keystatus[KEYSC_QUOTE] && keystatus[KEYSC_D])
{
keystatus[KEYSC_D] = 0;
SetClipdist2D();
}
}
}
void
ExtLoadMap(const char *mapname)
{
SPRITEp sp;
int i;
BuildStagTable();
SetSpriteExtra();
#if 0
Old visibility New visibility
8->16384
9->8192
10->4096
11->2048
12->1024
13->512
14->256
15->128
#endif
// if in valid range set visiblity for the map
if (sector[0].extra != -1 && sector[0].extra > 0 && sector[0].extra < 16384)
g_visibility = sector[0].extra;
else
// if NOT in valid range set a default
g_visibility = 2;
// Load up voxel sprites from voxel script file
//LoadKVXFromScript("swvoxfil.txt");
loaded_numwalls = numwalls;
}
void
ExtSaveMap(const char *mapname)
{
SPRITEp sp;
int i;
SetSpriteExtra();
ResetSpriteFound();
for (i = 0; i < MAXWALLS; i++)
{
if (wall[i].extra != 0)
wall[i].extra = 0;
}
}
const char *
ExtGetSectorCaption(short sectnum)
{
if ((sector[sectnum].lotag | sector[sectnum].hitag) == 0)
{
tempbuf[0] = 0;
}
else
{
sprintf(tempbuf, "%d,%d", sector[sectnum].hitag,
sector[sectnum].lotag);
}
return tempbuf;
}
const char *
ExtGetWallCaption(short wallnum)
{
if ((wall[wallnum].lotag | wall[wallnum].hitag) == 0)
{
tempbuf[0] = 0;
}
else
{
sprintf(tempbuf, "%d,%d", wall[wallnum].hitag,
wall[wallnum].lotag);
}
return tempbuf;
}
const char *
ExtGetSpriteCaption(short spritenum)
{
SPRITEp sp = &sprite[spritenum];
char *p = "";
char name[64];
char tp[30];
char multi_str[30] = "";
int16_t data;
data = TEST(sp->extra, SPRX_SKILL);
// Non ST1 sprites that are tagged like them
if (TEST_BOOL1(sp) && sp->picnum != ST1)
{
if ((uint16_t)SP_TAG1(sp) > 1006)
sprintf(name, "Invalid Tag");
else
sprintf(name, "%s,", StagInfo[SP_TAG1(sp)].name); // This page faults if
// invalid #
p = name;
}
else
switch (sp->picnum)
{
case ST1:
if ((uint16_t)SP_TAG1(sp) > 1006)
sprintf(name, "Invalid Tag");
else
sprintf(name, "*%s,", StagInfo[SP_TAG1(sp)].name);
p = name;
break;
case ST_QUICK_JUMP:
p = "QJ,";
break;
case ST_QUICK_JUMP_DOWN:
p = "QJD,";
break;
case ST_QUICK_SUPER_JUMP:
p = "QSJ,";
break;
case ST_QUICK_EXIT:
p = "QEXIT,";
break;
case ST_QUICK_SCAN:
p = "QSCAN,";
break;
case ST_QUICK_OPERATE:
p = "QOPERATE,";
break;
case ST_QUICK_DUCK:
p = "QDUCK,";
break;
case ST_QUICK_DEFEND:
p = "QDEFEND,";
break;
case NINJA_RUN_R0:
p = "NINJA,";
break;
case GORO_RUN_R0:
p = "GAURD,";
break;
case COOLIE_RUN_R0:
p = "COOLIE,";
break;
case COOLG_RUN_R0:
p = "GHOST,";
break;
case RIPPER_RUN_R0:
p = "RIPPER,";
break;
case SKEL_RUN_R0:
p = "SKEL,";
break;
case HORNET_RUN_R0:
p = "HORNET,";
break;
case SERP_RUN_R0:
p = "SERP,";
break;
case SKULL_R0:
p = "SKULL,";
break;
case ICON_STAR:
p = "STAR,";
break;
case ICON_LG_MINE:
p = "LG_MINE,";
break;
case ICON_GRENADE_LAUNCHER:
p = "GRENADE_LAUNCHER,";
break;
case ICON_LG_GRENADE:
p = "LG_GRENADE,";
break;
case ICON_MICRO_GUN:
p = "MICRO_GUN,";
break;
case ICON_MICRO_BATTERY:
p = "MICRO_BATTERY,";
break;
case ICON_SHOTGUN:
p = "RIOT_GUN,";
break;
case ICON_LG_SHOTSHELL:
p = "LG_SHOTSHELL,";
break;
case ICON_ROCKET:
p = "ROCKET,";
break;
case ICON_LG_ROCKET:
p = "LG_ROCKET,";
break;
case ICON_UZI:
p = "UZI,";
break;
case ICON_UZIFLOOR:
p = "UZI_FLOOR,";
break;
case ICON_LG_UZI_AMMO:
p = "LG_UZI_AMMO,";
break;
case ICON_GUARD_HEAD:
p = "FIRE,";
break;
case ICON_HEART:
p = "HEART,";
break;
case ICON_HEART_LG_AMMO:
p = "HEART_LG_AMMO,";
break;
case ICON_SPELL:
p = "SPELL,";
break;
case ICON_EXPLOSIVE_BOX:
p = "CRATE,";
break;
case ICON_SM_MEDKIT:
p = "FIRST_AID,";
break;
case ICON_MEDKIT:
p = "MEDKIT,";
break;
case ICON_CHEMBOMB:
p = "CHEM_BOMB,";
break;
case ICON_FLASHBOMB:
p = "FLASH_BOMB,";
break;
case ICON_NUKE:
p = "NUKE_BOMB,";
break;
case ICON_CALTROPS:
p = "CALTROPS,";
break;
case ICON_BOOSTER:
p = "BOT_HEALTH,";
break;
case ICON_HEAT_CARD:
p = "HEAT_SEEKERS,";
break;
// case ICON_ENVIRON_SUIT:
// p = "EVIRON_SUIT,";
// break;
case ICON_CLOAK:
p = "SMOKE_BOMB,";
break;
case ICON_FLY:
p = "FLY,";
break;
case ICON_GOROAMMO:
p = "GAURDAMMO,";
break;
case ICON_RAIL_GUN:
p = "RAIL_GUN,";
break;
case ICON_RAIL_AMMO:
p = "RAIL_AMMO,";
break;
case ICON_REPAIR_KIT:
p = "REPAIR_KIT,";
break;
/*
* case ICON_GAUNTAMMO: p = "GAUNTAMMO,"; break;
*/
case ICON_RINGAMMO:
p = "RINGAMMO,";
break;
case ICON_NAPALMAMMO:
p = "NAPALMAMMO,";
break;
case ICON_GRENADE:
p = "GRENADE,";
break;
case ICON_NIGHT_VISION:
p = "NIGHT_VISION,";
break;
case ICON_ARMOR:
p = "ARMOR,";
break;
case SKEL_LOCKED:
p = "SKELETON KEY LOCK,";
switch (sp->hitag)
{
case 1:
sp->pal = PALETTE_PLAYER9;
break;
case 2:
sp->pal = PALETTE_PLAYER7;
break;
case 3:
sp->pal = PALETTE_PLAYER6;
break;
case 4:
sp->pal = PALETTE_PLAYER4;
break;
case 5:
sp->pal = PALETTE_PLAYER4;
break;
case 6:
sp->pal = PALETTE_PLAYER1;
break;
case 7:
sp->pal = PALETTE_PLAYER8;
break;
case 8:
sp->pal = PALETTE_PLAYER9;
break;
}
break;
case RAMCARD_LOCKED:
p = "RAM CARD LOCK,";
switch (sp->hitag)
{
case 1:
sp->pal = PALETTE_PLAYER9;
break;
case 2:
sp->pal = PALETTE_PLAYER7;
break;
case 3:
sp->pal = PALETTE_PLAYER6;
break;
case 4:
sp->pal = PALETTE_PLAYER4;
break;
case 5:
sp->pal = PALETTE_PLAYER4;
break;
case 6:
sp->pal = PALETTE_PLAYER1;
break;
case 7:
sp->pal = PALETTE_PLAYER8;
break;
case 8:
sp->pal = PALETTE_PLAYER9;
break;
}
break;
case CARD_LOCKED:
p = "CARD KEY LOCK,";
switch (sp->hitag)
{
case 1:
sp->pal = PALETTE_PLAYER9;
break;
case 2:
sp->pal = PALETTE_PLAYER7;
break;
case 3:
sp->pal = PALETTE_PLAYER6;
break;
case 4:
sp->pal = PALETTE_PLAYER4;
break;
case 5:
sp->pal = PALETTE_PLAYER4;
break;
case 6:
sp->pal = PALETTE_PLAYER1;
break;
case 7:
sp->pal = PALETTE_PLAYER8;
break;
case 8:
sp->pal = PALETTE_PLAYER9;
break;
}
break;
case RED_KEY:
p = "RED KEY,";
sp->pal = PALETTE_PLAYER9; // Hard set the palette
break;
case BLUE_KEY:
p = "BLUE KEY,";
sp->pal = PALETTE_PLAYER7; // Hard set the palette
break;
case GREEN_KEY:
p = "GREEN KEY,";
sp->pal = PALETTE_PLAYER6; // Hard set the palette
break;
case YELLOW_KEY:
p = "YEL KEY,";
sp->pal = PALETTE_PLAYER4; // Hard set the palette
break;
case RED_CARD:
p = "RED CARD,";
sp->pal = PALETTE_PLAYER9; // Hard set the palette
break;
case BLUE_CARD:
p = "BLUE CARD,";
sp->pal = PALETTE_PLAYER7; // Hard set the palette
break;
case GREEN_CARD:
p = "GREEN CARD,";
sp->pal = PALETTE_PLAYER6; // Hard set the palette
break;
case YELLOW_CARD:
p = "YEL CARD,";
sp->pal = PALETTE_PLAYER4; // Hard set the palette
break;
case SILVER_SKELKEY:
p = "SILVER SKELKEY,";
sp->pal = PALETTE_PLAYER1; // Hard set the palette
break;
case GOLD_SKELKEY:
p = "GOLD SKELKEY,";
sp->pal = PALETTE_PLAYER4; // Hard set the palette
break;
case BRONZE_SKELKEY:
p = "BRONZE SKELKEY,";
sp->pal = PALETTE_PLAYER8; // Hard set the palette
break;
case RED_SKELKEY:
p = "RED SKELKEY,";
sp->pal = PALETTE_PLAYER9; // Hard set the palette
break;
case RED_KEY_STATUE:
p = "RED STAT,";
break;
case BLUE_KEY_STATUE:
p = "BLUE STAT,";
break;
case GREEN_KEY_STATUE:
p = "GREEN STAT,";
break;
case YELLOW_KEY_STATUE:
p = "YEL STAT,";
break;
default:
p = "";
break;
}
if (sp->picnum != ST1)
{
if (sp->lotag == TAG_SPRITE_HIT_MATCH)
{
p = "TAG_SPRITE_HIT_MATCH";
}
// multi
if (TEST(sp->extra, SPRX_MULTI_ITEM))
strcpy(multi_str, "MULTI,");
}
// track
if (sp->picnum >= TRACK_SPRITE && sp->picnum < TRACK_SPRITE + 100)
{
sprintf(tp, "T%d,", sp->picnum - TRACK_SPRITE);
p = tp;
}
switch (CaptionMode)
{
case CAPTION_NONE:
tempbuf[0] = 0;
break;
case CAPTION_DEFAULT:
if ((sprite[spritenum].lotag | sprite[spritenum].hitag) == 0)
//tempbuf[0] = NULL;
sprintf(tempbuf, "S:%d", data);
else
sprintf(tempbuf, "S:%d,%d,%d", data, sprite[spritenum].hitag, sprite[spritenum].lotag);
break;
case CAPTION_NAMES:
// Show clip boxes in default mode
if (sp->hitag == SO_CLIP_BOX)
DrawClipBox(spritenum);
if (sp->hitag == SECT_SO_CLIP_DIST)
DrawClipBox(spritenum);
if ((sprite[spritenum].lotag | sprite[spritenum].hitag) == 0)
sprintf(tempbuf, "S:%d,%s%s", data, p, multi_str);
else
// name and numbers - name only prints if not null string
sprintf(tempbuf, "%s%s%d,%d", p, multi_str, sprite[spritenum].hitag, sprite[spritenum].lotag);
break;
case CAPTION_MOST:
if ((sprite[spritenum].lotag | sprite[spritenum].hitag) == 0)
sprintf(tempbuf, "%s%s", p, multi_str);
else
sprintf(tempbuf, "%s%s%d,%d,%d,%d,%d,%d", p, multi_str,
SPRITE_TAG1(spritenum),
SPRITE_TAG2(spritenum),
SPRITE_TAG3(spritenum),
SPRITE_TAG4(spritenum),
SPRITE_TAG5(spritenum),
SPRITE_TAG6(spritenum));
break;
case CAPTION_ALL:
// if (sp->hitag == SO_CLIP_BOX)
// DrawClipBox(spritenum);
if ((sprite[spritenum].lotag | sprite[spritenum].hitag) == 0)
sprintf(tempbuf, "%s%s", p, multi_str);
else
sprintf(tempbuf, "%s%s%d,%d,%d,%d,%d,%d,%d,%d,%d,%d", p, multi_str,
SPRITE_TAG1(spritenum),
SPRITE_TAG2(spritenum),
SPRITE_TAG3(spritenum),
SPRITE_TAG4(spritenum),
SPRITE_TAG5(spritenum),
SPRITE_TAG6(spritenum),
SPRITE_TAG7(spritenum),
SPRITE_TAG8(spritenum),
SPRITE_TAG9(spritenum),
SPRITE_TAG10(spritenum));
break;
}
return tempbuf;
}
void
SectorMidPoint(short sectnum, int *xmid, int *ymid, int *zmid)
{
short startwall, endwall, j;
int xsum = 0, ysum = 0;
WALLp wp;
startwall = sector[sectnum].wallptr;
endwall = startwall + sector[sectnum].wallnum - 1;
for (wp = &wall[startwall], j = startwall; j <= endwall; wp++, j++)
{
xsum += wp->x;
ysum += wp->y;
}
*xmid = xsum / (endwall - startwall + 1);
*ymid = ysum / (endwall - startwall + 1);
*zmid = DIV2(sector[sectnum].floorz + sector[sectnum].ceilingz);
}
void
DrawClipBox(short spritenum)
{
int x = 0, y = 0, z;
int radius;
extern int zoom;
if (sprite[spritenum].hitag == SO_CLIP_BOX)
{
x = mulscale14(sprite[spritenum].x - pos.x, zoom);
y = mulscale14(sprite[spritenum].y - pos.y, zoom);
}
else if (sprite[spritenum].hitag == SECT_SO_CLIP_DIST)
{
SectorMidPoint(sprite[spritenum].sectnum,&x, &y, &z);
x = mulscale14(x - pos.x, zoom);
y = mulscale14(y - pos.y, zoom);
}
x += 320;
y += 200;
radius = mulscale14(sprite[spritenum].lotag, zoom);
#define BOX_COLOR 3
// upper
drawline16(x - radius, y - radius, x + radius, y - radius, BOX_COLOR);
// lower
drawline16(x - radius, y + radius, x + radius, y + radius, BOX_COLOR);
// left
drawline16(x - radius, y - radius, x - radius, y + radius, BOX_COLOR);
// right
drawline16(x + radius, y - radius, x + radius, y + radius, BOX_COLOR);
}
void
ExtShowSectorData(short sectnum) // F5
{
int i, x, y, x2;
if (qsetmode == 200) // In 3D mode
return;
clearmidstatbar16(); // Clear middle of status bar
// if (keystatus[KEYSC_F5] )
// {
KEY_PRESSED(KEYSC_F5) = 0;
for (i = 0; i < MAXSPRITES; i++)
numsprite[i] = 0;
for (i = 0; i < MAXSPRITES; i++)
multisprite[i] = 0;
for (i = 0; i < MAXSPRITES; i++)
{
if (sprite[i].statnum == 0)
{
if (TEST(sprite[i].extra, SPRX_MULTI_ITEM))
{
if (sprite[i].picnum == ICON_UZIFLOOR)
multisprite[ICON_UZI]++;
else
multisprite[sprite[i].picnum]++;
}
else
{
if (sprite[i].picnum == ICON_UZIFLOOR)
numsprite[ICON_UZI]++;
else
numsprite[sprite[i].picnum]++;
}
}
}
clearmidstatbar16(); // Clear middle of status bar
x = 1;
x2 = 14;
y = 4;
printext16(x * 8, ydim16+y * 8, 11, -1, "Item Count", 0);
PrintStatus("10%Health=", numsprite[ICON_SM_MEDKIT], x, y + 2, 11);
PrintStatus("", multisprite[ICON_SM_MEDKIT], x2, y + 2, 1);
PrintStatus("HealthBot=", numsprite[ICON_BOOSTER], x, y + 3, 11);
PrintStatus("", multisprite[ICON_BOOSTER], x2, y + 3, 1);
PrintStatus("Armor =", numsprite[ICON_ARMOR], x, y + 4, 11);
PrintStatus("", multisprite[ICON_ARMOR], x2, y + 4, 1);
x = 17;
x2 = 30;
y = 4;
printext16(x * 8, ydim16+y * 8, 11, -1, "Inventory", 0);
PrintStatus("Med-Kit =", numsprite[ICON_MEDKIT], x, y + 2, 11);
PrintStatus("", multisprite[ICON_MEDKIT], x2, y + 2, 1);
PrintStatus("Bio_Suit =", numsprite[ICON_ENVIRON_SUIT], x, y + 3, 11);
PrintStatus("", multisprite[ICON_ENVIRON_SUIT], x2, y + 3, 1);
PrintStatus("NightGogs=", numsprite[ICON_NIGHT_VISION], x, y + 4, 11);
PrintStatus("", multisprite[ICON_NIGHT_VISION], x2, y + 4, 1);
PrintStatus("SmokeBomb=", numsprite[ICON_CLOAK], x, y + 5, 11);
PrintStatus("", multisprite[ICON_CLOAK], x2, y + 5, 1);
PrintStatus("Tool_Box =", numsprite[ICON_REPAIR_KIT], x, y + 6, 11);
PrintStatus("", multisprite[ICON_REPAIR_KIT], x2, y + 6, 1);
PrintStatus("Heat_Card=", numsprite[ICON_HEAT_CARD], x, y + 7, 11);
PrintStatus("", multisprite[ICON_HEAT_CARD], x2, y + 7, 1);
PrintStatus("FlashBomb=", numsprite[ICON_FLASHBOMB], x, y + 8, 11);
PrintStatus("", multisprite[ICON_FLASHBOMB], x2, y + 8, 1);
PrintStatus("Caltrops =", numsprite[ICON_CALTROPS], x, y + 9, 11);
PrintStatus("", multisprite[ICON_CALTROPS], x2, y + 9, 1);
x = 33;
x2 = 46;
y = 4;
printext16(x * 8, ydim16+y * 8, 11, -1, "Weapon Count", 0);
PrintStatus("Shuriken =", numsprite[ICON_STAR], x, y + 2, 11);
PrintStatus("", multisprite[ICON_STAR], x2, y + 2, 1);
PrintStatus("Uzi =", numsprite[ICON_UZI], x, y + 3, 11);
PrintStatus("", multisprite[ICON_UZI], x2, y + 3, 1);
PrintStatus("Riot_Gun =", numsprite[ICON_SHOTGUN], x, y + 4, 11);
PrintStatus("", multisprite[ICON_SHOTGUN], x2, y + 4, 1);
PrintStatus("Misl_Bat =", numsprite[ICON_MICRO_GUN], x, y + 5, 11);
PrintStatus("", multisprite[ICON_MICRO_GUN], x2, y + 5, 1);
PrintStatus("40mm =", numsprite[ICON_GRENADE_LAUNCHER], x, y + 6, 11);
PrintStatus("", multisprite[ICON_GRENADE_LAUNCHER], x2, y + 6, 1);
PrintStatus("Mines =", numsprite[ICON_LG_MINE], x, y + 7, 11);
PrintStatus("", multisprite[ICON_LG_MINE], x2, y + 7, 1);
PrintStatus("Rail_Gun =", numsprite[ICON_RAIL_GUN], x, y + 8, 11);
PrintStatus("", multisprite[ICON_RAIL_GUN], x2, y + 8, 1);
PrintStatus("Evil Head=", numsprite[ICON_GUARD_HEAD], x, y + 9, 11);
PrintStatus("", multisprite[ICON_GUARD_HEAD], x2, y + 9, 1);
PrintStatus("Heart =", numsprite[ICON_HEART], x, y + 10, 11);
PrintStatus("", multisprite[ICON_HEART], x2, y + 10, 1);
x = 49;
x2 = 62;
y = 4;
printext16(x * 8, ydim16+y * 8, 11, -1, "Ammo Count", 0);
PrintStatus("Bullets =", numsprite[ICON_LG_UZI_AMMO], x, y + 2, 11);
PrintStatus("", multisprite[ICON_LG_UZI_AMMO], x2, y + 2, 1);
PrintStatus("ShotShell=", numsprite[ICON_LG_SHOTSHELL], x, y + 3, 11);
PrintStatus("", multisprite[ICON_LG_SHOTSHELL], x2, y + 3, 1);
PrintStatus("Rockets =", numsprite[ICON_MICRO_BATTERY], x, y + 4, 11);
PrintStatus("", multisprite[ICON_MICRO_BATTERY], x2, y + 4, 1);
PrintStatus("40mmShell=", numsprite[ICON_LG_GRENADE], x, y + 5, 11);
PrintStatus("", multisprite[ICON_LG_GRENADE], x2, y + 5, 1);
PrintStatus("Rail_Pack=", numsprite[ICON_RAIL_AMMO], x, y + 6, 11);
PrintStatus("", multisprite[ICON_RAIL_AMMO], x2, y + 6, 1);
// Show next tags
FindNextTag();
ShowNextTag();
/*
printext16(65*8,ydim16+4*8,11,-1,"MISC",0);
PrintStatus("Secrets =",secrets,65,6,11);
printext16(65*8,ydim16+7*8,11,-1,"ACTORS",0);
PrintStatus("Skill 1 =",totalactors1,65,8,11);
PrintStatus("Skill 2 =",totalactors2,65,9,11);
PrintStatus("Skill 3 =",totalactors3,65,10,11);
PrintStatus("Skill 4 =",totalactors4,65,11,11);
PrintStatus("Respawn =",totalrespawn,65,12,11);
*/
// }
#if 0
sprintf(tempbuf, "Sector %d", sectnum);
printext16(8, ydim16+32, 11, -1, tempbuf, 0);
printext16(8, ydim16+48, 11, -1, "8*8 font: ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 0123456789", 0);
printext16(8, ydim16+56, 11, -1, "3*5 font: ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 0123456789", 1);
drawline16(320, 68, 344, 80, 4); // Draw house
drawline16(344, 80, 344, 116, 4);
drawline16(344, 116, 296, 116, 4);
drawline16(296, 116, 296, 80, 4);
drawline16(296, 80, 320, 68, 4);
#endif
}
void
ExtShowWallData(short wallnum) // F6
{
if (qsetmode == 200) // In 3D mode
return;
clearmidstatbar16(); // Clear middle of status bar
sprintf(tempbuf, "Wall %d", wallnum);
printext16(8, ydim16+32, 11, -1, tempbuf, 0);
}
void
ExtShowSpriteData(short spritenum) // F6
{
if (qsetmode == 200) // In 3D mode
return;
while (KEY_PRESSED(KEYSC_F6)) ;
ResetKeys();
ContextHelp(spritenum); // Get context sensitive help
// OLD
// clearmidstatbar16();
// sprintf(tempbuf, "Sprite %d", spritenum);
// printext16(8, ydim16+32, 11, -1, tempbuf, 0);
}
void
ExtEditSectorData(short sectnum) // F7
{
short key_num;
SPRITEp sp;
if (qsetmode == 200) // In 3D mode
return;
sp = &sprite[FindSpriteNum]; // Set sprite to current spritenum
clearmidstatbar16(); // Clear middle of status bar
sprintf(tempbuf, "Current attributes for sprite being searched for:");
printext16(8, ydim16+32, 11, -1, tempbuf, 0);
sprintf(tempbuf, "PicNum = %d", FindPicNum);
printext16(8, ydim16+32 + 16, 11, -1, tempbuf, 0);
sprintf(tempbuf, "HiTag = %d", sp->hitag);
printext16(8, ydim16+32 + 24, 11, -1, tempbuf, 0);
sprintf(tempbuf, "LowTag = %d", sp->lotag);
printext16(8, ydim16+32 + 32, 11, -1, tempbuf, 0);
FindNextSprite(FindPicNum);
}
void
ExtEditWallData(short wallnum) // F8
{
// short nickdata;
if (qsetmode == 200) // In 3D mode
return;
// sprintf(tempbuf, "Wall (%ld): ", wallnum);
// nickdata = 0;
// nickdata = getnumber16(tempbuf, nickdata, 65536L);
// printmessage16(" "); // Clear message box (top right of
// status bar)
// ExtShowWallData(wallnum);
}
void
ExtEditSpriteData(short spritenum) // F8
{
uint8_t* key;
short data;
SPRITEp sp;
SetSpriteExtra();
sp = &sprite[spritenum];
if (qsetmode == 200) // In 3D mode
return;
clearmidstatbar16(); // Clear middle of status bar
printext16(8, ydim16+32, 11, -1, "(1) Skill Level - 0=Easy 1=Normal 2=Hard 3=Crazy", 0);
printext16(8, ydim16+32 + 8, 11, -1, "(2) Multi-Player Item Toggle", 0);
printext16(8, ydim16+32 + 16, 11, -1, "(3) Find Sprite", 0);
printext16(8, ydim16+32 + 24, 11, -1, "(4) Dbug Toggle (* Programming use only *) ", 0);
showframe(1);
while (KEY_PRESSED(KEYSC_F8)) handleevents();
ResetKeys();
while ((key = BKeyPressed()) == NULL) handleevents();
if (key == (uint8_t*)&KEY_PRESSED(KEYSC_1) || key == (uint8_t*)&KEY_PRESSED(KEYSC_F8))
{
*key = FALSE;
sprintf(tempbuf, "Sprite (%d) Skill Level (0-3) : ", spritenum);
data = TEST(sp->extra, SPRX_SKILL);
data = getnumber16(tempbuf, data, 65536L, 1);
if (data > 3)
data = 3;
RESET(sp->extra, SPRX_SKILL);
SET(sp->extra, data);
}
else if (key == (uint8_t*)&KEY_PRESSED(KEYSC_2) || key == (uint8_t*)&KEY_PRESSED(KEYSC_F9))
{
*key = FALSE;
FLIP(sprite[spritenum].extra, SPRX_MULTI_ITEM);
}
else if (key == (uint8_t*)&KEY_PRESSED(KEYSC_3) || key == (uint8_t*)&KEY_PRESSED(KEYSC_F10))
{
*key = FALSE;
do
{
DISPLAY:
clearmidstatbar16();
printext16(8, ydim16+32, 11, -1, "Toggle Sprite Seach Criteria. ESC quits.", 0);
printext16(8, ydim16+32 + 16, 11, -1, "(1) Use PicNum in search: ", 0);
if (bFindPicNum)
printext16(8 + 240, ydim16+32 + 16, 11, -1, "TRUE", 0);
else
printext16(8 + 240, ydim16+32 + 16, 11, -1, "FALSE", 0);
printext16(8, ydim16+32 + 24, 11, -1, "(2) Use HiTag in search: ", 0);
if (bFindHiTag)
printext16(8 + 240, ydim16+32 + 24, 11, -1, "TRUE", 0);
else
printext16(8 + 240, ydim16+32 + 24, 11, -1, "FALSE", 0);
printext16(8, ydim16+32 + 32, 11, -1, "(3) Use LowTag in search: ", 0);
if (bFindLowTag)
printext16(8 + 240, ydim16+32 + 32, 11, -1, "TRUE", 0);
else
printext16(8 + 240, ydim16+32 + 32, 11, -1, "FALSE", 0);
showframe(1);
// Disallow invalid settings
if (!bFindPicNum && !bFindHiTag && !bFindLowTag)
{
bFindPicNum = TRUE;
goto DISPLAY;
}
while (KEY_PRESSED(KEYSC_1) || KEY_PRESSED(KEYSC_2) || KEY_PRESSED(KEYSC_3)
|| KEY_PRESSED(KEYSC_4)) handleevents();
ResetKeys();
while ((key = BKeyPressed()) == NULL) handleevents();
if (key == (uint8_t*)&KEY_PRESSED(KEYSC_1))
{
*key = FALSE;
bFindPicNum = !bFindPicNum;
}
else if (key == (uint8_t*)&KEY_PRESSED(KEYSC_2))
{
*key = FALSE;
bFindHiTag = !bFindHiTag;
}
else if (key == (uint8_t*)&KEY_PRESSED(KEYSC_3))
{
*key = FALSE;
bFindLowTag = !bFindLowTag;
}
}
while ((KEY_PRESSED(0x1c) == 0) && (KEY_PRESSED(0x1) == 0)); // Enter, ESC
KEY_PRESSED(0x1c) = 0;
KEY_PRESSED(0x1) = 0;
FindSprite(sprite[spritenum].picnum, spritenum);
}
else if (key == (uint8_t*)&KEY_PRESSED(KEYSC_4))
{
*key = FALSE;
FLIP(sprite[spritenum].extra, SPRX_BLOCK);
}
printmessage16(" ");
clearmidstatbar16(); // Clear middle of status bar
sprintf(tempbuf, "Current attributes for selected sprite:");
printext16(8, ydim16+32, 11, -1, tempbuf, 0);
sprintf(tempbuf, " Skill = %d", TEST(sp->extra, SPRX_SKILL));
printext16(8, ydim16+32 + 16, 11, -1, tempbuf, 0);
sprintf(tempbuf, " Multi Item = %d", !!TEST(sp->extra, SPRX_MULTI_ITEM));
printext16(8, ydim16+32 + 24, 11, -1, tempbuf, 0);
sprintf(tempbuf, " Debug = %d", !!TEST(sp->extra, SPRX_BLOCK));
printext16(8, ydim16+32 + 32, 11, -1, tempbuf, 0);
}
void
PlaxSetShade(void)
{
short data;
short shade;
int i, count = 0;
if (qsetmode == 200) // In 3D mode
return;
sprintf(tempbuf, "Plax Sky set shade to #: ");
shade = getnumber16(tempbuf, 0, 65536L, 1);
if (shade == 0)
return;
for (i = 0, count = 0; i < numsectors; i++)
{
if (TEST(sector[i].ceilingstat, CEILING_STAT_PLAX))
{
sector[i].ceilingshade = shade;
count++;
}
}
printmessage16(" ");
clearmidstatbar16(); // Clear middle of status bar
sprintf(tempbuf, "%d Plax Sky shades set.", count);
printext16(8, ydim16+32, 11, -1, tempbuf, 0);
}
void
PlaxAdjustShade(void)
{
short data;
short shade;
int i, count = 0;
if (qsetmode == 200) // In 3D mode
return;
sprintf(tempbuf, "Plax Sky adjust shade by (+10000 for negative): ");
shade = getnumber16(tempbuf, 0, 65536L, 1);
if (shade == 0)
return;
if (shade > 10000)
{
shade = -(shade - 10000);
}
for (i = 0; i < numsectors; i++)
{
if (TEST(sector[i].ceilingstat, CEILING_STAT_PLAX))
{
sector[i].ceilingshade += shade;
}
}
printmessage16(" ");
clearmidstatbar16(); // Clear middle of status bar
sprintf(tempbuf, "%d Plax Sky shades adjusted.", count);
printext16(8, ydim16+32, 11, -1, tempbuf, 0);
}
void
AdjustShade(void)
{
short data;
short shade;
int i, count;
short SpriteNum, NextSprite;
if (qsetmode == 200) // In 3D mode
return;
sprintf(tempbuf, "Adjust amount (+10000 for negative): ");
shade = getnumber16(tempbuf, 0, 65536L, 1);
if (shade == 0)
return;
if (shade > 10000)
{
shade = -(shade - 10000);
}
if (highlightsectorcnt > -1)
{
short startwall, endwall;
short i, j = 0;
for (i = 0; i < highlightsectorcnt; i++)
{
sector[highlightsector[i]].floorshade += shade;
sector[highlightsector[i]].ceilingshade += shade;
TRAVERSE_SPRITE_SECT(headspritesect[highlightsector[i]], SpriteNum, NextSprite)
{
sprite[SpriteNum].shade += shade;
}
startwall = sector[highlightsector[i]].wallptr;
endwall = startwall + sector[highlightsector[i]].wallnum - 1;
for (j = startwall; j <= endwall; j++)
{
if (!TEST(wall[j].extra, 0x1))
{
SET(wall[j].extra, 0x1);
wall[j].shade += shade;
}
if (!TEST(wall[wall[j].nextwall].extra, 0x1))
{
SET(wall[wall[j].nextwall].extra, 0x1);
wall[wall[j].nextwall].shade += shade;
}
}
}
for (i = 0; i < MAXWALLS; i++)
{
RESET(wall[j].extra, 0x1);
}
}
else
{
for (i = count = 0; i < numwalls; i++)
{
wall[i].shade += shade;
}
for (i = 0; i < numsectors; i++)
{
sector[i].floorshade += shade;
sector[i].ceilingshade += shade;
TRAVERSE_SPRITE_SECT(headspritesect[i], SpriteNum, NextSprite)
{
sprite[SpriteNum].shade += shade;
}
}
}
printmessage16(" ");
clearmidstatbar16(); // Clear middle of status bar
}
void
SetClipdist2D(void)
{
short dist;
int i;
short num;
if (qsetmode == 200) // In 3D mode
return;
if (highlightcnt <= -1)
return;
sprintf(tempbuf, "Sprite Clipdist: ");
dist = getnumber16(tempbuf, 0, 65536L, 1);
for (i = 0; i < highlightcnt; i++)
{
if (TEST(highlight[i], SPRITE_FLAG))
{
num = RESET(highlight[i], SPRITE_FLAG);
sprite[highlight[i]].clipdist = dist;
}
}
printmessage16(" ");
clearmidstatbar16(); // Clear middle of status bar
}
void
AdjustVisibility(void)
{
short data;
short vis;
int i, count = 0;
if (qsetmode == 200) // In 3D mode
return;
sprintf(tempbuf, "Adjust non-zero vis sectors by (+10000 for neg): ");
vis = getnumber16(tempbuf, 0, 65536L, 1);
if (vis == 0)
return;
if (vis > 10000)
{
vis = -(vis - 10000);
}
if (highlightsectorcnt > -1)
{
short i, j;
for (i = 0; i < highlightsectorcnt; i++)
{
if (sector[highlightsector[i]].visibility != 0)
{
count++;
sector[highlightsector[i]].visibility += vis;
}
}
}
else
for (i = 0; i < numsectors; i++)
{
if (sector[i].visibility != 0)
{
count++;
sector[i].visibility += vis;
}
}
printmessage16(" ");
clearmidstatbar16(); // Clear middle of status bar
sprintf(tempbuf, "%d Vis adjusted.", count);
printext16(8, ydim16+32, 11, -1, tempbuf, 0);
}
void
FindSprite(short picnum, short findspritenum)
{
int i, count;
short SpriteNum, NextSprite;
SPRITEp sp;
SWBOOL bFoundPicNum, bFoundHiTag, bFoundLowTag, bFoundIt;
if (qsetmode == 200) // In 3D mode
return;
if (picnum == 0)
{
sprintf(tempbuf, "Find sprite (tile number): ");
picnum = getnumber16(tempbuf, 0, 65536L, 1);
}
FindPicNum = picnum;
FindSpriteNum = findspritenum;
ResetSpriteFound();
// go to the first one
for (i = 0; i < numsectors; i++)
{
TRAVERSE_SPRITE_SECT(headspritesect[i], SpriteNum, NextSprite)
{
sp = &sprite[SpriteNum];
// Reset search status
bFoundIt = TRUE;
bFoundPicNum = bFoundHiTag = bFoundLowTag = FALSE;
if (bFindPicNum)
{
if (sp->picnum == picnum)
bFoundPicNum = TRUE;
bFoundIt = bFoundIt & bFoundPicNum;
}
if (bFindHiTag)
{
if (sp->hitag == sprite[FindSpriteNum].hitag)
bFoundHiTag = TRUE;
bFoundIt = bFoundIt & bFoundHiTag;
}
if (bFindLowTag)
{
if (sp->lotag == sprite[FindSpriteNum].lotag)
bFoundLowTag = TRUE;
bFoundIt = bFoundIt & bFoundLowTag;
}
if (bFoundIt)
{
SET(sp->extra, SPRX_FOUND);
cursectnum = sp->sectnum;
pos.x = sp->x;
pos.y = sp->y;
pos.z = sp->z - kensplayerheight;
return;
}
}
}
printmessage16(" ");
clearmidstatbar16(); // Clear middle of status bar
}
void
FindNextSprite(short picnum)
{
int i, count;
short SpriteNum, NextSprite;
SPRITEp sp;
short animlen;
SWBOOL bFoundPicNum, bFoundHiTag, bFoundLowTag, bFoundIt;
if (qsetmode == 200) // In 3D mode
return;
for (i = 0; i < numsectors; i++)
{
TRAVERSE_SPRITE_SECT(headspritesect[i], SpriteNum, NextSprite)
{
sp = &sprite[SpriteNum];
// Reset search status
bFoundIt = TRUE;
bFoundPicNum = bFoundHiTag = bFoundLowTag = FALSE;
if (bFindPicNum)
{
if (sp->picnum == picnum)
bFoundPicNum = TRUE;
bFoundIt = bFoundIt & bFoundPicNum;
}
if (bFindHiTag)
{
if (sp->hitag == sprite[FindSpriteNum].hitag)
bFoundHiTag = TRUE;
bFoundIt = bFoundIt & bFoundHiTag;
}
if (bFindLowTag)
{
if (sp->lotag == sprite[FindSpriteNum].lotag)
bFoundLowTag = TRUE;
bFoundIt = bFoundIt & bFoundLowTag;
}
if (bFoundIt && !TEST(sp->extra, SPRX_FOUND))
{
SET(sp->extra, SPRX_FOUND);
cursectnum = sp->sectnum;
pos.x = sp->x;
pos.y = sp->y;
pos.z = sp->z - kensplayerheight;
return;
}
}
}
}
// Array of no-no ST1 tags that should not be considered for match tags.
short tagcheck[] = {0, 1, 3, 5, 16, 23, 25, 27, 29, 30, 31, 32, 33, 34, 37, 38, 39, 42,
45, 46, 47, 48, 49, 50, 51, 52, 53, 55, 56, 62, 64, 65, 66, 68, 71,
72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 90, 94, 97, 98, 99, 100,
101, 102, 135, 110, 111, 112, 113, 114, 115, 9002};
SWBOOL
DoMatchCheck(SPRITEp sp)
{
unsigned i;
// Don't F up the next tag with weird tag 2 cases that aren't match tags!
for (i = 0; i < sizeof(tagcheck); i++)
if (tagcheck[i] == sp->hitag)
return TRUE; // This ST1 tag is evil! Don't
// consider it!
return FALSE; // This ST1 tag if fine.
}
void
ShowNextTag(void)
{
if (qsetmode == 200) // In 3D mode
return;
printmessage16(" ");
sprintf(tempbuf, "Next tag = %d", siNextEndTag);
printmessage16(tempbuf);
}
void
FindNextTag(void)
{
int i, count, j;
short SpriteNum, NextSprite;
short siNextFind; // Next tag that SHOULD be found
SPRITEp sp;
if (qsetmode == 200) // In 3D mode
return;
siNextTag = siNextEndTag = 0; // Reset tags for new search
siNextFind = 0;
// go to the first one
for (i = 0; i < numsectors; i++)
{
TRAVERSE_SPRITE_SECT(headspritesect[i], SpriteNum, NextSprite)
{
sp = &sprite[SpriteNum];
// If it's not an ST1 sprite, blow past it
if (sp->picnum != ST1)
continue;
// Check for evil tags
if (DoMatchCheck(sp))
continue;
// Show the highest possible next tag
if (sp->lotag >= siNextEndTag)
siNextEndTag = sp->lotag + 1;
}
}
}
void
ShadeMenu(void) // F8
{
uint8_t* key;
if (qsetmode == 200) // In 3D mode
return;
clearmidstatbar16(); // Clear middle of status bar
printext16(8, ydim16+32, 11, -1, "(1) Plax Set ", 0);
printext16(8, ydim16+32 + 8, 11, -1, "(2) Plax Adjust ", 0);
printext16(8, ydim16+32 + 16, 11, -1, "(3) Shade Adjust ", 0);
printext16(8, ydim16+32 + 24, 11, -1, "(4) Visibility ", 0);
ResetKeys();
while ((key = BKeyPressed()) == NULL) ;
if (key == (uint8_t*)&KEY_PRESSED(KEYSC_1))
{
*key = FALSE;
PlaxSetShade();
}
else if (key == (uint8_t*)&KEY_PRESSED(KEYSC_2))
{
*key = FALSE;
PlaxAdjustShade();
}
else if (key == (uint8_t*)&KEY_PRESSED(KEYSC_3))
{
*key = FALSE;
AdjustShade();
}
else if (key == (uint8_t*)&KEY_PRESSED(KEYSC_4))
{
*key = FALSE;
AdjustVisibility();
}
}
void faketimerhandler(void)
{
sampletimer();
}
//Just thought you might want my getnumber16 code
/*
getnumber16(char namestart[80], short num, int maxnumber)
{
char buffer[80];
int j, k, n, danum, oldnum;
danum = (int)num;
oldnum = danum;
while ((KEY_PRESSED(0x1c) != 2) && (KEY_PRESSED(0x1) == 0)) //Enter, ESC
{
sprintf(&buffer,"%s%ld_ ",namestart,danum);
printmessage16(buffer);
for(j=2;j<=11;j++) //Scan numbers 0-9
if (KEY_PRESSED(j) > 0)
{
KEY_PRESSED(j) = 0;
k = j-1;
if (k == 10) k = 0;
n = (danum*10)+k;
if (n < maxnumber) danum = n;
}
if (KEY_PRESSED(0xe) > 0) // backspace
{
danum /= 10;
KEY_PRESSED(0xe) = 0;
}
if (KEY_PRESSED(0x1c) == 1) //L. enter
{
oldnum = danum;
KEY_PRESSED(0x1c) = 2;
asksave = 1;
}
}
KEY_PRESSED(0x1c) = 0;
KEY_PRESSED(0x1) = 0;
return((short)oldnum);
}
*/
static char messagecolor = 31;
static unsigned short messagedelay = 0;
static char messagebuf[1024];
void
Message(char *string, char color)
{
sprintf(messagebuf, string, 0);
messagedelay = 512;
messagecolor = color;
}
void
ShowMessage(void)
{
if (messagedelay < 1)
return;
messagedelay--;
printext256(1 * 4, 1 * 8, 1, 0, messagebuf, 1);
}
void
ResetSprites()
{
short i;
spritetype *tspr;
DebugActorFreeze = 0;
for (i = 0, tspr = &sprite[0]; i < MAXSPRITES; i++, tspr++)
{
RESET(tspr->cstat, CSTAT_SPRITE_INVISIBLE);
// if (TEST(tspr->extra, SPRX_BLOCK))
// SET(tspr->cstat, CSTAT_SPRITE_BLOCK);
}
}
static char kvxloaded = 0;
void ExtPreLoadMap(void)
{
ResetSprites();
if (!kvxloaded) LoadKVXFromScript("swvoxfil.txt"), kvxloaded = 1;
}
int32_t ExtPreSaveMap(void)
{
ResetBuildFAF();
ResetSprites();
return 0;
}
void
dsprintf(char *str, char *format, ...)
{
va_list arglist;
va_start(arglist, format);
vsprintf(str, format, arglist);
va_end(arglist);
}
void
dsprintf_null(char *str, char *format, ...)
{
va_list arglist;
}
void
BuildStagTable(void)
{
#define MAKE_STAG_TABLE
#include "stag.h"
#undef MAKE_STAG_TABLE
}