mirror of
https://github.com/ZDoom/Raze.git
synced 2024-12-19 00:51:19 +00:00
40d655100c
git-svn-id: https://svn.eduke32.com/eduke32@1521 1a8010ca-5511-0410-912e-c29ae57300e0
12412 lines
396 KiB
C
12412 lines
396 KiB
C
//-------------------------------------------------------------------------
|
|
/*
|
|
Copyright (C) 1996, 2003 - 3D Realms Entertainment
|
|
Copyright (C) 2004, 2007 - EDuke32 developers
|
|
|
|
This file is part of EDuke32
|
|
|
|
EDuke32 is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU General Public License version 2
|
|
as published by the Free Software Foundation.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
See the GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
*/
|
|
//-------------------------------------------------------------------------
|
|
|
|
#include "compat.h"
|
|
#include "build.h"
|
|
#include "editor.h"
|
|
#include "pragmas.h"
|
|
#include "baselayer.h"
|
|
#include "names.h"
|
|
#include "osd.h"
|
|
#include "osdfuncs.h"
|
|
#include "cache1d.h"
|
|
|
|
#include "mapster32.h"
|
|
#include "keys.h"
|
|
|
|
#include "keyboard.h"
|
|
#include "scriptfile.h"
|
|
#include "crc32.h"
|
|
|
|
#include "sounds_mapster32.h"
|
|
#include "fx_man.h"
|
|
|
|
#include "macros.h"
|
|
#include "fastlz.h"
|
|
|
|
#include "m32script.h"
|
|
#include "m32def.h"
|
|
|
|
#ifdef _WIN32
|
|
#define WIN32_LEAN_AND_MEAN
|
|
#include <windows.h>
|
|
#include <shellapi.h>
|
|
#endif
|
|
|
|
#define BUILDDATE " 20090616"
|
|
|
|
static int32_t floor_over_floor;
|
|
|
|
// static char *startwin_labeltext = "Starting Mapster32...";
|
|
static char setupfilename[BMAX_PATH]= "mapster32.cfg";
|
|
static char defaultduke3dgrp[BMAX_PATH] = "duke3d.grp";
|
|
static char *duke3dgrp = defaultduke3dgrp;
|
|
static int32_t fixmapbeforesaving = 1;
|
|
static int32_t lastsave = -180*60;
|
|
static int32_t NoAutoLoad = 0;
|
|
int32_t spnoclip=1;
|
|
|
|
// Sound in Mapster32
|
|
static char defaultgamecon[BMAX_PATH] = "game.con";
|
|
static char *gamecon = defaultgamecon;
|
|
|
|
#pragma pack(push,1)
|
|
sound_t g_sounds[MAXSOUNDS];
|
|
#pragma pack(pop)
|
|
|
|
static int16_t g_definedsndnum[MAXSOUNDS]; // maps parse order index to g_sounds index
|
|
static int16_t g_sndnum[MAXSOUNDS]; // maps current order index to g_sounds index
|
|
int32_t g_numsounds = 0;
|
|
|
|
#if !defined(_WIN32)
|
|
static int32_t usecwd = 0;
|
|
#endif
|
|
|
|
static struct strllist
|
|
{
|
|
struct strllist *next;
|
|
char *str;
|
|
}
|
|
*CommandPaths = NULL, *CommandGrps = NULL;
|
|
|
|
#define eitherALT (keystatus[KEYSC_LALT]| keystatus[KEYSC_RALT])
|
|
#define eitherCTRL (keystatus[KEYSC_LCTRL]| keystatus[KEYSC_RCTRL])
|
|
#define eitherSHIFT (keystatus[KEYSC_LSHIFT]|keystatus[KEYSC_RSHIFT])
|
|
|
|
static char *type2str[]={"Wall","Sector","Sector","Sprite","Wall"};
|
|
|
|
static CACHE1D_FIND_REC *finddirs=NULL, *findfiles=NULL, *finddirshigh=NULL, *findfileshigh=NULL;
|
|
static int32_t numdirs=0, numfiles=0;
|
|
static int32_t currentlist=0;
|
|
static int32_t mouseaction=0, mouseax=0, mouseay=0;
|
|
static int32_t repeatcountx, repeatcounty;
|
|
static int32_t infobox=3; // bit0: current window, bit1: mouse pointer, the variable should be renamed
|
|
|
|
static char wallshades[MAXWALLS];
|
|
static char sectorshades[MAXSECTORS][2];
|
|
static char spriteshades[MAXSPRITES];
|
|
static char wallpals[MAXWALLS];
|
|
static char sectorpals[MAXSECTORS][2];
|
|
static char spritepals[MAXSPRITES];
|
|
static char wallflag[MAXWALLS];
|
|
#ifdef POLYMER
|
|
static int16_t spritelightid[MAXSPRITES];
|
|
_prlight *spritelightptr[MAXSPRITES];
|
|
#endif
|
|
extern int32_t graphicsmode;
|
|
|
|
extern int32_t mskip;
|
|
extern int16_t capturecount;
|
|
extern int32_t editorgridextent; // in engine.c
|
|
extern char game_executable[BMAX_PATH];
|
|
|
|
extern int32_t fillsector(int16_t sectnum, char fillcolor);
|
|
|
|
void message(const char *fmt, ...)
|
|
{
|
|
char tmpstr[256];
|
|
va_list va;
|
|
|
|
va_start(va, fmt);
|
|
Bvsnprintf(tmpstr, 256, fmt, va);
|
|
va_end(va);
|
|
|
|
Bstrcpy(getmessage,tmpstr);
|
|
getmessageleng = strlen(getmessage);
|
|
getmessagetimeoff = totalclock+120*2;
|
|
lastmessagetime = totalclock;
|
|
if (!mouseaction)
|
|
{
|
|
Bstrcat(tmpstr,"\n");
|
|
OSD_Printf(tmpstr);
|
|
}
|
|
}
|
|
|
|
typedef struct _mapundo
|
|
{
|
|
int32_t numsectors;
|
|
int32_t numwalls;
|
|
int32_t numsprites;
|
|
|
|
sectortype *sectors;
|
|
walltype *walls;
|
|
spritetype *sprites;
|
|
|
|
int32_t revision;
|
|
|
|
uint32_t sectcrc, wallcrc, spritecrc;
|
|
uint32_t sectsiz, wallsiz, spritesiz;
|
|
|
|
struct _mapundo *next; // 'redo' loads this
|
|
struct _mapundo *prev; // 'undo' loads this
|
|
} mapundo_t;
|
|
|
|
mapundo_t *mapstate = NULL;
|
|
|
|
int32_t map_revision = 1;
|
|
|
|
void create_map_snapshot(void)
|
|
{
|
|
int32_t j;
|
|
uint32_t tempcrc;
|
|
|
|
/*
|
|
if (mapstate->prev == NULL && mapstate->next != NULL) // should be the first map version
|
|
mapstate = mapstate->next;
|
|
*/
|
|
|
|
if (mapstate == NULL)
|
|
{
|
|
mapstate = (mapundo_t *)Bcalloc(1, sizeof(mapundo_t));
|
|
mapstate->revision = map_revision = 1;
|
|
mapstate->prev = mapstate->next = NULL;
|
|
}
|
|
else
|
|
{
|
|
if (mapstate->next != NULL)
|
|
{
|
|
mapundo_t *next = mapstate->next;
|
|
next->prev = NULL;
|
|
|
|
while (next->next)
|
|
next = next->next;
|
|
|
|
do
|
|
{
|
|
if (next->sectors && (next->prev == NULL || (next->sectcrc != next->prev->sectcrc))) Bfree(next->sectors);
|
|
if (next->walls && (next->prev == NULL || (next->wallcrc != next->prev->wallcrc))) Bfree(next->walls);
|
|
if (next->sprites && (next->prev == NULL || (next->spritecrc != next->prev->spritecrc))) Bfree(next->sprites);
|
|
if (!next->prev)
|
|
{
|
|
Bfree(next);
|
|
break;
|
|
}
|
|
next = next->prev;
|
|
Bfree(next->next);
|
|
}
|
|
while (next);
|
|
}
|
|
|
|
mapstate->next = (mapundo_t *)Bcalloc(1, sizeof(mapundo_t));
|
|
mapstate->next->prev = mapstate;
|
|
|
|
mapstate = mapstate->next;
|
|
mapstate->revision = ++map_revision;
|
|
}
|
|
|
|
fixspritesectors();
|
|
|
|
numsprites = 0;
|
|
for (j=MAXSPRITES-1; j>=0; j--)
|
|
{
|
|
if (sprite[j].statnum != MAXSTATUS)
|
|
numsprites++;
|
|
}
|
|
|
|
mapstate->numsectors = numsectors;
|
|
mapstate->numwalls = numwalls;
|
|
mapstate->numsprites = numsprites;
|
|
|
|
tempcrc = crc32once((uint8_t *)§or[0],sizeof(sectortype) * numsectors);
|
|
|
|
|
|
if (numsectors)
|
|
{
|
|
if (mapstate->prev && mapstate->prev->sectcrc == tempcrc)
|
|
{
|
|
mapstate->sectors = mapstate->prev->sectors;
|
|
mapstate->sectsiz = mapstate->prev->sectsiz;
|
|
mapstate->sectcrc = tempcrc;
|
|
/* OSD_Printf("found a match between undo sectors\n"); */
|
|
}
|
|
else
|
|
{
|
|
mapstate->sectors = (sectortype *)Bcalloc(1, sizeof(sectortype) * numsectors);
|
|
mapstate->sectsiz = j = fastlz_compress(§or[0], sizeof(sectortype) * numsectors,
|
|
&mapstate->sectors[0]/*, sizeof(sectortype) * numsectors*/);
|
|
mapstate->sectors = (sectortype *)Brealloc(mapstate->sectors, j);
|
|
mapstate->sectcrc = tempcrc;
|
|
}
|
|
|
|
if (numwalls)
|
|
{
|
|
tempcrc = crc32once((uint8_t *)&wall[0],sizeof(walltype) * numwalls);
|
|
|
|
|
|
if (mapstate->prev && mapstate->prev->wallcrc == tempcrc)
|
|
{
|
|
mapstate->walls = mapstate->prev->walls;
|
|
mapstate->wallsiz = mapstate->prev->wallsiz;
|
|
mapstate->wallcrc = tempcrc;
|
|
/* OSD_Printf("found a match between undo walls\n"); */
|
|
}
|
|
else
|
|
{
|
|
mapstate->walls = (walltype *)Bcalloc(1, sizeof(walltype) * numwalls);
|
|
mapstate->wallsiz = j = fastlz_compress(&wall[0], sizeof(walltype) * numwalls,
|
|
&mapstate->walls[0]/*, sizeof(walltype) * numwalls*/);
|
|
mapstate->walls = (walltype *)Brealloc(mapstate->walls, j);
|
|
mapstate->wallcrc = tempcrc;
|
|
}
|
|
}
|
|
|
|
if (numsprites)
|
|
{
|
|
tempcrc = crc32once((uint8_t *)&sprite[0],sizeof(spritetype) * MAXSPRITES);
|
|
|
|
if (mapstate->prev && mapstate->prev->spritecrc == tempcrc)
|
|
{
|
|
mapstate->sprites = mapstate->prev->sprites;
|
|
mapstate->spritesiz = mapstate->prev->spritesiz;
|
|
mapstate->spritecrc = tempcrc;
|
|
/*OSD_Printf("found a match between undo sprites\n");*/
|
|
}
|
|
else
|
|
{
|
|
int32_t i = 0;
|
|
spritetype *tspri = (spritetype *)Bcalloc(1, sizeof(spritetype) * numsprites),
|
|
*spri = &tspri[0];
|
|
mapstate->sprites = (spritetype *)Bcalloc(1, sizeof(spritetype) * numsprites);
|
|
|
|
for (j=0; j<MAXSPRITES && i < numsprites; j++)
|
|
{
|
|
if (sprite[j].statnum != MAXSTATUS)
|
|
{
|
|
Bmemcpy(spri++,&sprite[j],sizeof(spritetype));
|
|
i++;
|
|
}
|
|
}
|
|
mapstate->spritesiz = j = fastlz_compress(&tspri[0], sizeof(spritetype) * numsprites,
|
|
&mapstate->sprites[0]/*, sizeof(spritetype) * numsprites*/);
|
|
mapstate->sprites = (spritetype *)Brealloc(mapstate->sprites, j);
|
|
mapstate->spritecrc = tempcrc;
|
|
Bfree(tspri);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void map_undoredo_free(void)
|
|
{
|
|
if (mapstate)
|
|
{
|
|
while (mapstate->next)
|
|
mapstate = mapstate->next;
|
|
|
|
while (mapstate->prev)
|
|
{
|
|
mapundo_t *state = mapstate->prev;
|
|
if (mapstate->sectors && (mapstate->sectcrc != mapstate->prev->sectcrc)) Bfree(mapstate->sectors);
|
|
if (mapstate->walls && (mapstate->wallcrc != mapstate->prev->wallcrc)) Bfree(mapstate->walls);
|
|
if (mapstate->sprites && (mapstate->spritecrc != mapstate->prev->spritecrc)) Bfree(mapstate->sprites);
|
|
Bfree(mapstate);
|
|
mapstate = state;
|
|
}
|
|
|
|
if (mapstate->sectors) Bfree(mapstate->sectors);
|
|
if (mapstate->walls) Bfree(mapstate->walls);
|
|
if (mapstate->sprites) Bfree(mapstate->sprites);
|
|
|
|
Bfree(mapstate);
|
|
mapstate = NULL;
|
|
}
|
|
|
|
map_revision = 1;
|
|
}
|
|
|
|
int32_t map_undoredo(int32_t dir)
|
|
{
|
|
int32_t i;
|
|
|
|
if (mapstate == NULL) return 1;
|
|
|
|
if (dir)
|
|
{
|
|
if (mapstate->next == NULL || !mapstate->next->numsectors) return 1;
|
|
|
|
// while (map_revision+1 != mapstate->revision && mapstate->next)
|
|
mapstate = mapstate->next;
|
|
}
|
|
else
|
|
{
|
|
if (mapstate->prev == NULL || !mapstate->prev->numsectors) return 1;
|
|
|
|
// while (map_revision-1 != mapstate->revision && mapstate->prev)
|
|
mapstate = mapstate->prev;
|
|
}
|
|
|
|
numsectors = mapstate->numsectors;
|
|
numwalls = mapstate->numwalls;
|
|
numsprites = mapstate->numsprites;
|
|
map_revision = mapstate->revision;
|
|
|
|
initspritelists();
|
|
|
|
clearbuf(&show2dsector[0],(int32_t)((MAXSECTORS+3)>>5),0L);
|
|
clearbuf(&show2dsprite[0],(int32_t)((MAXSPRITES+3)>>5),0L);
|
|
clearbuf(&show2dwall[0],(int32_t)((MAXWALLS+3)>>5),0L);
|
|
|
|
if (mapstate->numsectors)
|
|
{
|
|
fastlz_decompress(&mapstate->sectors[0], mapstate->sectsiz, §or[0], sizeof(sectortype) * numsectors);
|
|
|
|
if (mapstate->numwalls)
|
|
fastlz_decompress(&mapstate->walls[0], mapstate->wallsiz, &wall[0], sizeof(walltype) * numwalls);
|
|
|
|
if (mapstate->numsprites)
|
|
fastlz_decompress(&mapstate->sprites[0], mapstate->spritesiz, &sprite[0], sizeof(spritetype) * numsprites);
|
|
}
|
|
|
|
updatenumsprites();
|
|
|
|
for (i=0; i<numsprites; i++)
|
|
{
|
|
if ((sprite[i].cstat & 48) == 48) sprite[i].cstat &= ~48;
|
|
insertsprite(sprite[i].sectnum,sprite[i].statnum);
|
|
}
|
|
|
|
#ifdef POLYMER
|
|
if (qsetmode == 200 && rendmode == 4)
|
|
polymer_loadboard();
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
static char *SpriteMode[]=
|
|
{
|
|
"NONE",
|
|
"SECTORS",
|
|
"WALLS",
|
|
"SPRITES",
|
|
"ALL",
|
|
"ITEMS ONLY",
|
|
"CURRENT SPRITE ONLY",
|
|
"ONLY SECTOREFFECTORS AND SECTORS",
|
|
"NO SECTOREFFECTORS OR SECTORS"
|
|
};
|
|
|
|
#define MAXSKILL 5
|
|
static char *SKILLMODE[MAXSKILL]=
|
|
{
|
|
"Actor skill display: PIECE OF CAKE",
|
|
"Actor skill display: LET'S ROCK",
|
|
"Actor skill display: COME GET SOME",
|
|
"Actor skill display: DAMN I'M GOOD",
|
|
"Actor skill display: ALL SKILL LEVELS"
|
|
};
|
|
|
|
#define MAXNOSPRITES 4
|
|
static char *SPRDSPMODE[MAXNOSPRITES]=
|
|
{
|
|
"Sprite display: DISPLAY ALL SPRITES",
|
|
"Sprite display: NO EFFECTORS",
|
|
"Sprite display: NO ACTORS",
|
|
"Sprite display: NO EFFECTORS OR ACTORS"
|
|
};
|
|
|
|
#define MAXHELP3D (int32_t)(sizeof(Help3d)/sizeof(Help3d[0]))
|
|
static char *Help3d[]=
|
|
{
|
|
"Mapster32 3D mode help",
|
|
" ",
|
|
" F1 = TOGGLE THIS HELP DISPLAY",
|
|
" F2 = TOGGLE CLIPBOARD",
|
|
" F3 = MOUSELOOK",
|
|
" F6 = AUTOMATIC SECTOREFFECTOR HELP",
|
|
" F7 = AUTOMATIC SECTOR TAG HELP",
|
|
"",
|
|
" ' A = TOGGLE AUTOSAVE",
|
|
" ' D = CYCLE SPRITE SKILL DISPLAY",
|
|
" ' R = TOGGLE FRAMERATE DISPLAY",
|
|
" ' W = TOGGLE SPRITE DISPLAY",
|
|
" ' X = MAP SHADE PREVIEW",
|
|
" ' Y = TOGGLE PURPLE BACKGROUND",
|
|
"",
|
|
" ' T = CHANGE LOTAG",
|
|
" ' H = CHANGE HITAG",
|
|
" ' S = CHANGE SHADE",
|
|
" ' M = CHANGE EXTRA",
|
|
" ' V = CHANGE VISIBILITY",
|
|
" ' L = CHANGE OBJECT COORDINATES",
|
|
" ' C = CHANGE GLOBAL SHADE",
|
|
"",
|
|
" ' ENTER = PASTE GRAPHIC ONLY",
|
|
" ' P & ; P = PASTE PALETTE TO ALL SELECTED SECTORS",
|
|
" ; V = SET VISIBILITY ON ALL SELECTED SECTORS",
|
|
" ' DEL = CSTAT=0",
|
|
" CTRL-S = SAVE BOARD",
|
|
" HOME = PGUP/PGDN MODIFIER (256 UNITS)",
|
|
" END = PGUP/PGDN MODIFIER (512 UNITS)",
|
|
};
|
|
|
|
static void clearfilenames(void)
|
|
{
|
|
klistfree(finddirs);
|
|
klistfree(findfiles);
|
|
finddirs = findfiles = NULL;
|
|
numfiles = numdirs = 0;
|
|
}
|
|
|
|
static int32_t getfilenames(const char *path, char kind[])
|
|
{
|
|
CACHE1D_FIND_REC *r;
|
|
|
|
clearfilenames();
|
|
finddirs = klistpath(path,"*",CACHE1D_FIND_DIR);
|
|
findfiles = klistpath(path,kind,CACHE1D_FIND_FILE);
|
|
for (r = finddirs; r; r=r->next) numdirs++;
|
|
for (r = findfiles; r; r=r->next) numfiles++;
|
|
|
|
finddirshigh = finddirs;
|
|
findfileshigh = findfiles;
|
|
currentlist = 0;
|
|
if (findfileshigh) currentlist = 1;
|
|
|
|
return(0);
|
|
}
|
|
|
|
void ExtLoadMap(const char *mapname)
|
|
{
|
|
int32_t i;
|
|
int32_t sky=0;
|
|
int32_t j;
|
|
|
|
getmessageleng = 0;
|
|
getmessagetimeoff = 0;
|
|
|
|
// PreCache Wall Tiles
|
|
/*
|
|
for(j=0;j<numwalls;j++)
|
|
if(waloff[wall[j].picnum] == 0)
|
|
{
|
|
loadtile(wall[j].picnum);
|
|
if (bpp != 8)
|
|
polymost_precache(wall[j].picnum,wall[j].pal,0);
|
|
}
|
|
|
|
for(j=0;j<numsectors;j++)
|
|
if(waloff[sector[j].floorpicnum] == 0 || waloff[sector[j].ceilingpicnum] == 0)
|
|
{
|
|
loadtile(sector[j].floorpicnum);
|
|
loadtile(sector[j].ceilingpicnum);
|
|
if (bpp != 8)
|
|
{
|
|
polymost_precache(sector[j].floorpicnum,sector[j].floorpal,0);
|
|
polymost_precache(sector[j].floorpicnum,sector[j].floorpal,0);
|
|
}
|
|
}
|
|
|
|
for(j=0;j<numsprites;j++)
|
|
if(waloff[sprite[j].picnum] == 0)
|
|
{
|
|
loadtile(sprite[j].picnum);
|
|
if (bpp != 8)
|
|
polymost_precache(sprite[j].picnum,sprite[j].pal,1);
|
|
}
|
|
*/
|
|
// Presize Sprites
|
|
|
|
/*
|
|
for (j=numsprites; j>=0; j--)
|
|
{
|
|
/ * if (tilesizx[sprite[j].picnum]==0 || tilesizy[sprite[j].picnum]==0)
|
|
sprite[j].picnum=0; * /
|
|
|
|
if (sprite[j].picnum>=20 && sprite[j].picnum<=59)
|
|
{
|
|
if (sprite[j].picnum==26)
|
|
{
|
|
sprite[j].xrepeat = 8;
|
|
sprite[j].yrepeat = 8;
|
|
}
|
|
else
|
|
{
|
|
sprite[j].xrepeat = 32;
|
|
sprite[j].yrepeat = 32;
|
|
}
|
|
}
|
|
|
|
}
|
|
*/
|
|
|
|
Bstrcpy(levelname,mapname);
|
|
pskyoff[0]=0;
|
|
for (i=0; i<8; i++) pskyoff[i]=0;
|
|
|
|
for (i=0; i<numsectors; i++)
|
|
{
|
|
switch (sector[i].ceilingpicnum)
|
|
{
|
|
case MOONSKY1 :
|
|
case BIGORBIT1 : // orbit
|
|
case LA : // la city
|
|
sky=sector[i].ceilingpicnum;
|
|
break;
|
|
}
|
|
}
|
|
|
|
switch (sky)
|
|
{
|
|
case MOONSKY1 :
|
|
// earth mountian mountain sun
|
|
pskyoff[6]=1;
|
|
pskyoff[1]=2;
|
|
pskyoff[4]=2;
|
|
pskyoff[2]=3;
|
|
break;
|
|
|
|
case BIGORBIT1 : // orbit
|
|
// earth1 2 3 moon/sun
|
|
pskyoff[5]=1;
|
|
pskyoff[6]=2;
|
|
pskyoff[7]=3;
|
|
pskyoff[2]=4;
|
|
break;
|
|
|
|
case LA : // la city
|
|
// earth1 2 3 moon/sun
|
|
pskyoff[0]=1;
|
|
pskyoff[1]=2;
|
|
pskyoff[2]=1;
|
|
pskyoff[3]=3;
|
|
pskyoff[4]=4;
|
|
pskyoff[5]=0;
|
|
pskyoff[6]=2;
|
|
pskyoff[7]=3;
|
|
break;
|
|
}
|
|
|
|
pskybits=3;
|
|
parallaxtype=0;
|
|
Bsprintf(tempbuf, "Mapster32 - %s",mapname);
|
|
|
|
map_undoredo_free();
|
|
wm_setapptitle(tempbuf);
|
|
}
|
|
|
|
void ExtSaveMap(const char *mapname)
|
|
{
|
|
UNREFERENCED_PARAMETER(mapname);
|
|
saveboard("backup.map",&pos.x,&pos.y,&pos.z,&ang,&cursectnum);
|
|
}
|
|
|
|
int32_t getTileGroup(const char *groupName)
|
|
{
|
|
int32_t temp;
|
|
for (temp = 0; temp < MAX_TILE_GROUPS; temp++)
|
|
{
|
|
if (s_TileGroups[temp].szText == NULL)
|
|
{
|
|
return -1;
|
|
}
|
|
if (!strcmp(s_TileGroups[temp].szText, groupName))
|
|
{
|
|
return temp;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
int32_t tileInGroup(int32_t group, int32_t tilenum)
|
|
{
|
|
// @todo Make a bitmap instead of doing this slow search..
|
|
int32_t temp;
|
|
if (group < 0 || group >= MAX_TILE_GROUPS || s_TileGroups[group].szText == NULL)
|
|
{
|
|
// group isn't valid.
|
|
return 0;
|
|
}
|
|
for (temp = 0; temp < s_TileGroups[group].nIds; temp++)
|
|
{
|
|
if (tilenum == s_TileGroups[group].pIds[temp])
|
|
{
|
|
return 1;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
const char *ExtGetSectorType(int32_t lotag)
|
|
{
|
|
static char tempbuf[64];
|
|
Bmemset(tempbuf,0,sizeof(tempbuf));
|
|
switch (lotag)
|
|
{
|
|
case 1:
|
|
Bsprintf(tempbuf,"WATER (SE 7)");
|
|
break;
|
|
case 2:
|
|
Bsprintf(tempbuf,"UNDERWATER (SE 7)");
|
|
break;
|
|
case 9:
|
|
Bsprintf(tempbuf,"STAR TREK DOORS");
|
|
break;
|
|
case 15:
|
|
Bsprintf(tempbuf,"ELEVATOR TRANSPORT (SE 17)");
|
|
break;
|
|
case 16:
|
|
Bsprintf(tempbuf,"ELEVATOR PLATFORM DOWN");
|
|
break;
|
|
case 17:
|
|
Bsprintf(tempbuf,"ELEVATOR PLATFORM UP");
|
|
break;
|
|
case 18:
|
|
Bsprintf(tempbuf,"ELEVATOR DOWN");
|
|
break;
|
|
case 19:
|
|
Bsprintf(tempbuf,"ELEVATOR UP");
|
|
break;
|
|
case 20:
|
|
Bsprintf(tempbuf,"CEILING DOOR");
|
|
break;
|
|
case 21:
|
|
Bsprintf(tempbuf,"FLOOR DOOR");
|
|
break;
|
|
case 22:
|
|
Bsprintf(tempbuf,"SPLIT DOOR");
|
|
break;
|
|
case 23:
|
|
Bsprintf(tempbuf,"SWING DOOR (SE 11)");
|
|
break;
|
|
case 25:
|
|
Bsprintf(tempbuf,"SLIDE DOOR (SE 15)");
|
|
break;
|
|
case 26:
|
|
Bsprintf(tempbuf,"SPLIT STAR TREK DOOR");
|
|
break;
|
|
case 27:
|
|
Bsprintf(tempbuf,"BRIDGE (SE 20)");
|
|
break;
|
|
case 28:
|
|
Bsprintf(tempbuf,"DROP FLOOR (SE 21)");
|
|
break;
|
|
case 29:
|
|
Bsprintf(tempbuf,"TEETH DOOR (SE 22)");
|
|
break;
|
|
case 30:
|
|
Bsprintf(tempbuf,"ROTATE RISE BRIDGE");
|
|
break;
|
|
case 31:
|
|
Bsprintf(tempbuf,"2 WAY TRAIN (SE=30)");
|
|
break;
|
|
case 32767:
|
|
Bsprintf(tempbuf,"SECRET ROOM");
|
|
break;
|
|
case -1:
|
|
Bsprintf(tempbuf,"END OF LEVEL");
|
|
break;
|
|
default :
|
|
if (lotag > 10000 && lotag < 32767)
|
|
Bsprintf(tempbuf,"1 TIME SOUND");
|
|
// else Bsprintf(tempbuf,"%hu",lotag);
|
|
break;
|
|
}
|
|
return(tempbuf);
|
|
}
|
|
|
|
const char *ExtGetSectorCaption(int16_t sectnum)
|
|
{
|
|
static char tempbuf[64];
|
|
Bmemset(tempbuf,0,sizeof(tempbuf));
|
|
if (qsetmode != 200 && (!(onnames==1 || onnames==4 || onnames==7) || (onnames==8)))
|
|
{
|
|
tempbuf[0] = 0;
|
|
return(tempbuf);
|
|
}
|
|
|
|
if (qsetmode != 200 && (sector[sectnum].lotag|sector[sectnum].hitag) == 0)
|
|
{
|
|
tempbuf[0] = 0;
|
|
}
|
|
else
|
|
{
|
|
Bstrcpy(lo,ExtGetSectorType(sector[sectnum].lotag));
|
|
if (qsetmode != 200)
|
|
Bsprintf(tempbuf,"%hu,%hu %s",sector[sectnum].hitag,sector[sectnum].lotag,lo);
|
|
else Bsprintf(tempbuf,"%hu %s",sector[sectnum].lotag,lo);
|
|
}
|
|
return(tempbuf);
|
|
}
|
|
|
|
const char *ExtGetWallCaption(int16_t wallnum)
|
|
{
|
|
static char tempbuf[64];
|
|
|
|
Bmemset(tempbuf,0,sizeof(tempbuf));
|
|
|
|
if (wall[wallnum].cstat & (1<<14))
|
|
{
|
|
int32_t dax = wall[wallnum].x-wall[wall[wallnum].point2].x;
|
|
int32_t day = wall[wallnum].y-wall[wall[wallnum].point2].y;
|
|
int32_t dist = ksqrt(dax*dax+day*day);
|
|
Bsprintf(tempbuf,"%d",dist);
|
|
wall[wallnum].cstat &= ~(1<<14);
|
|
return(tempbuf);
|
|
}
|
|
|
|
|
|
if (!(onnames==2 || onnames==4))
|
|
{
|
|
tempbuf[0] = 0;
|
|
return(tempbuf);
|
|
}
|
|
|
|
// HERE
|
|
|
|
if ((wall[wallnum].lotag|wall[wallnum].hitag) == 0)
|
|
{
|
|
tempbuf[0] = 0;
|
|
}
|
|
else
|
|
{
|
|
Bsprintf(tempbuf,"%hu,%hu",wall[wallnum].hitag,wall[wallnum].lotag);
|
|
}
|
|
return(tempbuf);
|
|
} //end
|
|
|
|
const char *SectorEffectorTagText(int32_t lotag)
|
|
{
|
|
static char tempbuf[64];
|
|
Bmemset(tempbuf,0,sizeof(tempbuf));
|
|
switch (lotag)
|
|
{
|
|
case 0:
|
|
Bsprintf(tempbuf,"%d: ROTATED SECTOR",lotag);
|
|
break;
|
|
case 1:
|
|
Bsprintf(tempbuf,"%d: PIVOT SPRITE FOR SE 0",lotag);
|
|
break;
|
|
case 2:
|
|
Bsprintf(tempbuf,"%d: EARTHQUAKE",lotag);
|
|
break;
|
|
case 3:
|
|
Bsprintf(tempbuf,"%d: RANDOM LIGHTS AFTER SHOT OUT",lotag);
|
|
break;
|
|
case 4:
|
|
Bsprintf(tempbuf,"%d: RANDOM LIGHTS",lotag);
|
|
break;
|
|
case 6:
|
|
Bsprintf(tempbuf,"%d: SUBWAY",lotag);
|
|
break;
|
|
case 7:
|
|
Bsprintf(tempbuf,"%d: TRANSPORT",lotag);
|
|
break;
|
|
case 8:
|
|
Bsprintf(tempbuf,"%d: UP OPEN DOOR LIGHTS",lotag);
|
|
break;
|
|
case 9:
|
|
Bsprintf(tempbuf,"%d: DOWN OPEN DOOR LIGHTS",lotag);
|
|
break;
|
|
case 10:
|
|
Bsprintf(tempbuf,"%d: DOOR AUTO CLOSE (H=DELAY)",lotag);
|
|
break;
|
|
case 11:
|
|
Bsprintf(tempbuf,"%d: ROTATE SECTOR DOOR",lotag);
|
|
break;
|
|
case 12:
|
|
Bsprintf(tempbuf,"%d: LIGHT SWITCH",lotag);
|
|
break;
|
|
case 13:
|
|
Bsprintf(tempbuf,"%d: EXPLOSIVE",lotag);
|
|
break;
|
|
case 14:
|
|
Bsprintf(tempbuf,"%d: SUBWAY CAR",lotag);
|
|
break;
|
|
case 15:
|
|
Bsprintf(tempbuf,"%d: SLIDE DOOR (ST 25)",lotag);
|
|
break;
|
|
case 16:
|
|
Bsprintf(tempbuf,"%d: ROTATE REACTOR SECTOR",lotag);
|
|
break;
|
|
case 17:
|
|
Bsprintf(tempbuf,"%d: ELEVATOR TRANSPORT (ST 15)",lotag);
|
|
break;
|
|
case 18:
|
|
Bsprintf(tempbuf,"%d: INCREMENTAL SECTOR RISE/FALL",lotag);
|
|
break;
|
|
case 19:
|
|
Bsprintf(tempbuf,"%d: CEILING FALL ON EXPLOSION",lotag);
|
|
break;
|
|
case 20:
|
|
Bsprintf(tempbuf,"%d: BRIDGE (ST 27)",lotag);
|
|
break;
|
|
case 21:
|
|
Bsprintf(tempbuf,"%d: DROP FLOOR (ST 28)",lotag);
|
|
break;
|
|
case 22:
|
|
Bsprintf(tempbuf,"%d: TEETH DOOR (ST 29)",lotag);
|
|
break;
|
|
case 23:
|
|
Bsprintf(tempbuf,"%d: 1-WAY SE7 DESTINATION (H=SE 7)",lotag);
|
|
break;
|
|
case 24:
|
|
Bsprintf(tempbuf,"%d: CONVAYER BELT",lotag);
|
|
break;
|
|
case 25:
|
|
Bsprintf(tempbuf,"%d: ENGINE",lotag);
|
|
break;
|
|
case 28:
|
|
Bsprintf(tempbuf,"%d: LIGHTNING (H= TILE#4890)",lotag);
|
|
break;
|
|
case 27:
|
|
Bsprintf(tempbuf,"%d: CAMERA FOR PLAYBACK",lotag);
|
|
break;
|
|
case 29:
|
|
Bsprintf(tempbuf,"%d: FLOAT",lotag);
|
|
break;
|
|
case 30:
|
|
Bsprintf(tempbuf,"%d: 2 WAY TRAIN (ST=31)",lotag);
|
|
break;
|
|
case 31:
|
|
Bsprintf(tempbuf,"%d: FLOOR RISE",lotag);
|
|
break;
|
|
case 32:
|
|
Bsprintf(tempbuf,"%d: CEILING FALL",lotag);
|
|
break;
|
|
case 33:
|
|
Bsprintf(tempbuf,"%d: SPAWN JIB W/QUAKE",lotag);
|
|
break;
|
|
case 36:
|
|
Bsprintf(tempbuf,"%d: SKRINK RAY SHOOTER",lotag);
|
|
break;
|
|
case 49:
|
|
Bsprintf(tempbuf,"%d: POINT LIGHT",lotag);
|
|
break;
|
|
case 50:
|
|
Bsprintf(tempbuf,"%d: SPOTLIGHT",lotag);
|
|
break;
|
|
default:
|
|
Bsprintf(tempbuf,"%d: (UNKNOWN)",lotag);
|
|
break;
|
|
}
|
|
return (tempbuf);
|
|
}
|
|
|
|
const char *MusicAndSFXTagText(int32_t lotag)
|
|
{
|
|
static char tempbuf[16];
|
|
|
|
Bmemset(tempbuf, 0, sizeof(tempbuf));
|
|
|
|
if (g_numsounds <= 0)
|
|
return tempbuf;
|
|
|
|
if (lotag>0 && lotag<999 && g_sounds[lotag].definedname)
|
|
return g_sounds[lotag].definedname;
|
|
|
|
if (lotag>=1000 && lotag<2000)
|
|
Bsprintf(tempbuf, "REVERB");
|
|
return tempbuf;
|
|
}
|
|
|
|
const char *SectorEffectorText(int32_t spritenum)
|
|
{
|
|
static char tempbuf[64];
|
|
Bmemset(tempbuf,0,sizeof(tempbuf));
|
|
Bmemset(lo,0,sizeof(lo));
|
|
Bstrcpy(lo,SectorEffectorTagText(sprite[spritenum].lotag));
|
|
if (!lo[5]) // tags are 5 chars or less
|
|
SpriteName(spritenum,tempbuf);
|
|
else Bsprintf(tempbuf,"SE %s",lo);
|
|
return (tempbuf);
|
|
}
|
|
|
|
const char *ExtGetSpriteCaption(int16_t spritenum)
|
|
{
|
|
static char tempbuf[1024];
|
|
|
|
Bmemset(tempbuf,0,sizeof(tempbuf));
|
|
if ((onnames!=5 && onnames!=6 &&(!(onnames==3 || onnames==4 || onnames==7 || onnames==8))) || (onnames==7 && sprite[spritenum].picnum!=1))
|
|
{
|
|
tempbuf[0] = 0;
|
|
return(tempbuf);
|
|
}
|
|
|
|
if (onnames==5)
|
|
{
|
|
if (!tileInGroup(tilegroupItems, sprite[spritenum].picnum))
|
|
{
|
|
tempbuf[0] = 0;
|
|
return(tempbuf);
|
|
}
|
|
}
|
|
|
|
if (onnames==6 && sprite[spritenum].picnum != sprite[cursprite].picnum)
|
|
{
|
|
tempbuf[0] = 0;
|
|
return(tempbuf);
|
|
}
|
|
|
|
tempbuf[0] = 0;
|
|
if ((sprite[spritenum].lotag|sprite[spritenum].hitag) == 0)
|
|
{
|
|
SpriteName(spritenum,lo);
|
|
if (lo[0]!=0)
|
|
{
|
|
if (sprite[spritenum].pal==1) Bsprintf(tempbuf,"%s (MULTIPLAYER)",lo);
|
|
else Bsprintf(tempbuf,"%s",lo);
|
|
}
|
|
}
|
|
else if (sprite[spritenum].picnum==SECTOREFFECTOR)
|
|
{
|
|
if (onnames==8)
|
|
tempbuf[0] = 0;
|
|
else
|
|
{
|
|
Bsprintf(lo,"%s",SectorEffectorText(spritenum));
|
|
Bsprintf(tempbuf,"%s, %hu",lo,sprite[spritenum].hitag);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
SpriteName(spritenum,lo);
|
|
if (sprite[spritenum].extra != -1)
|
|
Bsprintf(tempbuf,"%hu,%hu,%d %s",sprite[spritenum].hitag,sprite[spritenum].lotag,sprite[spritenum].extra,lo);
|
|
else
|
|
Bsprintf(tempbuf,"%hu,%hu %s",sprite[spritenum].hitag,sprite[spritenum].lotag,lo);
|
|
}
|
|
return(tempbuf);
|
|
|
|
} //end
|
|
|
|
//printext16 parameters:
|
|
//printext16(int32_t xpos, int32_t ypos, int16_t col, int16_t 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(int32_t x1, int32_t y1, int32_t x2, int32_t 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
|
|
|
|
void ExtShowSectorData(int16_t sectnum) //F5
|
|
{
|
|
int16_t statnum=0;
|
|
int32_t x,x2,y;
|
|
int32_t i,color;
|
|
int32_t secrets=0;
|
|
int32_t totalactors1=0,totalactors2=0,totalactors3=0,totalactors4=0;
|
|
int32_t totalrespawn=0;
|
|
|
|
UNREFERENCED_PARAMETER(sectnum);
|
|
if (qsetmode==200)
|
|
return;
|
|
|
|
for (i=0; i<numsectors; i++)
|
|
{
|
|
if (sector[i].lotag==32767) secrets++;
|
|
}
|
|
|
|
statnum=0;
|
|
i = headspritestat[statnum];
|
|
while (i != -1)
|
|
{
|
|
// Count all non-player actors.
|
|
if (tileInGroup(tilegroupActors, sprite[i].picnum))
|
|
{
|
|
if (sprite[i].lotag<=1) totalactors1++;
|
|
if (sprite[i].lotag<=2) totalactors2++;
|
|
if (sprite[i].lotag<=3) totalactors3++;
|
|
if (sprite[i].lotag<=4) totalactors4++;
|
|
}
|
|
if (sprite[i].picnum == RESPAWN) totalrespawn++;
|
|
|
|
i = nextspritestat[i];
|
|
}
|
|
|
|
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 (sprite[i].pal!=0) multisprite[sprite[i].picnum]++;
|
|
else numsprite[sprite[i].picnum]++;
|
|
}
|
|
}
|
|
|
|
clearmidstatbar16(); //Clear middle of status bar
|
|
|
|
ydim -= 8;
|
|
color = whitecol-21;
|
|
begindrawing();
|
|
for (i=ydim-STATUS2DSIZ+16; i<ydim; i++)
|
|
{
|
|
clearbufbyte((char *)(frameplace + (i*bytesperline)), bytesperline, ((int32_t)color<<24)|((int32_t)color<<16)|((int32_t)color<<8)|color);
|
|
color--;
|
|
if (color <= 0) break;
|
|
}
|
|
clearbufbyte((char *)(frameplace + (i*bytesperline)), (ydim-i)*(bytesperline), 0);
|
|
enddrawing();
|
|
ydim += 8;
|
|
|
|
Bsprintf(tempbuf,"Level %s",levelname);
|
|
printmessage16(tempbuf);
|
|
|
|
ydim -= 8; // reset at end!!
|
|
x=1;
|
|
x2=14;
|
|
y=4;
|
|
begindrawing();
|
|
printext16(x*8,ydim-STATUS2DSIZ+y*8,editorcolors[11],-1,"Item Count",0);
|
|
enddrawing();
|
|
PrintStatus("10%health=",numsprite[COLA],x,y+2,11);
|
|
PrintStatus("",multisprite[COLA],x2,y+2,9);
|
|
PrintStatus("30%health=",numsprite[SIXPAK],x,y+3,11);
|
|
PrintStatus("",multisprite[SIXPAK],x2,y+3,9);
|
|
PrintStatus("Med-Kit =",numsprite[FIRSTAID],x,y+4,11);
|
|
PrintStatus("",multisprite[FIRSTAID],x2,y+4,9);
|
|
PrintStatus("Atom =",numsprite[ATOMICHEALTH],x,y+5,11);
|
|
PrintStatus("",multisprite[ATOMICHEALTH],x2,y+5,9);
|
|
PrintStatus("Shields =",numsprite[SHIELD],x,y+6,11);
|
|
PrintStatus("",multisprite[SHIELD],x2,y+6,9);
|
|
|
|
x=17;
|
|
x2=30;
|
|
y=4;
|
|
begindrawing();
|
|
printext16(x*8,ydim-STATUS2DSIZ+y*8,editorcolors[11],-1,"Inventory",0);
|
|
enddrawing();
|
|
PrintStatus("Steroids =",numsprite[STEROIDS],x,y+2,11);
|
|
PrintStatus("",multisprite[STEROIDS],x2,y+2,9);
|
|
PrintStatus("Airtank =",numsprite[AIRTANK],x,y+3,11);
|
|
PrintStatus("",multisprite[AIRTANK],x2,y+3,9);
|
|
PrintStatus("Jetpack =",numsprite[JETPACK],x,y+4,11);
|
|
PrintStatus("",multisprite[JETPACK],x2,y+4,9);
|
|
PrintStatus("Goggles =",numsprite[HEATSENSOR],x,y+5,11);
|
|
PrintStatus("",multisprite[HEATSENSOR],x2,y+5,9);
|
|
PrintStatus("Boots =",numsprite[BOOTS],x,y+6,11);
|
|
PrintStatus("",multisprite[BOOTS],x2,y+6,9);
|
|
PrintStatus("HoloDuke =",numsprite[HOLODUKE],x,y+7,11);
|
|
PrintStatus("",multisprite[HOLODUKE],x2,y+7,9);
|
|
PrintStatus("Multi D =",numsprite[APLAYER],x,y+8,11);
|
|
|
|
x=33;
|
|
x2=46;
|
|
y=4;
|
|
begindrawing();
|
|
printext16(x*8,ydim-STATUS2DSIZ+y*8,editorcolors[11],-1,"Weapon Count",0);
|
|
enddrawing();
|
|
PrintStatus("Pistol =",numsprite[FIRSTGUNSPRITE],x,y+2,11);
|
|
PrintStatus("",multisprite[FIRSTGUNSPRITE],x2,y+2,9);
|
|
PrintStatus("Shotgun =",numsprite[SHOTGUNSPRITE],x,y+3,11);
|
|
PrintStatus("",multisprite[SHOTGUNSPRITE],x2,y+3,9);
|
|
PrintStatus("Chaingun =",numsprite[CHAINGUNSPRITE],x,y+4,11);
|
|
PrintStatus("",multisprite[CHAINGUNSPRITE],x2,y+4,9);
|
|
PrintStatus("RPG =",numsprite[RPGSPRITE],x,y+5,11);
|
|
PrintStatus("",multisprite[RPGSPRITE],x2,y+5,9);
|
|
PrintStatus("Pipe Bomb=",numsprite[HEAVYHBOMB],x,y+6,11);
|
|
PrintStatus("",multisprite[HEAVYHBOMB],x2,y+6,9);
|
|
PrintStatus("Shrinker =",numsprite[SHRINKERSPRITE],x,y+7,11);
|
|
PrintStatus("",multisprite[SHRINKERSPRITE],x2,y+7,9);
|
|
PrintStatus("Devastatr=",numsprite[DEVISTATORSPRITE],x,y+8,11);
|
|
PrintStatus("",multisprite[DEVISTATORSPRITE],x2,y+8,9);
|
|
PrintStatus("Trip mine=",numsprite[TRIPBOMBSPRITE],x,y+9,11);
|
|
PrintStatus("",multisprite[TRIPBOMBSPRITE],x2,y+9,9);
|
|
PrintStatus("Freezeray=",numsprite[FREEZESPRITE],x,y+10,11);
|
|
PrintStatus("",multisprite[FREEZESPRITE],x2,y+10,9);
|
|
|
|
x=49;
|
|
x2=62;
|
|
y=4;
|
|
begindrawing();
|
|
printext16(x*8,ydim-STATUS2DSIZ+y*8,editorcolors[11],-1,"Ammo Count",0);
|
|
enddrawing();
|
|
PrintStatus("Pistol =",numsprite[AMMO],x,y+2,11);
|
|
PrintStatus("",multisprite[AMMO],x2,y+2,9);
|
|
PrintStatus("Shot =",numsprite[SHOTGUNAMMO],x,y+3,11);
|
|
PrintStatus("",multisprite[SHOTGUNAMMO],x2,y+3,9);
|
|
PrintStatus("Chain =",numsprite[BATTERYAMMO],x,y+4,11);
|
|
PrintStatus("",multisprite[BATTERYAMMO],x2,y+4,9);
|
|
PrintStatus("RPG Box =",numsprite[RPGAMMO],x,y+5,11);
|
|
PrintStatus("",multisprite[RPGAMMO],x2,y+5,9);
|
|
PrintStatus("Pipe Bomb=",numsprite[HBOMBAMMO],x,y+6,11);
|
|
PrintStatus("",multisprite[HBOMBAMMO],x2,y+6,9);
|
|
PrintStatus("Shrinker =",numsprite[CRYSTALAMMO],x,y+7,11);
|
|
PrintStatus("",multisprite[CRYSTALAMMO],x2,y+7,9);
|
|
PrintStatus("Devastatr=",numsprite[DEVISTATORAMMO],x,y+8,11);
|
|
PrintStatus("",multisprite[DEVISTATORAMMO],x2,y+8,9);
|
|
PrintStatus("Expander =",numsprite[GROWAMMO],x,y+9,11);
|
|
PrintStatus("",multisprite[GROWAMMO],x2,y+9,9);
|
|
PrintStatus("Freezeray=",numsprite[FREEZEAMMO],x,y+10,11);
|
|
PrintStatus("",multisprite[FREEZEAMMO],x2,y+10,9);
|
|
|
|
begindrawing();
|
|
printext16(65*8,ydim-STATUS2DSIZ+4*8,editorcolors[11],-1,"MISC",0);
|
|
enddrawing();
|
|
PrintStatus("Secrets =",secrets,65,6,11);
|
|
begindrawing();
|
|
printext16(65*8,ydim-STATUS2DSIZ+8*8,editorcolors[11],-1,"ACTORS",0);
|
|
enddrawing();
|
|
PrintStatus("Skill 1 =",totalactors1,65,10,11);
|
|
PrintStatus("Skill 2 =",totalactors2,65,11,11);
|
|
PrintStatus("Skill 3 =",totalactors3,65,12,11);
|
|
PrintStatus("Skill 4 =",totalactors4,65,13,11);
|
|
PrintStatus("Respawn =",totalrespawn,65,14,11);
|
|
ydim += 8; // see above!
|
|
|
|
}// end ExtShowSectorData
|
|
|
|
void ExtShowWallData(int16_t wallnum) //F6
|
|
{
|
|
int32_t i,nextfreetag=0,total=0,color;
|
|
char x,y;
|
|
|
|
UNREFERENCED_PARAMETER(wallnum);
|
|
|
|
if (qsetmode==200)
|
|
return;
|
|
|
|
for (i=0; i<MAXSPRITES; i++)
|
|
{
|
|
if (sprite[i].statnum==0)
|
|
switch (sprite[i].picnum)
|
|
{
|
|
//LOTAG
|
|
case ACTIVATOR:
|
|
case ACTIVATORLOCKED:
|
|
case TOUCHPLATE:
|
|
case MASTERSWITCH:
|
|
case RESPAWN:
|
|
case ACCESSSWITCH:
|
|
case SLOTDOOR:
|
|
case LIGHTSWITCH:
|
|
case SPACEDOORSWITCH:
|
|
case SPACELIGHTSWITCH:
|
|
case FRANKENSTINESWITCH:
|
|
case MULTISWITCH:
|
|
case DIPSWITCH:
|
|
case DIPSWITCH2:
|
|
case TECHSWITCH:
|
|
case DIPSWITCH3:
|
|
case ACCESSSWITCH2:
|
|
case POWERSWITCH1:
|
|
case LOCKSWITCH1:
|
|
case POWERSWITCH2:
|
|
case PULLSWITCH:
|
|
case ALIENSWITCH:
|
|
if (sprite[i].lotag>nextfreetag) nextfreetag=1+sprite[i].lotag;
|
|
break;
|
|
|
|
//HITAG
|
|
case SEENINE:
|
|
case OOZFILTER:
|
|
case SECTOREFFECTOR:
|
|
if (sprite[i].lotag==10 || sprite[i].lotag==27 || sprite[i].lotag==28 || sprite[i].lotag==29)
|
|
break;
|
|
else if (sprite[i].hitag>nextfreetag) nextfreetag=1+sprite[i].hitag;
|
|
break;
|
|
default:
|
|
break;
|
|
|
|
}
|
|
|
|
} // end sprite loop
|
|
|
|
//Count Normal Actors
|
|
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 (sprite[i].pal!=0)
|
|
switch (sprite[i].picnum)
|
|
{
|
|
case LIZTROOP :
|
|
case LIZTROOPRUNNING :
|
|
case LIZTROOPSTAYPUT :
|
|
case LIZTROOPSHOOT :
|
|
case LIZTROOPJETPACK :
|
|
case LIZTROOPONTOILET :
|
|
case LIZTROOPDUCKING :
|
|
numsprite[LIZTROOP]++;
|
|
break;
|
|
case BOSS1:
|
|
case BOSS1STAYPUT:
|
|
case BOSS1SHOOT:
|
|
case BOSS1LOB:
|
|
case BOSSTOP:
|
|
multisprite[BOSS1]++;
|
|
break;
|
|
case BOSS2:
|
|
multisprite[BOSS2]++;
|
|
break;
|
|
case BOSS3:
|
|
multisprite[BOSS3]++;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
else
|
|
switch (sprite[i].picnum)
|
|
{
|
|
case LIZTROOP :
|
|
case LIZTROOPRUNNING :
|
|
case LIZTROOPSTAYPUT :
|
|
case LIZTROOPSHOOT :
|
|
case LIZTROOPJETPACK :
|
|
case LIZTROOPONTOILET :
|
|
case LIZTROOPDUCKING :
|
|
numsprite[LIZTROOP]++;
|
|
break;
|
|
case PIGCOP:
|
|
case PIGCOPSTAYPUT:
|
|
case PIGCOPDIVE:
|
|
numsprite[PIGCOP]++;
|
|
break;
|
|
case LIZMAN:
|
|
case LIZMANSTAYPUT:
|
|
case LIZMANSPITTING:
|
|
case LIZMANFEEDING:
|
|
case LIZMANJUMP:
|
|
numsprite[LIZMAN]++;
|
|
break;
|
|
case BOSS1:
|
|
case BOSS1STAYPUT:
|
|
case BOSS1SHOOT:
|
|
case BOSS1LOB:
|
|
case BOSSTOP:
|
|
numsprite[BOSS1]++;
|
|
break;
|
|
case COMMANDER:
|
|
case COMMANDERSTAYPUT:
|
|
numsprite[COMMANDER]++;
|
|
break;
|
|
case OCTABRAIN:
|
|
case OCTABRAINSTAYPUT:
|
|
numsprite[OCTABRAIN]++;
|
|
break;
|
|
case RECON:
|
|
case DRONE:
|
|
case ROTATEGUN:
|
|
case EGG:
|
|
case ORGANTIC:
|
|
case GREENSLIME:
|
|
case BOSS2:
|
|
case BOSS3:
|
|
case TANK:
|
|
case NEWBEAST:
|
|
case BOSS4:
|
|
|
|
numsprite[sprite[i].picnum]++;
|
|
default:
|
|
break;
|
|
|
|
}// end switch
|
|
}// end if
|
|
}//end for
|
|
total=0;
|
|
for (i=0; i<MAXSPRITES; i++) if (numsprite[i]!=0) total+=numsprite[i];
|
|
for (i=0; i<MAXSPRITES; i++) if (multisprite[i]!=0) total+=multisprite[i];
|
|
|
|
clearmidstatbar16();
|
|
|
|
color = whitecol-21;
|
|
begindrawing();
|
|
for (i=ydim-STATUS2DSIZ+16; i<ydim; i++)
|
|
{
|
|
clearbufbyte((char *)(frameplace + (i*bytesperline)), bytesperline, ((int32_t)color<<24)|((int32_t)color<<16)|((int32_t)color<<8)|color);
|
|
color--;
|
|
if (color <= 0) break;
|
|
}
|
|
clearbufbyte((char *)(frameplace + (i*bytesperline)), (ydim-i)*(bytesperline), 0);
|
|
enddrawing();
|
|
|
|
Bsprintf(tempbuf,"Level %s next tag %d",levelname,nextfreetag);
|
|
printmessage16(tempbuf);
|
|
|
|
x=2;
|
|
y=4;
|
|
PrintStatus("Normal Actors =",total,x,y,11);
|
|
|
|
PrintStatus(" Liztroop =",numsprite[LIZTROOP],x,y+1,11);
|
|
PrintStatus(" Lizman =",numsprite[LIZMAN],x,y+2,11);
|
|
PrintStatus(" Commander =",numsprite[COMMANDER],x,y+3,11);
|
|
PrintStatus(" Octabrain =",numsprite[OCTABRAIN],x,y+4,11);
|
|
PrintStatus(" PigCop =",numsprite[PIGCOP],x,y+5,11);
|
|
PrintStatus(" Recon Car =",numsprite[RECON],x,y+6,11);
|
|
PrintStatus(" Drone =",numsprite[DRONE],x,y+7,11);
|
|
PrintStatus(" Turret =",numsprite[ROTATEGUN],x,y+8,11);
|
|
PrintStatus(" Egg =",numsprite[EGG],x,y+9,11);
|
|
x+=17;
|
|
PrintStatus("Slimer =",numsprite[GREENSLIME],x,y+1,11);
|
|
PrintStatus("Boss1 =",numsprite[BOSS1],x,y+2,11);
|
|
PrintStatus("MiniBoss1 =",multisprite[BOSS1],x,y+3,11);
|
|
PrintStatus("Boss2 =",numsprite[BOSS2],x,y+4,11);
|
|
PrintStatus("Boss3 =",numsprite[BOSS3],x,y+5,11);
|
|
PrintStatus("Riot Tank =",numsprite[TANK],x,y+6,11);
|
|
PrintStatus("Newbeast =",numsprite[NEWBEAST],x,y+7,11);
|
|
PrintStatus("Boss4 =",numsprite[BOSS4],x,y+8,11);
|
|
|
|
//Count Respawn Actors
|
|
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 && sprite[i].picnum==RESPAWN)
|
|
{
|
|
switch (sprite[i].hitag)
|
|
{
|
|
case LIZTROOP :
|
|
case LIZTROOPRUNNING :
|
|
case LIZTROOPSTAYPUT :
|
|
case LIZTROOPSHOOT :
|
|
case LIZTROOPJETPACK :
|
|
case LIZTROOPONTOILET :
|
|
case LIZTROOPDUCKING :
|
|
numsprite[LIZTROOP]++;
|
|
break;
|
|
case PIGCOP:
|
|
case PIGCOPSTAYPUT:
|
|
case PIGCOPDIVE:
|
|
numsprite[PIGCOP]++;
|
|
break;
|
|
case LIZMAN:
|
|
case LIZMANSTAYPUT:
|
|
case LIZMANSPITTING:
|
|
case LIZMANFEEDING:
|
|
case LIZMANJUMP:
|
|
numsprite[LIZMAN]++;
|
|
break;
|
|
case BOSS1:
|
|
case BOSS1STAYPUT:
|
|
case BOSS1SHOOT:
|
|
case BOSS1LOB:
|
|
case BOSSTOP:
|
|
if (sprite[i].pal!=0) multisprite[BOSS1]++;
|
|
else numsprite[BOSS1]++;
|
|
break;
|
|
case COMMANDER:
|
|
case COMMANDERSTAYPUT:
|
|
numsprite[COMMANDER]++;
|
|
break;
|
|
case OCTABRAIN:
|
|
case OCTABRAINSTAYPUT:
|
|
numsprite[OCTABRAIN]++;
|
|
break;
|
|
case RECON:
|
|
case DRONE:
|
|
case ROTATEGUN:
|
|
case EGG:
|
|
case ORGANTIC:
|
|
case GREENSLIME:
|
|
case BOSS2:
|
|
case BOSS3:
|
|
case TANK:
|
|
case NEWBEAST:
|
|
case BOSS4:
|
|
numsprite[sprite[i].hitag]++;
|
|
default:
|
|
break;
|
|
}//end switch
|
|
}// end if
|
|
}// end for
|
|
total=0;
|
|
for (i=0; i<MAXSPRITES; i++) if (numsprite[i]!=0) total+=numsprite[i];
|
|
for (i=0; i<MAXSPRITES; i++) if (multisprite[i]!=0) total+=multisprite[i];
|
|
|
|
|
|
x=36;
|
|
y=4;
|
|
PrintStatus("Respawn",total,x,y,11);
|
|
|
|
PrintStatus(" Liztroop =",numsprite[LIZTROOP],x,y+1,11);
|
|
PrintStatus(" Lizman =",numsprite[LIZMAN],x,y+2,11);
|
|
PrintStatus(" Commander =",numsprite[COMMANDER],x,y+3,11);
|
|
PrintStatus(" Octabrain =",numsprite[OCTABRAIN],x,y+4,11);
|
|
PrintStatus(" PigCop =",numsprite[PIGCOP],x,y+5,11);
|
|
PrintStatus(" Recon Car =",numsprite[RECON],x,y+6,11);
|
|
PrintStatus(" Drone =",numsprite[DRONE],x,y+7,11);
|
|
PrintStatus(" Turret =",numsprite[ROTATEGUN],x,y+8,11);
|
|
PrintStatus(" Egg =",numsprite[EGG],x,y+9,11);
|
|
x+=17;
|
|
PrintStatus("Slimer =",numsprite[GREENSLIME],x,y+1,11);
|
|
PrintStatus("Boss1 =",numsprite[BOSS1],x,y+2,11);
|
|
PrintStatus("MiniBoss1 =",multisprite[BOSS1],x,y+3,11);
|
|
PrintStatus("Boss2 =",numsprite[BOSS2],x,y+4,11);
|
|
PrintStatus("Boss3 =",numsprite[BOSS3],x,y+5,11);
|
|
PrintStatus("Riot Tank =",numsprite[TANK],x,y+6,11);
|
|
PrintStatus("Newbeast =",numsprite[NEWBEAST],x,y+7,11);
|
|
PrintStatus("Boss4 =",numsprite[BOSS4],x,y+8,11);
|
|
}// end ExtShowWallData
|
|
|
|
static void Show2dText(char *name)
|
|
{
|
|
int32_t fp,t,i,color;
|
|
uint8_t x=0,y=4,xmax=0,xx=0,col=0;
|
|
clearmidstatbar16();
|
|
|
|
color = whitecol-21;
|
|
begindrawing();
|
|
for (i=ydim-STATUS2DSIZ+16; i<ydim; i++)
|
|
{
|
|
clearbufbyte((char *)(frameplace + (i*bytesperline)), bytesperline, ((int32_t)color<<24)|((int32_t)color<<16)|((int32_t)color<<8)|color);
|
|
color--;
|
|
if (color <= 0) break;
|
|
}
|
|
clearbufbyte((char *)(frameplace + (i*bytesperline)), (ydim-i)*(bytesperline), 0);
|
|
enddrawing();
|
|
|
|
if ((fp=kopen4load(name,0)) == -1)
|
|
{
|
|
begindrawing();
|
|
printext16(1*4,ydim-STATUS2DSIZ+4*8,editorcolors[11],-1,"ERROR: file not found.",0);
|
|
enddrawing();
|
|
return;
|
|
}
|
|
|
|
t=65;
|
|
begindrawing();
|
|
while (t!=EOF && col<5)
|
|
{
|
|
t = 0;
|
|
if (kread(fp,&t,1)<=0)
|
|
t = EOF;
|
|
while (t!=EOF && t!='\n' && x<250)
|
|
{
|
|
tempbuf[x]=t;
|
|
t = 0;
|
|
if (kread(fp,&t,1)<=0) t = EOF;
|
|
x++;
|
|
if (x>xmax) xmax=x;
|
|
}
|
|
tempbuf[x]=0;
|
|
printext16(xx*4,ydim-STATUS2DSIZ+(y*6)+2,editorcolors[11],-1,tempbuf,1);
|
|
x=0;
|
|
y++;
|
|
if (y>18)
|
|
{
|
|
col++;
|
|
y=6;
|
|
xx+=xmax;
|
|
xmax=0;
|
|
}
|
|
}
|
|
enddrawing();
|
|
|
|
kclose(fp);
|
|
|
|
}// end Show2dText
|
|
|
|
// PK_ vvvv
|
|
typedef struct helppage_
|
|
{
|
|
int32_t numlines;
|
|
char line[][80]; // C99 flexible array member
|
|
} helppage_t;
|
|
|
|
helppage_t **helppage=NULL;
|
|
int32_t numhelppages=0;
|
|
|
|
static int32_t emptyline(const char *start)
|
|
{
|
|
int32_t i;
|
|
for (i=0; i<80; i++)
|
|
{
|
|
if (start[i]=='\n' || !start[i]) break;
|
|
if (start[i]!=' ' && start[i]!='\t' && start[i]!='\r')
|
|
return 0;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
static int32_t newpage(const char *start)
|
|
{
|
|
int32_t i;
|
|
for (i=80-1; i>=0; i--)
|
|
{
|
|
if (start[i] == '^' && start[i+1] == 'P')
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
#define IHELP_INITPAGES 32
|
|
#define IHELP_INITLINES 16
|
|
|
|
static void ReadHelpFile(const char *name)
|
|
{
|
|
BFILE *fp;
|
|
int32_t i, j, k, numallocpages;
|
|
int32_t pos, charsread=0;
|
|
helppage_t *hp;
|
|
char skip=0;
|
|
|
|
initprintf("Loading \"%s\"\n",name);
|
|
|
|
if ((fp=fopenfrompath(name,"rb")) == NULL)
|
|
{
|
|
initprintf("Error initializing integrated help: file \"%s\" not found.\n", name);
|
|
return;
|
|
}
|
|
|
|
helppage=malloc(IHELP_INITPAGES * sizeof(helppage_t *));
|
|
numallocpages=IHELP_INITPAGES;
|
|
if (!helppage) goto HELPFILE_ERROR;
|
|
|
|
i=0;
|
|
while (!Bfeof(fp) && !ferror(fp))
|
|
{
|
|
while (!Bfeof(fp)) // skip empty lines
|
|
{
|
|
pos = ftell(fp);
|
|
if (Bfgets(tempbuf, 80, fp) == NULL) break;
|
|
charsread = ftell(fp)-pos;
|
|
if (!newpage(tempbuf))
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (Bfeof(fp) || charsread<=0) break;
|
|
|
|
hp=Bcalloc(1,sizeof(helppage_t) + IHELP_INITLINES*80);
|
|
if (!hp) goto HELPFILE_ERROR;
|
|
hp->numlines = IHELP_INITLINES;
|
|
|
|
if (charsread == 79 && tempbuf[78]!='\n') skip=1;
|
|
j=0;
|
|
|
|
do
|
|
{
|
|
if (j >= hp->numlines)
|
|
{
|
|
hp=realloc(hp, sizeof(helppage_t) + 2*hp->numlines*80);
|
|
if (!hp) goto HELPFILE_ERROR;
|
|
hp->numlines *= 2;
|
|
}
|
|
|
|
// limit the line length to 78 chars and probably get rid of the CR
|
|
if (charsread>0)
|
|
{
|
|
tempbuf[charsread-1]=0;
|
|
if (tempbuf[charsread-2]==0x0d) tempbuf[charsread-2]=0;
|
|
}
|
|
|
|
Bmemcpy(hp->line[j], tempbuf, 80);
|
|
|
|
for (k=charsread; k<80; k++) hp->line[j][k]=0;
|
|
|
|
if (skip)
|
|
{
|
|
while (fgetc(fp)!='\n' && !Bfeof(fp)) /*skip rest of line*/;
|
|
skip=0;
|
|
}
|
|
|
|
pos = ftell(fp);
|
|
if (Bfgets(tempbuf, 80, fp) == NULL) break;
|
|
charsread = ftell(fp)-pos;
|
|
if (charsread == 79 && tempbuf[78]!='\n') skip=1;
|
|
|
|
j++;
|
|
|
|
}
|
|
while (!newpage(tempbuf) && !Bfeof(fp) && charsread>0);
|
|
|
|
hp=realloc(hp, sizeof(helppage_t) + j*80);
|
|
if (!hp) goto HELPFILE_ERROR;
|
|
hp->numlines=j;
|
|
|
|
if (i >= numallocpages)
|
|
{
|
|
helppage = realloc(helppage, 2*numallocpages*sizeof(helppage_t *));
|
|
numallocpages *= 2;
|
|
if (!helppage) goto HELPFILE_ERROR;
|
|
}
|
|
helppage[i] = hp;
|
|
i++;
|
|
}
|
|
|
|
helppage = realloc(helppage, i*sizeof(helppage_t *));
|
|
if (!helppage) goto HELPFILE_ERROR;
|
|
numhelppages = i;
|
|
|
|
Bfclose(fp);
|
|
return;
|
|
|
|
HELPFILE_ERROR:
|
|
|
|
Bfclose(fp);
|
|
initprintf("ReadHelpFile(): ERROR allocating memory.\n");
|
|
return;
|
|
}
|
|
|
|
// why can't MSVC allocate an array of variable size?!
|
|
#define IHELP_NUMDISPLINES 110 // ((overridepm16y>>4)+(overridepm16y>>5)+(overridepm16y>>7)-2)
|
|
#define IHELP_PATLEN 45
|
|
extern int32_t overridepm16y; // influences printmessage16() and clearmidstatbar16()
|
|
|
|
static void IntegratedHelp()
|
|
{
|
|
if (!helppage) return;
|
|
|
|
overridepm16y = ydim;//3*STATUS2DSIZ;
|
|
|
|
{
|
|
int32_t i, j, col;
|
|
static int32_t curhp=0, curline=0;
|
|
int32_t highlighthp=-1, highlightline=-1, lasthighlighttime=0;
|
|
char disptext[IHELP_NUMDISPLINES][80];
|
|
char oldpattern[IHELP_PATLEN+1];
|
|
|
|
begindrawing();
|
|
|
|
col = whitecol-21;
|
|
|
|
for (i=ydim-overridepm16y; i<ydim; i++)
|
|
{
|
|
// drawline256(0, i<<12, xdim<<12, i<<12, col);
|
|
clearbufbyte((char *)(frameplace + (i*bytesperline)), bytesperline, ((int32_t)col<<24)|((int32_t)col<<16)|((int32_t)col<<8)|col);
|
|
col--;
|
|
if (col <= 0) break;
|
|
}
|
|
|
|
clearbufbyte((char *)(frameplace + (i*bytesperline)), (ydim-i)*(bytesperline), 0);
|
|
|
|
Bsprintf(tempbuf, "Help Mode");
|
|
printext16(9L,ydim2d-overridepm16y+9L,editorcolors[4],-1,tempbuf,0);
|
|
printext16(8L,ydim2d-overridepm16y+8L,editorcolors[12],-1,tempbuf,0);
|
|
enddrawing();
|
|
|
|
memset(oldpattern, 0, sizeof(char));
|
|
// clearmidstatbar16();
|
|
|
|
while (keystatus[KEYSC_ESC]==0 && keystatus[KEYSC_Q]==0 && keystatus[KEYSC_F1]==0)
|
|
{
|
|
idle_waitevent();
|
|
if (handleevents())
|
|
{
|
|
if (quitevent) quitevent = 0;
|
|
}
|
|
// printmessage16("Help mode, press <Esc> to exit");
|
|
|
|
if (keystatus[KEYSC_T]) // goto table of contents
|
|
{
|
|
keystatus[KEYSC_T]=0;
|
|
curhp=0;
|
|
curline=0;
|
|
}
|
|
else if (keystatus[KEYSC_G]) // goto arbitrary page
|
|
{
|
|
keystatus[KEYSC_G]=0;
|
|
Bsprintf(tempbuf, "Goto page: ");
|
|
curhp=getnumber16(tempbuf, 0, numhelppages-1, 0);
|
|
curline=0;
|
|
}
|
|
else if (keystatus[KEYSC_UP]) // scroll up
|
|
{
|
|
keystatus[KEYSC_UP]=0;
|
|
if (curline>0) curline--;
|
|
}
|
|
else if (keystatus[KEYSC_DOWN]) // scroll down
|
|
{
|
|
keystatus[KEYSC_DOWN]=0;
|
|
if (curline + 32/*+IHELP_NUMDISPLINES*/ < helppage[curhp]->numlines) curline++;
|
|
}
|
|
else if (keystatus[KEYSC_PGUP]) // scroll one page up
|
|
{
|
|
keystatus[KEYSC_PGUP]=0;
|
|
i=IHELP_NUMDISPLINES;
|
|
while (i>0 && curline>0) i--, curline--;
|
|
}
|
|
else if (keystatus[KEYSC_PGDN]) // scroll one page down
|
|
{
|
|
keystatus[KEYSC_PGDN]=0;
|
|
i=IHELP_NUMDISPLINES;
|
|
while (i>0 && curline + 32/*+IHELP_NUMDISPLINES*/ < helppage[curhp]->numlines) i--, curline++;
|
|
}
|
|
else if (keystatus[KEYSC_SPACE]) // goto next paragraph
|
|
{
|
|
keystatus[KEYSC_SPACE]=0;
|
|
for (i=curline, j=0; i < helppage[curhp]->numlines; i++)
|
|
{
|
|
if (emptyline(helppage[curhp]->line[i])) { j=1; continue; }
|
|
if (j==1 && !emptyline(helppage[curhp]->line[i])) { j=2; break; }
|
|
}
|
|
if (j==2)
|
|
{
|
|
if (i + 32 /*+IHELP_NUMDISPLINES*/ < helppage[curhp]->numlines)
|
|
curline=i;
|
|
else if (helppage[curhp]->numlines - 32/*-IHELP_NUMDISPLINES*/ > curline)
|
|
curline = helppage[curhp]->numlines - 32/*-IHELP_NUMDISPLINES*/;
|
|
}
|
|
}
|
|
else if (keystatus[KEYSC_BS]) // goto prev paragraph
|
|
{
|
|
keystatus[KEYSC_BS]=0;
|
|
for (i=curline-1, j=0; i>=0; i--)
|
|
{
|
|
if (!emptyline(helppage[curhp]->line[i])) { j=1; continue; }
|
|
if (j==1 && emptyline(helppage[curhp]->line[i])) { j=2; break; }
|
|
}
|
|
if (j==2 || i==-1) curline=i+1;
|
|
}
|
|
else if (keystatus[KEYSC_HOME]) // goto beginning of page
|
|
{
|
|
keystatus[KEYSC_HOME]=0;
|
|
curline=0;
|
|
}
|
|
else if (keystatus[KEYSC_END]) // goto end of page
|
|
{
|
|
keystatus[KEYSC_END]=0;
|
|
if ((curline=helppage[curhp]->numlines - 32/*-IHELP_NUMDISPLINES*/) >= 0) /**/;
|
|
else curline=0;
|
|
}
|
|
else if (keystatus[KEYSC_LEFT] || keystatus[KEYSC_LBRACK]) // prev page
|
|
{
|
|
keystatus[KEYSC_LEFT] = keystatus[KEYSC_LBRACK] = 0;
|
|
if (curhp>0)
|
|
{
|
|
curhp--;
|
|
curline=0;
|
|
}
|
|
}
|
|
else if (keystatus[KEYSC_RIGHT] || keystatus[KEYSC_RBRACK]) // next page
|
|
{
|
|
keystatus[KEYSC_RIGHT] = keystatus[KEYSC_RBRACK] = 0;
|
|
if (curhp<numhelppages-1)
|
|
{
|
|
curhp++;
|
|
curline=0;
|
|
}
|
|
}
|
|
|
|
// based on 'save as' dialog in overheadeditor()
|
|
else if (keystatus[KEYSC_S]) // text search
|
|
{
|
|
|
|
char ch, bad=0, pattern[IHELP_PATLEN+1];
|
|
|
|
for (i=0; i<IHELP_PATLEN+1; i++) pattern[i]=0;
|
|
|
|
i=0;
|
|
bflushchars();
|
|
while (bad == 0)
|
|
{
|
|
Bsprintf(tempbuf,"Search: %s_", pattern);
|
|
_printmessage16(tempbuf);
|
|
showframe(1);
|
|
|
|
idle_waitevent();
|
|
if (handleevents())
|
|
{
|
|
if (quitevent) quitevent = 0;
|
|
}
|
|
|
|
ch = bgetchar();
|
|
|
|
if (keystatus[1]) bad = 1;
|
|
else if (ch == 13) bad = 2;
|
|
else if (ch > 0)
|
|
{
|
|
if (i > 0 && (ch == 8 || ch == 127))
|
|
{
|
|
i--;
|
|
pattern[i] = 0;
|
|
}
|
|
else if (i < IHELP_PATLEN && ch >= 32 && ch < 128)
|
|
{
|
|
pattern[i++] = ch;
|
|
pattern[i] = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (bad==1)
|
|
{
|
|
keystatus[KEYSC_ESC] = keystatus[KEYSC_Q] = keystatus[KEYSC_F1] = 0;
|
|
}
|
|
|
|
if (bad==2)
|
|
{
|
|
keystatus[KEYSC_ENTER] = 0;
|
|
|
|
for (i=curhp; i<numhelppages; i++)
|
|
{
|
|
for (j = (i==curhp)?(curline+1):0; j<helppage[i]->numlines; j++)
|
|
{
|
|
// entering an empty pattern will search with the last used pattern
|
|
if (strstr(helppage[i]->line[j], pattern[0]?pattern:oldpattern))
|
|
{
|
|
curhp = i;
|
|
|
|
if ((curline=j) <= helppage[i]->numlines - 32 /*-IHELP_NUMDISPLINES*/) /**/;
|
|
else if ((curline=helppage[i]->numlines- 32 /*-IHELP_NUMDISPLINES*/) >= 0) /**/;
|
|
else curline=0;
|
|
|
|
highlighthp = i;
|
|
highlightline = j;
|
|
lasthighlighttime = totalclock;
|
|
goto ENDFOR1;
|
|
}
|
|
}
|
|
}
|
|
ENDFOR1:
|
|
if (pattern[0])
|
|
Bmemcpy(oldpattern, pattern, IHELP_PATLEN+1);
|
|
}
|
|
}
|
|
else // '1'-'0' on the upper row
|
|
{
|
|
for (i=2; i<=11; i++)
|
|
if (keystatus[i]) break;
|
|
if (i--<12 && i<numhelppages)
|
|
{
|
|
curhp=i;
|
|
curline=0;
|
|
}
|
|
}
|
|
|
|
{
|
|
int32_t col = whitecol-21;
|
|
|
|
begindrawing();
|
|
for (i=ydim-overridepm16y; i<ydim; i++)
|
|
{
|
|
// drawline256(0, i<<12, xdim<<12, i<<12, col);
|
|
clearbufbyte((char *)(frameplace + (i*bytesperline)), bytesperline, ((int32_t)col<<24)|((int32_t)col<<16)|((int32_t)col<<8)|col);
|
|
col--;
|
|
if (col <= 0) break;
|
|
}
|
|
|
|
clearbufbyte((char *)(frameplace + (i*bytesperline)), (ydim-i)*(bytesperline), 0);
|
|
Bsprintf(tempbuf, "Help Mode");
|
|
printext16(9L,ydim2d-overridepm16y+9L,editorcolors[4],-1,tempbuf,0);
|
|
printext16(8L,ydim2d-overridepm16y+8L,editorcolors[12],-1,tempbuf,0);
|
|
|
|
enddrawing();
|
|
}
|
|
|
|
if (curhp < helppage[0]->numlines)
|
|
{
|
|
_printmessage16(helppage[0]->line[curhp]);
|
|
}
|
|
else
|
|
{
|
|
for (i=Bsprintf(tempbuf, "%d. (Untitled page)", curhp); i<80; i++)
|
|
tempbuf[i]=0;
|
|
_printmessage16(tempbuf);
|
|
}
|
|
|
|
for (i=0; j=(curhp==0)?(i+curline+1):(i+curline),
|
|
i<IHELP_NUMDISPLINES && j<helppage[curhp]->numlines; i++)
|
|
{
|
|
if (ydim-overridepm16y+28+i*9+32 >= ydim) break;
|
|
Bmemcpy(disptext[i], helppage[curhp]->line[j], 80);
|
|
printext16(8,ydim-overridepm16y+28+i*9,editorcolors[10],
|
|
(j==highlightline && curhp==highlighthp
|
|
&& totalclock-lasthighlighttime<120*5)?editorcolors[1]:-1,
|
|
disptext[i],0);
|
|
}
|
|
|
|
showframe(1);
|
|
}
|
|
|
|
overridepm16y = -1;
|
|
// i=ydim16;
|
|
// ydim16=ydim;
|
|
// drawline16(0,ydim-STATUS2DSIZ,xdim-1,ydim-STATUS2DSIZ,editorcolors[1]);
|
|
// ydim16=i;
|
|
// // printmessage16("");
|
|
// showframe(1);
|
|
|
|
keystatus[KEYSC_ESC] = keystatus[KEYSC_Q] = keystatus[KEYSC_F1] = 0;
|
|
}
|
|
}
|
|
|
|
#define SOUND_NUMDISPLINES IHELP_NUMDISPLINES
|
|
//extern char SoundToggle;
|
|
|
|
static int32_t compare_sounds_s(int16_t k1, int16_t k2)
|
|
{
|
|
return (int32_t)k1 - (int32_t)k2;
|
|
}
|
|
static int32_t compare_sounds_d(int16_t k1, int16_t k2)
|
|
{
|
|
sound_t *s1 = &g_sounds[k1], *s2 = &g_sounds[k2];
|
|
char *n1 = s1->definedname, *n2 = s2->definedname;
|
|
|
|
if (!n1 && !n2) return 0;
|
|
if (!n1) return -1;
|
|
if (!n2) return 1;
|
|
return Bstrcasecmp(n1, n2);
|
|
}
|
|
static int32_t compare_sounds_f(int16_t k1, int16_t k2)
|
|
{
|
|
sound_t *s1 = &g_sounds[k1], *s2 = &g_sounds[k2];
|
|
char *n1 = s1->filename, *n2 = s2->filename;
|
|
|
|
if (!n1 && !n2) return 0;
|
|
if (!n1) return -1;
|
|
if (!n2) return 1;
|
|
return Bstrcasecmp(n1, n2);
|
|
}
|
|
static int32_t compare_sounds_1(int16_t k1, int16_t k2)
|
|
{
|
|
return (g_sounds[k2].m&1) - (g_sounds[k1].m&1);
|
|
}
|
|
static int32_t compare_sounds_2(int16_t k1, int16_t k2)
|
|
{
|
|
return (g_sounds[k2].m&2) - (g_sounds[k1].m&2);
|
|
}
|
|
static int32_t compare_sounds_3(int16_t k1, int16_t k2)
|
|
{
|
|
return (g_sounds[k2].m&4) - (g_sounds[k1].m&4);
|
|
}
|
|
static int32_t compare_sounds_4(int16_t k1, int16_t k2)
|
|
{
|
|
return (g_sounds[k2].m&8) - (g_sounds[k1].m&8);
|
|
}
|
|
static int32_t compare_sounds_5(int16_t k1, int16_t k2)
|
|
{
|
|
return (g_sounds[k2].m&16) - (g_sounds[k1].m&16);
|
|
}
|
|
|
|
|
|
static int32_t sort_sounds(int32_t how)
|
|
{
|
|
int32_t (*compare_sounds)(int16_t, int16_t) = NULL;
|
|
|
|
int32_t ms, ofs, l, lb, r, rb, d, n, k1, k2;
|
|
int16_t *src, *dst, *source, *dest, *tmp;
|
|
|
|
n = g_numsounds;
|
|
src = source = g_sndnum;
|
|
dest = Bmalloc(sizeof(int16_t) * n);
|
|
dst = dest;
|
|
if (!dest) return -1;
|
|
|
|
switch (how)
|
|
{
|
|
case 'g': // restore original order
|
|
Bmemcpy(g_sndnum, g_definedsndnum, sizeof(int16_t)*n);
|
|
return 0;
|
|
case 's':
|
|
compare_sounds = compare_sounds_s;
|
|
break;
|
|
case 'd':
|
|
compare_sounds = compare_sounds_d;
|
|
break;
|
|
case 'f':
|
|
compare_sounds = compare_sounds_f;
|
|
break;
|
|
case '1':
|
|
compare_sounds = compare_sounds_1;
|
|
break;
|
|
case '2':
|
|
compare_sounds = compare_sounds_2;
|
|
break;
|
|
case '3':
|
|
compare_sounds = compare_sounds_3;
|
|
break;
|
|
case '4':
|
|
compare_sounds = compare_sounds_4;
|
|
break;
|
|
case '5':
|
|
compare_sounds = compare_sounds_5;
|
|
break;
|
|
default:
|
|
return -2;
|
|
}
|
|
|
|
for (ms=1; ms<n; ms*=2)
|
|
{
|
|
for (ofs=0; ofs<n; ofs+=2*ms)
|
|
{
|
|
l = ofs;
|
|
r = ofs+ms;
|
|
d = ofs;
|
|
lb = min((l+ms), n);
|
|
rb = min((r+ms), n);
|
|
while (l < lb || r < rb)
|
|
{
|
|
if (l >= lb)
|
|
{
|
|
dst[d++] = src[r++];
|
|
continue;
|
|
}
|
|
if (r >= rb)
|
|
{
|
|
dst[d++] = src[l++];
|
|
continue;
|
|
}
|
|
k1 = src[l];
|
|
k2 = src[r];
|
|
if (compare_sounds(k1, k2) <= 0)
|
|
{
|
|
dst[d++] = src[l++];
|
|
continue;
|
|
}
|
|
dst[d++] = src[r++];
|
|
}
|
|
}
|
|
tmp = src;
|
|
src = dst;
|
|
dst = tmp;
|
|
}
|
|
if (src != source)
|
|
Bmemcpy(source, src, sizeof(int16_t) * n);
|
|
|
|
Bfree(dest);
|
|
return 0;
|
|
}
|
|
|
|
static void SoundDisplay()
|
|
{
|
|
if (g_numsounds <= 0) return;
|
|
|
|
overridepm16y = ydim;//3*STATUS2DSIZ;
|
|
|
|
{
|
|
int32_t i, j;
|
|
// cursnd is the first displayed line, cursnd+curofs is where the cursor is
|
|
static int32_t cursnd=0, curofs=0;
|
|
char disptext[SOUND_NUMDISPLINES][80];
|
|
|
|
// SoundToggle = 1;
|
|
|
|
while (keystatus[KEYSC_ESC]==0 && keystatus[KEYSC_Q]==0 && keystatus[KEYSC_F2]==0
|
|
&& keystatus[buildkeys[BK_MODE2D_3D]]==0) // quickjump to 3d mode
|
|
{
|
|
idle_waitevent();
|
|
if (handleevents())
|
|
{
|
|
if (quitevent) quitevent = 0;
|
|
}
|
|
|
|
{
|
|
int32_t col = whitecol-21;
|
|
|
|
begindrawing();
|
|
for (i=ydim-overridepm16y; i<ydim; i++)
|
|
{
|
|
// drawline256(0, i<<12, xdim<<12, i<<12, col);
|
|
clearbufbyte((char *)(frameplace + (i*bytesperline)), bytesperline, ((int32_t)col<<24)|((int32_t)col<<16)|((int32_t)col<<8)|col);
|
|
col--;
|
|
if (col <= 0) break;
|
|
}
|
|
|
|
clearbufbyte((char *)(frameplace + (i*bytesperline)), (ydim-i)*(bytesperline), 0);
|
|
Bsprintf(tempbuf, "Sound Index");
|
|
printext16(9L,ydim2d-overridepm16y+9L,editorcolors[4],-1,tempbuf,0);
|
|
printext16(8L,ydim2d-overridepm16y+8L,editorcolors[12],-1,tempbuf,0);
|
|
|
|
enddrawing();
|
|
}
|
|
|
|
if (keystatus[KEYSC_G]) // goto specified sound#
|
|
{
|
|
keystatus[KEYSC_G]=0;
|
|
_printmessage16(" ");
|
|
Bsprintf(tempbuf, "Goto sound#: ");
|
|
j = getnumber16(tempbuf, 0, g_numsounds-1, 0);
|
|
for (i=0; i<g_numsounds; i++)
|
|
if (g_sndnum[i]==j)
|
|
break;
|
|
if (i != g_numsounds)
|
|
{
|
|
if (i<SOUND_NUMDISPLINES)
|
|
cursnd = 0, curofs = i;
|
|
else if (i>=g_numsounds- 32/*SOUND_NUMDISPLINES*/)
|
|
cursnd = g_numsounds-32/*SOUND_NUMDISPLINES*/, curofs = i-cursnd;
|
|
else
|
|
curofs = 32/*SOUND_NUMDISPLINES*//2, cursnd = i-curofs;
|
|
}
|
|
}
|
|
else if (keystatus[KEYSC_UP]) // scroll up
|
|
{
|
|
keystatus[KEYSC_UP]=0;
|
|
if (curofs>0) curofs--;
|
|
else if (cursnd>0) cursnd--;
|
|
}
|
|
else if (keystatus[KEYSC_DOWN]) // scroll down
|
|
{
|
|
keystatus[KEYSC_DOWN]=0;
|
|
if (curofs<32/*SOUND_NUMDISPLINES*/-1 && cursnd+curofs<g_numsounds-1)
|
|
curofs++;
|
|
else if (cursnd+32/*SOUND_NUMDISPLINES*/ < g_numsounds)
|
|
cursnd++;
|
|
}
|
|
else if (keystatus[KEYSC_PGUP]) // scroll one page up
|
|
{
|
|
keystatus[KEYSC_PGUP]=0;
|
|
i=SOUND_NUMDISPLINES;
|
|
while (i>0 && curofs>0)
|
|
i--, curofs--;
|
|
while (i>0 && cursnd>0)
|
|
i--, cursnd--;
|
|
}
|
|
else if (keystatus[KEYSC_PGDN]) // scroll one page down
|
|
{
|
|
keystatus[KEYSC_PGDN]=0;
|
|
i=SOUND_NUMDISPLINES;
|
|
|
|
while (i>0 && curofs<32/*SOUND_NUMDISPLINES*/-1 && cursnd+curofs<g_numsounds-1)
|
|
i--, curofs++;
|
|
while (i>0 && cursnd+32/*SOUND_NUMDISPLINES*/ < g_numsounds)
|
|
i--, cursnd++;
|
|
}
|
|
else if (keystatus[KEYSC_SPACE] || keystatus[KEYSC_ENTER]) // play/stop sound
|
|
{
|
|
int32_t j = cursnd+curofs;
|
|
int32_t k = g_sndnum[j];
|
|
keystatus[KEYSC_SPACE] = keystatus[KEYSC_ENTER] = 0;
|
|
if (S_CheckSoundPlaying(0, k) > 0)
|
|
S_StopSound(k);
|
|
else
|
|
S_PlaySound(k);
|
|
}
|
|
else if (keystatus[KEYSC_HOME]) // goto first sound#
|
|
{
|
|
keystatus[KEYSC_HOME]=0;
|
|
cursnd = curofs = 0;
|
|
}
|
|
else if (keystatus[KEYSC_END]) // goto last sound#
|
|
{
|
|
keystatus[KEYSC_END]=0;
|
|
if ((cursnd=g_numsounds-32/*SOUND_NUMDISPLINES*/) >= 0)
|
|
curofs=32/*SOUND_NUMDISPLINES*/-1;
|
|
else
|
|
{
|
|
cursnd = 0;
|
|
curofs = g_numsounds-1;
|
|
}
|
|
}
|
|
|
|
else if (keystatus[KEYSC_S]) // sorting
|
|
{
|
|
|
|
char ch, bad=0;
|
|
|
|
i=0;
|
|
bflushchars();
|
|
while (bad == 0)
|
|
{
|
|
Bsprintf(tempbuf,"Sort by: (S)num (D)ef (F)ile ori(g) or (12345)");
|
|
_printmessage16(tempbuf);
|
|
showframe(1);
|
|
|
|
idle_waitevent();
|
|
if (handleevents())
|
|
{
|
|
if (quitevent) quitevent = 0;
|
|
}
|
|
|
|
ch = bgetchar();
|
|
|
|
if (keystatus[1]) bad = 1;
|
|
|
|
else if (ch == 's' || ch == 'd' || ch == 'f' || ch == 'g' ||
|
|
ch == '1' || ch == '2' || ch == '3' || ch == '4' || ch == '5')
|
|
{
|
|
bad = 2;
|
|
sort_sounds(ch);
|
|
}
|
|
}
|
|
|
|
if (bad==1)
|
|
{
|
|
keystatus[KEYSC_ESC] = keystatus[KEYSC_Q] = keystatus[KEYSC_F2] = 0;
|
|
}
|
|
|
|
if (bad==2)
|
|
{
|
|
keystatus[KEYSC_S] = keystatus[KEYSC_D] = keystatus[KEYSC_F] = 0;
|
|
keystatus[KEYSC_G] = keystatus[KEYSC_1] = keystatus[KEYSC_2] = 0;
|
|
keystatus[KEYSC_3] = keystatus[KEYSC_4] = keystatus[KEYSC_5] = 0;
|
|
}
|
|
}
|
|
|
|
_printmessage16(" FILE NAME PITCH RANGE PRI FLAGS VOLUME");
|
|
for (i=0; j=cursnd+i, i<SOUND_NUMDISPLINES && j<g_numsounds; i++)
|
|
{
|
|
int32_t l, m, k=g_sndnum[j];
|
|
sound_t *snd=&g_sounds[k];
|
|
char *cp;
|
|
|
|
if (ydim-overridepm16y+28+i*9+32 >= ydim) break;
|
|
|
|
Bsprintf(disptext[i],
|
|
"%4d .................... ................ %6d:%-6d %3d %c%c%c%c%c %6d",
|
|
// 5678901234567890X23456789012345678901234567
|
|
k, snd->ps, snd->pe, snd->pr,
|
|
snd->m&1 ? 'R':'-', snd->m&2 ? 'M':'-', snd->m&4 ? 'D':'-',
|
|
snd->m&8 ? 'P':'-', snd->m&16 ? 'G':'-', snd->vo);
|
|
for (l = Bsnprintf(disptext[i]+5, 20, "%s", snd->definedname); l<20; l++)
|
|
disptext[i][5+l] = ' ';
|
|
if (snd->filename)
|
|
{
|
|
l = strlen(snd->filename);
|
|
if (l<=16)
|
|
cp = snd->filename;
|
|
else
|
|
cp = snd->filename + l-15;
|
|
for (m = Bsnprintf(disptext[i]+26, 16, "%s", cp); m<16; m++)
|
|
disptext[i][26+m] = ' ';
|
|
if (l>16)
|
|
disptext[i][26] = disptext[i][27] = disptext[i][28] = '.';
|
|
}
|
|
|
|
printext16(8, ydim-overridepm16y+28+i*9,
|
|
S_CheckSoundPlaying(-1, k) ? editorcolors[2] : editorcolors[10],
|
|
j==cursnd+curofs ? editorcolors[1] : -1,
|
|
disptext[i], 0);
|
|
}
|
|
|
|
showframe(1);
|
|
}
|
|
|
|
overridepm16y = -1;
|
|
// i=ydim16;
|
|
// ydim16=ydim;
|
|
// drawline16(0,ydim-STATUS2DSIZ,xdim-1,ydim-STATUS2DSIZ,editorcolors[1]);
|
|
// ydim16=i;
|
|
// // printmessage16("");
|
|
// showframe(1);
|
|
|
|
FX_StopAllSounds();
|
|
S_ClearSoundLocks();
|
|
// SoundToggle = 0;
|
|
|
|
keystatus[KEYSC_ESC] = keystatus[KEYSC_Q] = keystatus[KEYSC_F2] = 0;
|
|
}
|
|
}
|
|
// PK_ ^^^^
|
|
|
|
// from sector.c
|
|
static int32_t dist(spritetype *s1,spritetype *s2)
|
|
{
|
|
int32_t x= klabs(s1->x-s2->x);
|
|
int32_t y= klabs(s1->y-s2->y);
|
|
int32_t z= klabs((s1->z-s2->z)>>4);
|
|
|
|
if (x<y) swaplong(&x,&y);
|
|
if (x<z) swaplong(&x,&z);
|
|
|
|
{
|
|
int32_t t = y + z;
|
|
return (x - (x>>4) + (t>>2) + (t>>3));
|
|
}
|
|
}
|
|
|
|
extern int32_t NumVoices;
|
|
extern int32_t g_numEnvSoundsPlaying;
|
|
int32_t AmbienceToggle = 1; //SoundToggle;
|
|
int32_t ParentalLock = 0;
|
|
#undef T1
|
|
#define T1 (s->filler)
|
|
|
|
// adapted from actors.c
|
|
static void M32_MoveFX(void)
|
|
{
|
|
int32_t i, j;
|
|
int32_t x, ht;
|
|
spritetype *s;
|
|
|
|
for (i=headspritestat[0]; i>=0; i=nextspritestat[i])
|
|
{
|
|
s = &sprite[i];
|
|
|
|
if (s->picnum != MUSICANDSFX)
|
|
{
|
|
if (T1&1)
|
|
{
|
|
T1 &= (~1);
|
|
S_StopEnvSound(s->lotag, i);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
ht = s->hitag;
|
|
|
|
if (s->lotag < 999 && (unsigned)sector[s->sectnum].lotag < 9 &&
|
|
AmbienceToggle && sector[s->sectnum].floorz != sector[s->sectnum].ceilingz)
|
|
{
|
|
if ((g_sounds[s->lotag].m&2))
|
|
{
|
|
x = dist((spritetype*)&pos,s);
|
|
if (x < ht && (T1&1) == 0 && FX_VoiceAvailable(g_sounds[s->lotag].pr-1))
|
|
{
|
|
if (g_numEnvSoundsPlaying == NumVoices)
|
|
{
|
|
for (j = headspritestat[0]; j >= 0; j = nextspritestat[j])
|
|
{
|
|
if (s->picnum == MUSICANDSFX && j != i && sprite[j].lotag < 999 &&
|
|
(sprite[j].filler&1) == 1 && dist(&sprite[j],(spritetype*)&pos) > x)
|
|
{
|
|
S_StopEnvSound(sprite[j].lotag,j);
|
|
break;
|
|
}
|
|
|
|
}
|
|
if (j == -1) continue;
|
|
}
|
|
A_PlaySound(s->lotag,i);
|
|
T1 |= 1;
|
|
}
|
|
if (x >= ht && (T1&1) == 1)
|
|
{
|
|
T1 &= (~1);
|
|
S_StopEnvSound(s->lotag,i);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#undef T1
|
|
|
|
|
|
static void Show3dText(char *name)
|
|
{
|
|
int32_t fp,t;
|
|
uint8_t x=0,y=4,xmax=0,xx=0,col=0;
|
|
|
|
if ((fp=kopen4load(name,0)) == -1)
|
|
{
|
|
begindrawing();
|
|
printext256(1*4,4*8,whitecol,-1,"ERROR: file not found.",0);
|
|
enddrawing();
|
|
return;
|
|
}
|
|
t=65;
|
|
begindrawing();
|
|
while (t!=EOF && col<5)
|
|
{
|
|
t = 0;
|
|
if (kread(fp,&t,1)<=0)
|
|
t = EOF;
|
|
while (t!=EOF && t!='\n' && x<250)
|
|
{
|
|
tempbuf[x]=t;
|
|
t = 0;
|
|
if (kread(fp,&t,1)<=0) t = EOF;
|
|
x++;
|
|
if (x>xmax) xmax=x;
|
|
}
|
|
tempbuf[x]=0;
|
|
printext256(xx*4,(y*6)+2,whitecol,-1,tempbuf,1);
|
|
x=0;
|
|
y++;
|
|
if (y>18)
|
|
{
|
|
col++;
|
|
y=6;
|
|
xx+=xmax;
|
|
xmax=0;
|
|
}
|
|
}
|
|
enddrawing();
|
|
|
|
kclose(fp);
|
|
}// end Show3dText
|
|
|
|
#if 0
|
|
static void ShowHelpText(char *name)
|
|
{
|
|
BFILE *fp;
|
|
char x=0,y=4;
|
|
UNREFERENCED_PARAMETER(name);
|
|
if ((fp=fopenfrompath("helpdoc.txt","rb")) == NULL)
|
|
{
|
|
begindrawing();
|
|
printext256(1*4,4*8,whitecol,-1,"ERROR: file not found.",0);
|
|
enddrawing();
|
|
return;
|
|
}
|
|
/*
|
|
Bfgets(tempbuf,80,fp);
|
|
while(!Bfeof(fp) && Bstrcmp(tempbuf,"SectorEffector"))
|
|
{
|
|
Bfgets(tempbuf,80,fp);
|
|
}
|
|
*/
|
|
y=2;
|
|
Bfgets(tempbuf,80,fp);
|
|
Bstrcat(tempbuf,"\n");
|
|
begindrawing();
|
|
while (!Bfeof(fp) && !(Bstrcmp(tempbuf,"SectorEffector")==0))
|
|
{
|
|
Bfgets(tempbuf,80,fp);
|
|
Bstrcat(tempbuf,"\n");
|
|
printext256(x*4,(y*6)+2,whitecol,-1,tempbuf,1);
|
|
y++;
|
|
}
|
|
enddrawing();
|
|
|
|
Bfclose(fp);
|
|
}// end ShowHelpText
|
|
#endif
|
|
void ExtShowSpriteData(int16_t spritenum) //F6
|
|
{
|
|
UNREFERENCED_PARAMETER(spritenum);
|
|
if (qsetmode != 200)
|
|
Show2dText("sehelp.hlp");
|
|
/* if (qsetmode == 200) // In 3D mode
|
|
return;
|
|
|
|
while (KEY_PRESSED(KEYSC_F6));
|
|
ResetKeys();
|
|
ContextHelp(spritenum); // Get context sensitive help */
|
|
}// end ExtShowSpriteData
|
|
|
|
// Floor Over Floor (duke3d)
|
|
|
|
// If standing in sector with SE42 or SE44
|
|
// then draw viewing to SE41 and raise all =hi SE43 cielings.
|
|
|
|
// If standing in sector with SE43 or SE45
|
|
// then draw viewing to SE40 and lower all =hi SE42 floors.
|
|
|
|
int32_t fofsizex = -1;
|
|
int32_t fofsizey = -1;
|
|
#if 0
|
|
static void ResetFOFSize()
|
|
{
|
|
if (fofsizex != -1) tilesizx[FOF] = fofsizex;
|
|
if (fofsizey != -1) tilesizy[FOF] = fofsizey;
|
|
}
|
|
#endif
|
|
static void ExtSE40Draw(int32_t spnum,int32_t x,int32_t y,int32_t z,int16_t a,int16_t h)
|
|
{
|
|
static int32_t tempsectorz[MAXSECTORS];
|
|
static int32_t tempsectorpicnum[MAXSECTORS];
|
|
|
|
int32_t i=0,j=0,k=0;
|
|
int32_t floor1=0,floor2=0,ok=0,fofmode=0,draw_both=0;
|
|
int32_t offx,offy,offz;
|
|
|
|
if (sprite[spnum].ang!=512) return;
|
|
|
|
// Things are a little different now, as we allow for masked transparent
|
|
// floors and ceilings. So the FOF textures is no longer required
|
|
// if (!(gotpic[FOF>>3]&(1<<(FOF&7))))
|
|
// return;
|
|
// gotpic[FOF>>3] &= ~(1<<(FOF&7));
|
|
|
|
if (tilesizx[562])
|
|
{
|
|
fofsizex = tilesizx[562];
|
|
tilesizx[562] = 0;
|
|
}
|
|
if (tilesizy[562])
|
|
{
|
|
fofsizey = tilesizy[562];
|
|
tilesizy[562] = 0;
|
|
}
|
|
|
|
floor1=spnum;
|
|
|
|
if (sprite[spnum].lotag==42) fofmode=40;
|
|
if (sprite[spnum].lotag==43) fofmode=41;
|
|
if (sprite[spnum].lotag==44) fofmode=40;
|
|
if (sprite[spnum].lotag==45) fofmode=41;
|
|
|
|
// fofmode=sprite[spnum].lotag-2;
|
|
|
|
// sectnum=sprite[j].sectnum;
|
|
// sectnum=cursectnum;
|
|
ok++;
|
|
|
|
/* recursive?
|
|
for(j=0;j<MAXSPRITES;j++)
|
|
{
|
|
if(
|
|
sprite[j].sectnum==sectnum &&
|
|
sprite[j].picnum==1 &&
|
|
sprite[j].lotag==110
|
|
) { DrawFloorOverFloor(j); break;}
|
|
}
|
|
*/
|
|
|
|
// if(ok==0) { Message("no fof",RED); return; }
|
|
|
|
for (j=0; j<MAXSPRITES; j++)
|
|
{
|
|
if (sprite[j].picnum==1 && sprite[j].lotag==fofmode && sprite[j].hitag==sprite[floor1].hitag)
|
|
{
|
|
floor1=j;
|
|
fofmode=sprite[j].lotag;
|
|
ok++;
|
|
break;
|
|
}
|
|
}
|
|
// if(ok==1) { Message("no floor1",RED); return; }
|
|
|
|
if (fofmode==40) k=41;
|
|
else k=40;
|
|
|
|
for (j=0; j<MAXSPRITES; j++)
|
|
{
|
|
if (sprite[j].picnum==1 && sprite[j].lotag==k && sprite[j].hitag==sprite[floor1].hitag)
|
|
{
|
|
floor2=j;
|
|
ok++;
|
|
break;
|
|
}
|
|
}
|
|
|
|
i=floor1;
|
|
offx=sprite[floor2].x-sprite[floor1].x;
|
|
offy=sprite[floor2].y-sprite[floor1].y;
|
|
offz=0;
|
|
|
|
if (sprite[floor2].ang >= 1024)
|
|
offz = sprite[floor2].z;
|
|
else if (fofmode==41)
|
|
offz = sector[sprite[floor2].sectnum].floorz;
|
|
else
|
|
offz = sector[sprite[floor2].sectnum].ceilingz;
|
|
|
|
if (sprite[floor1].ang >= 1024)
|
|
offz -= sprite[floor1].z;
|
|
else if (fofmode==40)
|
|
offz -= sector[sprite[floor1].sectnum].floorz;
|
|
else
|
|
offz -= sector[sprite[floor1].sectnum].ceilingz;
|
|
|
|
// if(ok==2) { Message("no floor2",RED); return; }
|
|
|
|
for (j=0; j<MAXSPRITES; j++) // raise ceiling or floor
|
|
{
|
|
if (sprite[j].picnum==1 && sprite[j].lotag==k+2 && sprite[j].hitag==sprite[floor1].hitag)
|
|
{
|
|
if (k==40)
|
|
{
|
|
tempsectorz[sprite[j].sectnum]=sector[sprite[j].sectnum].floorz;
|
|
sector[sprite[j].sectnum].floorz+=(((z-sector[sprite[j].sectnum].floorz)/32768)+1)*32768;
|
|
tempsectorpicnum[sprite[j].sectnum]=sector[sprite[j].sectnum].floorpicnum;
|
|
sector[sprite[j].sectnum].floorpicnum=562;
|
|
}
|
|
else
|
|
{
|
|
tempsectorz[sprite[j].sectnum]=sector[sprite[j].sectnum].ceilingz;
|
|
sector[sprite[j].sectnum].ceilingz+=(((z-sector[sprite[j].sectnum].ceilingz)/32768)-1)*32768;
|
|
tempsectorpicnum[sprite[j].sectnum]=sector[sprite[j].sectnum].ceilingpicnum;
|
|
sector[sprite[j].sectnum].ceilingpicnum=562;
|
|
}
|
|
draw_both = 1;
|
|
}
|
|
}
|
|
|
|
drawrooms(x+offx,y+offy,z+offz,a,h,sprite[floor2].sectnum);
|
|
ExtAnalyzeSprites();
|
|
drawmasks();
|
|
|
|
if (draw_both)
|
|
{
|
|
for (j=0; j<MAXSPRITES; j++) // restore ceiling or floor for the draw both sectors
|
|
{
|
|
if (sprite[j].picnum==1 &&
|
|
sprite[j].lotag==k+2 &&
|
|
sprite[j].hitag==sprite[floor1].hitag)
|
|
{
|
|
if (k==40)
|
|
{
|
|
sector[sprite[j].sectnum].floorz=tempsectorz[sprite[j].sectnum];
|
|
sector[sprite[j].sectnum].floorpicnum=tempsectorpicnum[sprite[j].sectnum];
|
|
}
|
|
else
|
|
{
|
|
sector[sprite[j].sectnum].ceilingz=tempsectorz[sprite[j].sectnum];
|
|
sector[sprite[j].sectnum].ceilingpicnum=tempsectorpicnum[sprite[j].sectnum];
|
|
}
|
|
}// end if
|
|
}// end for
|
|
|
|
// Now re-draw
|
|
drawrooms(x+offx,y+offy,z+offz,a,h,sprite[floor2].sectnum);
|
|
ExtAnalyzeSprites();
|
|
drawmasks();
|
|
}
|
|
|
|
} // end SE40
|
|
|
|
static void SE40Code(int32_t x,int32_t y,int32_t z,int32_t a,int32_t h)
|
|
{
|
|
int32_t i;
|
|
|
|
i = 0;
|
|
while (i<MAXSPRITES)
|
|
{
|
|
int32_t t = sprite[i].lotag;
|
|
switch (t)
|
|
{
|
|
// case 40:
|
|
// case 41:
|
|
// ExtSE40Draw(i,x,y,z,a,h);
|
|
// break;
|
|
case 42:
|
|
case 43:
|
|
case 44:
|
|
case 45:
|
|
if (cursectnum == sprite[i].sectnum)
|
|
ExtSE40Draw(i,x,y,z,a,h);
|
|
break;
|
|
}
|
|
i++;
|
|
}
|
|
}
|
|
|
|
void ExtEditSectorData(int16_t sectnum) //F7
|
|
{
|
|
// if (qsetmode != 200) Show2dText("sthelp.hlp");
|
|
if (qsetmode == 200)
|
|
return;
|
|
if (eitherALT) //ALT
|
|
{
|
|
keystatus[KEYSC_F7] = 0;
|
|
wallsprite=0;
|
|
curwall = 0;
|
|
curwallnum = 0;
|
|
cursearchspritenum = 0;
|
|
cursectornum=0;
|
|
cursector_lotag = sector[sectnum].lotag;
|
|
cursector_lotag=getnumber16("Enter search sector lotag : ", cursector_lotag, 65536L,0);
|
|
Bsprintf(tempbuf,"Search sector lotag %d",cursector_lotag);
|
|
_printmessage16(tempbuf);
|
|
}
|
|
else EditSectorData(sectnum);
|
|
}// end ExtEditSectorData
|
|
|
|
void ExtEditWallData(int16_t wallnum) //F8
|
|
{
|
|
if (qsetmode==200)
|
|
return;
|
|
if (eitherALT) //ALT
|
|
{
|
|
wallsprite=1;
|
|
curwall = wallnum;
|
|
curwallnum = 0;
|
|
cursearchspritenum = 0;
|
|
cursectornum = 0;
|
|
search_lotag = wall[curwall].lotag;
|
|
search_hitag = wall[curwall].hitag;
|
|
search_lotag=getnumber16("Enter wall search lotag : ", search_lotag, 65536L,0);
|
|
search_hitag=getnumber16("Enter wall search hitag : ", search_hitag, 65536L,0);
|
|
// Bsprintf(tempbuf,"Current wall %d lo=%d hi=%d",
|
|
// curwall,wall[curwall].lotag,wall[curwall].hitag);
|
|
Bsprintf(tempbuf,"Search wall lo=%d hi=%d",search_lotag,search_hitag);
|
|
_printmessage16(tempbuf);
|
|
}
|
|
else EditWallData(wallnum);
|
|
}
|
|
|
|
static void GenSearchSprite(void);
|
|
|
|
void ExtEditSpriteData(int16_t spritenum) //F8
|
|
{
|
|
if (qsetmode==200)
|
|
return;
|
|
if (eitherALT) //ALT
|
|
GenSearchSprite();
|
|
#if 0
|
|
{
|
|
wallsprite=2;
|
|
cursearchsprite = spritenum;
|
|
curwallnum = 0;
|
|
cursearchspritenum = 0;
|
|
cursectornum = 0;
|
|
search_lotag = sprite[cursearchsprite].lotag;
|
|
search_hitag = sprite[cursearchsprite].hitag;
|
|
search_lotag=getnumber16("Enter sprite search lotag : ", search_lotag, 65536L,0);
|
|
search_hitag=getnumber16("Enter sprite search hitag : ", search_hitag, 65536L,0);
|
|
Bsprintf(tempbuf,"Search sprite lo=%d hi=%d",search_lotag,search_hitag);
|
|
printmessage16(tempbuf);
|
|
}
|
|
#endif
|
|
else EditSpriteData(spritenum);
|
|
}
|
|
|
|
static void PrintStatus(char *string,int32_t num,char x,char y,char color)
|
|
{
|
|
Bsprintf(tempbuf,"%s %d",string,num);
|
|
begindrawing();
|
|
printext16(x*8,ydim-STATUS2DSIZ+y*8,editorcolors[(int32_t)color],-1,tempbuf,0);
|
|
enddrawing();
|
|
}
|
|
|
|
static inline void SpriteName(int16_t spritenum, char *lo2)
|
|
{
|
|
Bstrcpy(lo2,names[sprite[spritenum].picnum]);
|
|
}// end SpriteName
|
|
|
|
static void ReadPaletteTable()
|
|
{
|
|
int32_t i,j,fp;
|
|
char lookup_num;
|
|
|
|
for (j = 0; j < 256; j++)
|
|
tempbuf[j] = j;
|
|
|
|
for (i=1; i<MAXPALOOKUPS; i++)
|
|
makepalookup(i,tempbuf,0,0,0,1);
|
|
|
|
if ((fp=kopen4load("lookup.dat",0)) == -1)
|
|
{
|
|
if ((fp=kopen4load("lookup.dat",1)) == -1)
|
|
{
|
|
initprintf("LOOKUP.DAT not found\n");
|
|
return;
|
|
}
|
|
}
|
|
// initprintf("Loading palette lookups... ");
|
|
kread(fp,&num_tables,1);
|
|
for (j=0; j<num_tables; j++)
|
|
{
|
|
kread(fp,&lookup_num,1);
|
|
kread(fp,tempbuf,256);
|
|
makepalookup(lookup_num,tempbuf,0,0,0,1);
|
|
}
|
|
for (j = 0; j < 256; j++)
|
|
tempbuf[j] = j;
|
|
num_tables++;
|
|
makepalookup(num_tables, tempbuf, 15, 15, 15, 1);
|
|
makepalookup(num_tables + 1, tempbuf, 15, 0, 0, 1);
|
|
makepalookup(num_tables + 2, tempbuf, 0, 15, 0, 1);
|
|
makepalookup(num_tables + 3, tempbuf, 0, 0, 15, 1);
|
|
|
|
kread(fp,WATERpalette,768);
|
|
kread(fp,SLIMEpalette,768);
|
|
kread(fp,TITLEpalette,768);
|
|
kread(fp,REALMSpalette,768);
|
|
kread(fp,BOSS1palette,768);
|
|
kclose(fp);
|
|
// initprintf("success.\n");
|
|
}// end ReadPaletteTable
|
|
|
|
static void ReadGamePalette()
|
|
{
|
|
int32_t fp;
|
|
if ((fp=kopen4load("palette.dat",0)) == -1)
|
|
if ((fp=kopen4load("palette.dat",1)) == -1)
|
|
{
|
|
initprintf("!!! PALETTE.DAT NOT FOUND !!!\n");
|
|
Bstrcpy(tempbuf, "Mapster32"VERSION BUILDDATE);
|
|
wm_msgbox(tempbuf,"palette.dat not found");
|
|
exit(0);
|
|
}
|
|
// initprintf("Loading game palette... ");
|
|
kread(fp,GAMEpalette,768);
|
|
kclose(fp);
|
|
// initprintf("success.\n");
|
|
ReadPaletteTable();
|
|
}
|
|
|
|
static char lockbyte4094;
|
|
|
|
static int32_t lastupdate, mousecol, mouseadd = 1, bstatus;
|
|
|
|
static void m32_showmouse(void)
|
|
{
|
|
int32_t i, col;
|
|
|
|
if (totalclock > lastupdate)
|
|
{
|
|
mousecol += mouseadd;
|
|
if (mousecol >= 30 || mousecol <= 0)
|
|
{
|
|
mouseadd = -mouseadd;
|
|
mousecol += mouseadd;
|
|
}
|
|
lastupdate = totalclock + 3;
|
|
}
|
|
|
|
switch (whitecol)
|
|
{
|
|
case 1: // Shadow Warrior
|
|
col = whitecol+mousecol;
|
|
break;
|
|
case 31: // Duke Nukem 3D
|
|
col = whitecol-mousecol;
|
|
break;
|
|
default:
|
|
col = whitecol;
|
|
break;
|
|
}
|
|
|
|
if (col != whitecol)
|
|
{
|
|
for (i=((xdim > 640)?3:2); i<=((xdim > 640)?7:3); i++)
|
|
{
|
|
plotpixel(searchx+i,searchy,col);
|
|
plotpixel(searchx-i,searchy,col);
|
|
plotpixel(searchx,searchy-i,col);
|
|
plotpixel(searchx,searchy+i,col);
|
|
}
|
|
for (i=1; i<=((xdim > 640)?2:1); i++)
|
|
{
|
|
plotpixel(searchx+i,searchy,whitecol);
|
|
plotpixel(searchx-i,searchy,whitecol);
|
|
plotpixel(searchx,searchy-i,whitecol);
|
|
plotpixel(searchx,searchy+i,whitecol);
|
|
}
|
|
i=((xdim > 640)?8:4);
|
|
plotpixel(searchx+i,searchy,0);
|
|
plotpixel(searchx-i,searchy,0);
|
|
plotpixel(searchx,searchy-i,0);
|
|
plotpixel(searchx,searchy+i,0);
|
|
}
|
|
|
|
if (xdim > 640)
|
|
{
|
|
for (i=1; i<=4; i++)
|
|
{
|
|
plotpixel(searchx+i,searchy,whitecol);
|
|
plotpixel(searchx-i,searchy,whitecol);
|
|
plotpixel(searchx,searchy-i,whitecol);
|
|
plotpixel(searchx,searchy+i,whitecol);
|
|
}
|
|
}
|
|
}
|
|
|
|
static int32_t AskIfSure(char *text)
|
|
{
|
|
int32_t retval=1;
|
|
|
|
if (qsetmode == 200)
|
|
{
|
|
begindrawing(); //{{{
|
|
printext256(0,0,whitecol,0,text?text:"Are you sure you want to proceed?",0);
|
|
enddrawing(); //}}}
|
|
}
|
|
else
|
|
{
|
|
_printmessage16(text?text:"Are you sure you want to proceed?");
|
|
}
|
|
|
|
showframe(1);
|
|
|
|
while ((keystatus[KEYSC_ESC]|keystatus[KEYSC_ENTER]|keystatus[KEYSC_SPACE]|keystatus[KEYSC_N]) == 0)
|
|
{
|
|
if (handleevents())
|
|
{
|
|
if (quitevent)
|
|
{
|
|
retval = 1;
|
|
break;
|
|
}
|
|
}
|
|
idle();
|
|
if (keystatus[KEYSC_Y]||keystatus[KEYSC_ENTER])
|
|
{
|
|
keystatus[KEYSC_Y] = 0;
|
|
keystatus[KEYSC_ENTER] = 0;
|
|
retval = 0;
|
|
break;
|
|
}
|
|
}
|
|
while (keystatus[KEYSC_ESC])
|
|
{
|
|
keystatus[KEYSC_ESC] = 0;
|
|
retval = 1;
|
|
break;
|
|
}
|
|
return(retval);
|
|
}
|
|
|
|
static int32_t IsValidTile(const int32_t idTile)
|
|
{
|
|
int32_t bValid = 0;
|
|
|
|
if ((idTile >= 0) && (idTile < MAXTILES))
|
|
{
|
|
if ((tilesizx[idTile] != 0) && (tilesizy[idTile] != 0))
|
|
{
|
|
bValid = 1;
|
|
}
|
|
}
|
|
|
|
return bValid;
|
|
}
|
|
|
|
static int32_t SelectAllTiles(int32_t iCurrentTile)
|
|
{
|
|
int32_t i;
|
|
|
|
if (iCurrentTile < localartlookupnum)
|
|
{
|
|
iCurrentTile = localartlookup[iCurrentTile];
|
|
}
|
|
else
|
|
{
|
|
iCurrentTile = 0;
|
|
}
|
|
|
|
localartlookupnum = MAXTILES;
|
|
|
|
for (i = 0; i < MAXTILES; i++)
|
|
{
|
|
localartlookup[i] = i;
|
|
localartfreq[i] = 0;
|
|
}
|
|
|
|
return iCurrentTile;
|
|
}
|
|
|
|
static int32_t OnGotoTile(int32_t iTile);
|
|
static int32_t OnSelectTile(int32_t iTile);
|
|
static int32_t s_Zoom = INITIAL_ZOOM;
|
|
static int32_t s_TileZoom = 1;
|
|
|
|
static int32_t DrawTiles(int32_t iTopLeft, int32_t iSelected, int32_t nXTiles, int32_t nYTiles, int32_t TileDim, int32_t offset);
|
|
|
|
|
|
static int32_t m32gettile(int32_t idInitialTile)
|
|
{
|
|
int32_t gap, temp;
|
|
int32_t nXTiles, nYTiles, nDisplayedTiles;
|
|
int32_t i;
|
|
int32_t iTile, iTopLeftTile;
|
|
int32_t idSelectedTile;
|
|
int32_t scrollmode;
|
|
int32_t mousedx, mousedy, mtile, omousex=searchx, omousey=searchy, moffset=0;
|
|
|
|
// Enable following line for testing. I couldn't work out how to change vidmode on the fly
|
|
// s_Zoom = NUM_ZOOMS - 1;
|
|
|
|
if (idInitialTile < 0)
|
|
{
|
|
idInitialTile = 0;
|
|
}
|
|
else if (idInitialTile >= MAXTILES)
|
|
{
|
|
idInitialTile = MAXTILES - 1;
|
|
}
|
|
|
|
// Ensure zoom not to big (which can happen if display size
|
|
// changes whilst Mapster is running)
|
|
do
|
|
{
|
|
nXTiles = xdim / ZoomToThumbSize[s_Zoom];
|
|
nYTiles = ydim / ZoomToThumbSize[s_Zoom];
|
|
// Refuse to draw less than half of a row.
|
|
if (ZoomToThumbSize[s_Zoom]/2 < 12) nYTiles--;
|
|
nDisplayedTiles = nXTiles * nYTiles;
|
|
|
|
if (!nDisplayedTiles)
|
|
{
|
|
// Eh-up, resolution changed since we were last displaying tiles.
|
|
s_Zoom--;
|
|
}
|
|
}
|
|
while (!nDisplayedTiles);
|
|
|
|
keystatus[KEYSC_V] = 0;
|
|
|
|
for (i = 0; i < MAXTILES; i++)
|
|
{
|
|
localartfreq[i] = 0;
|
|
|
|
localartlookup[i] = i;
|
|
}
|
|
|
|
iTile = idSelectedTile = idInitialTile;
|
|
|
|
switch (searchstat)
|
|
{
|
|
case 0 :
|
|
for (i = 0; i < numwalls; i++)
|
|
{
|
|
localartfreq[ wall[i].picnum ]++;
|
|
}
|
|
break;
|
|
|
|
case 1 :
|
|
case 2 :
|
|
for (i = 0; i < numsectors; i++)
|
|
{
|
|
localartfreq[ sector[i].ceilingpicnum ]++;
|
|
localartfreq[ sector[i].floorpicnum ]++;
|
|
}
|
|
break;
|
|
|
|
case 3 :
|
|
for (i=0; i<MAXSPRITES; i++)
|
|
{
|
|
if (sprite[i].statnum < MAXSTATUS)
|
|
{
|
|
localartfreq[ sprite[i].picnum ]++;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 4 :
|
|
for (i = 0; i < numwalls; i++)
|
|
{
|
|
localartfreq[ wall[i].overpicnum ]++;
|
|
}
|
|
break;
|
|
|
|
default :
|
|
break;
|
|
}
|
|
|
|
|
|
//
|
|
// Sort tiles into frequency order
|
|
//
|
|
|
|
gap = MAXTILES / 2;
|
|
|
|
do
|
|
{
|
|
for (i = 0; i < MAXTILES-gap; i++)
|
|
{
|
|
temp = i;
|
|
|
|
while ((localartfreq[temp] < localartfreq[temp+gap]) && (temp >= 0))
|
|
{
|
|
int32_t tempint;
|
|
|
|
tempint = localartfreq[temp];
|
|
localartfreq[temp] = localartfreq[temp+gap];
|
|
localartfreq[temp+gap] = tempint;
|
|
|
|
tempint = localartlookup[temp];
|
|
localartlookup[temp] = localartlookup[temp+gap];
|
|
localartlookup[temp+gap] = tempint;
|
|
|
|
if (iTile == temp)
|
|
{
|
|
iTile = temp + gap;
|
|
}
|
|
else if (iTile == temp + gap)
|
|
{
|
|
iTile = temp;
|
|
}
|
|
|
|
temp -= gap;
|
|
}
|
|
}
|
|
gap >>= 1;
|
|
}
|
|
while (gap > 0);
|
|
|
|
//
|
|
// Set up count of number of used tiles
|
|
//
|
|
|
|
localartlookupnum = 0;
|
|
while (localartfreq[localartlookupnum] > 0)
|
|
{
|
|
localartlookupnum++;
|
|
}
|
|
|
|
//
|
|
// Check : If no tiles used at all then switch to displaying all tiles
|
|
//
|
|
|
|
if (!localartfreq[0])
|
|
{
|
|
localartlookupnum = MAXTILES;
|
|
|
|
for (i = 0; i < MAXTILES; i++)
|
|
{
|
|
localartlookup[i] = i;
|
|
localartfreq[i] = 0; // Terrible bodge : zero tilefreq's not displayed in tile view. Still, when in Rome ... :-)
|
|
}
|
|
|
|
iTile = idInitialTile;
|
|
}
|
|
|
|
//
|
|
//
|
|
//
|
|
|
|
iTopLeftTile = iTile - (iTile % nXTiles);
|
|
|
|
if (iTopLeftTile < 0)
|
|
{
|
|
iTopLeftTile = 0;
|
|
}
|
|
|
|
if (iTopLeftTile > MAXTILES-nDisplayedTiles)
|
|
{
|
|
iTopLeftTile = MAXTILES-nDisplayedTiles;
|
|
}
|
|
|
|
searchx=((iTile-iTopLeftTile)%nXTiles)*ZoomToThumbSize[s_Zoom]+ZoomToThumbSize[s_Zoom]/2;
|
|
searchy=((iTile-iTopLeftTile)/nXTiles)*ZoomToThumbSize[s_Zoom]+ZoomToThumbSize[s_Zoom]/2;
|
|
|
|
////////////////////////////////
|
|
// Start of key handling code //
|
|
////////////////////////////////
|
|
|
|
while ((keystatus[KEYSC_ENTER]|keystatus[KEYSC_ESC]|(bstatus&1)) == 0) // <- Presumably one of these is escape key ???
|
|
{
|
|
DrawTiles(iTopLeftTile, (iTile >= localartlookupnum)?localartlookupnum-1:iTile, nXTiles, nYTiles, ZoomToThumbSize[s_Zoom],moffset);
|
|
|
|
getmousevalues(&mousedx,&mousedy,&bstatus);
|
|
searchx += mousedx;
|
|
searchy += mousedy;
|
|
if (bstatus&2)
|
|
{
|
|
moffset+=mousedy*2;
|
|
searchy += mousedy;
|
|
searchx -= mousedx;
|
|
if ((moffset < 0 && iTopLeftTile > localartlookupnum-nDisplayedTiles-1)
|
|
|| (moffset > 0 && iTopLeftTile==0))
|
|
{
|
|
moffset=0;
|
|
searchy -= mousedy*2;
|
|
}
|
|
while (moffset>ZoomToThumbSize[s_Zoom])
|
|
{
|
|
iTopLeftTile-=nXTiles;
|
|
moffset-=ZoomToThumbSize[s_Zoom];
|
|
}
|
|
while (moffset<-ZoomToThumbSize[s_Zoom])
|
|
{
|
|
iTopLeftTile+=nXTiles;
|
|
moffset+=ZoomToThumbSize[s_Zoom];
|
|
}
|
|
}
|
|
|
|
// Keep the pointer visible at all times.
|
|
temp = min((ZoomToThumbSize[s_Zoom] / 2), 12);
|
|
if (searchx < temp) searchx = temp;
|
|
if (searchy < temp) searchy = temp;
|
|
if (searchx > xdim - temp) searchx = xdim - temp;
|
|
if (searchy > ydim - temp) searchy = ydim - temp;
|
|
|
|
scrollmode=!(eitherCTRL^revertCTRL);
|
|
if (bstatus&16 && scrollmode && iTopLeftTile > 0)
|
|
{
|
|
mouseb &= ~16;
|
|
iTopLeftTile -= (nXTiles*scrollamount);
|
|
}
|
|
if (bstatus&32 && scrollmode && iTopLeftTile < localartlookupnum-nDisplayedTiles-1)
|
|
{
|
|
mouseb &= ~32;
|
|
iTopLeftTile += (nXTiles*scrollamount);
|
|
}
|
|
mtile=iTile=(searchx/ZoomToThumbSize[s_Zoom])+((searchy-moffset)/ZoomToThumbSize[s_Zoom])*nXTiles+iTopLeftTile;
|
|
while (iTile >= iTopLeftTile + nDisplayedTiles)
|
|
{
|
|
iTile-=nXTiles;
|
|
mtile=iTile;
|
|
}
|
|
|
|
if (bpp==8) // no idea why, but it breaks the mousewheel else :/
|
|
idle_waitevent();
|
|
else
|
|
idle();
|
|
if (handleevents())
|
|
{
|
|
if (quitevent) quitevent = 0;
|
|
}
|
|
|
|
// These two lines are so obvious I don't need to comment them ...;-)
|
|
synctics = totalclock-lockclock;
|
|
lockclock += synctics;
|
|
|
|
// Zoom in / out using numeric key pad's / and * keys
|
|
if (((keystatus[KEYSC_gSLASH] || (!scrollmode && bstatus&16)) && s_Zoom<(signed)(NUM_ZOOMS-1))
|
|
|| ((keystatus[KEYSC_gSTAR] || (!scrollmode && bstatus&32)) && s_Zoom>0))
|
|
{
|
|
if (keystatus[KEYSC_gSLASH] || (!scrollmode && bstatus&16))
|
|
{
|
|
keystatus[KEYSC_gSLASH] = 0;
|
|
mouseb &= ~16;
|
|
bstatus &= ~16;
|
|
|
|
// Watch out : If editor window is small, then the next zoom level
|
|
// might get so large that even one tile might not fit !
|
|
if ((ZoomToThumbSize[s_Zoom+1] <= xdim)
|
|
&& (ZoomToThumbSize[s_Zoom+1] <= ydim))
|
|
{
|
|
// Phew, plenty of room.
|
|
s_Zoom++;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
keystatus[KEYSC_gSTAR] = 0;
|
|
mouseb &= ~32;
|
|
bstatus &= ~32;
|
|
s_Zoom--;
|
|
}
|
|
|
|
if (iTile >= localartlookupnum)iTile = localartlookupnum-1;
|
|
|
|
// Calculate new num of tiles to display
|
|
nXTiles = xdim / ZoomToThumbSize[s_Zoom];
|
|
nYTiles = ydim / ZoomToThumbSize[s_Zoom];
|
|
// Refuse to draw less than half of a row.
|
|
if (ZoomToThumbSize[s_Zoom]/2 < 12) nYTiles--;
|
|
nDisplayedTiles = nXTiles * nYTiles;
|
|
|
|
// Determine if the top-left displayed tile needs to
|
|
// alter in order to display selected tile
|
|
iTopLeftTile = iTile - (iTile % nXTiles);
|
|
|
|
if (iTopLeftTile < 0)
|
|
{
|
|
iTopLeftTile = 0;
|
|
}
|
|
else if (iTopLeftTile > MAXTILES - nDisplayedTiles)
|
|
{
|
|
iTopLeftTile = MAXTILES - nDisplayedTiles;
|
|
}
|
|
// scroll window so mouse points the same tile as it was before zooming
|
|
iTopLeftTile-=(searchx/ZoomToThumbSize[s_Zoom])+((searchy-moffset)/ZoomToThumbSize[s_Zoom])*nXTiles+iTopLeftTile-iTile;
|
|
}
|
|
|
|
if (keystatus[KEYSC_LEFT])
|
|
{
|
|
iTile -= (iTile > 0);
|
|
keystatus[KEYSC_LEFT] = 0;
|
|
}
|
|
|
|
if (keystatus[KEYSC_RIGHT])
|
|
{
|
|
iTile += (iTile < MAXTILES);
|
|
keystatus[KEYSC_RIGHT] = 0;
|
|
}
|
|
|
|
if (keystatus[KEYSC_UP])
|
|
{
|
|
iTile -= nXTiles;
|
|
keystatus[KEYSC_UP] = 0;
|
|
}
|
|
|
|
if (keystatus[KEYSC_DOWN])
|
|
{
|
|
iTile += nXTiles;
|
|
keystatus[KEYSC_DOWN] = 0;
|
|
}
|
|
|
|
if (keystatus[KEYSC_PGUP])
|
|
{
|
|
iTile -= nDisplayedTiles;
|
|
keystatus[KEYSC_PGUP] = 0;
|
|
}
|
|
|
|
if (keystatus[KEYSC_PGDN])
|
|
{
|
|
iTile += nDisplayedTiles;
|
|
keystatus[KEYSC_PGDN] = 0;
|
|
}
|
|
|
|
//
|
|
// Ensure tilenum is within valid range
|
|
//
|
|
|
|
if (iTile < 0)
|
|
{
|
|
iTile = 0;
|
|
}
|
|
|
|
if (iTile >= MAXTILES) // shouldn't this be the count of num tiles ???
|
|
{
|
|
iTile = MAXTILES-1;
|
|
}
|
|
|
|
// 'V' KEYPRESS
|
|
if (keystatus[KEYSC_V])
|
|
{
|
|
keystatus[KEYSC_V] = 0;
|
|
|
|
iTile = SelectAllTiles(iTile);
|
|
}
|
|
|
|
// 'G' KEYPRESS - Goto frame
|
|
if (keystatus[KEYSC_G])
|
|
{
|
|
keystatus[KEYSC_G] = 0;
|
|
|
|
iTile = OnGotoTile(iTile);
|
|
}
|
|
|
|
// 'U' KEYPRESS : go straight to user defined art
|
|
if (keystatus[KEYSC_U])
|
|
{
|
|
SelectAllTiles(iTile);
|
|
|
|
iTile = FIRST_USER_ART_TILE;
|
|
keystatus[KEYSC_U] = 0;
|
|
}
|
|
|
|
// 'A' KEYPRESS : Go straight to start of Atomic edition's art
|
|
if (keystatus[KEYSC_A])
|
|
{
|
|
SelectAllTiles(iTile);
|
|
|
|
iTile = FIRST_ATOMIC_TILE;
|
|
keystatus[KEYSC_A] = 0;
|
|
}
|
|
|
|
// 'T' KEYPRESS = Select from pre-defined tileset
|
|
if (keystatus[KEYSC_T])
|
|
{
|
|
keystatus[KEYSC_T] = 0;
|
|
|
|
iTile = OnSelectTile(iTile);
|
|
}
|
|
|
|
// 'E' KEYPRESS : Go straight to start of extended art
|
|
if (keystatus[KEYSC_E])
|
|
{
|
|
SelectAllTiles(iTile);
|
|
|
|
if (iTile == FIRST_EXTENDED_TILE)
|
|
iTile = SECOND_EXTENDED_TILE;
|
|
else iTile = FIRST_EXTENDED_TILE;
|
|
|
|
keystatus[KEYSC_E] = 0;
|
|
}
|
|
|
|
if (keystatus[KEYSC_Z])
|
|
{
|
|
s_TileZoom = !s_TileZoom;
|
|
keystatus[KEYSC_Z] = 0;
|
|
}
|
|
|
|
//
|
|
// Adjust top-left to ensure tilenum is within displayed range of tiles
|
|
//
|
|
|
|
while (iTile < iTopLeftTile - (moffset<0)?nXTiles:0)
|
|
{
|
|
iTopLeftTile -= nXTiles;
|
|
}
|
|
|
|
while (iTile >= iTopLeftTile + nDisplayedTiles)
|
|
{
|
|
iTopLeftTile += nXTiles;
|
|
}
|
|
|
|
if (iTopLeftTile < 0)
|
|
{
|
|
iTopLeftTile = 0;
|
|
}
|
|
|
|
if (iTopLeftTile > MAXTILES - nDisplayedTiles)
|
|
{
|
|
iTopLeftTile = MAXTILES - nDisplayedTiles;
|
|
}
|
|
|
|
if ((keystatus[KEYSC_ENTER] || (bstatus&1)) == 0) // uh ? Not escape key ?
|
|
{
|
|
idSelectedTile = idInitialTile;
|
|
}
|
|
else
|
|
{
|
|
if (iTile < localartlookupnum)
|
|
{
|
|
// Convert tile num from index to actual tile num
|
|
idSelectedTile = localartlookup[iTile];
|
|
|
|
// Check : if invalid tile selected, return original tile num
|
|
if (!IsValidTile(idSelectedTile))
|
|
{
|
|
idSelectedTile = idInitialTile;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
idSelectedTile = idInitialTile;
|
|
}
|
|
}
|
|
if (mtile!=iTile) // if changed by keyboard, update mouse cursor
|
|
{
|
|
searchx=((iTile-iTopLeftTile)%nXTiles)*ZoomToThumbSize[s_Zoom]+ZoomToThumbSize[s_Zoom]/2;
|
|
searchy=((iTile-iTopLeftTile)/nXTiles)*ZoomToThumbSize[s_Zoom]+ZoomToThumbSize[s_Zoom]/2+moffset;
|
|
}
|
|
}
|
|
searchx=omousex; searchy=omousey;
|
|
|
|
keystatus[KEYSC_ESC] = 0;
|
|
keystatus[KEYSC_ENTER] = 0;
|
|
|
|
return(idSelectedTile);
|
|
|
|
}
|
|
|
|
// Dir = 0 (zoom out) or 1 (zoom in)
|
|
//void OnZoomInOut( int32_t *pZoom, int32_t Dir /*0*/ )
|
|
//{
|
|
//}
|
|
|
|
static int32_t OnGotoTile(int32_t iTile)
|
|
{
|
|
int32_t iTemp, iNewTile;
|
|
char ch;
|
|
char szTemp[128];
|
|
|
|
//Automatically press 'V'
|
|
iTile = SelectAllTiles(iTile);
|
|
|
|
bflushchars();
|
|
|
|
iNewTile = iTemp = 0; //iTile; //PK
|
|
|
|
while (keystatus[KEYSC_ESC] == 0)
|
|
{
|
|
if (handleevents())
|
|
{
|
|
if (quitevent) quitevent = 0;
|
|
}
|
|
idle();
|
|
|
|
ch = bgetchar();
|
|
|
|
Bsprintf(szTemp, "Goto tile: %d_ ", iNewTile);
|
|
printext256(0, 0, whitecol, 0, szTemp, 0);
|
|
showframe(1);
|
|
|
|
if (ch >= '0' && ch <= '9')
|
|
{
|
|
iTemp = (iNewTile*10) + (ch-'0');
|
|
if (iTemp < MAXTILES)
|
|
{
|
|
iNewTile = iTemp;
|
|
}
|
|
}
|
|
else if (ch == 8)
|
|
{
|
|
iNewTile /= 10;
|
|
}
|
|
else if (ch == 13)
|
|
{
|
|
iTile = iNewTile;
|
|
break;
|
|
}
|
|
}
|
|
|
|
clearkeys();
|
|
|
|
return iTile;
|
|
}
|
|
|
|
static int32_t LoadTileSet(const int32_t idCurrentTile, const int32_t *pIds, const int32_t nIds)
|
|
{
|
|
int32_t iNewTile = 0;
|
|
int32_t i;
|
|
|
|
localartlookupnum = nIds;
|
|
|
|
for (i = 0; i < localartlookupnum; i++)
|
|
{
|
|
localartlookup[i] = pIds[i];
|
|
// REM : Could we still utilise localartfreq[] to mark
|
|
// which tiles are currently used in the map ? Set to 0xFFFF perhaps ?
|
|
localartfreq[i] = 0;
|
|
|
|
if (idCurrentTile == pIds[i])
|
|
{
|
|
iNewTile = i;
|
|
}
|
|
}
|
|
|
|
return iNewTile;
|
|
|
|
}
|
|
|
|
static int32_t OnSelectTile(int32_t iTile)
|
|
{
|
|
int32_t bDone = 0;
|
|
int32_t i;
|
|
char ch;
|
|
|
|
for (i = 0; (unsigned)i < tile_groups; i++)
|
|
{
|
|
if (s_TileGroups[i].pIds != NULL)
|
|
break;
|
|
}
|
|
|
|
if ((unsigned)i == tile_groups) // no tile groups
|
|
return (iTile);
|
|
|
|
SelectAllTiles(iTile);
|
|
|
|
bflushchars();
|
|
|
|
begindrawing();
|
|
setpolymost2dview();
|
|
clearview(0);
|
|
|
|
//
|
|
// Await appropriate selection keypress.
|
|
//
|
|
|
|
bDone = 0;
|
|
|
|
while (keystatus[KEYSC_ESC] == 0 && (!bDone))
|
|
{
|
|
if (handleevents())
|
|
{
|
|
if (quitevent) quitevent = 0;
|
|
}
|
|
idle();
|
|
|
|
//
|
|
// Display the description strings for each available tile group
|
|
//
|
|
for (i = 0; (unsigned)i < tile_groups; i++)
|
|
{
|
|
if (s_TileGroups[i].szText != NULL)
|
|
{
|
|
if ((i+2)*16 > ydimgame) break;
|
|
Bsprintf(tempbuf,"(%c) %s",s_TileGroups[i].key1,s_TileGroups[i].szText);
|
|
printext256(10L, (i+1)*16, whitecol, -1, tempbuf, 0);
|
|
}
|
|
}
|
|
showframe(1);
|
|
|
|
|
|
ch = bgetchar();
|
|
|
|
for (i = 0; (unsigned)i < tile_groups; i++)
|
|
{
|
|
if (s_TileGroups[i].pIds != NULL && s_TileGroups[i].key1)
|
|
if ((ch == s_TileGroups[i].key1) || (ch == s_TileGroups[i].key2))
|
|
{
|
|
iTile = LoadTileSet(iTile, s_TileGroups[i].pIds, s_TileGroups[i].nIds);
|
|
bDone = 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
enddrawing();
|
|
showframe(1);
|
|
|
|
clearkeys();
|
|
|
|
return iTile;
|
|
}
|
|
|
|
const char * GetTilePixels(const int32_t idTile)
|
|
{
|
|
char *pPixelData = 0;
|
|
|
|
if ((idTile >= 0) && (idTile < MAXTILES))
|
|
{
|
|
if (!waloff[idTile])
|
|
{
|
|
loadtile(idTile);
|
|
}
|
|
|
|
if (IsValidTile(idTile))
|
|
{
|
|
pPixelData = (char *)waloff[idTile];
|
|
}
|
|
}
|
|
|
|
return pPixelData;
|
|
}
|
|
|
|
static int32_t DrawTiles(int32_t iTopLeft, int32_t iSelected, int32_t nXTiles, int32_t nYTiles, int32_t TileDim, int32_t offset)
|
|
{
|
|
int32_t XTile, YTile;
|
|
int32_t iTile, idTile;
|
|
int32_t XBox, YBox;
|
|
int32_t XPos, YPos;
|
|
int32_t XOffset, YOffset;
|
|
int32_t i;
|
|
const char * pRawPixels;
|
|
int32_t TileSizeX, TileSizeY;
|
|
int32_t DivInc,MulInc;
|
|
char *pScreen;
|
|
char szT[128];
|
|
|
|
begindrawing();
|
|
|
|
setpolymost2dview();
|
|
|
|
clearview(0);
|
|
|
|
for (YTile = 0-(offset>0); YTile < nYTiles+(offset<0)+1; YTile++)
|
|
{
|
|
for (XTile = 0; XTile < nXTiles; XTile++)
|
|
{
|
|
iTile = iTopLeft + XTile + (YTile * nXTiles);
|
|
|
|
if (iTile>=0 && iTile < localartlookupnum)
|
|
{
|
|
idTile = localartlookup[ iTile ];
|
|
|
|
// Get pointer to tile's raw pixel data
|
|
pRawPixels = GetTilePixels(idTile);
|
|
|
|
if (pRawPixels != NULL)
|
|
{
|
|
XPos = XTile * TileDim;
|
|
YPos = YTile * TileDim+offset;
|
|
|
|
if (polymost_drawtilescreen(XPos, YPos, idTile, TileDim, s_TileZoom))
|
|
{
|
|
TileSizeX = tilesizx[ idTile ];
|
|
TileSizeY = tilesizy[ idTile ];
|
|
|
|
DivInc = 1;
|
|
MulInc = 1;
|
|
|
|
while ((TileSizeX/DivInc > TileDim)
|
|
|| (TileSizeY/DivInc) > TileDim)
|
|
{
|
|
DivInc++;
|
|
}
|
|
|
|
if (DivInc == 1 && s_TileZoom)
|
|
{
|
|
while (((TileSizeX*(MulInc+1)) <= TileDim)
|
|
&& ((TileSizeY*(MulInc+1)) <= TileDim))
|
|
{
|
|
MulInc++;
|
|
}
|
|
}
|
|
|
|
TileSizeX = (TileSizeX / DivInc) * MulInc;
|
|
TileSizeY = (TileSizeY / DivInc) * MulInc;
|
|
|
|
for (YOffset = 0; YOffset < TileSizeY; YOffset++)
|
|
{
|
|
int32_t y=YPos+YOffset;
|
|
if (y>=0 && y<ydim)
|
|
{
|
|
pScreen = (char *)ylookup[y]+XPos+frameplace;
|
|
for (XOffset = 0; XOffset < TileSizeX; XOffset++)
|
|
{
|
|
pScreen[XOffset] = pRawPixels[((YOffset * DivInc) / MulInc) + (((XOffset * DivInc) / MulInc) * tilesizy[idTile])];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (localartfreq[iTile] != 0 && YPos >= 0 && YPos <= ydim-20)
|
|
{
|
|
Bsprintf(szT, "%d", localartfreq[iTile]);
|
|
printext256(XPos, YPos, whitecol, -1, szT, 1);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//
|
|
// Draw white box around currently selected tile
|
|
//
|
|
|
|
XBox = ((iSelected-iTopLeft) % nXTiles) * TileDim;
|
|
YBox = ((iSelected - ((iSelected-iTopLeft) % nXTiles) - iTopLeft) / nXTiles) * TileDim+offset;
|
|
|
|
if (iSelected-iTopLeft>0)
|
|
for (i = 0; i < TileDim; i++)
|
|
{
|
|
if (YBox>=0 && YBox<ydim)
|
|
plotpixel(XBox+i, YBox, whitecol);
|
|
if (YBox+TileDim>=0 && YBox+TileDim<ydim)
|
|
plotpixel(XBox+i, YBox + TileDim, whitecol);
|
|
if (YBox+i>=0 && YBox+i<ydim)
|
|
{
|
|
plotpixel(XBox, YBox + i, whitecol);
|
|
plotpixel(XBox + TileDim, YBox + i, whitecol);
|
|
}
|
|
}
|
|
|
|
idTile = localartlookup[ iSelected ];
|
|
|
|
// Draw info bar at bottom.
|
|
|
|
// Clear out behind the text for improved visibility.
|
|
//drawline256(0, (ydim-12)<<12, xdim<<12, (ydim-12)<<12, whitecol);
|
|
for (i=ydim-12; i<ydim; i++)
|
|
{
|
|
drawline256(0, i<<12, xdim<<12, i<<12, (ydim-i));
|
|
}
|
|
|
|
// Tile number on left.
|
|
Bsprintf(szT, "%d" , idTile);
|
|
printext256(1, ydim-10, whitecol, -1, szT, 0);
|
|
|
|
// Tile name on right.
|
|
printext256(xdim-(Bstrlen(names[idTile])<<3)-1,ydim-10,whitecol,-1,names[idTile],0);
|
|
|
|
// Tile dimensions.
|
|
Bsprintf(szT,"%dx%d",tilesizx[idTile],tilesizy[idTile]);
|
|
printext256(xdim>>2,ydim-10,whitecol,-1,szT,0);
|
|
|
|
// EditArt animation flags.
|
|
Bsprintf(szT,"%d, %d",(picanm[idTile]>>8)&0xFF,(picanm[idTile]>>16)&0xFF);
|
|
printext256((xdim>>2)+100,ydim-10,whitecol,-1,szT,0);
|
|
|
|
m32_showmouse();
|
|
|
|
enddrawing();
|
|
showframe(1);
|
|
|
|
return(0);
|
|
|
|
}
|
|
|
|
int32_t spriteonceilingz(int32_t searchwall)
|
|
{
|
|
int32_t z=sprite[searchwall].z;
|
|
z = getceilzofslope(searchsector,sprite[searchwall].x,sprite[searchwall].y);
|
|
if (sprite[searchwall].cstat&128) z -= ((tilesizy[sprite[searchwall].picnum]*sprite[searchwall].yrepeat)<<1);
|
|
if ((sprite[searchwall].cstat&48) != 32)
|
|
z += ((tilesizy[sprite[searchwall].picnum]*sprite[searchwall].yrepeat)<<2);
|
|
return z;
|
|
}
|
|
|
|
int32_t spriteongroundz(int32_t searchwall)
|
|
{
|
|
int32_t z=sprite[searchwall].z;
|
|
z = getflorzofslope(searchsector,sprite[searchwall].x,sprite[searchwall].y);
|
|
if (sprite[searchwall].cstat&128) z -= ((tilesizy[sprite[searchwall].picnum]*sprite[searchwall].yrepeat)<<1);
|
|
return z;
|
|
}
|
|
|
|
#define WIND1X 3
|
|
#define WIND1Y 150
|
|
void drawtileinfo(char *title,int32_t x,int32_t y,int32_t picnum,int32_t shade,int32_t pal,int32_t cstat,int32_t lotag,int32_t hitag,int32_t extra)
|
|
{
|
|
char buf[64];
|
|
int32_t i,j;
|
|
int32_t scale=65536;
|
|
int32_t x1;
|
|
int32_t oviewingrange=viewingrange, oyxaspect=yxaspect;
|
|
|
|
j = xdimgame>640?0:1;
|
|
i = ydimgame>>6;
|
|
|
|
x1=x+80;
|
|
if (j)x1/=2;
|
|
x1=(int32_t)(x1*(320./xdimgame));
|
|
scale=(int32_t)(scale/(max(tilesizx[picnum],tilesizy[picnum])/24.));
|
|
|
|
setaspect(65536L, (int32_t)divscale16(ydim*320L,xdim*200L));
|
|
rotatesprite((x1+13)<<16,(y+11)<<16,scale,0,picnum,shade,pal,2,0L,0L,xdim-1L,ydim-1L);
|
|
setaspect(oviewingrange, oyxaspect);
|
|
|
|
x=(int32_t)(x*(xdimgame/320.));
|
|
y=(int32_t)(y*(ydimgame/200.));
|
|
begindrawing();
|
|
printext256(x+2,y+2,0,-1,title,j);
|
|
printext256(x,y,255-13,-1,title,j);
|
|
|
|
Bsprintf(buf,"Pic:%4d",picnum);
|
|
printext256(x+2,y+2+i*1,0,-1,buf,j);
|
|
printext256(x,y+i*1,whitecol,-1,buf,j);
|
|
Bsprintf(buf,"Shd:%4d",shade);
|
|
printext256(x+2,y+2+i*2,0,-1,buf,j);
|
|
printext256(x,y+i*2,whitecol,-1,buf,j);
|
|
Bsprintf(buf,"Pal:%4d",pal);
|
|
printext256(x+2,y+2+i*3,0,-1,buf,j);
|
|
printext256(x,y+i*3,whitecol,-1,buf,j);
|
|
Bsprintf(buf,"Cst:%4d",cstat);
|
|
printext256(x+2,y+2+i*4,0,-1,buf,j);
|
|
printext256(x,y+i*4,whitecol,-1,buf,j);
|
|
Bsprintf(buf,"Lot:%4d",lotag);
|
|
printext256(x+2,y+2+i*5,0,-1,buf,j);
|
|
printext256(x,y+i*5,whitecol,-1,buf,j);
|
|
Bsprintf(buf,"Hit:%4d",hitag);
|
|
printext256(x+2,y+2+i*6,0,-1,buf,j);
|
|
printext256(x,y+i*6,whitecol,-1,buf,j);
|
|
Bsprintf(buf,"Ext:%4d",extra);
|
|
printext256(x+2,y+2+i*7,0,-1,buf,j);
|
|
printext256(x,y+i*7,whitecol,-1,buf,j);
|
|
enddrawing();
|
|
}
|
|
int32_t snap=0;
|
|
int32_t saveval1,saveval2,saveval3;
|
|
|
|
static inline void getnumber_dochar(char *ptr, int32_t num)
|
|
{
|
|
*ptr = (char) num;
|
|
}
|
|
|
|
static inline void getnumber_doint16_t(int16_t *ptr, int32_t num)
|
|
{
|
|
*ptr = (int16_t) num;
|
|
}
|
|
|
|
static inline void getnumber_doint32(int32_t *ptr, int32_t num)
|
|
{
|
|
*ptr = (int32_t) num;
|
|
}
|
|
|
|
static inline void getnumber_doint64(int64_t *ptr, int32_t num)
|
|
{
|
|
*ptr = (int64_t) num;
|
|
}
|
|
|
|
void getnumberptr256(char *namestart, void *num, int32_t bytes, int32_t maxnumber, char sign, void *(func)(int32_t))
|
|
{
|
|
char buffer[80], ch;
|
|
int32_t n, danum = 0, oldnum;
|
|
|
|
switch (bytes)
|
|
{
|
|
case 1:
|
|
danum = *(char *)num;
|
|
break;
|
|
case 2:
|
|
danum = *(int16_t *)num;
|
|
break;
|
|
case 4:
|
|
danum = *(int32_t *)num;
|
|
break;
|
|
case 8:
|
|
danum = *(int64_t *)num;
|
|
break;
|
|
}
|
|
|
|
oldnum = danum;
|
|
bflushchars();
|
|
while (keystatus[0x1] == 0)
|
|
{
|
|
if (handleevents())
|
|
{
|
|
if (quitevent) quitevent = 0;
|
|
}
|
|
|
|
drawrooms(pos.x,pos.y,pos.z,ang,horiz,cursectnum);
|
|
#ifdef SUPERBUILD
|
|
ExtAnalyzeSprites();
|
|
#endif
|
|
drawmasks();
|
|
|
|
ch = bgetchar();
|
|
|
|
if (keystatus[0x1]) break;
|
|
|
|
clearkeys();
|
|
|
|
mouseb = 0;
|
|
searchx = osearchx;
|
|
searchy = osearchy;
|
|
|
|
ExtCheckKeys();
|
|
|
|
Bsprintf(buffer,"%s%d",namestart,danum);
|
|
if (totalclock & 32) Bstrcat(buffer,"_ ");
|
|
printmessage256(0, 0, buffer);
|
|
if (func != NULL)
|
|
{
|
|
Bsprintf(buffer,"%s",(char *)func((int32_t)danum));
|
|
printmessage256(0, 9, buffer);
|
|
}
|
|
showframe(1);
|
|
|
|
if (ch >= '0' && ch <= '9')
|
|
{
|
|
if (danum >= 0)
|
|
{
|
|
n = (danum*10)+(ch-'0');
|
|
if (n <= maxnumber) danum = n;
|
|
}
|
|
else if (sign)
|
|
{
|
|
n = (danum*10)-(ch-'0');
|
|
if (n >= -maxnumber) danum = n;
|
|
}
|
|
}
|
|
else if (ch == 8 || ch == 127) // backspace
|
|
{
|
|
danum /= 10;
|
|
}
|
|
else if (ch == 13)
|
|
{
|
|
if (danum != oldnum)
|
|
asksave = 1;
|
|
oldnum = danum;
|
|
break;
|
|
}
|
|
else if (ch == '-' && sign) // negate
|
|
{
|
|
danum = -danum;
|
|
}
|
|
switch (bytes)
|
|
{
|
|
case 1:
|
|
getnumber_dochar(num, danum);
|
|
break;
|
|
case 2:
|
|
getnumber_doint16_t(num, danum);
|
|
break;
|
|
case 4:
|
|
getnumber_doint32(num, danum);
|
|
break;
|
|
case 8:
|
|
getnumber_doint64(num, danum);
|
|
break;
|
|
}
|
|
}
|
|
clearkeys();
|
|
|
|
lockclock = totalclock; //Reset timing
|
|
|
|
switch (bytes)
|
|
{
|
|
case 1:
|
|
getnumber_dochar(num, oldnum);
|
|
break;
|
|
case 2:
|
|
getnumber_doint16_t(num, oldnum);
|
|
break;
|
|
case 4:
|
|
getnumber_doint32(num, oldnum);
|
|
break;
|
|
case 8:
|
|
getnumber_doint64(num, oldnum);
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void DoSpriteOrnament(int32_t i)
|
|
{
|
|
int32_t j;
|
|
hitdata_t hitinfo;
|
|
|
|
hitscan((const vec3_t *)&sprite[i],sprite[i].sectnum,
|
|
sintable[(sprite[i].ang+2560+1024)&2047],
|
|
sintable[(sprite[i].ang+2048+1024)&2047],
|
|
0,
|
|
&hitinfo,CLIPMASK1);
|
|
|
|
sprite[i].x = hitinfo.pos.x;
|
|
sprite[i].y = hitinfo.pos.y;
|
|
sprite[i].z = hitinfo.pos.z;
|
|
changespritesect(i,hitinfo.hitsect);
|
|
if (hitinfo.hitwall >= 0)
|
|
sprite[i].ang = ((getangle(wall[wall[hitinfo.hitwall].point2].x-wall[hitinfo.hitwall].x,
|
|
wall[wall[hitinfo.hitwall].point2].y-wall[hitinfo.hitwall].y)+512)&2047);
|
|
|
|
//Make sure sprite's in right sector
|
|
if (inside(sprite[i].x,sprite[i].y,sprite[i].sectnum) == 0)
|
|
{
|
|
j = wall[hitinfo.hitwall].point2;
|
|
sprite[i].x -= ksgn(wall[j].y-wall[hitinfo.hitwall].y);
|
|
sprite[i].y += ksgn(wall[j].x-wall[hitinfo.hitwall].x);
|
|
}
|
|
}
|
|
|
|
int64_t ldistsqr(spritetype *s1,spritetype *s2)
|
|
{
|
|
return (((int64_t)(s2->x - s1->x))*((int64_t)(s2->x - s1->x)) +
|
|
((int64_t)(s2->y - s1->y))*((int64_t)(s2->y - s1->y)));
|
|
}
|
|
|
|
void rendertext(int16_t startspr)
|
|
{
|
|
char ch, buffer[80], doingspace=0;
|
|
int16_t daang = 0, t, alphidx, basetile, linebegspr, curspr, cursor;
|
|
int32_t i, j, k, dax = 0, day = 0;
|
|
static uint8_t hgap=0, vgap=4;
|
|
static uint8_t spcgap[MAX_ALPHABETS], firstrun=1;
|
|
spritetype *sp;
|
|
|
|
int16_t *spritenums;
|
|
int32_t stackallocsize=32, numletters=0;
|
|
|
|
if (firstrun)
|
|
{
|
|
firstrun=0;
|
|
for (i=0; i<numalphabets; i++)
|
|
spcgap[i] = 0;
|
|
}
|
|
|
|
if (startspr<0 || startspr>=MAXSPRITES ||
|
|
sprite[startspr].statnum == MAXSTATUS)
|
|
return;
|
|
|
|
if (numalphabets == 0)
|
|
{
|
|
message("Alphabet configuration not read.");
|
|
return;
|
|
}
|
|
|
|
if ((sprite[startspr].cstat&16) == 0)
|
|
{
|
|
message("Must point at a wall-aligned text sprite.");
|
|
return;
|
|
}
|
|
|
|
t = sprite[startspr].picnum;
|
|
alphidx = -1;
|
|
for (i=0; i<numalphabets; i++)
|
|
{
|
|
for (j=0; j<NUMPRINTABLES; j++)
|
|
if (alphabets[i].pic[j] == t)
|
|
{
|
|
alphidx = i;
|
|
basetile = t;
|
|
if (spcgap[i] == 0)
|
|
spcgap[i] = 3*tilesizx[t]/2;
|
|
goto ENDFOR1;
|
|
}
|
|
}
|
|
ENDFOR1:
|
|
if (alphidx==-1)
|
|
{
|
|
message("Must point at a text sprite.");
|
|
return;
|
|
}
|
|
|
|
curspr = linebegspr = startspr;
|
|
|
|
t = sprite[startspr].picnum;
|
|
sprite[startspr].xoffset = -(((picanm[t])>>8)&255);
|
|
sprite[startspr].yoffset = -(((picanm[t])>>16)&255);
|
|
|
|
spritenums = Bmalloc(stackallocsize * sizeof(int16_t));
|
|
if (!spritenums) goto ERROR_NOMEMORY;
|
|
|
|
cursor = insertsprite(sprite[startspr].sectnum,0);
|
|
if (cursor < 0) goto ERROR_TOOMANYSPRITES;
|
|
|
|
updatenumsprites();
|
|
|
|
sp = &sprite[cursor];
|
|
Bmemcpy(sp, &sprite[startspr], sizeof(spritetype));
|
|
sp->yoffset = 0;
|
|
sp->picnum = SMALLFNTCURSOR;
|
|
sp->xrepeat = min(max(sp->xrepeat/tilesizx[sp->picnum],2),255);
|
|
sp->yrepeat = min(max((sp->yrepeat*tilesizy[sprite[startspr].picnum])/tilesizy[sp->picnum],4),255);
|
|
sp->pal = 0;
|
|
sp->cstat = 18;
|
|
|
|
bflushchars();
|
|
while (keystatus[0x1] == 0)
|
|
{
|
|
if (handleevents())
|
|
{
|
|
if (quitevent) quitevent = 0;
|
|
}
|
|
|
|
if (keystatus[KEYSC_UP]) // vertical gap in pixels (32 x-units)
|
|
{
|
|
keystatus[KEYSC_UP]=0;
|
|
if (vgap<255) vgap++;
|
|
}
|
|
if (keystatus[KEYSC_DOWN])
|
|
{
|
|
keystatus[KEYSC_DOWN]=0;
|
|
if (vgap>0) vgap--;
|
|
}
|
|
|
|
if (keystatus[KEYSC_RIGHT]) // horizontal gap in half pixels
|
|
{
|
|
keystatus[KEYSC_RIGHT]=0;
|
|
if (hgap<255) hgap++;
|
|
}
|
|
if (keystatus[KEYSC_LEFT])
|
|
{
|
|
keystatus[KEYSC_LEFT]=0;
|
|
if (hgap>0) hgap--;
|
|
}
|
|
|
|
if (keystatus[KEYSC_INSERT]) // space gap in half pixels
|
|
{
|
|
keystatus[KEYSC_INSERT]=0;
|
|
if (spcgap[alphidx]<255) spcgap[alphidx]++;
|
|
}
|
|
if (keystatus[KEYSC_DELETE])
|
|
{
|
|
keystatus[KEYSC_DELETE]=0;
|
|
if (spcgap[alphidx]>1) spcgap[alphidx]--;
|
|
}
|
|
|
|
if (keystatus[KEYSC_HOME]) // shade
|
|
{
|
|
keystatus[KEYSC_HOME]=0;
|
|
if (sprite[linebegspr].shade<127) sprite[linebegspr].shade++;
|
|
}
|
|
if (keystatus[KEYSC_END])
|
|
{
|
|
keystatus[KEYSC_END]=0;
|
|
if (sprite[linebegspr].shade>-128) sprite[linebegspr].shade--;
|
|
}
|
|
|
|
if (keystatus[KEYSC_PGUP]) // pal
|
|
{
|
|
keystatus[KEYSC_PGUP]=0;
|
|
if (sprite[linebegspr].pal<255) sprite[linebegspr].pal++;
|
|
}
|
|
if (keystatus[KEYSC_PGDN])
|
|
{
|
|
keystatus[KEYSC_PGDN]=0;
|
|
if (sprite[linebegspr].pal>0) sprite[linebegspr].pal--;
|
|
}
|
|
|
|
drawrooms(pos.x,pos.y,pos.z,ang,horiz,cursectnum);
|
|
#ifdef SUPERBUILD
|
|
ExtAnalyzeSprites();
|
|
#endif
|
|
drawmasks();
|
|
|
|
ch = bgetchar();
|
|
|
|
if (keystatus[0x1]) break;
|
|
|
|
clearkeys();
|
|
|
|
mouseb = 0;
|
|
searchx = osearchx;
|
|
searchy = osearchy;
|
|
|
|
ExtCheckKeys();
|
|
|
|
printmessage256(0,0,"^251Text entry mode.^31 Navigation keys change vars.");
|
|
Bsprintf(buffer, "Hgap=%d, Vgap=%d, SPCgap=%d, Shd=%d, Pal=%d",
|
|
hgap, vgap, spcgap[alphidx], sprite[linebegspr].shade, sprite[linebegspr].pal);
|
|
printmessage256(0, 9, buffer);
|
|
showframe(1);
|
|
|
|
// ---
|
|
sp = &sprite[curspr];
|
|
if (!doingspace)
|
|
{
|
|
dax = sp->x; day = sp->y;
|
|
daang = sp->ang;
|
|
}
|
|
|
|
j = sp->xrepeat*(hgap+tilesizx[sp->picnum]+2);
|
|
{
|
|
vec3_t vect;
|
|
vect.x = dax + ((j*sintable[daang])>>17);
|
|
vect.y = day - ((j*sintable[(daang+512)&2047])>>17);
|
|
vect.z = sp->z;
|
|
setsprite(cursor,&vect);
|
|
}
|
|
|
|
if (ch>=33 && ch<=126 && alphabets[alphidx].pic[ch-33] >= 0)
|
|
{
|
|
int16_t sect;
|
|
|
|
// mapping char->tilenum
|
|
t = alphabets[alphidx].pic[ch-33];
|
|
j = sp->xrepeat*(hgap+tilesizx[sp->picnum]+tilesizx[t]);
|
|
|
|
dax += (j*sintable[daang])>>17;
|
|
day -= (j*sintable[(daang+512)&2047])>>17;
|
|
dax += (j*sintable[(sprite[curspr].ang+2560)&2047])>>17;
|
|
day += (j*sintable[(sprite[curspr].ang+2048)&2047])>>17;
|
|
|
|
sect = sprite[curspr].sectnum;
|
|
updatesector(dax,day,§);
|
|
if (numsprites < MAXSPRITES && sect >= 0)
|
|
{
|
|
i = insertsprite(sect,0);
|
|
Bmemcpy(&sprite[i], &sprite[linebegspr], sizeof(spritetype));
|
|
sprite[i].x = dax, sprite[i].y = day;
|
|
sprite[i].picnum = t;
|
|
sprite[i].ang = daang;
|
|
|
|
sprite[i].xoffset = -(((picanm[sprite[i].picnum])>>8)&255);
|
|
sprite[i].yoffset = -(((picanm[sprite[i].picnum])>>16)&255);
|
|
sprite[i].xoffset += alphabets[alphidx].xofs[(int32_t)ch-33];
|
|
sprite[i].yoffset += alphabets[alphidx].yofs[(int32_t)ch-33];
|
|
|
|
DoSpriteOrnament(i);
|
|
|
|
for (k=0; k<MAXTILES; k++)
|
|
localartfreq[k] = 0;
|
|
for (k=0; k<MAXSPRITES; k++)
|
|
if (sprite[k].statnum < MAXSTATUS)
|
|
localartfreq[sprite[k].picnum]++;
|
|
|
|
curspr = i;
|
|
doingspace = 0;
|
|
|
|
updatenumsprites();
|
|
asksave = 1;
|
|
|
|
if (numletters >= stackallocsize)
|
|
{
|
|
stackallocsize *= 2;
|
|
spritenums = Brealloc(spritenums, stackallocsize*sizeof(int16_t));
|
|
if (!spritenums) goto ERROR_NOMEMORY;
|
|
}
|
|
spritenums[numletters++] = i;
|
|
}
|
|
}
|
|
else if (ch == 32)
|
|
{
|
|
dax += ((sp->xrepeat*spcgap[alphidx]*sintable[daang])>>17);
|
|
day -= ((sp->xrepeat*spcgap[alphidx]*sintable[(daang+512)&2047])>>17);
|
|
doingspace = 1;
|
|
}
|
|
else if (ch == 8) // backspace
|
|
{
|
|
if (doingspace)
|
|
doingspace = 0;
|
|
else if (numletters > 0)
|
|
{
|
|
int16_t last = spritenums[numletters-1];
|
|
|
|
if (sprite[last].z != sprite[linebegspr].z) // only "delete" line break
|
|
{
|
|
sprite[linebegspr].z = sprite[last].z;
|
|
curspr = last;
|
|
}
|
|
else if (numletters > 1)
|
|
{
|
|
int16_t sectolast = spritenums[numletters-2];
|
|
|
|
if (sprite[last].z == sprite[sectolast].z)
|
|
curspr = sectolast;
|
|
else // if we delete the first letter on the line
|
|
curspr = linebegspr;
|
|
|
|
numletters--;
|
|
deletesprite(last);
|
|
|
|
updatenumsprites();
|
|
asksave = 1;
|
|
}
|
|
else
|
|
{
|
|
numletters--;
|
|
deletesprite(last);
|
|
curspr = linebegspr;
|
|
updatenumsprites();
|
|
asksave = 1;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
sprite[linebegspr].z -= ((sprite[linebegspr].yrepeat*(vgap+tilesizy[basetile]))<<2);
|
|
asksave = 1;
|
|
}
|
|
}
|
|
else if (ch == 13) // enter
|
|
{
|
|
sprite[linebegspr].z += ((sprite[linebegspr].yrepeat*(vgap+tilesizy[basetile]))<<2);
|
|
curspr = linebegspr;
|
|
doingspace = 0;
|
|
asksave = 1;
|
|
}
|
|
}
|
|
|
|
ERROR_TOOMANYSPRITES:
|
|
if (cursor < 0) message("Too many sprites in map!");
|
|
else deletesprite(cursor);
|
|
updatenumsprites();
|
|
|
|
ERROR_NOMEMORY:
|
|
if (spritenums) Bfree(spritenums);
|
|
else message("Out of memory!");
|
|
|
|
clearkeys();
|
|
|
|
lockclock = totalclock; //Reset timing
|
|
}
|
|
|
|
static void Keys3d(void)
|
|
{
|
|
int32_t i,count,nexti,changedir;
|
|
int32_t j, k, tempint = 0, hiz, loz;
|
|
int32_t hihit, lohit;
|
|
char smooshyalign=0, repeatpanalign=0, buffer[80];
|
|
int16_t startwall, endwall, dasector, statnum=0;
|
|
char tempbuf[128];
|
|
|
|
/* start Mapster32 */
|
|
|
|
/*
|
|
if (sidemode != 0)
|
|
{
|
|
setviewback();
|
|
rotatesprite(320<<15,200<<15,65536,(horiz-100)<<2,4094,0,0,2+4,0,0,0,0);
|
|
lockbyte4094 = 0;
|
|
searchx = ydim-1-searchx;
|
|
searchx ^= searchy;
|
|
searchy ^= searchx;
|
|
searchx ^= searchy;
|
|
|
|
// overwritesprite(160L,170L,1153,0,1+2,0);
|
|
rotatesprite(160<<16,170<<16,65536,(100-horiz+1024)<<3,1153,0,0,2,0,0,0,0);
|
|
|
|
}
|
|
*/
|
|
|
|
if (g_numsounds > 0 && AmbienceToggle)
|
|
{
|
|
M32_MoveFX();
|
|
S_Pan3D();
|
|
}
|
|
|
|
if (usedcount && !helpon)
|
|
{
|
|
if (searchstat!=3)
|
|
{
|
|
count=0;
|
|
for (i=0; i<numwalls; i++)
|
|
{
|
|
if (wall[i].picnum == temppicnum) count++;
|
|
if (wall[i].overpicnum == temppicnum) count++;
|
|
}
|
|
for (i=0; i<numsectors; i++)
|
|
{
|
|
if (sector[i].ceilingpicnum == temppicnum) count++;
|
|
if (sector[i].floorpicnum == temppicnum) count++;
|
|
}
|
|
}
|
|
|
|
if (searchstat==3)
|
|
{
|
|
count=0;
|
|
statnum=0;
|
|
i = headspritestat[statnum];
|
|
while (i != -1)
|
|
{
|
|
nexti = nextspritestat[i];
|
|
if (sprite[i].picnum == temppicnum) count++;
|
|
i = nexti;
|
|
}
|
|
}
|
|
|
|
drawtileinfo("Clipboard",3,124,temppicnum,tempshade,temppal,tempcstat,templotag,temphitag,tempextra);
|
|
}// end if usedcount
|
|
|
|
// if (infobox&1)
|
|
{
|
|
char lines[8][64];
|
|
int32_t dax, day, dist, height1=0,height2=0,height3=0, num=0;
|
|
int32_t x,y;
|
|
int16_t w;
|
|
|
|
if (infobox&1)
|
|
{
|
|
height2=sector[searchsector].floorz-sector[searchsector].ceilingz;
|
|
switch (searchstat)
|
|
{
|
|
case 0:
|
|
case 4:
|
|
w = (searchstat==0)?searchbottomwall:searchwall;
|
|
drawtileinfo("Current",WIND1X,WIND1Y,
|
|
searchstat==0 ? wall[w].picnum : wall[w].overpicnum,
|
|
wall[w].shade,
|
|
wall[w].pal,wall[searchwall].cstat,wall[searchwall].lotag,
|
|
wall[searchwall].hitag,wall[searchwall].extra);
|
|
|
|
dax = wall[searchwall].x-wall[wall[searchwall].point2].x;
|
|
day = wall[searchwall].y-wall[wall[searchwall].point2].y;
|
|
dist = ksqrt(dax*dax+day*day);
|
|
if (wall[searchwall].nextsector!=-1)
|
|
{
|
|
int32_t nextsect=wall[searchwall].nextsector;
|
|
height1=sector[searchsector].floorz-sector[nextsect].floorz;
|
|
height2=sector[nextsect].floorz-sector[nextsect].ceilingz;
|
|
height3=sector[nextsect].ceilingz-sector[searchsector].ceilingz;
|
|
}
|
|
Bsprintf(lines[num++],"Panning: %d, %d",wall[w].xpanning,wall[w].ypanning);
|
|
Bsprintf(lines[num++],"Repeat: %d, %d",wall[searchwall].xrepeat,wall[searchwall].yrepeat);
|
|
Bsprintf(lines[num++],"Overpic: %d",wall[searchwall].overpicnum);
|
|
lines[num++][0]=0;
|
|
if (getmessageleng)
|
|
break;
|
|
Bsprintf(lines[num++],"^251Wall %d^31",searchwall);
|
|
if (wall[searchwall].nextsector!=-1)
|
|
Bsprintf(lines[num++],"LoHeight:%d, HiHeight:%d, Length:%d",height1,height3,dist);
|
|
else
|
|
Bsprintf(lines[num++],"Height:%d, Length:%d",height2,dist);
|
|
break;
|
|
case 1:
|
|
drawtileinfo("Current",WIND1X,WIND1Y,sector[searchsector].ceilingpicnum,sector[searchsector].ceilingshade,
|
|
sector[searchsector].ceilingpal,sector[searchsector].ceilingstat,
|
|
sector[searchsector].lotag,sector[searchsector].hitag,sector[searchsector].extra);
|
|
|
|
Bsprintf(lines[num++],"Panning: %d, %d",sector[searchsector].ceilingxpanning,sector[searchsector].ceilingypanning);
|
|
Bsprintf(lines[num++],"CeilingZ: %d",sector[searchsector].ceilingz);
|
|
Bsprintf(lines[num++],"Slope: %d",sector[searchsector].ceilingheinum);
|
|
lines[num++][0]=0;
|
|
if (getmessageleng)
|
|
break;
|
|
Bsprintf(lines[num++],"^251Sector %d^31 ceiling, Lotag:%s",searchsector,ExtGetSectorCaption(searchsector));
|
|
Bsprintf(lines[num++],"Height: %d, Visibility:%d",height2,sector[searchsector].visibility);
|
|
break;
|
|
case 2:
|
|
drawtileinfo("Current",WIND1X,WIND1Y,sector[searchsector].floorpicnum,sector[searchsector].floorshade,
|
|
sector[searchsector].floorpal,sector[searchsector].floorstat,
|
|
sector[searchsector].lotag,sector[searchsector].hitag,sector[searchsector].extra);
|
|
|
|
Bsprintf(lines[num++],"Panning: %d,%d",sector[searchsector].floorxpanning,sector[searchsector].floorypanning);
|
|
Bsprintf(lines[num++],"FloorZ: %d",sector[searchsector].floorz);
|
|
Bsprintf(lines[num++],"Slope: %d",sector[searchsector].floorheinum);
|
|
lines[num++][0]=0;
|
|
if (getmessageleng)
|
|
break;
|
|
Bsprintf(lines[num++],"^251Sector %d^31 floor, Lotag:%s",searchsector,ExtGetSectorCaption(searchsector));
|
|
Bsprintf(lines[num++],"Height:%d, Visibility:%d",height2,sector[searchsector].visibility);
|
|
break;
|
|
case 3:
|
|
drawtileinfo("Current",WIND1X,WIND1Y,sprite[searchwall].picnum,sprite[searchwall].shade,
|
|
sprite[searchwall].pal,sprite[searchwall].cstat,sprite[searchwall].lotag,
|
|
sprite[searchwall].hitag,sprite[searchwall].extra);
|
|
|
|
Bsprintf(lines[num++],"Repeat: %d,%d",sprite[searchwall].xrepeat,sprite[searchwall].yrepeat);
|
|
Bsprintf(lines[num++],"PosXY: %d,%d",sprite[searchwall].x,sprite[searchwall].y);
|
|
Bsprintf(lines[num++],"PosZ: "" %d",sprite[searchwall].z);// prevents tab character
|
|
lines[num++][0]=0;
|
|
|
|
if (getmessageleng)
|
|
break;
|
|
if (strlen(names[sprite[searchwall].picnum]) > 0)
|
|
{
|
|
if (sprite[searchwall].picnum==SECTOREFFECTOR)
|
|
Bsprintf(lines[num++],"^251Sprite %d^31 %s",searchwall,SectorEffectorText(searchwall));
|
|
else Bsprintf(lines[num++],"^251Sprite %d^31 %s",searchwall,names[sprite[searchwall].picnum]);
|
|
}
|
|
else Bsprintf(lines[num++],"^251Sprite %d^31, picnum %d",searchwall,sprite[searchwall].picnum);
|
|
Bsprintf(lines[num++],"Elevation:%d",getflorzofslope(searchsector,sprite[searchwall].x,sprite[searchwall].y)-sprite[searchwall].z);
|
|
break;
|
|
}
|
|
}
|
|
x=WIND1X; y=WIND1Y;
|
|
x=(int32_t)(x*(xdimgame/320.));
|
|
y=(int32_t)(y*(ydimgame/200.));
|
|
y+=(ydimgame>>6)*8;
|
|
if (getmessageleng)
|
|
{
|
|
while (num < 4)
|
|
lines[num++][0] = 0;
|
|
Bsprintf(lines[num++],"^251%s",getmessage);
|
|
}
|
|
begindrawing();
|
|
for (i=0; i<num; i++)
|
|
{
|
|
printext256(x+2,y+2,0,-1,lines[i],xdimgame>640?0:1);
|
|
printext256(x,y,whitecol,-1,lines[i],xdimgame>640?0:1);
|
|
y+=ydimgame>>6;
|
|
}
|
|
enddrawing();
|
|
}
|
|
|
|
X_OnEvent(EVENT_PREKEYS3D, -1);
|
|
|
|
if (keystatus[KEYSC_QUOTE] && keystatus[KEYSC_V]) // ' V
|
|
{
|
|
keystatus[KEYSC_V] = 0;
|
|
switch (searchstat)
|
|
{
|
|
case 1:
|
|
case 2:
|
|
getnumberptr256("Sector visibility: ",§or[searchsector].visibility,sizeof(sector[searchsector].visibility),256L,0,NULL);
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (keystatus[KEYSC_SEMI] && keystatus[KEYSC_V]) // ; V
|
|
{
|
|
int16_t currsector;
|
|
uint8_t visval;
|
|
|
|
keystatus[KEYSC_V] = 0;
|
|
|
|
if (highlightsectorcnt == -1)
|
|
{
|
|
message("You didn't select any sectors!");
|
|
return;
|
|
}
|
|
visval = (uint8_t)getnumber256("Visibility of selected sectors: ",sector[searchsector].visibility,256L,0);
|
|
if (AskIfSure(0)) return;
|
|
|
|
for (i = 0; i < highlightsectorcnt; i++)
|
|
{
|
|
currsector = highlightsector[i];
|
|
sector[currsector].visibility = visval;
|
|
}
|
|
message("Visibility changed on all selected sectors");
|
|
}
|
|
|
|
if (keystatus[KEYSC_V]) //V
|
|
{
|
|
int32_t oldtile;
|
|
if (searchstat == 0) tempint = wall[searchbottomwall].picnum;
|
|
if (searchstat == 1) tempint = sector[searchsector].ceilingpicnum;
|
|
if (searchstat == 2) tempint = sector[searchsector].floorpicnum;
|
|
if (searchstat == 3) tempint = sprite[searchwall].picnum;
|
|
if (searchstat == 4) tempint = wall[searchwall].overpicnum;
|
|
oldtile = tempint;
|
|
tempint = m32gettile(tempint);
|
|
if (searchstat == 0) wall[searchbottomwall].picnum = tempint;
|
|
if (searchstat == 1) sector[searchsector].ceilingpicnum = tempint;
|
|
if (searchstat == 2) sector[searchsector].floorpicnum = tempint;
|
|
if (searchstat == 3) sprite[searchwall].picnum = tempint;
|
|
if (searchstat == 4)
|
|
{
|
|
wall[searchwall].overpicnum = tempint;
|
|
if (wall[searchwall].nextwall >= 0)
|
|
wall[wall[searchwall].nextwall].overpicnum = tempint;
|
|
}
|
|
if (oldtile!=tempint)asksave = 1;
|
|
keystatus[KEYSC_V] = 0;
|
|
}
|
|
|
|
if (keystatus[KEYSC_3]) /* 3 (toggle floor-over-floor (cduke3d only) */
|
|
{
|
|
floor_over_floor = !floor_over_floor;
|
|
// if (!floor_over_floor) ResetFOFSize();
|
|
message("Floor-over-floor display %s",floor_over_floor?"enabled":"disabled");
|
|
keystatus[KEYSC_3] = 0;
|
|
}
|
|
|
|
if (keystatus[KEYSC_F3])
|
|
{
|
|
mlook = !mlook;
|
|
message("Mouselook: %s",mlook?"enabled":"disabled");
|
|
keystatus[KEYSC_F3] = 0;
|
|
}
|
|
|
|
if (keystatus[KEYSC_F4])
|
|
{
|
|
AmbienceToggle = !AmbienceToggle;
|
|
message("Ambience sounds: %s",AmbienceToggle?"enabled":"disabled");
|
|
if (!AmbienceToggle)
|
|
{
|
|
FX_StopAllSounds();
|
|
S_ClearSoundLocks();
|
|
}
|
|
keystatus[KEYSC_F4] = 0;
|
|
}
|
|
|
|
// PK
|
|
if (keystatus[KEYSC_F5])
|
|
{
|
|
unrealedlook = !unrealedlook;
|
|
message("UnrealEd mouse navigation: %s",unrealedlook?"enabled":"disabled");
|
|
keystatus[KEYSC_F5] = 0;
|
|
}
|
|
|
|
if (keystatus[KEYSC_QUOTE] && keystatus[KEYSC_DELETE]) // ' del
|
|
{
|
|
keystatus[KEYSC_DELETE] = 0;
|
|
switch (searchstat)
|
|
{
|
|
case 0:
|
|
case 4:
|
|
wall[searchwall].cstat = 0;
|
|
message("Wall %d cstat = 0",searchwall);
|
|
break;
|
|
// case 1: case 2: sector[searchsector].cstat = 0; break;
|
|
case 3:
|
|
sprite[searchwall].cstat = 0;
|
|
message("Sprite %d cstat = 0",searchwall);
|
|
break;
|
|
}
|
|
}
|
|
|
|
// 'P - Will copy palette to all sectors highlighted with R-Alt key
|
|
if (keystatus[KEYSC_QUOTE] && keystatus[KEYSC_P]) // ' P
|
|
{
|
|
int16_t w, start_wall, end_wall, currsector;
|
|
int8_t pal[4];
|
|
|
|
keystatus[KEYSC_P] = 0;
|
|
|
|
if (highlightsectorcnt == -1)
|
|
{
|
|
message("You didn't select any sectors!");
|
|
return;
|
|
}
|
|
|
|
pal[0] = getnumber256("Ceiling palette: ",-1,MAXPALOOKUPS,1);
|
|
pal[1] = getnumber256("Floor palette: ",-1,MAXPALOOKUPS,1);
|
|
pal[2] = getnumber256("Wall palette: ",-1,MAXPALOOKUPS,1);
|
|
pal[3] = getnumber256("Sprite palette: ",-1,MAXPALOOKUPS,1);
|
|
if (AskIfSure(0)) return;
|
|
|
|
for (i = 0; i < highlightsectorcnt; i++)
|
|
{
|
|
currsector = highlightsector[i];
|
|
if (pal[0] > -1)
|
|
sector[currsector].ceilingpal = pal[0];
|
|
if (pal[1] > -1)
|
|
sector[currsector].floorpal = pal[1];
|
|
// Do all the walls in the sector
|
|
start_wall = sector[currsector].wallptr;
|
|
end_wall = start_wall + sector[currsector].wallnum;
|
|
|
|
if (pal[2] > -1)
|
|
for (w = start_wall; w < end_wall; w++)
|
|
{
|
|
wall[w].pal = pal[2];
|
|
}
|
|
if (pal[3] > -1)
|
|
for (k=0; k<highlightsectorcnt; k++)
|
|
{
|
|
w = headspritesect[highlightsector[k]];
|
|
while (w >= 0)
|
|
{
|
|
j = nextspritesect[w];
|
|
sprite[w].pal = pal[3];
|
|
w = j;
|
|
}
|
|
}
|
|
}
|
|
message("Palettes changed");
|
|
}
|
|
|
|
// ;P - Will copy palette to all sectors & sprites within highlighted with R-Alt key
|
|
if (keystatus[KEYSC_SEMI] && keystatus[KEYSC_P]) // ; P
|
|
{
|
|
int16_t w, start_wall, end_wall, currsector;
|
|
uint8_t pal;
|
|
|
|
keystatus[KEYSC_P] = 0;
|
|
|
|
if (highlightsectorcnt == -1)
|
|
{
|
|
message("You didn't select any sectors!");
|
|
return;
|
|
}
|
|
|
|
pal = (uint8_t)getnumber256("Global palette: ",0,MAXPALOOKUPS,0);
|
|
if (AskIfSure(0)) return;
|
|
|
|
for (i = 0; i < highlightsectorcnt; i++)
|
|
{
|
|
currsector = highlightsector[i];
|
|
sector[currsector].ceilingpal = pal;
|
|
sector[currsector].floorpal = pal;
|
|
// 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 = pal;
|
|
}
|
|
for (k=0; k<highlightsectorcnt; k++)
|
|
{
|
|
w = headspritesect[highlightsector[k]];
|
|
while (w >= 0)
|
|
{
|
|
j = nextspritesect[w];
|
|
sprite[w].pal = pal;
|
|
w = j;
|
|
}
|
|
}
|
|
}
|
|
message("Palettes changed");
|
|
}
|
|
|
|
if (keystatus[KEYSC_DELETE])
|
|
{
|
|
if (searchstat == 3)
|
|
{
|
|
deletesprite(searchwall);
|
|
updatenumsprites();
|
|
message("Sprite %d deleted",searchwall);
|
|
if (AmbienceToggle)
|
|
{
|
|
sprite[searchwall].filler &= (~1);
|
|
S_StopEnvSound(sprite[searchwall].lotag, searchwall);
|
|
}
|
|
asksave = 1;
|
|
}
|
|
keystatus[KEYSC_DELETE] = 0;
|
|
}
|
|
|
|
if (keystatus[KEYSC_F6]) //F6
|
|
{
|
|
keystatus[KEYSC_F6] = 0;
|
|
autospritehelp=!autospritehelp;
|
|
message("Automatic SECTOREFFECTOR help %s",autospritehelp?"enabled":"disabled");
|
|
}
|
|
if (keystatus[KEYSC_F7]) //F7
|
|
{
|
|
keystatus[KEYSC_F7] = 0;
|
|
autosecthelp=!autosecthelp;
|
|
message("Automatic sector tag help %s",autosecthelp?"enabled":"disabled");
|
|
}
|
|
|
|
if ((searchstat == 3) && (sprite[searchwall].picnum==SECTOREFFECTOR))
|
|
if (autospritehelp && helpon==0) Show3dText("sehelp.hlp");
|
|
|
|
if (searchstat == 1 || searchstat == 2)
|
|
if (autosecthelp && helpon==0) Show3dText("sthelp.hlp");
|
|
|
|
|
|
|
|
if (keystatus[KEYSC_COMMA]) // , Search & fix panning to the left (3D)
|
|
{
|
|
if (searchstat == 3)
|
|
{
|
|
i = searchwall;
|
|
if (eitherSHIFT)
|
|
sprite[i].ang = ((sprite[i].ang+2048-1)&2047);
|
|
else
|
|
{
|
|
sprite[i].ang = ((sprite[i].ang+2048-128)&2047);
|
|
keystatus[KEYSC_COMMA] = 0;
|
|
}
|
|
message("Sprite %d angle: %d",i,sprite[i].ang);
|
|
}
|
|
}
|
|
if (keystatus[KEYSC_PERIOD]) // . Search & fix panning to the right (3D)
|
|
{
|
|
if ((searchstat == 0) || (searchstat == 4))
|
|
{
|
|
AutoAlignWalls((int32_t)searchwall,0L);
|
|
message("Wall %d autoalign",searchwall);
|
|
keystatus[KEYSC_PERIOD] = 0;
|
|
}
|
|
if (searchstat == 3)
|
|
{
|
|
i = searchwall;
|
|
if (eitherSHIFT)
|
|
sprite[i].ang = ((sprite[i].ang+2048+1)&2047);
|
|
else
|
|
{
|
|
sprite[i].ang = ((sprite[i].ang+2048+128)&2047);
|
|
keystatus[KEYSC_PERIOD] = 0;
|
|
}
|
|
message("Sprite %d angle: %d",i,sprite[i].ang);
|
|
}
|
|
}
|
|
|
|
if (keystatus[KEYSC_QUOTE] && keystatus[KEYSC_L]) // ' L
|
|
{
|
|
i = noclip;
|
|
noclip = 1;
|
|
switch (searchstat)
|
|
{
|
|
case 1:
|
|
getnumberptr256("Sector ceilingz: ",§or[searchsector].ceilingz,sizeof(sector[searchsector].ceilingz),8388608,1,NULL);
|
|
if (!(sector[searchsector].ceilingstat&2))
|
|
{
|
|
sector[searchsector].ceilingstat |= 2;
|
|
sector[searchsector].ceilingheinum = 0;
|
|
}
|
|
getnumberptr256("Sector ceiling slope: ",§or[searchsector].ceilingheinum,sizeof(sector[searchsector].ceilingheinum),65536,1,NULL);
|
|
break;
|
|
case 2:
|
|
getnumberptr256("Sector floorz: ",§or[searchsector].floorz,sizeof(sector[searchsector].floorz),8388608,1,NULL);
|
|
if (!(sector[searchsector].floorstat&2))
|
|
{
|
|
sector[searchsector].floorheinum = 0;
|
|
sector[searchsector].floorstat |= 2;
|
|
}
|
|
getnumberptr256("Sector floor slope: ",§or[searchsector].floorheinum,sizeof(sector[searchsector].floorheinum),65536,1,NULL);
|
|
break;
|
|
case 3:
|
|
getnumberptr256("Sprite x: ",&sprite[searchwall].x,sizeof(sprite[searchwall].x),131072,1,NULL);
|
|
getnumberptr256("Sprite y: ",&sprite[searchwall].y,sizeof(sprite[searchwall].y),131072,1,NULL);
|
|
getnumberptr256("Sprite z: ",&sprite[searchwall].z,sizeof(sprite[searchwall].z),8388608,1,NULL);
|
|
getnumberptr256("Sprite angle: ",&sprite[searchwall].ang,sizeof(sprite[searchwall].ang),2048L,0,NULL);
|
|
break;
|
|
}
|
|
if (sector[searchsector].ceilingheinum == 0)
|
|
sector[searchsector].ceilingstat &= ~2;
|
|
else
|
|
sector[searchsector].ceilingstat |= 2;
|
|
|
|
if (sector[searchsector].floorheinum == 0)
|
|
sector[searchsector].floorstat &= ~2;
|
|
else
|
|
sector[searchsector].floorstat |= 2;
|
|
asksave = 1;
|
|
keystatus[KEYSC_L] = 0;
|
|
noclip = i;
|
|
}
|
|
|
|
getzrange(&pos,cursectnum,&hiz,&hihit,&loz,&lohit,128L,CLIPMASK0);
|
|
|
|
if (keystatus[KEYSC_CAPS] || (keystatus[KEYSC_QUOTE] && keystatus[KEYSC_Z]))
|
|
{
|
|
zmode++;
|
|
if (zmode == 3) zmode = 0;
|
|
else if (zmode == 1) zlock = (loz-pos.z)&0xfffffc00;
|
|
switch (zmode)
|
|
{
|
|
case 0: message("Zmode = Gravity"); break;
|
|
case 1: message("Zmode = Locked/Sector"); break;
|
|
case 2: message("Zmode = Locked/Free"); break;
|
|
}
|
|
keystatus[KEYSC_CAPS] = keystatus[KEYSC_Z] = 0;
|
|
}
|
|
|
|
if (keystatus[KEYSC_QUOTE] && keystatus[KEYSC_M]) // M
|
|
{
|
|
switch (searchstat)
|
|
{
|
|
case 0:
|
|
case 4:
|
|
strcpy(buffer,"Wall extra: ");
|
|
wall[searchwall].extra = getnumber256(buffer,(int32_t)wall[searchwall].extra,65536L,1);
|
|
break;
|
|
case 1:
|
|
case 2:
|
|
strcpy(buffer,"Sector extra: ");
|
|
sector[searchsector].extra = getnumber256(buffer,(int32_t)sector[searchsector].extra,65536L,1);
|
|
break;
|
|
case 3:
|
|
// strcpy(buffer,"Sprite extra: ");
|
|
// sprite[searchwall].extra = getnumber256(buffer,(int32_t)sprite[searchwall].extra,65536L,1);
|
|
getnumberptr256("Sprite extra: ",&sprite[searchwall].extra,sizeof(sprite[searchwall].extra),1024,1,NULL);
|
|
break;
|
|
}
|
|
asksave = 1;
|
|
keystatus[KEYSC_M] = 0;
|
|
}
|
|
|
|
if (keystatus[KEYSC_1]) // 1 (make 1-way wall)
|
|
{
|
|
if (searchstat != 3)
|
|
{
|
|
wall[searchwall].cstat ^= 32;
|
|
Bsprintf(getmessage,"Wall %d one side masking bit %s",searchwall,wall[searchwall].cstat&32?"ON":"OFF");
|
|
message(getmessage);
|
|
asksave = 1;
|
|
}
|
|
else
|
|
{
|
|
sprite[searchwall].cstat ^= 64;
|
|
i = sprite[searchwall].cstat;
|
|
if ((i&48) == 32)
|
|
{
|
|
sprite[searchwall].cstat &= ~8;
|
|
if ((i&64) > 0)
|
|
if (pos.z > sprite[searchwall].z)
|
|
sprite[searchwall].cstat |= 8;
|
|
}
|
|
asksave = 1;
|
|
Bsprintf(getmessage,"Sprite %d one sided bit %s",searchwall,sprite[searchwall].cstat&64?"ON":"OFF");
|
|
message(getmessage);
|
|
|
|
}
|
|
keystatus[KEYSC_1] = 0;
|
|
}
|
|
if (keystatus[KEYSC_2]) // 2 (bottom wall swapping)
|
|
{
|
|
if (searchstat != 3)
|
|
{
|
|
wall[searchwall].cstat ^= 2;
|
|
Bsprintf(getmessage,"Wall %d bottom texture swap bit %s",searchwall,wall[searchwall].cstat&2?"ON":"OFF");
|
|
message(getmessage);
|
|
asksave = 1;
|
|
}
|
|
keystatus[KEYSC_2] = 0;
|
|
}
|
|
if (keystatus[KEYSC_O]) // O (top/bottom orientation - for doors)
|
|
{
|
|
if ((searchstat == 0) || (searchstat == 4))
|
|
{
|
|
int16_t w = (searchstat==0)?searchbottomwall:searchwall;
|
|
wall[w].cstat ^= 4;
|
|
Bsprintf(getmessage,"Wall %d %s orientation",w,wall[w].cstat&4?"bottom":"top");
|
|
message(getmessage);
|
|
asksave = 1;
|
|
}
|
|
if (searchstat == 3) // O (ornament onto wall) (2D)
|
|
{
|
|
asksave = 1;
|
|
i = searchwall;
|
|
|
|
DoSpriteOrnament(i);
|
|
Bsprintf(getmessage,"Sprite %d ornament onto wall",i);
|
|
message(getmessage);
|
|
}
|
|
keystatus[KEYSC_O] = 0;
|
|
}
|
|
if (keystatus[KEYSC_M]) // M (masking walls)
|
|
{
|
|
if (searchstat != 3)
|
|
{
|
|
i = wall[searchwall].nextwall;
|
|
tempint = eitherSHIFT;
|
|
if (i >= 0)
|
|
{
|
|
wall[searchwall].cstat ^= 16;
|
|
Bsprintf(getmessage,"Wall %d masking bit %s",searchwall,wall[searchwall].cstat&16?"ON":"OFF");
|
|
message(getmessage);
|
|
if ((wall[searchwall].cstat&16) > 0)
|
|
{
|
|
wall[searchwall].cstat &= ~8;
|
|
if (tempint == 0)
|
|
{
|
|
wall[i].cstat |= 8; //auto other-side flip
|
|
wall[i].cstat |= 16;
|
|
wall[i].overpicnum = wall[searchwall].overpicnum;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
wall[searchwall].cstat &= ~8;
|
|
if (tempint == 0)
|
|
{
|
|
wall[i].cstat &= ~8; //auto other-side unflip
|
|
wall[i].cstat &= ~16;
|
|
}
|
|
}
|
|
wall[searchwall].cstat &= ~32;
|
|
if (tempint == 0) wall[i].cstat &= ~32;
|
|
asksave = 1;
|
|
}
|
|
}
|
|
keystatus[KEYSC_M] = 0;
|
|
}
|
|
|
|
if (keystatus[KEYSC_H]) // H (hitscan sensitivity)
|
|
{
|
|
if ((keystatus[KEYSC_QUOTE]))
|
|
{
|
|
switch (searchstat)
|
|
{
|
|
case 0:
|
|
case 4:
|
|
strcpy(buffer,"Wall hitag: ");
|
|
wall[searchwall].hitag = getnumber256(buffer,(int32_t)wall[searchwall].hitag,65536L,0);
|
|
break;
|
|
case 1:
|
|
strcpy(buffer,"Sector hitag: ");
|
|
sector[searchsector].hitag = getnumber256(buffer,(int32_t)sector[searchsector].hitag,65536L,0);
|
|
break;
|
|
case 2:
|
|
strcpy(buffer,"Sector hitag: ");
|
|
sector[searchsector].hitag = getnumber256(buffer,(int32_t)sector[searchsector].hitag,65536L,0);
|
|
break;
|
|
case 3:
|
|
strcpy(buffer,"Sprite hitag: ");
|
|
// sprite[searchwall].hitag = getnumber256(buffer,(int32_t)sprite[searchwall].hitag,65536L,0);
|
|
getnumberptr256(buffer,&sprite[searchwall].hitag,sizeof(sprite[searchwall].hitag),INT16_MAX,1,NULL);
|
|
break;
|
|
}
|
|
}
|
|
|
|
else
|
|
{
|
|
|
|
if (searchstat == 3)
|
|
{
|
|
sprite[searchwall].cstat ^= 256;
|
|
Bsprintf(getmessage,"Sprite %d hitscan sensitivity bit %s",searchwall,sprite[searchwall].cstat&256?"ON":"OFF");
|
|
message(getmessage);
|
|
asksave = 1;
|
|
}
|
|
else
|
|
{
|
|
wall[searchwall].cstat ^= 64;
|
|
|
|
if ((wall[searchwall].nextwall >= 0) && (eitherSHIFT == 0))
|
|
{
|
|
wall[wall[searchwall].nextwall].cstat &= ~64;
|
|
wall[wall[searchwall].nextwall].cstat |= (wall[searchwall].cstat&64);
|
|
}
|
|
Bsprintf(getmessage,"Wall %d hitscan sensitivity bit %s",searchwall,wall[searchwall].cstat&64?"ON":"OFF");
|
|
message(getmessage);
|
|
|
|
asksave = 1;
|
|
}
|
|
}
|
|
keystatus[KEYSC_H] = 0;
|
|
}
|
|
|
|
smooshyalign = keystatus[KEYSC_gKP5];
|
|
repeatpanalign = (eitherSHIFT || (bstatus&2));
|
|
|
|
if (mlook == 2)
|
|
mlook = 0;
|
|
|
|
if (!unrealedlook && (bstatus&4)) mlook = 2;
|
|
|
|
// if (bstatus&4)
|
|
if ((bstatus&(16|32) && !(bstatus&(1|2|4))) || keystatus[KEYSC_gMINUS] || keystatus[KEYSC_gPLUS]) // PK: no btn: wheel changes shade
|
|
{
|
|
// if (bstatus&1)
|
|
// {
|
|
// mlook = 2;
|
|
// }
|
|
if (bstatus&32 || keystatus[KEYSC_gMINUS]) // -
|
|
{
|
|
keystatus[KEYSC_gMINUS]=0;
|
|
mouseb &= ~32;
|
|
bstatus &= ~32;
|
|
if (eitherALT) //ALT
|
|
{
|
|
if (eitherCTRL) //CTRL
|
|
{
|
|
if (visibility < 16384) visibility += visibility;
|
|
Bsprintf(getmessage,"Global visibility %d",visibility);
|
|
message(getmessage);
|
|
}
|
|
else
|
|
{
|
|
k=eitherSHIFT?1:16;
|
|
|
|
if (highlightsectorcnt >= 0)
|
|
for (i=0; i<highlightsectorcnt; i++)
|
|
if (highlightsector[i] == searchsector)
|
|
{
|
|
while (k > 0)
|
|
{
|
|
for (i=0; i<highlightsectorcnt; i++)
|
|
{
|
|
sector[highlightsector[i]].visibility++;
|
|
if (sector[highlightsector[i]].visibility == 240)
|
|
sector[highlightsector[i]].visibility = 239;
|
|
}
|
|
k--;
|
|
}
|
|
break;
|
|
}
|
|
while (k > 0)
|
|
{
|
|
sector[searchsector].visibility++;
|
|
if (sector[searchsector].visibility == 240)
|
|
sector[searchsector].visibility = 239;
|
|
k--;
|
|
}
|
|
Bsprintf(getmessage,"Sector %d visibility %d",searchsector,sector[searchsector].visibility);
|
|
message(getmessage);
|
|
asksave = 1;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
k = 0;
|
|
if (highlightsectorcnt >= 0)
|
|
{
|
|
for (i=0; i<highlightsectorcnt; i++)
|
|
if (highlightsector[i] == searchsector)
|
|
{
|
|
k = 1;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (k == 0)
|
|
{
|
|
int32_t shade=-1, i=-1;
|
|
if (searchstat == 0) shade=++wall[i=searchbottomwall].shade;
|
|
if (searchstat == 1) shade=++sector[i=searchsector].ceilingshade;
|
|
if (searchstat == 2) shade=++sector[i=searchsector].floorshade;
|
|
if (searchstat == 3) shade=++sprite[i=searchwall].shade;
|
|
if (searchstat == 4) shade=++wall[i=searchwall].shade;
|
|
if (i!=-1)
|
|
{
|
|
Bsprintf(getmessage,"%s %d shade %d",type2str[searchstat],i,shade);
|
|
message(getmessage);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for (i=0; i<highlightsectorcnt; i++)
|
|
{
|
|
dasector = highlightsector[i];
|
|
|
|
sector[dasector].ceilingshade++; //sector shade
|
|
sector[dasector].floorshade++;
|
|
|
|
startwall = sector[dasector].wallptr; //wall shade
|
|
endwall = startwall + sector[dasector].wallnum - 1;
|
|
for (j=startwall; j<=endwall; j++)
|
|
wall[j].shade++;
|
|
|
|
j = headspritesect[dasector]; //sprite shade
|
|
while (j != -1)
|
|
{
|
|
sprite[j].shade++;
|
|
j = nextspritesect[j];
|
|
}
|
|
}
|
|
}
|
|
asksave = 1;
|
|
}
|
|
}
|
|
if (bstatus&16 || keystatus[KEYSC_gPLUS]) // +
|
|
{
|
|
keystatus[KEYSC_gPLUS]=0;
|
|
mouseb &= ~16;
|
|
bstatus &= ~16;
|
|
if (eitherALT) //ALT
|
|
{
|
|
if (eitherCTRL) //CTRL
|
|
{
|
|
if (visibility > 32) visibility >>= 1;
|
|
Bsprintf(getmessage,"Global visibility %d",visibility);
|
|
message(getmessage);
|
|
}
|
|
else
|
|
{
|
|
k=eitherSHIFT?1:16;
|
|
|
|
if (highlightsectorcnt >= 0)
|
|
for (i=0; i<highlightsectorcnt; i++)
|
|
if (highlightsector[i] == searchsector)
|
|
{
|
|
while (k > 0)
|
|
{
|
|
for (i=0; i<highlightsectorcnt; i++)
|
|
{
|
|
sector[highlightsector[i]].visibility--;
|
|
if (sector[highlightsector[i]].visibility == 239)
|
|
sector[highlightsector[i]].visibility = 240;
|
|
}
|
|
k--;
|
|
}
|
|
break;
|
|
}
|
|
while (k > 0)
|
|
{
|
|
sector[searchsector].visibility--;
|
|
if (sector[searchsector].visibility == 239)
|
|
sector[searchsector].visibility = 240;
|
|
k--;
|
|
}
|
|
Bsprintf(getmessage,"Sector %d visibility %d",searchsector,sector[searchsector].visibility);
|
|
message(getmessage);
|
|
asksave = 1;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
k = 0;
|
|
if (highlightsectorcnt >= 0)
|
|
{
|
|
for (i=0; i<highlightsectorcnt; i++)
|
|
if (highlightsector[i] == searchsector)
|
|
{
|
|
k = 1;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (k == 0)
|
|
{
|
|
int32_t shade=-1, i=-1;
|
|
if (searchstat == 0) shade=--wall[i=searchbottomwall].shade;
|
|
if (searchstat == 1) shade=--sector[i=searchsector].ceilingshade;
|
|
if (searchstat == 2) shade=--sector[i=searchsector].floorshade;
|
|
if (searchstat == 3) shade=--sprite[i=searchwall].shade;
|
|
if (searchstat == 4) shade=--wall[i=searchwall].shade;
|
|
if (i!=-1)
|
|
{
|
|
Bsprintf(getmessage,"%s %d shade %d",type2str[searchstat],i,shade);
|
|
message(getmessage);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for (i=0; i<highlightsectorcnt; i++)
|
|
{
|
|
dasector = highlightsector[i];
|
|
|
|
sector[dasector].ceilingshade--; //sector shade
|
|
sector[dasector].floorshade--;
|
|
|
|
startwall = sector[dasector].wallptr; //wall shade
|
|
endwall = startwall + sector[dasector].wallnum - 1;
|
|
for (j=startwall; j<=endwall; j++)
|
|
wall[j].shade--;
|
|
|
|
j = headspritesect[dasector]; //sprite shade
|
|
while (j != -1)
|
|
{
|
|
sprite[j].shade--;
|
|
j = nextspritesect[j];
|
|
}
|
|
}
|
|
}
|
|
asksave = 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
// if ((keystatus[KEYSC_DASH]|keystatus[KEYSC_EQUAL]|((bstatus&(16|32)) && !(bstatus&2))) > 0) // mousewheel, -, and +, cycle picnum
|
|
if (keystatus[KEYSC_DASH] | keystatus[KEYSC_EQUAL] | (bstatus&(16|32) && (bstatus&1) && !(bstatus&2))) // PK: lmb only & mousewheel, -, and +, cycle picnum
|
|
|
|
{
|
|
j = i = (keystatus[KEYSC_EQUAL] || (bstatus&16))?1:-1;
|
|
switch (searchstat)
|
|
{
|
|
case 0:
|
|
while (!tilesizx[wall[searchwall].picnum]||!tilesizy[wall[searchwall].picnum]||j)
|
|
{
|
|
if (wall[searchwall].picnum+i >= MAXTILES) wall[searchwall].picnum = 0;
|
|
else if (wall[searchwall].picnum+i < 0) wall[searchwall].picnum = MAXTILES-1;
|
|
else wall[searchwall].picnum += i;
|
|
j = 0;
|
|
}
|
|
break;
|
|
case 1:
|
|
while (!tilesizx[sector[searchsector].ceilingpicnum]||!tilesizy[sector[searchsector].ceilingpicnum]||j)
|
|
{
|
|
if (sector[searchsector].ceilingpicnum+i >= MAXTILES) sector[searchsector].ceilingpicnum = 0;
|
|
else if (sector[searchsector].ceilingpicnum+i < 0) sector[searchsector].ceilingpicnum = MAXTILES-1;
|
|
else sector[searchsector].ceilingpicnum += i;
|
|
j = 0;
|
|
}
|
|
break;
|
|
case 2:
|
|
while (!tilesizx[sector[searchsector].floorpicnum]||!tilesizy[sector[searchsector].floorpicnum]||j)
|
|
{
|
|
if (sector[searchsector].floorpicnum+i >= MAXTILES) sector[searchsector].floorpicnum = 0;
|
|
else if (sector[searchsector].floorpicnum+i < 0) sector[searchsector].floorpicnum = MAXTILES-1;
|
|
else sector[searchsector].floorpicnum += i;
|
|
j = 0;
|
|
}
|
|
break;
|
|
case 3:
|
|
while (!tilesizx[sprite[searchwall].picnum]||!tilesizy[sprite[searchwall].picnum]||j)
|
|
{
|
|
if (sprite[searchwall].picnum+i >= MAXTILES) sprite[searchwall].picnum = 0;
|
|
else if (sprite[searchwall].picnum+i < 0) sprite[searchwall].picnum = MAXTILES-1;
|
|
else sprite[searchwall].picnum += i;
|
|
j = 0;
|
|
}
|
|
break;
|
|
case 4:
|
|
while (!tilesizx[wall[searchwall].overpicnum]||!tilesizy[wall[searchwall].overpicnum]||j)
|
|
{
|
|
if (wall[searchwall].overpicnum+i >= MAXTILES) wall[searchwall].overpicnum = 0;
|
|
else if (wall[searchwall].overpicnum+i < 0) wall[searchwall].overpicnum = MAXTILES-1;
|
|
else wall[searchwall].overpicnum += i;
|
|
j = 0;
|
|
}
|
|
break;
|
|
}
|
|
asksave = 1;
|
|
keystatus[KEYSC_DASH] = keystatus[KEYSC_EQUAL] = 0;
|
|
mouseb &= ~(16|32);
|
|
}
|
|
|
|
if (keystatus[KEYSC_E]) // E (expand)
|
|
{
|
|
if (searchstat == 1)
|
|
{
|
|
sector[searchsector].ceilingstat ^= 8;
|
|
Bsprintf(getmessage,"Sector %d ceiling texture expansion bit %s",searchsector,sector[searchsector].ceilingstat&8?"ON":"OFF");
|
|
message(getmessage);
|
|
asksave = 1;
|
|
}
|
|
if (searchstat == 2)
|
|
{
|
|
sector[searchsector].floorstat ^= 8;
|
|
Bsprintf(getmessage,"Sector %d floor texture expansion bit %s",searchsector,sector[searchsector].floorstat&8?"ON":"OFF");
|
|
message(getmessage);
|
|
asksave = 1;
|
|
}
|
|
keystatus[KEYSC_E] = 0;
|
|
}
|
|
if (keystatus[KEYSC_R]) // R (relative alignment, rotation)
|
|
{
|
|
|
|
if (keystatus[KEYSC_QUOTE]) // FRAMERATE TOGGLE
|
|
{
|
|
|
|
framerateon = !framerateon;
|
|
if (framerateon) message("Show framerate ON");
|
|
else message("Show framerate OFF");
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
if (searchstat == 1)
|
|
{
|
|
sector[searchsector].ceilingstat ^= 64;
|
|
Bsprintf(getmessage,"Sector %d ceiling texture relativity bit %s",searchsector,sector[searchsector].ceilingstat&64?"ON":"OFF");
|
|
message(getmessage);
|
|
asksave = 1;
|
|
}
|
|
if (searchstat == 2)
|
|
{
|
|
sector[searchsector].floorstat ^= 64;
|
|
Bsprintf(getmessage,"Sector %d floor texture relativity bit %s",searchsector,sector[searchsector].floorstat&64?"ON":"OFF"); //PK (was ceiling in string)
|
|
message(getmessage);
|
|
asksave = 1;
|
|
}
|
|
if (searchstat == 3)
|
|
{
|
|
i = sprite[searchwall].cstat;
|
|
if ((i&48) < 32) i += 16;
|
|
|
|
else i &= ~48;
|
|
sprite[searchwall].cstat = i;
|
|
|
|
if (sprite[searchwall].cstat&16)
|
|
Bsprintf(getmessage,"Sprite %d now wall aligned",searchwall);
|
|
else if (sprite[searchwall].cstat&32)
|
|
Bsprintf(getmessage,"Sprite %d now floor aligned",searchwall);
|
|
else
|
|
Bsprintf(getmessage,"Sprite %d now view aligned",searchwall);
|
|
message(getmessage);
|
|
asksave = 1;
|
|
}
|
|
}
|
|
keystatus[KEYSC_R] = 0;
|
|
}
|
|
if (keystatus[KEYSC_F]) //F (Flip)
|
|
{
|
|
keystatus[KEYSC_F] = 0;
|
|
if (eitherALT) //ALT-F (relative alignmment flip)
|
|
{
|
|
if (searchstat != 3)
|
|
{
|
|
setfirstwall(searchsector,searchwall);
|
|
Bsprintf(getmessage,"Sector %d first wall",searchsector);
|
|
message(getmessage);
|
|
asksave = 1;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ((searchstat == 0) || (searchstat == 4))
|
|
{
|
|
i = wall[searchbottomwall].cstat;
|
|
i = ((i>>3)&1)+((i>>7)&2); //3-x,8-y
|
|
switch (i)
|
|
{
|
|
case 0:
|
|
i = 1;
|
|
break;
|
|
case 1:
|
|
i = 3;
|
|
break;
|
|
case 2:
|
|
i = 0;
|
|
break;
|
|
case 3:
|
|
i = 2;
|
|
break;
|
|
}
|
|
Bsprintf(getmessage,"Wall %d flip %d",searchwall,i);
|
|
message(getmessage);
|
|
i = ((i&1)<<3)+((i&2)<<7);
|
|
wall[searchbottomwall].cstat &= ~0x0108;
|
|
wall[searchbottomwall].cstat |= i;
|
|
asksave = 1;
|
|
}
|
|
if (searchstat == 1) //8-way ceiling flipping (bits 2,4,5)
|
|
{
|
|
i = sector[searchsector].ceilingstat;
|
|
i = (i&0x4)+((i>>4)&3);
|
|
switch (i)
|
|
{
|
|
case 0:
|
|
i = 6;
|
|
break;
|
|
case 6:
|
|
i = 3;
|
|
break;
|
|
case 3:
|
|
i = 5;
|
|
break;
|
|
case 5:
|
|
i = 1;
|
|
break;
|
|
case 1:
|
|
i = 7;
|
|
break;
|
|
case 7:
|
|
i = 2;
|
|
break;
|
|
case 2:
|
|
i = 4;
|
|
break;
|
|
case 4:
|
|
i = 0;
|
|
break;
|
|
}
|
|
Bsprintf(getmessage,"Sector %d flip %d",searchsector,i);
|
|
message(getmessage);
|
|
i = (i&0x4)+((i&3)<<4);
|
|
sector[searchsector].ceilingstat &= ~0x34;
|
|
sector[searchsector].ceilingstat |= i;
|
|
asksave = 1;
|
|
}
|
|
if (searchstat == 2) //8-way floor flipping (bits 2,4,5)
|
|
{
|
|
i = sector[searchsector].floorstat;
|
|
i = (i&0x4)+((i>>4)&3);
|
|
switch (i)
|
|
{
|
|
case 0:
|
|
i = 6;
|
|
break;
|
|
case 6:
|
|
i = 3;
|
|
break;
|
|
case 3:
|
|
i = 5;
|
|
break;
|
|
case 5:
|
|
i = 1;
|
|
break;
|
|
case 1:
|
|
i = 7;
|
|
break;
|
|
case 7:
|
|
i = 2;
|
|
break;
|
|
case 2:
|
|
i = 4;
|
|
break;
|
|
case 4:
|
|
i = 0;
|
|
break;
|
|
}
|
|
Bsprintf(getmessage,"Sector %d flip %d",searchsector,i);
|
|
message(getmessage);
|
|
i = (i&0x4)+((i&3)<<4);
|
|
sector[searchsector].floorstat &= ~0x34;
|
|
sector[searchsector].floorstat |= i;
|
|
asksave = 1;
|
|
}
|
|
if (searchstat == 3)
|
|
{
|
|
i = sprite[searchwall].cstat;
|
|
if (((i&48) == 32) && ((i&64) == 0))
|
|
{
|
|
sprite[searchwall].cstat &= ~0xc;
|
|
sprite[searchwall].cstat |= ((i&4)^4);
|
|
Bsprintf(getmessage,"Sprite %d flip bit %s",searchwall,sprite[searchwall].cstat&4?"ON":"OFF");
|
|
message(getmessage);
|
|
}
|
|
else
|
|
{
|
|
i = ((i>>2)&3);
|
|
switch (i)
|
|
{
|
|
case 0:
|
|
i = 1;
|
|
break;
|
|
case 1:
|
|
i = 3;
|
|
break;
|
|
case 2:
|
|
i = 0;
|
|
break;
|
|
case 3:
|
|
i = 2;
|
|
break;
|
|
}
|
|
Bsprintf(getmessage,"Sprite %d flip %d",searchwall,i);
|
|
message(getmessage);
|
|
i <<= 2;
|
|
sprite[searchwall].cstat &= ~0xc;
|
|
sprite[searchwall].cstat |= i;
|
|
}
|
|
asksave = 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (keystatus[KEYSC_HOME])
|
|
updownunits = 256;
|
|
else if (keystatus[KEYSC_END])
|
|
updownunits = 512;
|
|
else
|
|
updownunits = 1024;
|
|
mouseaction=0;
|
|
if (eitherALT && bstatus&1)
|
|
{
|
|
mousex=0; mskip=1;
|
|
if (mousey<0)
|
|
{
|
|
updownunits=klabs(mousey*128);
|
|
mouseaction=1;
|
|
}
|
|
}
|
|
if (keystatus[KEYSC_PGUP] || mouseaction || ((bstatus&2) && (bstatus&16 && !(bstatus&1)))) // PK: PGUP, rmb only & mwheel
|
|
{
|
|
k = 0;
|
|
if (highlightsectorcnt >= 0)
|
|
{
|
|
for (i=0; i<highlightsectorcnt; i++)
|
|
if (highlightsector[i] == searchsector)
|
|
{
|
|
k = 1;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if ((searchstat == 0) || (searchstat == 1))
|
|
{
|
|
if (k == 0)
|
|
{
|
|
i = headspritesect[searchsector];
|
|
while (i != -1)
|
|
{
|
|
tempint = getceilzofslope(searchsector,sprite[i].x,sprite[i].y);
|
|
tempint += ((tilesizy[sprite[i].picnum]*sprite[i].yrepeat)<<2);
|
|
if (sprite[i].cstat&128) tempint += ((tilesizy[sprite[i].picnum]*sprite[i].yrepeat)<<1);
|
|
if (sprite[i].z == tempint)
|
|
sprite[i].z -= updownunits << (eitherCTRL<<1); // JBF 20031128
|
|
i = nextspritesect[i];
|
|
}
|
|
sector[searchsector].ceilingz -= updownunits << (eitherCTRL<<1); // JBF 20031128
|
|
Bsprintf(getmessage,"Sector %d ceilingz = %d",searchsector,sector[searchsector].ceilingz);
|
|
message(getmessage);
|
|
|
|
}
|
|
else
|
|
{
|
|
for (j=0; j<highlightsectorcnt; j++)
|
|
{
|
|
i = headspritesect[highlightsector[j]];
|
|
while (i != -1)
|
|
{
|
|
tempint = getceilzofslope(highlightsector[j],sprite[i].x,sprite[i].y);
|
|
tempint += ((tilesizy[sprite[i].picnum]*sprite[i].yrepeat)<<2);
|
|
if (sprite[i].cstat&128) tempint += ((tilesizy[sprite[i].picnum]*sprite[i].yrepeat)<<1);
|
|
if (sprite[i].z == tempint)
|
|
sprite[i].z -= updownunits << (eitherCTRL<<1); // JBF 20031128
|
|
i = nextspritesect[i];
|
|
}
|
|
sector[highlightsector[j]].ceilingz -= updownunits << (eitherCTRL<<1); // JBF 20031128
|
|
Bsprintf(getmessage,"Sector %d ceilingz = %d",*highlightsector,sector[highlightsector[j]].ceilingz);
|
|
message(getmessage);
|
|
|
|
}
|
|
}
|
|
}
|
|
if (searchstat == 2)
|
|
{
|
|
if (k == 0)
|
|
{
|
|
i = headspritesect[searchsector];
|
|
while (i != -1)
|
|
{
|
|
tempint = getflorzofslope(searchsector,sprite[i].x,sprite[i].y);
|
|
if (sprite[i].cstat&128) tempint += ((tilesizy[sprite[i].picnum]*sprite[i].yrepeat)<<1);
|
|
if (sprite[i].z == tempint)
|
|
sprite[i].z -= updownunits << (eitherCTRL<<1); // JBF 20031128
|
|
i = nextspritesect[i];
|
|
}
|
|
sector[searchsector].floorz -= updownunits << (eitherCTRL<<1); // JBF 20031128
|
|
Bsprintf(getmessage,"Sector %d floorz = %d",searchsector,sector[searchsector].floorz);
|
|
message(getmessage);
|
|
|
|
}
|
|
else
|
|
{
|
|
for (j=0; j<highlightsectorcnt; j++)
|
|
{
|
|
i = headspritesect[highlightsector[j]];
|
|
while (i != -1)
|
|
{
|
|
tempint = getflorzofslope(highlightsector[j],sprite[i].x,sprite[i].y);
|
|
if (sprite[i].cstat&128) tempint += ((tilesizy[sprite[i].picnum]*sprite[i].yrepeat)<<1);
|
|
if (sprite[i].z == tempint)
|
|
sprite[i].z -= updownunits << (eitherCTRL<<1); // JBF 20031128
|
|
i = nextspritesect[i];
|
|
}
|
|
sector[highlightsector[j]].floorz -= updownunits << (eitherCTRL<<1); // JBF 20031128
|
|
Bsprintf(getmessage,"Sector %d floorz = %d",*highlightsector,sector[highlightsector[j]].floorz);
|
|
message(getmessage);
|
|
|
|
}
|
|
}
|
|
|
|
}
|
|
if (sector[searchsector].floorz < sector[searchsector].ceilingz)
|
|
sector[searchsector].floorz = sector[searchsector].ceilingz;
|
|
if (searchstat == 3)
|
|
{
|
|
if (eitherCTRL && !eitherALT) //CTRL - put sprite on ceiling
|
|
{
|
|
sprite[searchwall].z = spriteonceilingz(searchwall);
|
|
}
|
|
else
|
|
{
|
|
k = 0;
|
|
if (highlightcnt >= 0)
|
|
for (i=0; i<highlightcnt; i++)
|
|
if (highlight[i] == searchwall+16384)
|
|
{
|
|
k = 1;
|
|
break;
|
|
}
|
|
|
|
if (k == 0)
|
|
{
|
|
sprite[searchwall].z -= updownunits << ((eitherCTRL && mouseaction)*3);
|
|
if (!spnoclip)sprite[searchwall].z = max(sprite[searchwall].z,spriteonceilingz(searchwall));
|
|
Bsprintf(getmessage,"Sprite %d z = %d",searchwall,sprite[searchwall].z);
|
|
message(getmessage);
|
|
|
|
}
|
|
else
|
|
{
|
|
for (i=0; i<highlightcnt; i++)
|
|
if ((highlight[i]&0xc000) == 16384)
|
|
{
|
|
sprite[highlight[i]&16383].z -= updownunits;
|
|
if (!spnoclip)sprite[highlight[i]&16383].z = max(sprite[highlight[i]&16383].z,spriteonceilingz(highlight[i]&16383));
|
|
}
|
|
Bsprintf(getmessage,"Sprite %d z = %d",highlight[i]&16383,sprite[highlight[i]&16383].z);
|
|
message(getmessage);
|
|
|
|
}
|
|
}
|
|
}
|
|
asksave = 1;
|
|
keystatus[KEYSC_PGUP] = 0;
|
|
mouseb &= ~16;
|
|
}
|
|
|
|
mouseaction=0;
|
|
if (eitherALT && bstatus&1)
|
|
{
|
|
mousex=0; mskip=1;
|
|
if (mousey>0)
|
|
{
|
|
updownunits=klabs(mousey*128);
|
|
mouseaction=1;
|
|
}
|
|
}
|
|
if (keystatus[KEYSC_PGDN] || mouseaction || ((bstatus&2) && (bstatus&32) && !(bstatus&1))) // PK: PGDN, rmb only & mwheel
|
|
{
|
|
k = 0;
|
|
if (highlightsectorcnt >= 0)
|
|
{
|
|
for (i=0; i<highlightsectorcnt; i++)
|
|
if (highlightsector[i] == searchsector)
|
|
{
|
|
k = 1;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if ((searchstat == 0) || (searchstat == 1))
|
|
{
|
|
if (k == 0)
|
|
{
|
|
i = headspritesect[searchsector];
|
|
while (i != -1)
|
|
{
|
|
tempint = getceilzofslope(searchsector,sprite[i].x,sprite[i].y);
|
|
if (sprite[i].cstat&128) tempint += ((tilesizy[sprite[i].picnum]*sprite[i].yrepeat)<<1);
|
|
tempint += ((tilesizy[sprite[i].picnum]*sprite[i].yrepeat)<<2);
|
|
if (sprite[i].z == tempint)
|
|
sprite[i].z += updownunits << (eitherCTRL<<1); // JBF 20031128
|
|
i = nextspritesect[i];
|
|
}
|
|
sector[searchsector].ceilingz += updownunits << (eitherCTRL<<1); // JBF 20031128
|
|
Bsprintf(getmessage,"Sector %d ceilingz = %d",searchsector,sector[searchsector].ceilingz);
|
|
message(getmessage);
|
|
|
|
}
|
|
else
|
|
{
|
|
for (j=0; j<highlightsectorcnt; j++)
|
|
{
|
|
i = headspritesect[highlightsector[j]];
|
|
while (i != -1)
|
|
{
|
|
tempint = getceilzofslope(highlightsector[j],sprite[i].x,sprite[i].y);
|
|
if (sprite[i].cstat&128) tempint += ((tilesizy[sprite[i].picnum]*sprite[i].yrepeat)<<1);
|
|
tempint += ((tilesizy[sprite[i].picnum]*sprite[i].yrepeat)<<2);
|
|
if (sprite[i].z == tempint)
|
|
sprite[i].z += updownunits << (eitherCTRL<<1); // JBF 20031128
|
|
i = nextspritesect[i];
|
|
}
|
|
sector[highlightsector[j]].ceilingz += updownunits << (eitherCTRL<<1); // JBF 20031128
|
|
Bsprintf(getmessage,"Sector %d ceilingz = %d",*highlightsector,sector[highlightsector[j]].ceilingz);
|
|
message(getmessage);
|
|
|
|
}
|
|
}
|
|
}
|
|
if (searchstat == 2)
|
|
{
|
|
if (k == 0)
|
|
{
|
|
i = headspritesect[searchsector];
|
|
while (i != -1)
|
|
{
|
|
tempint = getflorzofslope(searchsector,sprite[i].x,sprite[i].y);
|
|
if (sprite[i].cstat&128) tempint += ((tilesizy[sprite[i].picnum]*sprite[i].yrepeat)<<1);
|
|
if (sprite[i].z == tempint)
|
|
sprite[i].z += updownunits << (eitherCTRL<<1); // JBF 20031128
|
|
i = nextspritesect[i];
|
|
}
|
|
sector[searchsector].floorz += updownunits << (eitherCTRL<<1); // JBF 20031128
|
|
Bsprintf(getmessage,"Sector %d floorz = %d",searchsector,sector[searchsector].floorz);
|
|
message(getmessage);
|
|
|
|
}
|
|
else
|
|
{
|
|
for (j=0; j<highlightsectorcnt; j++)
|
|
{
|
|
i = headspritesect[highlightsector[j]];
|
|
while (i != -1)
|
|
{
|
|
tempint = getflorzofslope(highlightsector[j],sprite[i].x,sprite[i].y);
|
|
if (sprite[i].cstat&128) tempint += ((tilesizy[sprite[i].picnum]*sprite[i].yrepeat)<<1);
|
|
if (sprite[i].z == tempint)
|
|
sprite[i].z += updownunits << (eitherCTRL<<1); // JBF 20031128
|
|
i = nextspritesect[i];
|
|
}
|
|
sector[highlightsector[j]].floorz += updownunits << (eitherCTRL<<1); // JBF 20031128
|
|
Bsprintf(getmessage,"Sector %d floorz = %d",*highlightsector,sector[highlightsector[j]].floorz);
|
|
message(getmessage);
|
|
|
|
}
|
|
}
|
|
}
|
|
if (sector[searchsector].ceilingz > sector[searchsector].floorz)
|
|
sector[searchsector].ceilingz = sector[searchsector].floorz;
|
|
if (searchstat == 3)
|
|
{
|
|
if (eitherCTRL && !eitherALT) //CTRL - put sprite on ground
|
|
{
|
|
sprite[searchwall].z = spriteongroundz(searchwall);
|
|
}
|
|
else
|
|
{
|
|
k = 0;
|
|
if (highlightcnt >= 0)
|
|
for (i=0; i<highlightcnt; i++)
|
|
if (highlight[i] == searchwall+16384)
|
|
{
|
|
k = 1;
|
|
break;
|
|
}
|
|
|
|
if (k == 0)
|
|
{
|
|
sprite[searchwall].z += updownunits << ((eitherCTRL && mouseaction)*3);
|
|
if (!spnoclip)sprite[searchwall].z = min(sprite[searchwall].z,spriteongroundz(searchwall));
|
|
Bsprintf(getmessage,"Sprite %d z = %d",searchwall,sprite[searchwall].z);
|
|
message(getmessage);
|
|
|
|
}
|
|
else
|
|
{
|
|
for (i=0; i<highlightcnt; i++)
|
|
if ((highlight[i]&0xc000) == 16384)
|
|
{
|
|
sprite[highlight[i]&16383].z += updownunits;
|
|
if (!spnoclip)sprite[highlight[i]&16383].z = min(sprite[highlight[i]&16383].z,spriteongroundz(highlight[i]&16383));
|
|
}
|
|
Bsprintf(getmessage,"Sprite %d z = %d",highlight[i]&16383,sprite[highlight[i]&16383].z);
|
|
message(getmessage);
|
|
|
|
}
|
|
}
|
|
}
|
|
asksave = 1;
|
|
keystatus[KEYSC_PGDN] = 0;
|
|
mouseb &= ~32;
|
|
}
|
|
|
|
/* end Mapster32 */
|
|
|
|
// DoWater(horiz);
|
|
|
|
if (framerateon)
|
|
{
|
|
static int32_t FrameCount = 0;
|
|
static int32_t LastCount = 0;
|
|
static int32_t LastSec = 0;
|
|
static int32_t LastMS = 0;
|
|
int32_t ms = getticks();
|
|
int32_t howlong = ms - LastMS;
|
|
if (howlong >= 0)
|
|
{
|
|
int32_t thisSec = ms/1000;
|
|
int32_t x = (xdim <= 640);
|
|
int32_t chars = Bsprintf(tempbuf, "%2u ms (%3u fps)", howlong, LastCount);
|
|
|
|
if (!x)
|
|
{
|
|
printext256(windowx2-(chars<<3)+1,windowy1+2,0,-1,tempbuf,x);
|
|
printext256(windowx2-(chars<<3),windowy1+1,COLOR_WHITE,-1,tempbuf,x);
|
|
}
|
|
else
|
|
{
|
|
printext256(windowx2-(chars<<2)+1,windowy1+2,0,-1,tempbuf,x);
|
|
printext256(windowx2-(chars<<2),windowy1+1,COLOR_WHITE,-1,tempbuf,x);
|
|
}
|
|
|
|
if (LastSec < thisSec)
|
|
{
|
|
LastCount = FrameCount / (thisSec - LastSec);
|
|
LastSec = thisSec;
|
|
FrameCount = 0;
|
|
}
|
|
FrameCount++;
|
|
}
|
|
LastMS = ms;
|
|
}
|
|
|
|
tempbuf[0] = 0;
|
|
if (bstatus&4 && !(bstatus&(1|2)) && !unrealedlook) //PK
|
|
{
|
|
Bsprintf(tempbuf,"VIEW");
|
|
// else Bsprintf(tempbuf,"SHADE");
|
|
}
|
|
else if (bstatus&2 && !(bstatus&1))
|
|
Bsprintf(tempbuf,"Z");
|
|
else if (bstatus&1 && !(bstatus&2))
|
|
Bsprintf(tempbuf,"LOCK");
|
|
|
|
if (bstatus&1)
|
|
{
|
|
Bsprintf(tempbuf,"LOCK");
|
|
switch (searchstat)
|
|
{
|
|
case 0:
|
|
case 4:
|
|
if (eitherALT)
|
|
Bsprintf(tempbuf,"CEILING Z %s", eitherCTRL?"512":"");
|
|
else if (eitherSHIFT)
|
|
Bsprintf(tempbuf,"PAN %s", eitherCTRL?"8":"");
|
|
else if (eitherCTRL)
|
|
Bsprintf(tempbuf,"SCALE");
|
|
break;
|
|
case 1:
|
|
case 2:
|
|
if (eitherALT)
|
|
Bsprintf(tempbuf,"%s Z %s", searchstat==1?"CEILING":"FLOOR", eitherCTRL?"512":"");
|
|
else if (eitherSHIFT)
|
|
Bsprintf(tempbuf,"PAN");
|
|
else if (eitherCTRL)
|
|
Bsprintf(tempbuf,"SLOPE");
|
|
break;
|
|
case 3:
|
|
if (eitherALT)
|
|
Bsprintf(tempbuf,"MOVE Z %s", eitherCTRL?"1024":"");
|
|
else if (eitherSHIFT)
|
|
Bsprintf(tempbuf,"MOVE XY %s", eitherCTRL?"GRID":"");
|
|
else if (eitherCTRL)
|
|
Bsprintf(tempbuf,"SIZE");
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (tempbuf[0] != 0)
|
|
{
|
|
i = (Bstrlen(tempbuf)<<3)+6;
|
|
if ((searchx+i) < (xdim-1))
|
|
i = 0;
|
|
else i = (searchx+i)-(xdim-1);
|
|
if ((searchy+16) < (ydim-1))
|
|
j = 0;
|
|
else j = (searchy+16)-(ydim-1);
|
|
// printext16(searchx+6-i,searchy+6-j,11,-1,tempbuf,0);
|
|
printext256(searchx+4+2-i,searchy+4+2-j,0,-1,tempbuf,!(xdimgame > 640));
|
|
printext256(searchx+4-i,searchy+4-j,whitecol,-1,tempbuf,!(xdimgame > 640));
|
|
|
|
// printext256(searchx+4+2,searchy+4+2,0,-1,tempbuf,!(xdimgame > 640));
|
|
// printext256(searchx+4,searchy+4,whitecol,-1,tempbuf,!(xdimgame > 640));
|
|
}
|
|
if (helpon==1)
|
|
{
|
|
for (i=0; i<MAXHELP3D; i++)
|
|
{
|
|
begindrawing();
|
|
printext256(0*8+2,8+(i*(8+(xdimgame > 640)))+2,0,-1,Help3d[i],!(xdimgame > 640));
|
|
printext256(0*8,8+(i*(8+(xdimgame > 640))),whitecol,-1,Help3d[i],!(xdimgame > 640));
|
|
enddrawing();
|
|
switch (i)
|
|
{
|
|
case 8:
|
|
Bsprintf(tempbuf,"%d",autosave);
|
|
break;
|
|
case 9:
|
|
Bsprintf(tempbuf,"%s",SKILLMODE[skill]);
|
|
break;
|
|
case 10:
|
|
Bsprintf(tempbuf,"%d",framerateon);
|
|
break;
|
|
case 11:
|
|
Bsprintf(tempbuf,"%s",SPRDSPMODE[nosprites]);
|
|
break;
|
|
case 12:
|
|
Bsprintf(tempbuf,"%d",shadepreview);
|
|
break;
|
|
case 13:
|
|
Bsprintf(tempbuf,"%d",purpleon);
|
|
break;
|
|
default :
|
|
Bsprintf(tempbuf," ");
|
|
break;
|
|
}
|
|
begindrawing();
|
|
if (!strcmp(tempbuf,"0"))
|
|
Bsprintf(tempbuf,"OFF");
|
|
else if (!strcmp(tempbuf,"1"))
|
|
Bsprintf(tempbuf,"ON");
|
|
else if (!strcmp(tempbuf,"2"))
|
|
Bsprintf(tempbuf,"ON (2)");
|
|
|
|
printext256((20+((xdimgame > 640) * 20))*8+2,8+(i*(8+(xdimgame > 640)))+2,0,-1,tempbuf,!(xdimgame > 640));
|
|
printext256((20+((xdimgame > 640) * 20))*8,8+(i*(8+(xdimgame > 640))),whitecol,-1,tempbuf,!(xdimgame > 640));
|
|
enddrawing();
|
|
}
|
|
}
|
|
|
|
/* if(purpleon) {
|
|
begindrawing();
|
|
// printext256(1*4,1*8,whitecol,-1,"Purple ON",0);
|
|
sprintf(getmessage,"Purple ON");
|
|
message(getmessage);
|
|
enddrawing();
|
|
}
|
|
*/
|
|
if (sector[cursectnum].lotag==2)
|
|
{
|
|
if (sector[cursectnum].ceilingpicnum==FLOORSLIME) SetSLIMEPalette();
|
|
else SetWATERPalette();
|
|
}
|
|
else SetGAMEPalette();
|
|
|
|
if (keystatus[buildkeys[BK_MODE2D_3D]]) // Enter
|
|
{
|
|
SetGAMEPalette();
|
|
FX_StopAllSounds();
|
|
S_ClearSoundLocks();
|
|
#ifdef POLYMER
|
|
for (i=0;i<MAXSPRITES;i++)
|
|
if (spritelightptr[i] != NULL)
|
|
{
|
|
polymer_deletelight(spritelightid[i]);
|
|
spritelightptr[i] = NULL;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
//Stick this in 3D part of ExtCheckKeys
|
|
//Also choose your own key scan codes
|
|
|
|
|
|
|
|
if (keystatus[KEYSC_QUOTE] && keystatus[KEYSC_D]) // ' d
|
|
/*
|
|
{
|
|
ShowHelpText("SectorEffector");
|
|
} */
|
|
|
|
{
|
|
keystatus[KEYSC_D] = 0;
|
|
skill++;
|
|
if (skill>MAXSKILL-1) skill=0;
|
|
message("%s",SKILLMODE[skill]);
|
|
// printext256(1*4,1*8,11,-1,tempbuf,0);
|
|
}
|
|
|
|
/* if (keystatus[KEYSC_QUOTE] && keystatus[KEYSC_G]) // ' g <Unused>
|
|
{
|
|
keystatus[KEYSC_G] = 0;
|
|
tabgraphic++;
|
|
if (tabgraphic > 2) tabgraphic = 0;
|
|
if (tabgraphic) message("Graphics ON");
|
|
else message("Graphics OFF");
|
|
}*/
|
|
|
|
if (keystatus[KEYSC_QUOTE] && keystatus[KEYSC_X]) // ' x
|
|
{
|
|
keystatus[KEYSC_X] = 0;
|
|
shadepreview=!shadepreview;
|
|
message("Map shade preview %s",shadepreview?"enabled":"disabled");
|
|
#ifdef POLYMER
|
|
for (i=0;i<MAXSPRITES;i++)
|
|
if (spritelightptr[i] != NULL)
|
|
{
|
|
polymer_deletelight(spritelightid[i]);
|
|
spritelightptr[i] = NULL;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
|
|
/* if (keystatus[KEYSC_QUOTE] && keystatus[KEYSC_R]) // ' r <Handled already>
|
|
{
|
|
keystatus[KEYSC_R] = 0;
|
|
framerateon=!framerateon;
|
|
if (framerateon) message("Framerate ON");
|
|
else message("Framerate OFF");
|
|
}*/
|
|
|
|
if (keystatus[KEYSC_QUOTE] && keystatus[KEYSC_W]) // ' w
|
|
{
|
|
keystatus[KEYSC_W] = 0;
|
|
nosprites++;
|
|
if (nosprites>3) nosprites=0;
|
|
message("%s",SPRDSPMODE[nosprites]);
|
|
// printext256(1*4,1*8,whitecol,-1,tempbuf,0);
|
|
}
|
|
|
|
if (keystatus[KEYSC_QUOTE] && keystatus[KEYSC_Y]) // ' y
|
|
{
|
|
keystatus[KEYSC_Y] = 0;
|
|
purpleon=!purpleon;
|
|
if (nosprites>3) nosprites=0;
|
|
if (purpleon) message("Purple ON");
|
|
else message("Purple OFF");
|
|
}
|
|
|
|
if (keystatus[KEYSC_QUOTE] && keystatus[KEYSC_C]) // ' C
|
|
{
|
|
keystatus[KEYSC_C] = 0;
|
|
switch (searchstat)
|
|
{
|
|
case 0:
|
|
case 4:
|
|
for (i=0; i<MAXWALLS; i++)
|
|
{
|
|
if (wall[i].picnum==temppicnum)
|
|
wall[i].shade=tempshade;
|
|
}
|
|
message("Walls with picnum %d have shade of %d",temppicnum,tempshade);
|
|
asksave=1;
|
|
break;
|
|
case 1:
|
|
case 2:
|
|
for (i=0; i<MAXSECTORS; i++)
|
|
{
|
|
if (searchstat==1)
|
|
if (sector[i].ceilingpicnum==temppicnum)
|
|
{
|
|
sector[i].ceilingshade=tempshade;
|
|
}
|
|
if (searchstat==2)
|
|
if (sector[i].floorpicnum==temppicnum)
|
|
{
|
|
sector[i].floorshade=tempshade;
|
|
}
|
|
}
|
|
message("Sectors with picnum %d have shade of %d",temppicnum,tempshade);
|
|
asksave=1;
|
|
break;
|
|
case 3:
|
|
for (i=0; i<MAXSPRITES; i++)
|
|
{
|
|
if (sprite[i].picnum==temppicnum)
|
|
{
|
|
sprite[i].shade=tempshade;
|
|
}
|
|
}
|
|
message("Sprites with picnum %d have shade of %d",temppicnum,tempshade);
|
|
asksave=1;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (keystatus[KEYSC_QUOTE] && keystatus[KEYSC_T]) // ' T
|
|
{
|
|
keystatus[KEYSC_T] = 0;
|
|
switch (searchstat)
|
|
{
|
|
case 0:
|
|
case 4:
|
|
wall[searchwall].lotag =
|
|
getnumber256("Wall lotag: ",wall[searchwall].lotag,65536L,0);
|
|
break;
|
|
case 1:
|
|
case 2:
|
|
sector[searchsector].lotag =
|
|
_getnumber256("Sector lotag: ",sector[searchsector].lotag,65536L,0,(void *)ExtGetSectorType);
|
|
break;
|
|
case 3:
|
|
if (sprite[searchwall].picnum == SECTOREFFECTOR)
|
|
sprite[searchwall].lotag =
|
|
_getnumber256("Sprite lotag: ",sprite[searchwall].lotag,65536L,0,(void *)SectorEffectorTagText);
|
|
else if (sprite[searchwall].picnum == MUSICANDSFX)
|
|
{
|
|
int16_t oldtag = sprite[searchwall].lotag;
|
|
sprite[searchwall].lotag =
|
|
_getnumber256("Sprite lotag: ",sprite[searchwall].lotag,65536L,0,(void *)MusicAndSFXTagText);
|
|
if ((sprite[searchwall].filler&1) && sprite[searchwall].lotag != oldtag)
|
|
{
|
|
sprite[searchwall].filler &= ~1;
|
|
S_StopEnvSound(oldtag, searchwall);
|
|
}
|
|
}
|
|
else
|
|
sprite[searchwall].lotag =
|
|
getnumber256("Sprite lotag: ",sprite[searchwall].lotag,65536L,0);
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (keystatus[KEYSC_QUOTE] && keystatus[KEYSC_H]) // ' H
|
|
{
|
|
keystatus[KEYSC_H] = 0;
|
|
switch (searchstat)
|
|
{
|
|
case 0:
|
|
case 4:
|
|
wall[searchwall].hitag =
|
|
getnumber256("Wall hitag: ",wall[searchwall].hitag,65536L,0);
|
|
break;
|
|
case 1:
|
|
case 2:
|
|
sector[searchsector].hitag =
|
|
getnumber256("Sector hitag: ",sector[searchsector].hitag,65536L,0);
|
|
break;
|
|
case 3:
|
|
sprite[searchwall].hitag =
|
|
getnumber256("Sprite hitag: ",sprite[searchwall].hitag,65536L,0);
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (keystatus[KEYSC_QUOTE] && keystatus[KEYSC_S]) // ' S
|
|
{
|
|
keystatus[KEYSC_S] = 0;
|
|
switch (searchstat)
|
|
{
|
|
case 0:
|
|
case 4:
|
|
getnumberptr256("Wall shade: ",&wall[searchbottomwall].shade,sizeof(wall[searchbottomwall].shade),128L,1,NULL);
|
|
break;
|
|
case 1:
|
|
getnumberptr256("Ceiling shade: ",§or[searchsector].ceilingshade,sizeof(sector[searchsector].ceilingshade),128L,1,NULL);
|
|
break;
|
|
case 2:
|
|
getnumberptr256("Floor shade: ",§or[searchsector].floorshade,sizeof(sector[searchsector].floorshade),128L,1,NULL);
|
|
break;
|
|
case 3:
|
|
getnumberptr256("Sprite shade: ",&sprite[searchwall].shade,sizeof(sprite[searchwall].shade),128L,1,NULL);
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (keystatus[KEYSC_F2]) // F2
|
|
{
|
|
if (eitherSHIFT)
|
|
infobox^=1;
|
|
else if (eitherCTRL)
|
|
infobox^=2;
|
|
else usedcount=!usedcount;
|
|
keystatus[KEYSC_F2] = 0;
|
|
}
|
|
if (keystatus[KEYSC_TAB]) // TAB : USED
|
|
{
|
|
// usedcount=!usedcount;
|
|
|
|
count=0;
|
|
for (i=0; i<numwalls; i++)
|
|
{
|
|
if (wall[i].picnum == temppicnum) count++;
|
|
if (wall[i].overpicnum == temppicnum) count++;
|
|
}
|
|
for (i=0; i<numsectors; i++) // JBF 20040307: was numwalls, thanks Semicharm
|
|
{
|
|
if (sector[i].ceilingpicnum == temppicnum) count++;
|
|
if (sector[i].floorpicnum == temppicnum) count++;
|
|
}
|
|
statnum = 0; //status 1
|
|
i = headspritestat[statnum];
|
|
while (i != -1)
|
|
{
|
|
nexti = nextspritestat[i];
|
|
|
|
//your code goes here
|
|
//ex: printf("Sprite %d has a status of 1 (active)\n",i,statnum);
|
|
|
|
if (sprite[i].picnum == temppicnum) count++;
|
|
i = nexti;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
if (keystatus[KEYSC_F1]) // F1
|
|
{
|
|
helpon=!helpon;
|
|
keystatus[KEYSC_H]=0; // delete this line?
|
|
keystatus[KEYSC_F1]=0;
|
|
}
|
|
|
|
if (keystatus[KEYSC_G]) // G
|
|
{
|
|
switch (searchstat)
|
|
{
|
|
case 0:
|
|
getnumberptr256("Wall picnum: ",&wall[searchbottomwall].picnum,sizeof(wall[searchbottomwall].picnum),MAXTILES-1,0,NULL);
|
|
break;
|
|
case 1:
|
|
getnumberptr256("Sector ceiling picnum: ",§or[searchsector].ceilingpicnum,sizeof(sector[searchsector].ceilingpicnum),MAXTILES-1,0,NULL);
|
|
break;
|
|
case 2:
|
|
getnumberptr256("Sector floor picnum: ",§or[searchsector].floorpicnum,sizeof(sector[searchsector].floorpicnum),MAXTILES-1,0,NULL);
|
|
break;
|
|
case 3:
|
|
getnumberptr256("Sprite picnum: ",&sprite[searchwall].picnum,sizeof(sprite[searchwall].picnum),MAXTILES-1,0,NULL);
|
|
break;
|
|
case 4:
|
|
getnumberptr256("Masked wall picnum: ",&wall[searchwall].overpicnum,sizeof(wall[searchwall].overpicnum),MAXTILES-1,0,NULL);
|
|
break;
|
|
}
|
|
asksave = 1;
|
|
keystatus[KEYSC_G] = 0;
|
|
}
|
|
|
|
if (keystatus[KEYSC_B]) // B (clip Blocking xor) (3D)
|
|
{
|
|
if (searchstat == 3)
|
|
{
|
|
sprite[searchwall].cstat ^= 1;
|
|
// sprite[searchwall].cstat &= ~256;
|
|
// sprite[searchwall].cstat |= ((sprite[searchwall].cstat&1)<<8);
|
|
Bsprintf(getmessage,"Sprite %d blocking bit %s",searchwall,sprite[searchwall].cstat&1?"ON":"OFF");
|
|
message(getmessage);
|
|
asksave = 1;
|
|
}
|
|
else
|
|
{
|
|
wall[searchwall].cstat ^= 1;
|
|
// wall[searchwall].cstat &= ~64;
|
|
if ((wall[searchwall].nextwall >= 0) && (eitherSHIFT == 0))
|
|
{
|
|
wall[wall[searchwall].nextwall].cstat &= ~(1+64);
|
|
wall[wall[searchwall].nextwall].cstat |= (wall[searchwall].cstat&1);
|
|
}
|
|
Bsprintf(getmessage,"Wall %d blocking bit %s",searchwall,wall[searchwall].cstat&1?"ON":"OFF");
|
|
message(getmessage);
|
|
asksave = 1;
|
|
}
|
|
keystatus[KEYSC_B] = 0;
|
|
}
|
|
|
|
if (keystatus[KEYSC_T]) // T (transluscence for sprites/masked walls)
|
|
{
|
|
if (searchstat == 1) //Set masked/transluscent ceilings/floors
|
|
{
|
|
i = (sector[searchsector].ceilingstat&(128+256));
|
|
sector[searchsector].ceilingstat &= ~(128+256);
|
|
switch (i)
|
|
{
|
|
case 0:
|
|
sector[searchsector].ceilingstat |= 128;
|
|
break;
|
|
case 128:
|
|
sector[searchsector].ceilingstat |= 256;
|
|
break;
|
|
case 256:
|
|
sector[searchsector].ceilingstat |= 384;
|
|
break;
|
|
case 384:
|
|
sector[searchsector].ceilingstat |= 0;
|
|
break;
|
|
}
|
|
asksave = 1;
|
|
}
|
|
if (searchstat == 2)
|
|
{
|
|
i = (sector[searchsector].floorstat&(128+256));
|
|
sector[searchsector].floorstat &= ~(128+256);
|
|
switch (i)
|
|
{
|
|
case 0:
|
|
sector[searchsector].floorstat |= 128;
|
|
break;
|
|
case 128:
|
|
sector[searchsector].floorstat |= 256;
|
|
break;
|
|
case 256:
|
|
sector[searchsector].floorstat |= 384;
|
|
break;
|
|
case 384:
|
|
sector[searchsector].floorstat |= 0;
|
|
break;
|
|
}
|
|
asksave = 1;
|
|
}
|
|
|
|
if (keystatus[KEYSC_QUOTE])
|
|
{
|
|
switch (searchstat)
|
|
{
|
|
case 0:
|
|
case 4:
|
|
strcpy(buffer,"Wall lotag: ");
|
|
wall[searchwall].lotag = getnumber256(buffer,(int32_t)wall[searchwall].lotag,65536L,0);
|
|
break;
|
|
case 1:
|
|
strcpy(buffer,"Sector lotag: ");
|
|
sector[searchsector].lotag = getnumber256(buffer,(int32_t)sector[searchsector].lotag,65536L,0);
|
|
break;
|
|
case 2:
|
|
strcpy(buffer,"Sector lotag: ");
|
|
sector[searchsector].lotag = getnumber256(buffer,(int32_t)sector[searchsector].lotag,65536L,0);
|
|
break;
|
|
case 3:
|
|
strcpy(buffer,"Sprite lotag: ");
|
|
sprite[searchwall].lotag = getnumber256(buffer,(int32_t)sprite[searchwall].lotag,65536L,0);
|
|
break;
|
|
}
|
|
}
|
|
else if (eitherCTRL)
|
|
{
|
|
if (searchstat == 3)
|
|
rendertext(searchwall);
|
|
}
|
|
else
|
|
{
|
|
if (searchstat == 3)
|
|
{
|
|
if ((sprite[searchwall].cstat&2) == 0)
|
|
sprite[searchwall].cstat |= 2;
|
|
else if ((sprite[searchwall].cstat&512) == 0)
|
|
sprite[searchwall].cstat |= 512;
|
|
else
|
|
sprite[searchwall].cstat &= ~(2+512);
|
|
asksave = 1;
|
|
}
|
|
if (searchstat == 4)
|
|
{
|
|
if ((wall[searchwall].cstat&128) == 0)
|
|
wall[searchwall].cstat |= 128;
|
|
else if ((wall[searchwall].cstat&512) == 0)
|
|
wall[searchwall].cstat |= 512;
|
|
else
|
|
wall[searchwall].cstat &= ~(128+512);
|
|
|
|
if (wall[searchwall].nextwall >= 0)
|
|
{
|
|
wall[wall[searchwall].nextwall].cstat &= ~(128+512);
|
|
wall[wall[searchwall].nextwall].cstat |= (wall[searchwall].cstat&(128+512));
|
|
}
|
|
asksave = 1;
|
|
}
|
|
}
|
|
keystatus[KEYSC_T] = 0;
|
|
}
|
|
|
|
if (keystatus[KEYSC_QUOTE] && keystatus[KEYSC_ENTER]) // ' ENTER
|
|
{
|
|
message("Pasted picnum only");
|
|
switch (searchstat)
|
|
{
|
|
case 0 :
|
|
wall[searchbottomwall].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;
|
|
}
|
|
keystatus[KEYSC_ENTER]=0;
|
|
}
|
|
|
|
i = 512;
|
|
if (keystatus[KEYSC_RSHIFT]) i = 8;
|
|
if (keystatus[KEYSC_LSHIFT]) i = 1;
|
|
mouseaction=0;
|
|
if (eitherCTRL && !eitherSHIFT && bstatus&1 && (searchstat == 1 || searchstat == 2))
|
|
{
|
|
mousex=0; mskip=1;
|
|
if (mousey<0)
|
|
{
|
|
i=klabs(mousey*2);
|
|
mouseaction=1;
|
|
}
|
|
}
|
|
|
|
if (keystatus[KEYSC_LBRACK] || mouseaction) // [
|
|
{
|
|
keystatus[KEYSC_LBRACK] = 0;
|
|
if (eitherALT)
|
|
{
|
|
i = wall[searchwall].nextsector;
|
|
if (i >= 0 && !mouseaction)
|
|
switch (searchstat)
|
|
{
|
|
case 0:
|
|
case 1:
|
|
case 4:
|
|
alignceilslope(searchsector,wall[searchwall].x,wall[searchwall].y,getceilzofslope(i,wall[searchwall].x,wall[searchwall].y));
|
|
message("Sector %d align ceiling to wall %d",searchsector,searchwall);
|
|
break;
|
|
case 2:
|
|
alignflorslope(searchsector,wall[searchwall].x,wall[searchwall].y,getflorzofslope(i,wall[searchwall].x,wall[searchwall].y));
|
|
message("Sector %d align floor to wall %d",searchsector,searchwall);
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (searchstat == 1)
|
|
{
|
|
if (!(sector[searchsector].ceilingstat&2))
|
|
sector[searchsector].ceilingheinum = 0;
|
|
sector[searchsector].ceilingheinum = max(sector[searchsector].ceilingheinum-i,-32768);
|
|
message("Sector %d ceiling slope = %d",searchsector,sector[searchsector].ceilingheinum);
|
|
}
|
|
if (searchstat == 2)
|
|
{
|
|
if (!(sector[searchsector].floorstat&2))
|
|
sector[searchsector].floorheinum = 0;
|
|
sector[searchsector].floorheinum = max(sector[searchsector].floorheinum-i,-32768);
|
|
message("Sector %d floor slope = %d",searchsector,sector[searchsector].floorheinum);
|
|
}
|
|
}
|
|
|
|
if (sector[searchsector].ceilingheinum == 0)
|
|
sector[searchsector].ceilingstat &= ~2;
|
|
else
|
|
sector[searchsector].ceilingstat |= 2;
|
|
|
|
if (sector[searchsector].floorheinum == 0)
|
|
sector[searchsector].floorstat &= ~2;
|
|
else
|
|
sector[searchsector].floorstat |= 2;
|
|
asksave = 1;
|
|
}
|
|
|
|
i = 512;
|
|
if (keystatus[KEYSC_RSHIFT]) i = 8;
|
|
if (keystatus[KEYSC_LSHIFT]) i = 1;
|
|
mouseaction=0;
|
|
if (eitherCTRL && !eitherSHIFT && bstatus&1 && (searchstat == 1 || searchstat == 2))
|
|
{
|
|
mousex=0; mskip=1;
|
|
if (mousey>0)
|
|
{
|
|
i=klabs(mousey*2);
|
|
mouseaction=1;
|
|
}
|
|
}
|
|
if (keystatus[KEYSC_RBRACK] || mouseaction) // ]
|
|
{
|
|
keystatus[KEYSC_RBRACK] = 0;
|
|
if (eitherALT)
|
|
{
|
|
i = wall[searchwall].nextsector;
|
|
if (i >= 0 && !mouseaction)
|
|
switch (searchstat)
|
|
{
|
|
case 1:
|
|
alignceilslope(searchsector,wall[searchwall].x,wall[searchwall].y,getceilzofslope(i,wall[searchwall].x,wall[searchwall].y));
|
|
message("Sector %d align ceiling to wall %d",searchsector,searchwall);
|
|
break;
|
|
case 0:
|
|
case 2:
|
|
case 4:
|
|
alignflorslope(searchsector,wall[searchwall].x,wall[searchwall].y,getflorzofslope(i,wall[searchwall].x,wall[searchwall].y));
|
|
message("Sector %d align floor to wall %d",searchsector,searchwall);
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (searchstat == 1)
|
|
{
|
|
if (!(sector[searchsector].ceilingstat&2))
|
|
sector[searchsector].ceilingheinum = 0;
|
|
sector[searchsector].ceilingheinum = min(sector[searchsector].ceilingheinum+i,32767);
|
|
message("Sector %d ceiling slope = %d",searchsector,sector[searchsector].ceilingheinum);
|
|
}
|
|
if (searchstat == 2)
|
|
{
|
|
if (!(sector[searchsector].floorstat&2))
|
|
sector[searchsector].floorheinum = 0;
|
|
sector[searchsector].floorheinum = min(sector[searchsector].floorheinum+i,32767);
|
|
message("Sector %d floor slope = %d",searchsector,sector[searchsector].floorheinum);
|
|
}
|
|
}
|
|
|
|
if (sector[searchsector].ceilingheinum == 0)
|
|
sector[searchsector].ceilingstat &= ~2;
|
|
else
|
|
sector[searchsector].ceilingstat |= 2;
|
|
|
|
if (sector[searchsector].floorheinum == 0)
|
|
sector[searchsector].floorstat &= ~2;
|
|
else
|
|
sector[searchsector].floorstat |= 2;
|
|
|
|
asksave = 1;
|
|
}
|
|
|
|
if (bstatus&1 && eitherSHIFT) mskip=1;
|
|
if (bstatus&1 && eitherSHIFT && (searchstat == 1 || searchstat == 2) && (mousex|mousey))
|
|
{
|
|
int32_t fw,x1,y1,x2,y2,stat,ma,a=0;
|
|
|
|
stat=(searchstat==2)?sector[searchsector].floorstat:sector[searchsector].ceilingstat;
|
|
if (stat&64) // align to first wall
|
|
{
|
|
fw=sector[searchsector].wallptr;
|
|
x1=wall[fw].x,y1=wall[fw].y;
|
|
x2=wall[wall[fw].point2].x,y2=wall[wall[fw].point2].y;
|
|
a=getangle(x1-x2,y1-y2);
|
|
}
|
|
mouseax+=mousex; mouseay+=mousey;
|
|
ma=getangle(mouseax,mouseay);
|
|
ma+=ang-a;
|
|
|
|
i = stat;
|
|
i = (i&0x4)+((i>>4)&3);
|
|
if (stat&64) // align to first wall
|
|
switch (i)
|
|
{
|
|
case 0:break;
|
|
case 1:ma=-ma; break;
|
|
case 2:ma=1024-ma; break;
|
|
case 3:ma+=1024; break;
|
|
case 4:ma=-512-ma; break;
|
|
case 5:ma+=512; break;
|
|
case 6:ma-=512; break;
|
|
case 7:ma=512-ma; break;
|
|
}
|
|
else
|
|
switch (i)
|
|
{
|
|
case 0:ma=-ma; break;
|
|
case 1:break;
|
|
case 2:ma+=1024; break;
|
|
case 3:ma=1024-ma; break;
|
|
case 4:ma-=512; break;
|
|
case 5:ma=512-ma; break;
|
|
case 6:ma=-512-ma; break;
|
|
case 7:ma+=512; break;
|
|
}
|
|
|
|
a=ksqrt(mouseax*mouseax+mouseay*mouseay);
|
|
if (a)
|
|
{
|
|
int32_t mult=(stat&8)?8192:8192*2;
|
|
x1=-a*sintable[(ma+2048)&2047]/mult;
|
|
y1=-a*sintable[(ma+1536)&2047]/mult;
|
|
if (x1||y1)
|
|
{
|
|
mouseax=0; mouseay=0;
|
|
if (searchstat==1)
|
|
{
|
|
changedir=1; if (x1<0) {changedir=-1; x1*=-1;}
|
|
while (x1--)sector[searchsector].ceilingxpanning = changechar(sector[searchsector].ceilingxpanning,changedir,0,0);
|
|
changedir=1; if (y1<0) {changedir=-1; y1*=-1;}
|
|
while (y1--)sector[searchsector].ceilingypanning = changechar(sector[searchsector].ceilingypanning,changedir,0,0);
|
|
message("Sector %d ceiling panning: %d, %d",searchsector,sector[searchsector].ceilingxpanning,sector[searchsector].ceilingypanning);
|
|
}
|
|
else
|
|
{
|
|
changedir=1; if (x1<0) {changedir=-1; x1*=-1;}
|
|
while (x1--)sector[searchsector].floorxpanning = changechar(sector[searchsector].floorxpanning,changedir,0,0);
|
|
changedir=1; if (y1<0) {changedir=-1; y1*=-1;}
|
|
while (y1--)sector[searchsector].floorypanning = changechar(sector[searchsector].floorypanning,changedir,0,0);
|
|
message("Sector %d floor panning: %d, %d",searchsector,sector[searchsector].floorxpanning,sector[searchsector].floorypanning);
|
|
}
|
|
asksave=1;
|
|
}
|
|
}
|
|
mousex=0; mousey=0;
|
|
}
|
|
if (!mouseb) {mouseax=0; mouseay=0;}
|
|
|
|
smooshyalign = keystatus[KEYSC_gKP5];
|
|
repeatpanalign = eitherSHIFT;
|
|
|
|
updownunits=1;
|
|
mouseaction=0;
|
|
|
|
if (bstatus&1 && searchstat != 1 && searchstat != 2)
|
|
{
|
|
if (eitherSHIFT)
|
|
{
|
|
mskip=1;
|
|
if (mousex!=0)
|
|
{
|
|
mouseaction=1;
|
|
mouseax+=mousex;
|
|
updownunits=klabs((int32_t)(mouseax/2.));
|
|
if (updownunits) {mouseax=0;}
|
|
}
|
|
}
|
|
else if (eitherCTRL && !eitherALT)
|
|
{
|
|
mskip=1;
|
|
if (mousex!=0)
|
|
{
|
|
mouseaction=2;
|
|
repeatpanalign=0;
|
|
if (searchstat==3)
|
|
{
|
|
updownunits=klabs(mouseax+=mousex)/4;
|
|
if (updownunits)mouseax=0;
|
|
}
|
|
else
|
|
{
|
|
updownunits=klabs(mouseax+=mousex)/16;
|
|
if (updownunits)mouseax=0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (keystatus[KEYSC_gLEFT] || keystatus[KEYSC_gRIGHT] || mouseaction) // 4 & 6 (keypad)
|
|
{
|
|
if ((repeatcountx == 0) || (repeatcountx > 32) || mouseaction)
|
|
{
|
|
changedir = 0;
|
|
if (keystatus[KEYSC_gLEFT] || mousex>0) changedir = -1;
|
|
if (keystatus[KEYSC_gRIGHT] || mousex<0) changedir = 1;
|
|
|
|
if ((searchstat == 0) || (searchstat == 4))
|
|
{
|
|
if (repeatpanalign == 0)
|
|
{
|
|
while (updownunits--)wall[searchwall].xrepeat = changechar(wall[searchwall].xrepeat,changedir,smooshyalign,1);
|
|
message("Wall %d repeat: %d, %d",searchwall,wall[searchwall].xrepeat,wall[searchwall].yrepeat);
|
|
}
|
|
else
|
|
{
|
|
int16_t w = (searchstat==0)?searchbottomwall:searchwall;
|
|
if (mouseaction)
|
|
{
|
|
i=wall[w].cstat;
|
|
i=((i>>3)&1)+((i>>7)&2);
|
|
if (i==1||i==3)changedir*=-1;
|
|
if (eitherCTRL) updownunits *= 8;
|
|
}
|
|
while (updownunits--)wall[w].xpanning = changechar(wall[w].xpanning,changedir,smooshyalign,0);
|
|
message("Wall %d panning: %d, %d",w,wall[w].xpanning,wall[w].ypanning);
|
|
}
|
|
}
|
|
if ((searchstat == 1) || (searchstat == 2))
|
|
{
|
|
if (searchstat == 1)
|
|
{
|
|
while (updownunits--)sector[searchsector].ceilingxpanning = changechar(sector[searchsector].ceilingxpanning,changedir,smooshyalign,0);
|
|
message("Sector %d ceiling panning: %d, %d",searchsector,sector[searchsector].ceilingxpanning,sector[searchsector].ceilingypanning);
|
|
}
|
|
else
|
|
{
|
|
while (updownunits--)sector[searchsector].floorxpanning = changechar(sector[searchsector].floorxpanning,changedir,smooshyalign,0);
|
|
message("Sector %d floor panning: %d, %d",searchsector,sector[searchsector].floorxpanning,sector[searchsector].floorypanning);
|
|
}
|
|
}
|
|
if (searchstat == 3)
|
|
{
|
|
static int32_t sumxvect=0, sumyvect=0;
|
|
|
|
if (mouseaction==1)
|
|
{
|
|
int32_t xvect,yvect,daxvect,dayvect;
|
|
int16_t cursectnum=sprite[searchwall].sectnum;
|
|
int32_t units, gridlock = (eitherCTRL && grid > 0 && grid < 9);
|
|
|
|
xvect = -((mousex*(int32_t)sintable[(ang+2048)&2047])<<3);
|
|
yvect = -((mousex*(int32_t)sintable[(ang+1536)&2047])<<3);
|
|
|
|
if (gridlock)
|
|
{
|
|
units = (2048 >> grid) << 14;
|
|
sumxvect += xvect;
|
|
sumyvect += yvect;
|
|
if (klabs(sumxvect) >= units)
|
|
{
|
|
daxvect = (sumxvect/units)*units;
|
|
sumxvect %= units;
|
|
}
|
|
else
|
|
daxvect = 0;
|
|
|
|
if (klabs(sumyvect) >= units)
|
|
{
|
|
dayvect = (sumyvect/units)*units;
|
|
sumyvect %= units;
|
|
}
|
|
else
|
|
dayvect = 0;
|
|
}
|
|
else
|
|
{
|
|
daxvect = xvect;
|
|
dayvect = yvect;
|
|
}
|
|
clipmove((vec3_t *)&sprite[searchwall],
|
|
&cursectnum,daxvect,dayvect,128L,4L<<8,4L<<8,spnoclip?1:CLIPMASK0);
|
|
setsprite(searchwall,(vec3_t *)&sprite[searchwall]);
|
|
}
|
|
else
|
|
{
|
|
sumxvect = sumyvect = 0;
|
|
if (mouseaction==2)changedir*=-1;
|
|
while (updownunits--)sprite[searchwall].xrepeat = changechar(sprite[searchwall].xrepeat,changedir,smooshyalign,1);
|
|
if (sprite[searchwall].xrepeat < 4)
|
|
sprite[searchwall].xrepeat = 4;
|
|
message("Sprite %d repeat: %d, %d",searchwall,sprite[searchwall].xrepeat,sprite[searchwall].yrepeat);
|
|
}
|
|
}
|
|
asksave = 1;
|
|
repeatcountx = max(1,repeatcountx-2);
|
|
}
|
|
repeatcountx += synctics;
|
|
}
|
|
else
|
|
repeatcountx = 0;
|
|
|
|
updownunits=1;
|
|
mouseaction=0;
|
|
if (bstatus&1 && searchstat != 1 && searchstat != 2)
|
|
{
|
|
if (eitherSHIFT)
|
|
{
|
|
mskip=1;
|
|
if (mousey!=0)
|
|
{
|
|
mouseaction=1;
|
|
updownunits=klabs(mousey);
|
|
if (searchstat != 3)
|
|
{
|
|
updownunits=klabs((int32_t)(mousey*128./tilesizy[wall[searchwall].picnum]));
|
|
}
|
|
}
|
|
}
|
|
else if (eitherCTRL && !eitherALT)
|
|
{
|
|
mskip=1;
|
|
if (mousey!=0)
|
|
{
|
|
mouseaction=2;
|
|
repeatpanalign=0;
|
|
if (searchstat==3)
|
|
{
|
|
updownunits=klabs(mouseay+=mousey)/4;
|
|
if (updownunits)mouseay=0;
|
|
}
|
|
else
|
|
{
|
|
updownunits=klabs(mouseay+=mousey)/32;
|
|
if (updownunits)mouseay=0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (!mouseb) {mouseax=0; mouseay=0;}
|
|
if (keystatus[KEYSC_gUP] || keystatus[KEYSC_gDOWN] || mouseaction) // 2 & 8 (keypad)
|
|
{
|
|
if ((repeatcounty == 0) || (repeatcounty > 32) || mouseaction)
|
|
{
|
|
changedir = 0;
|
|
if (keystatus[KEYSC_gUP] || mousey>0) changedir = -1;
|
|
if (keystatus[KEYSC_gDOWN] || mousey<0) changedir = 1;
|
|
|
|
if ((searchstat == 0) || (searchstat == 4))
|
|
{
|
|
if (repeatpanalign == 0)
|
|
{
|
|
while (updownunits--)
|
|
wall[searchwall].yrepeat = changechar(wall[searchwall].yrepeat,changedir,smooshyalign,1);
|
|
message("Wall %d repeat: %d, %d",searchwall,wall[searchwall].xrepeat,wall[searchwall].yrepeat);
|
|
}
|
|
else
|
|
{
|
|
int16_t w = (searchstat==0)?searchbottomwall:searchwall;
|
|
if (mouseaction && eitherCTRL)
|
|
updownunits *= 8;
|
|
while (updownunits--)
|
|
wall[w].ypanning = changechar(wall[w].ypanning,changedir,smooshyalign,0);
|
|
message("Wall %d panning: %d, %d",w,wall[w].xpanning,wall[w].ypanning);
|
|
}
|
|
}
|
|
if ((searchstat == 1) || (searchstat == 2))
|
|
{
|
|
if (searchstat == 1)
|
|
{
|
|
while (updownunits--)
|
|
sector[searchsector].ceilingypanning = changechar(sector[searchsector].ceilingypanning,changedir,smooshyalign,0);
|
|
message("Sector %d ceiling panning: %d, %d",searchsector,sector[searchsector].ceilingxpanning,sector[searchsector].ceilingypanning);
|
|
}
|
|
else
|
|
{
|
|
while (updownunits--)
|
|
sector[searchsector].floorypanning = changechar(sector[searchsector].floorypanning,changedir,smooshyalign,0);
|
|
message("Sector %d floor panning: %d, %d",searchsector,sector[searchsector].floorxpanning,sector[searchsector].floorypanning);
|
|
}
|
|
}
|
|
if (searchstat == 3)
|
|
{
|
|
static int32_t sumxvect=0, sumyvect=0;
|
|
|
|
if (mouseaction==1)
|
|
{
|
|
int32_t xvect,yvect,daxvect,dayvect;
|
|
int16_t cursectnum=sprite[searchwall].sectnum;
|
|
int32_t units, gridlock = (eitherCTRL && grid > 0 && grid < 9);
|
|
|
|
xvect = -((mousey*(int32_t)sintable[(ang+2560)&2047])<<3);
|
|
yvect = -((mousey*(int32_t)sintable[(ang+2048)&2047])<<3);
|
|
|
|
if (gridlock)
|
|
{
|
|
units = (2048 >> grid) << 14;
|
|
sumxvect += xvect;
|
|
sumyvect += yvect;
|
|
if (klabs(sumxvect) >= units)
|
|
{
|
|
daxvect = (sumxvect/units)*units;
|
|
sumxvect %= units;
|
|
}
|
|
else
|
|
daxvect = 0;
|
|
|
|
if (klabs(sumyvect) >= units)
|
|
{
|
|
dayvect = (sumyvect/units)*units;
|
|
sumyvect %= units;
|
|
}
|
|
else
|
|
dayvect = 0;
|
|
}
|
|
else
|
|
{
|
|
daxvect = xvect;
|
|
dayvect = yvect;
|
|
}
|
|
clipmove((vec3_t *)&sprite[searchwall],
|
|
&cursectnum,daxvect,dayvect,128L,4L<<8,4L<<8,spnoclip?1:CLIPMASK0);
|
|
setsprite(searchwall,(vec3_t *)&sprite[searchwall]);
|
|
}
|
|
else
|
|
{
|
|
sumxvect = sumyvect = 0;
|
|
while (updownunits--)sprite[searchwall].yrepeat = changechar(sprite[searchwall].yrepeat,changedir,smooshyalign,1);
|
|
if (sprite[searchwall].yrepeat < 4)
|
|
sprite[searchwall].yrepeat = 4;
|
|
message("Sprite %d repeat: %d, %d",searchwall,sprite[searchwall].xrepeat,sprite[searchwall].yrepeat);
|
|
}
|
|
}
|
|
asksave = 1;
|
|
repeatcounty = max(1,repeatcounty-2);
|
|
}
|
|
repeatcounty += synctics;
|
|
}
|
|
else
|
|
repeatcounty = 0;
|
|
|
|
if (keystatus[KEYSC_F11]) //F11 - brightness
|
|
{
|
|
extern int16_t brightness;
|
|
|
|
keystatus[KEYSC_F11] = 0;
|
|
|
|
if (eitherSHIFT)
|
|
{
|
|
brightness--;
|
|
if (brightness < 0) brightness = 15;
|
|
}
|
|
else
|
|
{
|
|
brightness++;
|
|
if (brightness >= 16) brightness = 0;
|
|
}
|
|
|
|
vid_gamma = 1.0 + ((float)brightness / 10.0);
|
|
setbrightness(brightness,palette,0);
|
|
message("Brightness: %d/16",brightness+1);
|
|
}
|
|
|
|
if (keystatus[KEYSC_TAB]) //TAB
|
|
{
|
|
if (searchstat == 0)
|
|
{
|
|
temppicnum = wall[searchbottomwall].picnum;
|
|
tempshade = wall[searchbottomwall].shade;
|
|
temppal = wall[searchbottomwall].pal;
|
|
tempxrepeat = wall[searchbottomwall].xrepeat;
|
|
tempyrepeat = wall[searchbottomwall].yrepeat;
|
|
tempcstat = wall[searchbottomwall].cstat;
|
|
templotag = wall[searchbottomwall].lotag;
|
|
temphitag = wall[searchbottomwall].hitag;
|
|
tempextra = wall[searchbottomwall].extra;
|
|
}
|
|
if (searchstat == 1)
|
|
{
|
|
temppicnum = sector[searchsector].ceilingpicnum;
|
|
tempshade = sector[searchsector].ceilingshade;
|
|
temppal = sector[searchsector].ceilingpal;
|
|
tempvis = sector[searchsector].visibility;
|
|
tempxrepeat = sector[searchsector].ceilingxpanning;
|
|
tempyrepeat = sector[searchsector].ceilingypanning;
|
|
tempcstat = sector[searchsector].ceilingstat;
|
|
templotag = sector[searchsector].lotag;
|
|
temphitag = sector[searchsector].hitag;
|
|
tempextra = sector[searchsector].extra;
|
|
}
|
|
if (searchstat == 2)
|
|
{
|
|
temppicnum = sector[searchsector].floorpicnum;
|
|
tempshade = sector[searchsector].floorshade;
|
|
temppal = sector[searchsector].floorpal;
|
|
tempvis = sector[searchsector].visibility;
|
|
tempxrepeat = sector[searchsector].floorxpanning;
|
|
tempyrepeat = sector[searchsector].floorypanning;
|
|
tempcstat = sector[searchsector].floorstat;
|
|
templotag = sector[searchsector].lotag;
|
|
temphitag = sector[searchsector].hitag;
|
|
tempextra = sector[searchsector].extra;
|
|
}
|
|
if (searchstat == 3)
|
|
{
|
|
temppicnum = sprite[searchwall].picnum;
|
|
tempshade = sprite[searchwall].shade;
|
|
temppal = sprite[searchwall].pal;
|
|
tempxrepeat = sprite[searchwall].xrepeat;
|
|
tempyrepeat = sprite[searchwall].yrepeat;
|
|
tempcstat = sprite[searchwall].cstat;
|
|
templotag = sprite[searchwall].lotag;
|
|
temphitag = sprite[searchwall].hitag;
|
|
tempextra = sprite[searchwall].extra;
|
|
tempxvel = sprite[searchwall].xvel;
|
|
tempyvel = sprite[searchwall].yvel;
|
|
tempzvel = sprite[searchwall].zvel;
|
|
}
|
|
if (searchstat == 4)
|
|
{
|
|
temppicnum = wall[searchwall].overpicnum;
|
|
tempshade = wall[searchwall].shade;
|
|
temppal = wall[searchwall].pal;
|
|
tempxrepeat = wall[searchwall].xrepeat;
|
|
tempyrepeat = wall[searchwall].yrepeat;
|
|
tempcstat = wall[searchwall].cstat;
|
|
templotag = wall[searchwall].lotag;
|
|
temphitag = wall[searchwall].hitag;
|
|
tempextra = wall[searchwall].extra;
|
|
}
|
|
somethingintab = searchstat;
|
|
keystatus[KEYSC_TAB] = 0;
|
|
}
|
|
|
|
if (keystatus[KEYSC_ENTER])
|
|
{
|
|
extern char pskysearch[MAXSECTORS];
|
|
int16_t daang;
|
|
int32_t dashade[2];
|
|
if (eitherSHIFT)
|
|
{
|
|
if (((searchstat == 0) || (searchstat == 4)) && eitherCTRL) //Ctrl-shift Enter (auto-shade)
|
|
{
|
|
dashade[0] = 127;
|
|
dashade[1] = -128;
|
|
i = searchwall;
|
|
do
|
|
{
|
|
if ((int32_t)wall[i].shade < dashade[0]) dashade[0] = wall[i].shade;
|
|
if ((int32_t)wall[i].shade > dashade[1]) dashade[1] = wall[i].shade;
|
|
|
|
i = wall[i].point2;
|
|
}
|
|
while (i != searchwall);
|
|
|
|
daang = getangle(wall[wall[searchwall].point2].x-wall[searchwall].x,wall[wall[searchwall].point2].y-wall[searchwall].y);
|
|
i = searchwall;
|
|
do
|
|
{
|
|
j = getangle(wall[wall[i].point2].x-wall[i].x,wall[wall[i].point2].y-wall[i].y);
|
|
k = ((j+2048-daang)&2047);
|
|
if (k > 1024)
|
|
k = 2048-k;
|
|
wall[i].shade = dashade[0]+mulscale10(k,dashade[1]-dashade[0]);
|
|
|
|
i = wall[i].point2;
|
|
}
|
|
while (i != searchwall);
|
|
message("Wall %d auto-shaded",searchwall);
|
|
}
|
|
else if (somethingintab < 255)
|
|
{
|
|
if (searchstat == 0)
|
|
{
|
|
wall[searchbottomwall].shade = tempshade;
|
|
wall[searchbottomwall].pal = temppal;
|
|
}
|
|
if (searchstat == 1)
|
|
{
|
|
sector[searchsector].ceilingshade = tempshade, sector[searchsector].ceilingpal = temppal;
|
|
if ((somethingintab == 1) || (somethingintab == 2))
|
|
sector[searchsector].visibility = tempvis;
|
|
}
|
|
if (searchstat == 2)
|
|
{
|
|
sector[searchsector].floorshade = tempshade, sector[searchsector].floorpal = temppal;
|
|
if ((somethingintab == 1) || (somethingintab == 2))
|
|
sector[searchsector].visibility = tempvis;
|
|
}
|
|
if (searchstat == 3) sprite[searchwall].shade = tempshade, sprite[searchwall].pal = temppal;
|
|
if (searchstat == 4) wall[searchwall].shade = tempshade, wall[searchwall].pal = temppal;
|
|
message("Pasted shading+pal");
|
|
}
|
|
}
|
|
else if (((searchstat == 0) || (searchstat == 4)) && eitherCTRL && (somethingintab < 255)) //Either ctrl key
|
|
{
|
|
i = searchwall;
|
|
do
|
|
{
|
|
wall[i].picnum = temppicnum;
|
|
wall[i].shade = tempshade;
|
|
wall[i].pal = temppal;
|
|
if ((somethingintab == 0) || (somethingintab == 4))
|
|
{
|
|
wall[i].xrepeat = tempxrepeat;
|
|
wall[i].yrepeat = tempyrepeat;
|
|
wall[i].cstat = tempcstat;
|
|
}
|
|
fixrepeats((int16_t)i);
|
|
i = wall[i].point2;
|
|
}
|
|
while (i != searchwall);
|
|
message("Pasted picnum+shading+pal");
|
|
}
|
|
else if (((searchstat == 1) || (searchstat == 2)) && eitherCTRL && (somethingintab < 255)) //Either ctrl key
|
|
{
|
|
clearbuf(&pskysearch[0],(int32_t)((numsectors+3)>>2),0L);
|
|
if (searchstat == 1)
|
|
{
|
|
i = searchsector;
|
|
if ((sector[i].ceilingstat&1) > 0)
|
|
pskysearch[i] = 1;
|
|
|
|
while (pskysearch[i] == 1)
|
|
{
|
|
sector[i].ceilingpicnum = temppicnum;
|
|
sector[i].ceilingshade = tempshade;
|
|
sector[i].ceilingpal = temppal;
|
|
if ((somethingintab == 1) || (somethingintab == 2))
|
|
{
|
|
sector[i].ceilingxpanning = tempxrepeat;
|
|
sector[i].ceilingypanning = tempyrepeat;
|
|
sector[i].ceilingstat = tempcstat;
|
|
}
|
|
pskysearch[i] = 2;
|
|
|
|
startwall = sector[i].wallptr;
|
|
endwall = startwall + sector[i].wallnum - 1;
|
|
for (j=startwall; j<=endwall; j++)
|
|
{
|
|
k = wall[j].nextsector;
|
|
if (k >= 0)
|
|
if ((sector[k].ceilingstat&1) > 0)
|
|
if (pskysearch[k] == 0)
|
|
pskysearch[k] = 1;
|
|
}
|
|
|
|
for (j=0; j<numsectors; j++)
|
|
if (pskysearch[j] == 1)
|
|
i = j;
|
|
}
|
|
}
|
|
if (searchstat == 2)
|
|
{
|
|
i = searchsector;
|
|
if ((sector[i].floorstat&1) > 0)
|
|
pskysearch[i] = 1;
|
|
|
|
while (pskysearch[i] == 1)
|
|
{
|
|
sector[i].floorpicnum = temppicnum;
|
|
sector[i].floorshade = tempshade;
|
|
sector[i].floorpal = temppal;
|
|
if ((somethingintab == 1) || (somethingintab == 2))
|
|
{
|
|
sector[i].floorxpanning = tempxrepeat;
|
|
sector[i].floorypanning = tempyrepeat;
|
|
sector[i].floorstat = tempcstat;
|
|
}
|
|
pskysearch[i] = 2;
|
|
|
|
startwall = sector[i].wallptr;
|
|
endwall = startwall + sector[i].wallnum - 1;
|
|
for (j=startwall; j<=endwall; j++)
|
|
{
|
|
k = wall[j].nextsector;
|
|
if (k >= 0)
|
|
if ((sector[k].floorstat&1) > 0)
|
|
if (pskysearch[k] == 0)
|
|
pskysearch[k] = 1;
|
|
}
|
|
|
|
for (j=0; j<numsectors; j++)
|
|
if (pskysearch[j] == 1)
|
|
i = j;
|
|
}
|
|
}
|
|
message("Pasted picnum+shading+pal");
|
|
}
|
|
else if (somethingintab < 255)
|
|
{
|
|
if (searchstat == 0)
|
|
{
|
|
wall[searchbottomwall].picnum = temppicnum;
|
|
wall[searchbottomwall].shade = tempshade;
|
|
wall[searchbottomwall].pal = temppal;
|
|
if (somethingintab == 0 && searchwall==searchbottomwall)
|
|
{
|
|
wall[searchwall].xrepeat = tempxrepeat;
|
|
wall[searchwall].yrepeat = tempyrepeat;
|
|
wall[searchwall].cstat = tempcstat;
|
|
wall[searchwall].lotag = templotag;
|
|
wall[searchwall].hitag = temphitag;
|
|
wall[searchwall].extra = tempextra;
|
|
}
|
|
fixrepeats(searchwall);
|
|
}
|
|
if (searchstat == 1)
|
|
{
|
|
sector[searchsector].ceilingpicnum = temppicnum;
|
|
sector[searchsector].ceilingshade = tempshade;
|
|
sector[searchsector].ceilingpal = temppal;
|
|
if ((somethingintab == 1) || (somethingintab == 2))
|
|
{
|
|
sector[searchsector].ceilingxpanning = tempxrepeat;
|
|
sector[searchsector].ceilingypanning = tempyrepeat;
|
|
sector[searchsector].ceilingstat = tempcstat;
|
|
sector[searchsector].visibility = tempvis;
|
|
sector[searchsector].lotag = templotag;
|
|
sector[searchsector].hitag = temphitag;
|
|
sector[searchsector].extra = tempextra;
|
|
}
|
|
}
|
|
if (searchstat == 2)
|
|
{
|
|
sector[searchsector].floorpicnum = temppicnum;
|
|
sector[searchsector].floorshade = tempshade;
|
|
sector[searchsector].floorpal = temppal;
|
|
if ((somethingintab == 1) || (somethingintab == 2))
|
|
{
|
|
sector[searchsector].floorxpanning= tempxrepeat;
|
|
sector[searchsector].floorypanning= tempyrepeat;
|
|
sector[searchsector].floorstat = tempcstat;
|
|
sector[searchsector].visibility = tempvis;
|
|
sector[searchsector].lotag = templotag;
|
|
sector[searchsector].hitag = temphitag;
|
|
sector[searchsector].extra = tempextra;
|
|
}
|
|
}
|
|
if (searchstat == 3)
|
|
{
|
|
sprite[searchwall].picnum = temppicnum;
|
|
if ((tilesizx[temppicnum] <= 0) || (tilesizy[temppicnum] <= 0))
|
|
{
|
|
j = 0;
|
|
for (k=0; k<MAXTILES; k++)
|
|
if ((tilesizx[k] > 0) && (tilesizy[k] > 0))
|
|
{
|
|
j = k;
|
|
break;
|
|
}
|
|
sprite[searchwall].picnum = j;
|
|
}
|
|
sprite[searchwall].shade = tempshade;
|
|
sprite[searchwall].pal = temppal;
|
|
if (somethingintab == 3)
|
|
{
|
|
sprite[searchwall].xrepeat = tempxrepeat;
|
|
sprite[searchwall].yrepeat = tempyrepeat;
|
|
if (sprite[searchwall].xrepeat < 1) sprite[searchwall].xrepeat = 1;
|
|
if (sprite[searchwall].yrepeat < 1) sprite[searchwall].yrepeat = 1;
|
|
sprite[searchwall].cstat = tempcstat;
|
|
sprite[searchwall].lotag = templotag;
|
|
sprite[searchwall].hitag = temphitag;
|
|
sprite[searchwall].extra = tempextra;
|
|
sprite[searchwall].xvel = tempxvel;
|
|
sprite[searchwall].yvel = tempyvel;
|
|
sprite[searchwall].zvel = tempzvel;
|
|
}
|
|
}
|
|
if (searchstat == 4)
|
|
{
|
|
wall[searchwall].overpicnum = temppicnum;
|
|
if (wall[searchwall].nextwall >= 0)
|
|
wall[wall[searchwall].nextwall].overpicnum = temppicnum;
|
|
wall[searchwall].shade = tempshade;
|
|
wall[searchwall].pal = temppal;
|
|
if (somethingintab == 4)
|
|
{
|
|
wall[searchwall].xrepeat = tempxrepeat;
|
|
wall[searchwall].yrepeat = tempyrepeat;
|
|
wall[searchwall].cstat = tempcstat;
|
|
wall[searchwall].lotag = templotag;
|
|
wall[searchwall].hitag = temphitag;
|
|
wall[searchwall].extra = tempextra;
|
|
}
|
|
fixrepeats(searchwall);
|
|
}
|
|
message("Pasted clipboard");
|
|
}
|
|
asksave = 1;
|
|
keystatus[KEYSC_ENTER] = 0;
|
|
}
|
|
|
|
if (keystatus[KEYSC_C])
|
|
{
|
|
keystatus[KEYSC_C] = 0;
|
|
if (eitherALT)
|
|
{
|
|
if (somethingintab < 255)
|
|
{
|
|
switch (searchstat)
|
|
{
|
|
case 0:
|
|
j = wall[searchbottomwall].picnum;
|
|
for (i=0; i<numwalls; i++)
|
|
if (wall[i].picnum == j) wall[i].picnum = temppicnum;
|
|
break;
|
|
case 1:
|
|
j = sector[searchsector].ceilingpicnum;
|
|
for (i=0; i<numsectors; i++)
|
|
if (sector[i].ceilingpicnum == j) sector[i].ceilingpicnum = temppicnum;
|
|
break;
|
|
case 2:
|
|
j = sector[searchsector].floorpicnum;
|
|
for (i=0; i<numsectors; i++)
|
|
if (sector[i].floorpicnum == j) sector[i].floorpicnum = temppicnum;
|
|
break;
|
|
case 3:
|
|
j = sprite[searchwall].picnum;
|
|
for (i=0; i<MAXSPRITES; i++)
|
|
if (sprite[i].statnum < MAXSTATUS)
|
|
if (sprite[i].picnum == j) sprite[i].picnum = temppicnum;
|
|
break;
|
|
case 4:
|
|
j = wall[searchwall].overpicnum;
|
|
for (i=0; i<numwalls; i++)
|
|
if (wall[i].overpicnum == j) wall[i].overpicnum = temppicnum;
|
|
break;
|
|
}
|
|
message("Picnums replaced");
|
|
asksave = 1;
|
|
}
|
|
}
|
|
else //C
|
|
{
|
|
if (searchstat == 3)
|
|
{
|
|
sprite[searchwall].cstat ^= 128;
|
|
message("Sprite %d center bit %s",searchwall,(sprite[searchwall].cstat&128)?"ON":"OFF");
|
|
asksave = 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (keystatus[KEYSC_SLASH]) // /? Reset panning&repeat to 0
|
|
{
|
|
if ((searchstat == 0) || (searchstat == 4))
|
|
{
|
|
int16_t w = (searchstat==0)?searchbottomwall:searchwall;
|
|
wall[w].xpanning = 0;
|
|
wall[w].ypanning = 0;
|
|
wall[w].xrepeat = 8;
|
|
wall[w].yrepeat = 8;
|
|
wall[w].cstat = 0;
|
|
fixrepeats((int16_t)searchwall);
|
|
}
|
|
if (searchstat == 1)
|
|
{
|
|
sector[searchsector].ceilingxpanning = 0;
|
|
sector[searchsector].ceilingypanning = 0;
|
|
sector[searchsector].ceilingstat &= ~2;
|
|
sector[searchsector].ceilingheinum = 0;
|
|
}
|
|
if (searchstat == 2)
|
|
{
|
|
sector[searchsector].floorxpanning = 0;
|
|
sector[searchsector].floorypanning = 0;
|
|
sector[searchsector].floorstat &= ~2;
|
|
sector[searchsector].floorheinum = 0;
|
|
}
|
|
if (searchstat == 3)
|
|
{
|
|
if (eitherSHIFT)
|
|
{
|
|
sprite[searchwall].xrepeat = sprite[searchwall].yrepeat;
|
|
}
|
|
else
|
|
{
|
|
sprite[searchwall].xrepeat = 64;
|
|
sprite[searchwall].yrepeat = 64;
|
|
}
|
|
}
|
|
message("%s's size and panning reset",type2str[searchstat]);
|
|
keystatus[KEYSC_SLASH] = 0;
|
|
asksave = 1;
|
|
}
|
|
|
|
if (keystatus[KEYSC_P]) // P (parallaxing sky)
|
|
{
|
|
if (eitherCTRL)
|
|
{
|
|
parallaxtype++;
|
|
if (parallaxtype == 3)
|
|
parallaxtype = 0;
|
|
sector[searchsector].ceilingstat ^= 1;
|
|
message("Parallax type %d",parallaxtype);
|
|
}
|
|
else if (eitherALT)
|
|
{
|
|
switch (searchstat)
|
|
{
|
|
case 0:
|
|
Bstrcpy(buffer,"Wall pal: ");
|
|
getnumberptr256(buffer,&wall[searchbottomwall].pal,sizeof(wall[searchbottomwall].pal),256L,0,NULL);
|
|
break;
|
|
case 4:
|
|
Bstrcpy(buffer,"Wall pal: ");
|
|
getnumberptr256(buffer,&wall[searchwall].pal,sizeof(wall[searchwall].pal),256L,0,NULL);
|
|
break;
|
|
case 1:
|
|
Bstrcpy(buffer,"Ceiling pal: ");
|
|
getnumberptr256(buffer,§or[searchsector].ceilingpal,sizeof(sector[searchsector].ceilingpal),256L,0,NULL);
|
|
break;
|
|
case 2:
|
|
Bstrcpy(buffer,"Floor pal: ");
|
|
getnumberptr256(buffer,§or[searchsector].floorpal,sizeof(sector[searchsector].floorpal),256L,0,NULL);
|
|
break;
|
|
case 3:
|
|
Bstrcpy(buffer,"Sprite pal: ");
|
|
getnumberptr256(buffer,&sprite[searchwall].pal,sizeof(sprite[searchwall].pal),256L,0,NULL);
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ((searchstat == 0) || (searchstat == 1) || (searchstat == 4))
|
|
{
|
|
sector[searchsector].ceilingstat ^= 1;
|
|
message("Sector %d ceiling parallax bit %s",searchsector,sector[searchsector].ceilingstat&1?"ON":"OFF");
|
|
asksave = 1;
|
|
}
|
|
else if (searchstat == 2)
|
|
{
|
|
sector[searchsector].floorstat ^= 1;
|
|
message("Sector %d floor parallax bit %s",searchsector,sector[searchsector].floorstat&1?"ON":"OFF");
|
|
asksave = 1;
|
|
}
|
|
}
|
|
keystatus[KEYSC_P] = 0;
|
|
}
|
|
|
|
if (keystatus[KEYSC_D]) //Alt-D (adjust sprite[].clipdist)
|
|
{
|
|
keystatus[KEYSC_D] = 0;
|
|
if (eitherALT)
|
|
{
|
|
if (searchstat == 3)
|
|
{
|
|
Bstrcpy(buffer,"Sprite clipdist: ");
|
|
sprite[searchwall].clipdist = getnumber256(buffer,sprite[searchwall].clipdist,256L,0);
|
|
}
|
|
}
|
|
}
|
|
|
|
X_OnEvent(EVENT_KEYS3D, -1);
|
|
}// end 3d
|
|
|
|
static void DoSpriteSearch(int32_t dir) // <0: backwards, >=0: forwards
|
|
{
|
|
char did_wrap = 0;
|
|
int32_t i, j, k = 0;
|
|
|
|
for (dir<0 ? gs_cursprite-- : gs_cursprite++;; dir<0 ? gs_cursprite-- : gs_cursprite++)
|
|
{
|
|
if (gs_cursprite < 0)
|
|
{
|
|
if (!did_wrap)
|
|
{
|
|
did_wrap = 1;
|
|
gs_cursprite = MAXSPRITES-1;
|
|
}
|
|
else break;
|
|
}
|
|
if (gs_cursprite >= MAXSPRITES)
|
|
{
|
|
if (!did_wrap)
|
|
{
|
|
did_wrap = 1;
|
|
gs_cursprite = 0;
|
|
}
|
|
else break;
|
|
}
|
|
|
|
if (sprite[gs_cursprite].statnum == MAXSTATUS) continue;
|
|
|
|
for (i=0; i<3; i++)
|
|
for (j=0; i==1 ? j<6 : j<7; j++)
|
|
{
|
|
if (!gs_spritewhat[i][j]) continue;
|
|
|
|
if (i==0)
|
|
{
|
|
switch (j)
|
|
{
|
|
case 0: k = sprite[gs_cursprite].x; break;
|
|
case 1: k = sprite[gs_cursprite].y; break;
|
|
case 2: k = sprite[gs_cursprite].z; break;
|
|
case 3: k = sprite[gs_cursprite].sectnum; break;
|
|
case 4: k = sprite[gs_cursprite].statnum; break;
|
|
case 5: k = sprite[gs_cursprite].hitag; break;
|
|
case 6: k = sprite[gs_cursprite].lotag; break;
|
|
}
|
|
}
|
|
if (i==1)
|
|
{
|
|
switch (j)
|
|
{
|
|
case 0:
|
|
k = sprite[gs_cursprite].cstat;
|
|
k &= gs_sprite[1][0];
|
|
break;
|
|
case 1: k = sprite[gs_cursprite].shade; break;
|
|
case 2: k = sprite[gs_cursprite].pal; break;
|
|
case 3:
|
|
k = gs_sprite[1][3];
|
|
if (k != sprite[gs_cursprite].xrepeat &&
|
|
k != sprite[gs_cursprite].yrepeat)
|
|
goto NEXTSPRITE;
|
|
break;
|
|
case 4:
|
|
k = gs_sprite[1][4];
|
|
if (k != sprite[gs_cursprite].xoffset &&
|
|
k != sprite[gs_cursprite].yoffset)
|
|
goto NEXTSPRITE;
|
|
break;
|
|
case 5: k = sprite[gs_cursprite].picnum; break;
|
|
}
|
|
}
|
|
if (i==2)
|
|
{
|
|
switch (j)
|
|
{
|
|
case 0: k = sprite[gs_cursprite].ang; break;
|
|
case 1: k = sprite[gs_cursprite].xvel; break;
|
|
case 2: k = sprite[gs_cursprite].yvel; break;
|
|
case 3: k = sprite[gs_cursprite].zvel; break;
|
|
case 4: k = sprite[gs_cursprite].owner; break;
|
|
case 5: k = sprite[gs_cursprite].clipdist; break;
|
|
case 6: k = sprite[gs_cursprite].extra; break;
|
|
}
|
|
}
|
|
|
|
if (k != gs_sprite[i][j]) goto NEXTSPRITE;
|
|
}
|
|
|
|
// found matching sprite
|
|
pos.x = sprite[gs_cursprite].x;
|
|
pos.y = sprite[gs_cursprite].y;
|
|
ang = sprite[gs_cursprite].ang;
|
|
|
|
printmessage16("%s Sprite seach%s: found sprite %d", dir<0 ? "<" : ">",
|
|
did_wrap ? " (wrap)" : "", gs_cursprite);
|
|
did_wrap = 0;
|
|
return;
|
|
|
|
NEXTSPRITE:
|
|
;
|
|
}
|
|
printmessage16("%s Sprite search: none found", dir<0 ? "<" : ">");
|
|
}
|
|
|
|
extern int32_t graphicsmode;
|
|
|
|
static void Keys2d(void)
|
|
{
|
|
int16_t temp=0;
|
|
int32_t i=0, j,k;
|
|
int32_t smooshyalign,changedir;
|
|
static int32_t repeatcountx=0,repeatcounty=0;
|
|
|
|
/*
|
|
for(i=0;i<0x50;i++)
|
|
{if(keystatus[i]==1) {Bsprintf(tempbuf,"key %d",i); printmessage16(tempbuf);
|
|
}}
|
|
*/
|
|
|
|
cursectornum = -1;
|
|
|
|
for (i=0; i<numsectors; i++)
|
|
{
|
|
if (inside(mousxplc,mousyplc,i) == 1)
|
|
{
|
|
cursectornum = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
searchsector=cursectornum;
|
|
|
|
if (eitherCTRL && keystatus[KEYSC_Z]) // CTRL+Z
|
|
{
|
|
keystatus[KEYSC_Z] = 0;
|
|
if (eitherSHIFT)
|
|
{
|
|
if (map_undoredo(1)) message("Nothing to redo!");
|
|
else message("Restored revision %d",map_revision-1);
|
|
}
|
|
else
|
|
{
|
|
if (map_undoredo(0)) message("Nothing to undo!");
|
|
else message("Revision %d undone",map_revision);
|
|
}
|
|
}
|
|
|
|
if (keystatus[KEYSC_TAB]) //TAB
|
|
{
|
|
if (cursectornum >= 0)
|
|
showsectordata((int16_t)i+16384);
|
|
}
|
|
else if (!(keystatus[KEYSC_F5]|keystatus[KEYSC_F6]|keystatus[KEYSC_F7]|keystatus[KEYSC_F8]))
|
|
{
|
|
static int32_t counter = 0;
|
|
static int32_t opointhighlight, olinehighlight, ocursectornum;
|
|
|
|
if (pointhighlight == opointhighlight && linehighlight == olinehighlight && cursectornum == ocursectornum)
|
|
counter++;
|
|
else counter = 0;
|
|
|
|
opointhighlight = pointhighlight;
|
|
olinehighlight = linehighlight;
|
|
ocursectornum = cursectornum;
|
|
|
|
if (counter >= 40)
|
|
{
|
|
if (pointhighlight >= 16384)
|
|
{
|
|
i = pointhighlight-16384;
|
|
showspritedata((int16_t)i+16384);
|
|
|
|
if (sprite[i].picnum==SECTOREFFECTOR)
|
|
{
|
|
char buffer[80];
|
|
|
|
Bsprintf(buffer,"^10%s",SectorEffectorText(i));
|
|
_printmessage16(buffer);
|
|
}
|
|
}
|
|
else if ((linehighlight >= 0) && (bstatus&1 || sectorofwall(linehighlight) == cursectornum))
|
|
{
|
|
showwalldata((int16_t)linehighlight+16384);
|
|
}
|
|
else if (cursectornum >= 0)
|
|
{
|
|
showsectordata((int16_t)cursectornum+16384);
|
|
}
|
|
}
|
|
if (totalclock < (lastpm16time + 120*2))
|
|
_printmessage16(lastpm16buf);
|
|
}
|
|
/*
|
|
if ((totalclock > getmessagetimeoff) && (totalclock > (lastpm16time + 120*3)))
|
|
{
|
|
if (pointhighlight >= 16384)
|
|
{
|
|
char tmpbuf[2048];
|
|
i = pointhighlight-16384;
|
|
if (strlen(names[sprite[i].picnum]) > 0)
|
|
{
|
|
if (sprite[i].picnum==SECTOREFFECTOR)
|
|
Bsprintf(tmpbuf,"Sprite %d %s, hi:%d ex:%d",i,SectorEffectorText(i),sprite[i].hitag,sprite[i].extra);
|
|
else Bsprintf(tmpbuf,"Sprite %d %s: lo:%d hi:%d ex:%d",i,names[sprite[i].picnum],sprite[i].lotag,sprite[i].hitag,sprite[i].extra);
|
|
}
|
|
else Bsprintf(tmpbuf,"Sprite %d picnum %d: lo:%d hi:%d ex:%d",i,sprite[i].picnum,sprite[i].lotag,sprite[i].hitag,sprite[i].extra);
|
|
_printmessage16(tmpbuf);
|
|
}
|
|
else if ((linehighlight >= 0) && (sectorofwall(linehighlight) == cursectornum))
|
|
{
|
|
int32_t dax, day, dist;
|
|
dax = wall[linehighlight].x-wall[wall[linehighlight].point2].x;
|
|
day = wall[linehighlight].y-wall[wall[linehighlight].point2].y;
|
|
dist = ksqrt(dax*dax+day*day);
|
|
Bsprintf(tempbuf,"Wall %d: length:%d lo:%d hi:%d ex:%d",linehighlight,dist,wall[linehighlight].lotag,wall[linehighlight].hitag,wall[linehighlight].extra);
|
|
_printmessage16(tempbuf);
|
|
}
|
|
else if (cursectornum >= 0)
|
|
{
|
|
Bsprintf(tempbuf,"Sector %d: lo:%d hi:%d ex:%d",cursectornum,sector[cursectornum].lotag,sector[cursectornum].hitag,sector[cursectornum].extra);
|
|
_printmessage16(tempbuf);
|
|
}
|
|
else _printmessage16("");
|
|
}
|
|
*/
|
|
|
|
if (keystatus[KEYSC_QUOTE] && keystatus[KEYSC_Z]) // ' z
|
|
{
|
|
keystatus[KEYSC_Z] = 0;
|
|
|
|
editorzrange[0]=getnumber16("Upper Z range: ",editorzrange[0],INT32_MAX,1);
|
|
editorzrange[1]=getnumber16("Lower Z range: ",editorzrange[1],INT32_MAX,1);
|
|
// printmessage16("");
|
|
}
|
|
|
|
if (keystatus[0x14]) // T (tag)
|
|
{
|
|
char buffer[80];
|
|
|
|
keystatus[0x14] = 0;
|
|
if (keystatus[0x1d]|keystatus[0x9d]) //Ctrl-T
|
|
{
|
|
extern int16_t showtags;
|
|
|
|
showtags ^= 1;
|
|
if (showtags == 0)
|
|
printmessage16("Show tags OFF");
|
|
else
|
|
printmessage16("Show tags ON");
|
|
}
|
|
else if (keystatus[0x38]|keystatus[0xb8]) //ALT
|
|
{
|
|
if (pointhighlight >= 16384)
|
|
{
|
|
i = pointhighlight-16384;
|
|
Bsprintf(buffer,"Sprite (%d) Lo-tag: ",i);
|
|
if (sprite[i].picnum == SECTOREFFECTOR)
|
|
sprite[i].lotag = _getnumber16(buffer,sprite[i].lotag,65536L,0,(void *)SectorEffectorTagText);
|
|
else sprite[i].lotag = getnumber16(buffer,sprite[i].lotag,65536L,0);
|
|
clearmidstatbar16();
|
|
showspritedata((int16_t)i);
|
|
}
|
|
else if (linehighlight >= 0)
|
|
{
|
|
i = linehighlight;
|
|
Bsprintf(buffer,"Wall (%d) Lo-tag: ",i);
|
|
wall[i].lotag = getnumber16(buffer,wall[i].lotag,65536L,0);
|
|
clearmidstatbar16();
|
|
showwalldata((int16_t)i);
|
|
}
|
|
// printmessage16("");
|
|
}
|
|
else
|
|
{
|
|
for (i=0; i<numsectors; i++)
|
|
if (inside(mousxplc,mousyplc,i) == 1)
|
|
{
|
|
Bsprintf(buffer,"Sector (%d) Lo-tag: ",i);
|
|
j = qsetmode;
|
|
qsetmode = 200;
|
|
sector[i].lotag = _getnumber16(buffer,sector[i].lotag,65536L,0,(void *)ExtGetSectorType);
|
|
qsetmode = j;
|
|
clearmidstatbar16();
|
|
showsectordata((int16_t)i);
|
|
break;
|
|
}
|
|
// printmessage16("");
|
|
}
|
|
}
|
|
|
|
if (keystatus[KEYSC_F1] || (keystatus[KEYSC_QUOTE] && keystatus[KEYSC_TILDE])) //F1 or ' ~
|
|
{
|
|
keystatus[KEYSC_F1]=0;
|
|
// PK_
|
|
if (numhelppages>0) IntegratedHelp();
|
|
else printmessage16("m32help.hlp invalid or not found!");
|
|
}
|
|
|
|
if (keystatus[KEYSC_F2])
|
|
{
|
|
keystatus[KEYSC_F2]=0;
|
|
|
|
if (g_numsounds > 0)
|
|
SoundDisplay();
|
|
}
|
|
|
|
getpoint(searchx,searchy,&mousxplc,&mousyplc);
|
|
ppointhighlight = getpointhighlight(mousxplc,mousyplc, ppointhighlight);
|
|
|
|
if ((ppointhighlight&0xc000) == 16384)
|
|
{
|
|
// sprite[ppointhighlight&16383].cstat ^= 1;
|
|
cursprite=(ppointhighlight&16383);
|
|
}
|
|
|
|
if (keystatus[KEYSC_F9]) // F9 f1=3b
|
|
{
|
|
keystatus[KEYSC_F9] = 0;
|
|
Show2dText("sthelp.hlp");
|
|
}
|
|
|
|
/* start Mapster32 */
|
|
|
|
if (keystatus[KEYSC_F4])
|
|
{
|
|
showfirstwall = !showfirstwall;
|
|
message("Sector firstwall highlight %s",showfirstwall?"enabled":"disabled");
|
|
keystatus[KEYSC_F4] = 0;
|
|
}
|
|
|
|
if (keystatus[KEYSC_M]) // M (tag)
|
|
{
|
|
keystatus[KEYSC_M] = 0;
|
|
if (eitherALT) //ALT
|
|
{
|
|
if (pointhighlight >= 16384)
|
|
{
|
|
i = pointhighlight-16384;
|
|
Bsprintf(tempbuf,"Sprite %d Extra: ",i);
|
|
sprite[i].extra = getnumber16(tempbuf,sprite[i].extra,65536L,1);
|
|
clearmidstatbar16();
|
|
showspritedata((int16_t)i);
|
|
}
|
|
else if (linehighlight >= 0)
|
|
{
|
|
i = linehighlight;
|
|
Bsprintf(tempbuf,"Wall %d Extra: ",i);
|
|
wall[i].extra = getnumber16(tempbuf,wall[i].extra,65536L,1);
|
|
clearmidstatbar16();
|
|
showwalldata((int16_t)i);
|
|
}
|
|
// printmessage16("");
|
|
}
|
|
else
|
|
{
|
|
for (i=0; i<numsectors; i++)
|
|
if (inside(mousxplc,mousyplc,i) == 1)
|
|
{
|
|
Bsprintf(tempbuf,"Sector %d Extra: ",i);
|
|
sector[i].extra = getnumber16(tempbuf,sector[i].extra,65536L,1);
|
|
clearmidstatbar16();
|
|
showsectordata((int16_t)i);
|
|
break;
|
|
}
|
|
// printmessage16("");
|
|
}
|
|
}
|
|
|
|
if (keystatus[KEYSC_E]) // E (expand)
|
|
{
|
|
for (i=0; i<numsectors; i++)
|
|
if (inside(mousxplc,mousyplc,i) == 1)
|
|
{
|
|
sector[i].floorstat ^= 8;
|
|
message("Sector %d floor texture expansion bit %s",i,sector[i].floorstat&8?"ON":"OFF");
|
|
asksave = 1;
|
|
}
|
|
|
|
keystatus[KEYSC_E] = 0;
|
|
}
|
|
|
|
if (keystatus[KEYSC_SLASH]) // /? Reset panning&repeat to 0
|
|
{
|
|
if ((ppointhighlight&0xc000) == 16384)
|
|
{
|
|
if (eitherSHIFT)
|
|
{
|
|
sprite[cursprite].xrepeat = sprite[cursprite].yrepeat;
|
|
}
|
|
else
|
|
{
|
|
sprite[cursprite].xrepeat = 64;
|
|
sprite[cursprite].yrepeat = 64;
|
|
}
|
|
}
|
|
else if (graphicsmode != 0)
|
|
{
|
|
for (i=0; i<numsectors; i++)
|
|
if (inside(mousxplc,mousyplc,i) == 1)
|
|
{
|
|
sector[i].floorxpanning = sector[i].floorypanning = 0;
|
|
message("Sector %d floor panning reset", i);
|
|
}
|
|
}
|
|
keystatus[KEYSC_SLASH] = 0;
|
|
asksave = 1;
|
|
}
|
|
|
|
if (keystatus[KEYSC_gLEFT] || keystatus[KEYSC_gRIGHT]) // 4 & 6 (keypad 2D)
|
|
{
|
|
smooshyalign = keystatus[KEYSC_gKP5];
|
|
if ((repeatcountx == 0) || (repeatcountx > 32))
|
|
{
|
|
changedir = 0;
|
|
if (keystatus[KEYSC_gLEFT]) changedir = -1;
|
|
if (keystatus[KEYSC_gRIGHT]) changedir = 1;
|
|
|
|
if ((ppointhighlight&0xc000) == 16384 && (sprite[cursprite].cstat & 48))
|
|
{
|
|
sprite[cursprite].xrepeat = changechar(sprite[cursprite].xrepeat,changedir,smooshyalign,1);
|
|
if (sprite[cursprite].xrepeat < 4)
|
|
sprite[cursprite].xrepeat = 4;
|
|
message("Sprite %d repeat: %d, %d",cursprite,sprite[cursprite].xrepeat,sprite[cursprite].yrepeat);
|
|
}
|
|
else
|
|
{
|
|
for (i=0; i<numsectors; i++)
|
|
if (inside(mousxplc,mousyplc,i) == 1)
|
|
{
|
|
sector[i].floorxpanning = changechar(sector[i].floorxpanning,changedir,smooshyalign,0);
|
|
message("Sector %d floor panning: %d, %d",searchsector,sector[i].floorxpanning,sector[i].floorypanning);
|
|
}
|
|
}
|
|
asksave = 1;
|
|
repeatcountx = max(1,repeatcountx-2);
|
|
}
|
|
repeatcountx += synctics;
|
|
}
|
|
else
|
|
repeatcountx = 0;
|
|
|
|
if (keystatus[KEYSC_gUP] || keystatus[KEYSC_gDOWN]) // 2 & 8 (keypad 2D)
|
|
{
|
|
smooshyalign = keystatus[KEYSC_gKP5];
|
|
if ((repeatcounty == 0) || (repeatcounty > 32))
|
|
{
|
|
changedir = 0;
|
|
if (keystatus[KEYSC_gUP]) changedir = -1;
|
|
if (keystatus[KEYSC_gDOWN]) changedir = 1;
|
|
|
|
if ((ppointhighlight&0xc000) == 16384 && (sprite[cursprite].cstat & 48))
|
|
{
|
|
sprite[cursprite].yrepeat = changechar(sprite[cursprite].yrepeat,changedir,smooshyalign,1);
|
|
if (sprite[cursprite].yrepeat < 4)
|
|
sprite[cursprite].yrepeat = 4;
|
|
message("Sprite %d repeat: %d, %d",cursprite,sprite[cursprite].xrepeat,sprite[cursprite].yrepeat);
|
|
}
|
|
else
|
|
{
|
|
for (i=0; i<numsectors; i++)
|
|
if (inside(mousxplc,mousyplc,i) == 1)
|
|
{
|
|
sector[i].floorypanning = changechar(sector[i].floorypanning,changedir,smooshyalign,0);
|
|
message("Sector %d floor panning: %d, %d",searchsector,sector[i].floorxpanning,sector[i].floorypanning);
|
|
}
|
|
}
|
|
asksave = 1;
|
|
repeatcounty = max(1,repeatcounty-2);
|
|
}
|
|
repeatcounty += synctics;
|
|
//}
|
|
}
|
|
else
|
|
repeatcounty = 0;
|
|
|
|
if (keystatus[KEYSC_R]) // R (relative alignment, rotation)
|
|
{
|
|
if (pointhighlight >= 16384)
|
|
{
|
|
i = sprite[cursprite].cstat;
|
|
if ((i&48) < 32) i += 16;
|
|
|
|
else i &= ~48;
|
|
sprite[cursprite].cstat = i;
|
|
|
|
if (sprite[cursprite].cstat&16)
|
|
Bsprintf(getmessage,"Sprite %d now wall aligned",cursprite);
|
|
else if (sprite[cursprite].cstat&32)
|
|
Bsprintf(getmessage,"Sprite %d now floor aligned",cursprite);
|
|
else
|
|
Bsprintf(getmessage,"Sprite %d now view aligned",cursprite);
|
|
message(getmessage);
|
|
asksave = 1;
|
|
|
|
}
|
|
keystatus[KEYSC_R] = 0;
|
|
}
|
|
|
|
|
|
if (keystatus[KEYSC_QUOTE] && keystatus[KEYSC_S]) // ' S
|
|
{
|
|
if (pointhighlight >= 16384)
|
|
{
|
|
keystatus[KEYSC_S] = 0;
|
|
Bsprintf(tempbuf,"Sprite %d xrepeat: ",cursprite);
|
|
sprite[cursprite].xrepeat=getnumber16(tempbuf, sprite[cursprite].xrepeat, 256,0);
|
|
Bsprintf(tempbuf,"Sprite %d yrepeat: ",cursprite);
|
|
sprite[cursprite].yrepeat=getnumber16(tempbuf, sprite[cursprite].yrepeat, 256,0);
|
|
Bsprintf(tempbuf,"Sprite %d updated",i);
|
|
printmessage16(tempbuf);
|
|
}
|
|
}
|
|
|
|
if (keystatus[KEYSC_QUOTE] && keystatus[KEYSC_F]) // ' F
|
|
{
|
|
keystatus[KEYSC_F] = 0;
|
|
FuncMenu();
|
|
}
|
|
|
|
if (keystatus[KEYSC_LBRACK]) // [ search backward
|
|
{
|
|
keystatus[KEYSC_LBRACK]=0;
|
|
if (wallsprite==0)
|
|
{
|
|
SearchSectorsBackward();
|
|
}
|
|
else if (wallsprite==1)
|
|
{
|
|
if (curwallnum>0) curwallnum--;
|
|
for (i=curwallnum; i>=0; i--)
|
|
{
|
|
if (
|
|
(wall[i].picnum==wall[curwall].picnum)
|
|
&&((search_lotag==0)||
|
|
(search_lotag!=0 && search_lotag==wall[i].lotag))
|
|
&&((search_hitag==0)||
|
|
(search_hitag!=0 && search_hitag==wall[i].hitag))
|
|
)
|
|
{
|
|
pos.x=(wall[i].x)-(((wall[i].x)-(wall[wall[i].point2].x))/2);
|
|
pos.y=(wall[i].y)-(((wall[i].y)-(wall[wall[i].point2].y))/2);
|
|
printmessage16("< Wall search: found");
|
|
// curwallnum--;
|
|
keystatus[KEYSC_LBRACK]=0;
|
|
return;
|
|
}
|
|
curwallnum--;
|
|
}
|
|
printmessage16("< Wall search: none found");
|
|
}
|
|
else if (wallsprite==2)
|
|
DoSpriteSearch(-1);
|
|
#if 0
|
|
{
|
|
if (cursearchspritenum>0) cursearchspritenum--;
|
|
for (i=cursearchspritenum; i>=0; i--)
|
|
{
|
|
|
|
if (
|
|
(sprite[i].picnum==sprite[cursearchsprite].picnum &&
|
|
sprite[i].statnum==0)
|
|
&&((search_lotag==0)||
|
|
(search_lotag!=0 && search_lotag==sprite[i].lotag))
|
|
&&((search_hitag==0)||
|
|
(search_hitag!=0 && search_hitag==sprite[i].hitag))
|
|
)
|
|
{
|
|
pos.x=sprite[i].x;
|
|
pos.y=sprite[i].y;
|
|
ang= sprite[i].ang;
|
|
printmessage16("< Sprite search: found");
|
|
// curspritenum--;
|
|
keystatus[KEYSC_LBRACK]=0;
|
|
return;
|
|
}
|
|
cursearchspritenum--;
|
|
}
|
|
printmessage16("< Sprite search: none found");
|
|
}
|
|
#endif
|
|
}
|
|
|
|
|
|
if (keystatus[KEYSC_RBRACK]) // ] search forward
|
|
{
|
|
keystatus[KEYSC_RBRACK]=0;
|
|
if (wallsprite==0)
|
|
{
|
|
SearchSectorsForward();
|
|
}
|
|
else if (wallsprite==1)
|
|
{
|
|
if (curwallnum<MAXWALLS) curwallnum++;
|
|
for (i=curwallnum; i<=MAXWALLS; i++)
|
|
{
|
|
if (
|
|
(wall[i].picnum==wall[curwall].picnum)
|
|
&&((search_lotag==0)||
|
|
(search_lotag!=0 && search_lotag==wall[i].lotag))
|
|
&&((search_hitag==0)||
|
|
(search_hitag!=0 && search_hitag==wall[i].hitag))
|
|
)
|
|
{
|
|
pos.x=(wall[i].x)-(((wall[i].x)-(wall[wall[i].point2].x))/2);
|
|
pos.y=(wall[i].y)-(((wall[i].y)-(wall[wall[i].point2].y))/2);
|
|
printmessage16("> Wall search: found");
|
|
// curwallnum++;
|
|
keystatus[KEYSC_RBRACK]=0;
|
|
return;
|
|
}
|
|
curwallnum++;
|
|
}
|
|
printmessage16("> Wall search: none found");
|
|
}
|
|
else if (wallsprite==2)
|
|
DoSpriteSearch(1);
|
|
#if 0
|
|
{
|
|
if (cursearchspritenum<MAXSPRITES) cursearchspritenum++;
|
|
for (i=cursearchspritenum; i<=MAXSPRITES; i++)
|
|
{
|
|
if (
|
|
(sprite[i].picnum==sprite[cursearchsprite].picnum &&
|
|
sprite[i].statnum==0)
|
|
&&((search_lotag==0)||
|
|
(search_lotag!=0 && search_lotag==sprite[i].lotag))
|
|
&&((search_hitag==0)||
|
|
(search_hitag!=0 && search_hitag==sprite[i].hitag))
|
|
)
|
|
{
|
|
pos.x=sprite[i].x;
|
|
pos.y=sprite[i].y;
|
|
ang= sprite[i].ang;
|
|
printmessage16("> Sprite search: found");
|
|
// curspritenum++;
|
|
keystatus[KEYSC_RBRACK]=0;
|
|
return;
|
|
}
|
|
cursearchspritenum++;
|
|
}
|
|
printmessage16("> Sprite search: none found");
|
|
}
|
|
#endif
|
|
}
|
|
|
|
{
|
|
static int32_t autogrid = 0;
|
|
|
|
if (keystatus[KEYSC_G]) // G (grid on/off)
|
|
{
|
|
if (autogrid)
|
|
{
|
|
grid = 0;
|
|
if (eitherSHIFT)
|
|
grid = 8;
|
|
autogrid = 0;
|
|
}
|
|
else
|
|
{
|
|
grid += eitherSHIFT?-1:1;
|
|
if (grid == -1 || grid == 9)
|
|
{
|
|
switch (grid)
|
|
{
|
|
case -1:
|
|
autogrid = 1;
|
|
grid = 8;
|
|
break;
|
|
case 9:
|
|
autogrid = 1;
|
|
grid = 0;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (autogrid) Bsprintf(tempbuf,"Grid size: 9 (autosize)");
|
|
else if (!grid) Bsprintf(tempbuf,"Grid off");
|
|
else Bsprintf(tempbuf,"Grid size: %d (%d units)",grid,2048>>grid);
|
|
printmessage16(tempbuf);
|
|
keystatus[KEYSC_G] = 0;
|
|
}
|
|
if (autogrid)
|
|
{
|
|
grid = zoom+512;
|
|
if (grid > 65536) grid = 65536;
|
|
grid = scale(grid,6,6144);
|
|
if (grid > 7) grid = 7;
|
|
if (grid < 0) grid = 0;
|
|
}
|
|
}
|
|
|
|
if (keystatus[KEYSC_QUOTE] && keystatus[KEYSC_L]) // ' L
|
|
{
|
|
if (pointhighlight >= 16384)
|
|
{
|
|
i = pointhighlight - 16384;
|
|
Bsprintf(tempbuf,"Sprite %d x: ",i);
|
|
sprite[i].x = getnumber16(tempbuf,sprite[i].x,editorgridextent-1,1);
|
|
Bsprintf(tempbuf,"Sprite %d y: ",i);
|
|
sprite[i].y = getnumber16(tempbuf,sprite[i].y,editorgridextent-1,1);
|
|
Bsprintf(tempbuf,"Sprite %d z: ",i);
|
|
sprite[i].z = getnumber16(tempbuf,sprite[i].z,8388608,1);
|
|
Bsprintf(tempbuf,"Sprite %d angle: ",i);
|
|
sprite[i].ang = getnumber16(tempbuf,sprite[i].ang,2048L,0);
|
|
Bsprintf(tempbuf,"Sprite %d updated",i);
|
|
printmessage16(tempbuf);
|
|
}
|
|
|
|
else if (pointhighlight >= 0 /*<= 16383*/)
|
|
{
|
|
i = linehighlight;
|
|
j = wall[i].x;
|
|
k = wall[i].y;
|
|
Bsprintf(tempbuf,"Wall %d x: ",i);
|
|
j = getnumber16(tempbuf,j,editorgridextent,1);
|
|
Bsprintf(tempbuf,"Wall %d y: ",i);
|
|
k = getnumber16(tempbuf,k,editorgridextent,1);
|
|
dragpoint(i, j, k);
|
|
Bsprintf(tempbuf,"Wall %d updated",i);
|
|
printmessage16(tempbuf);
|
|
}
|
|
|
|
keystatus[KEYSC_L] = 0;
|
|
}
|
|
|
|
|
|
if (keystatus[KEYSC_QUOTE] && keystatus[KEYSC_3]) // ' 3
|
|
{
|
|
onnames++;
|
|
if (onnames>8) onnames=0;
|
|
keystatus[KEYSC_3]=0;
|
|
Bsprintf(tempbuf,"Mode %d %s",onnames,SpriteMode[onnames]);
|
|
printmessage16(tempbuf);
|
|
// clearmidstatbar16();
|
|
// for(i=0;i<MAXMODE32D;i++) {printext16(0*8,ydim16+32+(i*8),15,-1,SpriteMode[i],0);
|
|
}
|
|
// Ver();
|
|
|
|
/*
|
|
if(keystatus[KEYSC_QUOTE] && keystatus[KEYSC_5]) // ' 5
|
|
{
|
|
keystatus[KEYSC_5]=0;
|
|
sprintf(tempbuf,"Power-Up Ammo now equals Normal");
|
|
printmessage16(tempbuf);
|
|
for(i=0;i<MAXSPRITES;i++)
|
|
{
|
|
if(sprite[i].picnum>=20 && sprite[i].picnum<=59)
|
|
{
|
|
sprite[i].xrepeat = 32;
|
|
sprite[i].yrepeat = 32;
|
|
}
|
|
}
|
|
|
|
}
|
|
*/
|
|
|
|
// What the fuck is this supposed to do?
|
|
|
|
/* Motorcycle ha ha ha
|
|
if(keystatus[KEYSC_QUOTE] && keystatus[KEYSC_5]) // ' 5
|
|
{
|
|
keystatus[KEYSC_5]=0;
|
|
sidemode++; if (sidemode > 2) sidemode = 0;
|
|
if (sidemode == 1)
|
|
{
|
|
editstatus = 0;
|
|
zmode = 2;
|
|
pos.z = ((sector[cursectnum].ceilingz+sector[cursectnum].floorz)>>1);
|
|
}
|
|
else
|
|
{
|
|
editstatus = 1;
|
|
zmode = 1;
|
|
}
|
|
}
|
|
*/
|
|
|
|
if (keystatus[KEYSC_QUOTE] && keystatus[KEYSC_7]) // ' 7 : swap hilo
|
|
{
|
|
keystatus[KEYSC_7]=0;
|
|
|
|
if (pointhighlight >= 16384)
|
|
{
|
|
temp=sprite[cursprite].lotag;
|
|
sprite[cursprite].lotag=sprite[cursprite].hitag;
|
|
sprite[cursprite].hitag=temp;
|
|
Bsprintf(tempbuf,"Sprite %d tags swapped",cursprite);
|
|
printmessage16(tempbuf);
|
|
}
|
|
else if (linehighlight >= 0)
|
|
{
|
|
temp=wall[linehighlight].lotag;
|
|
wall[linehighlight].lotag=wall[linehighlight].hitag;
|
|
wall[linehighlight].hitag=temp;
|
|
Bsprintf(tempbuf,"Wall %d tags swapped",linehighlight);
|
|
printmessage16(tempbuf);
|
|
}
|
|
}
|
|
|
|
if (keystatus[KEYSC_QUOTE] && keystatus[KEYSC_J]) // ' J
|
|
{
|
|
pos.x=getnumber16("X-coordinate: ",pos.x,editorgridextent,1);
|
|
pos.y=getnumber16("Y-coordinate: ",pos.y,editorgridextent,1);
|
|
Bsprintf(tempbuf,"Current pos now (%d, %d)",pos.x,pos.y);
|
|
printmessage16(tempbuf);
|
|
keystatus[KEYSC_J]=0;
|
|
}
|
|
|
|
X_OnEvent(EVENT_KEYS2D, -1);
|
|
|
|
}// end key2d
|
|
|
|
static void InitCustomColors(void)
|
|
{
|
|
/* blue */
|
|
/* vgapal16[9*4+0] = 63;
|
|
vgapal16[9*4+1] = 31;
|
|
vgapal16[9*4+2] = 7; */
|
|
int32_t i;
|
|
palette_t *edcol;
|
|
/*
|
|
|
|
char vgapal16[4*256] =
|
|
{
|
|
00,00,00,00, 42,00,00,00, 00,42,00,00, 42,42,00,00, 00,00,42,00,
|
|
42,00,42,00, 00,21,42,00, 42,42,42,00, 21,21,21,00, 63,21,21,00,
|
|
21,63,21,00, 63,63,21,00, 21,21,63,00, 63,21,63,00, 21,63,63,00,
|
|
63,63,63,00
|
|
};
|
|
*/
|
|
/* editorcolors[0] = getclosestcol(0,0,0);
|
|
editorcolors[1] = getclosestcol(0,0,42);
|
|
editorcolors[2] = getclosestcol(0,42,0);
|
|
editorcolors[3] = getclosestcol(0,42,42);
|
|
editorcolors[4] = getclosestcol(42,0,0);
|
|
editorcolors[5] = getclosestcol(0,0,0);
|
|
*/
|
|
|
|
vgapal16[9*4+0] = 63;
|
|
vgapal16[9*4+1] = 31;
|
|
vgapal16[9*4+2] = 7;
|
|
|
|
/* orange */
|
|
vgapal16[31*4+0] = 20; // blue
|
|
vgapal16[31*4+1] = 45; // green
|
|
vgapal16[31*4+2] = 60; // red
|
|
|
|
vgapal16[39*4+0] = 36;
|
|
vgapal16[39*4+1] = 53;
|
|
vgapal16[39*4+2] = 63;
|
|
|
|
|
|
/* light yellow */
|
|
vgapal16[22*4+0] = 51;
|
|
vgapal16[22*4+1] = 63;
|
|
vgapal16[22*4+2] = 63;
|
|
|
|
/* grey */
|
|
vgapal16[23*4+0] = 45;
|
|
vgapal16[23*4+1] = 45;
|
|
vgapal16[23*4+2] = 45;
|
|
|
|
/* blue */
|
|
vgapal16[24*4+0] = 51;
|
|
vgapal16[24*4+1] = 41;
|
|
vgapal16[24*4+2] = 12;
|
|
|
|
vgapal16[32*4+0] = 60;
|
|
vgapal16[32*4+1] = 50;
|
|
vgapal16[32*4+2] = 21;
|
|
|
|
// grid color
|
|
vgapal16[25*4+0] = 19;
|
|
vgapal16[25*4+1] = 17;
|
|
vgapal16[25*4+2] = 17;
|
|
|
|
vgapal16[26*4+0] = 24;
|
|
vgapal16[26*4+1] = 24;
|
|
vgapal16[26*4+2] = 24;
|
|
|
|
vgapal16[33*4+0] = 0;//15; // blue
|
|
vgapal16[33*4+1] = 0;//30; // green
|
|
vgapal16[33*4+2] = 48;//45; // red
|
|
|
|
vgapal16[41*4+0] = 0;//24;
|
|
vgapal16[41*4+1] = 0;//40;
|
|
vgapal16[41*4+2] = 63;//48;
|
|
|
|
for (i = 0; i<256; i++)
|
|
{
|
|
edcol = (palette_t *)&vgapal16[4*i];
|
|
editorcolors[i] = getclosestcol(edcol->b,edcol->g,edcol->r);
|
|
}
|
|
}
|
|
|
|
void ExtPreSaveMap(void)
|
|
{
|
|
if (fixmapbeforesaving)
|
|
{
|
|
int32_t i, startwall, j, endwall;
|
|
|
|
for (i=0; i<numsectors; i++)
|
|
{
|
|
startwall = sector[i].wallptr;
|
|
for (j=startwall; j<numwalls; j++)
|
|
if (wall[j].point2 < startwall) startwall = wall[j].point2;
|
|
sector[i].wallptr = startwall;
|
|
}
|
|
for (i=numsectors-2; i>=0; i--)
|
|
sector[i].wallnum = sector[i+1].wallptr-sector[i].wallptr;
|
|
sector[numsectors-1].wallnum = numwalls-sector[numsectors-1].wallptr;
|
|
|
|
for (i=0; i<numwalls; i++)
|
|
{
|
|
wall[i].nextsector = -1;
|
|
wall[i].nextwall = -1;
|
|
}
|
|
for (i=0; i<numsectors; i++)
|
|
{
|
|
startwall = sector[i].wallptr;
|
|
endwall = startwall + sector[i].wallnum;
|
|
for (j=startwall; j<endwall; j++)
|
|
checksectorpointer((int16_t)j,(int16_t)i);
|
|
}
|
|
}
|
|
}
|
|
|
|
static void G_ShowParameterHelp(void)
|
|
{
|
|
char *s = "Usage: mapster32 [OPTIONS] [FILE]\n\n"
|
|
"-gFILE, -grp FILE\tUse extra group file FILE\n"
|
|
"-hFILE\t\tUse definitions file FILE\n"
|
|
"-jDIR, -game_dir DIR\n\t\tAdds DIR to the file path stack\n"
|
|
"-nocheck\t\tDisables map pointer checking when saving\n"
|
|
#if defined RENDERTYPEWIN || (defined RENDERTYPESDL && !defined __APPLE__ && defined HAVE_GTK2)
|
|
"-setup\t\tDisplays the configuration dialog\n"
|
|
#endif
|
|
#if !defined(_WIN32)
|
|
"-usecwd\t\tRead game data and configuration file from working directory\n"
|
|
#endif
|
|
"\n-?, -help, --help\tDisplay this help message and exit"
|
|
;
|
|
wm_msgbox("Mapster32"VERSION BUILDDATE,s);
|
|
}
|
|
|
|
static void AddGamePath(const char *buffer)
|
|
{
|
|
struct strllist *s;
|
|
s = (struct strllist *)Bcalloc(1,sizeof(struct strllist));
|
|
s->str = strdup(buffer);
|
|
|
|
if (CommandPaths)
|
|
{
|
|
struct strllist *t;
|
|
for (t = CommandPaths; t->next; t=t->next) ;
|
|
t->next = s;
|
|
return;
|
|
}
|
|
CommandPaths = s;
|
|
}
|
|
|
|
static void G_AddGroup(const char *buffer)
|
|
{
|
|
struct strllist *s;
|
|
s = (struct strllist *)Bcalloc(1,sizeof(struct strllist));
|
|
s->str = Bstrdup(buffer);
|
|
if (Bstrchr(s->str,'.') == 0)
|
|
Bstrcat(s->str,".grp");
|
|
|
|
if (CommandGrps)
|
|
{
|
|
struct strllist *t;
|
|
for (t = CommandGrps; t->next; t=t->next) ;
|
|
t->next = s;
|
|
return;
|
|
}
|
|
CommandGrps = s;
|
|
}
|
|
|
|
#define COPYARG(i) \
|
|
Bmemcpy(&testplay_addparam[j], argv[i], lengths[i]); \
|
|
j += lengths[i]; \
|
|
testplay_addparam[j++] = ' ';
|
|
|
|
#if defined(RENDERTYPEWIN) && defined(USE_OPENGL)
|
|
extern char forcegl;
|
|
#endif
|
|
|
|
static void G_CheckCommandLine(int32_t argc, const char **argv)
|
|
{
|
|
int32_t i = 1, j, maxlen=0, *lengths;
|
|
char *c, *k;
|
|
|
|
mapster32_fullpath = (char*)argv[0];
|
|
|
|
if (argc > 1)
|
|
{
|
|
lengths = Bmalloc(argc*sizeof(int32_t));
|
|
for (j=1; j<argc; j++) maxlen += (lengths[j] = Bstrlen(argv[j]));
|
|
|
|
testplay_addparam = Bmalloc(maxlen+argc);
|
|
testplay_addparam[0] = 0;
|
|
|
|
j = 0;
|
|
|
|
while (i < argc)
|
|
{
|
|
c = (char *)argv[i];
|
|
if (((*c == '/') || (*c == '-')))
|
|
{
|
|
if (!Bstrcasecmp(c+1,"?") || !Bstrcasecmp(c+1,"help") || !Bstrcasecmp(c+1,"-help"))
|
|
{
|
|
G_ShowParameterHelp();
|
|
exit(0);
|
|
}
|
|
|
|
if (!Bstrcasecmp(c+1, "g") || !Bstrcasecmp(c+1, "grp"))
|
|
{
|
|
if (argc > i+1)
|
|
{
|
|
G_AddGroup(argv[i+1]);
|
|
COPYARG(i);
|
|
COPYARG(i+1);
|
|
i++;
|
|
}
|
|
i++;
|
|
continue;
|
|
}
|
|
|
|
if (!Bstrcasecmp(c+1,"game_dir"))
|
|
{
|
|
if (argc > i+1)
|
|
{
|
|
#if defined(POLYMOST) && defined(USE_OPENGL)
|
|
extern char TEXCACHEFILE[BMAX_PATH];
|
|
|
|
Bsprintf(tempbuf,"%s/%s",argv[i+1],TEXCACHEFILE);
|
|
Bstrcpy(TEXCACHEFILE,tempbuf);
|
|
#endif
|
|
AddGamePath(argv[i+1]);
|
|
|
|
COPYARG(i);
|
|
COPYARG(i+1);
|
|
i++;
|
|
}
|
|
i++;
|
|
continue;
|
|
}
|
|
if (!Bstrcasecmp(c+1,"cfg"))
|
|
{
|
|
if (argc > i+1)
|
|
{
|
|
Bstrcpy(setupfilename,argv[i+1]);
|
|
i++;
|
|
}
|
|
i++;
|
|
continue;
|
|
}
|
|
if (!Bstrcasecmp(c+1,"gamegrp"))
|
|
{
|
|
if (argc > i+1)
|
|
{
|
|
Bstrcpy(defaultduke3dgrp,argv[i+1]);
|
|
COPYARG(i);
|
|
COPYARG(i+1);
|
|
i++;
|
|
}
|
|
i++;
|
|
continue;
|
|
}
|
|
if (!Bstrcasecmp(c+1,"nam"))
|
|
{
|
|
strcpy(duke3dgrp, "nam.grp");
|
|
COPYARG(i);
|
|
i++;
|
|
continue;
|
|
}
|
|
if (!Bstrcasecmp(c+1,"ww2gi"))
|
|
{
|
|
strcpy(duke3dgrp, "ww2gi.grp");
|
|
COPYARG(i);
|
|
i++;
|
|
continue;
|
|
}
|
|
if (!Bstrcasecmp(c+1,"nocheck"))
|
|
{
|
|
initprintf("Map pointer checking disabled\n");
|
|
fixmapbeforesaving = 0;
|
|
i++;
|
|
continue;
|
|
}
|
|
if (!Bstrcasecmp(c+1,"noautoload"))
|
|
{
|
|
initprintf("Autoload disabled\n");
|
|
NoAutoLoad = 1;
|
|
COPYARG(i);
|
|
i++;
|
|
continue;
|
|
}
|
|
#if !defined(_WIN32)
|
|
if (!Bstrcasecmp(c+1,"usecwd"))
|
|
{
|
|
usecwd = 1;
|
|
COPYARG(i);
|
|
i++;
|
|
continue;
|
|
}
|
|
#endif
|
|
#if defined(RENDERTYPEWIN) && defined(USE_OPENGL)
|
|
if (!Bstrcasecmp(c+1,"forcegl"))
|
|
{
|
|
forcegl = 1;
|
|
i++;
|
|
continue;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
if ((*c == '/') || (*c == '-'))
|
|
{
|
|
c++;
|
|
switch (*c)
|
|
{
|
|
case 'h':
|
|
case 'H':
|
|
c++;
|
|
if (*c)
|
|
{
|
|
defsfilename = c;
|
|
COPYARG(i);
|
|
initprintf("Using DEF file: %s.\n",defsfilename);
|
|
}
|
|
break;
|
|
case 'j':
|
|
case 'J':
|
|
c++;
|
|
if (!*c) break;
|
|
AddGamePath(c);
|
|
COPYARG(i);
|
|
break;
|
|
case 'g':
|
|
case 'G':
|
|
c++;
|
|
if (!*c) break;
|
|
G_AddGroup(c);
|
|
COPYARG(i);
|
|
break;
|
|
case 'x':
|
|
case 'X':
|
|
c++;
|
|
if (!*c) break;
|
|
gamecon = c;
|
|
COPYARG(i);
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
k = Bstrrchr(c,'.');
|
|
if (k)
|
|
{
|
|
if (!Bstrcasecmp(k,".grp") || !Bstrcasecmp(k,".zip"))
|
|
{
|
|
COPYARG(i);
|
|
G_AddGroup(argv[i++]);
|
|
continue;
|
|
}
|
|
if (!Bstrcasecmp(k,".def"))
|
|
{
|
|
COPYARG(i);
|
|
defsfilename = (char *)argv[i++];
|
|
initprintf("Using DEF file: %s.\n",defsfilename);
|
|
continue;
|
|
}
|
|
if (!Bstrcasecmp(k,".con"))
|
|
{
|
|
COPYARG(i);
|
|
gamecon = (char *)argv[i++];
|
|
continue;
|
|
}
|
|
}
|
|
}
|
|
i++;
|
|
}
|
|
|
|
Bfree(lengths);
|
|
|
|
if (j > 0)
|
|
{
|
|
testplay_addparam[j-1] = 0;
|
|
testplay_addparam = Brealloc(testplay_addparam, j*sizeof(char));
|
|
}
|
|
else
|
|
{
|
|
Bfree(testplay_addparam);
|
|
testplay_addparam = NULL;
|
|
}
|
|
}
|
|
}
|
|
#undef COPYARG
|
|
|
|
int32_t ExtPreInit(int32_t argc,const char **argv)
|
|
{
|
|
wm_setapptitle("Mapster32"VERSION BUILDDATE);
|
|
|
|
#ifdef _WIN32
|
|
tempbuf[GetModuleFileName(NULL,tempbuf,BMAX_PATH)] = 0;
|
|
Bcorrectfilename(tempbuf,1);
|
|
chdir(tempbuf);
|
|
#endif
|
|
|
|
OSD_SetLogFile("mapster32.log");
|
|
OSD_SetVersionString("Mapster32"VERSION,0,2);
|
|
initprintf("Mapster32"VERSION BUILDDATE"\n");
|
|
// initprintf("Copyright (c) 2008 EDuke32 team\n");
|
|
|
|
G_CheckCommandLine(argc,argv);
|
|
|
|
return 0;
|
|
}
|
|
|
|
static int32_t osdcmd_quit(const osdfuncparm_t *parm)
|
|
{
|
|
UNREFERENCED_PARAMETER(parm);
|
|
clearfilenames();
|
|
ExtUnInit();
|
|
uninitengine();
|
|
|
|
exit(0);
|
|
|
|
return OSDCMD_OK;
|
|
}
|
|
|
|
static int32_t osdcmd_editorgridextent(const osdfuncparm_t *parm)
|
|
{
|
|
int32_t i;
|
|
extern int32_t editorgridextent;
|
|
|
|
if (parm->numparms == 0)
|
|
{
|
|
OSD_Printf("\"editorgridextent\" is \"%d\"\n", editorgridextent);
|
|
return OSDCMD_SHOWHELP;
|
|
}
|
|
else if (parm->numparms != 1) return OSDCMD_SHOWHELP;
|
|
|
|
i = Batol(parm->parms[0]);
|
|
|
|
if (i >= 65536 && i <= 524288)
|
|
{
|
|
editorgridextent = i;
|
|
OSD_Printf("editorgridextent %d\n", editorgridextent);
|
|
}
|
|
else OSD_Printf("editorgridextent: value out of range\n");
|
|
return OSDCMD_OK;
|
|
}
|
|
|
|
static int32_t osdcmd_addpath(const osdfuncparm_t *parm)
|
|
{
|
|
char pathname[BMAX_PATH];
|
|
|
|
if (parm->numparms != 1) return OSDCMD_SHOWHELP;
|
|
|
|
strcpy(pathname,parm->parms[0]);
|
|
addsearchpath(pathname);
|
|
return OSDCMD_OK;
|
|
}
|
|
|
|
static int32_t osdcmd_initgroupfile(const osdfuncparm_t *parm)
|
|
{
|
|
char file[BMAX_PATH];
|
|
|
|
if (parm->numparms != 1) return OSDCMD_SHOWHELP;
|
|
|
|
strcpy(file,parm->parms[0]);
|
|
initgroupfile(file);
|
|
return OSDCMD_OK;
|
|
}
|
|
|
|
static int32_t osdcmd_echo(const osdfuncparm_t *parm)
|
|
{
|
|
int32_t i;
|
|
for (i = 0; i < parm->numparms; i++)
|
|
{
|
|
if (i > 0) OSD_Printf(" ");
|
|
OSD_Printf("%s", parm->parms[i]);
|
|
}
|
|
OSD_Printf("\n");
|
|
|
|
return OSDCMD_OK;
|
|
}
|
|
|
|
static int32_t osdcmd_fileinfo(const osdfuncparm_t *parm)
|
|
{
|
|
uint32_t crc, length;
|
|
int32_t i,j;
|
|
char buf[256];
|
|
|
|
if (parm->numparms != 1) return OSDCMD_SHOWHELP;
|
|
|
|
if ((i = kopen4load((char *)parm->parms[0],0)) < 0)
|
|
{
|
|
OSD_Printf("fileinfo: File \"%s\" not found.\n", parm->parms[0]);
|
|
return OSDCMD_OK;
|
|
}
|
|
|
|
length = kfilelength(i);
|
|
|
|
crc32init(&crc);
|
|
do
|
|
{
|
|
j = kread(i,buf,256);
|
|
crc32block(&crc,(uint8_t *)buf,j);
|
|
}
|
|
while (j == 256);
|
|
crc32finish(&crc);
|
|
|
|
kclose(i);
|
|
|
|
OSD_Printf("fileinfo: %s\n"
|
|
" File size: %d\n"
|
|
" CRC-32: %08X\n",
|
|
parm->parms[0], length, crc);
|
|
|
|
return OSDCMD_OK;
|
|
}
|
|
|
|
static int32_t osdcmd_sensitivity(const osdfuncparm_t *parm)
|
|
{
|
|
if (parm->numparms != 1)
|
|
{
|
|
OSD_Printf("\"sensitivity\" is \"%.2f\"\n",msens);
|
|
return OSDCMD_SHOWHELP;
|
|
}
|
|
msens = atof(parm->parms[0]);
|
|
OSD_Printf("sensitivity %.2f\n",msens);
|
|
return OSDCMD_OK;
|
|
}
|
|
|
|
static int32_t osdcmd_gamma(const osdfuncparm_t *parm)
|
|
{
|
|
extern int16_t brightness;
|
|
|
|
if (parm->numparms != 1)
|
|
{
|
|
OSD_Printf("\"gamma\" \"%d\"\n",brightness);
|
|
return OSDCMD_SHOWHELP;
|
|
}
|
|
brightness = atoi(parm->parms[0]);
|
|
setbrightness(brightness,palette,0);
|
|
OSD_Printf("gamma %d\n",brightness);
|
|
return OSDCMD_OK;
|
|
}
|
|
|
|
static int32_t osdcmd_noclip(const osdfuncparm_t *parm)
|
|
{
|
|
UNREFERENCED_PARAMETER(parm);
|
|
noclip = !noclip;
|
|
|
|
return OSDCMD_OK;
|
|
}
|
|
|
|
static int32_t osdcmd_testplay_addparam(const osdfuncparm_t *parm)
|
|
{
|
|
int32_t slen;
|
|
|
|
if (parm->numparms != 1)
|
|
{
|
|
OSD_Printf("additional parameters for test playing: %s%s%s\n",
|
|
testplay_addparam ? "\"" : "",
|
|
testplay_addparam ? testplay_addparam : "<empty>",
|
|
testplay_addparam ? "\"" : "");
|
|
return OSDCMD_OK;
|
|
}
|
|
|
|
slen = Bstrlen(parm->parms[0]);
|
|
|
|
if (slen > 0)
|
|
{
|
|
if (!testplay_addparam)
|
|
testplay_addparam = Bmalloc(slen+1);
|
|
else
|
|
testplay_addparam = Brealloc(testplay_addparam, slen+1);
|
|
|
|
Bmemcpy(testplay_addparam, parm->parms[0], slen);
|
|
testplay_addparam[slen] = 0;
|
|
}
|
|
else
|
|
{
|
|
if (testplay_addparam)
|
|
{
|
|
Bfree(testplay_addparam);
|
|
testplay_addparam = NULL;
|
|
}
|
|
}
|
|
|
|
return OSDCMD_OK;
|
|
}
|
|
|
|
static int32_t osdcmd_showheightindicators(const osdfuncparm_t *parm)
|
|
{
|
|
extern int32_t showheightindicators;
|
|
|
|
if (parm->numparms == 1)
|
|
showheightindicators = min(max(atoi(parm->parms[0]),0),2);
|
|
|
|
OSD_Printf("height indicators: %s\n",
|
|
showheightindicators==0 ? "none" :
|
|
(showheightindicators==1 ? "two-sided walls only" : "all"));
|
|
|
|
return OSDCMD_OK;
|
|
}
|
|
|
|
//PK vvv ------------
|
|
static int32_t osdcmd_vars_pk(const osdfuncparm_t *parm)
|
|
{
|
|
int32_t showval = (parm->numparms < 1);
|
|
|
|
// this is something of a misnomer, since it's actually accel+decel
|
|
if (!Bstrcasecmp(parm->name, "pk_turnaccel"))
|
|
{
|
|
if (showval) { OSD_Printf("Turning acceleration+declaration is %d\n", pk_turnaccel); }
|
|
else
|
|
{
|
|
pk_turnaccel = atoi(parm->parms[0]);
|
|
pk_turnaccel = pk_turnaccel<=pk_turndecel ? (pk_turndecel+1):pk_turnaccel;
|
|
pk_turnaccel = pk_turnaccel>256 ? 256:pk_turnaccel;
|
|
}
|
|
}
|
|
else if (!Bstrcasecmp(parm->name, "pk_turndecel"))
|
|
{
|
|
if (showval) { OSD_Printf("Turning deceleration is %d\n", pk_turndecel); }
|
|
else
|
|
{
|
|
pk_turndecel = atoi(parm->parms[0]);
|
|
pk_turndecel = pk_turndecel<=0 ? 1:pk_turndecel;
|
|
pk_turndecel = pk_turndecel>=pk_turnaccel ? (pk_turnaccel-1):pk_turndecel;
|
|
pk_turndecel = pk_turndecel>128 ? 128:pk_turndecel;
|
|
}
|
|
}
|
|
else if (!Bstrcasecmp(parm->name, "pk_quickmapcycling"))
|
|
{
|
|
OSD_Printf("Quick map cycling ((LShift-)Ctrl-X): %s\n",
|
|
(quickmapcycling = !quickmapcycling) ? "enabled":"disabled");
|
|
}
|
|
else if (!Bstrcasecmp(parm->name, "pk_uedaccel"))
|
|
{
|
|
if (showval) { OSD_Printf("UnrealEd mouse navigation acceleration is %d\n", pk_uedaccel); }
|
|
else
|
|
{
|
|
pk_uedaccel = atoi(parm->parms[0]);
|
|
pk_uedaccel = pk_uedaccel<0 ? 0:pk_uedaccel;
|
|
pk_uedaccel = pk_uedaccel>5 ? 5:pk_uedaccel;
|
|
}
|
|
}
|
|
return OSDCMD_OK;
|
|
}
|
|
|
|
// M32 script vvv
|
|
static int32_t osdcmd_include(const osdfuncparm_t *parm)
|
|
{
|
|
if (parm->numparms != 1)
|
|
return OSDCMD_SHOWHELP;
|
|
C_Compile(parm->parms[0], 1);
|
|
return OSDCMD_OK;
|
|
}
|
|
|
|
static int32_t osdcmd_scriptinfo(const osdfuncparm_t *parm)
|
|
{
|
|
UNREFERENCED_PARAMETER(parm);
|
|
C_CompilationInfo();
|
|
return OSDCMD_OK;
|
|
}
|
|
|
|
#if 0
|
|
static int32_t osdcmd_disasm(const osdfuncparm_t *parm)
|
|
{
|
|
int32_t i;
|
|
|
|
if (parm->numparms != 2)
|
|
return OSDCMD_SHOWHELP;
|
|
|
|
if (!isdigit(parm->parms[1][0]))
|
|
return OSDCMD_SHOWHELP;
|
|
|
|
i=atoi(parm->parms[1]);
|
|
|
|
if (parm->parms[0][0]=='s')
|
|
{
|
|
if (i>=0 && i<g_stateCount)
|
|
X_Disasm(statesinfo[i].ofs, statesinfo[i].codesize);
|
|
}
|
|
else
|
|
{
|
|
if (i>=0 && i<MAXEVENTS && aEventOffsets[i]>=0)
|
|
X_Disasm(aEventOffsets[i], aEventSizes[i]);
|
|
}
|
|
return OSDCMD_OK;
|
|
}
|
|
#endif
|
|
|
|
static int32_t osdcmd_do(const osdfuncparm_t *parm)
|
|
{
|
|
intptr_t tscrofs;
|
|
char *tp;
|
|
int32_t i, j, slen;
|
|
int32_t onumconstants=g_numSavedConstants;
|
|
|
|
if (parm->numparms < 1)
|
|
return OSDCMD_SHOWHELP;
|
|
|
|
tscrofs = (g_scriptPtr-script);
|
|
|
|
slen = Bstrlen(parm->raw+2);
|
|
tp = Bmalloc(slen+2);
|
|
if (!tp)
|
|
{
|
|
initprintf("OUT OF MEMORY!\n");
|
|
return OSDCMD_OK;
|
|
}
|
|
|
|
Bmemcpy(tp, parm->raw+2, slen);
|
|
tp[slen] = '\n';
|
|
tp[slen+1] = '\0';
|
|
|
|
g_didDefineSomething = 0;
|
|
|
|
C_Compile(tp, 0);
|
|
Bfree(tp);
|
|
|
|
if (g_numCompilerErrors)
|
|
{
|
|
// g_scriptPtr = script + tscrofs; // handled in C_Compile()
|
|
return OSDCMD_OK;
|
|
}
|
|
|
|
for (i=0,j=0; i<MAXEVENTS; i++)
|
|
if (aEventOffsets[i]>=0)
|
|
j++;
|
|
|
|
if (g_didDefineSomething == 0)
|
|
{
|
|
g_numSavedConstants = onumconstants;
|
|
|
|
*g_scriptPtr = CON_RETURN + (g_lineNumber<<12);
|
|
g_scriptPtr = script + tscrofs;
|
|
|
|
insptr = script + tscrofs;
|
|
Bmemcpy(&vm, &vm_default, sizeof(vmstate_t));
|
|
X_DoExecute(0);
|
|
// asksave = 1; // handled in Access(Sprite|Sector|Wall)
|
|
}
|
|
|
|
return OSDCMD_OK;
|
|
}
|
|
|
|
static int32_t osdcmd_endisableevent(const osdfuncparm_t *parm)
|
|
{
|
|
int32_t i, j, enable;
|
|
char buf[64] = "EVENT_";
|
|
|
|
if (!label) return OSDCMD_OK;
|
|
|
|
if (parm->numparms < 1)
|
|
{
|
|
OSD_Printf("--- Defined events:\n");
|
|
for (i=0; i<MAXEVENTS; i++)
|
|
if (aEventOffsets[i] >= 0)
|
|
OSD_Printf("%s (%d): %s\n", label+(i*MAXLABELLEN), i, aEventEnabled[i]?"on":"off");
|
|
return OSDCMD_OK;
|
|
}
|
|
|
|
enable = !Bstrcasecmp(parm->name, "enableevent");
|
|
|
|
if (parm->numparms == 1)
|
|
{
|
|
if (!Bstrcasecmp(parm->parms[0], "all"))
|
|
{
|
|
for (i=0; i<MAXEVENTS; i++)
|
|
aEventEnabled[i] = enable?1:0;
|
|
return OSDCMD_OK;
|
|
}
|
|
}
|
|
|
|
for (i=0; i<parm->numparms; i++)
|
|
{
|
|
if (isdigit(parm->parms[i][0]))
|
|
j = atoi(parm->parms[i]);
|
|
else if (!Bstrncmp(parm->parms[i], "EVENT_", 6))
|
|
j = hash_find(&labelH, parm->parms[i]);
|
|
else
|
|
{
|
|
Bstrncat(buf, parm->parms[i], sizeof(buf)-6-1);
|
|
j = hash_find(&labelH, buf);
|
|
}
|
|
|
|
if (j>=0 && j<MAXEVENTS)
|
|
aEventEnabled[j] = enable?1:0;
|
|
}
|
|
return OSDCMD_OK;
|
|
}
|
|
|
|
static int32_t registerosdcommands(void)
|
|
{
|
|
OSD_RegisterFunction("addpath","addpath <path>: adds path to game filesystem", osdcmd_addpath);
|
|
|
|
OSD_RegisterFunction("echo","echo [text]: echoes text to the console", osdcmd_echo);
|
|
OSD_RegisterFunction("editorgridextent","editorgridextent: sets the size of the 2D mode editing grid",osdcmd_editorgridextent);
|
|
|
|
OSD_RegisterFunction("fileinfo","fileinfo <file>: gets a file's information", osdcmd_fileinfo);
|
|
|
|
OSD_RegisterFunction("gamma","gamma <value>: changes brightness", osdcmd_gamma);
|
|
|
|
OSD_RegisterFunction("initgroupfile","initgroupfile <path>: adds a grp file into the game filesystem", osdcmd_initgroupfile);
|
|
|
|
OSD_RegisterFunction("noclip","noclip: toggles clipping mode", osdcmd_noclip);
|
|
|
|
OSD_RegisterFunction("quit","quit: exits the game immediately", osdcmd_quit);
|
|
OSD_RegisterFunction("exit","exit: exits the game immediately", osdcmd_quit);
|
|
|
|
OSD_RegisterFunction("sensitivity","sensitivity <value>: changes the mouse sensitivity", osdcmd_sensitivity);
|
|
|
|
//PK
|
|
OSD_RegisterFunction("pk_turnaccel", "pk_turnaccel: sets turning acceleration", osdcmd_vars_pk);
|
|
OSD_RegisterFunction("pk_turndecel", "pk_turndecel: sets turning deceleration", osdcmd_vars_pk);
|
|
OSD_RegisterFunction("pk_uedaccel", "pk_uedaccel: sets UnrealEd movement speed factor (0-5, exponentially)", osdcmd_vars_pk);
|
|
OSD_RegisterFunction("pk_quickmapcycling", "pk_quickmapcycling: allows cycling of maps with (Shift-)Ctrl-X", osdcmd_vars_pk);
|
|
OSD_RegisterFunction("testplay_addparam", "testplay_addparam \"string\": set additional parameters for test playing", osdcmd_testplay_addparam);
|
|
OSD_RegisterFunction("showheightindicators", "showheightindicators [012]: toggles height indicators in 2D mode", osdcmd_showheightindicators);
|
|
|
|
// M32 script
|
|
OSD_RegisterFunction("include", "include <filnames...>: compiles one or more M32 script files", osdcmd_include);
|
|
OSD_RegisterFunction("do", "do (m32 script ...): executes M32 script statements", osdcmd_do);
|
|
OSD_RegisterFunction("scriptinfo", "scriptinfo: shows information about compiled M32 script", osdcmd_scriptinfo);
|
|
OSD_RegisterFunction("enableevent", "enableevent <all|EVENT_...|(event number)>", osdcmd_endisableevent);
|
|
OSD_RegisterFunction("disableevent", "disableevent <all|EVENT_...|(event number)>", osdcmd_endisableevent);
|
|
// OSD_RegisterFunction("disasm", "disasm [s|e] <state or event number>", osdcmd_disasm);
|
|
return 0;
|
|
}
|
|
#define DUKEOSD
|
|
#ifdef DUKEOSD
|
|
void GAME_drawosdchar(int32_t x, int32_t y, char ch, int32_t shade, int32_t pal)
|
|
{
|
|
int32_t ac;
|
|
|
|
if (ch == 32) return;
|
|
ac = ch-'!'+STARTALPHANUM;
|
|
if (ac < STARTALPHANUM || ac > ENDALPHANUM) return;
|
|
|
|
rotatesprite(((x<<3)+x)<<16, (y<<3)<<16, 65536l, 0, ac, shade, pal, 8|16, 0, 0, xdim-1, ydim-1);
|
|
}
|
|
|
|
void GAME_drawosdstr(int32_t x, int32_t y, char *ch, int32_t len, int32_t shade, int32_t pal)
|
|
{
|
|
int32_t ac;
|
|
|
|
for (x = (x<<3)+x; len>0; len--, ch++, x++)
|
|
{
|
|
if (*ch == 32)
|
|
{
|
|
x+=5;
|
|
continue;
|
|
}
|
|
ac = *ch-'!'+STARTALPHANUM;
|
|
if (ac < STARTALPHANUM || ac > ENDALPHANUM) return;
|
|
|
|
rotatesprite(x<<16, (y<<3)<<16, 65536l, 0, ac, shade, pal, 8|16, 0, 0, xdim-1, ydim-1);
|
|
if (*ch >= '0' && *ch <= '9') x+=8;
|
|
else x += tilesizx[ac];
|
|
}
|
|
}
|
|
|
|
static int32_t GetTime(void)
|
|
{
|
|
return totalclock;
|
|
}
|
|
|
|
void GAME_drawosdcursor(int32_t x, int32_t y, int32_t type, int32_t lastkeypress)
|
|
{
|
|
int32_t ac;
|
|
|
|
if (type) ac = SMALLFNTCURSOR;
|
|
else ac = '_'-'!'+STARTALPHANUM;
|
|
|
|
if (!((GetTime()-lastkeypress) & 0x40l))
|
|
rotatesprite(((x<<3)+x)<<16, ((y<<3)+(type?-1:2))<<16, 65536l, 0, ac, 0, 8, 8|16, 0, 0, xdim-1, ydim-1);
|
|
}
|
|
|
|
int32_t GAME_getcolumnwidth(int32_t w)
|
|
{
|
|
return w/9;
|
|
}
|
|
|
|
int32_t GAME_getrowheight(int32_t w)
|
|
{
|
|
return w>>3;
|
|
}
|
|
|
|
//#define BGTILE 311
|
|
//#define BGTILE 1156
|
|
#define BGTILE 1141 // BIGHOLE
|
|
#define BORDTILE 3250 // VIEWBORDER
|
|
#define BITSTH 1+32+8+16 // high translucency
|
|
#define BITSTL 1+8+16 // low translucency
|
|
#define BITS 8+16+64 // solid
|
|
#define SHADE 16
|
|
#define PALETTE 4
|
|
void GAME_clearbackground(int32_t c, int32_t r)
|
|
{
|
|
int32_t x, y, xsiz, ysiz, tx2, ty2;
|
|
int32_t daydim, bits;
|
|
|
|
UNREFERENCED_PARAMETER(c);
|
|
/*
|
|
#ifdef _WIN32
|
|
if (qsetmode != 200)
|
|
{
|
|
OSD_SetFunctions(
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
(int32_t(*)(void))GetTime,
|
|
NULL
|
|
);
|
|
return;
|
|
}
|
|
#endif
|
|
*/
|
|
if (getrendermode() < 3) bits = BITS;
|
|
else bits = BITSTL;
|
|
|
|
daydim = r<<3;
|
|
|
|
xsiz = tilesizx[BGTILE];
|
|
tx2 = xdim/xsiz;
|
|
ysiz = tilesizy[BGTILE];
|
|
ty2 = daydim/ysiz;
|
|
|
|
for (x=0; x<=tx2; x++)
|
|
for (y=0; y<=ty2; y++)
|
|
rotatesprite(x*xsiz<<16,y*ysiz<<16,65536L,0,BGTILE,SHADE,PALETTE,bits,0,0,xdim,daydim);
|
|
|
|
xsiz = tilesizy[BORDTILE];
|
|
tx2 = xdim/xsiz;
|
|
ysiz = tilesizx[BORDTILE];
|
|
|
|
for (x=0; x<=tx2; x++)
|
|
rotatesprite(x*xsiz<<16,(daydim+ysiz+1)<<16,65536L,1536,BORDTILE,SHADE-12,PALETTE,BITS,0,0,xdim,daydim+ysiz+1);
|
|
}
|
|
#endif
|
|
|
|
enum
|
|
{
|
|
T_EOF = -2,
|
|
T_ERROR = -1,
|
|
T_INCLUDE = 0,
|
|
T_DEFINE = 1,
|
|
T_LOADGRP,
|
|
T_TILEGROUP,
|
|
T_TILE,
|
|
T_TILERANGE,
|
|
T_HOTKEY,
|
|
T_TILES,
|
|
T_NOAUTOLOAD,
|
|
T_COLORS,
|
|
|
|
T_ALPHABET,
|
|
T_MAP,
|
|
T_MAPA,
|
|
T_MAPRANGE,
|
|
T_MAPRANGEA,
|
|
T_OFFSET,
|
|
T_OFFSETA,
|
|
|
|
T_DEFINESOUND,
|
|
};
|
|
|
|
typedef struct
|
|
{
|
|
char *text;
|
|
int32_t tokenid;
|
|
}
|
|
tokenlist;
|
|
|
|
static int32_t getatoken(scriptfile *sf, tokenlist *tl, int32_t ntokens)
|
|
{
|
|
char *tok;
|
|
int32_t i;
|
|
|
|
if (!sf) return T_ERROR;
|
|
tok = scriptfile_gettoken(sf);
|
|
if (!tok) return T_EOF;
|
|
|
|
for (i=0; i<ntokens; i++)
|
|
{
|
|
if (!Bstrcasecmp(tok, tl[i].text))
|
|
return tl[i].tokenid;
|
|
}
|
|
return T_ERROR;
|
|
}
|
|
|
|
static void DoAutoload(const char *fn)
|
|
{
|
|
Bsprintf(tempbuf,"autoload/%s",fn);
|
|
getfilenames(tempbuf,"*.grp");
|
|
while (findfiles) { Bsprintf(tempbuf,"autoload/%s/%s",fn,findfiles->name); initprintf("Using group file '%s'.\n",tempbuf); initgroupfile(tempbuf); findfiles = findfiles->next; }
|
|
Bsprintf(tempbuf,"autoload/%s",fn);
|
|
getfilenames(tempbuf,"*.zip");
|
|
while (findfiles) { Bsprintf(tempbuf,"autoload/%s/%s",fn,findfiles->name); initprintf("Using group file '%s'.\n",tempbuf); initgroupfile(tempbuf); findfiles = findfiles->next; }
|
|
Bsprintf(tempbuf,"autoload/%s",fn);
|
|
getfilenames(tempbuf,"*.pk3");
|
|
while (findfiles) { Bsprintf(tempbuf,"autoload/%s/%s",fn,findfiles->name); initprintf("Using group file '%s'.\n",tempbuf); initgroupfile(tempbuf); findfiles = findfiles->next; }
|
|
}
|
|
|
|
int32_t parsegroupfiles(scriptfile *script)
|
|
{
|
|
int32_t tokn;
|
|
char *cmdtokptr;
|
|
|
|
tokenlist grptokens[] =
|
|
{
|
|
{ "include", T_INCLUDE },
|
|
{ "#include", T_INCLUDE },
|
|
{ "loadgrp", T_LOADGRP },
|
|
{ "noautoload", T_NOAUTOLOAD }
|
|
};
|
|
|
|
while (1)
|
|
{
|
|
tokn = getatoken(script,grptokens,sizeof(grptokens)/sizeof(tokenlist));
|
|
cmdtokptr = script->ltextptr;
|
|
switch (tokn)
|
|
{
|
|
case T_LOADGRP:
|
|
{
|
|
char *fn;
|
|
|
|
pathsearchmode = 1;
|
|
if (!scriptfile_getstring(script,&fn))
|
|
{
|
|
int32_t j = initgroupfile(fn);
|
|
|
|
if (j == -1)
|
|
initprintf("Could not find group file '%s'.\n",fn);
|
|
else
|
|
{
|
|
initprintf("Using group file '%s'.\n",fn);
|
|
if (!NoAutoLoad)
|
|
DoAutoload(fn);
|
|
}
|
|
|
|
}
|
|
pathsearchmode = 0;
|
|
}
|
|
break;
|
|
case T_INCLUDE:
|
|
{
|
|
char *fn;
|
|
if (!scriptfile_getstring(script,&fn))
|
|
{
|
|
scriptfile *included;
|
|
|
|
included = scriptfile_fromfile(fn);
|
|
if (!included)
|
|
{
|
|
initprintf("Warning: Failed including %s on line %s:%d\n",
|
|
fn, script->filename,scriptfile_getlinum(script,cmdtokptr));
|
|
}
|
|
else
|
|
{
|
|
parsegroupfiles(included);
|
|
scriptfile_close(included);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
case T_NOAUTOLOAD:
|
|
NoAutoLoad = 1;
|
|
break;
|
|
case T_EOF:
|
|
return(0);
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int32_t loadgroupfiles(char *fn)
|
|
{
|
|
scriptfile *script;
|
|
|
|
script = scriptfile_fromfile(fn);
|
|
if (!script) return -1;
|
|
|
|
parsegroupfiles(script);
|
|
|
|
scriptfile_close(script);
|
|
scriptfile_clearsymbols();
|
|
|
|
return 0;
|
|
}
|
|
|
|
int32_t parsetilegroups(scriptfile *script)
|
|
{
|
|
int32_t tokn;
|
|
char *cmdtokptr;
|
|
|
|
tokenlist tgtokens[] =
|
|
{
|
|
{ "include", T_INCLUDE },
|
|
{ "#include", T_INCLUDE },
|
|
{ "define", T_DEFINE },
|
|
{ "#define", T_DEFINE },
|
|
{ "tilegroup", T_TILEGROUP },
|
|
{ "spritehotkey", T_HOTKEY },
|
|
{ "alphabet", T_ALPHABET },
|
|
};
|
|
|
|
while (1)
|
|
{
|
|
tokn = getatoken(script,tgtokens,sizeof(tgtokens)/sizeof(tokenlist));
|
|
cmdtokptr = script->ltextptr;
|
|
switch (tokn)
|
|
{
|
|
case T_HOTKEY:
|
|
{
|
|
int32_t i, j;
|
|
if (scriptfile_getsymbol(script,&i)) break;
|
|
if (scriptfile_getsymbol(script,&j)) break;
|
|
if (i < 0 || i > 9 || j < 0 || j >= MAXTILES) break;
|
|
prefixtiles[i] = j;
|
|
break;
|
|
}
|
|
case T_INCLUDE:
|
|
{
|
|
char *fn;
|
|
if (!scriptfile_getstring(script,&fn))
|
|
{
|
|
scriptfile *included;
|
|
|
|
included = scriptfile_fromfile(fn);
|
|
if (!included)
|
|
{
|
|
initprintf("Warning: Failed including %s on line %s:%d\n",
|
|
fn, script->filename,scriptfile_getlinum(script,cmdtokptr));
|
|
}
|
|
else
|
|
{
|
|
parsetilegroups(included);
|
|
scriptfile_close(included);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case T_DEFINE:
|
|
{
|
|
char *name;
|
|
int32_t number;
|
|
|
|
if (scriptfile_getstring(script,&name)) break;
|
|
if (scriptfile_getsymbol(script,&number)) break;
|
|
if (scriptfile_addsymbolvalue(name,number) < 0)
|
|
initprintf("Warning: Symbol %s was NOT redefined to %d on line %s:%d\n",
|
|
name,number,script->filename,scriptfile_getlinum(script,cmdtokptr));
|
|
break;
|
|
}
|
|
case T_TILEGROUP:
|
|
{
|
|
char *end, *name;
|
|
int32_t i;
|
|
|
|
if (tile_groups >= MAX_TILE_GROUPS) break;
|
|
if (scriptfile_getstring(script,&name)) break;
|
|
if (scriptfile_getbraces(script,&end)) break;
|
|
|
|
s_TileGroups[tile_groups].pIds = Bcalloc(MAX_TILE_GROUP_ENTRIES,sizeof(int32_t));
|
|
s_TileGroups[tile_groups].szText = Bstrdup(name);
|
|
|
|
while (script->textptr < end)
|
|
{
|
|
tokenlist tgtokens2[] =
|
|
{
|
|
{ "tilegroup", T_TILEGROUP },
|
|
{ "tile", T_TILE },
|
|
{ "tilerange", T_TILERANGE },
|
|
{ "hotkey", T_HOTKEY },
|
|
{ "tiles", T_TILES },
|
|
{ "colors", T_COLORS },
|
|
};
|
|
|
|
int32_t token = getatoken(script,tgtokens2,sizeof(tgtokens2)/sizeof(tokenlist));
|
|
switch (token)
|
|
{
|
|
case T_TILE:
|
|
{
|
|
if (scriptfile_getsymbol(script,&i)) break;
|
|
if (i >= 0 && i < MAXTILES && s_TileGroups[tile_groups].nIds < MAX_TILE_GROUP_ENTRIES)
|
|
s_TileGroups[tile_groups].pIds[s_TileGroups[tile_groups].nIds++] = i;
|
|
// OSD_Printf("added tile %d to group %d\n",i,g);
|
|
break;
|
|
}
|
|
case T_TILERANGE:
|
|
{
|
|
int32_t j;
|
|
if (scriptfile_getsymbol(script,&i)) break;
|
|
if (scriptfile_getsymbol(script,&j)) break;
|
|
if (i < 0 || i >= MAXTILES || j < 0 || j >= MAXTILES) break;
|
|
while (s_TileGroups[tile_groups].nIds < MAX_TILE_GROUP_ENTRIES && i <= j)
|
|
{
|
|
s_TileGroups[tile_groups].pIds[s_TileGroups[tile_groups].nIds++] = i++;
|
|
// OSD_Printf("added tile %d to group %d\n",i,g);
|
|
}
|
|
break;
|
|
}
|
|
case T_COLORS:
|
|
{
|
|
int32_t j;
|
|
if (scriptfile_getsymbol(script, &i)) break;
|
|
if (scriptfile_getsymbol(script, &j)) break;
|
|
if (i < 0 || i >= 256 || j < 0 || j >= 256) break;
|
|
s_TileGroups[tile_groups].color1 = i;
|
|
s_TileGroups[tile_groups].color2 = j;
|
|
break;
|
|
}
|
|
case T_HOTKEY:
|
|
{
|
|
char *c;
|
|
if (scriptfile_getstring(script,&c)) break;
|
|
s_TileGroups[tile_groups].key1 = Btoupper(c[0]);
|
|
s_TileGroups[tile_groups].key2 = Btolower(c[0]);
|
|
break;
|
|
}
|
|
case T_TILES:
|
|
{
|
|
char *end2;
|
|
if (scriptfile_getbraces(script,&end2)) break;
|
|
while (script->textptr < end2-1)
|
|
{
|
|
if (!scriptfile_getsymbol(script,&i))
|
|
{
|
|
if (i >= 0 && i < MAXTILES && s_TileGroups[tile_groups].nIds < MAX_TILE_GROUP_ENTRIES)
|
|
s_TileGroups[tile_groups].pIds[s_TileGroups[tile_groups].nIds++] = i;
|
|
// OSD_Printf("added tile %d to group %d\n",i,g);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
s_TileGroups[tile_groups].pIds = Brealloc(s_TileGroups[tile_groups].pIds,s_TileGroups[tile_groups].nIds*sizeof(int32_t));
|
|
tile_groups++;
|
|
break;
|
|
}
|
|
case T_ALPHABET:
|
|
{
|
|
char *end;
|
|
int32_t i, j, k;
|
|
|
|
if (numalphabets >= MAX_ALPHABETS) break;
|
|
if (scriptfile_getbraces(script,&end)) break;
|
|
|
|
for (i=0; i<NUMPRINTABLES; i++)
|
|
{
|
|
alphabets[numalphabets].pic[i] = -1;
|
|
alphabets[numalphabets].xofs[i] = 0;
|
|
alphabets[numalphabets].yofs[i] = 0;
|
|
}
|
|
|
|
while (script->textptr < end)
|
|
{
|
|
tokenlist alphtokens2[] =
|
|
{
|
|
{ "map", T_MAP },
|
|
{ "mapa", T_MAPA },
|
|
{ "maprange", T_MAPRANGE },
|
|
{ "maprangea", T_MAPRANGEA },
|
|
{ "offset", T_OFFSET },
|
|
{ "offseta", T_OFFSETA },
|
|
};
|
|
|
|
int32_t token = getatoken(script,alphtokens2,sizeof(alphtokens2)/sizeof(tokenlist));
|
|
switch (token)
|
|
{
|
|
case T_MAP: // map <ascii num> <start tilenum>, e.g. map 46 3002
|
|
{
|
|
if (scriptfile_getnumber(script,&i)) break;
|
|
if (scriptfile_getsymbol(script,&j)) break;
|
|
|
|
if (i>=33 && i<=126 && j>= 0 && j<MAXTILES)
|
|
alphabets[numalphabets].pic[i-33] = j;
|
|
|
|
break;
|
|
}
|
|
case T_MAPA: // mapa <ascii string> <start tilenum>, e.g. map ".,!?" 3002
|
|
{
|
|
char *s;
|
|
if (scriptfile_getstring(script,&s)) break;
|
|
if (scriptfile_getsymbol(script,&i)) break;
|
|
|
|
for (; *s; s++, i++)
|
|
{
|
|
if (*s>=33 && *s<=126 && i>= 0 && i<MAXTILES)
|
|
alphabets[numalphabets].pic[(*s)-33] = i;
|
|
}
|
|
break;
|
|
}
|
|
// maprange <start ascii num> <end ascii num> <start tilenum>, e.g. map 33 126 STARTALPHANUM
|
|
// maprangea <start char> <end char> <start tilenum>, e.g. map "!" "~" STARTALPHANUM
|
|
case T_MAPRANGE:
|
|
case T_MAPRANGEA:
|
|
{
|
|
if (token==T_MAPRANGE)
|
|
{
|
|
if (scriptfile_getnumber(script,&i)) break;
|
|
if (scriptfile_getnumber(script,&j)) break;
|
|
}
|
|
else
|
|
{
|
|
char *c1, *c2;
|
|
if (scriptfile_getstring(script,&c1)) break;
|
|
if (scriptfile_getstring(script,&c2)) break;
|
|
i=*c1;
|
|
j=*c2;
|
|
}
|
|
if (scriptfile_getsymbol(script,&k)) break;
|
|
|
|
if (i>126 || j<33) break;
|
|
for (; i<=j && k<MAXTILES; i++, k++)
|
|
{
|
|
if (i>=33 && i<=126)
|
|
alphabets[numalphabets].pic[i-33] = k;
|
|
}
|
|
break;
|
|
}
|
|
case T_OFFSET: // offset <ascii num> <xoffset> <yoffset>
|
|
{
|
|
if (scriptfile_getnumber(script, &i)) break;
|
|
if (scriptfile_getnumber(script, &j)) break;
|
|
if (scriptfile_getnumber(script, &k)) break;
|
|
|
|
if (i >= 33 && i <= 126)
|
|
{
|
|
alphabets[numalphabets].xofs[i-33] = j;
|
|
alphabets[numalphabets].yofs[i-33] = k;
|
|
}
|
|
break;
|
|
}
|
|
case T_OFFSETA: // offseta <ascii string> <xoffset> <yoffset>
|
|
{
|
|
char *s;
|
|
if (scriptfile_getstring(script, &s)) break;
|
|
if (scriptfile_getnumber(script, &i)) break;
|
|
if (scriptfile_getnumber(script, &j)) break;
|
|
|
|
for (; *s; s++)
|
|
if (*s >= 33 && *s <= 126)
|
|
{
|
|
alphabets[numalphabets].xofs[(*s)-33] = i;
|
|
alphabets[numalphabets].yofs[(*s)-33] = j;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
numalphabets++;
|
|
break;
|
|
}
|
|
case T_EOF:
|
|
return(0);
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int32_t loadtilegroups(char *fn)
|
|
{
|
|
int32_t i, j;
|
|
scriptfile *script;
|
|
TileGroup blank = { NULL, 0, NULL, 0, 0, 0, 0};
|
|
|
|
script = scriptfile_fromfile(fn);
|
|
if (!script) return -1;
|
|
|
|
for (i = MAX_TILE_GROUPS-1; i >= 0; i--)
|
|
{
|
|
Bmemcpy(&s_TileGroups[i],&blank,sizeof(blank));
|
|
}
|
|
|
|
parsetilegroups(script);
|
|
|
|
scriptfile_close(script);
|
|
scriptfile_clearsymbols();
|
|
|
|
tilegroupItems = getTileGroup("Items");
|
|
tilegroupActors = getTileGroup("Actors");
|
|
|
|
// Apply 2d sprite colors as specified in tiles.cfg.
|
|
for (i = 0; i < MAX_TILE_GROUPS; i++)
|
|
{
|
|
if (s_TileGroups[i].szText == NULL) break;
|
|
// If the colors were specified...
|
|
if (s_TileGroups[i].color1 && s_TileGroups[i].color2)
|
|
{
|
|
for (j = s_TileGroups[i].nIds-1; j >= 0 ; j--)
|
|
{
|
|
// Apply the colors to all tiles in the group.
|
|
spritecol2d[s_TileGroups[i].pIds[j]][0] = s_TileGroups[i].color1;
|
|
spritecol2d[s_TileGroups[i].pIds[j]][1] = s_TileGroups[i].color2;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
return 0;
|
|
}
|
|
|
|
/// vvv Parse CON files partially to get sound definitions
|
|
int32_t parseconsounds(scriptfile *script)
|
|
{
|
|
int32_t tokn;
|
|
char *cmdtokptr;
|
|
int32_t num_invalidsounds=0;
|
|
|
|
tokenlist cstokens[] =
|
|
{
|
|
{ "include", T_INCLUDE },
|
|
{ "#include", T_INCLUDE },
|
|
{ "define", T_DEFINE },
|
|
{ "#define", T_DEFINE },
|
|
{ "definesound", T_DEFINESOUND },
|
|
};
|
|
|
|
while (1)
|
|
{
|
|
tokn = getatoken(script,cstokens,sizeof(cstokens)/sizeof(tokenlist));
|
|
cmdtokptr = script->ltextptr;
|
|
switch (tokn)
|
|
{
|
|
case T_INCLUDE:
|
|
{
|
|
char *fn;
|
|
if (!scriptfile_getstring(script,&fn))
|
|
{
|
|
scriptfile *included;
|
|
|
|
included = scriptfile_fromfile(fn);
|
|
if (!included)
|
|
{
|
|
initprintf("Warning: Failed including %s on line %s:%d\n",
|
|
fn, script->filename,scriptfile_getlinum(script,cmdtokptr));
|
|
}
|
|
else
|
|
{
|
|
int32_t tmp = parseconsounds(included);
|
|
scriptfile_close(included);
|
|
if (tmp < 0) return tmp;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case T_DEFINE:
|
|
{
|
|
char *name;
|
|
int32_t number;
|
|
|
|
if (scriptfile_getstring(script,&name)) break;
|
|
if (scriptfile_getsymbol(script,&number)) break;
|
|
if (scriptfile_addsymbolvalue(name,number) < 0)
|
|
initprintf("Warning: Symbol %s was NOT redefined to %d on line %s:%d\n",
|
|
name,number,script->filename,scriptfile_getlinum(script,cmdtokptr));
|
|
break;
|
|
}
|
|
case T_DEFINESOUND:
|
|
{
|
|
char *definedname, *filename;
|
|
int32_t sndnum, ps, pe, pr, m, vo;
|
|
int32_t slen;
|
|
|
|
if (scriptfile_getsymbol(script, &sndnum)) break;
|
|
|
|
definedname = Bstrdup(script->ltextptr);
|
|
if (!definedname) return -1;
|
|
|
|
if (sndnum < 0 || sndnum >= MAXSOUNDS)
|
|
{
|
|
initprintf("Warning: invalid sound definition %s (sound number < 0 or >= MAXSOUNDS) on line %s:%d\n",
|
|
definedname, script->filename,scriptfile_getlinum(script,cmdtokptr));
|
|
num_invalidsounds++;
|
|
break;
|
|
}
|
|
|
|
if (scriptfile_getstring(script, &filename))
|
|
{
|
|
Bfree(definedname);
|
|
num_invalidsounds++;
|
|
break;
|
|
}
|
|
|
|
slen = strlen(filename);
|
|
if (slen >= BMAX_PATH)
|
|
{
|
|
initprintf("Warning: invalid sound definition %s (filename too long) on line %s:%d\n",
|
|
definedname, script->filename,scriptfile_getlinum(script,cmdtokptr));
|
|
Bfree(definedname);
|
|
num_invalidsounds++;
|
|
break;
|
|
}
|
|
|
|
if (g_sounds[sndnum].filename == NULL)
|
|
g_sounds[sndnum].filename = Bcalloc(slen+1,sizeof(uint8_t));
|
|
// Hopefully noone does memcpy(..., g_sounds[].filename, BMAX_PATH)
|
|
if (!g_sounds[sndnum].filename)
|
|
{
|
|
Bfree(definedname);
|
|
return -1;
|
|
}
|
|
Bmemcpy(g_sounds[sndnum].filename, filename, slen+1);
|
|
|
|
if (scriptfile_getnumber(script, &ps)) goto BAD;
|
|
if (scriptfile_getnumber(script, &pe)) goto BAD;
|
|
if (scriptfile_getnumber(script, &pr)) goto BAD;
|
|
if (scriptfile_getnumber(script, &m)) goto BAD;
|
|
if (ParentalLock && (m&8)) goto BAD;
|
|
if (scriptfile_getnumber(script, &vo)) goto BAD;
|
|
if (0)
|
|
{
|
|
BAD:
|
|
Bfree(definedname);
|
|
Bfree(g_sounds[sndnum].filename);
|
|
g_sounds[sndnum].filename = NULL;
|
|
num_invalidsounds++;
|
|
break;
|
|
}
|
|
|
|
g_sounds[sndnum].definedname = definedname; // we want to keep it for display purposes
|
|
g_sounds[sndnum].ps = ps;
|
|
g_sounds[sndnum].pe = pe;
|
|
g_sounds[sndnum].pr = pr;
|
|
g_sounds[sndnum].m = m;
|
|
g_sounds[sndnum].vo = vo;
|
|
g_sndnum[g_numsounds] = g_definedsndnum[g_numsounds] = sndnum;
|
|
g_numsounds++;
|
|
if (g_numsounds == MAXSOUNDS)
|
|
goto END;
|
|
break;
|
|
}
|
|
case T_EOF:
|
|
goto END;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
END:
|
|
return g_numsounds;
|
|
}
|
|
|
|
int32_t loadconsounds(char *fn)
|
|
{
|
|
scriptfile *script;
|
|
int32_t ret;
|
|
|
|
initprintf("Loading sounds from '%s'\n",fn);
|
|
|
|
script = scriptfile_fromfile(fn);
|
|
if (!script)
|
|
{
|
|
initprintf("Error loading sounds: file '%s' not found.\n", fn);
|
|
return -1;
|
|
}
|
|
ret = parseconsounds(script);
|
|
if (ret < 0)
|
|
initprintf("There was an error parsing '%s'.\n", fn);
|
|
else if (ret == 0)
|
|
initprintf("'%s' doesn't contain sound definitions. No sounds loaded.\n", fn);
|
|
else
|
|
initprintf("Loaded %d sound definitions.\n", ret);
|
|
|
|
scriptfile_close(script);
|
|
scriptfile_clearsymbols();
|
|
return ret;
|
|
}
|
|
|
|
void ExtPreLoadMap(void)
|
|
{
|
|
}
|
|
|
|
/// ^^^
|
|
|
|
int32_t ExtInit(void)
|
|
{
|
|
int32_t rv = 0;
|
|
int32_t i;
|
|
char cwd[BMAX_PATH];
|
|
|
|
#if defined(__linux__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
|
|
addsearchpath("/usr/share/games/jfduke3d");
|
|
addsearchpath("/usr/local/share/games/jfduke3d");
|
|
addsearchpath("/usr/share/games/eduke32");
|
|
addsearchpath("/usr/local/share/games/eduke32");
|
|
#elif defined(__APPLE__)
|
|
addsearchpath("/Library/Application Support/JFDuke3D");
|
|
addsearchpath("/Library/Application Support/EDuke32");
|
|
#endif
|
|
|
|
if (getcwd(cwd,BMAX_PATH))
|
|
{
|
|
#if defined(__APPLE__)
|
|
/* Dirty hack on OS X to also look for gamedata inside the application bundle - rhoenie 08/08 */
|
|
char seekinappcontainer[BMAX_PATH];
|
|
Bsnprintf(seekinappcontainer,sizeof(seekinappcontainer),"%s/EDuke32.app/", cwd);
|
|
addsearchpath(seekinappcontainer);
|
|
#endif
|
|
addsearchpath(cwd);
|
|
Bstrcpy(program_origcwd, cwd);
|
|
}
|
|
else
|
|
program_origcwd[0] = '\0';
|
|
|
|
if (CommandPaths)
|
|
{
|
|
struct strllist *s;
|
|
while (CommandPaths)
|
|
{
|
|
s = CommandPaths->next;
|
|
addsearchpath(CommandPaths->str);
|
|
|
|
free(CommandPaths->str);
|
|
free(CommandPaths);
|
|
CommandPaths = s;
|
|
}
|
|
}
|
|
|
|
#if defined(_WIN32)
|
|
if (!access("user_profiles_enabled", F_OK))
|
|
#else
|
|
if (usecwd == 0 && access("user_profiles_disabled", F_OK))
|
|
#endif
|
|
{
|
|
char *homedir;
|
|
int32_t asperr;
|
|
|
|
if ((homedir = Bgethomedir()))
|
|
{
|
|
Bsnprintf(cwd,sizeof(cwd),"%s/"
|
|
#if defined(_WIN32)
|
|
"EDuke32 Settings"
|
|
#elif defined(__APPLE__)
|
|
"Library/Application Support/EDuke32"
|
|
#else
|
|
".eduke32"
|
|
#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);
|
|
Bfree(homedir);
|
|
}
|
|
}
|
|
|
|
// JBF 20031220: Because it's annoying renaming GRP files whenever I want to test different game data
|
|
if (getenv("DUKE3DGRP"))
|
|
{
|
|
duke3dgrp = getenv("DUKE3DGRP");
|
|
initprintf("Using %s as main GRP file\n", duke3dgrp);
|
|
}
|
|
|
|
i = initgroupfile(duke3dgrp);
|
|
|
|
if (!NoAutoLoad)
|
|
{
|
|
getfilenames("autoload","*.grp");
|
|
while (findfiles) { Bsprintf(tempbuf,"autoload/%s",findfiles->name); initprintf("Using group file '%s'.\n",tempbuf); initgroupfile(tempbuf); findfiles = findfiles->next; }
|
|
getfilenames("autoload","*.zip");
|
|
while (findfiles) { Bsprintf(tempbuf,"autoload/%s",findfiles->name); initprintf("Using group file '%s'.\n",tempbuf); initgroupfile(tempbuf); findfiles = findfiles->next; }
|
|
getfilenames("autoload","*.pk3");
|
|
while (findfiles) { Bsprintf(tempbuf,"autoload/%s",findfiles->name); initprintf("Using group file '%s'.\n",tempbuf); initgroupfile(tempbuf); findfiles = findfiles->next; }
|
|
|
|
if (i != -1)
|
|
DoAutoload(duke3dgrp);
|
|
}
|
|
|
|
if (getenv("DUKE3DDEF"))
|
|
{
|
|
defsfilename = getenv("DUKE3DDEF");
|
|
initprintf("Using '%s' as definitions file\n", defsfilename);
|
|
}
|
|
loadgroupfiles(defsfilename);
|
|
|
|
{
|
|
struct strllist *s;
|
|
int32_t j;
|
|
|
|
pathsearchmode = 1;
|
|
while (CommandGrps)
|
|
{
|
|
s = CommandGrps->next;
|
|
j = initgroupfile(CommandGrps->str);
|
|
if (j == -1) initprintf("Could not find group file '%s'.\n",CommandGrps->str);
|
|
else
|
|
{
|
|
initprintf("Using group file '%s'.\n",CommandGrps->str);
|
|
if (!NoAutoLoad)
|
|
DoAutoload(CommandGrps->str);
|
|
}
|
|
|
|
free(CommandGrps->str);
|
|
free(CommandGrps);
|
|
CommandGrps = s;
|
|
}
|
|
pathsearchmode = 0;
|
|
}
|
|
|
|
bpp = 32;
|
|
|
|
#if defined(POLYMOST) && defined(USE_OPENGL)
|
|
glusetexcache = glusetexcachecompression = -1;
|
|
|
|
initprintf("Using config file '%s'.\n",setupfilename);
|
|
if (loadsetup(setupfilename) < 0) initprintf("Configuration file not found, using defaults.\n"), rv = 1;
|
|
|
|
if (glusetexcache == -1 || glusetexcachecompression == -1)
|
|
{
|
|
int32_t i;
|
|
#if 0
|
|
i=wm_ynbox("Texture Cache",
|
|
"Would you like to enable the on-disk texture cache?\n\n"
|
|
"You generally want to say 'yes' here, especially if using the HRP.");
|
|
#else
|
|
i = 1;
|
|
#endif
|
|
if (i)
|
|
glusetexcompr = glusetexcache = glusetexcachecompression = 1;
|
|
else glusetexcache = glusetexcachecompression = 0;
|
|
}
|
|
#endif
|
|
|
|
Bmemcpy((void *)buildkeys,(void *)keys,NUMBUILDKEYS); //Trick to make build use setup.dat keys
|
|
|
|
if (initengine())
|
|
{
|
|
initprintf("There was a problem initializing the engine.\n");
|
|
return -1;
|
|
}
|
|
|
|
kensplayerheight = 40; //32
|
|
zmode = 2;
|
|
zlock = kensplayerheight<<8;
|
|
defaultspritecstat = 0;
|
|
|
|
ReadGamePalette();
|
|
// InitWater();
|
|
|
|
InitCustomColors();
|
|
|
|
getmessageleng = 0;
|
|
getmessagetimeoff = 0;
|
|
|
|
Bstrcpy(apptitle, "Mapster32"VERSION BUILDDATE);
|
|
autosavetimer = totalclock+120*autosave;
|
|
|
|
#if defined(_WIN32) && defined(DUKEOSD)
|
|
OSD_SetFunctions(
|
|
/* GAME_drawosdchar,
|
|
GAME_drawosdstr,
|
|
GAME_drawosdcursor,
|
|
GAME_getcolumnwidth,
|
|
GAME_getrowheight,*/
|
|
0,0,0,0,0,
|
|
GAME_clearbackground,
|
|
(int32_t(*)(void))GetTime,
|
|
NULL
|
|
);
|
|
#endif
|
|
|
|
OSD_SetParameters(0,2, 0,0, 4,0);
|
|
registerosdcommands();
|
|
|
|
loadtilegroups("tiles.cfg");
|
|
|
|
ReadHelpFile("m32help.hlp");
|
|
|
|
return rv;
|
|
}
|
|
|
|
#ifdef RENDERTYPEWIN
|
|
void app_crashhandler(void)
|
|
{
|
|
if (levelname[0])
|
|
{
|
|
char *f;
|
|
fixspritesectors(); //Do this before saving!
|
|
updatesector(startposx,startposy,&startsectnum);
|
|
if (pathsearchmode)
|
|
f = levelname;
|
|
else
|
|
{
|
|
// virtual filesystem mode can't save to directories so drop the file into
|
|
// the current directory
|
|
f = strrchr(levelname, '/');
|
|
if (!f) f = levelname; else f++;
|
|
}
|
|
f=strstr(levelname,".map");
|
|
if (f)
|
|
Bstrcpy(f,"_crash.map");
|
|
else Bstrcat(f,"_crash.map");
|
|
ExtPreSaveMap();
|
|
saveboard(levelname,&startposx,&startposy,&startposz,&startang,&startsectnum);
|
|
ExtSaveMap(levelname);
|
|
}
|
|
}
|
|
#endif
|
|
|
|
void ExtUnInit(void)
|
|
{
|
|
int32_t i;
|
|
// setvmode(0x03);
|
|
S_SoundShutdown();
|
|
uninitgroupfile();
|
|
writesetup(setupfilename);
|
|
|
|
for (i = MAX_TILE_GROUPS-1; i >= 0; i--)
|
|
{
|
|
if (s_TileGroups[i].pIds != NULL)
|
|
Bfree(s_TileGroups[i].pIds);
|
|
if (s_TileGroups[i].szText != NULL)
|
|
Bfree(s_TileGroups[i].szText);
|
|
}
|
|
for (i = numhelppages-1; i >= 0; i--) free(helppage[i]);
|
|
if (helppage) free(helppage);
|
|
}
|
|
|
|
void ExtPreCheckKeys(void) // just before drawrooms
|
|
{
|
|
int32_t i = 0, ii;
|
|
int32_t radius, xp1, yp1;
|
|
int32_t col;
|
|
int32_t picnum, frames;
|
|
int32_t ang = 0, flags, shade;
|
|
|
|
if (qsetmode == 200) //In 3D mode
|
|
{
|
|
if (shadepreview)
|
|
{
|
|
int32_t i = 0;
|
|
for (i=numsprites-1; i>=0; i--)
|
|
if (sprite[i].picnum == SECTOREFFECTOR && (sprite[i].lotag == 12 || sprite[i].lotag == 3))
|
|
{
|
|
int32_t w;
|
|
int32_t start_wall = sector[sprite[i].sectnum].wallptr;
|
|
int32_t end_wall = start_wall + sector[sprite[i].sectnum].wallnum;
|
|
|
|
for (w = start_wall; w < end_wall; w++)
|
|
{
|
|
if (!wallflag[w])
|
|
{
|
|
wallshades[w] = wall[w].shade;
|
|
wall[w].shade = sprite[i].shade;
|
|
wallpals[w] = wall[w].pal;
|
|
wall[w].pal = sprite[i].pal;
|
|
wallflag[w] = 1;
|
|
}
|
|
/* if (wall[w].nextwall >= 0)
|
|
{
|
|
if (!wallflag[wall[w].nextwall])
|
|
{
|
|
wallshades[wall[w].nextwall] = wall[wall[w].nextwall].shade;
|
|
wall[wall[w].nextwall].shade = sprite[i].shade;
|
|
wallpals[wall[w].nextwall] = wall[wall[w].nextwall].pal;
|
|
wall[wall[w].nextwall].pal = sprite[i].pal;
|
|
wallflag[wall[w].nextwall] = 1;
|
|
}
|
|
} */
|
|
}
|
|
sectorshades[sprite[i].sectnum][0] = sector[sprite[i].sectnum].floorshade;
|
|
sectorshades[sprite[i].sectnum][1] = sector[sprite[i].sectnum].ceilingshade;
|
|
sector[sprite[i].sectnum].floorshade = sprite[i].shade;
|
|
sector[sprite[i].sectnum].ceilingshade = sprite[i].shade;
|
|
sectorpals[sprite[i].sectnum][0] = sector[sprite[i].sectnum].floorpal;
|
|
sectorpals[sprite[i].sectnum][1] = sector[sprite[i].sectnum].ceilingpal;
|
|
sector[sprite[i].sectnum].floorpal = sprite[i].pal;
|
|
sector[sprite[i].sectnum].ceilingpal = sprite[i].pal;
|
|
w = headspritesect[sprite[i].sectnum];
|
|
while (w >= 0)
|
|
{
|
|
if (w == i) { w = nextspritesect[w]; continue; }
|
|
spriteshades[w] = sprite[w].shade;
|
|
sprite[w].shade = sprite[i].shade;
|
|
spritepals[w] = sprite[w].pal;
|
|
sprite[w].pal = sprite[i].pal;
|
|
w = nextspritesect[w];
|
|
}
|
|
}
|
|
else if (sprite[i].picnum == SECTOREFFECTOR && (sprite[i].lotag == 49 || sprite[i].lotag == 50))
|
|
{
|
|
#ifdef POLYMER
|
|
if (sprite[i].lotag == 49)
|
|
{
|
|
if (getrendermode() == 4)
|
|
{
|
|
if (spritelightptr[i] == NULL)
|
|
{
|
|
#pragma pack(push,1)
|
|
_prlight mylight;
|
|
#pragma pack(pop)
|
|
mylight.sector = SECT;
|
|
Bmemcpy(&mylight, &sprite[i], sizeof(vec3_t));
|
|
mylight.range = SHT;
|
|
mylight.color[0] = sprite[i].xvel;
|
|
mylight.color[1] = sprite[i].yvel;
|
|
mylight.color[2] = sprite[i].zvel;
|
|
mylight.radius = 0;
|
|
mylight.angle = SA;
|
|
mylight.horiz = SH;
|
|
mylight.minshade = sprite[i].xoffset;
|
|
mylight.maxshade = sprite[i].yoffset;
|
|
|
|
if (CS & 2)
|
|
{
|
|
if (CS & 512)
|
|
mylight.priority = PR_LIGHT_PRIO_LOW;
|
|
else
|
|
mylight.priority = PR_LIGHT_PRIO_HIGH;
|
|
}
|
|
else
|
|
mylight.priority = PR_LIGHT_PRIO_MAX;
|
|
|
|
spritelightid[i] = polymer_addlight(&mylight);
|
|
if (spritelightid[i] >= 0)
|
|
spritelightptr[i] = &prlights[spritelightid[i]];
|
|
}
|
|
else
|
|
{
|
|
if (Bmemcmp(&sprite[i], spritelightptr[i], sizeof(vec3_t)))
|
|
{
|
|
Bmemcpy(spritelightptr[i], &sprite[i], sizeof(vec3_t));
|
|
spritelightptr[i]->sector = sprite[i].sectnum;
|
|
spritelightptr[i]->flags.invalidate = 1;
|
|
}
|
|
if (SHT != spritelightptr[i]->range)
|
|
{
|
|
spritelightptr[i]->range = SHT;
|
|
spritelightptr[i]->flags.invalidate = 1;
|
|
}
|
|
if ((sprite[i].xvel != spritelightptr[i]->color[0]) ||
|
|
(sprite[i].yvel != spritelightptr[i]->color[1]) ||
|
|
(sprite[i].zvel != spritelightptr[i]->color[2]))
|
|
{
|
|
spritelightptr[i]->color[0] = sprite[i].xvel;
|
|
spritelightptr[i]->color[1] = sprite[i].yvel;
|
|
spritelightptr[i]->color[2] = sprite[i].zvel;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (sprite[i].lotag == 50)
|
|
{
|
|
if (getrendermode() == 4)
|
|
{
|
|
if (spritelightptr[i] == NULL)
|
|
{
|
|
#pragma pack(push,1)
|
|
_prlight mylight;
|
|
#pragma pack(pop)
|
|
|
|
mylight.sector = SECT;
|
|
Bmemcpy(&mylight, &sprite[i], sizeof(vec3_t));
|
|
mylight.range = SHT;
|
|
mylight.color[0] = sprite[i].xvel;
|
|
mylight.color[1] = sprite[i].yvel;
|
|
mylight.color[2] = sprite[i].zvel;
|
|
mylight.radius = (256-(SS+128))<<1;
|
|
mylight.faderadius = (int16_t)(mylight.radius * 0.75f);
|
|
mylight.angle = SA;
|
|
mylight.horiz = SH;
|
|
mylight.minshade = sprite[i].xoffset;
|
|
mylight.maxshade = sprite[i].yoffset;
|
|
|
|
if (CS & 2)
|
|
{
|
|
if (CS & 512)
|
|
mylight.priority = PR_LIGHT_PRIO_LOW;
|
|
else
|
|
mylight.priority = PR_LIGHT_PRIO_HIGH;
|
|
}
|
|
else
|
|
mylight.priority = PR_LIGHT_PRIO_MAX;
|
|
|
|
spritelightid[i] = polymer_addlight(&mylight);
|
|
if (spritelightid[i] >= 0)
|
|
spritelightptr[i] = &prlights[spritelightid[i]];
|
|
}
|
|
else
|
|
{
|
|
if (Bmemcmp(&sprite[i], spritelightptr[i], sizeof(vec3_t)))
|
|
{
|
|
Bmemcpy(spritelightptr[i], &sprite[i], sizeof(vec3_t));
|
|
spritelightptr[i]->sector = sprite[i].sectnum;
|
|
spritelightptr[i]->flags.invalidate = 1;
|
|
}
|
|
if (SHT != spritelightptr[i]->range)
|
|
{
|
|
spritelightptr[i]->range = SHT;
|
|
spritelightptr[i]->flags.invalidate = 1;
|
|
}
|
|
if ((sprite[i].xvel != spritelightptr[i]->color[0]) ||
|
|
(sprite[i].yvel != spritelightptr[i]->color[1]) ||
|
|
(sprite[i].zvel != spritelightptr[i]->color[2]))
|
|
{
|
|
spritelightptr[i]->color[0] = sprite[i].xvel;
|
|
spritelightptr[i]->color[1] = sprite[i].yvel;
|
|
spritelightptr[i]->color[2] = sprite[i].zvel;
|
|
}
|
|
if (((256-(SS+128))<<1) != spritelightptr[i]->radius)
|
|
{
|
|
spritelightptr[i]->radius = (256-(SS+128))<<1;
|
|
spritelightptr[i]->faderadius = (int16_t)(spritelightptr[i]->radius * 0.75f);
|
|
spritelightptr[i]->flags.invalidate = 1;
|
|
}
|
|
if (SA != spritelightptr[i]->angle)
|
|
{
|
|
spritelightptr[i]->angle = SA;
|
|
spritelightptr[i]->flags.invalidate = 1;
|
|
}
|
|
if (SH != spritelightptr[i]->horiz)
|
|
{
|
|
spritelightptr[i]->horiz = SH;
|
|
spritelightptr[i]->flags.invalidate = 1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#endif // POLYMER
|
|
}
|
|
}
|
|
if (floor_over_floor) SE40Code(pos.x,pos.y,pos.z,ang,horiz);
|
|
if (purpleon) clearview(255);
|
|
if (sidemode != 0)
|
|
{
|
|
lockbyte4094 = 1;
|
|
if (waloff[4094] == 0)
|
|
allocache(&waloff[4094],320L*200L,&lockbyte4094);
|
|
setviewtotile(4094,320L,200L);
|
|
searchx ^= searchy;
|
|
searchy ^= searchx;
|
|
searchx ^= searchy;
|
|
searchx = ydim-1-searchx;
|
|
}
|
|
return;
|
|
}
|
|
begindrawing();
|
|
|
|
// if (cursectornum >= 0)
|
|
// fillsector(cursectornum, 31);
|
|
|
|
if (graphicsmode && zoom >= 256)
|
|
{
|
|
for (i=ii=0; i<MAXSPRITES && ii < numsprites; i++)
|
|
{
|
|
if ((sprite[i].cstat & 48) != 0 || sprite[i].statnum == MAXSTATUS) continue;
|
|
ii++;
|
|
picnum = sprite[i].picnum;
|
|
ang = flags = frames = shade = 0;
|
|
|
|
switch (picnum)
|
|
{
|
|
// 5-frame walk
|
|
case 1550 : // Shark
|
|
frames=5;
|
|
// 2-frame walk
|
|
case 1445 : // duke kick
|
|
case LIZTROOPDUCKING :
|
|
case 2030 : // pig shot
|
|
case OCTABRAIN :
|
|
case PIGCOPDIVE :
|
|
case 2190 : // liz capt shot
|
|
case BOSS1SHOOT :
|
|
case BOSS1LOB :
|
|
case LIZTROOPSHOOT :
|
|
if (frames==0) frames=2;
|
|
|
|
// 4-frame walk
|
|
case 1491 : // duke crawl
|
|
case LIZTROOP :
|
|
case LIZTROOPRUNNING :
|
|
case PIGCOP :
|
|
case LIZMAN :
|
|
case BOSS1 :
|
|
case BOSS2 :
|
|
case BOSS3 :
|
|
case BOSS4 :
|
|
case NEWBEAST:
|
|
if (frames==0) frames=4;
|
|
case LIZTROOPJETPACK :
|
|
case DRONE :
|
|
case COMMANDER :
|
|
case TANK :
|
|
case RECON :
|
|
if (frames==0) frames = 10;
|
|
case CAMERA1:
|
|
case APLAYER :
|
|
if (frames==0) frames=1;
|
|
case GREENSLIME :
|
|
case EGG :
|
|
case PIGCOPSTAYPUT :
|
|
case LIZMANSTAYPUT:
|
|
case LIZTROOPSTAYPUT :
|
|
case LIZMANSPITTING :
|
|
case LIZMANFEEDING :
|
|
case LIZMANJUMP :
|
|
|
|
{
|
|
int32_t k;
|
|
if (frames!=0)
|
|
{
|
|
if (frames==10) frames=0;
|
|
k = 1536;//getangle(tspr->x-pos.x,tspr->y-pos.y);
|
|
k = (((sprite[i].ang+3072+128-k)&2047)>>8)&7;
|
|
//This guy has only 5 pictures for 8 angles (3 are x-flipped)
|
|
if (k <= 4)
|
|
{
|
|
picnum += k;
|
|
ang = 0;
|
|
flags &= ~4;
|
|
}
|
|
else
|
|
{
|
|
picnum += 8-k;
|
|
ang = 1024;
|
|
flags |= 4;
|
|
}
|
|
}
|
|
|
|
if (graphicsmode == 2)
|
|
{
|
|
if (frames==2) picnum+=((((4-(totalclock>>5)))&1)*5);
|
|
if (frames==4) picnum+=((((4-(totalclock>>5)))&3)*5);
|
|
if (frames==5) picnum+=(((totalclock>>5)%5))*5;
|
|
}
|
|
|
|
if (tilesizx[picnum] == 0)
|
|
picnum -= 5; //Hack, for actors
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
|
|
}
|
|
|
|
xp1 = mulscale14(sprite[i].x-pos.x,zoom);
|
|
yp1 = mulscale14(sprite[i].y-pos.y-(tilesizy[picnum]<<2),zoom);
|
|
if (i+16384 != pointhighlight || !(totalclock&32))
|
|
{
|
|
shade = sprite[i].shade;
|
|
if (shade < 6)
|
|
shade = 6;
|
|
}
|
|
|
|
xp1 += halfxdim16;
|
|
yp1 += midydim16;
|
|
|
|
ydim16 = ydim-STATUS2DSIZ2;
|
|
|
|
if (xp1 < 4 || xp1 > xdim-6 || yp1 < 4 || yp1 > ydim16-6)
|
|
continue;
|
|
rotatesprite(xp1<<16,yp1<<16,zoom<<5,ang,picnum,
|
|
shade,sprite[i].pal,flags,0,0,xdim-1,ydim16-1);
|
|
}
|
|
}
|
|
|
|
for (i=0; i<numsprites; i++)
|
|
if (sprite[i].picnum == 5 /*&& zoom >= 256*/ && sprite[i].sectnum != MAXSECTORS)
|
|
{
|
|
xp1 = mulscale14(sprite[i].x-pos.x,zoom);
|
|
yp1 = mulscale14(sprite[i].y-pos.y,zoom);
|
|
|
|
radius = mulscale14(sprite[i].hitag,zoom);
|
|
col = 6;
|
|
if (i+16384 == pointhighlight)
|
|
if (totalclock & 32) col += (2<<2);
|
|
drawlinepat = 0xf0f0f0f0;
|
|
drawcircle16(halfxdim16+xp1, midydim16+yp1, radius, editorcolors[(int32_t)col]);
|
|
drawlinepat = 0xffffffff;
|
|
// radius = mulscale15(sprite[i].hitag,zoom);
|
|
// drawcircle16(halfxdim16+xp1, midydim16+yp1, radius, col);
|
|
}
|
|
|
|
enddrawing();
|
|
}
|
|
|
|
void ExtAnalyzeSprites(void)
|
|
{
|
|
int32_t i, k;
|
|
spritetype *tspr;
|
|
int32_t frames=0, l;
|
|
|
|
#ifdef POLYMER
|
|
gamelightcount = 0;
|
|
|
|
for (i=numsprites-1; i>=0; i--)
|
|
{
|
|
if (sprite[i].picnum == SECTOREFFECTOR && sprite[i].lotag == 49)
|
|
{
|
|
gamelights[gamelightcount&(PR_MAXLIGHTS-1)].sector = SECT;
|
|
gamelights[gamelightcount&(PR_MAXLIGHTS-1)].x = SX;
|
|
gamelights[gamelightcount&(PR_MAXLIGHTS-1)].y = SY;
|
|
gamelights[gamelightcount&(PR_MAXLIGHTS-1)].z = SZ;
|
|
gamelights[gamelightcount&(PR_MAXLIGHTS-1)].range = SHT;
|
|
if ((sprite[i].xvel | sprite[i].yvel | sprite[i].zvel) != 0)
|
|
{
|
|
gamelights[gamelightcount&(PR_MAXLIGHTS-1)].color[0] = sprite[i].xvel;
|
|
gamelights[gamelightcount&(PR_MAXLIGHTS-1)].color[1] = sprite[i].yvel;
|
|
gamelights[gamelightcount&(PR_MAXLIGHTS-1)].color[2] = sprite[i].zvel;
|
|
}
|
|
else
|
|
{
|
|
gamelights[gamelightcount&(PR_MAXLIGHTS-1)].color[0] = hictinting[PL].r;
|
|
gamelights[gamelightcount&(PR_MAXLIGHTS-1)].color[1] = hictinting[PL].g;
|
|
gamelights[gamelightcount&(PR_MAXLIGHTS-1)].color[2] = hictinting[PL].b;
|
|
}
|
|
gamelights[gamelightcount&(PR_MAXLIGHTS-1)].radius = 0;
|
|
gamelights[gamelightcount&(PR_MAXLIGHTS-1)].angle = SA;
|
|
gamelights[gamelightcount&(PR_MAXLIGHTS-1)].horiz = SH;
|
|
gamelights[gamelightcount&(PR_MAXLIGHTS-1)].minshade = sprite[i].xoffset;
|
|
gamelights[gamelightcount&(PR_MAXLIGHTS-1)].maxshade = sprite[i].yoffset;
|
|
// gamelights[gamelightcount&(PR_MAXLIGHTS-1)].priority = SS;
|
|
|
|
if (CS & 2)
|
|
{
|
|
if (CS & 512)
|
|
gamelights[gamelightcount&(PR_MAXLIGHTS-1)].priority = PR_LIGHT_PRIO_LOW;
|
|
else
|
|
gamelights[gamelightcount&(PR_MAXLIGHTS-1)].priority = PR_LIGHT_PRIO_HIGH;
|
|
}
|
|
else
|
|
gamelights[gamelightcount&(PR_MAXLIGHTS-1)].priority = PR_LIGHT_PRIO_MAX;
|
|
|
|
gamelightcount++;
|
|
}
|
|
if (sprite[i].picnum == SECTOREFFECTOR && sprite[i].lotag == 50)
|
|
{
|
|
gamelights[gamelightcount&(PR_MAXLIGHTS-1)].sector = SECT;
|
|
gamelights[gamelightcount&(PR_MAXLIGHTS-1)].x = SX;
|
|
gamelights[gamelightcount&(PR_MAXLIGHTS-1)].y = SY;
|
|
gamelights[gamelightcount&(PR_MAXLIGHTS-1)].z = SZ;
|
|
gamelights[gamelightcount&(PR_MAXLIGHTS-1)].range = SHT;
|
|
if ((sprite[i].xvel | sprite[i].yvel | sprite[i].zvel) != 0)
|
|
{
|
|
gamelights[gamelightcount&(PR_MAXLIGHTS-1)].color[0] = sprite[i].xvel;
|
|
gamelights[gamelightcount&(PR_MAXLIGHTS-1)].color[1] = sprite[i].yvel;
|
|
gamelights[gamelightcount&(PR_MAXLIGHTS-1)].color[2] = sprite[i].zvel;
|
|
}
|
|
else
|
|
{
|
|
gamelights[gamelightcount&(PR_MAXLIGHTS-1)].color[0] = hictinting[PL].r;
|
|
gamelights[gamelightcount&(PR_MAXLIGHTS-1)].color[1] = hictinting[PL].g;
|
|
gamelights[gamelightcount&(PR_MAXLIGHTS-1)].color[2] = hictinting[PL].b;
|
|
}
|
|
gamelights[gamelightcount&(PR_MAXLIGHTS-1)].radius = (256-(SS+128))<<1;
|
|
gamelights[gamelightcount&(PR_MAXLIGHTS-1)].faderadius = (int16_t)(gamelights[gamelightcount&(PR_MAXLIGHTS-1)].radius * 0.75f);
|
|
gamelights[gamelightcount&(PR_MAXLIGHTS-1)].angle = SA;
|
|
gamelights[gamelightcount&(PR_MAXLIGHTS-1)].horiz = SH;
|
|
gamelights[gamelightcount&(PR_MAXLIGHTS-1)].minshade = sprite[i].xoffset;
|
|
gamelights[gamelightcount&(PR_MAXLIGHTS-1)].maxshade = sprite[i].yoffset;
|
|
|
|
if (CS & 2)
|
|
{
|
|
if (CS & 512)
|
|
gamelights[gamelightcount&(PR_MAXLIGHTS-1)].priority = PR_LIGHT_PRIO_LOW;
|
|
else
|
|
gamelights[gamelightcount&(PR_MAXLIGHTS-1)].priority = PR_LIGHT_PRIO_HIGH;
|
|
}
|
|
else
|
|
gamelights[gamelightcount&(PR_MAXLIGHTS-1)].priority = PR_LIGHT_PRIO_MAX;
|
|
|
|
gamelightcount++;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
for (i=0,tspr=&tsprite[0]; i<spritesortcnt; i++,tspr++)
|
|
{
|
|
frames=0;
|
|
|
|
if ((nosprites==1||nosprites==3)&&tspr->picnum<11) tspr->xrepeat=0;
|
|
|
|
if (nosprites==1||nosprites==3)
|
|
switch (tspr->picnum)
|
|
{
|
|
case SEENINE :
|
|
tspr->xrepeat=0;
|
|
}
|
|
|
|
if (shadepreview && !(tspr->cstat & 16))
|
|
{
|
|
if (sector[tspr->sectnum].ceilingstat&1)
|
|
l = sector[tspr->sectnum].ceilingshade;
|
|
else
|
|
{
|
|
l = sector[tspr->sectnum].floorshade;
|
|
if (sector[tspr->sectnum].floorpal != 0 && sector[tspr->sectnum].floorpal < num_tables)
|
|
tspr->pal=sector[tspr->sectnum].floorpal;
|
|
}
|
|
if (l < -127) l = -127;
|
|
if (l > 126) l = 127;
|
|
|
|
tspr->shade = l;
|
|
|
|
}
|
|
|
|
switch (tspr->picnum)
|
|
{
|
|
// 5-frame walk
|
|
case 1550 : // Shark
|
|
frames=5;
|
|
// 2-frame walk
|
|
case 1445 : // duke kick
|
|
case LIZTROOPDUCKING :
|
|
case 2030 : // pig shot
|
|
case OCTABRAIN :
|
|
case PIGCOPDIVE :
|
|
case 2190 : // liz capt shot
|
|
case BOSS1SHOOT :
|
|
case BOSS1LOB :
|
|
case LIZTROOPSHOOT :
|
|
if (frames==0) frames=2;
|
|
|
|
// 4-frame walk
|
|
case 1491 : // duke crawl
|
|
case LIZTROOP :
|
|
case LIZTROOPRUNNING :
|
|
case PIGCOP :
|
|
case LIZMAN :
|
|
case BOSS1 :
|
|
case BOSS2 :
|
|
case BOSS3 :
|
|
case BOSS4 :
|
|
case NEWBEAST:
|
|
if (frames==0) frames=4;
|
|
case LIZTROOPJETPACK :
|
|
case DRONE :
|
|
case COMMANDER :
|
|
case TANK :
|
|
case RECON :
|
|
if (frames==0) frames = 10;
|
|
case ROTATEGUN :
|
|
case CAMERA1:
|
|
case APLAYER :
|
|
if (frames==0) frames=1;
|
|
case GREENSLIME :
|
|
case PIGCOPSTAYPUT :
|
|
case LIZMANSTAYPUT:
|
|
case LIZTROOPSTAYPUT :
|
|
case LIZMANSPITTING :
|
|
case LIZMANFEEDING :
|
|
case LIZMANJUMP :
|
|
if (skill!=4)
|
|
{
|
|
if (tspr->lotag>skill+1)
|
|
{
|
|
tspr->xrepeat=0;
|
|
tspr->cstat=32768;
|
|
break;
|
|
}
|
|
}
|
|
if (nosprites==2||nosprites==3)
|
|
{
|
|
tspr->xrepeat=0;
|
|
tspr->cstat=32768;
|
|
}
|
|
// else tspr->cstat&=32767;
|
|
|
|
#if defined(USE_OPENGL) && defined(POLYMOST)
|
|
if (!usemodels || md_tilehasmodel(tspr->picnum,tspr->pal) < 0)
|
|
#endif
|
|
{
|
|
if (frames!=0)
|
|
{
|
|
if (frames==10) frames=0;
|
|
k = getangle(tspr->x-pos.x,tspr->y-pos.y);
|
|
k = (((tspr->ang+3072+128-k)&2047)>>8)&7;
|
|
//This guy has only 5 pictures for 8 angles (3 are x-flipped)
|
|
if (k <= 4)
|
|
{
|
|
tspr->picnum += k;
|
|
tspr->cstat &= ~4; //clear x-flipping bit
|
|
}
|
|
else
|
|
{
|
|
tspr->picnum += 8-k;
|
|
tspr->cstat |= 4; //set x-flipping bit
|
|
}
|
|
}
|
|
|
|
if (frames==2) tspr->picnum+=((((4-(totalclock>>5)))&1)*5);
|
|
if (frames==4) tspr->picnum+=((((4-(totalclock>>5)))&3)*5);
|
|
if (frames==5) tspr->picnum+=(((totalclock>>5)%5))*5;
|
|
|
|
if (tilesizx[tspr->picnum] == 0)
|
|
tspr->picnum -= 5; //Hack, for actors
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
|
|
}
|
|
}
|
|
|
|
X_OnEvent(EVENT_ANALYZESPRITES, -1);
|
|
}
|
|
|
|
#define MESSAGEX 3 // (xdimgame>>1)
|
|
#define MESSAGEY 3 // ((i/charsperline)<<3)+(ydimgame-(ydimgame>>3))-(((getmessageleng-1)/charsperline)<<3)
|
|
|
|
static void Keys2d3d(void)
|
|
{
|
|
int32_t i;
|
|
|
|
if (mapstate == NULL)
|
|
{
|
|
// map_revision = 0;
|
|
create_map_snapshot(); // initial map state
|
|
// Bfree(mapstate->next);
|
|
// mapstate = mapstate->prev;
|
|
}
|
|
|
|
if (keystatus[KEYSC_QUOTE] && keystatus[KEYSC_A]) // ' a
|
|
{
|
|
keystatus[KEYSC_A] = 0;
|
|
|
|
if (qsetmode == 200) autosave=autosave?0:getnumber256("Autosave interval, in seconds: ",180,3600,0);
|
|
else autosave=autosave?0:getnumber16("Autosave interval, in seconds: ",180,3600,0);
|
|
|
|
if (autosave) message("Autosave enabled, interval: %d seconds",autosave);
|
|
else message("Autosave disabled");
|
|
}
|
|
|
|
if (keystatus[KEYSC_QUOTE] && keystatus[KEYSC_N]) // ' n
|
|
{
|
|
keystatus[KEYSC_N] = 0;
|
|
noclip=!noclip;
|
|
if (noclip) message("Clipping disabled");
|
|
else message("Clipping enabled");
|
|
}
|
|
|
|
if (eitherCTRL && keystatus[KEYSC_N]) // CTRL+N
|
|
{
|
|
keystatus[KEYSC_N] = 0;
|
|
spnoclip=!spnoclip;
|
|
if (spnoclip) message("Sprite clipping disabled");
|
|
else message("Sprite clipping enabled");
|
|
}
|
|
|
|
if (eitherCTRL) //CTRL
|
|
{
|
|
char *f;
|
|
if (pathsearchmode) f = levelname;
|
|
else
|
|
{
|
|
// virtual filesystem mode can't save to directories so drop the file into
|
|
// the current directory
|
|
f = strrchr(levelname, '/');
|
|
if (!f) f = levelname; else f++;
|
|
}
|
|
|
|
if (keystatus[KEYSC_P]) // Ctrl-P: Map playtesting
|
|
{
|
|
keystatus[KEYSC_P] = 0;
|
|
if (qsetmode != 200)
|
|
test_map(eitherALT);
|
|
}
|
|
|
|
if (keystatus[KEYSC_S]) // S
|
|
{
|
|
if (levelname[0])
|
|
{
|
|
fixspritesectors(); //Do this before saving!
|
|
updatesector(startposx,startposy,&startsectnum);
|
|
ExtPreSaveMap();
|
|
saveboard(f,&startposx,&startposy,&startposz,&startang,&startsectnum);
|
|
ExtSaveMap(f);
|
|
message("Board saved");
|
|
asksave = 0;
|
|
keystatus[KEYSC_S] = 0;
|
|
lastsave=totalclock;
|
|
}
|
|
}
|
|
if (keystatus[KEYSC_L]) // L
|
|
{
|
|
extern int32_t grponlymode;
|
|
extern void loadmhk();
|
|
|
|
if (totalclock < (lastsave + 120*10) || !AskIfSure("Are you sure you want to load the last saved map?"))
|
|
{
|
|
int32_t sposx=pos.x,sposy=pos.y,sposz=pos.z,sang=ang;
|
|
|
|
lastsave=totalclock;
|
|
highlightcnt = -1;
|
|
// sectorhighlightstat = -1;
|
|
// newnumwalls = -1;
|
|
// joinsector[0] = -1;
|
|
// circlewall = -1;
|
|
// circlepoints = 7;
|
|
|
|
for (i=MAXSECTORS-1; i>=0; i--) sector[i].extra = -1;
|
|
for (i=MAXWALLS-1; i>=0; i--) wall[i].extra = -1;
|
|
for (i=MAXSPRITES-1; i>=0; i--) sprite[i].extra = -1;
|
|
|
|
ExtPreLoadMap();
|
|
i = loadboard(f,(!pathsearchmode&&grponlymode?2:0),&pos.x,&pos.y,&pos.z,&ang,&cursectnum);
|
|
loadmhk();
|
|
if (i == -2) i = loadoldboard(f,(!pathsearchmode&&grponlymode?2:0),&pos.x,&pos.y,&pos.z,&ang,&cursectnum);
|
|
if (i < 0) printmessage16("Invalid map format.");
|
|
else
|
|
{
|
|
ExtLoadMap(f);
|
|
if (mapversion < 7) message("Map %s loaded successfully and autoconverted to V7!",f);
|
|
else message("Map %s loaded successfully",f);
|
|
}
|
|
updatenumsprites();
|
|
startposx = pos.x;
|
|
startposy = pos.y;
|
|
startposz = pos.z;
|
|
startang = ang;
|
|
startsectnum = cursectnum;
|
|
pos.x=sposx; pos.y=sposy; pos.z=sposz; ang=sang;
|
|
keystatus[KEYSC_L]=0;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (keystatus[buildkeys[BK_MODE2D_3D]]) // Enter
|
|
{
|
|
getmessageleng = 0;
|
|
getmessagetimeoff = 0;
|
|
#if defined(_WIN32) && defined(DUKEOSD)
|
|
if (qsetmode == 200)
|
|
{
|
|
OSD_SetFunctions(
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
(int32_t(*)(void))GetTime,
|
|
NULL
|
|
);
|
|
}
|
|
else
|
|
{
|
|
OSD_SetFunctions(
|
|
/* GAME_drawosdchar,
|
|
GAME_drawosdstr,
|
|
GAME_drawosdcursor,
|
|
GAME_getcolumnwidth,
|
|
GAME_getrowheight,*/
|
|
0,0,0,0,0,
|
|
GAME_clearbackground,
|
|
(int32_t(*)(void))GetTime,
|
|
NULL
|
|
);
|
|
}
|
|
#endif
|
|
}
|
|
|
|
if (getmessageleng > 0)
|
|
{
|
|
// charsperline = 64;
|
|
//if (dimensionmode[snum] == 2) charsperline = 80;
|
|
/* if (qsetmode == 200)
|
|
{
|
|
for (i=0;i<=getmessageleng;i+=charsperline)
|
|
{
|
|
for (j=0;j<charsperline;j++)
|
|
tempbuf[j] = getmessage[i+j];
|
|
if (getmessageleng < i+charsperline)
|
|
tempbuf[(getmessageleng-i)] = 0;
|
|
else
|
|
tempbuf[charsperline] = 0;
|
|
begindrawing();
|
|
if (tempbuf[charsperline] != 0)
|
|
{
|
|
printext256((MESSAGEX*(xdimgame/320.))+2,(MESSAGEY*(ydimgame/200.))+2,0,-1,tempbuf,xdimgame>640?0:1);
|
|
printext256(MESSAGEX*(xdimgame/320.),MESSAGEY*(ydimgame/200.),
|
|
(totalclock > (lastmessagetime + 120*5))?whitecol:256-5,-1,tempbuf,xdimgame>640?0:1);
|
|
}
|
|
enddrawing();
|
|
}
|
|
}
|
|
else */
|
|
if (qsetmode != 200)
|
|
printmessage16(getmessage);
|
|
if (totalclock > getmessagetimeoff)
|
|
getmessageleng = 0;
|
|
}
|
|
|
|
}
|
|
#undef EDUKE32_EXEC
|
|
#undef EDUKE32_LOCALEXEC
|
|
|
|
void ExtCheckKeys(void)
|
|
{
|
|
static int32_t soundinit = 0;
|
|
static int32_t lastbstatus = 0;
|
|
|
|
if (!soundinit)
|
|
{
|
|
g_numsounds = 0;
|
|
loadconsounds(gamecon);
|
|
if (g_numsounds > 0)
|
|
{
|
|
if (S_SoundStartup() != 0)
|
|
S_SoundShutdown();
|
|
}
|
|
soundinit = 1;
|
|
}
|
|
|
|
if (qsetmode == 200)
|
|
{
|
|
if (shadepreview)
|
|
{
|
|
int32_t i = 0;
|
|
for (i=numsprites-1; i>=0; i--)
|
|
if (sprite[i].picnum == SECTOREFFECTOR && (sprite[i].lotag == 12 || sprite[i].lotag == 3))
|
|
{
|
|
int32_t w;
|
|
int32_t start_wall = sector[sprite[i].sectnum].wallptr;
|
|
int32_t end_wall = start_wall + sector[sprite[i].sectnum].wallnum;
|
|
|
|
for (w = start_wall; w < end_wall; w++)
|
|
{
|
|
if (wallflag[w])
|
|
{
|
|
wall[w].shade = wallshades[w];
|
|
wall[w].pal = wallpals[w];
|
|
wallflag[w] = 0;
|
|
}
|
|
/* if (wall[w].nextwall >= 0)
|
|
{
|
|
if (wallflag[wall[w].nextwall])
|
|
{
|
|
wall[wall[w].nextwall].shade = wallshades[wall[w].nextwall];
|
|
wall[wall[w].nextwall].pal = wallpals[wall[w].nextwall];
|
|
wallflag[wall[w].nextwall] = 0;
|
|
}
|
|
} */
|
|
}
|
|
sector[sprite[i].sectnum].floorshade = sectorshades[sprite[i].sectnum][0];
|
|
sector[sprite[i].sectnum].ceilingshade = sectorshades[sprite[i].sectnum][1];
|
|
sector[sprite[i].sectnum].floorpal = sectorpals[sprite[i].sectnum][0];
|
|
sector[sprite[i].sectnum].ceilingpal = sectorpals[sprite[i].sectnum][1];
|
|
|
|
w = headspritesect[sprite[i].sectnum];
|
|
while (w >= 0)
|
|
{
|
|
if (w == i) { w = nextspritesect[w]; continue; }
|
|
sprite[w].shade = spriteshades[w];
|
|
sprite[w].pal = spritepals[w];
|
|
w = nextspritesect[w];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
lastbstatus = bstatus;
|
|
readmousebstatus(&bstatus);
|
|
|
|
Keys2d3d();
|
|
|
|
if (qsetmode == 200) //In 3D mode
|
|
{
|
|
Keys3d();
|
|
if (sidemode != 1)
|
|
{
|
|
editinput();
|
|
if (infobox&2)
|
|
m32_showmouse();
|
|
}
|
|
}
|
|
else Keys2d();
|
|
|
|
if (asksave == 1 && (bstatus + lastbstatus) == 0 && mapstate)
|
|
{
|
|
// message("Saved undo rev %d",map_revision);
|
|
create_map_snapshot();
|
|
asksave++;
|
|
}
|
|
else if (asksave == 2) asksave++;
|
|
|
|
if ((totalclock > autosavetimer) && (autosave))
|
|
{
|
|
if (asksave == 3)
|
|
{
|
|
fixspritesectors(); //Do this before saving!
|
|
// updatesector(startposx,startposy,&startsectnum);
|
|
ExtPreSaveMap();
|
|
saveboard("autosave.map",&startposx,&startposy,&startposz,&startang,&startsectnum);
|
|
ExtSaveMap("autosave.map");
|
|
message("Board autosaved to AUTOSAVE.MAP");
|
|
asksave = 4;
|
|
}
|
|
autosavetimer = totalclock+120*autosave;
|
|
}
|
|
|
|
if (keystatus[KEYSC_F12]) //F12
|
|
{
|
|
screencapture("captxxxx.tga",keystatus[KEYSC_LSHIFT]|keystatus[KEYSC_RSHIFT]);
|
|
message("Saved screenshot %04d",capturecount-1);
|
|
keystatus[KEYSC_F12] = 0;
|
|
}
|
|
}
|
|
|
|
void faketimerhandler(void)
|
|
{
|
|
int32_t i, dist;
|
|
int32_t hiz, hihit, loz, lohit, oposx, oposy;
|
|
int16_t hitwall, daang;
|
|
|
|
counter++;
|
|
if (counter>=5) counter=0;
|
|
|
|
sampletimer();
|
|
if (totalclock < ototalclock+TICSPERFRAME || qsetmode != 200 || sidemode != 1)
|
|
return;
|
|
ototalclock = totalclock;
|
|
|
|
oposx = pos.x;
|
|
oposy = pos.y;
|
|
|
|
hitwall = clipmove(&pos,&cursectnum,xvel,yvel,128L,4L<<8,4L<<8,0);
|
|
xvel = ((pos.x-oposx)<<14);
|
|
yvel = ((pos.y-oposy)<<14);
|
|
|
|
yvel += 80000;
|
|
if ((hitwall&0xc000) == 32768)
|
|
{
|
|
hitwall &= (MAXWALLS-1);
|
|
i = wall[hitwall].point2;
|
|
daang = getangle(wall[i].x-wall[hitwall].x,wall[i].y-wall[hitwall].y);
|
|
|
|
xvel -= (xvel>>4);
|
|
if (xvel < 0) xvel++;
|
|
if (xvel > 0) xvel--;
|
|
|
|
yvel -= (yvel>>4);
|
|
if (yvel < 0) yvel++;
|
|
if (yvel > 0) yvel--;
|
|
|
|
i = 4-keystatus[buildkeys[BK_RUN]];
|
|
xvel += mulscale(vel,(int32_t)sintable[(ang+512)&2047],i);
|
|
yvel += mulscale(vel,(int32_t)sintable[ang&2047],i);
|
|
|
|
if (((daang-ang)&2047) < 1024)
|
|
ang = ((ang+((((daang-ang)&2047)+24)>>4))&2047);
|
|
else
|
|
ang = ((ang-((((ang-daang)&2047)+24)>>4))&2047);
|
|
|
|
timoff = ototalclock;
|
|
}
|
|
else
|
|
{
|
|
if (ototalclock > timoff+32)
|
|
ang = ((ang+((timoff+32-ototalclock)>>4))&2047);
|
|
}
|
|
|
|
getzrange(&pos,cursectnum,&hiz,&hihit,&loz,&lohit,128L,0);
|
|
|
|
oposx -= pos.x;
|
|
oposy -= pos.y;
|
|
|
|
dist = ksqrt(oposx*oposx+oposy*oposy);
|
|
if (ototalclock > timoff+32) dist = 0;
|
|
|
|
daang = mulscale(dist,angvel,9);
|
|
pos.z += (daang<<6);
|
|
if (pos.z > loz-(4<<8)) pos.z = loz-(4<<8), hvel = 0;
|
|
if (pos.z < hiz+(4<<8)) pos.z = hiz+(4<<8), hvel = 0;
|
|
|
|
horiz = ((horiz*7+(100-(daang>>1)))>>3);
|
|
if (horiz < 100) horiz++;
|
|
if (horiz > 100) horiz--;
|
|
}
|
|
|
|
extern int16_t brightness;
|
|
|
|
void SetBOSS1Palette(void)
|
|
{
|
|
if (acurpalette==3) return;
|
|
acurpalette=3;
|
|
setbrightness(brightness,BOSS1palette,0);
|
|
}
|
|
|
|
void SetSLIMEPalette(void)
|
|
{
|
|
if (acurpalette==2) return;
|
|
acurpalette=2;
|
|
setbrightness(brightness,SLIMEpalette,0);
|
|
}
|
|
|
|
void SetWATERPalette(void)
|
|
{
|
|
if (acurpalette==1) return;
|
|
acurpalette=1;
|
|
setbrightness(brightness,WATERpalette,0);
|
|
}
|
|
|
|
void SetGAMEPalette(void)
|
|
{
|
|
if (acurpalette==0) return;
|
|
acurpalette=0;
|
|
setbrightness(brightness,GAMEpalette,0);
|
|
}
|
|
|
|
static void SearchSectorsForward()
|
|
{
|
|
int32_t ii=0;
|
|
if (cursector_lotag!=0)
|
|
{
|
|
if (cursectornum<MAXSECTORS) cursectornum++;
|
|
for (ii=cursectornum; ii<=MAXSECTORS; ii++)
|
|
{
|
|
if (sector[ii].lotag==cursector_lotag)
|
|
{
|
|
pos.x=wall[sector[ii].wallptr].x;
|
|
pos.y=wall[sector[ii].wallptr].y;
|
|
printmessage16("> Sector search: found");
|
|
// cursectornum++;
|
|
keystatus[KEYSC_RBRACK]=0; // ]
|
|
return;
|
|
}
|
|
cursectornum++;
|
|
}
|
|
}
|
|
printmessage16("> Sector search: none found");
|
|
}
|
|
|
|
static void SearchSectorsBackward()
|
|
{
|
|
int32_t ii=0;
|
|
if (cursector_lotag!=0)
|
|
{
|
|
if (cursectornum>0) cursectornum--;
|
|
for (ii=cursectornum; ii>=0; ii--)
|
|
{
|
|
if (sector[ii].lotag==cursector_lotag)
|
|
{
|
|
pos.x=wall[sector[ii].wallptr].x;
|
|
pos.y=wall[sector[ii].wallptr].y;
|
|
printmessage16("< Sector search: found");
|
|
// cursectornum--;
|
|
keystatus[KEYSC_LBRACK]=0; // [
|
|
return;
|
|
}
|
|
cursectornum--;
|
|
}
|
|
}
|
|
printmessage16("< Sector search: none found");
|
|
}
|
|
|
|
// Build edit originally by Ed Coolidge <semicharm@earthlink.net>
|
|
static void EditSectorData(int16_t sectnum)
|
|
{
|
|
char disptext[80];
|
|
char edittext[80];
|
|
int32_t col=1, row=0, rowmax = 6, dispwidth = 24, editval = 0, i = -1;
|
|
int32_t xpos = 208, ypos = ydim-STATUS2DSIZ+48;
|
|
|
|
disptext[dispwidth] = 0;
|
|
col = whitecol-21;
|
|
|
|
begindrawing();
|
|
for (i=ydim-STATUS2DSIZ+16; i<ydim; i++)
|
|
{
|
|
// drawline256(0, i<<12, xdim<<12, i<<12, col);
|
|
clearbufbyte((char *)(frameplace + (i*bytesperline)), bytesperline, ((int32_t)col<<24)|((int32_t)col<<16)|((int32_t)col<<8)|col);
|
|
col--;
|
|
if (col <= 0) break;
|
|
}
|
|
|
|
clearbufbyte((char *)(frameplace + (i*bytesperline)), (ydim-i)*(bytesperline), 0);
|
|
|
|
enddrawing();
|
|
|
|
col = 1;
|
|
|
|
showsectordata(sectnum);
|
|
|
|
begindrawing();
|
|
while (keystatus[KEYSC_ESC] == 0)
|
|
{
|
|
idle_waitevent();
|
|
if (handleevents())
|
|
{
|
|
if (quitevent) quitevent = 0;
|
|
}
|
|
|
|
_printmessage16("Edit mode, press <Esc> to exit");
|
|
if (keystatus[KEYSC_DOWN])
|
|
{
|
|
if (row < rowmax)
|
|
{
|
|
printext16(xpos,ypos+row*8,editorcolors[11],editorcolors[0],disptext,0);
|
|
row++;
|
|
}
|
|
keystatus[KEYSC_DOWN] = 0;
|
|
}
|
|
if (keystatus[KEYSC_UP])
|
|
{
|
|
if (row > 0)
|
|
{
|
|
printext16(xpos,ypos+row*8,editorcolors[11],editorcolors[0],disptext,0);
|
|
row--;
|
|
}
|
|
keystatus[KEYSC_UP] = 0;
|
|
}
|
|
if (keystatus[KEYSC_LEFT])
|
|
{
|
|
if (col == 2)
|
|
{
|
|
printext16(xpos,ypos+row*8,editorcolors[11],editorcolors[0],disptext,0);
|
|
col = 1;
|
|
xpos = 208;
|
|
rowmax = 6;
|
|
dispwidth = 24;
|
|
disptext[dispwidth] = 0;
|
|
if (row > rowmax) row = rowmax;
|
|
}
|
|
keystatus[KEYSC_LEFT] = 0;
|
|
}
|
|
if (keystatus[KEYSC_RIGHT])
|
|
{
|
|
if (col == 1)
|
|
{
|
|
printext16(xpos,ypos+row*8,editorcolors[11],editorcolors[0],disptext,0);
|
|
col = 2;
|
|
xpos = 408;
|
|
rowmax = 6;
|
|
dispwidth = 24;
|
|
disptext[dispwidth] = 0;
|
|
if (row > rowmax) row = rowmax;
|
|
}
|
|
keystatus[KEYSC_RIGHT] = 0;
|
|
}
|
|
if (keystatus[KEYSC_ENTER])
|
|
{
|
|
keystatus[KEYSC_ENTER] = 0;
|
|
editval = 1;
|
|
}
|
|
|
|
if (col == 1)
|
|
{
|
|
switch (row)
|
|
{
|
|
case 0:
|
|
for (i=Bsprintf(disptext,"Flags (hex): %x",sector[sectnum].ceilingstat); i < dispwidth; i++) disptext[i] = ' ';
|
|
Bsprintf(edittext,"Sector %d Ceiling Flags: ",sectnum);
|
|
if (editval)
|
|
{
|
|
printmessage16(edittext);
|
|
sector[sectnum].ceilingstat = (int16_t)getnumber16(edittext,(int32_t)sector[sectnum].ceilingstat,65536L,0);
|
|
}
|
|
break;
|
|
case 1:
|
|
for (i=Bsprintf(disptext,"(X,Y)pan: %d, %d",sector[sectnum].ceilingxpanning,sector[sectnum].ceilingypanning); i < dispwidth; i++) disptext[i] = ' ';
|
|
if (editval)
|
|
{
|
|
Bsprintf(edittext,"Sector %d Ceiling X Pan: ",sectnum);
|
|
printmessage16(edittext);
|
|
sector[sectnum].ceilingxpanning = (char)getnumber16(edittext,(int32_t)sector[sectnum].ceilingxpanning,256L,0);
|
|
Bsprintf(edittext,"Sector %d Ceiling Y Pan: ",sectnum);
|
|
printmessage16(edittext);
|
|
sector[sectnum].ceilingypanning = (char)getnumber16(edittext,(int32_t)sector[sectnum].ceilingypanning,256L,0);
|
|
}
|
|
break;
|
|
case 2:
|
|
for (i=Bsprintf(disptext,"Shade byte: %d",sector[sectnum].ceilingshade); i < dispwidth; i++) disptext[i] = ' ';
|
|
Bsprintf(edittext,"Sector %d Ceiling Shade: ",sectnum);
|
|
if (editval)
|
|
{
|
|
printmessage16(edittext);
|
|
sector[sectnum].ceilingshade = (char)getnumber16(edittext,(int32_t)sector[sectnum].ceilingshade,128L,1);
|
|
}
|
|
break;
|
|
|
|
case 3:
|
|
for (i=Bsprintf(disptext,"Z-coordinate: %d",sector[sectnum].ceilingz); i < dispwidth; i++) disptext[i] = ' ';
|
|
Bsprintf(edittext,"Sector %d Ceiling Z-coordinate: ",sectnum);
|
|
if (editval)
|
|
{
|
|
printmessage16(edittext);
|
|
sector[sectnum].ceilingz = getnumber16(edittext,sector[sectnum].ceilingz,8388608,1); //2147483647L,-2147483648L
|
|
}
|
|
break;
|
|
|
|
case 4:
|
|
for (i=Bsprintf(disptext,"Tile number: %d",sector[sectnum].ceilingpicnum); i < dispwidth; i++) disptext[i] = ' ';
|
|
Bsprintf(edittext,"Sector %d Ceiling Tile Number: ",sectnum);
|
|
if (editval)
|
|
{
|
|
printmessage16(edittext);
|
|
sector[sectnum].ceilingpicnum = (int16_t)getnumber16(edittext,(int32_t)sector[sectnum].ceilingpicnum,MAXTILES,0);
|
|
}
|
|
break;
|
|
|
|
case 5:
|
|
for (i=Bsprintf(disptext,"Ceiling heinum: %d",sector[sectnum].ceilingheinum); i < dispwidth; i++) disptext[i] = ' ';
|
|
Bsprintf(edittext,"Sector %d Ceiling Heinum: ",sectnum);
|
|
if (editval)
|
|
{
|
|
printmessage16(edittext);
|
|
sector[sectnum].ceilingheinum = (int16_t)getnumber16(edittext,(int32_t)sector[sectnum].ceilingheinum,65536L,1);
|
|
}
|
|
break;
|
|
|
|
case 6:
|
|
for (i=Bsprintf(disptext,"Palookup number: %d",sector[sectnum].ceilingpal); i < dispwidth; i++) disptext[i] = ' ';
|
|
Bsprintf(edittext,"Sector %d Ceiling Palookup Number: ",sectnum);
|
|
if (editval)
|
|
{
|
|
printmessage16(edittext);
|
|
sector[sectnum].ceilingpal = (char)getnumber16(edittext,(int32_t)sector[sectnum].ceilingpal,MAXPALOOKUPS,0);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
if (col == 2)
|
|
{
|
|
switch (row)
|
|
{
|
|
case 0:
|
|
for (i=Bsprintf(disptext,"Flags (hex): %x",sector[sectnum].floorstat); i < dispwidth; i++) disptext[i] = ' ';
|
|
Bsprintf(edittext,"Sector %d Floor Flags: ",sectnum);
|
|
if (editval)
|
|
{
|
|
printmessage16(edittext);
|
|
sector[sectnum].floorstat = (int16_t)getnumber16(edittext,(int32_t)sector[sectnum].floorstat,65536L,0);
|
|
}
|
|
break;
|
|
|
|
case 1:
|
|
for (i=Bsprintf(disptext,"(X,Y)pan: %d, %d",sector[sectnum].floorxpanning,sector[sectnum].floorypanning); i < dispwidth; i++) disptext[i] = ' ';
|
|
if (editval)
|
|
{
|
|
Bsprintf(edittext,"Sector %d Floor X Pan: ",sectnum);
|
|
printmessage16(edittext);
|
|
sector[sectnum].floorxpanning = (char)getnumber16(edittext,(int32_t)sector[sectnum].floorxpanning,256L,0);
|
|
Bsprintf(edittext,"Sector %d Floor Y Pan: ",sectnum);
|
|
printmessage16(edittext);
|
|
sector[sectnum].floorypanning = (char)getnumber16(edittext,(int32_t)sector[sectnum].floorypanning,256L,0);
|
|
}
|
|
break;
|
|
|
|
case 2:
|
|
for (i=Bsprintf(disptext,"Shade byte: %d",sector[sectnum].floorshade); i < dispwidth; i++) disptext[i] = ' ';
|
|
Bsprintf(edittext,"Sector %d Floor Shade: ",sectnum);
|
|
if (editval)
|
|
{
|
|
printmessage16(edittext);
|
|
sector[sectnum].floorshade = (char)getnumber16(edittext,(int32_t)sector[sectnum].floorshade,128L,1L);
|
|
}
|
|
break;
|
|
|
|
case 3:
|
|
for (i=Bsprintf(disptext,"Z-coordinate: %d",sector[sectnum].floorz); i < dispwidth; i++) disptext[i] = ' ';
|
|
Bsprintf(edittext,"Sector %d Floor Z-coordinate: ",sectnum);
|
|
if (editval)
|
|
{
|
|
printmessage16(edittext);
|
|
sector[sectnum].floorz = getnumber16(edittext,sector[sectnum].floorz,8388608L,1); //2147483647L,-2147483648L
|
|
}
|
|
break;
|
|
|
|
case 4:
|
|
for (i=Bsprintf(disptext,"Tile number: %d",sector[sectnum].floorpicnum); i < dispwidth; i++) disptext[i] = ' ';
|
|
Bsprintf(edittext,"Sector %d Floor Tile Number: ",sectnum);
|
|
if (editval)
|
|
{
|
|
printmessage16(edittext);
|
|
sector[sectnum].floorpicnum = (int16_t)getnumber16(edittext,(int32_t)sector[sectnum].floorpicnum,MAXTILES,0);
|
|
}
|
|
break;
|
|
case 5:
|
|
for (i=Bsprintf(disptext,"Floor heinum: %d",sector[sectnum].floorheinum); i < dispwidth; i++) disptext[i] = ' ';
|
|
Bsprintf(edittext,"Sector %d Flooring Heinum: ",sectnum);
|
|
if (editval)
|
|
{
|
|
printmessage16(edittext);
|
|
sector[sectnum].floorheinum = (int16_t)getnumber16(edittext,(int32_t)sector[sectnum].floorheinum,65536L,1);
|
|
}
|
|
break;
|
|
case 6:
|
|
for (i=Bsprintf(disptext,"Palookup number: %d",sector[sectnum].floorpal); i < dispwidth; i++) disptext[i] = ' ';
|
|
Bsprintf(edittext,"Sector %d Floor Palookup Number: ",sectnum);
|
|
if (editval)
|
|
{
|
|
printmessage16(edittext);
|
|
sector[sectnum].floorpal = (char)getnumber16(edittext,(int32_t)sector[sectnum].floorpal,MAXPALOOKUPS,0);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
printext16(xpos,ypos+row*8,editorcolors[11],editorcolors[1],disptext,0);
|
|
if (editval)
|
|
{
|
|
editval = 0;
|
|
}
|
|
showframe(1);
|
|
}
|
|
printext16(xpos,ypos+row*8,editorcolors[11],editorcolors[0],disptext,0);
|
|
// printmessage16("");
|
|
enddrawing();
|
|
showframe(1);
|
|
keystatus[KEYSC_ESC] = 0;
|
|
}
|
|
|
|
static void EditWallData(int16_t wallnum)
|
|
{
|
|
char disptext[80];
|
|
char edittext[80];
|
|
int32_t row=0, dispwidth = 24, editval = 0, i = -1;
|
|
int32_t xpos = 208, ypos = ydim-STATUS2DSIZ+48;
|
|
int32_t col;
|
|
|
|
disptext[dispwidth] = 0;
|
|
col = whitecol-21;
|
|
|
|
begindrawing();
|
|
for (i=ydim-STATUS2DSIZ+16; i<ydim; i++)
|
|
{
|
|
// drawline256(0, i<<12, xdim<<12, i<<12, col);
|
|
clearbufbyte((char *)(frameplace + (i*bytesperline)), bytesperline, ((int32_t)col<<24)|((int32_t)col<<16)|((int32_t)col<<8)|col);
|
|
col--;
|
|
if (col <= 0) break;
|
|
}
|
|
|
|
clearbufbyte((char *)(frameplace + (i*bytesperline)), (ydim-i)*(bytesperline), 0);
|
|
|
|
enddrawing();
|
|
|
|
showwalldata(wallnum);
|
|
begindrawing();
|
|
while (keystatus[KEYSC_ESC] == 0)
|
|
{
|
|
idle_waitevent();
|
|
if (handleevents())
|
|
{
|
|
if (quitevent) quitevent = 0;
|
|
}
|
|
|
|
_printmessage16("Edit mode, press <Esc> to exit");
|
|
if (keystatus[KEYSC_DOWN])
|
|
{
|
|
if (row < 6)
|
|
{
|
|
printext16(xpos,ypos+row*8,editorcolors[11],editorcolors[0],disptext,0);
|
|
row++;
|
|
}
|
|
keystatus[KEYSC_DOWN] = 0;
|
|
}
|
|
if (keystatus[KEYSC_UP])
|
|
{
|
|
if (row > 0)
|
|
{
|
|
printext16(xpos,ypos+row*8,editorcolors[11],editorcolors[0],disptext,0);
|
|
row--;
|
|
}
|
|
keystatus[KEYSC_UP] = 0;
|
|
}
|
|
if (keystatus[KEYSC_ENTER])
|
|
{
|
|
keystatus[KEYSC_ENTER] = 0;
|
|
editval = 1;
|
|
}
|
|
switch (row)
|
|
{
|
|
case 0:
|
|
for (i=Bsprintf(disptext,"Flags (hex): %x",wall[wallnum].cstat); i < dispwidth; i++) disptext[i] = ' ';
|
|
Bsprintf(edittext,"Wall %d Flags: ",wallnum);
|
|
if (editval)
|
|
{
|
|
printmessage16(edittext);
|
|
wall[wallnum].cstat = (int16_t)getnumber16(edittext,(int32_t)wall[wallnum].cstat,65536L,0);
|
|
}
|
|
break;
|
|
case 1:
|
|
for (i=Bsprintf(disptext,"Shade: %d",wall[wallnum].shade); i < dispwidth; i++) disptext[i] = ' ';
|
|
Bsprintf(edittext,"Wall %d Shade: ",wallnum);
|
|
if (editval)
|
|
{
|
|
printmessage16(edittext);
|
|
wall[wallnum].shade = (char)getnumber16(edittext,(int32_t)wall[wallnum].shade,128,1);
|
|
}
|
|
break;
|
|
case 2:
|
|
for (i=Bsprintf(disptext,"Pal: %d",wall[wallnum].pal); i < dispwidth; i++) disptext[i] = ' ';
|
|
Bsprintf(edittext,"Wall %d Pal: ",wallnum);
|
|
if (editval)
|
|
{
|
|
printmessage16(edittext);
|
|
wall[wallnum].pal = (char)getnumber16(edittext,(int32_t)wall[wallnum].pal,MAXPALOOKUPS,0);
|
|
}
|
|
break;
|
|
case 3:
|
|
for (i=Bsprintf(disptext,"(X,Y)repeat: %d, %d",wall[wallnum].xrepeat,wall[wallnum].yrepeat); i < dispwidth; i++) disptext[i] = ' ';
|
|
if (editval)
|
|
{
|
|
Bsprintf(edittext,"Wall %d X Repeat: ",wallnum);
|
|
printmessage16(edittext);
|
|
wall[wallnum].xrepeat = (char)getnumber16(edittext,(int32_t)wall[wallnum].xrepeat,256L,0);
|
|
Bsprintf(edittext,"Wall %d Y Repeat: ",wallnum);
|
|
printmessage16(edittext);
|
|
wall[wallnum].yrepeat = (char)getnumber16(edittext,(int32_t)wall[wallnum].yrepeat,256L,0);
|
|
}
|
|
break;
|
|
case 4:
|
|
for (i=Bsprintf(disptext,"(X,Y)pan: %d, %d",wall[wallnum].xpanning,wall[wallnum].ypanning); i < dispwidth; i++) disptext[i] = ' ';
|
|
if (editval)
|
|
{
|
|
Bsprintf(edittext,"Wall %d X Pan: ",wallnum);
|
|
printmessage16(edittext);
|
|
wall[wallnum].xpanning = (char)getnumber16(edittext,(int32_t)wall[wallnum].xpanning,256L,0);
|
|
Bsprintf(edittext,"Wall %d Y Pan: ",wallnum);
|
|
printmessage16(edittext);
|
|
wall[wallnum].ypanning = (char)getnumber16(edittext,(int32_t)wall[wallnum].ypanning,256L,0);
|
|
}
|
|
break;
|
|
case 5:
|
|
for (i=Bsprintf(disptext,"Tile number: %d",wall[wallnum].picnum); i < dispwidth; i++) disptext[i] = ' ';
|
|
Bsprintf(edittext,"Wall %d Tile number: ",wallnum);
|
|
if (editval)
|
|
{
|
|
printmessage16(edittext);
|
|
wall[wallnum].picnum = (int16_t)getnumber16(edittext,(int32_t)wall[wallnum].picnum,MAXTILES,0);
|
|
}
|
|
break;
|
|
|
|
case 6:
|
|
for (i=Bsprintf(disptext,"OverTile number: %d",wall[wallnum].overpicnum); i < dispwidth; i++) disptext[i] = ' ';
|
|
Bsprintf(edittext,"Wall %d OverTile number: ",wallnum);
|
|
if (editval)
|
|
{
|
|
printmessage16(edittext);
|
|
wall[wallnum].overpicnum = (int16_t)getnumber16(edittext,(int32_t)wall[wallnum].overpicnum,MAXTILES,0);
|
|
}
|
|
break;
|
|
}
|
|
printext16(xpos,ypos+row*8,editorcolors[11],editorcolors[1],disptext,0);
|
|
if (editval)
|
|
{
|
|
editval = 0;
|
|
//showwalldata(wallnum);
|
|
//// printmessage16("");
|
|
}
|
|
//enddrawing();
|
|
showframe(1);
|
|
}
|
|
//begindrawing();
|
|
printext16(xpos,ypos+row*8,editorcolors[11],editorcolors[0],disptext,0);
|
|
// printmessage16("");
|
|
enddrawing();
|
|
showframe(1);
|
|
keystatus[KEYSC_ESC] = 0;
|
|
}
|
|
|
|
static void EditSpriteData(int16_t spritenum)
|
|
{
|
|
char disptext[80];
|
|
char edittext[80];
|
|
int32_t col=0, row=0, rowmax=4, dispwidth = 24, editval = 0, i = -1;
|
|
int32_t xpos = 8, ypos = ydim-STATUS2DSIZ+48;
|
|
|
|
disptext[dispwidth] = 0;
|
|
// clearmidstatbar16();
|
|
|
|
col = whitecol-21;
|
|
|
|
begindrawing();
|
|
for (i=ydim-STATUS2DSIZ+16; i<ydim; i++)
|
|
{
|
|
// drawline256(0, i<<12, xdim<<12, i<<12, col);
|
|
clearbufbyte((char *)(frameplace + (i*bytesperline)), bytesperline, ((int32_t)col<<24)|((int32_t)col<<16)|((int32_t)col<<8)|col);
|
|
col--;
|
|
if (col <= 0) break;
|
|
}
|
|
|
|
clearbufbyte((char *)(frameplace + (i*bytesperline)), (ydim-i)*(bytesperline), 0);
|
|
|
|
enddrawing();
|
|
|
|
col = 0;
|
|
|
|
showspritedata(spritenum);
|
|
|
|
while (keystatus[KEYSC_ESC] == 0)
|
|
{
|
|
idle_waitevent();
|
|
begindrawing();
|
|
if (handleevents())
|
|
{
|
|
if (quitevent) quitevent = 0;
|
|
}
|
|
|
|
_printmessage16("Edit mode, press <Esc> to exit");
|
|
if (keystatus[KEYSC_DOWN])
|
|
{
|
|
if (row < rowmax)
|
|
{
|
|
printext16(xpos,ypos+row*8,editorcolors[11],editorcolors[0],disptext,0);
|
|
row++;
|
|
}
|
|
keystatus[KEYSC_DOWN] = 0;
|
|
}
|
|
if (keystatus[KEYSC_UP])
|
|
{
|
|
if (row > 0)
|
|
{
|
|
printext16(xpos,ypos+row*8,editorcolors[11],editorcolors[0],disptext,0);
|
|
row--;
|
|
}
|
|
keystatus[KEYSC_UP] = 0;
|
|
}
|
|
if (keystatus[KEYSC_LEFT])
|
|
{
|
|
switch (col)
|
|
{
|
|
case 1:
|
|
{
|
|
printext16(xpos,ypos+row*8,editorcolors[11],editorcolors[0],disptext,0);
|
|
col = 0;
|
|
xpos = 8;
|
|
rowmax = 4;
|
|
dispwidth = 23;
|
|
disptext[dispwidth] = 0;
|
|
if (row > rowmax) row = rowmax;
|
|
}
|
|
break;
|
|
case 2:
|
|
{
|
|
printext16(xpos,ypos+row*8,editorcolors[11],editorcolors[0],disptext,0);
|
|
col = 1;
|
|
xpos = 208;
|
|
rowmax = 5;
|
|
dispwidth = 24;
|
|
disptext[dispwidth] = 0;
|
|
if (row > rowmax) row = rowmax;
|
|
}
|
|
break;
|
|
}
|
|
keystatus[KEYSC_LEFT] = 0;
|
|
}
|
|
if (keystatus[KEYSC_RIGHT])
|
|
{
|
|
switch (col)
|
|
{
|
|
case 0:
|
|
{
|
|
printext16(xpos,ypos+row*8,editorcolors[11],editorcolors[0],disptext,0);
|
|
col = 1;
|
|
xpos = 208;
|
|
rowmax = 5;
|
|
dispwidth = 24;
|
|
disptext[dispwidth] = 0;
|
|
if (row > rowmax) row = rowmax;
|
|
}
|
|
break;
|
|
case 1:
|
|
{
|
|
printext16(xpos,ypos+row*8,editorcolors[11],editorcolors[0],disptext,0);
|
|
col = 2;
|
|
xpos = 408;
|
|
rowmax = 6;
|
|
dispwidth = 26;
|
|
disptext[dispwidth] = 0;
|
|
if (row > rowmax) row = rowmax;
|
|
}
|
|
break;
|
|
}
|
|
keystatus[KEYSC_RIGHT] = 0;
|
|
}
|
|
if (keystatus[KEYSC_ENTER])
|
|
{
|
|
keystatus[KEYSC_ENTER] = 0;
|
|
editval = 1;
|
|
}
|
|
switch (col)
|
|
{
|
|
case 0:
|
|
{
|
|
switch (row)
|
|
{
|
|
case 0:
|
|
{
|
|
for (i=Bsprintf(disptext,"X-coordinate: %d",sprite[spritenum].x); i < dispwidth; i++) disptext[i] = ' ';
|
|
Bsprintf(edittext,"Sprite %d X-coordinate: ",spritenum);
|
|
if (editval)
|
|
{
|
|
printmessage16(edittext);
|
|
sprite[spritenum].x = getnumber16(edittext,sprite[spritenum].x,131072,1);
|
|
}
|
|
}
|
|
break;
|
|
case 1:
|
|
{
|
|
for (i=Bsprintf(disptext,"Y-coordinate: %d",sprite[spritenum].y); i < dispwidth; i++) disptext[i] = ' ';
|
|
Bsprintf(edittext,"Sprite %d Y-coordinate: ",spritenum);
|
|
if (editval)
|
|
{
|
|
printmessage16(edittext);
|
|
sprite[spritenum].y = getnumber16(edittext,sprite[spritenum].y,131072,1);
|
|
}
|
|
}
|
|
break;
|
|
case 2:
|
|
{
|
|
for (i=Bsprintf(disptext,"Z-coordinate: %d",sprite[spritenum].z); i < dispwidth; i++) disptext[i] = ' ';
|
|
Bsprintf(edittext,"Sprite %d Z-coordinate: ",spritenum);
|
|
if (editval)
|
|
{
|
|
printmessage16(edittext);
|
|
sprite[spritenum].z = getnumber16(edittext,sprite[spritenum].z,8388608,1); //2147483647L,-2147483648L
|
|
}
|
|
}
|
|
break;
|
|
case 3:
|
|
{
|
|
for (i=Bsprintf(disptext,"Sectnum: %d",sprite[spritenum].sectnum); i < dispwidth; i++) disptext[i] = ' ';
|
|
Bsprintf(edittext,"Sprite %d Sectnum: ",spritenum);
|
|
if (editval)
|
|
{
|
|
printmessage16(edittext);
|
|
i = getnumber16(edittext,sprite[spritenum].sectnum,MAXSECTORS-1,0);
|
|
if (i != sprite[spritenum].sectnum)
|
|
changespritesect(spritenum,i);
|
|
}
|
|
}
|
|
break;
|
|
case 4:
|
|
{
|
|
for (i=Bsprintf(disptext,"Statnum: %d",sprite[spritenum].statnum); i < dispwidth; i++) disptext[i] = ' ';
|
|
Bsprintf(edittext,"Sprite %d Statnum: ",spritenum);
|
|
if (editval)
|
|
{
|
|
printmessage16(edittext);
|
|
i = getnumber16(edittext,sprite[spritenum].statnum,MAXSTATUS-1,0);
|
|
if (i != sprite[spritenum].statnum)
|
|
changespritestat(spritenum,i);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
case 1:
|
|
{
|
|
switch (row)
|
|
{
|
|
case 0:
|
|
{
|
|
for (i=Bsprintf(disptext,"Flags (hex): %x",sprite[spritenum].cstat); i < dispwidth; i++) disptext[i] = ' ';
|
|
Bsprintf(edittext,"Sprite %d Flags: ",spritenum);
|
|
if (editval)
|
|
{
|
|
printmessage16(edittext);
|
|
sprite[spritenum].cstat = (int16_t)getnumber16(edittext,(int32_t)sprite[spritenum].cstat,65536L,0);
|
|
}
|
|
}
|
|
break;
|
|
case 1:
|
|
{
|
|
for (i=Bsprintf(disptext,"Shade: %d",sprite[spritenum].shade); i < dispwidth; i++) disptext[i] = ' ';
|
|
Bsprintf(edittext,"Sprite %d Shade: ",spritenum);
|
|
if (editval)
|
|
{
|
|
printmessage16(edittext);
|
|
sprite[spritenum].shade = (char)getnumber16(edittext,(int32_t)sprite[spritenum].shade,128,1);
|
|
}
|
|
}
|
|
break;
|
|
case 2:
|
|
{
|
|
for (i=Bsprintf(disptext,"Pal: %d",sprite[spritenum].pal); i < dispwidth; i++) disptext[i] = ' ';
|
|
Bsprintf(edittext,"Sprite %d Pal: ",spritenum);
|
|
if (editval)
|
|
{
|
|
printmessage16(edittext);
|
|
sprite[spritenum].pal = (char)getnumber16(edittext,(int32_t)sprite[spritenum].pal,MAXPALOOKUPS,0);
|
|
}
|
|
}
|
|
break;
|
|
case 3:
|
|
{
|
|
for (i=Bsprintf(disptext,"(X,Y)repeat: %d, %d",sprite[spritenum].xrepeat,sprite[spritenum].yrepeat); i < dispwidth; i++) disptext[i] = ' ';
|
|
if (editval)
|
|
{
|
|
Bsprintf(edittext,"Sprite %d X Repeat: ",spritenum);
|
|
printmessage16(edittext);
|
|
sprite[spritenum].xrepeat = (char)getnumber16(edittext,(int32_t)sprite[spritenum].xrepeat,256L,0);
|
|
Bsprintf(edittext,"Sprite %d Y Repeat: ",spritenum);
|
|
printmessage16(edittext);
|
|
sprite[spritenum].yrepeat = (char)getnumber16(edittext,(int32_t)sprite[spritenum].yrepeat,256L,0);
|
|
}
|
|
}
|
|
break;
|
|
case 4:
|
|
{
|
|
for (i=Bsprintf(disptext,"(X,Y)offset: %d, %d",sprite[spritenum].xoffset,sprite[spritenum].yoffset); i < dispwidth; i++) disptext[i] = ' ';
|
|
if (editval)
|
|
{
|
|
Bsprintf(edittext,"Sprite %d X Offset: ",spritenum);
|
|
printmessage16(edittext);
|
|
sprite[spritenum].xoffset = (char)getnumber16(edittext,(int32_t)sprite[spritenum].xoffset,128L,1);
|
|
Bsprintf(edittext,"Sprite %d Y Offset: ",spritenum);
|
|
printmessage16(edittext);
|
|
sprite[spritenum].yoffset = (char)getnumber16(edittext,(int32_t)sprite[spritenum].yoffset,128L,1);
|
|
}
|
|
}
|
|
break;
|
|
case 5:
|
|
{
|
|
for (i=Bsprintf(disptext,"Tile number: %d",sprite[spritenum].picnum); i < dispwidth; i++) disptext[i] = ' ';
|
|
Bsprintf(edittext,"Sprite %d Tile number: ",spritenum);
|
|
if (editval)
|
|
{
|
|
printmessage16(edittext);
|
|
sprite[spritenum].picnum = (int16_t)getnumber16(edittext,(int32_t)sprite[spritenum].picnum,MAXTILES,0);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
case 2:
|
|
{
|
|
switch (row)
|
|
{
|
|
case 0:
|
|
{
|
|
for (i=Bsprintf(disptext,"Angle (2048 degrees): %d",sprite[spritenum].ang); i < dispwidth; i++) disptext[i] = ' ';
|
|
Bsprintf(edittext,"Sprite %d Angle: ",spritenum);
|
|
if (editval)
|
|
{
|
|
printmessage16(edittext);
|
|
sprite[spritenum].ang = (int16_t)getnumber16(edittext,(int32_t)sprite[spritenum].ang,2048L,0);
|
|
}
|
|
}
|
|
break;
|
|
case 1:
|
|
{
|
|
for (i=Bsprintf(disptext,"X-Velocity: %d",sprite[spritenum].xvel); i < dispwidth; i++) disptext[i] = ' ';
|
|
Bsprintf(edittext,"Sprite %d X-Velocity: ",spritenum);
|
|
if (editval)
|
|
{
|
|
printmessage16(edittext);
|
|
sprite[spritenum].xvel = getnumber16(edittext,(int32_t)sprite[spritenum].xvel,65536,1);
|
|
}
|
|
}
|
|
break;
|
|
case 2:
|
|
{
|
|
for (i=Bsprintf(disptext,"Y-Velocity: %d",sprite[spritenum].yvel); i < dispwidth; i++) disptext[i] = ' ';
|
|
Bsprintf(edittext,"Sprite %d Y-Velocity: ",spritenum);
|
|
if (editval)
|
|
{
|
|
printmessage16(edittext);
|
|
sprite[spritenum].yvel = getnumber16(edittext,(int32_t)sprite[spritenum].yvel,65536,1);
|
|
}
|
|
}
|
|
break;
|
|
case 3:
|
|
{
|
|
for (i=Bsprintf(disptext,"Z-Velocity: %d",sprite[spritenum].zvel); i < dispwidth; i++) disptext[i] = ' ';
|
|
Bsprintf(edittext,"Sprite %d Z-Velocity: ",spritenum);
|
|
if (editval)
|
|
{
|
|
printmessage16(edittext);
|
|
sprite[spritenum].zvel = getnumber16(edittext,(int32_t)sprite[spritenum].zvel,65536,1);
|
|
}
|
|
}
|
|
break;
|
|
case 4:
|
|
{
|
|
for (i=Bsprintf(disptext,"Owner: %d",sprite[spritenum].owner); i < dispwidth; i++) disptext[i] = ' ';
|
|
Bsprintf(edittext,"Sprite %d Owner: ",spritenum);
|
|
if (editval)
|
|
{
|
|
printmessage16(edittext);
|
|
sprite[spritenum].owner = getnumber16(edittext,(int32_t)sprite[spritenum].owner,MAXSPRITES,0);
|
|
}
|
|
}
|
|
break;
|
|
case 5:
|
|
{
|
|
for (i=Bsprintf(disptext,"Clipdist: %d",sprite[spritenum].clipdist); i < dispwidth; i++) disptext[i] = ' ';
|
|
Bsprintf(edittext,"Sprite %d Clipdist: ",spritenum);
|
|
if (editval)
|
|
{
|
|
printmessage16(edittext);
|
|
sprite[spritenum].clipdist = (char)getnumber16(edittext,(int32_t)sprite[spritenum].clipdist,256,0);
|
|
}
|
|
}
|
|
break;
|
|
case 6:
|
|
{
|
|
for (i=Bsprintf(disptext,"Extra: %d",sprite[spritenum].extra); i < dispwidth; i++) disptext[i] = ' ';
|
|
Bsprintf(edittext,"Sprite %d Extra: ",spritenum);
|
|
if (editval)
|
|
{
|
|
printmessage16(edittext);
|
|
sprite[spritenum].extra = getnumber16(edittext,(int32_t)sprite[spritenum].extra,65536,1);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
printext16(xpos,ypos+row*8,editorcolors[11],editorcolors[1],disptext,0);
|
|
if (editval)
|
|
{
|
|
editval = 0;
|
|
}
|
|
enddrawing();
|
|
showframe(1);
|
|
}
|
|
begindrawing();
|
|
printext16(xpos,ypos+row*8,editorcolors[11],editorcolors[0],disptext,0);
|
|
// printmessage16("");
|
|
enddrawing();
|
|
showframe(1);
|
|
keystatus[KEYSC_ESC] = 0;
|
|
}
|
|
|
|
static void GenSearchSprite()
|
|
{
|
|
char disptext[80];
|
|
char edittext[80];
|
|
static int32_t col=0, row=0;
|
|
int32_t i, j, k, color;
|
|
int32_t rowmax[3]={6,5,6}, dispwidth[3] = {24,24,28};
|
|
int32_t xpos[3] = {8,200,400}, ypos = ydim-STATUS2DSIZ+48;
|
|
|
|
static char *labels[7][3] =
|
|
{
|
|
{"X-coordinate", "Flags (hex)", "Angle (2048 degrees)"},
|
|
{"Y-coordinate", "Shade", "X-Velocity"},
|
|
{"Z-coordinate", "Pal", "Y-Velocity"},
|
|
{"Sectnum", "(X/Y)repeat", "Z-Velocity"},
|
|
{"Statnum", "(X/Y)offset", "Owner"},
|
|
{"Hitag", "Tile number", "Clipdist"},
|
|
{"Lotag", "", "Extra"}
|
|
};
|
|
|
|
static int32_t maxval[7][3] =
|
|
{
|
|
{ 524288 , 65536 , 2048 },
|
|
{ 524288 , 128 , 65536 },
|
|
{ 8388608 , MAXPALOOKUPS, 65536 },
|
|
{ MAXSECTORS-1, 128 , 65536 },
|
|
{ MAXSTATUS-1 , 128 , MAXSPRITES-1 },
|
|
{ 65536 , MAXTILES , 256 },
|
|
{ 65536 , 0 , 65536 }
|
|
};
|
|
|
|
static char sign[7][3] =
|
|
{
|
|
{1,0,1}, {1,1,1}, {1,0,1}, {0,0,1}, {0,1,0}, {0,0,0}, {0,0,1}
|
|
};
|
|
|
|
static char firstrun=1;
|
|
|
|
if (firstrun)
|
|
{
|
|
firstrun = 0;
|
|
Bmemset(&gs_spritewhat, 0, sizeof(gs_spritewhat));
|
|
}
|
|
|
|
clearmidstatbar16();
|
|
|
|
color = whitecol-21;
|
|
begindrawing();
|
|
for (i=ydim-STATUS2DSIZ+16; i<ydim; i++)
|
|
{
|
|
clearbufbyte((char *)(frameplace + (i*bytesperline)), bytesperline, ((int32_t)color<<24)|((int32_t)color<<16)|((int32_t)color<<8)|color);
|
|
color--;
|
|
if (color <= 0) break;
|
|
}
|
|
clearbufbyte((char *)(frameplace + (i*bytesperline)), (ydim-i)*(bytesperline), 0);
|
|
enddrawing();
|
|
|
|
printext16(xpos[0], ypos-2*8, editorcolors[10], editorcolors[0], "Sprite search", 0);
|
|
|
|
for (i=0; i<3; i++)
|
|
for (j=0; j<=rowmax[i]; j++)
|
|
{
|
|
if (gs_spritewhat[i][j])
|
|
k=Bsprintf(disptext, "%s: %d", labels[j][i], gs_sprite[i][j]);
|
|
else
|
|
k=Bsprintf(disptext, "%s: ^7any", labels[j][i]);
|
|
for (; k<dispwidth[i]; k++) disptext[k] = 0;
|
|
|
|
printext16(xpos[i], ypos+j*8, editorcolors[11], editorcolors[0], disptext, 0);
|
|
}
|
|
for (k=0; k<80; k++) disptext[k] = 0;
|
|
|
|
// disptext[dispwidth[col]] = 0;
|
|
// showspritedata(spritenum);
|
|
wallsprite = 2;
|
|
|
|
while (keystatus[KEYSC_ESC] == 0)
|
|
{
|
|
idle_waitevent();
|
|
if (handleevents())
|
|
{
|
|
if (quitevent) quitevent = 0;
|
|
}
|
|
|
|
begindrawing();
|
|
printmessage16("Sprite search, press <Esc> to exit");
|
|
|
|
if (keystatus[KEYSC_DOWN])
|
|
{
|
|
keystatus[KEYSC_DOWN] = 0;
|
|
if (row < rowmax[col])
|
|
{
|
|
printext16(xpos[col],ypos+row*8,editorcolors[11],editorcolors[0],disptext,0);
|
|
row++;
|
|
}
|
|
}
|
|
if (keystatus[KEYSC_UP])
|
|
{
|
|
keystatus[KEYSC_UP] = 0;
|
|
if (row > 0)
|
|
{
|
|
printext16(xpos[col],ypos+row*8,editorcolors[11],editorcolors[0],disptext,0);
|
|
row--;
|
|
}
|
|
}
|
|
if (keystatus[KEYSC_LEFT])
|
|
{
|
|
keystatus[KEYSC_LEFT] = 0;
|
|
if (col > 0)
|
|
{
|
|
printext16(xpos[col],ypos+row*8,editorcolors[11],editorcolors[0],disptext,0);
|
|
col--;
|
|
disptext[dispwidth[col]] = 0;
|
|
if (row > rowmax[col]) row = rowmax[col];
|
|
}
|
|
}
|
|
if (keystatus[KEYSC_RIGHT])
|
|
{
|
|
keystatus[KEYSC_RIGHT] = 0;
|
|
if (col < 2)
|
|
{
|
|
printext16(xpos[col],ypos+row*8,editorcolors[11],editorcolors[0],disptext,0);
|
|
col++;
|
|
disptext[dispwidth[col]] = 0;
|
|
if (row > rowmax[col]) row = rowmax[col];
|
|
}
|
|
}
|
|
if (keystatus[KEYSC_ENTER])
|
|
{
|
|
keystatus[KEYSC_ENTER] = 0;
|
|
Bsprintf(edittext, "%s: ", labels[row][col]);
|
|
enddrawing();
|
|
printmessage16(edittext);
|
|
i = getnumber16(edittext, gs_spritewhat[col][row] ? gs_sprite[col][row] : 0,
|
|
maxval[row][col], sign[row][col]);
|
|
if (col == 2 && row == 0) i = (i+2048)&2047; // angle
|
|
gs_sprite[col][row] = i;
|
|
begindrawing();
|
|
gs_spritewhat[col][row] = 1;
|
|
|
|
if (col == 1 && row == 5) // picnum
|
|
printext16(xpos[1], ypos-2*8, editorcolors[14], editorcolors[0], names[i], 0);
|
|
}
|
|
if (keystatus[KEYSC_BS] || keystatus[KEYSC_DELETE])
|
|
{
|
|
keystatus[KEYSC_BS] = keystatus[KEYSC_DELETE] = 0;
|
|
gs_spritewhat[col][row] = 0;
|
|
|
|
if (col == 1 && row == 5) // picnum
|
|
printext16(xpos[1], ypos-2*8, editorcolors[14], editorcolors[0], " ", 0);
|
|
}
|
|
|
|
if (gs_spritewhat[col][row])
|
|
{
|
|
if (col == 1 && row == 0) // flags
|
|
k = Bsprintf(disptext, "%s: %x", labels[row][col], gs_sprite[col][row]);
|
|
else
|
|
k = Bsprintf(disptext, "%s: %d", labels[row][col], gs_sprite[col][row]);
|
|
}
|
|
else
|
|
k = Bsprintf(disptext, "%s: ^7any", labels[row][col]);
|
|
for (; k<dispwidth[col]; k++) disptext[k] = ' ';
|
|
disptext[k] = 0;
|
|
|
|
printext16(xpos[col],ypos+row*8,editorcolors[11],editorcolors[1],disptext,0);
|
|
|
|
enddrawing();
|
|
showframe(1);
|
|
}
|
|
// begindrawing();
|
|
printext16(xpos[col],ypos+row*8,editorcolors[11],editorcolors[0],disptext,0);
|
|
printmessage16("Search sprite");
|
|
// enddrawing();
|
|
showframe(1);
|
|
keystatus[KEYSC_ESC] = 0;
|
|
}
|
|
|
|
// Build edit
|
|
|
|
static char *FuncMenuStrings[] =
|
|
{
|
|
"Replace invalid tiles",
|
|
"Delete all spr of tile #",
|
|
"Set map sky shade",
|
|
"Set map sky height",
|
|
"Global Z coord shift",
|
|
"Resize selection",
|
|
"Global shade divide",
|
|
"Global visibility divide"
|
|
};
|
|
|
|
#define MENU_Y_SPACING 8
|
|
#define MENU_BASE_Y ydim-STATUS2DSIZ+32
|
|
|
|
|
|
static void FuncMenuOpts(void)
|
|
{
|
|
int32_t x = 8;
|
|
int32_t y = MENU_BASE_Y+16;
|
|
int32_t i = 0;
|
|
// int32_t x2 = 0;
|
|
// static int32_t x2_max = 0;
|
|
|
|
int32_t numopts = (sizeof(FuncMenuStrings)/sizeof(FuncMenuStrings[0]));
|
|
|
|
do
|
|
{
|
|
// x2 =
|
|
printext16(x,y,editorcolors[11],editorcolors[0],FuncMenuStrings[i],0);
|
|
// if (x2 > x2_max) x2_max = x2;
|
|
y += MENU_Y_SPACING;
|
|
}
|
|
while (++i < numopts);
|
|
// drawline16(x-1,y,x2_max+1,y,1);
|
|
// drawline16(x-1,MENU_BASE_Y-4,x-1,y,1);
|
|
|
|
// x2 =
|
|
printext16(x,MENU_BASE_Y,editorcolors[11],-1,"Special functions",0);
|
|
// drawline16(x-1,MENU_BASE_Y-4,x2+1,MENU_BASE_Y-4,1);
|
|
// drawline16(x2_max+1,MENU_BASE_Y+16-4,x2_max+1,y-1,1);
|
|
//drawline16(x2+1,MENU_BASE_Y+16-1,x2_max+1,MENU_BASE_Y+16-1,1);
|
|
}
|
|
|
|
static void FuncMenu(void)
|
|
{
|
|
char disptext[80];
|
|
int32_t col=0, row=0, rowmax=7, dispwidth = 24, editval = 0, i = -1, j;
|
|
int32_t xpos = 8, ypos = MENU_BASE_Y+16;
|
|
|
|
disptext[dispwidth] = 0;
|
|
// clearmidstatbar16();
|
|
|
|
col = whitecol-21;
|
|
|
|
begindrawing();
|
|
for (i=ydim-STATUS2DSIZ+16; i<ydim; i++)
|
|
{
|
|
// drawline256(0, i<<12, xdim<<12, i<<12, col);
|
|
clearbufbyte((char *)(frameplace + (i*bytesperline)), 224, ((int32_t)col<<24)|((int32_t)col<<16)|((int32_t)col<<8)|col);
|
|
col--;
|
|
if (col < 0) col = 0;
|
|
}
|
|
|
|
enddrawing();
|
|
|
|
col = 0;
|
|
|
|
FuncMenuOpts();
|
|
|
|
while (!editval && keystatus[KEYSC_ESC] == 0)
|
|
{
|
|
idle_waitevent();
|
|
if (handleevents())
|
|
{
|
|
if (quitevent) quitevent = 0;
|
|
}
|
|
|
|
begindrawing();
|
|
_printmessage16("Select an option, press <Esc> to exit");
|
|
if (keystatus[KEYSC_DOWN])
|
|
{
|
|
if (row < rowmax)
|
|
{
|
|
printext16(xpos,ypos+row*MENU_Y_SPACING,editorcolors[11],editorcolors[0],disptext,0);
|
|
row++;
|
|
}
|
|
keystatus[KEYSC_DOWN] = 0;
|
|
}
|
|
if (keystatus[KEYSC_UP])
|
|
{
|
|
if (row > 0)
|
|
{
|
|
printext16(xpos,ypos+row*MENU_Y_SPACING,editorcolors[11],editorcolors[0],disptext,0);
|
|
row--;
|
|
}
|
|
keystatus[KEYSC_UP] = 0;
|
|
}
|
|
#if 0
|
|
if (keystatus[KEYSC_LEFT])
|
|
{
|
|
/* if (col == 2)
|
|
{
|
|
printext16(xpos,ypos+row*8,editorcolors[11],0,disptext,0);
|
|
col = 1;
|
|
xpos = 200;
|
|
rowmax = 6;
|
|
dispwidth = 24;
|
|
disptext[dispwidth] = 0;
|
|
if (row > rowmax) row = rowmax;
|
|
}
|
|
else */
|
|
if (col == 1)
|
|
{
|
|
printext16(xpos,ypos+row*8,editorcolors[11],0,disptext,0);
|
|
col = 0;
|
|
xpos = 8;
|
|
rowmax = 7;
|
|
dispwidth = 24;
|
|
disptext[dispwidth] = 0;
|
|
if (row > rowmax) row = rowmax;
|
|
}
|
|
keystatus[KEYSC_LEFT] = 0;
|
|
}
|
|
|
|
if (keystatus[KEYSC_RIGHT])
|
|
{
|
|
if (col == 0)
|
|
{
|
|
printext16(xpos,ypos+row*8,editorcolors[11],0,disptext,0);
|
|
col = 1;
|
|
xpos = 200;
|
|
rowmax = 0;
|
|
dispwidth = 24;
|
|
disptext[dispwidth] = 0;
|
|
if (row > rowmax) row = rowmax;
|
|
}
|
|
/* else if (col == 1)
|
|
{
|
|
printext16(xpos,ypos+row*8,editorcolors[11],0,disptext,0);
|
|
col = 2;
|
|
xpos = 400;
|
|
rowmax = 6;
|
|
dispwidth = 26;
|
|
disptext[dispwidth] = 0;
|
|
if (row > rowmax) row = rowmax;
|
|
} */
|
|
keystatus[KEYSC_RIGHT] = 0;
|
|
}
|
|
#endif
|
|
if (keystatus[KEYSC_ENTER])
|
|
{
|
|
keystatus[KEYSC_ENTER] = 0;
|
|
editval = 1;
|
|
}
|
|
switch (col)
|
|
{
|
|
case 0:
|
|
switch (row)
|
|
{
|
|
case 0:
|
|
{
|
|
for (i=Bsprintf(disptext,"%s",FuncMenuStrings[row]); i < dispwidth; i++) disptext[i] = ' ';
|
|
if (editval)
|
|
{
|
|
j = 0;
|
|
for (i=0; i<MAXSECTORS; i++)
|
|
{
|
|
if (tilesizx[sector[i].ceilingpicnum] <= 0)
|
|
sector[i].ceilingpicnum = 0,j++;
|
|
if (tilesizx[sector[i].floorpicnum] <= 0)
|
|
sector[i].floorpicnum = 0,j++;
|
|
}
|
|
for (i=0; i<MAXWALLS; i++)
|
|
{
|
|
if (tilesizx[wall[i].picnum] <= 0)
|
|
wall[i].picnum = 0,j++;
|
|
if (tilesizx[wall[i].overpicnum] <= 0)
|
|
wall[i].overpicnum = 0,j++;
|
|
}
|
|
for (i=0; i<MAXSPRITES; i++)
|
|
{
|
|
if (tilesizx[sprite[i].picnum] <= 0)
|
|
sprite[i].picnum = 0,j++;
|
|
}
|
|
Bsprintf(tempbuf,"Replaced %d invalid tiles",j);
|
|
printmessage16(tempbuf);
|
|
}
|
|
}
|
|
break;
|
|
case 1:
|
|
{
|
|
for (i=Bsprintf(disptext,"%s",FuncMenuStrings[row]); i < dispwidth; i++) disptext[i] = ' ';
|
|
if (editval)
|
|
{
|
|
Bsprintf(tempbuf,"Delete all sprites of tile #: ");
|
|
i = getnumber16(tempbuf,-1,MAXSPRITES-1,1);
|
|
if (i >= 0)
|
|
{
|
|
int32_t k = 0;
|
|
for (j=0; j<MAXSPRITES-1; j++)
|
|
if (sprite[j].picnum == i)
|
|
deletesprite(j), k++;
|
|
Bsprintf(tempbuf,"%d sprite(s) deleted",k);
|
|
printmessage16(tempbuf);
|
|
}
|
|
else printmessage16("Aborted");
|
|
}
|
|
}
|
|
break;
|
|
case 2:
|
|
{
|
|
for (i=Bsprintf(disptext,"%s",FuncMenuStrings[row]); i < dispwidth; i++) disptext[i] = ' ';
|
|
if (editval)
|
|
{
|
|
j=getnumber16("Set map sky shade: ",0,128,1);
|
|
|
|
for (i=0; i<numsectors; i++)
|
|
{
|
|
if (sector[i].ceilingstat&1)
|
|
sector[i].ceilingshade = j;
|
|
}
|
|
printmessage16("All parallax skies adjusted");
|
|
}
|
|
}
|
|
break;
|
|
case 3:
|
|
{
|
|
for (i=Bsprintf(disptext,"%s",FuncMenuStrings[row]); i < dispwidth; i++) disptext[i] = ' ';
|
|
if (editval)
|
|
{
|
|
j=getnumber16("Set map sky height: ",0,16777216,1);
|
|
if (j != 0)
|
|
{
|
|
for (i=0; i<numsectors; i++)
|
|
{
|
|
if (sector[i].ceilingstat&1)
|
|
sector[i].ceilingz = j;
|
|
}
|
|
printmessage16("All parallax skies adjusted");
|
|
}
|
|
else printmessage16("Aborted");
|
|
}
|
|
}
|
|
break;
|
|
case 4:
|
|
{
|
|
for (i=Bsprintf(disptext,"%s",FuncMenuStrings[row]); i < dispwidth; i++) disptext[i] = ' ';
|
|
if (editval)
|
|
{
|
|
j=getnumber16("Z offset: ",0,16777216,1);
|
|
if (j!=0)
|
|
{
|
|
for (i=0; i<numsectors; i++)
|
|
{
|
|
sector[i].ceilingz += j;
|
|
sector[i].floorz += j;
|
|
}
|
|
for (i=0; i<MAXSPRITES; i++)
|
|
sprite[i].z += j;
|
|
printmessage16("Map adjusted");
|
|
}
|
|
else printmessage16("Aborted");
|
|
}
|
|
}
|
|
break;
|
|
case 5:
|
|
{
|
|
for (i=Bsprintf(disptext,"%s",FuncMenuStrings[row]); i < dispwidth; i++) disptext[i] = ' ';
|
|
if (editval)
|
|
{
|
|
j=getnumber16("Percentage of original: ",100,1000,0);
|
|
if (j!=100)
|
|
{
|
|
int32_t w, currsector, start_wall, end_wall;
|
|
double size = (j/100.f);
|
|
for (i = 0; i < highlightsectorcnt; i++)
|
|
{
|
|
currsector = highlightsector[i];
|
|
sector[currsector].ceilingz = (int32_t)(sector[currsector].ceilingz*size);
|
|
sector[currsector].floorz = (int32_t)(sector[currsector].floorz*size);
|
|
// 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].x = (int32_t)(wall[w].x*size);
|
|
wall[w].y = (int32_t)(wall[w].y*size);
|
|
wall[w].yrepeat = min((int32_t)(wall[w].yrepeat/size),255);
|
|
}
|
|
w = headspritesect[highlightsector[i]];
|
|
while (w >= 0)
|
|
{
|
|
sprite[w].x = (int32_t)(sprite[w].x*size);
|
|
sprite[w].y = (int32_t)(sprite[w].y*size);
|
|
sprite[w].z = (int32_t)(sprite[w].z*size);
|
|
sprite[w].xrepeat = min(max((int32_t)(sprite[w].xrepeat*size),1),255);
|
|
sprite[w].yrepeat = min(max((int32_t)(sprite[w].yrepeat*size),1),255);
|
|
w = nextspritesect[w];
|
|
}
|
|
}
|
|
printmessage16("Map scaled");
|
|
}
|
|
else printmessage16("Aborted");
|
|
}
|
|
}
|
|
break;
|
|
case 6:
|
|
{
|
|
for (i=Bsprintf(disptext,"%s",FuncMenuStrings[row]); i < dispwidth; i++) disptext[i] = ' ';
|
|
if (editval)
|
|
{
|
|
j=getnumber16("Shade divisor: ",1,128,1);
|
|
if (j!=1)
|
|
{
|
|
for (i=0; i<numsectors; i++)
|
|
{
|
|
sector[i].ceilingshade /= j;
|
|
sector[i].floorshade /= j;
|
|
}
|
|
for (i=0; i<numwalls; i++)
|
|
wall[i].shade /= j;
|
|
for (i=0; i<MAXSPRITES; i++)
|
|
sprite[i].shade /= j;
|
|
printmessage16("Shades adjusted");
|
|
}
|
|
else printmessage16("Aborted");
|
|
}
|
|
}
|
|
break;
|
|
case 7:
|
|
{
|
|
for (i=Bsprintf(disptext,"%s",FuncMenuStrings[row]); i < dispwidth; i++) disptext[i] = ' ';
|
|
if (editval)
|
|
{
|
|
j=getnumber16("Visibility divisor: ",1,128,0);
|
|
if (j!=1)
|
|
{
|
|
for (i=0; i<numsectors; i++)
|
|
{
|
|
if (sector[i].visibility < 240)
|
|
sector[i].visibility /= j;
|
|
else sector[i].visibility = 240 + (sector[i].visibility>>4)/j;
|
|
}
|
|
printmessage16("Visibility adjusted");
|
|
}
|
|
else printmessage16("Aborted");
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
printext16(xpos,ypos+row*MENU_Y_SPACING,editorcolors[11],editorcolors[1],disptext,0);
|
|
enddrawing();
|
|
showframe(1);
|
|
}
|
|
begindrawing();
|
|
printext16(xpos,ypos+row*MENU_Y_SPACING,editorcolors[11],editorcolors[0],disptext,0);
|
|
enddrawing();
|
|
/*clearmidstatbar16();*/
|
|
showframe(1);
|
|
keystatus[KEYSC_ESC] = 0;
|
|
}
|
|
|