bugfixes; mark tiles in tile selector for later grouping (press SPACE on a tile); a.m32: convert to CRLF and add [xyz]vel query in 3d mode (Alt-KP1), also different keys for Polymer override var tweaking; some CRLF->LF in LF-only files.

git-svn-id: https://svn.eduke32.com/eduke32@1695 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
helixhorned 2010-08-14 21:32:28 +00:00
parent 9ca26d9736
commit c354695d60
13 changed files with 1591 additions and 1170 deletions

View file

@ -453,6 +453,8 @@ void setview(int32_t x1, int32_t y1, int32_t x2, int32_t y2);
void setaspect(int32_t daxrange, int32_t daaspect);
void flushperms(void);
void plotlines2d(int32_t *xx, int32_t *yy, int32_t numpoints, char col);
void plotpixel(int32_t x, int32_t y, char col);
char getpixel(int32_t x, int32_t y);
void setviewtotile(int16_t tilenume, int32_t xsiz, int32_t ysiz);

View file

@ -102,6 +102,9 @@ int32_t _getnumber16(const char *namestart, int32_t num, int32_t maxnumber, char
#define getnumber16(namestart, num, maxnumber, sign) _getnumber16(namestart, num, maxnumber, sign, NULL)
void printmessage256(int32_t x, int32_t y, const char *name);
// currently only for 3d mode
const char* getstring_simple(const char *querystr, const char *defaultstr, int32_t maxlen);
// like snprintf, but pads the output buffer with 'fill' at the end
int32_t snfillprintf(char *outbuf, size_t bufsiz, int32_t fill, const char *fmt, ...);
void _printmessage16(const char *fmt, ...);

View file

@ -17,8 +17,8 @@ int32_t scriptfile_getsymbol(scriptfile *sf, int32_t *num);
int32_t scriptfile_getlinum(scriptfile *sf, char *ptr);
int32_t scriptfile_getbraces(scriptfile *sf, char **braceend);
scriptfile *scriptfile_fromfile(char *fn);
scriptfile *scriptfile_fromstring(char *string);
scriptfile *scriptfile_fromfile(const char *fn);
scriptfile *scriptfile_fromstring(const char *string);
void scriptfile_close(scriptfile *sf);
int32_t scriptfile_eof(scriptfile *sf);

View file

@ -417,6 +417,8 @@ int32_t app_main(int32_t argc, const char **argv)
}
//Bcanonicalisefilename(boardfilename,0);
loadnames(); // should be before ExtInit() because of auto 'Y' tile group
if ((i = ExtInit()) < 0) return -1;
#if defined RENDERTYPEWIN || (defined RENDERTYPESDL && !defined __APPLE__ && defined HAVE_GTK2)
if (i || forcesetup || cmdsetup)
@ -437,7 +439,6 @@ int32_t app_main(int32_t argc, const char **argv)
installusertimercallback(keytimerstuff);
loadpics("tiles000.art", 1048576*16);
loadnames();
Bstrcpy(kensig,"Uses BUILD technology by Ken Silverman");
initcrc();
@ -679,7 +680,8 @@ void showmouse(void)
plotpixel(searchx,searchy-i,whitecol);
plotpixel(searchx,searchy+i,whitecol);
}
}*/
}
*/
static int32_t mhk=0;
void loadmhk()
@ -3864,7 +3866,7 @@ SKIP:
if (newnumwalls >= numwalls)
{
if (newnumwalls > numwalls)
if (newnumwalls > numwalls+1)
newnumwalls--;
else
newnumwalls = -1;
@ -4445,6 +4447,7 @@ CANCEL:
}
}
}
if (bad == 1)
{
Bstrcpy(boardfilename, selectedboardfilename);
@ -4452,7 +4455,7 @@ CANCEL:
printmessage16("Operation cancelled");
showframe(1);
}
if (bad == 2)
else if (bad == 2)
{
char *f; int32_t res;
keystatus[0x1c] = 0;
@ -5319,6 +5322,86 @@ int32_t _getnumber256(const char *namestart, int32_t num, int32_t maxnumber, cha
return(oldnum);
}
// querystr: e.g. "Name: ", must be !=NULL
// defaultstr: can be NULL
// NO overflow checks are done when copying them!
// maxlen: maximum length of entry string, if ==1, enter single char
const char* getstring_simple(const char *querystr, const char *defaultstr, int32_t maxlen)
{
static char buf[128];
int32_t ei=0, qrylen=0;
char ch;
bflushchars();
clearkeys();
if (maxlen==0)
maxlen = 1000;
Bmemset(buf, 0, sizeof(buf));
qrylen = Bstrlen(querystr);
Bmemcpy(buf, querystr, qrylen);
ei = qrylen;
if (defaultstr)
{
int32_t deflen = Bstrlen(defaultstr);
Bmemcpy(&buf[ei], defaultstr, deflen);
ei += deflen;
}
buf[ei] = 0;
if (maxlen==1)
{
ei = qrylen;
buf[ei+1] = 0;
}
while (1)
{
printext256(0, 0, whitecol, 0, buf, 0);
showframe(1);
if (handleevents())
quitevent = 0;
idle_waitevent();
ch = bgetchar();
if (ch==13)
break;
else if (keystatus[1])
{
clearkeys();
return defaultstr;
}
if (maxlen!=1)
{
if (ei>qrylen && (ch==8 || ch==127))
buf[--ei] = ' ';
else if ((unsigned)ei<sizeof(buf)-1 && ei-qrylen<maxlen && isalnum(ch))
{
buf[ei++] = ch;
buf[ei] = 0;
}
}
else
{
if (isalnum(ch) || ch==' ')
buf[ei] = Btoupper(ch);
}
}
clearkeys();
return buf+qrylen;
}
static void clearfilenames(void)
{
klistfree(finddirs);

View file

@ -236,7 +236,7 @@ int32_t loadsetup(const char *fn)
if (readconfig(fp, "showheightindicators", val, VL) > 0)
showheightindicators = min(max(Batoi(val),0),2);
if (readconfig(fp, "showambiencesounds", val, VL) > 0)
showheightindicators = min(max(Batoi(val),0),2);
showambiencesounds = min(max(Batoi(val),0),2);
if (readconfig(fp, "graphicsmode", val, VL) > 0)
graphicsmode = min(max(Batoi(val),0),2);

View file

@ -7667,6 +7667,7 @@ int32_t setgamemode(char davidoption, int32_t daxdim, int32_t daydim, int32_t da
//bytesperline is set in this function
j = bpp;
if (setvideomode(daxdim,daydim,dabpp,davidoption) < 0) return(-1);
#if defined(POLYMOST) && defined(USE_OPENGL)
@ -9982,6 +9983,18 @@ void setbrightness(char dabrightness, uint8_t *dapal, char noapply)
palfadedelta = 0;
}
static inline palette_t getpal(int32_t col)
{
if (gammabrightness) return curpalette[col];
else
{
palette_t p;
p.b = britable[curbrightness][ curpalette[col].b ];
p.g = britable[curbrightness][ curpalette[col].g ];
p.r = britable[curbrightness][ curpalette[col].r ];
return p;
}
}
//
// setpalettefade
@ -9998,13 +10011,7 @@ void setpalettefade(char r, char g, char b, char offset)
for (i=0; i<256; i++)
{
if (gammabrightness) p = curpalette[i];
else
{
p.b = britable[curbrightness][ curpalette[i].b ];
p.g = britable[curbrightness][ curpalette[i].g ];
p.r = britable[curbrightness][ curpalette[i].r ];
}
p = getpal(i);
curpalettefaded[i].b =
p.b + (((palfadergb.b - p.b) * offset) >> 6);
@ -10032,14 +10039,8 @@ void clearview(int32_t dacol)
#if defined(POLYMOST) && defined(USE_OPENGL)
if (rendmode >= 3)
{
palette_t p;
if (gammabrightness) p = curpalette[dacol];
else
{
p.r = britable[curbrightness][ curpalette[dacol].r ];
p.g = britable[curbrightness][ curpalette[dacol].g ];
p.b = britable[curbrightness][ curpalette[dacol].b ];
}
palette_t p = getpal(dacol);
bglClearColor(((float)p.r)/255.0,
((float)p.g)/255.0,
((float)p.b)/255.0,
@ -10076,14 +10077,8 @@ void clearallviews(int32_t dacol)
#if defined(POLYMOST) && defined(USE_OPENGL)
if (rendmode >= 3)
{
palette_t p;
if (gammabrightness) p = curpalette[dacol];
else
{
p.r = britable[curbrightness][ curpalette[dacol].r ];
p.g = britable[curbrightness][ curpalette[dacol].g ];
p.b = britable[curbrightness][ curpalette[dacol].b ];
}
palette_t p = getpal(dacol);
bglViewport(0,0,xdim,ydim); glox1 = -1;
bglClearColor(((float)p.r)/255.0,
((float)p.g)/255.0,
@ -10112,14 +10107,7 @@ void plotpixel(int32_t x, int32_t y, char col)
#if defined(POLYMOST) && defined(USE_OPENGL)
if (rendmode >= 3 && qsetmode == 200)
{
palette_t p;
if (gammabrightness) p = curpalette[col];
else
{
p.r = britable[curbrightness][ curpalette[col].r ];
p.g = britable[curbrightness][ curpalette[col].g ];
p.b = britable[curbrightness][ curpalette[col].b ];
}
palette_t p = getpal(col);
setpolymost2dview(); // JBF 20040205: more efficient setup
@ -10130,7 +10118,6 @@ void plotpixel(int32_t x, int32_t y, char col)
bglRasterPos4i(x, y, 0, 1);
bglDrawPixels(1, 1, GL_RGB, GL_UNSIGNED_BYTE, &p);
bglRasterPos4i(0, 0, 0, 1);
return;
}
#endif
@ -10140,6 +10127,35 @@ void plotpixel(int32_t x, int32_t y, char col)
enddrawing(); //}}}
}
void plotlines2d(int32_t *xx, int32_t *yy, int32_t numpoints, char col)
{
int32_t i;
if (rendmode >= 3)
{
palette_t p = getpal(col);
bglBegin(GL_LINE_STRIP);
bglColor4ub(p.r, p.g, p.b, 1);
for (i=0; i<numpoints; i++)
bglVertex2i(xx[i], yy[i]);
bglEnd();
}
else
{
int32_t odrawlinepat = drawlinepat;
drawlinepat = 0xffffffff;
for (i=0; i<numpoints-1; i++)
drawline16(xx[i], yy[i], xx[i+1], yy[i+1], col);
drawlinepat = odrawlinepat;
}
}
//
// getpixel
@ -11524,22 +11540,7 @@ void printext256(int32_t xpos, int32_t ypos, int16_t col, int16_t backcol, const
{
int32_t xx, yy;
int32_t lc=-1;
palette_t p,b;
if (gammabrightness)
{
p = curpalette[col];
b = curpalette[backcol];
}
else
{
p.r = britable[curbrightness][ curpalette[col].r ];
p.g = britable[curbrightness][ curpalette[col].g ];
p.b = britable[curbrightness][ curpalette[col].b ];
b.r = britable[curbrightness][ curpalette[backcol].r ];
b.g = britable[curbrightness][ curpalette[backcol].g ];
b.b = britable[curbrightness][ curpalette[backcol].b ];
}
palette_t p=getpal(col), b=getpal(backcol);
setpolymost2dview();
bglDisable(GL_ALPHA_TEST);
@ -11553,24 +11554,18 @@ void printext256(int32_t xpos, int32_t ypos, int16_t col, int16_t backcol, const
{
char smallbuf[8];
int32_t bi=0;
while (isdigit(name[i+1]) && bi<8)
{
smallbuf[bi++]=name[i+1];
i++;
}
smallbuf[bi++]=0;
if (col)col = atol(smallbuf);
if (col)
col = atol(smallbuf);
p = getpal(col);
if (gammabrightness)
{
p = curpalette[col];
}
else
{
p.r = britable[curbrightness][ curpalette[col].r ];
p.g = britable[curbrightness][ curpalette[col].g ];
p.b = britable[curbrightness][ curpalette[col].b ];
}
continue;
}
letptr = &fontptr[name[i]<<3];

View file

@ -261,7 +261,7 @@ void scriptfile_preparse(scriptfile *sf, char *tx, int32_t flen)
sf->eof = &sf->textbuf[nflen-1];
}
scriptfile *scriptfile_fromfile(char *fn)
scriptfile *scriptfile_fromfile(const char *fn)
{
int32_t fp;
scriptfile *sf;
@ -298,7 +298,7 @@ scriptfile *scriptfile_fromfile(char *fn)
return sf;
}
scriptfile *scriptfile_fromstring(char *string)
scriptfile *scriptfile_fromstring(const char *string)
{
scriptfile *sf;
char *tx;

View file

@ -116,7 +116,7 @@ ends
defstate fiddlewithlights
ife searchstat 3 nullop else
{
ifhitkey KEY_gSLASH
ifeitherctrl ifhitkey KEY_gSLASH
{
ife pr_overrideparallax 0
{
@ -140,20 +140,20 @@ defstate fiddlewithlights
// polymer override parallaxscale
set j 0 set k 0
ifhitkey KEY_KP4 set j -1
ifhitkey KEY_KP7 set j 1
ifhitkey KEY_KP5 set j -1 //pscale
ifhitkey KEY_KP8 set j 1
ifn j 0 set k 1
ifhitkey KEY_KP8 set j -1
ifhitkey KEY_KP9 set j 1
ifhitkey KEY_KP4 set j -1 //pbias
ifhitkey KEY_KP6 set j 1
ife k 0 ifn j 0 set k 2
ifhitkey KEY_KP1 set j -1
ifhitkey KEY_KP2 set j 1
ifhitkey KEY_gSLASH set j -1 //sfac
ifhitkey KEY_gSTAR set j 1
ife k 0 ifn j 0 set k 3
ifhitkey KEY_KP3 set j -1
ifhitkey KEY_KP6 set j 1
ifhitkey KEY_KP7 set j -1 //spow
ifhitkey KEY_KP9 set j 1
ife k 0 ifn j 0 set k 4
ifeithershift mul j 2 else mul j 10
@ -198,7 +198,36 @@ defstate fiddlewithlights
endswitch
}
// if aiming at an SE with lotag 49 or 50
// if aiming at a sprite that's not a Polymer light
set k 0
ife searchstat 3 set k 1
ife k 1 ife sprite[searchwall].picnum SECTOREFFECTOR
ifge sprite[searchwall].lotag 49 ifle sprite[searchwall].lotag 50
set k 0
ife k 1
{
seti searchwall
// [xyz]vel / owner
ifeitheralt
{
ifhitkey KEY_KP1
{
getnumber256 .xvel "XVEL:" 255
getnumber256 .yvel "YVEL:" 255
getnumber256 .zvel "ZVEL:" 255
}
else ifhitkey KEY_KP2
{
getnumber256 .owner "OWNER:" -MAXTILES
}
}
}
// if aiming at an SE with lotag 49 or 50 (Polymer light)
ife searchstat 3 ife sprite[searchwall].picnum SECTOREFFECTOR
ifge sprite[searchwall].lotag 49 ifle sprite[searchwall].lotag 50
{

View file

@ -3,18 +3,7 @@
#include "names.h"
tilegroup "Player"
{
hotkey "P"
// Colors are the colors for Blocking OFF and Blocking ON.
colors 2 2
tiles
{
APLAYER
}
}
// tilegroup "All named" with the hotkey "Y" is constructed automatically
tilegroup "Actors"
{
@ -75,26 +64,9 @@ tilegroup "Effectors"
{
hotkey "E"
tilerange 1 10
colors 15 15
}
tilegroup "Switches"
{
hotkey "S"
tiles
{
ACCESSSWITCH ACCESSSWITCH2 ACCESSCARD SLOTDOOR LIGHTSWITCH SPACEDOORSWITCH SPACELIGHTSWITCH
FRANKENSTINESWITCH MULTISWITCH
DIPSWITCH DIPSWITCH2 DIPSWITCH3 TECHSWITCH
LIGHTSWITCH2 713 // LIGHTSWITCH2+1
POWERSWITCH1 LOCKSWITCH1 POWERSWITCH2 HANDSWITCH PULLSWITCH
ALIENSWITCH HANDPRINTSWITCH NUKEBUTTON
TARGET
4083 4954 // Busted switches (Atomic)
}
tilerange 1 10
}
tilegroup "Items"
@ -119,6 +91,28 @@ tilegroup "Items"
}
}
tilegroup "Letters and numbers"
{
hotkey "L"
tilerange 2822 2915
tilerange 2929 3022
tilerange 3072 3135
tilerange 3162 3165
tilerange 640 649
tilerange 2472 2481
}
tilegroup "Player"
{
hotkey "P"
// Colors are the colors for Blocking OFF and Blocking ON.
colors 2 2
tile APLAYER
}
tilegroup "Respawn triggers"
{
hotkey "R"
@ -131,6 +125,23 @@ tilegroup "Respawn triggers"
}
}
tilegroup "Switches"
{
hotkey "S"
tiles
{
ACCESSSWITCH ACCESSSWITCH2 ACCESSCARD SLOTDOOR LIGHTSWITCH SPACEDOORSWITCH SPACELIGHTSWITCH
FRANKENSTINESWITCH MULTISWITCH
DIPSWITCH DIPSWITCH2 DIPSWITCH3 TECHSWITCH
LIGHTSWITCH2 713 // LIGHTSWITCH2+1
POWERSWITCH1 LOCKSWITCH1 POWERSWITCH2 HANDSWITCH PULLSWITCH
ALIENSWITCH HANDPRINTSWITCH NUKEBUTTON
TARGET
4083 4954 // Busted switches (Atomic)
}
}
tilegroup "Exploding stuff"
{
hotkey "X"
@ -146,19 +157,6 @@ tilegroup "Exploding stuff"
}
}
tilegroup "Letters and numbers"
{
hotkey "L"
tilerange 2822 2915
tilerange 2929 3022
tilerange 3072 3135
tilerange 3162 3165
tilerange 640 649
tilerange 2472 2481
}
// Alphabet configuration for text entry tool in 3D mode
// (press Ctrl-T on a wall-aligned letter)
// 32 alphabets max.

View file

@ -59,7 +59,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
static int32_t floor_over_floor;
// static char *startwin_labeltext = "Starting Mapster32...";
static char setupfilename[BMAX_PATH]= "mapster32.cfg";
static char setupfilename[]= "mapster32.cfg";
static char defaultduke3dgrp[BMAX_PATH] = "duke3d.grp";
static char *g_grpNamePtr = defaultduke3dgrp;
static int32_t fixmapbeforesaving = 1;
@ -67,8 +67,11 @@ static int32_t lastsave = -180*60;
static int32_t NoAutoLoad = 0;
static int32_t spnoclip=1;
static char default_tiles_cfg[] = "tiles.cfg";
static int32_t pathsearchmode_oninit;
// Sound in Mapster32
static char defaultgamecon[BMAX_PATH] = "game.con";
static char defaultgamecon[] = "game.con";
static char *gamecon = defaultgamecon;
#pragma pack(push,1)
@ -192,6 +195,10 @@ static char wallpals[MAXWALLS];
static char sectorpals[MAXSECTORS][2];
static char spritepals[MAXSPRITES];
static char wallflag[MAXWALLS];
// tile marking in tile selector for custom creation of tile groups
static int16_t tilemarked[(MAXTILES+7)>>3];
#ifdef POLYMER
static int16_t spritelightid[MAXSPRITES];
_prlight *spritelightptr[MAXSPRITES];
@ -2675,22 +2682,46 @@ static int32_t SelectAllTiles(int32_t iCurrentTile)
static int32_t OnGotoTile(int32_t iTile);
static int32_t OnSelectTile(int32_t iTile);
static int32_t OnSaveTileGroup();
static int32_t loadtilegroups(const char *fn);
static int32_t s_Zoom = INITIAL_ZOOM;
static int32_t s_TileZoom = 1;
static char tilesel_errmsg[128], tilesel_showerr=0;
static int32_t DrawTiles(int32_t iTopLeft, int32_t iSelected, int32_t nXTiles, int32_t nYTiles, int32_t TileDim, int32_t offset);
#define TMPERRMSG_SHOW(alsoOSD) do { \
printext256(0, 0, whitecol, 0, tilesel_errmsg, 0); \
if (alsoOSD) OSD_Printf("%s\n", tilesel_errmsg); \
showframe(1); \
} while (0)
#define TMPERRMSG_PRINT(Msg, ...) do { \
Bsprintf(tilesel_errmsg, Msg, __VA_ARGS__); \
TMPERRMSG_SHOW(1); \
tilesel_showerr = 1; \
} while (0)
#define TMPERRMSG_RETURN(Msg, ...) do \
{ \
TMPERRMSG_PRINT(Msg, __VA_ARGS__); \
return 1; \
} while (0)
static int32_t m32gettile(int32_t idInitialTile)
{
int32_t gap, temp, zoomsz;
int32_t nXTiles, nYTiles, nDisplayedTiles;
int32_t i;
int32_t iTile, iTopLeftTile;
int32_t iTile, iTopLeftTile, iLastTile;
int32_t idSelectedTile;
int32_t scrollmode;
int32_t mousedx, mousedy, mtile, omousex=searchx, omousey=searchy, moffset=0;
int32_t noTilesMarked=1;
int32_t mark_lastk = -1;
// Enable following line for testing. I couldn't work out how to change vidmode on the fly
// s_Zoom = NUM_ZOOMS - 1;
@ -2722,7 +2753,7 @@ static int32_t m32gettile(int32_t idInitialTile)
localartlookup[i] = i;
}
iTile = idSelectedTile = idInitialTile;
iLastTile = iTile = idSelectedTile = idInitialTile;
switch (searchstat)
{
@ -2839,6 +2870,14 @@ static int32_t m32gettile(int32_t idInitialTile)
DrawTiles(iTopLeftTile, (iTile >= localartlookupnum) ? localartlookupnum-1 : iTile,
nXTiles, nYTiles, zoomsz, moffset);
if (tilesel_showerr)
{
if (iTile == iLastTile)
TMPERRMSG_SHOW(0);
else
tilesel_showerr = 0;
}
iLastTile = iTile;
idle_waitevent_timeout(500);
// SDL seems to miss mousewheel events when rotated slowly.
@ -2952,28 +2991,76 @@ static int32_t m32gettile(int32_t idInitialTile)
}
if (PRESSED_KEYSC(LEFT))
iTile -= (iTile > 0);
{
if (eitherCTRL) // same as HOME, for consistency with CTRL-UP/DOWN
iTile = (iTile/nXTiles)*nXTiles;
else
iTile--;
}
if (PRESSED_KEYSC(RIGHT))
iTile += (iTile < MAXTILES);
{
if (eitherCTRL) // same as END, for consistency with CTRL-UP/DOWN
iTile = ((iTile+nXTiles)/nXTiles)*nXTiles - 1;
else
iTile++;
}
if (PRESSED_KEYSC(UP))
{
if (eitherCTRL)
while (iTile-nXTiles >= iTopLeftTile)
iTile -= nXTiles;
else
iTile -= nXTiles;
}
if (PRESSED_KEYSC(DOWN))
{
if (eitherCTRL)
while (iTile+nXTiles < iTopLeftTile + nDisplayedTiles)
iTile += nXTiles;
else
iTile += nXTiles;
}
if (PRESSED_KEYSC(PGUP))
{
if (eitherCTRL)
iTile = 0;
else
iTile -= nDisplayedTiles;
}
if (PRESSED_KEYSC(PGDN))
{
if (eitherCTRL)
iTile = localartlookupnum-1;
else
iTile += nDisplayedTiles;
}
if (PRESSED_KEYSC(HOME))
{
if (eitherCTRL)
iTile = iTopLeftTile;
else
iTile = (iTile/nXTiles)*nXTiles;
}
if (PRESSED_KEYSC(END))
{
if (eitherCTRL)
iTile = iTopLeftTile + nDisplayedTiles - 1;
else
iTile = ((iTile+nXTiles)/nXTiles)*nXTiles - 1;
}
//
// Ensure tilenum is within valid range
//
iTile = clamp(iTile, 0, MAXTILES-1); // shouldn't this be the count of num tiles ??
iTile = clamp(iTile, 0, localartlookupnum-1);
// 'V' KEYPRESS
if (PRESSED_KEYSC(V))
@ -2981,7 +3068,20 @@ static int32_t m32gettile(int32_t idInitialTile)
// 'G' KEYPRESS - Goto frame
if (PRESSED_KEYSC(G))
{
if (eitherCTRL)
{
if (OnSaveTileGroup() == 0)
{
// iTile = SelectAllTiles(iTile);
Bmemset(tilemarked, 0, sizeof(tilemarked));
mark_lastk = -1;
noTilesMarked = 1;
}
}
else
iTile = OnGotoTile(iTile);
}
// 'U' KEYPRESS : go straight to user defined art
if (PRESSED_KEYSC(U))
@ -2997,10 +3097,6 @@ static int32_t m32gettile(int32_t idInitialTile)
iTile = FIRST_ATOMIC_TILE;
}
// 'T' KEYPRESS = Select from pre-defined tileset
if (PRESSED_KEYSC(T))
iTile = OnSelectTile(iTile);
// 'E' KEYPRESS : Go straight to start of extended art
if (PRESSED_KEYSC(E))
{
@ -3011,6 +3107,10 @@ static int32_t m32gettile(int32_t idInitialTile)
else iTile = FIRST_EXTENDED_TILE;
}
// 'T' KEYPRESS = Select from pre-defined tileset
if (PRESSED_KEYSC(T))
iTile = OnSelectTile(iTile);
if (PRESSED_KEYSC(Z))
s_TileZoom = !s_TileZoom;
@ -3026,6 +3126,51 @@ static int32_t m32gettile(int32_t idInitialTile)
iTopLeftTile = clamp(iTopLeftTile, 0, MAXTILES - nDisplayedTiles);
// SPACE keypress: mark/unmark selected tile
if (PRESSED_KEYSC(SPACE))
{
if (iTile < localartlookupnum && IsValidTile(localartlookup[iTile]))
{
if (keystatus[KEYSC_LCTRL] && keystatus[KEYSC_RSHIFT])
{
Bmemset(tilemarked, 0, sizeof(tilemarked));
mark_lastk = -1;
noTilesMarked = 1;
}
else
{
int32_t k=iTile, kend, dir;
if (noTilesMarked)
{
noTilesMarked = 0;
TMPERRMSG_PRINT("%s", "Beginning marking tiles. To group, press Ctrl-G. To reset, press LCtrl-RShift-SPACE.");
}
if (mark_lastk>=0 && eitherCTRL)
{
kend = mark_lastk;
dir = ksgn(mark_lastk-k);
}
else
{
kend = k;
dir = 0;
}
mark_lastk = k;
for (; dir==0 || dir*(kend-k)>=1; k+=dir)
{
tilemarked[localartlookup[k]>>3] ^= (1<<(localartlookup[k]&7));
if (dir==0)
break;
}
}
}
}
if ((keystatus[KEYSC_ENTER] || (bstatus&1)) == 0) // uh ? Not escape key ?
{
idSelectedTile = idInitialTile;
@ -3059,7 +3204,7 @@ static int32_t m32gettile(int32_t idInitialTile)
keystatus[KEYSC_ESC] = 0;
keystatus[KEYSC_ENTER] = 0;
return(idSelectedTile);
return idSelectedTile;
}
@ -3068,6 +3213,124 @@ static int32_t m32gettile(int32_t idInitialTile)
//{
//}
static int32_t OnSaveTileGroup()
{
int32_t i, n=0;
char hotkey;
const char *cp, *name;
if (tile_groups==MAX_TILE_GROUPS)
TMPERRMSG_RETURN("Cannot save tile group: maximum number of groups (%d) exceeded.", MAX_TILE_GROUPS);
for (i=0; i<MAXTILES; i++)
n += !!(tilemarked[i>>3]&(1<<(i&7)));
if (n==0)
TMPERRMSG_RETURN("%s", "Cannot save tile group: no tiles marked.");
else if (n > MAX_TILE_GROUP_ENTRIES)
TMPERRMSG_RETURN("Cannot save tile group: too many tiles in group. Have %d, max is %d.",
n, MAX_TILE_GROUP_ENTRIES);
cp = getstring_simple("Hotkey for new group: ", "", 1);
if (!cp || !*cp)
return 1;
hotkey = Btoupper(cp[0]);
if (!isalpha(hotkey))
TMPERRMSG_RETURN("%s", "Hotkey must be alphabetic.");
for (i=0; i<tile_groups; i++)
if (s_TileGroups[i].key1==hotkey || s_TileGroups[i].key2==Btolower(hotkey))
TMPERRMSG_RETURN("Hotkey '%c' already in use by tile group `%s'.", hotkey, s_TileGroups[i].szText);
name = getstring_simple("Name for new tile group: ", "", 0);
if (!name || !*name)
return 1;
{
int32_t lasti=-1, col=0, k, opathsearchmode=pathsearchmode;
BFILE *fp;
pathsearchmode = pathsearchmode_oninit; // use the same pathsearchmode as on init
fp = fopenfrompath(default_tiles_cfg, "a");
pathsearchmode = opathsearchmode;
if (!fp)
TMPERRMSG_RETURN("Could not open `%s' for appending: %s.", default_tiles_cfg, strerror(errno));
#define TTAB "\t"
#define TBITCHK(i) ((i)<MAXTILES && (tilemarked[(i)>>3]&(1<<((i)&7))))
Bfprintf(fp, "\n");
Bfprintf(fp, "tilegroup \"%s\"\n{\n", name);
Bfprintf(fp, TTAB "hotkey \"%c\"\n\n", hotkey);
// tileranges for consecutive runs of 3 or more tiles
for (i=0; i<MAXTILES; i++)
{
if (lasti>=0 && !TBITCHK(i))
{
if (names[lasti][0] && names[i-1][0])
Bfprintf(fp, TTAB "tilerange %s %s\n", names[lasti], names[i-1]);
else
Bfprintf(fp, TTAB "tilerange %d %d\n", lasti, i-1);
for (k=lasti; k<i; k++)
tilemarked[i>>3] &= ~(1<<(i&7));
lasti = -1;
}
else if (lasti==-1 && TBITCHK(i))
{
if (TBITCHK(i+1) && TBITCHK(i+2))
{
lasti = i;
i += 2;
}
}
}
if (lasti>=0)
Bfprintf(fp, TTAB "tilerange %d %d\n", lasti, MAXTILES-1);
Bfprintf(fp, "\n");
// throw them all in a tiles{...} group else
Bfprintf(fp, TTAB "tiles\n" TTAB "{\n");
for (i=0; i<MAXTILES; i++)
{
if (TBITCHK(i))
{
if (col==0)
Bfprintf(fp, TTAB TTAB), col+=8;
if (names[i])
col+=Bfprintf(fp, "%s ", names[i]);
else
col+=Bfprintf(fp, "%d ", i);
if (col>80)
{
Bfprintf(fp, "\n");
col = 0;
}
}
}
if (col>0)
Bfprintf(fp, "\n");
Bfprintf(fp, TTAB "}\n");
#undef TBITCHK
#undef TTAB
Bfprintf(fp, "}\n");
Bfclose(fp);
if (loadtilegroups(default_tiles_cfg))
TMPERRMSG_PRINT("%s", "Wrote new tile group but failed reloading them.");
else
TMPERRMSG_PRINT("%s", "Wrote and reloaded new tile group.");
}
return 0;
}
static int32_t OnGotoTile(int32_t iTile)
{
int32_t iTemp, iNewTile;
@ -3116,6 +3379,7 @@ static int32_t OnGotoTile(int32_t iTile)
return iTile;
}
static int32_t LoadTileSet(const int32_t idCurrentTile, const int32_t *pIds, const int32_t nIds)
{
int32_t iNewTile = 0;
@ -3143,15 +3407,12 @@ static int32_t OnSelectTile(int32_t iTile)
int32_t i;
char ch;
for (i = 0; (unsigned)i < tile_groups; i++)
if (tile_groups <= 0)
{
if (s_TileGroups[i].pIds != NULL)
break;
TMPERRMSG_PRINT("No tile groups loaded. Check for existence of `%s'.", default_tiles_cfg);
return iTile;
}
if ((unsigned)i == tile_groups) // no tile groups
return (iTile);
SelectAllTiles(iTile);
bflushchars();
@ -3176,7 +3437,7 @@ static int32_t OnSelectTile(int32_t iTile)
//
// Display the description strings for each available tile group
//
for (i = 0; (unsigned)i < tile_groups; i++)
for (i = 0; i < tile_groups; i++)
{
if (s_TileGroups[i].szText != NULL)
{
@ -3189,7 +3450,7 @@ static int32_t OnSelectTile(int32_t iTile)
ch = bgetchar();
for (i = 0; (unsigned)i < tile_groups; i++)
for (i = 0; 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))
@ -3208,6 +3469,11 @@ static int32_t OnSelectTile(int32_t iTile)
return iTile;
}
#undef TMPERRMSG_SHOW
#undef TMPERRMSG_PRINT
#undef TMPERRMSG_RETURN
static const char *GetTilePixels(int32_t idTile)
{
char *pPixelData = 0;
@ -3228,10 +3494,9 @@ static int32_t DrawTiles(int32_t iTopLeft, int32_t iSelected, int32_t nXTiles, i
{
int32_t XTile, YTile;
int32_t iTile, idTile;
int32_t XBox, YBox;
int32_t XPos, YPos;
int32_t XOffset, YOffset;
int32_t i;
int32_t i, marked;
const char *pRawPixels;
int32_t TileSizeX, TileSizeY;
int32_t DivInc,MulInc;
@ -3306,30 +3571,45 @@ static int32_t DrawTiles(int32_t iTopLeft, int32_t iSelected, int32_t nXTiles, i
printext256(XPos, YPos, whitecol, -1, szT, 1);
}
}
}
}
}
marked = (IsValidTile(idTile) && tilemarked[idTile>>3]&(1<<(idTile&7)));
//
// Draw white box around currently selected tile
// Draw white box around currently selected tile or marked tile
// p1=(x1, y1), p2=(x1+TileDim-1, y1+TileDim-1)
//
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 (iTile == iSelected || marked)
{
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)
int32_t x1 = ((iTile-iTopLeft) % nXTiles)*TileDim;
int32_t y1 = ((iTile - ((iTile-iTopLeft) % nXTiles) - iTopLeft)/nXTiles)*TileDim + offset;
int32_t x2 = x1+TileDim-1;
int32_t y2 = y1+TileDim-1;
char markedcol = editorcolors[14];
setpolymost2dview();
y1=max(y1, 0);
y2=min(y2, ydim-1);
// box
plotlines2d((int32_t[]){x1, x1, x2, x2, x1},
(int32_t[]){y1, y2, y2, y1, y1}, 5, iTile==iSelected ? whitecol : markedcol);
// cross
if (marked)
{
plotpixel(XBox, YBox + i, whitecol);
plotpixel(XBox + TileDim, YBox + i, whitecol);
plotlines2d((int32_t[]){x1, x2},
(int32_t[]){y1, y2}, 2, markedcol);
plotlines2d((int32_t[]){x1, x2},
(int32_t[]){y2, y1}, 2, markedcol);
}
}
}
}
}
if (iSelected < 0 || iSelected >= MAXTILES)
return 1;
idTile = localartlookup[ iSelected ];
@ -8016,7 +8296,7 @@ int32_t parsetilegroups(scriptfile *script)
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].pIds = Bcalloc(MAX_TILE_GROUP_ENTRIES, sizeof(int32_t));
s_TileGroups[tile_groups].szText = Bstrdup(name);
while (script->textptr < end)
@ -8090,7 +8370,9 @@ int32_t parsetilegroups(scriptfile *script)
}
}
}
s_TileGroups[tile_groups].pIds = Brealloc(s_TileGroups[tile_groups].pIds,s_TileGroups[tile_groups].nIds*sizeof(int32_t));
s_TileGroups[tile_groups].pIds = Brealloc(s_TileGroups[tile_groups].pIds,
s_TileGroups[tile_groups].nIds*sizeof(int32_t));
tile_groups++;
break;
}
@ -8099,7 +8381,12 @@ int32_t parsetilegroups(scriptfile *script)
char *end;
int32_t i, j, k;
if (numalphabets >= MAX_ALPHABETS) break;
if (numalphabets >= MAX_ALPHABETS)
{
OSD_Printf("Too many alphabet definitions (max: %d).\n", MAX_ALPHABETS);
break;
}
if (scriptfile_getbraces(script,&end)) break;
for (i=0; i<NUMPRINTABLES; i++)
@ -8217,7 +8504,7 @@ int32_t parsetilegroups(scriptfile *script)
return 0;
}
int32_t loadtilegroups(char *fn)
static int32_t loadtilegroups(const char *fn)
{
int32_t i, j;
scriptfile *script;
@ -8226,10 +8513,33 @@ int32_t loadtilegroups(char *fn)
script = scriptfile_fromfile(fn);
if (!script) return -1;
for (i = MAX_TILE_GROUPS-1; i >= 0; i--)
for (i=0; i<tile_groups; i++)
{
Bmemcpy(&s_TileGroups[i],&blank,sizeof(blank));
if (s_TileGroups[i].pIds)
Bfree(s_TileGroups[i].pIds);
if (s_TileGroups[i].szText)
Bfree(s_TileGroups[i].szText);
Bmemcpy(&s_TileGroups[i], &blank, sizeof(blank));
}
tile_groups = 0;
// ---------- Init hardcoded tile group consisting of all named tiles
s_TileGroups[0].szText = Bstrdup("All named");
s_TileGroups[0].pIds = Bmalloc(MAXTILES * sizeof(s_TileGroups[0].pIds[0]));
if (!s_TileGroups[0].pIds)
return -1;
j = 0;
for (i=0; i<MAXTILES; i++)
if (names[i][0])
s_TileGroups[0].pIds[j++] = i;
if (j)
{
s_TileGroups[0].nIds = j;
s_TileGroups[0].key1 = 'Y';
s_TileGroups[0].key2 = 'y';
tile_groups++;
}
// --------------------
parsetilegroups(script);
@ -8240,9 +8550,8 @@ int32_t loadtilegroups(char *fn)
tilegroupActors = getTileGroup("Actors");
// Apply 2d sprite colors as specified in tiles.cfg.
for (i = 0; i < MAX_TILE_GROUPS; i++)
for (i=0; i<tile_groups; i++)
{
if (s_TileGroups[i].szText == NULL) break;
// If the colors were specified...
if (s_TileGroups[i].color1 && s_TileGroups[i].color2)
{
@ -8255,12 +8564,11 @@ int32_t loadtilegroups(char *fn)
}
}
return 0;
}
/// vvv Parse CON files partially to get sound definitions
int32_t parseconsounds(scriptfile *script)
static int32_t parseconsounds(scriptfile *script)
{
int32_t tokn;
char *cmdtokptr;
@ -8399,7 +8707,7 @@ END:
return g_numsounds;
}
int32_t loadconsounds(char *fn)
static int32_t loadconsounds(const char *fn)
{
scriptfile *script;
int32_t ret;
@ -8645,7 +8953,10 @@ int32_t ExtInit(void)
OSD_SetParameters(0,2, 0,0, 4,0);
registerosdcommands();
loadtilegroups("tiles.cfg");
// backup pathsearchmode so that a later open
// will hopefully be the same file
pathsearchmode_oninit = pathsearchmode;
loadtilegroups(default_tiles_cfg);
ReadHelpFile("m32help.hlp");

View file

@ -163,7 +163,7 @@ void VM_OnEvent(register int32_t iEventID, register int32_t iActor)
// needed since any read access before initialization would cause undefined behaviour
if (aEventNumLocals[iEventID] > 0)
Bmemset(localvars, aEventNumLocals[iEventID]*sizeof(int32_t), 0);
Bmemset(localvars, 0, aEventNumLocals[iEventID]*sizeof(int32_t));
Bmemcpy(&vm_backup, &vm, sizeof(vmstate_t));
@ -358,7 +358,7 @@ skip_check:
// needed since any read access before initialization would cause undefined behaviour
if (statesinfo[stateidx].numlocals > 0)
Bmemset(localvars, statesinfo[stateidx].numlocals*sizeof(int32_t), 0);
Bmemset(localvars, 0, statesinfo[stateidx].numlocals*sizeof(int32_t));
insptr = script + statesinfo[stateidx].ofs;
vm.g_st = 1+MAXEVENTS+stateidx;

View file

@ -186,7 +186,7 @@ typedef struct
static TileGroup s_TileGroups[MAX_TILE_GROUPS];
static int32_t tilegroupItems;
static int32_t tilegroupActors;
static uint32_t tile_groups = 0;
static int32_t tile_groups = 0;
#define NUMPRINTABLES 94