mapster32 fixes: aiming crash in polymer, more accurate aiming in polymost + calibration/replacement crosshair via "r_preview_mouseaim", 2 other crashes; fix "S" in tile selector, make read-only variable overridable with "script_expertmode", misc. beautifying.

git-svn-id: https://svn.eduke32.com/eduke32@1706 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
helixhorned 2010-09-06 23:08:35 +00:00
parent a7c95286c2
commit fec84e6dbb
10 changed files with 131 additions and 65 deletions

View file

@ -105,6 +105,7 @@ int32_t _getnumber256(const char *namestart, int32_t num, int32_t maxnumber, cha
int32_t _getnumber16(const char *namestart, int32_t num, int32_t maxnumber, char sign, void *(func)(int32_t)); int32_t _getnumber16(const char *namestart, int32_t num, int32_t maxnumber, char sign, void *(func)(int32_t));
#define getnumber16(namestart, num, maxnumber, sign) _getnumber16(namestart, num, maxnumber, sign, NULL) #define getnumber16(namestart, num, maxnumber, sign) _getnumber16(namestart, num, maxnumber, sign, NULL)
void printmessage256(int32_t x, int32_t y, const char *name); void printmessage256(int32_t x, int32_t y, const char *name);
void message(const char *fmt, ...);
// currently only for 3d mode // currently only for 3d mode
const char* getstring_simple(const char *querystr, const char *defaultstr, int32_t maxlen); const char* getstring_simple(const char *querystr, const char *defaultstr, int32_t maxlen);
@ -171,4 +172,7 @@ extern int32_t scripthistend;
} }
#endif #endif
// showdebug is now used as a general informational on-screen display
#define M32_SHOWDEBUG
#endif #endif

View file

