mirror of
https://github.com/ZDoom/raze-gles.git
synced 2024-11-18 10:11:50 +00:00
43459780af
git-svn-id: https://svn.eduke32.com/eduke32@5345 1a8010ca-5511-0410-912e-c29ae57300e0
3743 lines
99 KiB
C
3743 lines
99 KiB
C
//-------------------------------------------------------------------------
|
|
/*
|
|
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
|
|
}
|