raze-gles/polymer/eduke32/a.m32

637 lines
15 KiB
Text
Raw Normal View History

// m32 script test & show-off file
// do "include a" in the console
include names.h
// flag 1: per-block (top-level, event, or state) variable
gamevar i 0 1
gamevar j 0 1
gamevar k 0 1
gamevar l 0 1
gamevar m 0 1
gamevar p 0 1
gamevar q 0 1
gamevar gi 0 0
gamevar gj 0 0
gamevar gk 0 0
gamevar tmp 0 0
gamevar davr 65536 0
gamevar dayx 65536 0
gamevar drawcol 9 0
define TQUOTE 3
definequote 0 OK
definequote 1 DAMN
definequote 2 BU:%d ABS:%d
definequote TQUOTE write on me!
definequote 4 ASPECT: VR=%d, YX=%d
definequote 5 ALPHA KEY: %d (SCANCODE: %d)
definequote 6 time: %d ms
definequote 7 door sector not an island sector!
definequote 8 door sector has no SE sprite!
//light sector x y z range r g b radi fade angle horiz mins maxs prio tile
definequote 9 light %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d
definequote 10 --PRLIGHTS--
definequote 11 --ENDPRLIGHTS--
definequote 12 RED:
definequote 13 GREEN:
definequote 14 BLUE:
definequote 15 x/yoffset: %d %d
definequote 16 (r/g/b)color: %d %d %d
definequote 17 PICNUM:
definequote 18 NUMBER KEY: %d (SCANCODE: %d)
// Corruption checker
definequote 19 PANIC!!! SECTOR OR WALL LIMIT EXCEEDED!!!
definequote 20 SECTOR[%d].WALLPTR=%d out of range: numwalls=%d!!!
definequote 21 SECTOR[%d].WALLPTR=%d inconsistent, expected %d!!!
definequote 22 SECTOR[%d]: wallptr+wallnum=%d out of range: numwalls=%d!!!
definequote 23 WALL[%d].POINT2=%d out of range: sector[%d].wallptr=%d, endwall=%d!!!
definequote 24 WALL[%d].NEXTWALL=%d out of range: numwalls=%d!!!
definequote 25 WALL[%d].NEXTSECTOR=%d out of range: numsectors=%d!!!
definequote 26 FLOAT ACCESS TEST
gamearray ar 128
gamearray parm 8
// various tests of m32-script features
defstate tests
// array test
getarraysize ar tmp
resizearray ar 65536
getticks parm[2]
for j range 65536
set ar[j] j
set i 0
for j range 65536
add i ar[j]
getticks parm[3]
resizearray ar tmp
ife i 2147450880 quote 0 else quote 1
sub parm[3] parm[2]
qsprintf TQUOTE 6 parm[3]
quote TQUOTE
// iteration and break test
for i range 10
{
addlogvar i
ife i 5 break
}
ife i 5 quote 0 else quote 1
quote 26
set tmp pr_parallaxscale
set gi tmp set gj tmp set gk tmp
al gi al gj al gk
ftoi gi 20 ftoi gj 200 ftoi gk 2000
al gi al gj al gk
mul gk 2
itof gk 2000
ends
// prints out maphack light definitions based on SE lights in map
defstate printlights
print 10
for i allsprites, ifactor SECTOREFFECTOR, ifge .lotag 49, ifle .lotag 50
{
ife .lotag 50
{
set j 128, sub j .shade, shiftl j 1
set k j, mul k 3, div k 4
}
else
{
set j 0, set k 0
}
set l 0
ifand .cstat 2
{
ifand .cstat 512
set l 4
else
set l 2
}
qsprintf TQUOTE 9 .sectnum .x .y .z .hitag .xvel .yvel .zvel
j k .ang .extra .xoffset .yoffset l .owner
print TQUOTE
}
print 11
ends
// convenient polymer SE light manipulation with keypad keys
defstate fiddlewithlights
ifn searchstat 0 ifn searchstat 4 nullop
else
{
// polymer override parallaxscale
set j 0
ifhitkey KEY_KP8 set j 1
ifhitkey KEY_KP5 set j -1
ifeithershift nullop else mul j 10
ifn j 0
{
set k pr_parallaxscale // also available: ~bias, specularfactor, ~power
ftoi k 2000000 // must convert to scaled integer
add k j
itof k 2000000 // convert back
set pr_parallaxscale k
}
}
ife searchstat 3 ife sprite[searchwall].picnum SECTOREFFECTOR
ifge sprite[searchwall].lotag 49 ifle sprite[searchwall].lotag 50
{
set i searchwall, seti i // set current sprite = targeted sprite
// horiz
ifeithershift set j 1 else set j 10
ifhitkey KEY_gUP add .extra j
else ifhitkey KEY_gKP5 sub .extra j
clamp .extra -500 500
// angle
set j 128
ifeitherctrl set j 4
ifeithershift { ifeitherctrl set j 1 else set j 32 }
ifhitkey KEY_gLEFT sub .ang j
else ifhitkey KEY_gRIGHT add .ang j
// range
ifeithershift set j 10
else ifeitherctrl set j 1000
else set j 100
ifhitkey KEY_gPGUP add .hitag j
else ifhitkey KEY_gHOME sub .hitag j
clamp .hitag 0 16000
// radius
ifeitherctrl
{
ifholdkey KEY_gMINUS add .shade 9
else ifholdkey KEY_gPLUS sub .shade 9
clamp .shade -118 117
}
// min/max shade
ifeithershift set j -1 else set j 1
ifeitherctrl
{
ifhitkey KEY_gSLASH
{
set .xoffset 0
set .yoffset 0
}
}
else
{
set k 0
ifhitkey KEY_gSLASH { add .xoffset j, set k 1 }
else ifhitkey KEY_gSTAR { add .yoffset j, set k 1 }
ife k 1
{
qsprintf TQUOTE 15 .xoffset .yoffset
quote TQUOTE
}
}
// color/picnum
ifeitheralt
{
ifhitkey KEY_gEND
{
getnumber256 .xvel 12 255
getnumber256 .yvel 13 255
getnumber256 .zvel 14 255
}
else ifhitkey KEY_gDOWN
{
getnumber256 .owner 17 -MAXTILES
}
}
else
{
ifeitherctrl set j 1 else set j 10
ifeithershift inv j
set k 0
ifhitkey KEY_gEND { add .xvel j, set k 1 }
ifhitkey KEY_gDOWN { add .yvel j, set k 1 }
ifhitkey KEY_gPGDN { add .zvel j, set k 1 }
ife k 1
{
clamp .xvel 1 255
clamp .yvel 1 255
clamp .zvel 1 255
qsprintf TQUOTE 16 .xvel .yvel .zvel
quote TQUOTE
}
}
}
ends
defstate testkeyavail
for i range 27
{
ifholdkey alphakeys[i]
{
qsprintf TQUOTE 5 i alphakeys[i]
quote TQUOTE
}
}
for i range 10
{
ifholdkey numberkeys[i]
{
qsprintf TQUOTE 18 i numberkeys[i]
quote TQUOTE
}
}
ends
//onevent EVENT_PREKEYS2D
// state testkeyavail
//endevent
onevent EVENT_PREKEYS3D
// state testkeyavail
state fiddlewithlights
endevent
defstate setas
set j dayx
mul j ydim mul j 8
div j xdim div j 5
setaspect davr j
ends
onevent EVENT_ENTER3DMODE
state setas
endevent
defstate cmp_by_lotag // comparator subroutine for sorting
set RETURN sprite[SV2].lotag
sub RETURN sprite[SV1].lotag
ends
onevent EVENT_DRAW2DSCREEN
ifl cursectnum 0 return
// connect LOCATORS in a sector by lines
getarraysize ar tmp
set j 0
for i spritesofsector cursectnum
{
ifge j tmp nullop else
ifactor LOCATORS
{
set ar[j] i
add j 1
}
}
set tmp j
sort ar tmp cmp_by_lotag
sub tmp 1
for i range tmp
{
set j ar[i]
set k i, add k 1, set k ar[k]
drawline16b sprite[j].x sprite[j].y sprite[k].x sprite[k].y drawcol
}
/*
set drawlinepat -1
for i allsprites
ifactor LIZTROOP
drawcircle16b sprite[i].x sprite[i].y 256 drawcol
*/
endevent
// LOCATORS auto-incrementer
onevent EVENT_INSERTSPRITE2D
set k I
set j -1
for i spritesofsector .sectnum
{
ifn i k, ifactor LOCATORS, ifg .lotag j
set j .lotag
}
ifg j -1
{
add j 1
set .lotag j
}
endevent
// rotates and duplicates selected sprites around
// pivot sprite (extra=123, ang:dang, yrepeat<<5:dz (pos. if pal!=0), lo:cnt)
defstate duprot
ifn searchstat 3 return
ifn sprite[searchwall].extra 123 return
ifl sprite[searchwall].shade 1 return
set k searchwall
for i range sprite[k].shade
{
for j selsprites, ifn j k
{
dupsprite j
set tmp i, add tmp 1, mul tmp sprite[k].ang
rotatepoint sprite[k].x sprite[k].y .x .y tmp (l m)
add .ang tmp
set tmp i, add tmp 1, mul tmp sprite[k].yrepeat, shiftl tmp 5
ife sprite[k].pal 0 inv tmp
add tmp .z
bsetsprite I l m tmp
}
}
ends
// same as above but with tsprite[], as a kind of preview
defstate tduprot
ifn searchstat 3 return
ifn sprite[searchwall].extra 123 return
ifl sprite[searchwall].shade 1 return
set k searchwall
for i range sprite[k].shade
{
for j selsprites, ifn j k
{
set p spritesortcnt
tdupsprite j
set tmp i, add tmp 1, mul tmp sprite[k].ang
rotatepoint sprite[k].x sprite[k].y tsprite[p].x tsprite[p].y tmp (l m)
add tsprite[p].ang tmp
set tmp i, add tmp 1, mul tmp sprite[k].yrepeat, shiftl tmp 5
ife sprite[k].pal 0 inv tmp
add tmp tsprite[p].z
set tsprite[p].x l
set tsprite[p].y m
set tsprite[p].z tmp
or tsprite[p].cstat 514
// bsetsprite I l m tmp
}
}
ends
onevent EVENT_ANALYZESPRITES
state tduprot
/*
for i drawnsprites
{
set j tsprite[i].owner
switch sprite[j].picnum
case LIZTROOP spritepal 1 break
case PIGCOP spritepal 2 break
case BOSS1 spritepal 6 break
endswitch
}
*/
endevent
onevent EVENT_KEYS3D
// door sound tester
ife searchstat 0
ifholdkey KEY_SPACE
{
set k wall[searchwall].nextsector
ifl k 0 set k searchsector
ife sector[k].lotag 0 return
for i spritesofsector k
{
ifactor MUSICANDSFX
ifge .lotag 0 ifl .lotag MAXSOUNDS
{
getsoundflags .lotag m
ifand m 1 nullop else soundonce .lotag
}
}
}
// swinging doors tester -- hit space on a door wall
ife searchstat 0
ifhitkey KEY_SPACE // SE11 ST23 up:ccw
{
set k wall[searchwall].nextsector
ifl k 0 return
ifn sector[k].lotag 23 return
set tmp 0
for i loopofwall searchwall
{
ifl wall[i].nextsector 0 set tmp 1 else
ifn wall[i].nextsector k set tmp 1
}
// a weaker condition
// for i loopofwall wall[searchwall].nextwall
// {
// ifl wall[i].nextsector 0 set tmp 1 else
// ifn wall[i].nextsector searchsector set tmp 1
// }
ifn tmp 0
{
quote 7
return
}
set l -1
for i spritesofsector k
{
ifactor SECTOREFFECTOR ife sprite[i].lotag 11
{
set l i
ifn sprite[i].ang 512 ifn sprite[i].ang 1024 ifn sprite[i].ang 1536 set l -1
}
}
ifl l 0
{
quote 8
return
}
for tmp wallsofsector k
{
rotatepoint (sprite[l].x sprite[l].y) (wall[tmp].x wall[tmp].y) sprite[l].ang (i j)
dragpoint tmp i j
}
for tmp spritesofsector k
{
ifn tmp l
{
rotatepoint (sprite[l].x sprite[l].y) (sprite[tmp].x sprite[tmp].y) sprite[l].ang (i j)
bsetsprite tmp i j sprite[tmp].z
}
}
inv sprite[l].ang
}
// teleporter -- works on SE7 and SE17 (elevator)
ife searchstat 3
ifhitkey KEY_SPACE
{
ife sprite[searchwall].picnum SECTOREFFECTOR
{
set tmp 0
ife sprite[searchwall].lotag 7 set tmp 1
ife sprite[searchwall].lotag 17 set tmp 1
ife tmp 0 return
for i allsprites
{
ifn i searchwall, ifactor SECTOREFFECTOR, ife sprite[i].lotag sprite[searchwall].lotag
ife sprite[i].hitag sprite[searchwall].hitag
{
add posx sprite[i].x, sub posx sprite[searchwall].x
add posy sprite[i].y, sub posy sprite[searchwall].y
add posz sprite[i].z, sub posz sprite[searchwall].z
updatecursectnum
return
}
}
}
else ife sprite[searchwall].extra 123
{
state duprot
add sprite[searchwall].extra 1
}
}
ifholdkey KEY_0
// ife 0 1
{
ifeithershift sub davr 512 else add davr 512
ifl davr 32768 set davr 32768
ifg davr 256000 set davr 256000
setaspect davr yxaspect
qsprintf TQUOTE 4 davr yxaspect
quote TQUOTE
}
endevent
defstate replacestuff
for i spritesofsector searchsector
// ife sprite[i].picnum AMMO set sprite[i].picnum BATTERYAMMO
ifactor parm[0] cactor parm[1]
ends
defstate convlights // convert (0,0,0) lights to (255,255,255)-ones
for i allsprites ifactor 1 ifge .lotag 49 ifle .lotag 50 ife .xvel 0 ife .yvel 0 ife .zvel 0
{ set .xvel 255 set .yvel 255 set .zvel 255 }
ends
defstate resetallws // reset all sprites and walls to default repeat/panning
for i allsprites
{
set .xrepeat 64
set .yrepeat 64
}
for i allwalls
{
set wall[i].cstat 0
set wall[i].xpanning 0
set wall[i].ypanning 0
set wall[i].yrepeat 8
fixrepeats i
}
ends
defstate jumptosec // (tmp)
for i allsectors
{
ife i tmp
{
set j sector[i].wallptr
set posx wall[j].x
set posy wall[j].y
}
}
ends
// Map corruption checker
gamevar ewall 0 0
gamevar endwall 0 0
defstate corruptchk
ifle numsectors MAXSECTORS ifle numwalls MAXWALLS nullop else
{ quote 19 printmessage16 19 return }
set ewall 0 // expected wall index
for i allsectors
{
set k 1
ifge sector[i].wallptr 0 ifl sector[i].wallptr numwalls nullop else
{
qsprintf TQUOTE 20 i sector[i].wallptr numwalls
quote TQUOTE printmessage16 TQUOTE
set k 0
}
ifn ewall sector[i].wallptr
{
qsprintf TQUOTE 21 i sector[i].wallptr ewall
quote TQUOTE printmessage16 TQUOTE
set ewall sector[i].wallptr
}
add ewall sector[i].wallnum
set endwall sector[i].wallptr add endwall sector[i].wallnum
ifg endwall numwalls
{
qsprintf TQUOTE 22 i endwall numwalls
quote TQUOTE printmessage16 TQUOTE
set k 0
}
ifn k 0
{
for j wallsofsector i
{
ifge wall[j].point2 sector[i].wallptr ifl wall[i].point2 endwall nullop else
{
qsprintf TQUOTE 23 j wall[j].point2 i sector[i].wallptr endwall
quote TQUOTE printmessage16 TQUOTE
}
ifge wall[i].nextwall numwalls
{
qsprintf TQUOTE 24 j wall[j].nextwall numwalls
quote TQUOTE printmessage16 TQUOTE
}
ifge wall[i].nextsector numsectors
{
qsprintf TQUOTE 25 j wall[j].nextsector numsectors
quote TQUOTE printmessage16 TQUOTE
}
}
}
}
ends