@ -320,26 +320,18 @@ extern char *defsfilename; // set in bstub.c
#ifdef M32_SHOWDEBUG #ifdef M32_SHOWDEBUG
extern char m32_debugstr[64][128]; char m32_debugstr[64][128];
extern int32_t m32_numdebuglines; int32_t m32_numdebuglines=0;
static void M32_drawdebug(void) static void M32_drawdebug(void)
{ {
int i; int i;
int x=4, y=8; int x=4, y=8;
char tstr[64];
static int inited = 0;
if (!inited)
{
Bmemset(m32_debugstr, 0, sizeof(m32_debugstr));
inited = 1;
}
begindrawing(); begindrawing();
Bsprintf(tstr, "searchstat=%d, searchsector=%d, searchwall=%d", // Bsprintf(tstr, "searchstat=%d, searchsector=%d, searchwall=%d",
searchstat, searchsector, searchwall); // searchstat, searchsector, searchwall);
printext256(x,y,whitecol,0,tstr,xdimgame>640?0:1); // printext256(x,y,whitecol,0,tstr,xdimgame>640?0:1);
for (i=0; i<m32_numdebuglines; i++) for (i=0; i<m32_numdebuglines; i++)
{ {
y+=8; y+=8;
@ -364,13 +356,13 @@ int32_t app_main(int32_t argc, const char **argv)
wm_setapptitle("Mapster32"); wm_setapptitle("Mapster32");
editstatus = 1;
if ((i = ExtPreInit(argc,argv)) < 0) return -1; if ((i = ExtPreInit(argc,argv)) < 0) return -1;
#ifdef RENDERTYPEWIN #ifdef RENDERTYPEWIN
backgroundidle = 1; backgroundidle = 1;
#endif #endif
editstatus = 1;
boardfilename[0] = 0; boardfilename[0] = 0;
for (i=1; i<argc; i++) for (i=1; i<argc; i++)
{ {
@ -570,6 +562,12 @@ CANCEL:
#endif #endif
#ifdef M32_SHOWDEBUG #ifdef M32_SHOWDEBUG
if (searchstat>=0 && (searchwall<0 || searchsector<0))
{
Bsprintf(m32_debugstr[m32_numdebuglines++], "inconsistent search variables!");
searchstat = -1;
}
M32_drawdebug(); M32_drawdebug();
#endif #endif
ExtCheckKeys(); ExtCheckKeys();
@ -1419,8 +1417,8 @@ void overheadeditor(void)
osearchx = searchx; osearchx = searchx;
osearchy = searchy; osearchy = searchy;
searchx = scale(searchx,xdim2d,xdimgame); searchx = clamp(scale(searchx,xdim2d,xdimgame), 8, xdim2d-8-1);
searchy = scale(searchy,ydim2d-STATUS2DSIZ2,ydimgame); searchy = clamp(scale(searchy,ydim2d-STATUS2DSIZ2,ydimgame), 8, ydim2d-STATUS2DSIZ-8-1);
oposz = pos.z; oposz = pos.z;
begindrawing(); //{{{ begindrawing(); //{{{
@ -4669,8 +4667,9 @@ CANCEL:
setbrightness(GAMMA_CALC,palette,0); setbrightness(GAMMA_CALC,palette,0);
pos.z = oposz; pos.z = oposz;
searchx = scale(searchx,xdimgame,xdim2d);
searchy = scale(searchy,ydimgame,ydim2d-STATUS2DSIZ); searchx = clamp(scale(searchx,xdimgame,xdim2d), 8, xdimgame-8-1);
searchy = clamp(scale(searchy,ydimgame,ydim2d-STATUS2DSIZ), 8, ydimgame-8-1);
VM_OnEvent(EVENT_ENTER3DMODE, -1); VM_OnEvent(EVENT_ENTER3DMODE, -1);
} }
@ -6613,7 +6612,8 @@ void test_map(int32_t mode)
else else
saveboard("autosave.map",&pos.x,&pos.y,&pos.z,&ang,&cursectnum); saveboard("autosave.map",&pos.x,&pos.y,&pos.z,&ang,&cursectnum);
_printmessage16("Board saved to AUTOSAVE.MAP. Starting the game..."); message("Board saved to AUTOSAVE.MAP. Starting the game...");
OSD_Printf("...as `%s'\n", fullparam);
showframe(1); showframe(1);
uninitmouse(); uninitmouse();
@ -6627,7 +6627,7 @@ void test_map(int32_t mode)
si.cb = sizeof(si); si.cb = sizeof(si);
if (!CreateProcess(NULL,fullparam,NULL,NULL,0,0,NULL,NULL,&si,&pi)) if (!CreateProcess(NULL,fullparam,NULL,NULL,0,0,NULL,NULL,&si,&pi))
printmessage16("Error launching the game!"); message("Error launching the game!");
else WaitForSingleObject(pi.hProcess,INFINITE); else WaitForSingleObject(pi.hProcess,INFINITE);
} }
#else #else

View file

@ -536,8 +536,11 @@ int16_t editstatus = 0;
int16_t searchit; int16_t searchit;
int32_t searchx = -1, searchy; //search input int32_t searchx = -1, searchy; //search input
int16_t searchsector, searchwall, searchstat; //search output int16_t searchsector, searchwall, searchstat; //search output
// nextwall if aiming at bottom w/ swapped walls, else searchwall; only valid for searchstat==0:
// if searchstat==0 (wall), searchbottomwall is ==.nextwall if aiming at
// bottom of a wall with swapped walls (.cstat&2), else it's ==searchwall
int16_t searchbottomwall; int16_t searchbottomwall;
double msens = 1.0; double msens = 1.0;
static char artfilename[20]; static char artfilename[20];
@ -9392,12 +9395,13 @@ void updatesectorz(int32_t x, int32_t y, int32_t z, int16_t *sectnum)
walltype *wal; walltype *wal;
int32_t i, j, cz, fz; int32_t i, j, cz, fz;
getzsofslope(*sectnum, x, y, &cz, &fz);
if ((z >= cz) && (z <= fz))
if (inside(x,y,*sectnum) != 0) return;
if ((*sectnum >= 0) && (*sectnum < numsectors)) if ((*sectnum >= 0) && (*sectnum < numsectors))
{ {
// this block used to be outside the "if" and caused crashes in Polymost Mapster32
getzsofslope(*sectnum, x, y, &cz, &fz);
if ((z >= cz) && (z <= fz))
if (inside(x,y,*sectnum) != 0) return;
wal = &wall[sector[*sectnum].wallptr]; wal = &wall[sector[*sectnum].wallptr];
j = sector[*sectnum].wallnum; j = sector[*sectnum].wallnum;
do do

View file

@ -981,6 +981,8 @@ void polymer_editorpick(void)
case 4: // 1-way/masked wall case 4: // 1-way/masked wall
searchsector = sectorofwall(num); searchsector = sectorofwall(num);
searchbottomwall = searchwall = num; searchbottomwall = searchwall = num;
if (wall[num].nextwall>=0 && (wall[num].cstat&2))
searchbottomwall = wall[num].nextwall;
break; break;
case 1: // floor case 1: // floor
case 2: // ceiling case 2: // ceiling
@ -2971,10 +2973,13 @@ static void polymer_drawwall(int16_t sectnum, int16_t wallnum)
memcpy(oldcolor, w->wall.material.diffusemodulation, sizeof(GLubyte) * 4); memcpy(oldcolor, w->wall.material.diffusemodulation, sizeof(GLubyte) * 4);
pickwallnum = wallnum; pickwallnum = wallnum;
// if the bottom of the walls are inverted // if the bottom of the walls are inverted
// we're going to hit the nextwall instead // we're going to hit the nextwall instead
if (wall[wallnum].cstat & 2) // PK -- handled in polymer_editorpick(), also because there
pickwallnum = wall[wallnum].nextwall; // are maps with .nextwall==-1 but .cstat&2 (like e4l3)
// if (wall[wallnum].cstat & 2)
// pickwallnum = wall[wallnum].nextwall;
w->wall.material.diffusemodulation[0] = 0x00; w->wall.material.diffusemodulation[0] = 0x00;
w->wall.material.diffusemodulation[1] = ((GLubyte *)(&pickwallnum))[0]; w->wall.material.diffusemodulation[1] = ((GLubyte *)(&pickwallnum))[0];

View file

@ -119,6 +119,8 @@ double guo, gux, guy; //Screen-based texture mapping parameters
double gvo, gvx, gvy; double gvo, gvx, gvy;
double gdo, gdx, gdy; double gdo, gdx, gdy;
static int32_t preview_mouseaim=0; // when 1, displays a CROSSHAIR tsprite at the _real_ aimed position
#if (USEZBUFFER != 0) #if (USEZBUFFER != 0)
int32_t zbufysiz = 0, zbufbpl = 0, *zbufoff = 0; int32_t zbufysiz = 0, zbufbpl = 0, *zbufoff = 0;
intptr_t zbufmem = 0; intptr_t zbufmem = 0;
@ -199,6 +201,8 @@ static char ptempbuf[MAXWALLSB<<1];
int32_t r_parallaxskyclamping = 1; int32_t r_parallaxskyclamping = 1;
int32_t r_parallaxskypanning = 0; int32_t r_parallaxskypanning = 0;
extern int16_t editstatus;
static inline int32_t imod(int32_t a, int32_t b) static inline int32_t imod(int32_t a, int32_t b)
{ {
if (a >= 0) return(a%b); if (a >= 0) return(a%b);
@ -4204,7 +4208,9 @@ void polymost_drawrooms()
{ {
resizeglcheck(); resizeglcheck();
//bglClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); if (editstatus)
bglClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
bglDisable(GL_BLEND); bglDisable(GL_BLEND);
bglEnable(GL_TEXTURE_2D); bglEnable(GL_TEXTURE_2D);
//bglTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE); //default anyway //bglTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE); //default anyway
@ -4355,7 +4361,7 @@ void polymost_drawrooms()
hitallsprites = 1; hitallsprites = 1;
hitscan((const vec3_t *)&vect,globalcursectnum, //Start position hitscan((const vec3_t *)&vect,globalcursectnum, //Start position
vx>>12,vy>>12,vz>>8,&hitinfo,0xffff0030); vx>>10,vy>>10,vz>>6,&hitinfo,0xffff0030);
if (hitinfo.hitsect != -1) // if hitsect is -1, hitscan overflowed somewhere if (hitinfo.hitsect != -1) // if hitsect is -1, hitscan overflowed somewhere
{ {
@ -4388,6 +4394,22 @@ void polymost_drawrooms()
//if (vz < 0) searchstat = 1; else searchstat = 2; //Won't work for slopes :/ //if (vz < 0) searchstat = 1; else searchstat = 2; //Won't work for slopes :/
} }
if (preview_mouseaim && spritesortcnt < MAXSPRITESONSCREEN)
{
spritetype *tsp = &tsprite[spritesortcnt];
double dadist, x,y,z;
Bmemcpy(tsp, &hitinfo.pos, sizeof(vec3_t));
x = tsp->x-globalposx; y=tsp->y-globalposy; z=(tsp->z-globalposz)/16.0;
dadist = sqrt(x*x + y*y + z*z);
tsp->sectnum = hitinfo.hitsect;
tsp->picnum = 2523; // CROSSHAIR
tsp->cstat = 128;
tsp->owner = MAXSPRITES-1;
tsp->xrepeat = tsp->yrepeat = min(max(1, (int32_t)(dadist*48.0/3200.0)), 255);
sprite[tsp->owner].xoffset = sprite[tsp->owner].yoffset = 0;
tspriteptr[spritesortcnt++] = tsp;
}
if ((searchstat==1 || searchstat==2) && searchsector>=0) if ((searchstat==1 || searchstat==2) && searchsector>=0)
{ {
int32_t scrv[2] = {(vx>>12), (vy>>12)}; int32_t scrv[2] = {(vx>>12), (vy>>12)};
@ -6182,6 +6204,8 @@ void polymost_initosdfuncs(void)
{ "r_models","r_models: enable/disable model rendering",(void *)&usemodels, CVAR_BOOL, 0, 1 }, { "r_models","r_models: enable/disable model rendering",(void *)&usemodels, CVAR_BOOL, 0, 1 },
{ "r_hightile","r_hightile: enable/disable hightile texture rendering",(void *)&usehightile, CVAR_BOOL, 0, 1 }, { "r_hightile","r_hightile: enable/disable hightile texture rendering",(void *)&usehightile, CVAR_BOOL, 0, 1 },
{ "r_preview_mouseaim", "r_preview_mouseaim: toggles mouse aiming preview, use this to calibrate yxaspect in Polymost Mapster32", (void *)&preview_mouseaim, CVAR_BOOL, 0, 1 },
#endif #endif
}; };

View file

@ -434,6 +434,8 @@ RIGHT smooth scrolling
Hi=unique per train Hi=unique per train
SE 6: SUBWAY FRONT CAR SE 6: SUBWAY FRONT CAR
Ang: direction of first movement Ang: direction of first movement
GPSPEED:
Lo: speed (default: 256)
SE 14: SUBWAY PULLED CARS SE 14: SUBWAY PULLED CARS
Locators: Locators:
starting with Lo=0, ascending starting with Lo=0, ascending

View file

@ -20,9 +20,15 @@ define MAXSPECULARFACTOR 1000
define SPOWERSTEPS 100 define SPOWERSTEPS 100
define SFACTORSTEPS 100 define SFACTORSTEPS 100
// settings for various drawing enhancements // color of various drawing enhancements
define PREVIEW_DRAW_COLOR 11 define PREVIEW_DRAW_COLOR 11
// whether to use overridden aspect/range values when entering 3d mode (software/Polymost).
// tweak with keys 7,8,9,0 on the top row
gamevar use_custom_aspect 0 0
gamevar davr 65536 0
gamevar dayx 65536 0
////////// END USER SETTINGS ////////// ////////// END USER SETTINGS //////////
@ -48,9 +54,6 @@ gamevar dang 0 0
gamevar tmp 0 0 gamevar tmp 0 0
gamevar cnt 0 0 gamevar cnt 0 0
gamevar davr 65536 0
gamevar dayx 65536 0
gamevar drawcol 9 0 gamevar drawcol 9 0
@ -425,14 +428,15 @@ endevent
defstate setas defstate setas
set j dayx // set j dayx
mul j ydim mul j 8 // mul j ydim mul j 8
div j xdim div j 5 // div j xdim div j 5
setaspect davr j setaspect davr dayx
ends ends
onevent EVENT_ENTER3DMODE onevent EVENT_ENTER3DMODE
state setas ifn use_custom_aspect 0
state setas
endevent endevent
@ -695,6 +699,7 @@ ends
// same as above but with tsprite[], as a kind of preview // same as above but with tsprite[], as a kind of preview
defstate tduprot defstate tduprot
ifaimingsprite nullop else return ifaimingsprite nullop else return
ifl searchwall 0 return
ifn sprite[searchwall].extra DUP_ROT_MAGIC return ifn sprite[searchwall].extra DUP_ROT_MAGIC return
set p searchwall // pivot sprite set p searchwall // pivot sprite
@ -927,14 +932,36 @@ onevent EVENT_KEYS3D
} }
} }
ifholdkey KEY_0
// ife 0 1 set j 0
set k 0
ifholdkey KEY_7 set k -1
ifholdkey KEY_0 set k 1
ifn k 0
{ {
ifeithershift sub davr 512 else add davr 512 set j 1
ifeithershift nullop else mul k 256
add davr k
ifl davr 32768 set davr 32768 ifl davr 32768 set davr 32768
ifg davr 256000 set davr 256000 ifg davr 256000 set davr 256000
setaspect davr yxaspect }
qsprintf TQUOTE "ASPECT: VR=%d, YX=%d" davr yxaspect
set k 0
ifholdkey KEY_8 set k -1
ifholdkey KEY_9 set k 1
ifn k 0
{
set j 1
ifeithershift nullop else mul k 256
add dayx k
ifl dayx 32768 set dayx 32768
ifg dayx 256000 set dayx 256000
}
ife j 1
{
setaspect davr dayx
qsprintf TQUOTE "ASPECT: VR=%d, YX=%d" davr dayx
quote TQUOTE quote TQUOTE
} }
endevent endevent

View file

@ -3097,22 +3097,19 @@ static int32_t m32gettile(int32_t idInitialTile)
if (searchstr && searchstr[0]) if (searchstr && searchstr[0])
{ {
int32_t i, i0; int32_t i, i0, slen=Bstrlen(searchstr)-1;
Bstrcpy(laststr, searchstr); Bstrcpy(laststr, searchstr);
i0 = localartlookup[iTile]; i0 = localartlookup[iTile];
if (searchstr[0]=='^') for (i=(i0+1)%MAXTILES; i!=i0; i=(i+1)%MAXTILES)
{ if ((searchstr[0]=='^' && !Bstrncmp(names[i], searchstr+1, slen)) ||
for (i=(i0+1)%MAXTILES; i!=i0; i=(i+1)%MAXTILES) (searchstr[0]!='^' && strstr(names[i], searchstr)))
if ((searchstr[0]=='^' && !Bstrcmp(names[i], searchstr+1)) || {
(searchstr[0]!='^' && strstr(names[i], searchstr))) SelectAllTiles(i);
{ iTile = i;
SelectAllTiles(iTile); break;
iTile = i; }
break;
}
}
} }
} }
@ -3731,7 +3728,8 @@ void drawtileinfo(char *title,int32_t x,int32_t y,int32_t picnum,int32_t shade,i
scale /= (max(tilesizx[picnum],tilesizy[picnum])/24.0); scale /= (max(tilesizx[picnum],tilesizy[picnum])/24.0);
setaspect(65536L, (int32_t)divscale16(ydim*320L,xdim*200L)); 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); // +1024: prevents rotatesprite from setting aspect itself
rotatesprite((x1+13)<<16,(y+11)<<16,scale,0, picnum,shade,pal, 2+1024, 0,0,xdim-1,ydim-1);
setaspect(oviewingrange, oyxaspect); setaspect(oviewingrange, oyxaspect);
x *= xdimgame/320.0; x *= xdimgame/320.0;
@ -4692,7 +4690,7 @@ static void Keys3d(void)
tsign = 0; tsign = 0;
tsign -= PRESSED_KEYSC(COMMA); tsign -= PRESSED_KEYSC(COMMA);
tsign += PRESSED_KEYSC(PERIOD);; tsign += PRESSED_KEYSC(PERIOD);
if (tsign) // , . Search & fix panning to the left/right (3D) if (tsign) // , . Search & fix panning to the left/right (3D)
{ {
@ -5646,7 +5644,7 @@ static void Keys3d(void)
if (PRESSED_KEYSC(F2)) // F2 if (PRESSED_KEYSC(F2)) // F2
{ {
if (eitherCTRL || eitherSHIFT) if (eitherCTRL || eitherSHIFT)
infobox ^= (eitherSHIFT | (eitherCTRL<<2)); infobox ^= (eitherSHIFT | ((eitherCTRL)<<1));
else else
usedcount = !usedcount; usedcount = !usedcount;
} }
@ -6744,7 +6742,10 @@ static void Keys2d(void)
ocursectornum = cursectornum; ocursectornum = cursectornum;
*/ */
if (counter >= 2 && totalclock >= 120*6)
if (totalclock < lastpm16time + 120*2)
_printmessage16(lastpm16buf);
else if (counter >= 2 && totalclock >= 120*6)
{ {
if (pointhighlight >= 16384) if (pointhighlight >= 16384)
{ {
@ -6759,9 +6760,6 @@ static void Keys2d(void)
else if (cursectornum >= 0) else if (cursectornum >= 0)
showsectordata(cursectornum, 1); showsectordata(cursectornum, 1);
} }
if (totalclock < lastpm16time + 120*2)
_printmessage16(lastpm16buf);
} }
///__bigcomment__ ///__bigcomment__

View file

@ -1073,7 +1073,7 @@ static void C_GetNextVarType(int32_t type)
} }
else if (id<MAXGAMEARRAYS) // simple (non-local) gamearrays else if (id<MAXGAMEARRAYS) // simple (non-local) gamearrays
{ {
if ((aGameArrays[id].dwFlags & GAMEARRAY_READONLY) && (type&GV_WRITABLE)) if (!m32_script_expertmode && (aGameArrays[id].dwFlags & GAMEARRAY_READONLY) && (type&GV_WRITABLE))
{ {
C_ReportError(ERROR_ARRAYREADONLY); C_ReportError(ERROR_ARRAYREADONLY);
g_numCompilerErrors++; g_numCompilerErrors++;
@ -1215,6 +1215,8 @@ static void C_GetNextVarType(int32_t type)
} }
else if (id<MAXGAMEVARS) // it's an ordinary var (not a local one) else if (id<MAXGAMEVARS) // it's an ordinary var (not a local one)
{ {
if (m32_script_expertmode)
type &= ~GV_WRITABLE;
if (type==GV_WRITABLE && (aGameVars[id].dwFlags & GV_WRITABLE)) if (type==GV_WRITABLE && (aGameVars[id].dwFlags & GV_WRITABLE))
{ {
g_numCompilerErrors++; g_numCompilerErrors++;

View file

@ -2773,10 +2773,10 @@ dodefault:
// ifaimingsprite and -wall also work in 2d mode, but you must "and" with 16383 yourself // ifaimingsprite and -wall also work in 2d mode, but you must "and" with 16383 yourself
case CON_IFAIMINGSPRITE: case CON_IFAIMINGSPRITE:
VM_DoConditional(AIMING_AT_SPRITE || pointhighlight>=16384); VM_DoConditional(AIMING_AT_SPRITE || (qsetmode!=200 && pointhighlight>=16384));
continue; continue;
case CON_IFAIMINGWALL: case CON_IFAIMINGWALL:
VM_DoConditional(AIMING_AT_WALL_OR_MASK || linehighlight>=0); VM_DoConditional(AIMING_AT_WALL_OR_MASK || (qsetmode!=200 && linehighlight>=0));
continue; continue;
case CON_IFAIMINGSECTOR: case CON_IFAIMINGSECTOR:
VM_DoConditional(AIMING_AT_CEILING_OR_FLOOR); VM_DoConditional(AIMING_AT_CEILING_OR_FLOOR);