mirror of
https://github.com/QB64Official/qb64.git
synced 2024-09-18 16:15:03 +00:00
3386 lines
87 KiB
QBasic
3386 lines
87 KiB
QBasic
|
CHDIR ".\programs\samples\qb45com\action\assault"
|
||
|
|
||
|
'Assault v2
|
||
|
'By Glenn Powell
|
||
|
'( powell98@pacbell.net )
|
||
|
'(c) 1999
|
||
|
|
||
|
'General Procedure Definitions
|
||
|
DECLARE FUNCTION KeyName$ (k$)
|
||
|
DECLARE FUNCTION KeyMark% (k$)
|
||
|
DECLARE FUNCTION TPoint% (tx%, ty%, pn%)
|
||
|
DECLARE FUNCTION BPoint% (tx%, ty%, pn%)
|
||
|
DECLARE FUNCTION TurfHit% (tb%, tx%, ty%)
|
||
|
DECLARE FUNCTION TurfBump$ (tx%, ty%, pn%)
|
||
|
DECLARE SUB TPset (tx%, ty%, tp%)
|
||
|
DECLARE SUB InitGame ()
|
||
|
DECLARE SUB Title ()
|
||
|
DECLARE SUB LoadCfg (file$)
|
||
|
DECLARE SUB LoadKey (file$)
|
||
|
DECLARE SUB InitScr ()
|
||
|
DECLARE SUB InitGamePal ()
|
||
|
DECLARE SUB SetBlastPal ()
|
||
|
DECLARE SUB LoadSprites (file$)
|
||
|
DECLARE SUB DrawPlayer (pn%)
|
||
|
DECLARE SUB ErasePlayer (pn%)
|
||
|
DECLARE SUB DrawSpr (x%, y%, sn%)
|
||
|
DECLARE SUB EraseSpr (x%, y%, sn%)
|
||
|
DECLARE SUB InitBullet (c%, x%, y%, a#, d%, p%, s%)
|
||
|
DECLARE SUB DrawBar ()
|
||
|
DECLARE SUB DrawHealth (pn%, c%)
|
||
|
DECLARE SUB DrawSmallNum (x%, y%, n%, c%)
|
||
|
DECLARE SUB LoadLevel (file$)
|
||
|
DECLARE SUB BuildLevel ()
|
||
|
DECLARE SUB FadePal (fr%, fg%, fb%, i%, c1%, c2%)
|
||
|
DECLARE SUB DefaultPal ()
|
||
|
DECLARE SUB Intro ()
|
||
|
DECLARE SUB Configure ()
|
||
|
DECLARE SUB Menu (mnum%)
|
||
|
DECLARE SUB InitPlayers ()
|
||
|
DECLARE SUB EarthQuake (x%)
|
||
|
DECLARE SUB Damage (pn%, dam%)
|
||
|
DECLARE SUB Win (pnum%)
|
||
|
DECLARE SUB Configure ()
|
||
|
DECLARE SUB Main ()
|
||
|
DECLARE SUB PlayerFall ()
|
||
|
DECLARE SUB PlayerKey ()
|
||
|
DECLARE SUB BulletMove ()
|
||
|
DECLARE SUB DoneTurn ()
|
||
|
DECLARE SUB Pause ()
|
||
|
|
||
|
'Font Procedure Definitions
|
||
|
DECLARE SUB Font (text$, xstart%, ystart%, xscale!, yscale!, style%, tclr%)
|
||
|
DECLARE SUB LoadFont (file$)
|
||
|
|
||
|
'Audio Procedure Definitions
|
||
|
DECLARE FUNCTION DSPRead% ()
|
||
|
DECLARE FUNCTION SpeakerStatus% ()
|
||
|
DECLARE FUNCTION DMAStatus% ()
|
||
|
DECLARE FUNCTION DMADone% ()
|
||
|
DECLARE FUNCTION DSPReset% ()
|
||
|
DECLARE SUB MasterVolume (Right%, Left%, GetVol%)
|
||
|
DECLARE SUB DSPWrite (byte%)
|
||
|
DECLARE FUNCTION ReadDSP% ()
|
||
|
DECLARE SUB SpeakerState (state%)
|
||
|
DECLARE SUB DMAState (state%)
|
||
|
DECLARE FUNCTION ReadDAC% ()
|
||
|
DECLARE SUB DMAPlay (segment&, offset&, length&, freq&)
|
||
|
DECLARE SUB GetBlaster (dma%, baseport%, irq%)
|
||
|
DECLARE FUNCTION DSPVersion! ()
|
||
|
DECLARE SUB WAVPlay (file$, freq&)
|
||
|
|
||
|
'Type Definitions
|
||
|
TYPE gametype
|
||
|
cfgfile AS STRING * 12
|
||
|
keyfile AS STRING * 12
|
||
|
fntfile AS STRING * 12
|
||
|
sprfile AS STRING * 12
|
||
|
END TYPE
|
||
|
TYPE packtype
|
||
|
ammo AS INTEGER
|
||
|
set AS INTEGER
|
||
|
END TYPE
|
||
|
TYPE bullettype
|
||
|
class AS INTEGER
|
||
|
xi AS INTEGER
|
||
|
yi AS INTEGER
|
||
|
x AS INTEGER
|
||
|
y AS INTEGER
|
||
|
a AS DOUBLE
|
||
|
dir AS INTEGER
|
||
|
p AS INTEGER
|
||
|
tim AS DOUBLE
|
||
|
set AS INTEGER
|
||
|
END TYPE
|
||
|
TYPE teamtype
|
||
|
nam AS STRING * 11
|
||
|
act AS INTEGER
|
||
|
clr AS INTEGER
|
||
|
END TYPE
|
||
|
TYPE playertype
|
||
|
nam AS STRING * 10
|
||
|
tnum AS INTEGER
|
||
|
xi AS INTEGER
|
||
|
yi AS INTEGER
|
||
|
x AS INTEGER
|
||
|
y AS INTEGER
|
||
|
a AS DOUBLE
|
||
|
bul AS INTEGER
|
||
|
dir AS INTEGER
|
||
|
health AS INTEGER
|
||
|
dam AS INTEGER
|
||
|
jump AS INTEGER
|
||
|
aj AS SINGLE
|
||
|
pj AS INTEGER
|
||
|
tim AS DOUBLE
|
||
|
glued AS DOUBLE
|
||
|
END TYPE
|
||
|
TYPE leveltype
|
||
|
nam AS STRING * 10
|
||
|
turn AS INTEGER
|
||
|
wind AS INTEGER
|
||
|
jag AS INTEGER
|
||
|
rise AS SINGLE
|
||
|
grav AS SINGLE
|
||
|
sndb AS STRING * 12
|
||
|
nofly AS INTEGER
|
||
|
fire AS INTEGER
|
||
|
tim AS DOUBLE
|
||
|
quit AS INTEGER
|
||
|
END TYPE
|
||
|
TYPE paltype
|
||
|
r AS INTEGER
|
||
|
g AS INTEGER
|
||
|
B AS INTEGER
|
||
|
END TYPE
|
||
|
TYPE polartype
|
||
|
r AS SINGLE
|
||
|
a AS SINGLE
|
||
|
END TYPE
|
||
|
TYPE configtype
|
||
|
snd AS INTEGER
|
||
|
sndb AS INTEGER
|
||
|
ammodrop AS SINGLE
|
||
|
END TYPE
|
||
|
|
||
|
'Global Variable Definitions
|
||
|
COMMON SHARED baseport%, lenport%, channel%
|
||
|
CONST pi# = 3.1415, bulletspd% = 2, maxpower% = 150, maxplayers% = 8
|
||
|
CONST menuclr% = 17, maxweapons% = 7, maxsparks% = 60, maxbullets% = 10
|
||
|
CONST playerstep% = 4, playeraim! = .1, playeraimsize% = 20, gunlen% = 3
|
||
|
DIM SHARED player(maxplayers%) AS playertype, level AS leveltype, bullet(1 TO maxbullets%) AS bullettype
|
||
|
DIM SHARED turfbuf(32001) AS INTEGER, backbuf(32001) AS INTEGER, playerspr(7 + 8 * 7) AS INTEGER
|
||
|
DIM SHARED ammospr(0 TO maxweapons%, 7 + 8 * 7) AS INTEGER, team(maxplayers%) AS teamtype
|
||
|
DIM SHARED config AS configtype, playpack(maxplayers%, 1 TO maxweapons%) AS packtype, spark(1 TO maxsparks%) AS polartype
|
||
|
DIM SHARED smallnum(9, 2 + 3 * 4) AS INTEGER, barbuf(2561) AS INTEGER, pal(1 TO 3) AS paltype
|
||
|
DIM SHARED keycode(1 TO 11 + maxweapons%) AS STRING, keyact(1 TO 11 + maxweapons%) AS STRING
|
||
|
DIM SHARED fontbuf(0) AS STRING * 10368, menuitem(10) AS STRING, game AS gametype
|
||
|
DIM SHARED gamepal(0 TO 255) AS paltype, defpal(0 TO 255) AS paltype
|
||
|
|
||
|
'Set Game Data Files
|
||
|
game.cfgfile = "assault.cfg"
|
||
|
game.keyfile = "assault.key"
|
||
|
game.fntfile = "assault.fnt"
|
||
|
game.sprfile = "assault.spr"
|
||
|
|
||
|
'Initialize Game
|
||
|
InitGame
|
||
|
InitScr
|
||
|
IF config.snd THEN
|
||
|
GetBlaster channel%, baseport%, irq%
|
||
|
IF DSPReset% THEN
|
||
|
SpeakerState 1
|
||
|
MasterVolume config.snd, config.snd, 0
|
||
|
ELSE
|
||
|
PRINT "DSP failed to reset."
|
||
|
PRINT "Sound disabled."
|
||
|
config.snd = 0
|
||
|
END IF
|
||
|
END IF
|
||
|
Title
|
||
|
|
||
|
mainmenu:
|
||
|
pal(1).r = 10
|
||
|
pal(1).g = 10
|
||
|
pal(1).B = 10
|
||
|
DefaultPal
|
||
|
SetBlastPal
|
||
|
FadePal 0, 0, 0, 100, 200, 220
|
||
|
FadePal 0, 0, 0, 0, 0, 31
|
||
|
menuitem(0) = "ASSAULT"
|
||
|
menuitem(1) = "Play"
|
||
|
menuitem(2) = "Play Custom"
|
||
|
menuitem(3) = "Configure"
|
||
|
menuitem(4) = "Quit"
|
||
|
mnum% = 4
|
||
|
Menu mnum%
|
||
|
SELECT CASE mnum%
|
||
|
CASE 1
|
||
|
menuitem(0) = "ENVIRONMENT"
|
||
|
menuitem(1) = "Jungle"
|
||
|
menuitem(2) = "Arctic"
|
||
|
menuitem(3) = "Plains"
|
||
|
menuitem(4) = "Volcano"
|
||
|
menuitem(5) = "Moon"
|
||
|
mnum% = 5
|
||
|
Menu mnum%
|
||
|
SELECT CASE mnum%
|
||
|
CASE -1
|
||
|
GOTO mainmenu
|
||
|
CASE 1
|
||
|
level.nam = "Jungle"
|
||
|
pal(1).r = 20
|
||
|
pal(1).g = 10
|
||
|
pal(1).B = 0
|
||
|
pal(2).r = 10
|
||
|
pal(2).g = 25
|
||
|
pal(2).B = 0
|
||
|
pal(3).r = 20
|
||
|
pal(3).g = 10
|
||
|
pal(3).B = 0
|
||
|
level.jag = 4
|
||
|
level.rise = .8
|
||
|
level.grav = 1
|
||
|
level.sndb = "jungle.wav"
|
||
|
CASE 2
|
||
|
level.nam = "Arctic"
|
||
|
pal(1).r = 20
|
||
|
pal(1).g = 10
|
||
|
pal(1).B = 20
|
||
|
pal(2).r = 50
|
||
|
pal(2).g = 50
|
||
|
pal(2).B = 60
|
||
|
pal(3).r = 15
|
||
|
pal(3).g = 10
|
||
|
pal(3).B = 0
|
||
|
level.jag = 5
|
||
|
level.rise = .5
|
||
|
level.grav = 1
|
||
|
level.sndb = "arctic.wav"
|
||
|
CASE 3
|
||
|
level.nam = "Plains"
|
||
|
pal(1).r = 20
|
||
|
pal(1).g = 20
|
||
|
pal(1).B = 20
|
||
|
pal(2).r = 0
|
||
|
pal(2).g = 30
|
||
|
pal(2).B = 0
|
||
|
pal(3).r = 50
|
||
|
pal(3).g = 50
|
||
|
pal(3).B = 40
|
||
|
level.jag = 5
|
||
|
level.rise = .15
|
||
|
level.grav = 1
|
||
|
level.sndb = "plains.wav"
|
||
|
CASE 4
|
||
|
level.nam = "Volcano"
|
||
|
pal(1).r = 30
|
||
|
pal(1).g = 10
|
||
|
pal(1).B = 0
|
||
|
pal(2).r = 40
|
||
|
pal(2).g = 10
|
||
|
pal(2).B = 0
|
||
|
pal(3).r = 5
|
||
|
pal(3).g = 0
|
||
|
pal(3).B = 0
|
||
|
level.jag = 5
|
||
|
level.rise = .8
|
||
|
level.grav = 1
|
||
|
level.sndb = "volcano.wav"
|
||
|
CASE 5
|
||
|
level.nam = "Moon"
|
||
|
pal(1).r = 0
|
||
|
pal(1).g = 0
|
||
|
pal(1).B = 0
|
||
|
pal(2).r = 30
|
||
|
pal(2).g = 30
|
||
|
pal(2).B = 30
|
||
|
pal(3).r = 10
|
||
|
pal(3).g = 10
|
||
|
pal(3).B = 10
|
||
|
level.jag = 3
|
||
|
level.rise = .3
|
||
|
level.grav = .3
|
||
|
level.sndb = "moon.wav"
|
||
|
END SELECT
|
||
|
FadePal 0, 0, 0, 0, 0, 255
|
||
|
InitGamePal
|
||
|
DEF SEG = VARSEG(backbuf(0))
|
||
|
BLOAD "backgrnd\" + RTRIM$(level.nam) + ".bck", 0
|
||
|
DEF SEG
|
||
|
BuildLevel
|
||
|
Main
|
||
|
GOTO mainmenu
|
||
|
CASE 2
|
||
|
LINE (0, 30)-(319, 199), 0, BF
|
||
|
Font "Custom Level", 160 - (LEN("Custom Level") / 2) * 8, 50, 1, 1, 2, menuclr% + 5
|
||
|
Font "(Enter Cancels)", 160 - (LEN("(Enter Cancels)") / 2) * 8, 65, 1, 1, 2, menuclr% + 5
|
||
|
FOR c% = 0 TO 100
|
||
|
FadePal 0, 0, 0, c%, 0, 31
|
||
|
NEXT c%
|
||
|
LOCATE 11, 15
|
||
|
INPUT "", l$
|
||
|
IF l$ = "" THEN GOTO mainmenu
|
||
|
pal(1).r = 10
|
||
|
pal(1).g = 10
|
||
|
pal(1).B = 10
|
||
|
FadePal 0, 0, 0, 0, 0, 255
|
||
|
InitGamePal
|
||
|
LoadLevel l$ + ".lvl"
|
||
|
Main
|
||
|
GOTO mainmenu
|
||
|
CASE 3
|
||
|
Configure
|
||
|
GOTO mainmenu
|
||
|
CASE 4
|
||
|
IF config.snd THEN
|
||
|
SpeakerState 0
|
||
|
DMAState 0
|
||
|
END IF
|
||
|
SYSTEM
|
||
|
CASE ELSE
|
||
|
GOTO mainmenu
|
||
|
END SELECT
|
||
|
|
||
|
'Various Game Data
|
||
|
teaminfo:
|
||
|
DATA "None",0
|
||
|
DATA "Red Team",4
|
||
|
DATA "White Team",15
|
||
|
DATA "Blue Team",1
|
||
|
DATA "Yellow Team",14
|
||
|
DATA "Green Team",2
|
||
|
DATA "Brown Team",6
|
||
|
DATA "Purple Team",5
|
||
|
DATA "Black Team",16
|
||
|
|
||
|
'Small Number Data
|
||
|
smallnums:
|
||
|
DATA 0,1,0
|
||
|
DATA 1,0,1
|
||
|
DATA 1,0,1
|
||
|
DATA 1,0,1
|
||
|
DATA 0,1,0
|
||
|
|
||
|
DATA 0,0,1
|
||
|
DATA 0,1,1
|
||
|
DATA 0,0,1
|
||
|
DATA 0,0,1
|
||
|
DATA 0,0,1
|
||
|
|
||
|
DATA 0,1,0
|
||
|
DATA 1,0,1
|
||
|
DATA 0,0,1
|
||
|
DATA 0,1,0
|
||
|
DATA 1,1,1
|
||
|
|
||
|
DATA 1,1,0
|
||
|
DATA 0,0,1
|
||
|
DATA 0,1,0
|
||
|
DATA 0,0,1
|
||
|
DATA 1,1,0
|
||
|
|
||
|
DATA 1,0,1
|
||
|
DATA 1,0,1
|
||
|
DATA 1,1,1
|
||
|
DATA 0,0,1
|
||
|
DATA 0,0,1
|
||
|
|
||
|
DATA 1,1,1
|
||
|
DATA 1,0,0
|
||
|
DATA 1,1,0
|
||
|
DATA 0,0,1
|
||
|
DATA 1,1,0
|
||
|
|
||
|
DATA 0,1,1
|
||
|
DATA 1,0,0
|
||
|
DATA 1,1,0
|
||
|
DATA 1,0,1
|
||
|
DATA 0,1,1
|
||
|
|
||
|
DATA 1,1,1
|
||
|
DATA 0,0,1
|
||
|
DATA 0,1,0
|
||
|
DATA 0,1,0
|
||
|
DATA 0,1,0
|
||
|
|
||
|
DATA 0,1,0
|
||
|
DATA 1,0,1
|
||
|
DATA 0,1,0
|
||
|
DATA 1,0,1
|
||
|
DATA 0,1,0
|
||
|
|
||
|
DATA 0,1,1
|
||
|
DATA 1,0,1
|
||
|
DATA 1,1,1
|
||
|
DATA 0,0,1
|
||
|
DATA 0,0,1
|
||
|
|
||
|
FUNCTION BPoint% (tx%, ty%, pn%)
|
||
|
'Returns the pixel that should be displayed as background behind any
|
||
|
'sprite at any time in the game. (241 represents a pixel of the background image)
|
||
|
'tx% and ty% are the coordinates.
|
||
|
'pn% is the number of player who is being "looked behind" (1-4) or
|
||
|
'0 if it is a bullet sprite and you want to be able to "see" all the players.
|
||
|
'You can also use -1 to not see any players.
|
||
|
|
||
|
pp% = 241
|
||
|
IF tx% >= 0 AND tx% <= 319 THEN
|
||
|
IF ty% >= 0 AND ty% <= 15 THEN
|
||
|
DEF SEG = VARSEG(barbuf(0))
|
||
|
pp% = PEEK(tx% + 320& * ty% + 4)
|
||
|
DEF SEG
|
||
|
ELSEIF ty% >= 16 AND ty% <= 199 THEN
|
||
|
DEF SEG = VARSEG(turfbuf(0))
|
||
|
pp% = PEEK(tx% + 320& * ty% + 4)
|
||
|
DEF SEG
|
||
|
END IF
|
||
|
FOR i% = 1 TO maxplayers%
|
||
|
IF player(i%).health > 0 AND pn% <> i% THEN
|
||
|
IF tx% >= player(i%).x AND tx% <= player(i%).x + 7 AND ty% >= player(i%).y AND ty% <= player(i%).y + 7 THEN
|
||
|
pp% = playerspr((player(i%).dir - 1) * -3.5 + player(i%).dir * (tx% - player(i%).x) + 8 * (ty% - player(i%).y))
|
||
|
IF pp% = -1 THEN
|
||
|
pp% = team(player(i%).tnum).clr
|
||
|
ELSEIF pp% = -10 THEN
|
||
|
IF player(i%).dir = 1 THEN
|
||
|
pp% = 25 - INT((tx% - player(i%).x) / 2)
|
||
|
ELSE
|
||
|
pp% = 25 - INT((7 - (tx% - player(i%).x)) / 2)
|
||
|
END IF
|
||
|
END IF
|
||
|
IF pp% > 0 THEN
|
||
|
IF player(i%).glued > 0 THEN pp% = 92
|
||
|
ELSE
|
||
|
pp% = 241
|
||
|
END IF
|
||
|
FOR ii% = 0 TO gunlen%
|
||
|
x% = player(i%).x + 3 + (1 - player(i%).dir) / 2 + COS(player(i%).a) * ii% * player(i%).dir
|
||
|
y% = player(i%).y + 4 + SIN(player(i%).a) * ii%
|
||
|
IF tx% = x% AND ty% = y% THEN pp% = 25
|
||
|
NEXT ii%
|
||
|
END IF
|
||
|
END IF
|
||
|
NEXT i%
|
||
|
IF ty% >= 0 AND ty% <= 199 THEN
|
||
|
IF pp% = 241 THEN
|
||
|
DEF SEG = VARSEG(backbuf(0))
|
||
|
pp% = PEEK(tx% + 320& * ty%)
|
||
|
DEF SEG
|
||
|
END IF
|
||
|
END IF
|
||
|
END IF
|
||
|
BPoint% = pp%
|
||
|
END FUNCTION
|
||
|
|
||
|
SUB BuildLevel
|
||
|
'Builds the level's turf map.
|
||
|
'It uses the LEVEL variable's data to create the map according to the
|
||
|
'environment chosen. (level.jag and level.rise)
|
||
|
|
||
|
'This is for the environment sprites
|
||
|
DIM backspr(1 TO 2, 29 + 30 * 29) AS INTEGER
|
||
|
|
||
|
'Loads the environment sprites
|
||
|
DEF SEG = &HA000
|
||
|
BLOAD "backgrnd\" + RTRIM$(level.nam) + ".spr", 0
|
||
|
DEF SEG
|
||
|
FOR y% = 0 TO 29
|
||
|
FOR x% = 0 TO 29
|
||
|
p% = POINT(x%, y%)
|
||
|
backspr(1, x% + 30 * y%) = p%
|
||
|
NEXT x%
|
||
|
NEXT y%
|
||
|
FOR y% = 0 TO 29
|
||
|
FOR x% = 30 TO 59
|
||
|
p% = POINT(x%, y%)
|
||
|
backspr(2, x% - 30 + 30 * y%) = p%
|
||
|
NEXT x%
|
||
|
NEXT y%
|
||
|
|
||
|
'Draws the terrain outline
|
||
|
CLS
|
||
|
LINE (0, 0)-(319, 199), 240, BF
|
||
|
x1% = 0
|
||
|
y1% = RND * 100 + 30
|
||
|
a# = RND * 2 - 1
|
||
|
buildloop:
|
||
|
x2% = x1%
|
||
|
y2% = y1%
|
||
|
x1% = x2% + COS(a#) * level.jag
|
||
|
y1% = y2% + SIN(a#) * level.jag
|
||
|
LINE (x1%, y1%)-(x2%, y2%), 231
|
||
|
IF y1% <= 30 THEN
|
||
|
a# = RND * 1
|
||
|
ELSEIF y1% >= 190 THEN
|
||
|
a# = RND * -1
|
||
|
ELSE
|
||
|
a# = a# + RND * (level.rise * 2) - level.rise
|
||
|
IF a# > 3 * pi# / 4 THEN a# = 3 * pi# / 4
|
||
|
IF a# < 3 * -pi# / 4 THEN a# = 3 * -pi# / 4
|
||
|
END IF
|
||
|
IF x1% >= 319 THEN GOTO paintbuild
|
||
|
GOTO buildloop
|
||
|
|
||
|
'Paints in the terrain outline
|
||
|
paintbuild:
|
||
|
PAINT (0, 0), 241, 231
|
||
|
FOR x% = 0 TO 319
|
||
|
FOR y% = 0 TO 199
|
||
|
p% = POINT(x%, y%)
|
||
|
IF p% = 240 THEN
|
||
|
p% = POINT(x%, y% - 1) + RND * 3 - 1
|
||
|
IF p% < 231 THEN p% = 231
|
||
|
IF p% > 240 THEN p% = 240
|
||
|
PSET (x%, y%), p%
|
||
|
END IF
|
||
|
NEXT y%
|
||
|
NEXT x%
|
||
|
|
||
|
'Places environment sprites
|
||
|
FOR i% = 1 TO 5
|
||
|
IF RND < .8 THEN
|
||
|
x% = RND * 280 + 20
|
||
|
ly% = 0
|
||
|
FOR y% = 0 TO 199
|
||
|
FOR xx% = x% - 15 TO x% + 15
|
||
|
p% = POINT(xx%, y%)
|
||
|
IF p% = 241 THEN
|
||
|
IF y% > ly% THEN ly% = y%
|
||
|
END IF
|
||
|
NEXT xx%
|
||
|
NEXT y%
|
||
|
x% = x% - 15
|
||
|
y% = ly% - 29
|
||
|
s% = RND + 1
|
||
|
d% = CINT(RND) * 2 - 1
|
||
|
FOR xx% = x% TO x% + 29
|
||
|
FOR yy% = y% TO y% + 29
|
||
|
p% = backspr(s%, (d% + 1) / 2 * 29 + -d% * (xx% - x%) + 30 * (yy% - y%))
|
||
|
bp% = POINT(xx%, yy%)
|
||
|
IF bp% = 241 AND p% > 0 THEN PSET (xx%, yy%), p%
|
||
|
NEXT yy%
|
||
|
NEXT xx%
|
||
|
END IF
|
||
|
NEXT i%
|
||
|
|
||
|
'Stores in Turf Buffer
|
||
|
GET (0, 0)-(319, 199), turfbuf
|
||
|
END SUB
|
||
|
|
||
|
SUB BulletMove
|
||
|
'Moves any and all bullets that are in action on the playfield.
|
||
|
|
||
|
FOR i% = 1 TO maxbullets%
|
||
|
|
||
|
'Explosion
|
||
|
'==========
|
||
|
'bullet variables:
|
||
|
'x = x xoordinate
|
||
|
'y = y xoordinate
|
||
|
'a = current flame size (set to 0 at initialization)
|
||
|
'dir = size of final explosion (set this at initialization)
|
||
|
'p = direction of flame growth (set to 1 at initialization)
|
||
|
'set = sparks setting (set at initialization)
|
||
|
' 0 = no sparks
|
||
|
' 1 = sparks
|
||
|
' 2 = sparks and nuclear flash
|
||
|
'tim = flash timer (set to 0 at initialization)
|
||
|
IF bullet(i%).class = -1 THEN
|
||
|
level.nofly = 0
|
||
|
x% = bullet(i%).x
|
||
|
y% = bullet(i%).y
|
||
|
IF bullet(i%).p = 1 AND bullet(i%).a = 0 THEN
|
||
|
FOR pn% = 1 TO maxplayers%
|
||
|
IF player(pn%).health > 0 THEN
|
||
|
pd% = SQR((player(pn%).x - x%) ^ 2 + (player(pn%).y - y%) ^ 2)
|
||
|
IF pd% < bullet(i%).dir + 3 THEN
|
||
|
ph% = bullet(i%).dir * 2 * (1 - pd% / (bullet(i%).dir + 3))
|
||
|
Damage pn%, ph%
|
||
|
END IF
|
||
|
IF pd% < bullet(i%).dir + 13 THEN
|
||
|
ErasePlayer pn%
|
||
|
player(pn%).jump = 1
|
||
|
player(pn%).xi = player(pn%).x
|
||
|
player(pn%).yi = player(pn%).y
|
||
|
IF player(pn%).x - x% <> 0 THEN
|
||
|
pa# = ATN((player(pn%).y - y%) / ABS(player(pn%).x - x%))
|
||
|
ELSE
|
||
|
pa# = 40
|
||
|
END IF
|
||
|
player(pn%).aj = pa#
|
||
|
pp% = 40 * (1 - pd% / (bullet(i%).dir + 13))
|
||
|
player(pn%).pj = pp%
|
||
|
IF player(pn%).x > x% THEN
|
||
|
player(pn%).dir = 1
|
||
|
ELSE
|
||
|
player(pn%).dir = -1
|
||
|
END IF
|
||
|
player(pn%).tim = TIMER - .1
|
||
|
t# = (TIMER - player(pn%).tim) * bulletspd%
|
||
|
player(pn%).x = player(pn%).xi + t# * COS(player(pn%).aj) * player(pn%).pj * player(pn%).dir
|
||
|
player(pn%).y = player(pn%).yi + t# * SIN(player(pn%).aj) * player(pn%).pj + 16 * t# ^ 2
|
||
|
DrawPlayer pn%
|
||
|
END IF
|
||
|
END IF
|
||
|
NEXT pn%
|
||
|
END IF
|
||
|
FOR r! = 0 TO pi# * 2 STEP .05 / (bullet(i%).dir / 10)
|
||
|
c% = 220 - (bullet(i%).a / bullet(i%).dir) * 20 + RND * 4 - 2
|
||
|
IF c% < 200 THEN c% = 200
|
||
|
IF c% > 220 THEN c% = 220
|
||
|
IF bullet(i%).p = -1 THEN c% = 241
|
||
|
TPset x% + COS(r!) * bullet(i%).a + 3, y% + SIN(r!) * bullet(i%).a + 3, 241
|
||
|
bp% = c%
|
||
|
IF c% = 241 THEN
|
||
|
bp% = BPoint%(x% + COS(r!) * bullet(i%).a + 3, y% + SIN(r!) * bullet(i%).a + 3, 0)
|
||
|
END IF
|
||
|
PSET (x% + COS(r!) * bullet(i%).a + 3, y% + SIN(r!) * bullet(i%).a + 3), bp%
|
||
|
NEXT r!
|
||
|
bullet(i%).a = bullet(i%).a + .5 * bullet(i%).p
|
||
|
IF bullet(i%).p = 1 AND bullet(i%).a >= bullet(i%).dir THEN
|
||
|
bullet(i%).p = -1
|
||
|
END IF
|
||
|
IF bullet(i%).set = 2 THEN
|
||
|
cc% = -1
|
||
|
IF bullet(i%).p = 1 AND bullet(i%).a < 10 THEN cc% = 1
|
||
|
bullet(i%).tim = bullet(i%).tim + cc%
|
||
|
IF bullet(i%).tim < 0 THEN bullet(i%).tim = 0
|
||
|
IF bullet(i%).tim > 20 THEN bullet(i%).tim = 20
|
||
|
ci% = 100 - (bullet(i%).tim * 3)
|
||
|
IF ci% < 0 THEN ci% = 0
|
||
|
IF ci% > 100 THEN ci% = 100
|
||
|
FadePal gamepal(bullet(i%).tim + 200).r, gamepal(bullet(i%).tim + 200).g, gamepal(bullet(i%).tim + 200).B, ci%, 0, 255
|
||
|
END IF
|
||
|
IF bullet(i%).set >= 1 THEN
|
||
|
FOR ii% = 1 TO maxsparks%
|
||
|
sx% = bullet(i%).x + 3 + spark(ii%).r * COS(spark(ii%).a)
|
||
|
sy% = bullet(i%).y + 3 + .3 * (spark(ii%).r * SIN(spark(ii%).a))
|
||
|
PSET (sx%, sy%), BPoint%(sx%, sy%, 0)
|
||
|
spark(ii%).r = spark(ii%).r + 2
|
||
|
sx% = bullet(i%).x + 3 + spark(ii%).r * COS(spark(ii%).a)
|
||
|
sy% = bullet(i%).y + 3 + .3 * (spark(ii%).r * SIN(spark(ii%).a))
|
||
|
c% = 220 - spark(ii%).r / 3
|
||
|
IF c% < 200 THEN c% = 200
|
||
|
IF bullet(i%).p = -1 AND bullet(i%).a < 0 THEN c% = BPoint%(sx%, sy%, 0)
|
||
|
PSET (sx%, sy%), c%
|
||
|
NEXT ii%
|
||
|
END IF
|
||
|
IF bullet(i%).p = -1 AND bullet(i%).a < 0 THEN
|
||
|
bullet(i%).class = 0
|
||
|
GOTO nextbul
|
||
|
END IF
|
||
|
x% = (bullet(i%).dir / 10 - 1) * 3000 + 1000
|
||
|
EarthQuake x%
|
||
|
END IF
|
||
|
|
||
|
'Ammo crate on the ground
|
||
|
'==========
|
||
|
'bullet variables:
|
||
|
'x = x xoordinate
|
||
|
'y = y xoordinate
|
||
|
'a = null
|
||
|
'dir = ammo amount
|
||
|
'p = null
|
||
|
'set = ammo class
|
||
|
'tim = null
|
||
|
IF bullet(i%).class = 100 THEN
|
||
|
x% = bullet(i%).x
|
||
|
y% = bullet(i%).y
|
||
|
FOR ii% = 1 TO maxplayers%
|
||
|
pd% = SQR((player(ii%).x - x%) ^ 2 + (player(ii%).y - y%) ^ 2)
|
||
|
IF pd% <= 7 THEN
|
||
|
EraseSpr x%, y%, 0
|
||
|
bullet(i%).class = 0
|
||
|
playpack(ii%, bullet(i%).set).ammo = playpack(ii%, bullet(i%).set).ammo + bullet(i%).dir
|
||
|
InitBullet 101, x%, y%, 0, bullet(i%).dir, 0, bullet(i%).set
|
||
|
IF config.snd THEN
|
||
|
WAVPlay "bounce.wav", 11000
|
||
|
END IF
|
||
|
GOTO nextbul
|
||
|
END IF
|
||
|
NEXT ii%
|
||
|
FOR ii% = 1 TO maxbullets%
|
||
|
IF i% <> ii% AND bullet(ii%).class = -1 THEN
|
||
|
pd% = SQR((bullet(ii%).x - x%) ^ 2 + (bullet(ii%).y - y%) ^ 2)
|
||
|
IF pd% <= bullet(ii%).a THEN
|
||
|
bullet(i%).class = -1
|
||
|
bullet(i%).a = 0
|
||
|
bullet(i%).dir = 15
|
||
|
bullet(i%).p = 1
|
||
|
bullet(i%).set = 0
|
||
|
IF config.snd THEN
|
||
|
WAVPlay "explode.wav", 11000
|
||
|
END IF
|
||
|
GOTO nextbul
|
||
|
END IF
|
||
|
END IF
|
||
|
NEXT ii%
|
||
|
DrawSpr x%, y%, 0
|
||
|
END IF
|
||
|
|
||
|
'Ammo crate falling from sky
|
||
|
'==========
|
||
|
'bullet variables:
|
||
|
'x = x xoordinate
|
||
|
'y = y xoordinate (should be 0 at initializtion)
|
||
|
'a = null
|
||
|
'dir = ammo amount
|
||
|
'p = null
|
||
|
'set = ammo class
|
||
|
'tim = fall timer (set to TIMER at initializtion)
|
||
|
IF bullet(i%).class = -100 THEN
|
||
|
level.nofly = 0
|
||
|
x% = bullet(i%).x
|
||
|
y% = bullet(i%).y
|
||
|
t# = (level.tim - bullet(i%).tim) * bulletspd%
|
||
|
EraseSpr x%, y%, 0
|
||
|
y% = bullet(i%).yi + 16 * t# ^ 2 * level.grav
|
||
|
IF x% < -7 OR x% > 326 OR y% > 206 THEN
|
||
|
bullet(i%).class = 0
|
||
|
GOTO nextbul
|
||
|
END IF
|
||
|
bullet(i%).y = y%
|
||
|
IF TurfHit%(0, x%, y%) THEN
|
||
|
bullet(i%).class = 100
|
||
|
IF config.snd THEN
|
||
|
WAVPlay "crash.wav", 11000
|
||
|
END IF
|
||
|
GOTO nextbul
|
||
|
END IF
|
||
|
DrawSpr x%, y%, 0
|
||
|
END IF
|
||
|
|
||
|
'Ammo displayed from ammo crate
|
||
|
'==========
|
||
|
'bullet variables:
|
||
|
'xi = initial x xoordinate
|
||
|
'yi = initial y xoordinate
|
||
|
'x = current x xoordinate
|
||
|
'y = current y xoordinate
|
||
|
'a = null
|
||
|
'dir = ammo amount
|
||
|
'p = null
|
||
|
'set = ammo class
|
||
|
'tim = timer (set to 0 at initialization)
|
||
|
IF bullet(i%).class = 101 THEN
|
||
|
level.nofly = 0
|
||
|
FOR ii% = 1 TO bullet(i%).dir
|
||
|
IF bullet(i%).dir = 1 THEN
|
||
|
xc% = 0
|
||
|
ELSEIF bullet(i%).dir = 2 THEN
|
||
|
xc% = -1
|
||
|
IF ii% = 2 THEN xc% = 1
|
||
|
ELSEIF bullet(i%).dir = 2 THEN
|
||
|
xc% = -1
|
||
|
IF ii% = 2 THEN xc% = 0
|
||
|
IF ii% = 3 THEN xc% = 1
|
||
|
END IF
|
||
|
x% = bullet(i%).xi + xc% * bullet(i%).a
|
||
|
y% = bullet(i%).yi - bullet(i%).a
|
||
|
EraseSpr x%, y%, bullet(i%).set
|
||
|
NEXT ii%
|
||
|
IF level.tim - bullet(i%).tim >= 1 THEN
|
||
|
bullet(i%).class = 0
|
||
|
GOTO nextbul
|
||
|
END IF
|
||
|
bullet(i%).a = bullet(i%).a + .03
|
||
|
FOR ii% = 1 TO bullet(i%).dir
|
||
|
IF bullet(i%).dir = 1 THEN
|
||
|
xc% = 0
|
||
|
ELSEIF bullet(i%).dir = 2 THEN
|
||
|
xc% = -1
|
||
|
IF ii% = 2 THEN xc% = 1
|
||
|
ELSEIF bullet(i%).dir = 2 THEN
|
||
|
xc% = -1
|
||
|
IF ii% = 2 THEN xc% = 0
|
||
|
IF ii% = 3 THEN xc% = 1
|
||
|
END IF
|
||
|
x% = bullet(i%).xi + xc% * bullet(i%).a
|
||
|
y% = bullet(i%).yi - bullet(i%).a
|
||
|
DrawSpr x%, y%, bullet(i%).set
|
||
|
NEXT ii%
|
||
|
END IF
|
||
|
|
||
|
'Basic cannon ball
|
||
|
'==========
|
||
|
'bullet variables:
|
||
|
'xi = initial x xoordinate
|
||
|
'yi = initial y xoordinate
|
||
|
'x = current x xoordinate
|
||
|
'y = current y xoordinate
|
||
|
'a = launch angle
|
||
|
'dir = launch direction
|
||
|
'p = launch power
|
||
|
'set = multiple bullets
|
||
|
'tim = fly timer (set to TIMER at initialization)
|
||
|
IF bullet(i%).class = 1 THEN
|
||
|
level.nofly = 0
|
||
|
x% = bullet(i%).x
|
||
|
y% = bullet(i%).y
|
||
|
a# = bullet(i%).a
|
||
|
p% = bullet(i%).p
|
||
|
d% = bullet(i%).dir
|
||
|
t# = (level.tim - bullet(i%).tim) * bulletspd%
|
||
|
EraseSpr x%, y%, 1
|
||
|
x% = bullet(i%).xi + t# * COS(a#) * p% * d% + level.wind * t#
|
||
|
y% = bullet(i%).yi + t# * SIN(a#) * p% + 16 * t# ^ 2 * level.grav
|
||
|
IF x% < -7 OR x% > 326 OR y% > 206 THEN
|
||
|
bullet(i%).class = 0
|
||
|
GOTO nextbul
|
||
|
END IF
|
||
|
bullet(i%).x = x%
|
||
|
bullet(i%).y = y%
|
||
|
IF TurfHit%(1, x%, y%) THEN
|
||
|
bullet(i%).class = -1
|
||
|
bullet(i%).a = 0
|
||
|
bullet(i%).dir = (4 - bullet(i%).set) * 3 + 7
|
||
|
bullet(i%).p = 1
|
||
|
bullet(i%).set = 0
|
||
|
IF config.snd THEN
|
||
|
WAVPlay "blast.wav", 11000
|
||
|
END IF
|
||
|
GOTO nextbul
|
||
|
END IF
|
||
|
DrawSpr x%, y%, 1
|
||
|
END IF
|
||
|
|
||
|
'Grenade
|
||
|
'==========
|
||
|
'bullet variables:
|
||
|
'xi = initial x xoordinate
|
||
|
'yi = initial y xoordinate
|
||
|
'x = current x xoordinate
|
||
|
'y = current y xoordinate
|
||
|
'a = launch angle
|
||
|
'dir = launch direction
|
||
|
'p = launch power
|
||
|
'set = explosion timer
|
||
|
'tim = fly timer (set to TIMER at initialization)
|
||
|
IF bullet(i%).class = 2 THEN
|
||
|
level.nofly = 0
|
||
|
x% = bullet(i%).x
|
||
|
y% = bullet(i%).y
|
||
|
a# = bullet(i%).a
|
||
|
p% = bullet(i%).p
|
||
|
d% = bullet(i%).dir
|
||
|
t# = (level.tim - bullet(i%).tim) * bulletspd%
|
||
|
EraseSpr x%, y%, 2
|
||
|
x% = bullet(i%).xi + t# * COS(a#) * p% * d% + level.wind * t#
|
||
|
y% = bullet(i%).yi + t# * SIN(a#) * p% + 16 * t# ^ 2 * level.grav
|
||
|
IF x% < -7 OR x% > 326 OR y% > 206 THEN
|
||
|
bullet(i%).class = 0
|
||
|
GOTO nextbul
|
||
|
END IF
|
||
|
bump$ = TurfBump$(x%, y%, level.turn)
|
||
|
SELECT CASE bump$
|
||
|
|
||
|
CASE "00000000"
|
||
|
|
||
|
CASE "11111111"
|
||
|
x% = bullet(i%).x
|
||
|
y% = bullet(i%).y
|
||
|
bullet(i%).xi = bullet(i%).x
|
||
|
bullet(i%).yi = bullet(i%).y
|
||
|
bullet(i%).tim = TIMER
|
||
|
|
||
|
CASE "11100011", "11000001", "10000000", "00000010", "00000001", "00000011", "10000011", "00000111", "10000111", "11001111", "10001111", "11000111", "10000001", "11001111", "11101111", "11000001", "11000011"
|
||
|
IF bullet(i%).dir = -1 THEN
|
||
|
xc% = t# * COS(a#) * p% * -d% + level.wind * t#
|
||
|
bullet(i%).xi = x% - xc%
|
||
|
bullet(i%).dir = 1
|
||
|
IF config.snd THEN
|
||
|
WAVPlay "bounce.wav", 11000
|
||
|
END IF
|
||
|
END IF
|
||
|
|
||
|
CASE "11110001", "11100000", "01000000", "00100000", "00010000", "00110000", "01110000", "00111000", "01111000", "11111100", "01111100", "11111000", "01100000", "11111100", "11111110", "11100000", "11110000"
|
||
|
IF bullet(i%).dir = 1 THEN
|
||
|
xc% = t# * COS(a#) * p% * -d% + level.wind * t#
|
||
|
bullet(i%).xi = x% - xc%
|
||
|
bullet(i%).dir = -1
|
||
|
IF config.snd THEN
|
||
|
WAVPlay "bounce.wav", 11000
|
||
|
END IF
|
||
|
END IF
|
||
|
|
||
|
CASE "00000110", "00001111", "10011111"
|
||
|
IF y% > bullet(i%).y THEN
|
||
|
bullet(i%).xi = x%
|
||
|
bullet(i%).yi = y%
|
||
|
bullet(i%).p = p% / 1.5
|
||
|
bullet(i%).dir = 1
|
||
|
bullet(i%).tim = TIMER - .1
|
||
|
IF config.snd THEN
|
||
|
WAVPlay "bounce.wav", 11000
|
||
|
END IF
|
||
|
END IF
|
||
|
|
||
|
CASE "00011000", "00111100", "01111110"
|
||
|
IF y% > bullet(i%).y THEN
|
||
|
bullet(i%).xi = x%
|
||
|
bullet(i%).yi = y%
|
||
|
bullet(i%).p = p% / 1.5
|
||
|
bullet(i%).dir = -1
|
||
|
bullet(i%).tim = TIMER - .1
|
||
|
IF config.snd THEN
|
||
|
WAVPlay "bounce.wav", 11000
|
||
|
END IF
|
||
|
END IF
|
||
|
|
||
|
CASE ELSE
|
||
|
IF y% > bullet(i%).y THEN
|
||
|
bullet(i%).xi = x%
|
||
|
bullet(i%).yi = y%
|
||
|
bullet(i%).p = p% / 1.5
|
||
|
bullet(i%).tim = TIMER - .1
|
||
|
IF config.snd THEN
|
||
|
WAVPlay "bounce.wav", 11000
|
||
|
END IF
|
||
|
END IF
|
||
|
|
||
|
END SELECT
|
||
|
bullet(i%).x = x%
|
||
|
bullet(i%).y = y%
|
||
|
IF bullet(i%).set <= 0 THEN
|
||
|
bullet(i%).class = -1
|
||
|
bullet(i%).a = 0
|
||
|
bullet(i%).dir = 20
|
||
|
bullet(i%).p = 1
|
||
|
bullet(i%).set = 0
|
||
|
IF config.snd THEN
|
||
|
WAVPlay "blast.wav", 7000
|
||
|
END IF
|
||
|
GOTO nextbul
|
||
|
END IF
|
||
|
DrawSpr x%, y%, 2
|
||
|
bullet(i%).set = bullet(i%).set - 15
|
||
|
END IF
|
||
|
|
||
|
'Mine
|
||
|
'==========
|
||
|
'bullet variables:
|
||
|
'x = current x xoordinate
|
||
|
'y = current y xoordinate
|
||
|
'a = null
|
||
|
'dir = null
|
||
|
'p = null
|
||
|
'set = trip distance setting
|
||
|
'tim = null
|
||
|
IF bullet(i%).class = 3 THEN
|
||
|
IF level.tim - bullet(i%).tim < 4 THEN level.nofly = 0
|
||
|
IF level.tim - bullet(i%).tim > 3 THEN
|
||
|
x% = bullet(i%).x
|
||
|
y% = bullet(i%).y
|
||
|
FOR ii% = 1 TO maxplayers%
|
||
|
pd% = SQR((player(ii%).x - x%) ^ 2 + (player(ii%).y - y%) ^ 2)
|
||
|
IF pd% <= 5 * bullet(i%).set THEN
|
||
|
bullet(i%).class = -1
|
||
|
bullet(i%).a = 0
|
||
|
bullet(i%).dir = 15
|
||
|
bullet(i%).p = 1
|
||
|
bullet(i%).y = bullet(i%).y + 3
|
||
|
bullet(i%).set = 0
|
||
|
IF ii% = level.turn THEN level.fire = 1
|
||
|
IF config.snd THEN
|
||
|
WAVPlay "explode.wav", 11000
|
||
|
END IF
|
||
|
GOTO nextbul
|
||
|
END IF
|
||
|
NEXT ii%
|
||
|
FOR ii% = 1 TO maxbullets%
|
||
|
IF i% <> ii% AND bullet(ii%).class = -1 THEN
|
||
|
pd% = SQR((bullet(ii%).x - x%) ^ 2 + (bullet(ii%).y - y%) ^ 2)
|
||
|
IF pd% <= bullet(ii%).a THEN
|
||
|
bullet(i%).class = -1
|
||
|
bullet(i%).a = 0
|
||
|
bullet(i%).dir = 15
|
||
|
bullet(i%).p = 1
|
||
|
bullet(i%).set = 0
|
||
|
IF config.snd THEN
|
||
|
WAVPlay "explode.wav", 11000
|
||
|
END IF
|
||
|
GOTO nextbul
|
||
|
END IF
|
||
|
END IF
|
||
|
NEXT ii%
|
||
|
END IF
|
||
|
DrawSpr bullet(i%).x, bullet(i%).y, 3
|
||
|
END IF
|
||
|
|
||
|
'Gluer
|
||
|
'==========
|
||
|
'bullet variables:
|
||
|
'xi = initial x xoordinate
|
||
|
'yi = initial y xoordinate
|
||
|
'x = current x xoordinate
|
||
|
'y = current y xoordinate
|
||
|
'a = launch angle
|
||
|
'dir = launch direction
|
||
|
'p = launch power
|
||
|
'set = multiple bullets
|
||
|
'tim = fly timer (set to TIMER at initialization)
|
||
|
IF bullet(i%).class = 4 THEN
|
||
|
level.nofly = 0
|
||
|
x% = bullet(i%).x
|
||
|
y% = bullet(i%).y
|
||
|
a# = bullet(i%).a
|
||
|
p% = bullet(i%).p
|
||
|
d% = bullet(i%).dir
|
||
|
t# = (level.tim - bullet(i%).tim) * bulletspd%
|
||
|
EraseSpr x%, y%, 4
|
||
|
x% = bullet(i%).xi + t# * COS(a#) * p% * d% + level.wind * t#
|
||
|
y% = bullet(i%).yi + t# * SIN(a#) * p% + 16 * t# ^ 2 * level.grav
|
||
|
IF x% < -7 OR x% > 326 OR y% > 206 THEN
|
||
|
bullet(i%).class = 0
|
||
|
GOTO nextbul
|
||
|
END IF
|
||
|
bullet(i%).x = x%
|
||
|
bullet(i%).y = y%
|
||
|
IF TurfHit%(1, x%, y%) THEN
|
||
|
bullet(i%).class = -4
|
||
|
bullet(i%).a = 1
|
||
|
bullet(i%).dir = (5 - bullet(i%).set) * 5
|
||
|
bullet(i%).p = 1
|
||
|
bullet(i%).tim = 0
|
||
|
IF config.snd THEN
|
||
|
WAVPlay "glue.wav", 11000
|
||
|
END IF
|
||
|
GOTO nextbul
|
||
|
END IF
|
||
|
DrawSpr x%, y%, 4
|
||
|
END IF
|
||
|
|
||
|
'Gluer Explosion
|
||
|
'==========
|
||
|
'bullet variables:
|
||
|
'x = x xoordinate
|
||
|
'y = y xoordinate
|
||
|
'a = current blob size (set to 1 at initialization)
|
||
|
'dir = size of final blob (set this at initialization)
|
||
|
'p = direction of blob growth (set to 1 at initialization)
|
||
|
'set = null
|
||
|
'tim = blob timer (set to 0 at initialization)
|
||
|
IF bullet(i%).class = -4 THEN
|
||
|
level.nofly = 0
|
||
|
x% = bullet(i%).x
|
||
|
y% = bullet(i%).y
|
||
|
a# = bullet(i%).a
|
||
|
d% = bullet(i%).dir
|
||
|
FOR pn% = 1 TO maxplayers%
|
||
|
IF player(pn%).health > 0 THEN
|
||
|
pd% = SQR((player(pn%).x - x%) ^ 2 + (player(pn%).y - y%) ^ 2)
|
||
|
IF pd% < a# THEN
|
||
|
player(pn%).glued = 4 - bullet(i%).set
|
||
|
END IF
|
||
|
END IF
|
||
|
NEXT pn%
|
||
|
FOR ap# = .05 TO pi# * 2 STEP .05
|
||
|
xp% = x% + 3 + (a# - bullet(i%).p) * COS(ap#)
|
||
|
yp% = y% + 3 + (a# - bullet(i%).p) * SIN(ap#)
|
||
|
PSET (xp%, yp%), BPoint%(xp%, yp%, 0)
|
||
|
xp% = x% + 3 + a# * COS(ap#)
|
||
|
yp% = y% + 3 + a# * SIN(ap#)
|
||
|
c% = 92
|
||
|
PSET (xp%, yp%), c%
|
||
|
NEXT ap#
|
||
|
IF a# = 0 THEN
|
||
|
bullet(i%).p = 1
|
||
|
bullet(i%).tim = bullet(i%).tim + 1
|
||
|
IF bullet(i%).tim = 5 THEN
|
||
|
bullet(i%).class = 0
|
||
|
PSET (x% + 3, y% + 3), BPoint%(x%, y%, 0)
|
||
|
GOTO nextbul
|
||
|
END IF
|
||
|
END IF
|
||
|
IF a# = (5 - bullet(i%).set) * 5 THEN
|
||
|
bullet(i%).p = -1
|
||
|
END IF
|
||
|
bullet(i%).a = bullet(i%).a + bullet(i%).p
|
||
|
END IF
|
||
|
|
||
|
'Cluster bomb
|
||
|
'==========
|
||
|
'bullet variables:
|
||
|
'xi = initial x xoordinate
|
||
|
'yi = initial y xoordinate
|
||
|
'x = current x xoordinate
|
||
|
'y = current y xoordinate
|
||
|
'a = launch angle
|
||
|
'dir = launch direction
|
||
|
'p = launch power
|
||
|
'set = # of bombs
|
||
|
'tim = fly timer (set to TIMER at initialization)
|
||
|
IF bullet(i%).class = 7 THEN
|
||
|
level.nofly = 0
|
||
|
x% = bullet(i%).x
|
||
|
y% = bullet(i%).y
|
||
|
a# = bullet(i%).a
|
||
|
p% = bullet(i%).p
|
||
|
d% = bullet(i%).dir
|
||
|
t# = (level.tim - bullet(i%).tim) * bulletspd%
|
||
|
EraseSpr x%, y%, 7
|
||
|
x% = bullet(i%).xi + t# * COS(a#) * p% * d% + level.wind * t#
|
||
|
y% = bullet(i%).yi + t# * SIN(a#) * p% + 16 * t# ^ 2 * level.grav
|
||
|
IF x% < -7 OR x% > 326 OR y% > 206 THEN
|
||
|
bullet(i%).class = 0
|
||
|
GOTO nextbul
|
||
|
END IF
|
||
|
bullet(i%).x = x%
|
||
|
bullet(i%).y = y%
|
||
|
IF TurfHit%(7, x%, y%) OR t# >= 2 THEN
|
||
|
bullet(i%).class = -1
|
||
|
bullet(i%).a = 0
|
||
|
bullet(i%).dir = (4 - bullet(i%).set) * 10
|
||
|
bullet(i%).p = 1
|
||
|
IF bullet(i%).set = 1 THEN
|
||
|
InitBullet 1, x%, y%, 1.6, -1, 50, bullet(i%).set
|
||
|
ELSEIF bullet(i%).set = 2 THEN
|
||
|
InitBullet 1, x%, y%, .5, -1, 50, bullet(i%).set
|
||
|
InitBullet 1, x%, y%, .5, 1, 50, bullet(i%).set
|
||
|
ELSEIF bullet(i%).set = 3 THEN
|
||
|
InitBullet 1, x%, y%, .5, -1, 50, bullet(i%).set
|
||
|
InitBullet 1, x%, y%, 1.6, -1, 50, bullet(i%).set
|
||
|
InitBullet 1, x%, y%, .5, 1, 50, bullet(i%).set
|
||
|
END IF
|
||
|
bullet(i%).set = 2
|
||
|
bullet(i%).tim = 0
|
||
|
FOR ii% = 1 TO maxsparks%
|
||
|
spark(ii%).r = 0
|
||
|
spark(ii%).a = ((2 * pi#) / maxsparks%) * ii%
|
||
|
NEXT ii%
|
||
|
IF config.snd THEN
|
||
|
WAVPlay "explode.wav", 11000
|
||
|
END IF
|
||
|
GOTO nextbul
|
||
|
END IF
|
||
|
DrawSpr x%, y%, 7
|
||
|
END IF
|
||
|
|
||
|
nextbul:
|
||
|
NEXT i%
|
||
|
END SUB
|
||
|
|
||
|
SUB Configure
|
||
|
'The Configuration SUB.
|
||
|
|
||
|
startcfg:
|
||
|
menuitem(0) = "CONFIGURE"
|
||
|
menuitem(1) = "Players"
|
||
|
menuitem(2) = "Starting Pack"
|
||
|
menuitem(3) = "Keyboard"
|
||
|
menuitem(4) = "Options"
|
||
|
menuitem(5) = "Save"
|
||
|
mnum% = 5
|
||
|
Menu mnum%
|
||
|
SELECT CASE mnum%
|
||
|
CASE -1
|
||
|
EXIT SUB
|
||
|
CASE 1
|
||
|
GOTO players
|
||
|
CASE 2
|
||
|
GOTO startpack
|
||
|
CASE 3
|
||
|
GOTO keyboard
|
||
|
CASE 4
|
||
|
GOTO options
|
||
|
CASE 5
|
||
|
GOTO savecfg
|
||
|
END SELECT
|
||
|
|
||
|
players:
|
||
|
menuitem(0) = "PLAYERS"
|
||
|
menuitem(1) = "Health:" + STR$(player(0).health)
|
||
|
FOR i% = 1 TO maxplayers%
|
||
|
menuitem(i% + 1) = player(i%).nam + ": " + team(player(i%).tnum).nam
|
||
|
NEXT i%
|
||
|
mnum% = maxplayers% + 1
|
||
|
Menu mnum%
|
||
|
SELECT CASE mnum%
|
||
|
CASE -1
|
||
|
GOTO startcfg
|
||
|
CASE 1
|
||
|
LINE (0, 30)-(319, 199), 0, BF
|
||
|
Font menuitem(mnum%), 160 - (LEN(menuitem(mnum%)) / 2) * 8, 50, 1, 1, 2, menuclr% + 5
|
||
|
FOR c% = 0 TO 100
|
||
|
FadePal 0, 0, 0, c%, 0, 31
|
||
|
NEXT c%
|
||
|
LOCATE 10, 20
|
||
|
INPUT "", i%
|
||
|
IF i% < 1 THEN i% = 1
|
||
|
IF i% > 100 THEN i% = 100
|
||
|
player(0).health = i%
|
||
|
FOR c% = 100 TO 0 STEP -1
|
||
|
FadePal 0, 0, 0, c%, 0, 31
|
||
|
NEXT c%
|
||
|
GOTO players
|
||
|
CASE 2 TO maxplayers% + 1
|
||
|
LINE (0, 30)-(319, 199), 0, BF
|
||
|
Font menuitem(mnum%), 160 - (LEN(menuitem(mnum%)) / 2) * 8, 50, 1, 1, 2, menuclr% + 5
|
||
|
Font "New Name", 160 - (LEN("New Name") / 2) * 8, 65, 1, 1, 2, menuclr% + 5
|
||
|
Font "(Enter Makes No Change)", 160 - (LEN("(Enter Makes No Change)") / 2) * 8, 90, 1, 1, 2, menuclr% + 5
|
||
|
FOR c% = 0 TO 100
|
||
|
FadePal 0, 0, 0, c%, 0, 31
|
||
|
NEXT c%
|
||
|
LOCATE 11, 15
|
||
|
INPUT "", l$
|
||
|
i% = mnum% - 1
|
||
|
IF l$ <> "" THEN
|
||
|
player(i%).nam = l$
|
||
|
END IF
|
||
|
FOR c% = 100 TO 0 STEP -1
|
||
|
FadePal 0, 0, 0, c%, 0, 31
|
||
|
NEXT c%
|
||
|
|
||
|
menuitem(0) = "TEAM SELECT"
|
||
|
menuitem(1) = team(0).nam
|
||
|
FOR ii% = 1 TO maxplayers%
|
||
|
menuitem(ii% + 1) = team(ii%).nam
|
||
|
NEXT ii%
|
||
|
mnum% = maxplayers% + 1
|
||
|
Menu mnum%
|
||
|
SELECT CASE mnum%
|
||
|
CASE -1
|
||
|
GOTO startcfg
|
||
|
CASE 1
|
||
|
player(i%).tnum = 0
|
||
|
CASE 2 TO maxplayers% + 1
|
||
|
player(i%).tnum = mnum% - 1
|
||
|
END SELECT
|
||
|
GOTO players
|
||
|
END SELECT
|
||
|
|
||
|
startpack:
|
||
|
menuitem(0) = "STARTING PACK"
|
||
|
menuitem(1) = "Cannons:" + STR$(playpack(0, 1).ammo)
|
||
|
menuitem(2) = "Grenades:" + STR$(playpack(0, 2).ammo)
|
||
|
menuitem(3) = "Mines:" + STR$(playpack(0, 3).ammo)
|
||
|
menuitem(4) = "Gluers:" + STR$(playpack(0, 4).ammo)
|
||
|
menuitem(5) = "Flamers:" + STR$(playpack(0, 5).ammo)
|
||
|
menuitem(6) = "Boosters:" + STR$(playpack(0, 6).ammo)
|
||
|
menuitem(7) = "Clusters:" + STR$(playpack(0, 7).ammo)
|
||
|
mnum% = 7
|
||
|
Menu mnum%
|
||
|
SELECT CASE mnum%
|
||
|
CASE -1
|
||
|
GOTO startcfg
|
||
|
CASE 1, 2, 3, 4, 5, 6, 7
|
||
|
LINE (0, 30)-(319, 199), 0, BF
|
||
|
Font menuitem(mnum%), 160 - (LEN(menuitem(mnum%)) / 2) * 8, 50, 1, 1, 2, menuclr% + 5
|
||
|
FOR c% = 0 TO 100
|
||
|
FadePal 0, 0, 0, c%, 0, 31
|
||
|
NEXT c%
|
||
|
LOCATE 10, 20
|
||
|
INPUT "", i%
|
||
|
IF mnum% = 1 THEN
|
||
|
IF i% < 0 THEN i% = 0
|
||
|
IF i% > 99 THEN i% = 99
|
||
|
playpack(0, 1).ammo = i%
|
||
|
END IF
|
||
|
IF mnum% = 2 THEN
|
||
|
IF i% < 0 THEN i% = 0
|
||
|
IF i% > 99 THEN i% = 99
|
||
|
playpack(0, 2).ammo = i%
|
||
|
END IF
|
||
|
IF mnum% = 3 THEN
|
||
|
IF i% < 0 THEN i% = 0
|
||
|
IF i% > 99 THEN i% = 99
|
||
|
playpack(0, 3).ammo = i%
|
||
|
END IF
|
||
|
IF mnum% = 4 THEN
|
||
|
IF i% < 0 THEN i% = 0
|
||
|
IF i% > 99 THEN i% = 99
|
||
|
playpack(0, 4).ammo = i%
|
||
|
END IF
|
||
|
IF mnum% = 5 THEN
|
||
|
IF i% < 0 THEN i% = 0
|
||
|
IF i% > 99 THEN i% = 99
|
||
|
playpack(0, 5).ammo = i%
|
||
|
END IF
|
||
|
IF mnum% = 6 THEN
|
||
|
IF i% < 0 THEN i% = 0
|
||
|
IF i% > 99 THEN i% = 99
|
||
|
playpack(0, 6).ammo = i%
|
||
|
END IF
|
||
|
IF mnum% = 7 THEN
|
||
|
IF i% < 0 THEN i% = 0
|
||
|
IF i% > 99 THEN i% = 99
|
||
|
playpack(0, 7).ammo = i%
|
||
|
END IF
|
||
|
FOR c% = 100 TO 0 STEP -1
|
||
|
FadePal 0, 0, 0, c%, 0, 31
|
||
|
NEXT c%
|
||
|
GOTO startpack
|
||
|
END SELECT
|
||
|
|
||
|
keyboard:
|
||
|
menuitem(0) = "KEYBOARD"
|
||
|
menuitem(1) = keyact(1) + SPACE$(10 - LEN(keyact(1))) + ": " + KeyName$(keycode(1))
|
||
|
menuitem(2) = keyact(2) + SPACE$(10 - LEN(keyact(2))) + ": " + KeyName$(keycode(2))
|
||
|
menuitem(3) = keyact(3) + SPACE$(10 - LEN(keyact(3))) + ": " + KeyName$(keycode(3))
|
||
|
menuitem(4) = keyact(4) + SPACE$(10 - LEN(keyact(4))) + ": " + KeyName$(keycode(4))
|
||
|
menuitem(5) = keyact(5) + SPACE$(10 - LEN(keyact(5))) + ": " + KeyName$(keycode(5))
|
||
|
menuitem(6) = keyact(6) + SPACE$(10 - LEN(keyact(6))) + ": " + KeyName$(keycode(6))
|
||
|
mnum% = 6
|
||
|
Menu mnum%
|
||
|
SELECT CASE mnum%
|
||
|
CASE -1
|
||
|
GOTO startcfg
|
||
|
CASE 1, 2, 3, 4, 5, 6
|
||
|
LINE (0, 30)-(319, 199), 0, BF
|
||
|
Font menuitem(mnum%), 160 - (LEN(menuitem(mnum%)) / 2) * 8, 50, 1, 1, 2, menuclr% + 5
|
||
|
Font "Press new key", 160 - (LEN("Press new key") / 2) * 8, 70, 1, 1, 2, menuclr% + 5
|
||
|
FOR c% = 0 TO 100
|
||
|
FadePal 0, 0, 0, c%, 0, 31
|
||
|
NEXT c%
|
||
|
DO
|
||
|
key$ = INKEY$
|
||
|
LOOP UNTIL key$ = ""
|
||
|
DO
|
||
|
key$ = INKEY$
|
||
|
LOOP UNTIL key$ <> ""
|
||
|
keycheck% = 1
|
||
|
FOR i% = 1 TO 10 + maxweapons%
|
||
|
IF i% <> mnum% AND key$ = keycode(i%) THEN keycheck% = 0
|
||
|
NEXT i%
|
||
|
IF keycheck% THEN
|
||
|
keycode(mnum%) = key$
|
||
|
ELSE
|
||
|
Font "Key already assigned", 160 - (LEN("Key already assigned") / 2) * 8, 90, 1, 1, 2, menuclr% + 5
|
||
|
IF config.snd THEN
|
||
|
WAVPlay "buzzer.wav", 11000
|
||
|
DO
|
||
|
LOOP UNTIL DMADone%
|
||
|
END IF
|
||
|
END IF
|
||
|
FOR c% = 100 TO 0 STEP -1
|
||
|
FadePal 0, 0, 0, c%, 0, 31
|
||
|
NEXT c%
|
||
|
GOTO keyboard
|
||
|
END SELECT
|
||
|
|
||
|
options:
|
||
|
menuitem(0) = "OPTIONS"
|
||
|
IF config.ammodrop = 0 THEN ad$ = "Never"
|
||
|
IF config.ammodrop = .1 THEN ad$ = "Low"
|
||
|
IF config.ammodrop = .2 THEN ad$ = "Medium"
|
||
|
IF config.ammodrop = .3 THEN ad$ = "High"
|
||
|
menuitem(1) = "Ammo Drops: " + ad$
|
||
|
menuitem(2) = "Sound Volume:" + RTRIM$(STR$(config.snd))
|
||
|
IF config.sndb = 0 THEN ad$ = "Off"
|
||
|
IF config.sndb = 1 THEN ad$ = "On"
|
||
|
menuitem(3) = "Background Sound: " + ad$
|
||
|
mnum% = 3
|
||
|
Menu mnum%
|
||
|
SELECT CASE mnum%
|
||
|
CASE -1
|
||
|
GOTO startcfg
|
||
|
CASE 1
|
||
|
menuitem(0) = "AMMO DROPS"
|
||
|
menuitem(1) = "Never"
|
||
|
menuitem(2) = "Low"
|
||
|
menuitem(3) = "Medium"
|
||
|
menuitem(4) = "High"
|
||
|
mnum% = 4
|
||
|
Menu mnum%
|
||
|
config.ammodrop = (mnum% - 1) * .1
|
||
|
GOTO options
|
||
|
CASE 2
|
||
|
LINE (0, 30)-(319, 199), 0, BF
|
||
|
Font menuitem(1), 160 - (LEN(menuitem(1)) / 2) * 8, 50, 1, 1, 2, menuclr% + 5
|
||
|
FOR c% = 0 TO 100
|
||
|
FadePal 0, 0, 0, c%, 0, 31
|
||
|
NEXT c%
|
||
|
LOCATE 10, 20
|
||
|
INPUT "", i%
|
||
|
IF i% < 0 THEN i% = 0
|
||
|
IF i% > 15 THEN i% = 15
|
||
|
IF config.snd = 0 THEN
|
||
|
GetBlaster channel%, baseport%, irq%
|
||
|
IF DSPReset% THEN
|
||
|
SpeakerState 1
|
||
|
MasterVolume config.snd, config.snd, 0
|
||
|
ELSE
|
||
|
PRINT "DSP failed to reset."
|
||
|
PRINT "Sound disabled."
|
||
|
config.snd = 0
|
||
|
END IF
|
||
|
END IF
|
||
|
config.snd = i%
|
||
|
MasterVolume config.snd, config.snd, 0
|
||
|
FOR c% = 100 TO 0 STEP -1
|
||
|
FadePal 0, 0, 0, c%, 0, 31
|
||
|
NEXT c%
|
||
|
GOTO options
|
||
|
CASE 3
|
||
|
menuitem(0) = "BACKGROUND SOUND"
|
||
|
menuitem(1) = "On"
|
||
|
menuitem(2) = "Off"
|
||
|
mnum% = 2
|
||
|
Menu mnum%
|
||
|
IF mnum% = 1 THEN
|
||
|
config.sndb = 1
|
||
|
ELSE
|
||
|
config.sndb = 0
|
||
|
END IF
|
||
|
GOTO options
|
||
|
END SELECT
|
||
|
|
||
|
savecfg:
|
||
|
KILL game.cfgfile
|
||
|
OPEN game.cfgfile FOR OUTPUT AS #1
|
||
|
l$ = ""
|
||
|
FOR i% = 1 TO maxplayers%
|
||
|
PRINT #1, "player" + STR$(i%) + " " + player(i%).nam
|
||
|
l$ = l$ + " " + LTRIM$(STR$(player(i%).tnum))
|
||
|
NEXT i%
|
||
|
PRINT #1, "teams" + l$
|
||
|
PRINT #1, "health" + STR$(player(0).health)
|
||
|
PRINT #1, "pack.cannon" + STR$(playpack(0, 1).ammo)
|
||
|
PRINT #1, "pack.grenade" + STR$(playpack(0, 2).ammo)
|
||
|
PRINT #1, "pack.mine" + STR$(playpack(0, 3).ammo)
|
||
|
PRINT #1, "pack.gluer" + STR$(playpack(0, 4).ammo)
|
||
|
PRINT #1, "pack.flamer" + STR$(playpack(0, 5).ammo)
|
||
|
PRINT #1, "pack.booster" + STR$(playpack(0, 6).ammo)
|
||
|
PRINT #1, "pack.cluster" + STR$(playpack(0, 7).ammo)
|
||
|
PRINT #1, "ammo.drops" + STR$(config.ammodrop)
|
||
|
PRINT #1, "sound.volume" + STR$(config.snd)
|
||
|
PRINT #1, "sound.back" + STR$(config.sndb)
|
||
|
PRINT #1, "/end"
|
||
|
CLOSE #1
|
||
|
|
||
|
KILL game.keyfile
|
||
|
OPEN game.keyfile FOR RANDOM AS #1
|
||
|
FOR i% = 1 TO 6
|
||
|
PUT #1, i%, keycode(i%)
|
||
|
NEXT i%
|
||
|
CLOSE #1
|
||
|
END SUB
|
||
|
|
||
|
SUB Damage (pn%, dam%)
|
||
|
'Applies damage to players.
|
||
|
'pn% = player number
|
||
|
'dam% = damage amount
|
||
|
|
||
|
ErasePlayer pn%
|
||
|
player(pn%).health = player(pn%).health - dam%
|
||
|
IF player(pn%).health <= 0 THEN player(pn%).health = 0
|
||
|
DrawPlayer pn%
|
||
|
player(pn%).dam = 1
|
||
|
END SUB
|
||
|
|
||
|
SUB DefaultPal
|
||
|
'Sets the default palette.
|
||
|
|
||
|
FOR c% = 0 TO 255
|
||
|
gamepal(c%).r = defpal(c%).r
|
||
|
gamepal(c%).g = defpal(c%).g
|
||
|
gamepal(c%).B = defpal(c%).B
|
||
|
NEXT c%
|
||
|
END SUB
|
||
|
|
||
|
FUNCTION DMADone%
|
||
|
'Checks if the DMA is done with a WAV.
|
||
|
|
||
|
Count% = INP(lenport%)
|
||
|
Count2% = INP(lenport%)
|
||
|
Count& = CLNG(Count% + 1) * CLNG(Count2% + 1)
|
||
|
IF (Count& - 1) >= &HFFFF& THEN
|
||
|
junk% = INP(DSPDataAvail%)
|
||
|
DMADone% = -1
|
||
|
END IF
|
||
|
END FUNCTION
|
||
|
|
||
|
SUB DMAPlay (segment&, offset&, length&, freq&)
|
||
|
'Makes the DMA play sounds.
|
||
|
|
||
|
length& = length& - 1
|
||
|
page% = 0
|
||
|
memloc& = segment& * 16 + offset&
|
||
|
SELECT CASE channel%
|
||
|
CASE 0
|
||
|
pgport% = &H87
|
||
|
addport% = &H0
|
||
|
lenport% = &H1
|
||
|
modereg% = &H48
|
||
|
CASE 1
|
||
|
pgport% = &H83
|
||
|
addport% = &H2
|
||
|
lenport% = &H3
|
||
|
modereg% = &H49
|
||
|
CASE 2
|
||
|
pgport% = &H81
|
||
|
addport% = &H4
|
||
|
lenport% = &H5
|
||
|
modereg% = &H4A
|
||
|
CASE 3
|
||
|
pgport% = &H82
|
||
|
addport% = &H6
|
||
|
lenport% = &H7
|
||
|
modereg% = &H4B
|
||
|
END SELECT
|
||
|
|
||
|
OUT &HA, &H4 + channel%
|
||
|
OUT &HC, &H0
|
||
|
OUT &HB, modereg%
|
||
|
OUT addport%, memloc& AND &HFF
|
||
|
OUT addport%, (memloc& AND &HFFFF&) \ &H100
|
||
|
IF (memloc& AND 65536) THEN page% = page% + 1
|
||
|
IF (memloc& AND 131072) THEN page% = page% + 2
|
||
|
IF (memloc& AND 262144) THEN page% = page% + 4
|
||
|
IF (memloc& AND 524288) THEN page% = page% + 8
|
||
|
OUT pgport%, page%
|
||
|
OUT lenport%, length& AND &HFF
|
||
|
OUT lenport%, (length& AND &HFFFF&) \ &H100
|
||
|
OUT &HA, channel%
|
||
|
|
||
|
TimeConst% = 256 - 1000000 \ freq&
|
||
|
DSPWrite &H40
|
||
|
DSPWrite TimeConst%
|
||
|
DSPWrite &H14
|
||
|
DSPWrite (length& AND &HFF)
|
||
|
DSPWrite ((length& AND &HFFFF&) \ &H100)
|
||
|
END SUB
|
||
|
|
||
|
SUB DMAState (state%)
|
||
|
'Can set the state of the DMA. (1 = on, 0 = off)
|
||
|
|
||
|
IF state% THEN
|
||
|
DSPWrite &HD4
|
||
|
ELSE
|
||
|
DSPWrite &HD0
|
||
|
END IF
|
||
|
END SUB
|
||
|
|
||
|
SUB DoneTurn
|
||
|
'This SUB occurs at the end of every players turn.
|
||
|
'Displays the turns damage and checks if player is dead.
|
||
|
|
||
|
FOR i% = 1 TO maxplayers%
|
||
|
IF level.turn = i% AND player(i%).glued > 0 THEN player(i%).glued = player(i%).glued - 1
|
||
|
IF player(i%).dam THEN
|
||
|
DrawPlayer i%
|
||
|
END IF
|
||
|
NEXT i%
|
||
|
FOR ii% = 1 TO 5
|
||
|
FOR c% = 0 TO 20
|
||
|
FOR i% = 1 TO maxplayers%
|
||
|
IF player(i%).dam = 1 THEN
|
||
|
OUT &H3C8, 220 + i%
|
||
|
OUT &H3C9, c% * 3
|
||
|
OUT &H3C9, c% * 2
|
||
|
OUT &H3C9, 0
|
||
|
FOR z% = -32000 TO 32000
|
||
|
NEXT z%
|
||
|
END IF
|
||
|
NEXT i%
|
||
|
NEXT c%
|
||
|
FOR c% = 20 TO 0 STEP -1
|
||
|
FOR i% = 1 TO maxplayers%
|
||
|
IF player(i%).dam = 1 THEN
|
||
|
OUT &H3C8, 220 + i%
|
||
|
OUT &H3C9, c% * 3
|
||
|
OUT &H3C9, c% * 2
|
||
|
OUT &H3C9, 0
|
||
|
FOR z% = -32000 TO 32000
|
||
|
NEXT z%
|
||
|
END IF
|
||
|
NEXT i%
|
||
|
NEXT c%
|
||
|
NEXT ii%
|
||
|
FadePal 0, 0, 0, 100, 221, 230
|
||
|
FOR i% = 1 TO maxplayers%
|
||
|
IF player(i%).dam THEN
|
||
|
player(i%).dam = 0
|
||
|
IF player(i%).health = 0 THEN
|
||
|
ErasePlayer i%
|
||
|
IF config.snd THEN
|
||
|
WAVPlay "death.wav", 11000
|
||
|
END IF
|
||
|
FOR r! = 0 TO 15 STEP .5
|
||
|
FOR x% = 0 TO 7
|
||
|
FOR y% = 0 TO 7
|
||
|
p% = playerspr(x% + 8 * y%)
|
||
|
IF p% <> 0 THEN
|
||
|
IF x% <= 3 THEN
|
||
|
xc% = x% - 4
|
||
|
ELSE
|
||
|
xc% = x% - 3
|
||
|
END IF
|
||
|
IF y% <= 3 THEN
|
||
|
yc% = y% - 4
|
||
|
ELSE
|
||
|
yc% = y% - 3
|
||
|
END IF
|
||
|
FOR ii% = 0 TO 5
|
||
|
nr! = (r! - ii%)
|
||
|
IF nr! < 0 THEN nr! = 0
|
||
|
IF nr! <= 10 THEN
|
||
|
px% = player(i%).x + x% + xc% * nr!
|
||
|
py% = player(i%).y + y% + (yc% - 3) * nr! + 16 * (nr! / 10) ^ 2
|
||
|
IF p% = -1 THEN
|
||
|
p% = team(player(i%).tnum).clr
|
||
|
ELSEIF p% = -10 THEN
|
||
|
IF player(i%).dir = 1 THEN
|
||
|
p% = 25 - INT(x% / 2)
|
||
|
ELSE
|
||
|
p% = 25 - INT((7 - x%) / 2)
|
||
|
END IF
|
||
|
END IF
|
||
|
IF ii% > 0 THEN p% = 220 - ii% * 3
|
||
|
IF ii% = 5 THEN p% = BPoint%(px%, py%, 0)
|
||
|
PSET (px%, py%), p%
|
||
|
END IF
|
||
|
NEXT ii%
|
||
|
FOR z% = 0 TO 32000
|
||
|
NEXT z%
|
||
|
END IF
|
||
|
NEXT y%
|
||
|
NEXT x%
|
||
|
NEXT r!
|
||
|
END IF
|
||
|
END IF
|
||
|
NEXT i%
|
||
|
END SUB
|
||
|
|
||
|
SUB DrawBar
|
||
|
'Redraws the Infobar for each turn.
|
||
|
|
||
|
FOR y% = 0 TO 15
|
||
|
FOR x% = 0 TO 319
|
||
|
p% = TPoint%(x%, y%, 0)
|
||
|
IF p% = 241 THEN
|
||
|
DEF SEG = VARSEG(backbuf(0))
|
||
|
p% = PEEK(x% + 320 * y%)
|
||
|
DEF SEG
|
||
|
END IF
|
||
|
PSET (x%, y%), p%
|
||
|
NEXT x%
|
||
|
NEXT y%
|
||
|
Font player(level.turn).nam, 8, 4, 1, 1, 3, 24
|
||
|
LINE (109, 3)-(211, 12), team(player(level.turn).tnum).clr, B
|
||
|
FOR i% = 4 TO 11
|
||
|
LINE (110, i%)-(210, i%), i% + 12
|
||
|
NEXT i%
|
||
|
FOR i% = 4 TO 11
|
||
|
LINE (110, i%)-(110 + player(level.turn).health, i%), 28 - i% + 4
|
||
|
NEXT i%
|
||
|
LINE (219, 4)-(281, 7), team(player(level.turn).tnum).clr, B
|
||
|
Font LTRIM$(STR$(playpack(level.turn, player(level.turn).bul).ammo)), 288, 4, 1, 1, 3, 24
|
||
|
DrawSpr 308, 1, player(level.turn).bul
|
||
|
DrawSmallNum 311, 10, playpack(level.turn, player(level.turn).bul).set, 15
|
||
|
IF level.wind = 0 THEN
|
||
|
CIRCLE (250, 11), 2, 78
|
||
|
ELSEIF level.wind > 0 THEN
|
||
|
LINE (250 - level.wind / 2, 11)-(250 + level.wind / 2, 11), 78
|
||
|
LINE (250 + level.wind / 2, 11)-(248 + level.wind / 2, 9), 78
|
||
|
LINE (250 + level.wind / 2, 11)-(248 + level.wind / 2, 13), 78
|
||
|
ELSEIF level.wind < 0 THEN
|
||
|
LINE (250 - level.wind / 2, 11)-(250 + level.wind / 2, 11), 78
|
||
|
LINE (250 + level.wind / 2, 11)-(252 + level.wind / 2, 9), 78
|
||
|
LINE (250 + level.wind / 2, 11)-(252 + level.wind / 2, 13), 78
|
||
|
END IF
|
||
|
LINE (0, 0)-(319, 15), team(player(level.turn).tnum).clr, B
|
||
|
GET (0, 0)-(319, 15), barbuf
|
||
|
END SUB
|
||
|
|
||
|
SUB DrawHealth (pn%, c%)
|
||
|
'Displays a players health.
|
||
|
'pn% = player number
|
||
|
'c% = display color
|
||
|
|
||
|
n% = player(pn%).health
|
||
|
nn$ = LTRIM$(RTRIM$(STR$(n%)))
|
||
|
x% = player(pn%).x + 3 - LEN(LTRIM$(RTRIM$(STR$(player(pn%).health)))) * 2
|
||
|
y% = player(pn%).y - 6
|
||
|
FOR i% = 1 TO LEN(nn$)
|
||
|
d$ = MID$(nn$, i%, 1)
|
||
|
FOR yy% = 0 TO 4
|
||
|
FOR xx% = 0 TO 2
|
||
|
p% = smallnum(VAL(d$), xx% + 3 * yy%)
|
||
|
IF p% = 1 THEN
|
||
|
IF c% = -1 THEN
|
||
|
p% = BPoint%(x% + xx% + (i% - 1) * 4, y% + yy%, pn%)
|
||
|
ELSE
|
||
|
p% = c%
|
||
|
END IF
|
||
|
PSET (x% + xx% + (i% - 1) * 4, y% + yy%), p%
|
||
|
END IF
|
||
|
NEXT xx%
|
||
|
NEXT yy%
|
||
|
NEXT i%
|
||
|
END SUB
|
||
|
|
||
|
SUB DrawPlayer (pn%)
|
||
|
'Draws the player's sprite.
|
||
|
|
||
|
x% = player(pn%).x
|
||
|
y% = player(pn%).y
|
||
|
FOR yy% = 0 TO 7
|
||
|
FOR xx% = 0 TO 7
|
||
|
p% = playerspr(xx% + 8 * yy%)
|
||
|
IF p% = -1 THEN
|
||
|
p% = team(player(pn%).tnum).clr
|
||
|
ELSEIF p% = -10 THEN
|
||
|
IF player(pn%).dir = 1 THEN
|
||
|
p% = 25 - INT(xx% / 2)
|
||
|
ELSE
|
||
|
p% = 25 - INT((7 - xx%) / 2)
|
||
|
END IF
|
||
|
END IF
|
||
|
IF p% > 0 THEN
|
||
|
IF player(pn%).glued > 0 THEN p% = 92
|
||
|
PSET (x% + (player(pn%).dir - 1) * -3.5 + player(pn%).dir * xx%, y% + yy%), p%
|
||
|
END IF
|
||
|
NEXT xx%
|
||
|
NEXT yy%
|
||
|
|
||
|
DrawHealth pn%, pn% + 220
|
||
|
FOR i% = 0 TO gunlen%
|
||
|
x% = player(pn%).x + 3 + (1 - player(pn%).dir) / 2 + COS(player(pn%).a) * i% * player(pn%).dir
|
||
|
y% = player(pn%).y + 4 + SIN(player(pn%).a) * i%
|
||
|
PSET (x%, y%), 25
|
||
|
NEXT i%
|
||
|
IF level.turn = pn% THEN
|
||
|
PSET (player(pn%).x + 3 + COS(player(pn%).a) * playeraimsize% * player(pn%).dir, player(pn%).y + 3 + SIN(player(pn%).a) * playeraimsize%), 8
|
||
|
PSET (player(pn%).x + 1 + COS(player(pn%).a) * playeraimsize% * player(pn%).dir, player(pn%).y + 3 + SIN(player(pn%).a) * playeraimsize%), 7
|
||
|
PSET (player(pn%).x + 5 + COS(player(pn%).a) * playeraimsize% * player(pn%).dir, player(pn%).y + 3 + SIN(player(pn%).a) * playeraimsize%), 7
|
||
|
PSET (player(pn%).x + 3 + COS(player(pn%).a) * playeraimsize% * player(pn%).dir, player(pn%).y + 1 + SIN(player(pn%).a) * playeraimsize%), 7
|
||
|
PSET (player(pn%).x + 3 + COS(player(pn%).a) * playeraimsize% * player(pn%).dir, player(pn%).y + 5 + SIN(player(pn%).a) * playeraimsize%), 7
|
||
|
END IF
|
||
|
END SUB
|
||
|
|
||
|
SUB DrawSmallNum (x%, y%, n%, c%)
|
||
|
'Draws a small number.
|
||
|
|
||
|
nn$ = LTRIM$(RTRIM$(STR$(n%)))
|
||
|
FOR i% = 1 TO LEN(nn$)
|
||
|
d$ = MID$(nn$, i%, 1)
|
||
|
FOR yy% = 0 TO 4
|
||
|
FOR xx% = 0 TO 2
|
||
|
p% = smallnum(VAL(d$), xx% + 3 * yy%)
|
||
|
IF p% = 1 THEN
|
||
|
PSET (x% + xx% + (i% - 1) * 4, y% + yy%), c%
|
||
|
END IF
|
||
|
NEXT xx%
|
||
|
NEXT yy%
|
||
|
NEXT i%
|
||
|
END SUB
|
||
|
|
||
|
SUB DrawSpr (x%, y%, sn%)
|
||
|
'Draws a sprite such as a bullet.
|
||
|
'x% and y% are coordinates.
|
||
|
'sn% is the sprite number to be drawn.
|
||
|
|
||
|
FOR yy% = 0 TO 7
|
||
|
FOR xx% = 0 TO 7
|
||
|
p% = ammospr(sn%, xx% + 8 * yy%)
|
||
|
IF p% > 0 THEN
|
||
|
PSET (x% + xx%, y% + yy%), p%
|
||
|
END IF
|
||
|
NEXT xx%
|
||
|
NEXT yy%
|
||
|
END SUB
|
||
|
|
||
|
FUNCTION DSPRead%
|
||
|
'Reads from the DSP.
|
||
|
|
||
|
DO
|
||
|
LOOP UNTIL INP(baseport% + 14) AND &H80
|
||
|
DSPRead% = INP(baseport% + 10)
|
||
|
END FUNCTION
|
||
|
|
||
|
FUNCTION DSPReset%
|
||
|
'Resets the DSP.
|
||
|
|
||
|
OUT baseport% + 6, 1
|
||
|
FOR Count% = 1 TO 4
|
||
|
junk% = INP(baseport% + 6)
|
||
|
NEXT
|
||
|
OUT baseport% + 6, 0
|
||
|
IF INP(baseport% + 14) AND &H80 = &H80 AND INP(baseport% + 10) = &HAA THEN
|
||
|
DSPReset% = -1
|
||
|
ELSE
|
||
|
DSPReset% = 0
|
||
|
END IF
|
||
|
END FUNCTION
|
||
|
|
||
|
FUNCTION DSPVersion!
|
||
|
'Returns the DSP version.
|
||
|
|
||
|
DSPWrite &HE1
|
||
|
Temp% = DSPRead%
|
||
|
Temp2% = DSPRead%
|
||
|
DSPVersion! = VAL(STR$(Temp%) + "." + STR$(Temp2%))
|
||
|
END FUNCTION
|
||
|
|
||
|
SUB DSPWrite (byte%)
|
||
|
'Writes to the DSP.
|
||
|
|
||
|
DO
|
||
|
LOOP WHILE INP(baseport% + 12) AND &H80
|
||
|
OUT baseport% + 12, byte%
|
||
|
END SUB
|
||
|
|
||
|
SUB EarthQuake (x%)
|
||
|
'Makes the screen shake.
|
||
|
|
||
|
FOR i% = 1 TO x%
|
||
|
OUT &H3D4, 8
|
||
|
OUT &H3D5, i%
|
||
|
NEXT i%
|
||
|
OUT &H3D4, 8
|
||
|
OUT &H3D5, 0
|
||
|
END SUB
|
||
|
|
||
|
SUB ErasePlayer (pn%)
|
||
|
'Erases the player's sprite.
|
||
|
|
||
|
x% = player(pn%).x
|
||
|
y% = player(pn%).y
|
||
|
FOR yy% = 0 TO 7
|
||
|
FOR xx% = 0 TO 7
|
||
|
p% = playerspr(xx% + 8 * yy%)
|
||
|
IF p% <> 0 THEN
|
||
|
p% = BPoint%(x% + (player(pn%).dir - 1) * -3.5 + player(pn%).dir * xx%, y% + yy%, pn%)
|
||
|
PSET (x% + (player(pn%).dir - 1) * -3.5 + player(pn%).dir * xx%, y% + yy%), p%
|
||
|
END IF
|
||
|
NEXT xx%
|
||
|
NEXT yy%
|
||
|
|
||
|
DrawHealth pn%, -1
|
||
|
FOR i% = 0 TO gunlen%
|
||
|
x% = player(pn%).x + 3 + (1 - player(pn%).dir) / 2 + COS(player(pn%).a) * i% * player(pn%).dir
|
||
|
y% = player(pn%).y + 4 + SIN(player(pn%).a) * i%
|
||
|
p% = BPoint%(x%, y%, pn%)
|
||
|
PSET (x%, y%), p%
|
||
|
NEXT i%
|
||
|
PSET (player(pn%).x + 3 + COS(player(pn%).a) * playeraimsize% * player(pn%).dir, player(pn%).y + 3 + SIN(player(pn%).a) * playeraimsize%), BPoint%(player(pn%).x + 3 + COS(player(pn%).a) * playeraimsize% * player(pn%).dir, player(pn%).y + 3 + SIN( _
|
||
|
player(pn%).a) * playeraimsize%, pn%)
|
||
|
PSET (player(pn%).x + 1 + COS(player(pn%).a) * playeraimsize% * player(pn%).dir, player(pn%).y + 3 + SIN(player(pn%).a) * playeraimsize%), BPoint%(player(pn%).x + 1 + COS(player(pn%).a) * playeraimsize% * player(pn%).dir, player(pn%).y + 3 + SIN( _
|
||
|
player(pn%).a) * playeraimsize%, pn%)
|
||
|
PSET (player(pn%).x + 5 + COS(player(pn%).a) * playeraimsize% * player(pn%).dir, player(pn%).y + 3 + SIN(player(pn%).a) * playeraimsize%), BPoint%(player(pn%).x + 5 + COS(player(pn%).a) * playeraimsize% * player(pn%).dir, player(pn%).y + 3 + SIN( _
|
||
|
player(pn%).a) * playeraimsize%, pn%)
|
||
|
PSET (player(pn%).x + 3 + COS(player(pn%).a) * playeraimsize% * player(pn%).dir, player(pn%).y + 1 + SIN(player(pn%).a) * playeraimsize%), BPoint%(player(pn%).x + 3 + COS(player(pn%).a) * playeraimsize% * player(pn%).dir, player(pn%).y + 1 + SIN( _
|
||
|
player(pn%).a) * playeraimsize%, pn%)
|
||
|
PSET (player(pn%).x + 3 + COS(player(pn%).a) * playeraimsize% * player(pn%).dir, player(pn%).y + 5 + SIN(player(pn%).a) * playeraimsize%), BPoint%(player(pn%).x + 3 + COS(player(pn%).a) * playeraimsize% * player(pn%).dir, player(pn%).y + 5 + SIN( _
|
||
|
player(pn%).a) * playeraimsize%, pn%)
|
||
|
END SUB
|
||
|
|
||
|
SUB EraseSpr (x%, y%, sn%)
|
||
|
'Erases a sprite from the screen.
|
||
|
|
||
|
FOR yy% = 0 TO 7
|
||
|
FOR xx% = 0 TO 7
|
||
|
p% = ammospr(sn%, xx% + 8 * yy%)
|
||
|
IF p% > 0 THEN
|
||
|
p% = BPoint%(x% + xx%, y% + yy%, 0)
|
||
|
PSET (x% + xx%, y% + yy%), p%
|
||
|
END IF
|
||
|
NEXT xx%
|
||
|
NEXT yy%
|
||
|
END SUB
|
||
|
|
||
|
SUB FadePal (fr%, fg%, fb%, i%, c1%, c2%)
|
||
|
'Create the screen's palette as a blend between the current Game Palette
|
||
|
'and a given color.
|
||
|
'fr%, fg%, and fb% are the values for the color to blend with.
|
||
|
'i% is a number from 0 to 100 that sets the amount of true
|
||
|
'Game Palette (so 0 would be 100% blend color and 100 would be 100% Game Palette).
|
||
|
'c1% and c2% set the range of colors to be affected by the blend.
|
||
|
|
||
|
FOR c% = c1% TO c2%
|
||
|
r% = (gamepal(c%).r / 100) * i% + (fr% / 100) * (100 - i%)
|
||
|
g% = (gamepal(c%).g / 100) * i% + (fg% / 100) * (100 - i%)
|
||
|
B% = (gamepal(c%).B / 100) * i% + (fb% / 100) * (100 - i%)
|
||
|
OUT &H3C8, c%
|
||
|
OUT &H3C9, r%
|
||
|
OUT &H3C9, g%
|
||
|
OUT &H3C9, B%
|
||
|
NEXT c%
|
||
|
END SUB
|
||
|
|
||
|
SUB Font (text$, xstart%, ystart%, xscale!, yscale!, style%, tclr%)
|
||
|
'Draws font to the screen.
|
||
|
'The styles can be seen below, more can be added easily.
|
||
|
|
||
|
DEF SEG = VARSEG(fontbuf(0))
|
||
|
FOR h% = 1 TO LEN(text$)
|
||
|
fptr% = 81 * (ASC(MID$(text$, h%, 1)) - 1)
|
||
|
FOR y% = 0 TO 8
|
||
|
FOR x% = 0 TO 8
|
||
|
col% = PEEK(VARPTR(fontbuf(0)) + fptr% + x% + 9 * y%)
|
||
|
IF col% THEN
|
||
|
px% = xstart% + x% * xscale! + (h% - 1) * 8 * xscale!
|
||
|
py% = ystart% + y% * yscale!
|
||
|
SELECT CASE style%
|
||
|
|
||
|
CASE 1
|
||
|
LINE (px%, py%)-(px% + xscale! - 1, py% + yscale! - 1), (py% - ystart%) / yscale! + tclr%, BF
|
||
|
|
||
|
CASE 2
|
||
|
LINE (px%, py%)-(px% + xscale! - 1, py% + yscale! - 1), (py% - ystart%) / yscale! + tclr%, BF
|
||
|
x2% = x% + 1
|
||
|
y2% = y% + 1
|
||
|
col2% = PEEK(VARPTR(fontbuf(0)) + fptr% + x2% + 9 * y2%)
|
||
|
IF x2% < 0 OR x2% > 8 OR y2% < 0 OR y2% > 8 THEN col2% = 0
|
||
|
IF col2% = 0 THEN
|
||
|
px% = xstart% + x2% * xscale! + (h% - 1) * 8 * xscale!
|
||
|
py% = ystart% + y2% * yscale!
|
||
|
LINE (px%, py%)-(px% + xscale! - 1, py% + yscale! - 1), (py% - ystart%) / yscale! + tclr% - 4, BF
|
||
|
END IF
|
||
|
x2% = x% + 2
|
||
|
y2% = y% + 2
|
||
|
col2% = PEEK(VARPTR(fontbuf(0)) + fptr% + x2% + 9 * y2%)
|
||
|
IF x2% < 0 OR x2% > 8 OR y2% < 0 OR y2% > 8 THEN col2% = 0
|
||
|
IF col2% = 0 THEN
|
||
|
px% = xstart% + x2% * xscale! + (h% - 1) * 8 * xscale!
|
||
|
py% = ystart% + y2% * yscale!
|
||
|
LINE (px%, py%)-(px% + xscale! - 1, py% + yscale! - 1), (py% - ystart%) / yscale! + tclr% - 8, BF
|
||
|
END IF
|
||
|
|
||
|
CASE 3
|
||
|
LINE (px%, py%)-(px% + xscale! - 1, py% + yscale! - 1), (py% - ystart%) / yscale! + tclr%, BF
|
||
|
FOR yc% = -1 TO 1
|
||
|
FOR xc% = -1 TO 1
|
||
|
x2% = x% + xc%
|
||
|
y2% = y% + yc%
|
||
|
col2% = PEEK(VARPTR(fontbuf(0)) + fptr% + x2% + 9 * y2%)
|
||
|
IF x2% < 0 OR x2% > 8 OR y2% < 0 OR y2% > 8 THEN col2% = 0
|
||
|
IF col2% = 0 THEN
|
||
|
px% = xstart% + x2% * xscale! + (h% - 1) * 8 * xscale!
|
||
|
py% = ystart% + y2% * yscale!
|
||
|
LINE (px%, py%)-(px% + xscale! - 1, py% + yscale! - 1), (py% - ystart%) / yscale! + tclr% - 6, BF
|
||
|
END IF
|
||
|
NEXT xc%
|
||
|
NEXT yc%
|
||
|
|
||
|
CASE 4
|
||
|
LINE (px%, py%)-(px% + xscale! - 1, py% + yscale! - 1), (py% - ystart%) / yscale! + tclr% - 6, BF
|
||
|
FOR yc% = -1 TO 1
|
||
|
FOR xc% = -1 TO 1
|
||
|
x2% = x% + xc%
|
||
|
y2% = y% + yc%
|
||
|
col2% = PEEK(VARPTR(fontbuf(0)) + fptr% + x2% + 9 * y2%)
|
||
|
IF x2% < 0 OR x2% > 8 OR y2% < 0 OR y2% > 8 THEN col2% = 0
|
||
|
IF col2% = 0 THEN
|
||
|
px% = xstart% + x2% * xscale! + (h% - 1) * 8 * xscale!
|
||
|
py% = ystart% + y2% * yscale!
|
||
|
LINE (px%, py%)-(px% + xscale! - 1, py% + yscale! - 1), 7 - 2 * yscale! - (py% - ystart%) / yscale! + tclr%, BF
|
||
|
END IF
|
||
|
NEXT xc%
|
||
|
NEXT yc%
|
||
|
|
||
|
END SELECT
|
||
|
END IF
|
||
|
py! = py! + yscale!
|
||
|
NEXT
|
||
|
px! = px! + xscale!
|
||
|
py! = ystart%
|
||
|
NEXT
|
||
|
NEXT h%
|
||
|
DEF SEG
|
||
|
END SUB
|
||
|
|
||
|
SUB GetBlaster (dma%, baseport%, irq%)
|
||
|
'Gets the Sound Blaster information.
|
||
|
|
||
|
IF LEN(ENVIRON$("BLASTER")) = 0 THEN
|
||
|
PRINT "BLASTER environment variable not set."
|
||
|
EXIT SUB
|
||
|
END IF
|
||
|
FOR length% = 1 TO LEN(ENVIRON$("BLASTER"))
|
||
|
SELECT CASE MID$(ENVIRON$("BLASTER"), length%, 1)
|
||
|
CASE "A"
|
||
|
baseport% = VAL("&H" + MID$(ENVIRON$("BLASTER"), length% + 1, 3))
|
||
|
CASE "I"
|
||
|
irq% = VAL(MID$(ENVIRON$("BLASTER"), length% + 1, 1))
|
||
|
CASE "D"
|
||
|
dma% = VAL(MID$(ENVIRON$("BLASTER"), length% + 1, 1))
|
||
|
END SELECT
|
||
|
NEXT
|
||
|
END SUB
|
||
|
|
||
|
SUB InitBullet (c%, x%, y%, a#, d%, p%, s%)
|
||
|
'Inititializes a bullet object.
|
||
|
'c% = bullet class
|
||
|
'x% and y% are coordinates
|
||
|
'a# = angle
|
||
|
'd% = direction
|
||
|
'p% = power
|
||
|
's% = setting
|
||
|
|
||
|
FOR i% = 1 TO maxbullets%
|
||
|
IF bullet(i%).class = 0 THEN
|
||
|
bullet(i%).class = c%
|
||
|
bullet(i%).xi = x%
|
||
|
bullet(i%).yi = y%
|
||
|
bullet(i%).x = x%
|
||
|
bullet(i%).y = y%
|
||
|
bullet(i%).a = a#
|
||
|
bullet(i%).dir = d%
|
||
|
bullet(i%).p = p%
|
||
|
bullet(i%).tim = TIMER - .1
|
||
|
bullet(i%).set = s%
|
||
|
EXIT FOR
|
||
|
END IF
|
||
|
NEXT i%
|
||
|
END SUB
|
||
|
|
||
|
SUB InitGame
|
||
|
'Initializes the game.
|
||
|
|
||
|
RANDOMIZE TIMER
|
||
|
LoadCfg game.cfgfile
|
||
|
LoadKey game.keyfile
|
||
|
RESTORE teaminfo
|
||
|
FOR i% = 0 TO maxplayers%
|
||
|
READ l$
|
||
|
team(i%).nam = l$
|
||
|
READ x%
|
||
|
team(i%).clr = x%
|
||
|
NEXT i%
|
||
|
END SUB
|
||
|
|
||
|
SUB InitGamePal
|
||
|
'Initializes the Game Palette.
|
||
|
|
||
|
FOR c% = 221 TO 230
|
||
|
gamepal(c%).r = 62
|
||
|
gamepal(c%).g = 62
|
||
|
gamepal(c%).B = 62
|
||
|
NEXT c%
|
||
|
FOR c% = 231 TO 240
|
||
|
gamepal(c%).r = pal(2).r + (c% - 231) * (pal(3).r - pal(2).r) / 10
|
||
|
gamepal(c%).g = pal(2).g + (c% - 231) * (pal(3).g - pal(2).g) / 10
|
||
|
gamepal(c%).B = pal(2).B + (c% - 231) * (pal(3).B - pal(2).B) / 10
|
||
|
NEXT c%
|
||
|
gamepal(241).B = pal(1).r
|
||
|
gamepal(241).B = pal(1).g
|
||
|
gamepal(241).B = pal(1).B
|
||
|
SetBlastPal
|
||
|
END SUB
|
||
|
|
||
|
SUB InitPlayers
|
||
|
'Initializes the players.
|
||
|
|
||
|
DIM playeract(1 TO maxplayers%) AS INTEGER
|
||
|
|
||
|
player(0).aj = -1.2
|
||
|
player(0).pj = 30
|
||
|
mnum% = 0
|
||
|
FOR i% = 1 TO maxplayers%
|
||
|
playeract(i%) = 0
|
||
|
player(i%).health = 0
|
||
|
IF player(i%).tnum > 0 THEN
|
||
|
mnum% = mnum% + 1
|
||
|
playeract(mnum%) = i%
|
||
|
END IF
|
||
|
NEXT i%
|
||
|
FOR i% = 1 TO mnum%
|
||
|
IF player(playeract(i%)).tnum > 0 THEN
|
||
|
x% = 320 / (mnum% + 1) * i%
|
||
|
player(playeract(i%)).x = x%
|
||
|
FOR y% = 0 TO 200
|
||
|
FOR xx% = x% TO x% + 7
|
||
|
IF TPoint%(xx%, y% + 7, i%) <> 241 THEN
|
||
|
GOTO playerland
|
||
|
END IF
|
||
|
NEXT xx%
|
||
|
NEXT y%
|
||
|
playerland:
|
||
|
player(playeract(i%)).y = y%
|
||
|
player(playeract(i%)).a = 0
|
||
|
player(playeract(i%)).bul = 1
|
||
|
player(playeract(i%)).dir = 1
|
||
|
player(playeract(i%)).health = player(0).health
|
||
|
player(playeract(i%)).dam = 0
|
||
|
player(playeract(i%)).jump = 0
|
||
|
FOR ii% = 1 TO maxweapons%
|
||
|
playpack(playeract(i%), ii%).ammo = playpack(0, ii%).ammo
|
||
|
playpack(playeract(i%), ii%).set = playpack(0, ii%).set
|
||
|
NEXT ii%
|
||
|
END IF
|
||
|
NEXT i%
|
||
|
END SUB
|
||
|
|
||
|
SUB InitScr
|
||
|
'Initializes the screen.
|
||
|
|
||
|
SCREEN 13
|
||
|
COLOR 28
|
||
|
FOR c% = 0 TO 255
|
||
|
OUT &H3C7, c%
|
||
|
defpal(c%).r = INP(&H3C9)
|
||
|
defpal(c%).g = INP(&H3C9)
|
||
|
defpal(c%).B = INP(&H3C9)
|
||
|
NEXT c%
|
||
|
FadePal 0, 0, 0, 0, 0, 255
|
||
|
LoadSprites game.sprfile
|
||
|
LoadFont game.fntfile
|
||
|
END SUB
|
||
|
|
||
|
FUNCTION KeyMark% (k$)
|
||
|
'Returns the code for the key pressed.
|
||
|
|
||
|
ii% = 0
|
||
|
FOR i% = 1 TO 11 + maxweapons%
|
||
|
IF k$ = keycode(i%) THEN
|
||
|
ii% = i%
|
||
|
EXIT FOR
|
||
|
END IF
|
||
|
NEXT i%
|
||
|
KeyMark% = ii%
|
||
|
END FUNCTION
|
||
|
|
||
|
FUNCTION KeyName$ (k$)
|
||
|
'Returns the common name for the keycode.
|
||
|
|
||
|
DIM kn AS STRING * 10
|
||
|
|
||
|
SELECT CASE UCASE$(k$)
|
||
|
CASE CHR$(0) + "H"
|
||
|
kn = "Up"
|
||
|
CASE CHR$(0) + "P"
|
||
|
kn = "Down"
|
||
|
CASE CHR$(0) + "K"
|
||
|
kn = "Left"
|
||
|
CASE CHR$(0) + "M"
|
||
|
kn = "Right"
|
||
|
CASE CHR$(13)
|
||
|
kn = "Enter"
|
||
|
CASE CHR$(27)
|
||
|
kn = "Esc"
|
||
|
CASE CHR$(32)
|
||
|
kn = "Space"
|
||
|
CASE CHR$(0) + CHR$(59)
|
||
|
kn = "F1"
|
||
|
CASE CHR$(0) + CHR$(60)
|
||
|
kn = "F2"
|
||
|
CASE CHR$(0) + CHR$(61)
|
||
|
kn = "F3"
|
||
|
CASE CHR$(0) + CHR$(62)
|
||
|
kn = "F4"
|
||
|
CASE CHR$(0) + CHR$(63)
|
||
|
kn = "F5"
|
||
|
CASE CHR$(0) + CHR$(64)
|
||
|
kn = "F6"
|
||
|
CASE CHR$(0) + CHR$(65)
|
||
|
kn = "F7"
|
||
|
CASE CHR$(0) + CHR$(66)
|
||
|
kn = "F8"
|
||
|
CASE ELSE
|
||
|
kn = UCASE$(k$)
|
||
|
|
||
|
END SELECT
|
||
|
KeyName$ = kn
|
||
|
END FUNCTION
|
||
|
|
||
|
SUB LoadCfg (file$)
|
||
|
'Loads the Configuration file.
|
||
|
|
||
|
OPEN file$ FOR INPUT AS #1
|
||
|
CLS
|
||
|
nextline:
|
||
|
LINE INPUT #1, l$
|
||
|
IF LCASE$(l$) = "/end" THEN GOTO lastline
|
||
|
s1% = INSTR(l$, " ")
|
||
|
c1$ = LEFT$(l$, s1% - 1)
|
||
|
SELECT CASE LCASE$(c1$)
|
||
|
|
||
|
CASE "player"
|
||
|
c2$ = MID$(l$, s1% + 1, 1)
|
||
|
c3$ = RIGHT$(l$, LEN(l$) - s1% - 2)
|
||
|
player(VAL(c2$)).nam = c3$
|
||
|
|
||
|
CASE "teams"
|
||
|
c2$ = RIGHT$(l$, LEN(l$) - s1%)
|
||
|
player(1).tnum = VAL(MID$(c2$, 1, 1))
|
||
|
player(2).tnum = VAL(MID$(c2$, 3, 1))
|
||
|
player(3).tnum = VAL(MID$(c2$, 5, 1))
|
||
|
player(4).tnum = VAL(MID$(c2$, 7, 1))
|
||
|
player(5).tnum = VAL(MID$(c2$, 9, 1))
|
||
|
player(6).tnum = VAL(MID$(c2$, 11, 1))
|
||
|
player(7).tnum = VAL(MID$(c2$, 13, 1))
|
||
|
player(8).tnum = VAL(MID$(c2$, 15, 1))
|
||
|
|
||
|
CASE "health"
|
||
|
c2$ = RIGHT$(l$, LEN(l$) - s1%)
|
||
|
player(0).health = VAL(c2$)
|
||
|
|
||
|
CASE "pack.cannon"
|
||
|
c2$ = RIGHT$(l$, LEN(l$) - s1%)
|
||
|
playpack(0, 1).ammo = VAL(c2$)
|
||
|
playpack(0, 1).set = 1
|
||
|
|
||
|
CASE "pack.grenade"
|
||
|
c2$ = RIGHT$(l$, LEN(l$) - s1%)
|
||
|
playpack(0, 2).ammo = VAL(c2$)
|
||
|
playpack(0, 2).set = 2
|
||
|
|
||
|
CASE "pack.mine"
|
||
|
c2$ = RIGHT$(l$, LEN(l$) - s1%)
|
||
|
playpack(0, 3).ammo = VAL(c2$)
|
||
|
playpack(0, 3).set = 1
|
||
|
|
||
|
CASE "pack.gluer"
|
||
|
c2$ = RIGHT$(l$, LEN(l$) - s1%)
|
||
|
playpack(0, 4).ammo = VAL(c2$)
|
||
|
playpack(0, 4).set = 1
|
||
|
|
||
|
CASE "pack.flamer"
|
||
|
c2$ = RIGHT$(l$, LEN(l$) - s1%)
|
||
|
playpack(0, 5).ammo = VAL(c2$)
|
||
|
playpack(0, 5).set = 1
|
||
|
|
||
|
CASE "pack.booster"
|
||
|
c2$ = RIGHT$(l$, LEN(l$) - s1%)
|
||
|
playpack(0, 6).ammo = VAL(c2$)
|
||
|
playpack(0, 6).set = 1
|
||
|
|
||
|
CASE "pack.cluster"
|
||
|
c2$ = RIGHT$(l$, LEN(l$) - s1%)
|
||
|
playpack(0, 7).ammo = VAL(c2$)
|
||
|
playpack(0, 7).set = 3
|
||
|
|
||
|
CASE "ammo.drops"
|
||
|
c2$ = RIGHT$(l$, LEN(l$) - s1%)
|
||
|
config.ammodrop = VAL(c2$)
|
||
|
|
||
|
CASE "sound.volume"
|
||
|
c2$ = RIGHT$(l$, LEN(l$) - s1%)
|
||
|
config.snd = VAL(c2$)
|
||
|
|
||
|
CASE "sound.back"
|
||
|
c2$ = RIGHT$(l$, 1)
|
||
|
config.sndb = VAL(c2$)
|
||
|
|
||
|
END SELECT
|
||
|
GOTO nextline:
|
||
|
lastline:
|
||
|
CLOSE #1
|
||
|
END SUB
|
||
|
|
||
|
SUB LoadFont (file$)
|
||
|
'Loads the Font file.
|
||
|
|
||
|
OPEN file$ FOR BINARY AS #1
|
||
|
IF LOF(1) < 2 THEN
|
||
|
NoFile% = 1
|
||
|
END IF
|
||
|
IF NoFile% <> 1 THEN GET #1, , fontbuf(0)
|
||
|
CLOSE #1
|
||
|
IF NoFile% THEN
|
||
|
KILL file$
|
||
|
CLS
|
||
|
PRINT "The font data file couldn't be found!"
|
||
|
PRINT
|
||
|
PRINT "Would you like to create one? (Y/N)"
|
||
|
INPUT "> ", Choice$
|
||
|
IF UCASE$(Choice$) = "N" THEN
|
||
|
PRINT "The program cannot run without this file!"
|
||
|
SYSTEM
|
||
|
ELSE
|
||
|
PRINT "Hit a key to make the file."
|
||
|
PRINT "You will hear a beep if it is working."
|
||
|
Pause
|
||
|
|
||
|
OPEN file$ FOR BINARY AS #1
|
||
|
COLOR 16
|
||
|
FOR ascii% = 1 TO 128
|
||
|
CLS
|
||
|
PRINT CHR$(ascii%)
|
||
|
FOR x = 0 TO 8
|
||
|
FOR y = 0 TO 8
|
||
|
pnt$ = CHR$(POINT(x, y))
|
||
|
PUT #1, , pnt$
|
||
|
pnt$ = ""
|
||
|
NEXT
|
||
|
NEXT
|
||
|
NEXT
|
||
|
CLOSE #1
|
||
|
OPEN file$ FOR BINARY AS #1
|
||
|
GET #1, , fontbuf(0)
|
||
|
CLOSE #1
|
||
|
END IF
|
||
|
END IF
|
||
|
END SUB
|
||
|
|
||
|
SUB LoadKey (file$)
|
||
|
'Loads the Key file.
|
||
|
|
||
|
OPEN file$ FOR RANDOM AS #1
|
||
|
FOR i% = 1 TO 6
|
||
|
GET #1, i%, k$
|
||
|
keycode(i%) = k$
|
||
|
NEXT i%
|
||
|
keyact(1) = "Walk Left"
|
||
|
keyact(2) = "Walk Right"
|
||
|
keyact(3) = "Aim Up"
|
||
|
keyact(4) = "Aim Down"
|
||
|
keyact(5) = "Fire"
|
||
|
keyact(6) = "Jump"
|
||
|
|
||
|
keyact(7) = "Set 1"
|
||
|
keycode(7) = "1"
|
||
|
keyact(8) = "Set 2"
|
||
|
keycode(8) = "2"
|
||
|
keyact(9) = "Set 3"
|
||
|
keycode(9) = "3"
|
||
|
keyact(10) = "Quit"
|
||
|
keycode(10) = CHR$(27)
|
||
|
keyact(11) = "Skip Turn"
|
||
|
keycode(11) = CHR$(8)
|
||
|
|
||
|
keyact(12) = "Cannon"
|
||
|
keycode(12) = CHR$(0) + CHR$(&H3B)
|
||
|
keyact(13) = "Grenade"
|
||
|
keycode(13) = CHR$(0) + CHR$(&H3C)
|
||
|
keyact(14) = "Mine"
|
||
|
keycode(14) = CHR$(0) + CHR$(&H3D)
|
||
|
keyact(15) = "Gluer"
|
||
|
keycode(15) = CHR$(0) + CHR$(&H3E)
|
||
|
keyact(16) = "Flamer"
|
||
|
keycode(16) = CHR$(0) + CHR$(&H3F)
|
||
|
keyact(17) = "Booster"
|
||
|
keycode(17) = CHR$(0) + CHR$(&H40)
|
||
|
keyact(18) = "Cluster"
|
||
|
keycode(18) = CHR$(0) + CHR$(&H41)
|
||
|
CLOSE #1
|
||
|
END SUB
|
||
|
|
||
|
SUB LoadLevel (file$)
|
||
|
'Loads a Level file.
|
||
|
|
||
|
OPEN file$ FOR INPUT AS #1
|
||
|
LINE INPUT #1, l$
|
||
|
level.nam = l$
|
||
|
LINE INPUT #1, l$
|
||
|
turffile$ = l$
|
||
|
LINE INPUT #1, l$
|
||
|
backfile$ = l$
|
||
|
LINE INPUT #1, l$
|
||
|
level.grav = VAL(l$)
|
||
|
LINE INPUT #1, l$
|
||
|
level.sndb = l$
|
||
|
CLOSE #1
|
||
|
DEF SEG = &HA000
|
||
|
BLOAD turffile$, 0
|
||
|
DEF SEG
|
||
|
GET (0, 0)-(319, 199), turfbuf
|
||
|
DEF SEG = VARSEG(backbuf(0))
|
||
|
BLOAD "backgrnd\" + backfile$, 0
|
||
|
DEF SEG
|
||
|
END SUB
|
||
|
|
||
|
SUB LoadSprites (file$)
|
||
|
'Loads the Sprite file.
|
||
|
|
||
|
OPEN file$ FOR INPUT AS #1
|
||
|
nextsprite:
|
||
|
INPUT #1, n%
|
||
|
IF n% = -1 THEN GOTO endsprite
|
||
|
FOR y% = 0 TO 7
|
||
|
FOR x% = 0 TO 7
|
||
|
INPUT #1, p%
|
||
|
IF n% = 0 THEN
|
||
|
playerspr(x% + 8 * y%) = p%
|
||
|
ELSEIF n% = 100 THEN
|
||
|
ammospr(0, x% + 8 * y%) = p%
|
||
|
ELSE
|
||
|
ammospr(n%, x% + 8 * y%) = p%
|
||
|
END IF
|
||
|
NEXT x%
|
||
|
NEXT y%
|
||
|
GOTO nextsprite
|
||
|
endsprite:
|
||
|
CLOSE #1
|
||
|
|
||
|
RESTORE smallnums
|
||
|
FOR i% = 0 TO 9
|
||
|
FOR y% = 0 TO 4
|
||
|
FOR x% = 0 TO 2
|
||
|
READ p%
|
||
|
smallnum(i%, x% + 3 * y%) = p%
|
||
|
NEXT x%
|
||
|
NEXT y%
|
||
|
NEXT i%
|
||
|
END SUB
|
||
|
|
||
|
SUB Main
|
||
|
'Main game procedure.
|
||
|
|
||
|
FOR y% = 0 TO 199
|
||
|
FOR x% = 0 TO 319
|
||
|
DEF SEG = VARSEG(turfbuf(0))
|
||
|
p% = PEEK(x% + 320& * y% + 4)
|
||
|
DEF SEG
|
||
|
IF p% = 241 THEN
|
||
|
DEF SEG = VARSEG(backbuf(0))
|
||
|
p% = PEEK(x% + 320& * y%)
|
||
|
DEF SEG
|
||
|
END IF
|
||
|
PSET (x%, y%), p%
|
||
|
NEXT x%
|
||
|
NEXT y%
|
||
|
|
||
|
InitPlayers
|
||
|
FOR i% = 1 TO maxbullets%
|
||
|
bullet(i%).class = 0
|
||
|
NEXT i%
|
||
|
FOR c% = 0 TO 100
|
||
|
FadePal 0, 0, 0, c%, 0, 255
|
||
|
NEXT c%
|
||
|
|
||
|
level.turn = 0
|
||
|
level.wind = RND * 40 - 20
|
||
|
level.quit = 0
|
||
|
|
||
|
newloop:
|
||
|
nextcheck:
|
||
|
level.turn = level.turn + 1
|
||
|
IF level.turn > maxplayers% THEN
|
||
|
level.turn = 1
|
||
|
level.wind = RND * 40 - 20
|
||
|
END IF
|
||
|
IF player(level.turn).health = 0 THEN GOTO nextcheck
|
||
|
|
||
|
level.fire = 0
|
||
|
FOR i% = 1 TO maxplayers%
|
||
|
IF player(i%).health > 0 THEN
|
||
|
DrawPlayer i%
|
||
|
END IF
|
||
|
NEXT i%
|
||
|
DrawBar
|
||
|
IF RND < config.ammodrop THEN
|
||
|
x% = RND * 300 + 10
|
||
|
i% = CINT(RND * (maxweapons% - 1)) + 1
|
||
|
ii% = RND * 2 + 1
|
||
|
IF config.snd THEN
|
||
|
WAVPlay "jet.wav", 11000
|
||
|
DO
|
||
|
LOOP UNTIL DMADone%
|
||
|
END IF
|
||
|
InitBullet -100, x%, 0, 0, ii%, 0, i%
|
||
|
END IF
|
||
|
FOR i% = 1 TO 4
|
||
|
key$ = INKEY$
|
||
|
NEXT i%
|
||
|
|
||
|
startloop:
|
||
|
IF config.snd AND config.sndb THEN
|
||
|
IF DMADone% THEN
|
||
|
WAVPlay level.sndb, 11000
|
||
|
END IF
|
||
|
END IF
|
||
|
|
||
|
level.nofly = 1
|
||
|
PlayerKey
|
||
|
level.tim = TIMER
|
||
|
PlayerFall
|
||
|
BulletMove
|
||
|
|
||
|
IF level.quit = 1 THEN
|
||
|
EXIT SUB
|
||
|
END IF
|
||
|
IF level.nofly AND (level.fire OR player(level.turn).health = 0) THEN GOTO nextplayer
|
||
|
|
||
|
GOTO startloop
|
||
|
|
||
|
nextplayer:
|
||
|
DoneTurn
|
||
|
y% = 0
|
||
|
FOR i% = 1 TO maxplayers%
|
||
|
team(i%).act = 0
|
||
|
FOR ii% = 1 TO maxplayers%
|
||
|
IF player(ii%).tnum = i% AND player(ii%).health > 0 THEN
|
||
|
team(i%).act = 1
|
||
|
y% = i%
|
||
|
END IF
|
||
|
NEXT ii%
|
||
|
NEXT i%
|
||
|
x% = 0
|
||
|
FOR i% = 1 TO maxplayers%
|
||
|
x% = x% + team(i%).act
|
||
|
NEXT i%
|
||
|
IF x% = 1 THEN
|
||
|
Win y%
|
||
|
EXIT SUB
|
||
|
ELSEIF x% = 0 THEN
|
||
|
Win 0
|
||
|
EXIT SUB
|
||
|
END IF
|
||
|
|
||
|
ErasePlayer level.turn
|
||
|
GOTO newloop
|
||
|
END SUB
|
||
|
|
||
|
SUB MasterVolume (Right%, Left%, GetVol%)
|
||
|
'Sets the volume for the Sound Blaster.
|
||
|
|
||
|
OUT baseport% + 4, &H22
|
||
|
IF GetVol% THEN
|
||
|
Left% = INP(baseport% + 5) \ 16
|
||
|
Right% = INP(baseport% + 5) AND &HF
|
||
|
EXIT SUB
|
||
|
ELSE
|
||
|
OUT baseport% + 5, (Right% + Left% * 16) AND &HFF
|
||
|
END IF
|
||
|
END SUB
|
||
|
|
||
|
SUB Menu (mnum%)
|
||
|
'Creates a menu.
|
||
|
'The menuitem variables (1 up to 10) are strings which are the menu items.
|
||
|
'menuitem(0) is the menu title.
|
||
|
'When Menu is called, mnum% should be the largest number of menuitem that
|
||
|
'is used for that menu. It will return mnum% as the menu item chosen.
|
||
|
|
||
|
moff% = 0
|
||
|
CLS
|
||
|
Font menuitem(0), 160 - (LEN(menuitem(0)) / 2) * 16, 10, 2, 2, 3, menuclr% + 8
|
||
|
mmax% = mnum%
|
||
|
IF mmax% > 7 THEN mmax% = 7
|
||
|
FOR i% = 0 TO 5
|
||
|
LINE (i%, 45 + i%)-(319 - i%, mmax% * 20 + 63 - i%), menuclr% + i%, B
|
||
|
NEXT i%
|
||
|
|
||
|
i% = 1
|
||
|
FOR c% = 0 TO 100
|
||
|
FadePal 0, 0, 0, c%, 0, 31
|
||
|
NEXT c%
|
||
|
drawmenu:
|
||
|
LINE (6, 51)-(313, mmax% * 20 + 57), 0, BF
|
||
|
FOR ii% = moff% + 1 TO moff% + mmax%
|
||
|
c% = menuclr%
|
||
|
IF ii% = i% THEN c% = menuclr% + 5
|
||
|
Font menuitem(ii%), 160 - (LEN(menuitem(ii%)) / 2) * 8, (ii% - moff%) * 20 + 40, 1, 1, 1, c%
|
||
|
NEXT ii%
|
||
|
IF moff% > 0 THEN
|
||
|
FOR ii% = 0 TO 5
|
||
|
LINE (300 - (5 - ii%), 60 - ii%)-(300 + (5 - ii%), 60 - ii%), 18 + ii% * 2
|
||
|
NEXT ii%
|
||
|
END IF
|
||
|
IF moff% + mmax% < mnum% THEN
|
||
|
FOR ii% = 0 TO 5
|
||
|
LINE (300 - (5 - ii%), ii% + 190)-(300 + (5 - ii%), ii% + 190), 18 + ii% * 2
|
||
|
NEXT ii%
|
||
|
END IF
|
||
|
DO
|
||
|
key$ = INKEY$
|
||
|
SELECT CASE key$
|
||
|
CASE CHR$(27)
|
||
|
IF config.snd THEN
|
||
|
WAVPlay "menua.wav", 11000
|
||
|
END IF
|
||
|
i% = -1
|
||
|
EXIT DO
|
||
|
|
||
|
CASE CHR$(0) + "H"
|
||
|
i% = i% - 1
|
||
|
IF i% = 0 THEN i% = mnum%
|
||
|
moff% = i% - 4
|
||
|
IF moff% + 7 > mnum% THEN moff% = mnum% - 7
|
||
|
IF moff% < 0 THEN moff% = 0
|
||
|
IF config.snd THEN
|
||
|
WAVPlay "menub.wav", 11000
|
||
|
END IF
|
||
|
GOTO drawmenu
|
||
|
|
||
|
CASE CHR$(0) + "P"
|
||
|
i% = i% + 1
|
||
|
IF i% = mnum% + 1 THEN i% = 1
|
||
|
moff% = i% - 4
|
||
|
IF moff% + 7 > mnum% THEN moff% = mnum% - 7
|
||
|
IF moff% < 0 THEN moff% = 0
|
||
|
IF config.snd THEN
|
||
|
WAVPlay "menub.wav", 11000
|
||
|
END IF
|
||
|
GOTO drawmenu
|
||
|
|
||
|
CASE CHR$(13)
|
||
|
IF config.snd THEN
|
||
|
WAVPlay "menua.wav", 11000
|
||
|
END IF
|
||
|
EXIT DO
|
||
|
|
||
|
END SELECT
|
||
|
IF RND < .00005 THEN
|
||
|
x% = RND * 250 + 60
|
||
|
y% = RND * 40
|
||
|
d% = RND * 10 + 10
|
||
|
IF RND < .1 THEN
|
||
|
s% = 1
|
||
|
FOR ii% = 1 TO maxsparks%
|
||
|
spark(ii%).r = 0
|
||
|
spark(ii%).a = ((2 * pi#) / maxsparks%) * ii%
|
||
|
NEXT ii%
|
||
|
ELSE
|
||
|
s% = 0
|
||
|
END IF
|
||
|
FOR ii% = 1 TO maxbullets%
|
||
|
IF bullet(ii%).class = 0 THEN
|
||
|
bullet(ii%).class = -1
|
||
|
bullet(ii%).x = x%
|
||
|
bullet(ii%).y = y%
|
||
|
bullet(ii%).a = 0
|
||
|
bullet(ii%).dir = d%
|
||
|
bullet(ii%).p = 1
|
||
|
bullet(ii%).set = s%
|
||
|
IF config.snd THEN
|
||
|
IF RND < .5 THEN
|
||
|
WAVPlay "explode.wav", 11000
|
||
|
ELSE
|
||
|
WAVPlay "blast.wav", 11000
|
||
|
END IF
|
||
|
END IF
|
||
|
EXIT FOR
|
||
|
END IF
|
||
|
NEXT ii%
|
||
|
END IF
|
||
|
FOR B% = 1 TO maxbullets%
|
||
|
IF bullet(B%).class = -1 THEN
|
||
|
level.nofly = 0
|
||
|
x% = bullet(B%).x
|
||
|
y% = bullet(B%).y
|
||
|
c% = 220 - (bullet(B%).a / bullet(B%).dir) * 20
|
||
|
IF bullet(B%).p = -1 THEN c% = 0
|
||
|
FOR r! = 0 TO pi# * 2 STEP .05
|
||
|
p% = POINT(x% + COS(r!) * bullet(B%).a + 3, y% + SIN(r!) * bullet(B%).a + 3)
|
||
|
IF p% = 0 OR p% >= 200 THEN
|
||
|
PSET (x% + COS(r!) * bullet(B%).a + 3, y% + SIN(r!) * bullet(B%).a + 3), c%
|
||
|
END IF
|
||
|
NEXT r!
|
||
|
bullet(B%).a = bullet(B%).a + .5 * bullet(B%).p
|
||
|
IF bullet(B%).p = 1 AND bullet(B%).a >= bullet(B%).dir THEN
|
||
|
bullet(B%).p = -1
|
||
|
END IF
|
||
|
IF bullet(B%).set = 1 THEN
|
||
|
FOR ii% = 1 TO maxsparks%
|
||
|
sx% = bullet(B%).x + 3 + spark(ii%).r * COS(spark(ii%).a)
|
||
|
sy% = bullet(B%).y + 3 + .3 * (spark(ii%).r * SIN(spark(ii%).a))
|
||
|
p% = POINT(sx%, sy%)
|
||
|
IF p% >= 200 THEN
|
||
|
PSET (sx%, sy%), 0
|
||
|
END IF
|
||
|
spark(ii%).r = spark(ii%).r + 2
|
||
|
sx% = bullet(B%).x + 3 + spark(ii%).r * COS(spark(ii%).a)
|
||
|
sy% = bullet(B%).y + 3 + .3 * (spark(ii%).r * SIN(spark(ii%).a))
|
||
|
c% = 220 - spark(ii%).r / 3
|
||
|
IF c% < 200 THEN c% = 200
|
||
|
IF bullet(B%).p = -1 AND bullet(B%).a < 0 THEN c% = 0
|
||
|
p% = POINT(sx%, sy%)
|
||
|
IF p% = 0 THEN
|
||
|
PSET (sx%, sy%), c%
|
||
|
END IF
|
||
|
NEXT ii%
|
||
|
END IF
|
||
|
IF bullet(B%).p = -1 AND bullet(B%).a < 0 THEN
|
||
|
bullet(B%).class = 0
|
||
|
END IF
|
||
|
END IF
|
||
|
NEXT B%
|
||
|
LOOP
|
||
|
mnum% = i%
|
||
|
FOR c% = 100 TO 0 STEP -1
|
||
|
FadePal 0, 0, 0, c%, 0, 31
|
||
|
NEXT c%
|
||
|
END SUB
|
||
|
|
||
|
SUB Pause
|
||
|
'Pauses the game until enter is pressed.
|
||
|
|
||
|
DO
|
||
|
key$ = INKEY$
|
||
|
LOOP UNTIL key$ = ""
|
||
|
DO
|
||
|
key$ = INKEY$
|
||
|
LOOP UNTIL key$ = CHR$(13)
|
||
|
DO
|
||
|
key$ = INKEY$
|
||
|
LOOP UNTIL key$ = ""
|
||
|
END SUB
|
||
|
|
||
|
SUB PlayerFall
|
||
|
'Makes a player fall if necessary.
|
||
|
|
||
|
FOR pn% = 1 TO maxplayers%
|
||
|
IF player(pn%).health > 0 OR player(pn%).dam THEN
|
||
|
t# = (level.tim - player(pn%).tim) * bulletspd%
|
||
|
x% = player(pn%).x
|
||
|
y% = player(pn%).y
|
||
|
IF player(pn%).jump > 0 THEN
|
||
|
level.nofly = 0
|
||
|
ErasePlayer pn%
|
||
|
player(pn%).x = player(pn%).xi + t# * COS(player(pn%).aj) * player(pn%).pj * player(pn%).dir
|
||
|
player(pn%).y = player(pn%).yi + t# * SIN(player(pn%).aj) * player(pn%).pj + 16 * t# ^ 2 * level.grav
|
||
|
DrawPlayer pn%
|
||
|
IF player(pn%).jump = 2 THEN
|
||
|
c% = 220 - t# * 20
|
||
|
LINE (player(pn%).x + 1, player(pn%).y + 7)-(player(pn%).x + 6, player(pn%).y + 7), c%
|
||
|
IF t# >= 1 THEN player(pn%).jump = 1
|
||
|
END IF
|
||
|
END IF
|
||
|
IF player(pn%).x < -7 OR player(pn%).x > 320 OR player(pn%).y > 205 THEN
|
||
|
IF config.snd THEN
|
||
|
WAVPlay "fall.wav", 11000
|
||
|
END IF
|
||
|
player(pn%).dam = 0
|
||
|
player(pn%).health = 0
|
||
|
END IF
|
||
|
|
||
|
bump$ = TurfBump$(x%, y%, -1)
|
||
|
'Uncomment this to help you see where the player is colliding with turf
|
||
|
'IF pn% = level.turn THEN
|
||
|
' LINE (10, 180)-(14, 180), 18
|
||
|
' IF MID$(bump$, 1, 1) = "1" THEN LINE (10, 180)-(14, 180), 15
|
||
|
' LINE (16, 180)-(20, 180), 18
|
||
|
' IF MID$(bump$, 2, 1) = "1" THEN LINE (16, 180)-(20, 180), 15
|
||
|
' LINE (21, 181)-(21, 184), 18
|
||
|
' IF MID$(bump$, 3, 1) = "1" THEN LINE (21, 181)-(21, 184), 15
|
||
|
' LINE (21, 186)-(21, 189), 18
|
||
|
' IF MID$(bump$, 4, 1) = "1" THEN LINE (21, 186)-(21, 189), 15
|
||
|
' LINE (16, 190)-(20, 190), 18
|
||
|
' IF MID$(bump$, 5, 1) = "1" THEN LINE (16, 190)-(20, 190), 15
|
||
|
' LINE (10, 190)-(14, 190), 18
|
||
|
' IF MID$(bump$, 6, 1) = "1" THEN LINE (10, 190)-(14, 190), 15
|
||
|
' LINE (9, 186)-(9, 189), 18
|
||
|
' IF MID$(bump$, 7, 1) = "1" THEN LINE (9, 186)-(9, 189), 15
|
||
|
' LINE (9, 181)-(9, 184), 18
|
||
|
' IF MID$(bump$, 8, 1) = "1" THEN LINE (9, 181)-(9, 184), 15
|
||
|
'END IF
|
||
|
|
||
|
SELECT CASE bump$
|
||
|
CASE "00000000"
|
||
|
IF player(pn%).jump = 0 THEN
|
||
|
player(pn%).tim = level.tim - .2
|
||
|
player(pn%).jump = 1
|
||
|
player(pn%).xi = x%
|
||
|
player(pn%).yi = y%
|
||
|
player(pn%).pj = 0
|
||
|
t# = (level.tim - player(pn%).tim) * bulletspd%
|
||
|
END IF
|
||
|
|
||
|
CASE "11100011", "11000001", "10000000", "00000010", "00000001", "00000011", "10000011", "00000111", "10000111", "11001111", "10001111", "11000111", "10000001", "11001111", "11101111", "11000001", "11000011"
|
||
|
IF player(pn%).jump > 0 AND player(pn%).dir = -1 THEN
|
||
|
xc% = t# * COS(player(pn%).aj) * player(pn%).pj * -player(pn%).dir
|
||
|
player(pn%).xi = x% - xc%
|
||
|
ErasePlayer pn%
|
||
|
player(pn%).dir = 1
|
||
|
DrawPlayer pn%
|
||
|
IF config.snd THEN
|
||
|
WAVPlay "bounce.wav", 11000
|
||
|
END IF
|
||
|
END IF
|
||
|
|
||
|
CASE "11110001", "11100000", "01000000", "00100000", "00010000", "00110000", "01110000", "00111000", "01111000", "11111100", "01111100", "11111000", "01100000", "11111100", "11111110", "11100000", "11110000"
|
||
|
IF player(pn%).jump > 0 AND player(pn%).dir = 1 THEN
|
||
|
xc% = t# * COS(player(pn%).aj) * player(pn%).pj * -player(pn%).dir
|
||
|
player(pn%).xi = x% - xc%
|
||
|
ErasePlayer pn%
|
||
|
player(pn%).dir = -1
|
||
|
DrawPlayer pn%
|
||
|
IF config.snd THEN
|
||
|
WAVPlay "bounce.wav", 11000
|
||
|
END IF
|
||
|
END IF
|
||
|
|
||
|
CASE "11000000", "11100001", "11110011"
|
||
|
' IF player(pn%).jump > 0 THEN
|
||
|
' nt# = 2 * p% * SIN(player(pn%).aj) / (2 * (16 * level.grav))
|
||
|
' xc% = t# * COS(player(pn%).aj) * player(pn%).pj * player(pn%).dir
|
||
|
' player(pn%).xi = x% - xc%
|
||
|
' IF config.snd THEN
|
||
|
' WAVPlay "bounce.wav", 11000
|
||
|
' END IF
|
||
|
' END IF
|
||
|
|
||
|
'CASE "11111111", "01111111", "10111111", "00000100", "00000010", "00000110", "00001110", "00011100", "00011110", "00111111", "00011111", "00111110", "00001111", "10011111", "00011000", "00111100", "01111110", "11011111", "11111110"
|
||
|
CASE ELSE
|
||
|
IF player(pn%).jump > 0 THEN
|
||
|
player(pn%).jump = 0
|
||
|
IF 16 * t# ^ 2 * level.grav > 140 THEN
|
||
|
Damage pn%, (16 * t# ^ 2 * level.grav - 140) / 2
|
||
|
IF pn% = level.turn THEN level.fire = 1
|
||
|
IF config.snd THEN
|
||
|
WAVPlay "crash.wav", 11000
|
||
|
END IF
|
||
|
ELSEIF 16 * t# ^ 2 * level.grav > 10 THEN
|
||
|
IF config.snd THEN
|
||
|
WAVPlay "land.wav", 11000
|
||
|
END IF
|
||
|
END IF
|
||
|
END IF
|
||
|
END SELECT
|
||
|
END IF
|
||
|
NEXT pn%
|
||
|
END SUB
|
||
|
|
||
|
SUB PlayerKey
|
||
|
'Gets the key that was pressed and processes it.
|
||
|
|
||
|
key$ = INKEY$
|
||
|
k% = KeyMark%(key$)
|
||
|
SELECT CASE k%
|
||
|
CASE 1
|
||
|
IF player(level.turn).glued = 0 THEN
|
||
|
IF player(level.turn).jump THEN
|
||
|
IF player(level.turn).dir = 1 THEN
|
||
|
ErasePlayer level.turn
|
||
|
player(level.turn).xi = player(level.turn).xi + 2 * (player(level.turn).x - player(level.turn).xi)
|
||
|
player(level.turn).dir = -1
|
||
|
DrawPlayer level.turn
|
||
|
END IF
|
||
|
ELSE
|
||
|
FOR y% = 0 TO playerstep%
|
||
|
IF TPoint%(player(level.turn).x - 1, player(level.turn).y + 7 - y%, level.turn) = 241 THEN EXIT FOR
|
||
|
NEXT y%
|
||
|
IF y% <= playerstep% THEN
|
||
|
IF config.snd THEN
|
||
|
IF DMADone% AND config.sndb = 0 THEN
|
||
|
WAVPlay "crawl.wav", 11000
|
||
|
END IF
|
||
|
END IF
|
||
|
ErasePlayer level.turn
|
||
|
player(level.turn).x = player(level.turn).x - 1
|
||
|
player(level.turn).y = player(level.turn).y - y%
|
||
|
player(level.turn).dir = -1
|
||
|
DrawPlayer level.turn
|
||
|
END IF
|
||
|
END IF
|
||
|
END IF
|
||
|
|
||
|
CASE 2
|
||
|
IF player(level.turn).glued = 0 THEN
|
||
|
IF player(level.turn).jump THEN
|
||
|
IF player(level.turn).dir = -1 THEN
|
||
|
ErasePlayer level.turn
|
||
|
player(level.turn).xi = player(level.turn).xi + 2 * (player(level.turn).x - player(level.turn).xi)
|
||
|
player(level.turn).dir = 1
|
||
|
DrawPlayer level.turn
|
||
|
END IF
|
||
|
ELSE
|
||
|
FOR y% = 0 TO playerstep%
|
||
|
IF TPoint%(player(level.turn).x + 8, player(level.turn).y + 7 - y%, level.turn) = 241 THEN EXIT FOR
|
||
|
NEXT y%
|
||
|
IF y% <= playerstep% THEN
|
||
|
IF config.snd THEN
|
||
|
IF DMADone% AND config.sndb = 0 THEN
|
||
|
WAVPlay "crawl.wav", 11000
|
||
|
END IF
|
||
|
END IF
|
||
|
ErasePlayer level.turn
|
||
|
player(level.turn).x = player(level.turn).x + 1
|
||
|
player(level.turn).y = player(level.turn).y - y%
|
||
|
player(level.turn).dir = 1
|
||
|
DrawPlayer level.turn
|
||
|
END IF
|
||
|
END IF
|
||
|
END IF
|
||
|
|
||
|
CASE 3
|
||
|
IF config.snd THEN
|
||
|
IF DMADone% AND config.sndb = 0 THEN
|
||
|
WAVPlay "aim.wav", 11000
|
||
|
END IF
|
||
|
END IF
|
||
|
ErasePlayer level.turn
|
||
|
player(level.turn).a = player(level.turn).a - playeraim!
|
||
|
IF player(level.turn).a < -pi# / 2 THEN player(level.turn).a = -pi# / 2
|
||
|
DrawPlayer level.turn
|
||
|
|
||
|
CASE 4
|
||
|
IF config.snd THEN
|
||
|
IF DMADone% AND config.sndb = 0 THEN
|
||
|
WAVPlay "aim.wav", 11000
|
||
|
END IF
|
||
|
END IF
|
||
|
ErasePlayer level.turn
|
||
|
player(level.turn).a = player(level.turn).a + playeraim!
|
||
|
IF player(level.turn).a > pi# / 2 THEN player(level.turn).a = pi# / 2
|
||
|
DrawPlayer level.turn
|
||
|
|
||
|
CASE 5
|
||
|
IF level.fire = 0 AND player(level.turn).jump = 0 THEN
|
||
|
IF player(level.turn).bul = 1 THEN
|
||
|
IF playpack(level.turn, 1).ammo >= playpack(level.turn, 1).set THEN
|
||
|
playpack(level.turn, 1).ammo = playpack(level.turn, 1).ammo - playpack(level.turn, 1).set
|
||
|
power% = 0
|
||
|
IF config.snd THEN
|
||
|
WAVPlay "power.wav", 11000
|
||
|
END IF
|
||
|
DO
|
||
|
key$ = INKEY$
|
||
|
IF KeyMark%(key$) = 5 THEN EXIT DO
|
||
|
LINE (220 + power%, 5)-(220 + power%, 6), 200 + power% / 3
|
||
|
power% = power% + 1
|
||
|
FOR z& = -32000 TO 32000
|
||
|
NEXT z&
|
||
|
IF power% = 60 THEN EXIT DO
|
||
|
LOOP
|
||
|
LINE (220, 5)-(280, 6), 0, BF
|
||
|
power% = maxpower% * (power% / 60)
|
||
|
FOR i% = 1 TO playpack(level.turn, 1).set
|
||
|
InitBullet 1, player(level.turn).x, player(level.turn).y, player(level.turn).a - ((1 / playpack(level.turn, 1).set - 1) * .05) + ((i% - 1) * .1), player(level.turn).dir, power%, playpack(level.turn, 1).set
|
||
|
DrawSpr player(level.turn).x, player(level.turn).y, 1
|
||
|
NEXT i%
|
||
|
IF config.snd THEN
|
||
|
WAVPlay "launch.wav", 11000
|
||
|
END IF
|
||
|
level.fire = 1
|
||
|
ELSE
|
||
|
IF config.snd THEN
|
||
|
WAVPlay "buzzer.wav", 11000
|
||
|
END IF
|
||
|
END IF
|
||
|
END IF
|
||
|
|
||
|
IF player(level.turn).bul = 2 THEN
|
||
|
IF playpack(level.turn, 2).ammo > 0 THEN
|
||
|
playpack(level.turn, 2).ammo = playpack(level.turn, 2).ammo - 1
|
||
|
power% = 0
|
||
|
IF config.snd THEN
|
||
|
WAVPlay "power.wav", 11000
|
||
|
END IF
|
||
|
DO
|
||
|
key$ = INKEY$
|
||
|
IF KeyMark%(key$) = 5 THEN EXIT DO
|
||
|
LINE (220 + power%, 5)-(220 + power%, 6), 200 + power% / 3
|
||
|
power% = power% + 1
|
||
|
FOR z& = -32000 TO 32000
|
||
|
NEXT z&
|
||
|
IF power% = 60 THEN EXIT DO
|
||
|
LOOP
|
||
|
LINE (220, 5)-(280, 6), 0, BF
|
||
|
power% = maxpower% * (power% / 60)
|
||
|
InitBullet 2, player(level.turn).x, player(level.turn).y, player(level.turn).a, player(level.turn).dir, power%, playpack(level.turn, 2).set * 2500
|
||
|
DrawSpr player(level.turn).x, player(level.turn).y, 2
|
||
|
IF config.snd THEN
|
||
|
WAVPlay "launch.wav", 11000
|
||
|
END IF
|
||
|
level.fire = 1
|
||
|
ELSE
|
||
|
IF config.snd THEN
|
||
|
WAVPlay "buzzer.wav", 11000
|
||
|
END IF
|
||
|
END IF
|
||
|
END IF
|
||
|
|
||
|
IF player(level.turn).bul = 3 THEN
|
||
|
IF playpack(level.turn, 3).ammo > 0 THEN
|
||
|
playpack(level.turn, 3).ammo = playpack(level.turn, 3).ammo - 1
|
||
|
InitBullet 3, player(level.turn).x, player(level.turn).y, 0, 0, 0, playpack(level.turn, 3).set
|
||
|
DrawSpr player(level.turn).x, player(level.turn).y, 3
|
||
|
IF config.snd THEN
|
||
|
WAVPlay "mine.wav", 11000
|
||
|
END IF
|
||
|
level.fire = 1
|
||
|
ELSE
|
||
|
IF config.snd THEN
|
||
|
WAVPlay "buzzer.wav", 11000
|
||
|
END IF
|
||
|
END IF
|
||
|
END IF
|
||
|
|
||
|
IF player(level.turn).bul = 4 THEN
|
||
|
IF playpack(level.turn, 4).ammo >= playpack(level.turn, 4).set THEN
|
||
|
playpack(level.turn, 4).ammo = playpack(level.turn, 4).ammo - playpack(level.turn, 4).set
|
||
|
power% = 0
|
||
|
IF config.snd THEN
|
||
|
WAVPlay "power.wav", 11000
|
||
|
END IF
|
||
|
DO
|
||
|
key$ = INKEY$
|
||
|
IF KeyMark%(key$) = 5 THEN EXIT DO
|
||
|
LINE (220 + power%, 5)-(220 + power%, 6), 200 + power% / 3
|
||
|
power% = power% + 1
|
||
|
FOR z& = -32000 TO 32000
|
||
|
NEXT z&
|
||
|
IF power% = 60 THEN EXIT DO
|
||
|
LOOP
|
||
|
LINE (220, 5)-(280, 6), 0, BF
|
||
|
power% = maxpower% * (power% / 60)
|
||
|
FOR i% = 1 TO playpack(level.turn, 4).set
|
||
|
InitBullet 4, player(level.turn).x, player(level.turn).y, player(level.turn).a - ((1 / playpack(level.turn, 4).set - 1) * .05) + ((i% - 1) * .1), player(level.turn).dir, power%, playpack(level.turn, 4).set
|
||
|
DrawSpr player(level.turn).x, player(level.turn).y, 4
|
||
|
NEXT i%
|
||
|
IF config.snd THEN
|
||
|
WAVPlay "launch.wav", 11000
|
||
|
END IF
|
||
|
level.fire = 1
|
||
|
ELSE
|
||
|
IF config.snd THEN
|
||
|
WAVPlay "buzzer.wav", 11000
|
||
|
END IF
|
||
|
END IF
|
||
|
END IF
|
||
|
|
||
|
IF player(level.turn).bul = 5 THEN
|
||
|
IF playpack(level.turn, 5).ammo > 0 THEN
|
||
|
playpack(level.turn, 5).ammo = playpack(level.turn, 5).ammo - 1
|
||
|
IF config.snd THEN
|
||
|
WAVPlay "flamer.wav", 11000
|
||
|
END IF
|
||
|
FOR i% = 1 TO 20
|
||
|
FOR a# = -.5 * (4 - playpack(level.turn, 5).set) TO .5 * (4 - playpack(level.turn, 5).set) STEP .05
|
||
|
FOR r! = 0 TO 1 STEP .01 * (4 - playpack(level.turn, 5).set)
|
||
|
rr! = r! * 15 * playpack(level.turn, 5).set * (1 - ABS(a# / (.5 * (4 - playpack(level.turn, 5).set))))
|
||
|
c% = (1 - r! / 1) * 16 + 202 + RND * 4 - 2
|
||
|
IF i% = 20 THEN c% = 241
|
||
|
fx% = player(level.turn).x - 1 + 4 * (player(level.turn).dir + 1) + COS(a#) * rr! * player(level.turn).dir
|
||
|
fy% = player(level.turn).y + 4 + SIN(a#) * rr!
|
||
|
TPset fx%, fy%, 241
|
||
|
IF c% = 241 THEN
|
||
|
c% = BPoint%(fx%, fy%, 0)
|
||
|
END IF
|
||
|
PSET (fx%, fy%), c%
|
||
|
NEXT r!
|
||
|
NEXT a#
|
||
|
NEXT i%
|
||
|
FOR pn% = 1 TO maxplayers%
|
||
|
IF player(pn%).health > 0 AND pn% <> level.turn THEN
|
||
|
IF ABS(player(pn%).y - player(level.turn).y) <= 7 THEN
|
||
|
IF player(level.turn).dir * (player(pn%).x - player(level.turn).x) > 0 AND player(level.turn).dir * (player(pn%).x - player(level.turn).x) <= playpack(level.turn, 5).set * 15 THEN
|
||
|
ph% = 5000 * (1 / (player(level.turn).dir * (player(pn%).x - player(level.turn).x)) ^ 2)
|
||
|
IF ph% > 50 THEN ph% = 50
|
||
|
Damage pn%, ph%
|
||
|
END IF
|
||
|
END IF
|
||
|
END IF
|
||
|
NEXT pn%
|
||
|
level.fire = 1
|
||
|
level.nofly = 0
|
||
|
ELSE
|
||
|
IF config.snd THEN
|
||
|
WAVPlay "buzzer.wav", 11000
|
||
|
END IF
|
||
|
END IF
|
||
|
END IF
|
||
|
|
||
|
IF player(level.turn).bul = 7 THEN
|
||
|
IF playpack(level.turn, 7).ammo > 0 THEN
|
||
|
playpack(level.turn, 7).ammo = playpack(level.turn, 7).ammo - 1
|
||
|
power% = 0
|
||
|
IF config.snd THEN
|
||
|
WAVPlay "power.wav", 11000
|
||
|
END IF
|
||
|
DO
|
||
|
key$ = INKEY$
|
||
|
IF KeyMark%(key$) = 5 THEN EXIT DO
|
||
|
LINE (220 + power%, 5)-(220 + power%, 6), 200 + power% / 3
|
||
|
power% = power% + 1
|
||
|
FOR z& = -32000 TO 32000
|
||
|
NEXT z&
|
||
|
IF power% = 60 THEN EXIT DO
|
||
|
LOOP
|
||
|
LINE (220, 5)-(280, 6), 0, BF
|
||
|
power% = maxpower% * (power% / 60)
|
||
|
InitBullet 7, player(level.turn).x, player(level.turn).y, player(level.turn).a, player(level.turn).dir, power%, playpack(level.turn, 7).set
|
||
|
DrawSpr player(level.turn).x, player(level.turn).y, 7
|
||
|
IF config.snd THEN
|
||
|
WAVPlay "launch.wav", 11000
|
||
|
END IF
|
||
|
level.fire = 1
|
||
|
ELSE
|
||
|
IF config.snd THEN
|
||
|
WAVPlay "buzzer.wav", 11000
|
||
|
END IF
|
||
|
END IF
|
||
|
END IF
|
||
|
|
||
|
DrawBar
|
||
|
END IF
|
||
|
|
||
|
CASE 6
|
||
|
IF player(level.turn).glued = 0 THEN
|
||
|
IF player(level.turn).jump > 0 THEN
|
||
|
IF player(level.turn).bul = 6 THEN
|
||
|
IF playpack(level.turn, 6).ammo > 0 THEN
|
||
|
player(level.turn).jump = 2
|
||
|
playpack(level.turn, 6).ammo = playpack(level.turn, 6).ammo - 1
|
||
|
IF config.snd THEN
|
||
|
WAVPlay "booster.wav", 11000
|
||
|
END IF
|
||
|
DrawBar
|
||
|
ELSE
|
||
|
IF config.snd THEN
|
||
|
WAVPlay "buzzer.wav", 11000
|
||
|
END IF
|
||
|
GOTO nojump
|
||
|
END IF
|
||
|
ELSE
|
||
|
GOTO nojump
|
||
|
END IF
|
||
|
ELSE
|
||
|
player(level.turn).jump = 1
|
||
|
IF config.snd THEN
|
||
|
WAVPlay "jump.wav", 11000
|
||
|
END IF
|
||
|
END IF
|
||
|
player(level.turn).xi = player(level.turn).x
|
||
|
player(level.turn).yi = player(level.turn).y
|
||
|
player(level.turn).aj = player(0).aj
|
||
|
player(level.turn).pj = player(0).pj
|
||
|
player(level.turn).tim = TIMER - .1
|
||
|
t# = (TIMER - player(level.turn).tim) * bulletspd%
|
||
|
ErasePlayer level.turn
|
||
|
player(level.turn).x = player(level.turn).xi + t# * COS(player(level.turn).aj) * player(level.turn).pj * player(level.turn).dir
|
||
|
player(level.turn).y = player(level.turn).yi + t# * SIN(player(level.turn).aj) * player(level.turn).pj + 16 * t# ^ 2
|
||
|
DrawPlayer level.turn
|
||
|
nojump:
|
||
|
END IF
|
||
|
|
||
|
CASE 7, 8, 9
|
||
|
playpack(level.turn, player(level.turn).bul).set = k% - 6
|
||
|
DrawBar
|
||
|
IF config.snd THEN
|
||
|
WAVPlay "menua.wav", 11000
|
||
|
END IF
|
||
|
|
||
|
CASE 10
|
||
|
level.quit = 1
|
||
|
|
||
|
CASE 11
|
||
|
level.fire = 1
|
||
|
|
||
|
CASE 12 TO 11 + maxweapons%
|
||
|
player(level.turn).bul = k% - 11
|
||
|
DrawBar
|
||
|
IF config.snd THEN
|
||
|
WAVPlay "menub.wav", 11000
|
||
|
END IF
|
||
|
|
||
|
END SELECT
|
||
|
END SUB
|
||
|
|
||
|
SUB SetBlastPal
|
||
|
'Sets the fire palette.
|
||
|
|
||
|
FOR c% = 200 TO 220
|
||
|
s% = (210 - c%) / 10 * pal(1).r
|
||
|
IF s% < 0 THEN s% = 0
|
||
|
rr% = (c% - 200) * 124 / 20 + s%
|
||
|
IF rr% < 0 THEN rr% = 0
|
||
|
IF rr% > 62 THEN rr% = 62
|
||
|
gamepal(c%).r = rr%
|
||
|
s% = (210 - c%) / 10 * pal(1).g
|
||
|
IF s% < 0 THEN s% = 0
|
||
|
gg% = (c% - 200) * 60 / 20 + s%
|
||
|
IF gg% < 0 THEN gg% = 0
|
||
|
IF gg% > 62 THEN gg% = 62
|
||
|
gamepal(c%).g = gg%
|
||
|
s% = (210 - c%) / 10 * pal(1).B
|
||
|
IF s% < 0 THEN s% = 0
|
||
|
bb% = -40 + (c% - 200) * 80 / 20 + s%
|
||
|
IF bb% < 0 THEN bb% = 0
|
||
|
IF bb% > 62 THEN bb% = 62
|
||
|
gamepal(c%).B = bb%
|
||
|
NEXT c%
|
||
|
END SUB
|
||
|
|
||
|
SUB SpeakerState (state%)
|
||
|
'Sets the state of the speakers. (1 = on, 0 = off)
|
||
|
|
||
|
IF state% THEN
|
||
|
DSPWrite &HD1
|
||
|
ELSE
|
||
|
DSPWrite &HD3
|
||
|
END IF
|
||
|
END SUB
|
||
|
|
||
|
SUB Title
|
||
|
'Displays the title screen.
|
||
|
|
||
|
DIM s AS STRING * 1
|
||
|
|
||
|
OPEN "title.pal" FOR BINARY AS #1
|
||
|
FOR i% = 0 TO 255
|
||
|
GET #1, , s
|
||
|
r% = ASC(s)
|
||
|
GET #1, , s
|
||
|
g% = ASC(s)
|
||
|
GET #1, , s
|
||
|
B% = ASC(s)
|
||
|
gamepal(i%).r = r%
|
||
|
gamepal(i%).g = g%
|
||
|
gamepal(i%).B = B%
|
||
|
NEXT i%
|
||
|
CLOSE #1
|
||
|
PALETTE 0, 0
|
||
|
|
||
|
IF config.snd > 0 THEN
|
||
|
WAVPlay "title1.wav", 11000
|
||
|
END IF
|
||
|
DEF SEG = &HA000
|
||
|
BLOAD "title.img", 0
|
||
|
DEF SEG
|
||
|
FOR i% = 0 TO 100
|
||
|
key$ = INKEY$
|
||
|
IF key$ = CHR$(13) THEN GOTO donetitle1
|
||
|
FadePal 0, 0, 0, i%, 0, 255
|
||
|
FOR z% = -32000 TO 32000
|
||
|
FOR zz% = 0 TO 3
|
||
|
NEXT zz%
|
||
|
NEXT z%
|
||
|
NEXT i%
|
||
|
donetitle1:
|
||
|
IF config.snd > 0 THEN
|
||
|
WAVPlay "title2.wav", 11000
|
||
|
END IF
|
||
|
FOR i% = 0 TO 100
|
||
|
key$ = INKEY$
|
||
|
IF key$ = CHR$(13) THEN GOTO donetitle2
|
||
|
c% = RND * 100
|
||
|
FadePal 40, 50, 60, c%, 0, 255
|
||
|
NEXT i%
|
||
|
FadePal 0, 0, 0, 100, 0, 255
|
||
|
Pause
|
||
|
donetitle2:
|
||
|
END SUB
|
||
|
|
||
|
FUNCTION TPoint% (tx%, ty%, pn%)
|
||
|
'Returns the pixel on the turf map to see if a collision occured.
|
||
|
'(241 represents a pixel of sky)
|
||
|
'tx% and ty% are the coordinates.
|
||
|
'pn% is the number of player who is being "looked behind" (1-4) or
|
||
|
'0 if it is a bullet sprite and you want to be able to "see" all the players.
|
||
|
'You can also use -1 to not see any players.
|
||
|
|
||
|
pp% = 241
|
||
|
IF tx% >= 0 AND tx% <= 319 AND ty% >= 0 AND ty% <= 199 THEN
|
||
|
DEF SEG = VARSEG(turfbuf(0))
|
||
|
pp% = PEEK(tx% + 320& * ty% + 4)
|
||
|
DEF SEG
|
||
|
FOR i% = 1 TO maxplayers%
|
||
|
IF player(i%).health > 0 AND pn% <> i% AND pn% <> -1 THEN
|
||
|
IF tx% >= player(i%).x AND tx% <= player(i%).x + 7 AND ty% >= player(i%).y AND ty% <= player(i%).y + 7 THEN
|
||
|
pp% = playerspr((player(i%).dir - 1) * -3.5 + player(i%).dir * (tx% - player(i%).x) + 8 * (ty% - player(i%).y))
|
||
|
IF pp% = -1 THEN
|
||
|
pp% = team(player(i%).tnum).clr
|
||
|
ELSEIF pp% = -10 THEN
|
||
|
IF player(i%).dir = 1 THEN
|
||
|
pp% = 25 - INT((tx% - player(i%).x) / 2)
|
||
|
ELSE
|
||
|
pp% = 25 - INT((7 - (tx% - player(i%).x)) / 2)
|
||
|
END IF
|
||
|
END IF
|
||
|
IF pp% > 0 THEN
|
||
|
IF player(i%).glued > 0 THEN pp% = 92
|
||
|
ELSE
|
||
|
pp% = 241
|
||
|
END IF
|
||
|
FOR ii% = 0 TO gunlen%
|
||
|
x% = player(i%).x + 3 + (1 - player(i%).dir) / 2 + COS(player(i%).a) * ii% * player(i%).dir
|
||
|
y% = player(i%).y + 4 + SIN(player(i%).a) * ii%
|
||
|
IF tx% = x% AND ty% = y% THEN pp% = 25
|
||
|
NEXT ii%
|
||
|
END IF
|
||
|
END IF
|
||
|
NEXT i%
|
||
|
END IF
|
||
|
TPoint% = pp%
|
||
|
END FUNCTION
|
||
|
|
||
|
SUB TPset (tx%, ty%, tp%)
|
||
|
'PSETs to the turf map.
|
||
|
|
||
|
IF tx% >= 0 AND tx% <= 319 AND ty% >= 0 AND ty% <= 199 THEN
|
||
|
DEF SEG = VARSEG(turfbuf(0))
|
||
|
POKE tx% + 320& * ty% + 4, tp%
|
||
|
DEF SEG
|
||
|
END IF
|
||
|
END SUB
|
||
|
|
||
|
FUNCTION TurfBump$ (tx%, ty%, pn%)
|
||
|
'Checks collision with turf map and bounces the sprite accordingly.
|
||
|
'tx% and ty% are the coordinates of the sprite.
|
||
|
'pn% is the number of player who is being "looked behind" (1-4) or
|
||
|
'0 if it is a bullet sprite and you want to be able to "see" all the players.
|
||
|
'You can also use -1 to not see any players.
|
||
|
|
||
|
bstr$ = "00000000"
|
||
|
FOR cy% = ty% + 1 TO ty% + 3
|
||
|
IF TPoint%(tx%, cy%, pn%) <> 241 THEN
|
||
|
MID$(bstr$, 8) = "1"
|
||
|
END IF
|
||
|
NEXT cy%
|
||
|
FOR cy% = ty% + 4 TO ty% + 6
|
||
|
IF TPoint%(tx%, cy%, pn%) <> 241 THEN
|
||
|
MID$(bstr$, 7) = "1"
|
||
|
END IF
|
||
|
NEXT cy%
|
||
|
FOR cy% = ty% + 1 TO ty% + 3
|
||
|
IF TPoint%(tx% + 7, cy%, pn%) <> 241 THEN
|
||
|
MID$(bstr$, 3) = "1"
|
||
|
END IF
|
||
|
NEXT cy%
|
||
|
FOR cy% = ty% + 4 TO ty% + 6
|
||
|
IF TPoint%(tx% + 7, cy%, pn%) <> 241 THEN
|
||
|
MID$(bstr$, 4) = "1"
|
||
|
END IF
|
||
|
NEXT cy%
|
||
|
FOR cx% = tx% TO tx% + 3
|
||
|
IF TPoint%(cx%, ty%, pn%) <> 241 THEN
|
||
|
MID$(bstr$, 1) = "1"
|
||
|
END IF
|
||
|
NEXT cx%
|
||
|
FOR cx% = tx% + 4 TO tx% + 7
|
||
|
IF TPoint%(cx%, ty%, pn%) <> 241 THEN
|
||
|
MID$(bstr$, 2) = "1"
|
||
|
END IF
|
||
|
NEXT cx%
|
||
|
FOR cx% = tx% TO tx% + 3
|
||
|
IF TPoint%(cx%, ty% + 7, pn%) <> 241 THEN
|
||
|
MID$(bstr$, 6) = "1"
|
||
|
END IF
|
||
|
NEXT cx%
|
||
|
FOR cx% = tx% + 4 TO tx% + 7
|
||
|
IF TPoint%(cx%, ty% + 7, pn%) <> 241 THEN
|
||
|
MID$(bstr$, 5) = "1"
|
||
|
END IF
|
||
|
NEXT cx%
|
||
|
|
||
|
TurfBump$ = bstr$
|
||
|
END FUNCTION
|
||
|
|
||
|
FUNCTION TurfHit% (tb%, tx%, ty%)
|
||
|
'Checks collision with turf map of a sprite.
|
||
|
'tb% is the sprite number.
|
||
|
'tx% and ty% are the coordinates of the sprite.
|
||
|
|
||
|
hit% = 0
|
||
|
FOR cx% = tx% TO tx% + 7
|
||
|
FOR cy% = ty% TO ty% + 7
|
||
|
cp% = ammospr(tb%, cx% - tx% + 8 * (cy% - ty%))
|
||
|
IF cp% <> 0 THEN
|
||
|
IF TPoint%(cx%, cy%, level.turn) <> 241 THEN
|
||
|
hit% = 1
|
||
|
GOTO donehit
|
||
|
END IF
|
||
|
END IF
|
||
|
NEXT cy%
|
||
|
NEXT cx%
|
||
|
donehit:
|
||
|
TurfHit% = hit%
|
||
|
END FUNCTION
|
||
|
|
||
|
SUB WAVPlay (file$, freq&)
|
||
|
'Plays a WAV file.
|
||
|
'file$ = WAV file in "/sound/" subdirectory
|
||
|
'freq& = frequency to be played at (normal = 11000)
|
||
|
|
||
|
DIM WavBuffer(1 TO 1) AS STRING * 32767
|
||
|
OPEN "sound\" + file$ FOR BINARY AS #1
|
||
|
DO
|
||
|
GET #1, 44, WavBuffer(1)
|
||
|
length& = LOF(1) - 44
|
||
|
IF length& > 32767 THEN length& = 32767
|
||
|
DMAPlay VARSEG(WavBuffer(1)), VARPTR(WavBuffer(1)), length&, freq&
|
||
|
LOOP UNTIL EOF(1)
|
||
|
CLOSE #1
|
||
|
END SUB
|
||
|
|
||
|
SUB Win (pnum%)
|
||
|
'Displays winning screen.
|
||
|
'pnum% = team number that won. (Can be 0 if everyone died)
|
||
|
|
||
|
IF pnum% = 0 THEN
|
||
|
l$ = "Nobody wins!"
|
||
|
IF config.snd THEN
|
||
|
WAVPlay "lose.wav", 11000
|
||
|
END IF
|
||
|
c% = 23
|
||
|
ELSE
|
||
|
l$ = RTRIM$(team(pnum%).nam) + " wins!"
|
||
|
IF config.snd THEN
|
||
|
WAVPlay "win.wav", 11000
|
||
|
END IF
|
||
|
c% = team(pnum%).clr
|
||
|
END IF
|
||
|
LINE (30, 90)-(290, 110), c%, B
|
||
|
Font l$, 160 - LEN(l$) * 4, 95, 1, 1, 3, 24
|
||
|
Pause
|
||
|
FOR c% = 100 TO 0 STEP -1
|
||
|
FadePal 0, 0, 0, c%, 0, 255
|
||
|
NEXT c%
|
||
|
END SUB
|
||
|
|