Code archives/Miscellaneous/Pitfall II
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| Here is the complete source code for the Pitfall II remake I made in 2003 for the RetroRemakes Remakes Competition. This is a pixel for pixel remake of the original (1983 Activision) game and also includes an additional cavern (if you download the associated media) that I created. It's not necessarily the 'cleanest' code but it definately works. It was finished in haste for the competition so some parts are not as optimal as they could be (or maybe even poorly done). There are also some commented out parts that I honestly don't remember why they were removed, so I don't know if they are useful or not. You are free to use any part or parts of this code as you wish in any other creation that you do (with maybe a small mention of me in the credits of your creation). The only thing that I ask is that no-one use the code in-whole (or even slight modifications) and slap their own name on it. It is shared here for educational purposes only. In other words, you may use parts of this code to create similar works but you cannot use this code to create another Pitfall II game. You can check out the game in the gallery here: http://www.blitzbasic.com/gallery/view_pic.php?id=155&gallery=&page=16 And you can download the media that was used in the game from the game zip file itself here: http://www.classic-retro-games.com/Pitfall_309.html Click on the DOWNLOAD NOW: Pitfall link NOTE that the entire source did not fit into the codebox below (and the download link above is broken because of it). The remainder of the source is posted in the following comment. | |||||
;Pitfall II remake
;by WolRon
;Copyright 2003
;;;;;;;;;;;;;;;;;; Initialize Arrays and Types ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Type Level
Field graphic ;0=nothing 1=ladderhole 2=hole-in-middle 3=left 4=right 5=ladderhole+2holes
;6=flat 7=ground 8=treetops 9=water 10=skyline 11=other-treetops 12=other-skyline
Field water ;0=not 1=true(graphic needs to be set to 3 or 4)
Field left_blocked ;0=not 1=solid 2=checkered
Field right_blocked ;0=not 1=solid 2=checkered
Field animal ;0=not 1=bat 2=bird 3=scorpion 4=frog 5=eel 6=mouse(treasure has to be 6 also)
Field ladder ;0=not 1=ladder in middle
Field checkpoint ;0=not 1=true
Field background_image ;0=not 1=water 2=trees 3=treetops 4=ground 5=other-trees
Field treasure ;0=not 1=gold(right) 2=gold(left) 3=cat 4=girl 5=ring 6=mouse(animal has to be 6 also)
End Type
Dim Board.Level(8, 30)
;8 screens across x 30 levels high (including sky as a level)
Type Animal
Field animaltype ;1=bat, 2=bird, 3=scorpion, 4=frog, 5=eel, 6=mouse
Field levelX
Field levelY
Field x
Field y
Field dir
Field state
End Type
Type Coordinate
Field levelX
Field levelY
Field x
Field y
End Type
PlayerLastCheckPoint.Coordinate = New Coordinate
Dim LevelGraphic(13)
Dim BgImage(10)
Dim FileLength(11)
;;;;;;;;; Check command line ;;;;;;;;;;
cl$ = CommandLine$()
If cl$ = "/MLC"
UnlockMoreLostCaverns()
EndIf
If cl$ = "/Cheat"
Cheat = True
EndIf
If Cheat
Font = LoadFont("FixedSys", 10)
EndIf
;;;;;;;;; Check if Game Unlocked ;;;;;;;;;;;;
file = OpenFile("Unlocked.txt")
If Not file
Unlocked = False
Else
Unlocked = True
CloseFile(file)
EndIf
;;;;;;;; Setup title screen ;;;;;;;;;;;;;;;
AppTitle " Pitfall II ","Are you sure you want to exit?"
Const FrameRate = False
Mode320200 = GfxModeExists(320, 200, GraphicsDepth())
If Not Mode320200
Mode320200 = GfxModeExists(320, 200, 16)
If Mode320200 Then Mode320200 = 16
EndIf
.TitleScreen
Graphics 640,480, 0, 2
SetBuffer(BackBuffer())
ClsColor 83, 28, 16
Cls
SplashGraphic = LoadImage("levelgraphics\splash")
If Not SplashGraphic Then RuntimeError("Pitfall II - Error: Can't load graphic: splash. Reinstall program.")
MidHandle SplashGraphic
FullscreenGraphic = LoadImage("levelgraphics\fullscreen")
If Not FullscreenGraphic Then RuntimeError("Pitfall II - Error: Can't load graphic: fullscreen. Reinstall program.")
HandleImage FullscreenGraphic, ImageWidth(FullscreenGraphic)/2, 0
WindowedGraphic = LoadImage("levelgraphics\windowed")
If Not WindowedGraphic Then RuntimeError("Pitfall II - Error: Can't load graphic: windowed. Reinstall program.")
HandleImage WindowedGraphic, ImageWidth(WindowedGraphic)/2, 0
ArrowGraphic = LoadImage("levelgraphics\arrow")
If Not ArrowGraphic Then RuntimeError("Pitfall II - Error: Can't load graphic: arrow. Reinstall program.")
NotGraphic = LoadImage("levelgraphics\not")
If Not NotGraphic Then RuntimeError("Pitfall II - Error: Can't load graphic: not. Reinstall program.")
CRGraphic = LoadImage("levelgraphics\crm")
If Not CRGraphic Then RuntimeError("Pitfall II - Error: Can't load graphic: crm. Reinstall program.")
MLCGraphic = LoadImage("levelgraphics\mlc")
If Not MLCGraphic Then RuntimeError("Pitfall II - Error: Can't load graphic: mlc. Reinstall program.")
HandleImage MLCGraphic, ImageWidth(MLCGraphic)/2, 0
OCGraphic = LoadImage("levelgraphics\oc")
If Not OCGraphic Then RuntimeError("Pitfall II - Error: Can't load graphic: oc. Reinstall program.")
HandleImage OCGraphic, ImageWidth(OCGraphic)/2, 0
MCGraphic = LoadImage("levelgraphics\mc")
If Not MCGraphic Then RuntimeError("Pitfall II - Error: Can't load graphic: mc. Reinstall program.")
HandleImage MCGraphic, ImageWidth(MCGraphic)/2, 0
If Mode320200 = 0
LockBuffer(ImageBuffer(FullscreenGraphic))
For xiter = 0 To ImageWidth(FullscreenGraphic)
For yiter = 0 To ImageHeight(FullscreenGraphic)
pixelcolor = ReadPixel(xiter, yiter, ImageBuffer(FullscreenGraphic))
If pixelcolor <> -11330544
red = (pixelcolor Shl 8) Shr 24
green = (pixelcolor Shl 16) Shr 24
blue = (pixelcolor Shl 24) Shr 24
red = red/3
green = green/3
blue = blue/3
pixelcolor = red*2^16 + green*2^8 + blue
EndIf
WritePixel(xiter, yiter, pixelcolor, ImageBuffer(FullscreenGraphic))
Next
Next
UnlockBuffer(ImageBuffer(FullscreenGraphic))
EndIf
GameLevel = 1
Selected = False
Selection = 1
If Unlocked = True
Menu = 1
Else
Menu = 2
EndIf
; Create timer to set framerate
frameTimer=CreateTimer(30)
While Menu < 3
While Not Selected
WaitTimer(frameTimer)
Cls
DrawImage SplashGraphic, 320, 137
If (Unlocked And Selection = 2 And Menu = 1) Or (GameLevel = 2 And Menu = 2)
DrawImage MLCGraphic, 320, 202
EndIf
If Menu = 1
DrawImage OCGraphic, 320, 300
DrawImage MCGraphic, 320, 350
Else
DrawImage FullscreenGraphic, 320, 300
DrawImage WindowedGraphic, 320, 350
EndIf
DrawImage CRGraphic, 0, 456
DrawImageRect ArrowGraphic, 50, 300 + 50 * (Selection = 2), 0, 0, ImageWidth(ArrowGraphic)/2, ImageHeight(ArrowGraphic)
If Menu = 1
Width1 = ImageWidth(OCGraphic)/2
Width2 = ImageWidth(MCGraphic)/2
Else
Width1 = ImageWidth(FullscreenGraphic)/2
Width2 = ImageWidth(WindowedGraphic)/2
EndIf
If Selection = 1
xoffset = 320 - ImageWidth(ArrowGraphic)/2 - Width1
Else
xoffset = 320 - ImageWidth(ArrowGraphic)/2 - Width2
EndIf
If Selection = 1 And Mode320200 = 0 And Menu = 2
DrawImage NotGraphic, xoffset, 300
Else
DrawImageRect ArrowGraphic, xoffset, 300 + 50 * (Selection = 2), ImageWidth(ArrowGraphic)/2, 0, ImageWidth(ArrowGraphic)/2, ImageHeight(ArrowGraphic)
EndIf
If KeyHit(1) Then Menu = Menu - 1
If Menu = 1 And Unlocked = False Then End
If Menu = 0 Then End
If KeyHit(200) Then Selection = 1
If KeyHit(208) Then Selection = 2
If KeyHit(28) Or KeyHit(57)
If Menu = 1 Or (Selection = 2 Or Mode320200 > 0)
Selected = True
Menu = Menu + 1
EndIf
EndIf
Flip
Wend
If Menu = 3
If Selection = 1
GraphicMode = 1
Else
GraphicMode = 3
EndIf
If GraphicMode = 1
If Mode320200 = 1 Then ColorDepth = 0
Else
ColorDepth = 0
EndIf
Else
If Selection = 1
GameLevel = 1
Else
GameLevel = 2
EndIf
EndIf
Selected = False
Selection = 1
Wend
If Unlocked
Menu = 1
Else
Menu = 2
EndIf
FreeTimer frametimer
NumTreasures = LoadLevelData(GameLevel)
;;;;;;;;;;;;;;;;;; Initialize Game ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Graphics 320, 200, ColorDepth, GraphicMode
;Original game screen appears to be 152 x 200
;All horizontal pixels are grouped in twos and offset by 4 pixels (actually 8) from the left.
SetBuffer(BackBuffer())
ClsColor 0, 0, 0
If GameLevel = 2
l$ = "2"
Else
l$ = ""
EndIf
For iter = 1 To 13
LevelGraphic(iter) = LoadImage("levelgraphics\lg" + iter)
If Not LevelGraphic(iter) Then RuntimeError("Pitfall II - Error: Can't load graphic: lg" + iter + ". Reinstall program.")
Next
For iter = 1 To 5
BgImage(iter) = LoadImage("levelgraphics\bg" + iter)
If Not BgImage(iter) Then RuntimeError("Pitfall II - Error: Can't load graphic: bg" + iter + ". Reinstall program.")
Next
BgImage(6) = LoadAnimImage("levelgraphics\wf", 34, 42, 0, 2)
If Not BgImage(6) Then RuntimeError("Pitfall II - Error: Can't load graphic: wf. Reinstall program.")
If GameLevel = 2
BgImage(7) = LoadAnimImage("level2graphics\wf2", 34, 42, 0, 2)
If Not BgImage(7) Then RuntimeError("Pitfall II - Error: Can't load graphic: wf2. Reinstall program.")
BgImage(8) = LoadAnimImage("level2graphics\wft", 36, 46, 0, 2)
If Not BgImage(8) Then RuntimeError("Pitfall II - Error: Can't load graphic: wft. Reinstall program.")
BgImage(9) = LoadAnimImage("level2graphics\wfm", 36, 46, 0, 2)
If Not BgImage(9) Then RuntimeError("Pitfall II - Error: Can't load graphic: wfm. Reinstall program.")
BgImage(10) = LoadAnimImage("level2graphics\wfb", 36, 42, 0, 2)
If Not BgImage(10) Then RuntimeError("Pitfall II - Error: Can't load graphic: wfb. Reinstall program.")
EndIf
Checkpoint = LoadImage("levelgraphics\cp")
If Not Checkpoint Then RuntimeError("Pitfall II - Error: Can't load graphic: cp. Reinstall program.")
Left_block = LoadImage("levelgraphics\bgl")
If Not Left_block Then RuntimeError("Pitfall II - Error: Can't load graphic: bgl. Reinstall program.")
Left_block_striped = LoadImage("levelgraphics\bgls")
If Not Left_block_striped Then RuntimeError("Pitfall II - Error: Can't load graphic: bgls. Reinstall program.")
Right_block = LoadImage("levelgraphics\bgr")
If Not Right_block Then RuntimeError("Pitfall II - Error: Can't load graphic: bgr. Reinstall program.")
Right_block_striped = LoadImage("levelgraphics\bgrs")
If Not Right_block_striped Then RuntimeError("Pitfall II - Error: Can't load graphic: bgrs. Reinstall program.")
Ladder = LoadImage("level"+l$+"graphics\ladder")
If Not Ladder Then RuntimeError("Pitfall II - Error: Can't load graphic: ladder. Reinstall program.")
Girl = LoadImage("levelgraphics\Rhonda")
If Not Girl Then RuntimeError("Pitfall II - Error: Can't load graphic: Rhonda. Reinstall program.")
Ring = LoadImage("levelgraphics\ring")
If Not Ring Then RuntimeError("Pitfall II - Error: Can't load graphic: ring. Reinstall program.")
Logo = LoadImage("levelgraphics\logo")
If Not Logo Then RuntimeError("Pitfall II - Error: Can't load graphic: logo. Reinstall program.")
Pause = LoadImage("levelgraphics\pause")
If Not Pause Then RuntimeError("Pitfall II - Error: Can't load graphic: pause. Reinstall program.")
Reset = LoadImage("levelgraphics\reset")
If Not Reset Then RuntimeError("Pitfall II - Error: Can't load graphic: reset. Reinstall program.")
Wave = LoadImage("levelgraphics\wave")
If Not Wave Then RuntimeError("Pitfall II - Error: Can't load graphic: wave. Reinstall program.")
Player = LoadAnimImage("level"+l$+"graphics\player", 16, 21, 0, 12)
If Not Player Then RuntimeError("Pitfall II - Error: Can't load graphic: player. Reinstall program.")
Playl = LoadAnimImage("level"+l$+"graphics\playl", 12, 21, 0, 2)
If Not Playl Then RuntimeError("Pitfall II - Error: Can't load graphic: playl. Reinstall program.")
Playlbo = LoadAnimImage("level"+l$+"graphics\playlbo", 20, 13, 0, 2)
If Not Playlbo Then RuntimeError("Pitfall II - Error: Can't load graphic: playlbo. Reinstall program.")
Plays = LoadAnimImage("level"+l$+"graphics\plays", 16, 15, 0, 8)
If Not Plays Then RuntimeError("Pitfall II - Error: Can't load graphic: plays. Reinstall program.")
Playb = LoadAnimImage("level"+l$+"graphics\playb", 16, 21, 0, 2)
If Not Playb Then RuntimeError("Pitfall II - Error: Can't load graphic: playb. Reinstall program.")
Balloon = LoadAnimImage("levelgraphics\balloon", 14, 28, 0, 2)
If Not Balloon Then RuntimeError("Pitfall II - Error: Can't load graphic: balloon. Reinstall program.")
Gold = LoadAnimImage("levelgraphics\gold", 14, 14, 0, 2)
If Not Gold Then RuntimeError("Pitfall II - Error: Can't load graphic: gold. Reinstall program.")
Goldtemplate = LoadImage("levelgraphics\goldt")
If Not Goldtemplate Then RuntimeError("Pitfall II - Error: Can't load graphic: goldt. Reinstall program.")
Cat = LoadAnimImage("levelgraphics\cat", 14, 23, 0, 2)
If Not Cat Then RuntimeError("Pitfall II - Error: Can't load graphic: cat. Reinstall program.")
Mouse = LoadAnimImage("levelgraphics\rat", 16, 8, 0, 2)
If Not Mouse Then RuntimeError("Pitfall II - Error: Can't load graphic: rat. Reinstall program.")
Bat = LoadAnimImage("levelgraphics\bat", 14, 10, 0, 2)
If Not Bat Then RuntimeError("Pitfall II - Error: Can't load graphic: bat. Reinstall program.")
Bird = LoadAnimImage("levelgraphics\bird", 16, 11, 0, 4)
If Not Bird Then RuntimeError("Pitfall II - Error: Can't load graphic: bird. Reinstall program.")
Scorpion = LoadAnimImage("levelgraphics\scorpion", 16, 11, 0, 4)
If Not Scorpion Then RuntimeError("Pitfall II - Error: Can't load graphic: scorpion. Reinstall program.")
Frog = LoadAnimImage("levelgraphics\frog", 16, 9, 0, 4)
If Not Frog Then RuntimeError("Pitfall II - Error: Can't load graphic: frog. Reinstall program.")
Eel = LoadAnimImage("levelgraphics\eel", 16, 3, 0, 4)
If Not Eel Then RuntimeError("Pitfall II - Error: Can't load graphic: eel. Reinstall program.")
MaskImage Eel, 0, 0, 255
Digits = LoadAnimImage("levelgraphics\digits", 16, 8, 0, 10)
If Not Digits Then RuntimeError("Pitfall II - Error: Can't load graphic: digits. Reinstall program.")
sndJump = LoadSound("levelsounds\jump")
If Not sndJump Then RuntimeError("Pitfall II - Error: Can't load sound: jump. Reinstall program.")
sndTreasure = LoadSound("levelsounds\treasure")
If Not sndTreasure Then RuntimeError("Pitfall II - Error: Can't load sound: treasure. Reinstall program.")
sndHit = LoadSound("levelsounds\hit")
If Not sndHit Then RuntimeError("Pitfall II - Error: Can't load sound: hit. Reinstall program.")
sndCheckpoint = LoadSound("levelsounds\cp")
If Not sndCheckpoint Then RuntimeError("Pitfall II - Error: Can't load sound: cp. Reinstall program.")
sndBPop = LoadSound("levelsounds\bpop")
If Not sndBPop Then RuntimeError("Pitfall II - Error: Can't load sound: bpop. Reinstall program.")
sndSPop = LoadSound("levelsounds\spop")
If Not sndSPop Then RuntimeError("Pitfall II - Error: Can't load sound: spop. Reinstall program.")
mscChorus = LoadSound("levelmusic\chorus")
If Not mscChorus Then RuntimeError("Pitfall II - Error: Can't load music: chorus. Reinstall program.")
mscHappy = LoadSound("levelmusic\happy")
If Not mscHappy Then RuntimeError("Pitfall II - Error: Can't load music: happy. Reinstall program.")
mscSad = LoadSound("levelmusic\sad")
If Not mscSad Then RuntimeError("Pitfall II - Error: Can't load music: sad. Reinstall program.")
mscBalloon = LoadSound("levelmusic\balloon")
If Not mscBalloon Then RuntimeError("Pitfall II - Error: Can't load music: balloon. Reinstall program.")
;These need to be declared before gameloop can begin
DisplayScore = False
GameAlmostRunning = False
GameWon = 0
PlayerX = 68
PlayerY = 0
ScreenY = 107
PlayerScreenY = 107
PlayerLevelX = 1
PlayerLevelY = 2
PlayerAction = 0 ;0=standing, 1=running, 2=swimming, 3=climbing ladder, 4=climbing into ladder, 5=standing on ladder
;6=jumping off of ladder, 7=falling, 8=jumping or uncontrolled (hor.) fall, 9=jumping out of water
;10=falling into water, 11=hanging onto balloon, 12=balloon jump
PlayerLastAction = 0 ;0 = nothing, 1=jumping off ladder to left, 2=jumping off ladder to right
PlayerDir = 0 ;0 = right, 1 = left
PlayerFrame# = 0 ;declaring here to declare variable type
curFrame = 0
PlayerHurt = False
PlayerLastCheckPoint\LevelX = 1
PlayerLastCheckPoint\LevelY = 2
PlayerLastCheckPoint\x = 70
PlayerPauseTime = 0
PlayerJustJumped = False
PlayerJustHoppedOnLadder = False
PlayerJustHoppedOffLadder = False
PlayerBob = -1
Score = 4000
GoldBars = 0
Music = 0 ;1=chorus 2=happy 3=sad 4=balloon
SubLevel = False
HalfUpdate = -1
FourthUpdate = 0
batY = 11
batDir = 1
birdY = 11
birdDir = 1
eelY = 11
eelDir = 1
frogX = 128
frogY = 15
frogDir = 1
frogState = 0
frogInc = 0
eelState = 0
MouseStopped = False
MouseXPos = 64
MouseCollide = False
MouseLevelX = 0
MouseAnim = 0
BalloonBoardX = 0
BalloonBoardY = 0
Balloon2BoardX = 0
Balloon2BoardY = 0
curWave = -1
WaveInc = 1
;Erase any animals that may exist from last game
For curAnimal.Animal = Each Animal
Delete curAnimal
Next
GameRunning = False
; Create the timer to set framerate
frameTimer=CreateTimer(60)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; GameLoop ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.GameLoop
WaitTimer(frameTimer)
If FrameRate
curTime=MilliSecs()
EndIf
;;;;;;testing purposes only;;;;;;;
If Cheat
If KeyDown(30) ;a key
ChannelPitch chnlMusic, 22050
ChannelPitch chnlCP, 24000
ChannelPitch chnlJump, 24000
ChannelPitch chnlTreasure, 24000
ChannelPitch chnlHit, 24000
Delay(33)
ChannelPitch chnlMusic, 44100
ChannelPitch chnlCP, 48000
ChannelPitch chnlJump, 48000
ChannelPitch chnlTreasure, 48000
ChannelPitch chnlHit, 48000
EndIf
EndIf
;While KeyDown(31) ;s key
;Wend
If GameRunning And (Not GamePaused)
;;;;;;;;;;; Check Keys ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
If KeyDown(200)
upkey = True
Else
upkey = False
EndIf
If KeyDown(203)
leftkey = True
If PlayerJustHoppedOffLadder = 2 Then PlayerJustHoppedOffLadder = False
Else
leftkey = False
EndIf
If KeyDown(205)
rightkey = True
If PlayerJustHoppedOffLadder = 1 Then PlayerJustHoppedOffLadder = False
Else
rightkey = False
EndIf
If KeyDown(208)
downkey = True
Else
downkey = False
EndIf
If KeyDown(57)
spacekey = True
Else
spacekey = False
EndIf
;;;;;;; Determine what elements to update ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
HalfUpdate = HalfUpdate * -1 ;used for most actions (30 fps)
FourthUpdate = FourthUpdate + 1 ;used for moving bat&eel ver. & scorpion hor. and swimming (15 fps)
If FourthUpdate > 3 Then FourthUpdate = 0
;;;;; update variables ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
If PlayerPauseTime = 0
;Cat, gold, waterfall
Animflip1 = Animflip1 + 1
If animflip1 > 1
animflip1 = 0
Animation1 = Animation1 + 1
If Animation1 > 1 Then Animation1 = 0
EndIf
;bat, scorpion, eel
Animflip2 = Animflip2 + 1
If animflip2 > 6
animflip2 = 0
Animation2 = Animation2 + 1
If Animation2 > 1 Then Animation2 = 0
EndIf
;wave
Animflip5 = Animflip5 + 1
If animflip5 > 7
animflip5 = 0
curWave = curWave + WaveInc
If curWave = 2
curWave = 0
WaveInc = -1
EndIf
If curWave = -2
curWave = 0
WaveInc = 1
EndIf
EndIf
;bird
Animflip3 = Animflip3 + 1
If animflip3 > 15
animflip3 = 0
Animation3 = Animation3 + 1
If Animation3 > 1 Then Animation3 = 0
EndIf
EndIf
If PlayerHurt
Animflip4 = Animflip4 + 1
If animflip4 > 6
animflip4 = 0
Animation4 = Animation4 + 1
If Animation4 > 1 Then Animation4 = 0
EndIf
crash = 0
EndIf
PlayerPrevY = PlayerY
If HalfUpdate = 1 And (Not PlayerHurt)
If rightkey = False And leftkey = False Then PlayerJustHoppedOnLadder = False
If upkey = False And downkey = False Then PlayerJustHoppedOffLadder = False
If spacekey = False And PlayerAction < 2 Then PlayerJustJumped = False
If PlayerAction = 1 Then PlayerAction = 0
If PlayerFallDist > 0 Then PlayerFallDist = PlayerFallDist - 1
If crash > 0
If (crash Mod 4) = 0 Then ScreenY = ScreenY + 1
If (crash Mod 4) = 2 Then ScreenY = ScreenY - 1
crash = crash - 1
EndIf
EndIf ;HalfUpdate
If PlayerPauseTime > 0 Then PlayerPauseTime = PlayerPauseTime - 1
If Music > 0
If Not ChannelPlaying(chnlMusic)
If Music = 4
chnlMusic = PlaySound(mscBalloon)
Else
chnlMusic = PlaySound(mscChorus)
Music = 1
EndIf
EndIf
EndIf
;;;;;;; Process keys ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
If FourthUpdate = 1
If (Not crash) And (Not PlayerHurt)
If leftkey And (Not rightkey) ;left
If PlayerAction = 2
If Board(PlayerLevelX, PlayerLevelY - 1)\graphic = 3
If PlayerY > 24
If PlayerX > 58 And PlayerX < 66
PlayerJustJumped = True
PlayerAction = 9
PlayerJumpDist = 14
PlayerJumpDir = -1
PlayerX = PlayerX - 2 ;to adjust for initial jumping movement
EndIf
EndIf
EndIf
If PlayerX > 20 Or Board(PlayerLevelX, PlayerLevelY)\left_blocked = 0 Then PlayerX = PlayerX - 2
PlayerDir = 1
If PlayerX = 18
If downkey And PlayerY = 0 Then PlayerX = 20
EndIf
EndIf
EndIf
If rightkey And (Not leftkey);right
If PlayerAction = 2
If Board(PlayerLevelX, PlayerLevelY - 1)\graphic = 4
If PlayerY > 24
If PlayerX > 228 And PlayerX < 236
PlayerJustJumped = True
PlayerAction = 9
PlayerJumpDist = 14
PlayerJumpDir = 1
PlayerX = PlayerX + 2 ;to adjust for initial jumping movement
EndIf
EndIf
EndIf
If PlayerX < 284 Or Board(PlayerLevelX, PlayerLevelY)\right_blocked = 0 Then PlayerX = PlayerX + 2
PlayerDir = 0
If PlayerX = 286
If downkey And PlayerY = 0 Then PlayerX = 284
EndIf
EndIf
EndIf
If downkey And (Not upkey);down
If PlayerAction = 2
If PlayerY > 1
PlayerY = PlayerY - 1
ElseIf PlayerLevelY + 1 < 31
If board(PlayerLevelX, PlayerLevelY + 1)\water = 1
PlayerY = 45
PlayerPrevY = PlayerPrevY + 45
PlayerLevelY = PlayerLevelY + 1
ScreenY = ScreenY + 45
EndIf
EndIf
EndIf
EndIf
If upkey And (Not downkey);up
If PlayerAction = 2
If PlayerY > 24
If board(PlayerlevelX, PlayerLevelY - 1)\ladder = 1
If PlayerJustHoppedOffLadder = False
If PlayerX > 122 And PlayerX < 166
If PlayerX > 146
PlayerJustHoppedOnLadder = 2 ;right
Else
PlayerJustHoppedOnLadder = 1 ;left
EndIf
PlayerAction = 3
If PlayerDir = 0
curFrame = 1
Else
curFrame = 0
EndIf
PlayerX = 146
PlayerY = 40
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf ;upkey
EndIf ;not crash and not hurt
EndIf ;FourthUpdate
If HalfUpdate = 1
If (Not crash) And (Not PlayerHurt)
If leftkey And (Not rightkey);left
If PlayerAction < 2
PlayerAction = 1
PlayerDir = 1
EndIf
If PlayerAction = 1
If PlayerX > 20 Or board(PlayerLevelX, PlayerLevelY)\left_blocked = 0 Then PlayerX = PlayerX - 2
If PlayerX < 122 Then PlayerJustHoppedOffLadder = False
EndIf
If PlayerAction = 3 Or PlayerAction = 5
If PlayerJustHoppedOnLadder = False
If (PlayerY < 7 And PlayerY > 0) Or (PlayerY > 37)
PlayerAction = 6
PlayerDir = 1
PlayerClimb = 0
PlayerJumpDist = 6
PlayerJustHoppedOffLadder = 1 ;left
EndIf
EndIf
If PlayerAction = 6
PlayerFrame = 3
PlayerX = PlayerX - 2 ;to adjust for transition from climbing to jumping?
Else
PlayerFrame = 0
EndIf
EndIf
If PlayerAction = 7
If PlayerFallDist = 0
PlayerX = PlayerX - 2
PlayerFallDist = Rnd(20, 65)
PlayerDir = 1
EndIf
EndIf
If PlayerAction = 11
If PlayerX > 20 Then PlayerX = PlayerX - 2
PlayerDir = 1
EndIf
EndIf ;leftkey
If rightkey And (Not leftkey);right
If PlayerAction < 2
PlayerAction = 1
PlayerDir = 0
EndIf
If PlayerAction = 1
If PlayerX < 284 Or board(PlayerLevelX, PlayerLevelY)\right_blocked = 0 Then PlayerX = PlayerX + 2
If PlayerX > 166 Then PlayerJustHoppedOffLadder = False
EndIf
If PlayerAction = 3 Or PlayerAction = 5
If PlayerJustHoppedOnLadder = False
If (PlayerY < 7 And PlayerY > 0) Or (PlayerY > 37)
PlayerAction = 6
PlayerDir = 0
PlayerClimb = 0
PlayerJumpDist = 6
PlayerJustHoppedOffLadder = 2 ;right
EndIf
EndIf
If PlayerAction = 6
PlayerFrame = 3
Else
PlayerFrame = 0
EndIf
EndIf
If PlayerAction = 7
If PlayerFallDist = 0
PlayerX = PlayerX + 2
PlayerFallDist = Rnd(20, 65)
PlayerDir = 0
EndIf
EndIf
If PlayerAction = 11
If PlayerX < 284 Then PlayerX = PlayerX + 2
PlayerDir = 0
EndIf
EndIf ;rightkey
If upkey And (Not downkey);up
If PlayerAction = 3 Or PlayerAction = 5
If PlayerClimb > 3
PlayerClimb = 0
If PlayerY < 34 Or board(PlayerLevelX, PlayerLevelY - 1)\ladder = 1
PlayerAction = 3
PlayerX = 146
PlayerY = PlayerY + 4
If PlayerY > 45
PlayerY = 2
PlayerPrevY = PlayerPrevY - 45
PlayerLevelY = PlayerLevelY - 1
ScreenY = ScreenY - 45
EndIf
curFrame = curFrame + 1
If CurFrame > 1 Then curFrame = 0
Else
PlayerAction = 5
PlayerY = 38
PlayerX = 144
EndIf
If PlayerY = 10 Then PlayerJustHoppedOnLadder = False
EndIf
EndIf
If PlayerAction < 2
If PlayerY = 0
If board(PlayerlevelX, PlayerLevelY)\ladder = 1
If PlayerJustHoppedOffLadder = False
If PlayerX > 122 And PlayerX < 166
If PlayerX > 146
PlayerJustHoppedOnLadder = 2 ;right
Else
PlayerJustHoppedOnLadder = 1 ;left
EndIf
PlayerAction = 3
If PlayerDir = 0
curFrame = 1
Else
curFrame = 0
EndIf
PlayerX = 146
PlayerY = 2
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf ;upkey
If downkey And (Not upkey);down
If PlayerAction = 3 Or PlayerAction = 5
If PlayerClimb > 3
PlayerClimb = 0
If PlayerLevelY + 1 < 31
lad = Board(PlayerLevelX, PlayerLevelY + 1)\ladder
Else
lad = False
EndIf
If PlayerY > 4 Or lad = True
If Board(PlayerLevelX, PlayerLevelY)\ladder = 1
PlayerAction = 3
PlayerX = 146
PlayerY = PlayerY - 4
If PlayerY < 0
PlayerY = 42
PlayerPrevY = PlayerPrevY + 45
PlayerLevelY = PlayerLevelY + 1
ScreenY = ScreenY + 45
EndIf
curFrame = curFrame + 1
If CurFrame > 1 Then curFrame = 0
Else
If Board(PlayerLevelX, PlayerLevelY)\water = 1
PlayerAction = 10
PlayerJumpDir = 0
PlayerJumpDist = 10
PlayerFrame = 3
Else
PlayerAction = 0
EndIf
PlayerX = 144
EndIf
Else
PlayerAction = 0
PlayerY = 0
PlayerX = 144
EndIf
EndIf
EndIf
If PlayerAction < 2
If PlayerLevelY < 30
If board(PlayerLevelX, PlayerLevelY+1)\ladder = 1
If PlayerJustHoppedOffLadder = False
If PlayerX > 122 And PlayerX < 166
PlayerAction = 4
PlayerClimb = 0
If PlayerX < 144
curFrame = 0
PlayerDir = 1
Else
curFrame = 1
PlayerDir = 0
EndIf
PlayerX = 144
PlayerY = 36
PlayerPrevY = PlayerPrevY + 45
PlayerLevelY = PlayerLevelY + 1
ScreenY = ScreenY + 45
EndIf
EndIf
EndIf
EndIf
EndIf
If PlayerAction = 11
BalloonClimb = BalloonClimb - 3
EndIf
EndIf ;downkey
If spacekey
If PlayerAction < 2
If board(PlayerLevelX, PlayerLevelY)\graphic > 0
If board(PlayerLevelX, PlayerLevelY)\graphic < 7 Or board(PlayerLevelX, PlayerLevelY)\graphic = 13
If Not CheckForHole(PlayerX, PlayerLevelX, PlayerLevelY)
If Not PlayerAction = 8 ;??????????????????????????????????????????????
If PlayerJustJumped = False
PlayerJustJumped = True
PlayerFrame = 3
PlayerJumpDir = 0
chnlJump = PlaySound(sndJump)
If Board(PlayerLevelX, PlayerLevelY - 1)\animal = 7 And (Not leftkey) And (Not rightkey)
PlayerAction = 12
PlayerJumpDist = 25
Else
PlayerAction = 8
PlayerJumpDist = 15
If leftkey
PlayerJumpDir = -1
PlayerX = PlayerX + 2 ;to adjust for jumping movement
EndIf
If rightkey
PlayerJumpDir = 1
PlayerX = PlayerX - 2 ;to adjust for jumping movement
EndIf
If (leftkey And rightkey) Then PlayerJumpDir = 0
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf ;spacekey
;Make player jump if collided with mouse
If MouseCollide
If PlayerLevelX <> MouseLevelX
PlayerJustJumped = True
PlayerAction = 8
PlayerJumpDist = 15
PlayerFrame = 3
PlayerDir = 0
PlayerJumpDir = 1
PlayerX = PlayerX + 2 ;to make him clear ledge
MouseCollide = False
EndIf
EndIf
EndIf ;not crash and not hurt
EndIf ;HalfUpdate
;If AllUpdate
If upkey
If PlayerAction = 11
BalloonClimb = BalloonClimb + 5
EndIf
EndIf
;EndIf ;AllUpdate
;;;;;;;;;; Process Actions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
If FourthUpdate = 1 And (Not PlayerHurt)
If PlayerAction = 2
PlayerFrame = PlayerFrame + .5
If PlayerFrame > 3.5 Then PlayerFrame = 0
EndIf
If PlayerAction = 2
If PlayerY > 27
If Board(PlayerLevelX, PlayerLevelY - 1)\water = 0
PlayerY = PlayerY - 1
EndIf
EndIf
If PlayerY < 24 Or Board(PlayerLevelX, PlayerLevelY - 1)\water = 1
If (Not downkey) Or upkey
PlayerY = PlayerY + 1
If PlayerY > 44
PlayerY = 0
PlayerPrevY = PlayerPrevY - 45
PlayerLevelY = PlayerLevelY - 1
ScreenY = ScreenY - 45
EndIf
EndIf
EndIf
If Board(PlayerLevelX, PlayerLevelY - 1)\water = 0
If PlayerY < 28 And PlayerY > 23 And ((Not downkey) Or upkey)
PlayerY = PlayerY + PlayerBob
If PlayerY = 28
PlayerY = 27
PlayerBob = -1
EndIf
If PlayerY = 23
PlayerY = 24
PlayerBob = 1
EndIf
EndIf
EndIf
If Board(PlayerLevelX, PlayerLevelY)\water = 0
PlayerFrame = 3
PlayerAction = 8
If PlayerDir = 0 Then PlayerJumpDir = 1
If PlayerDir = 1 Then PlayerJumpDir = -1
PlayerJumpDist = 1
EndIf
EndIf
EndIf ;FourthUpdate and not hurt
If HalfUpdate = 1 And (Not PlayerHurt)
If PlayerAction = 1
PlayerFrame = PlayerFrame + .5
If PlayerFrame > 4.5 Then PlayerFrame = 0
ElseIf PlayerAction = 0
PlayerFrame = 0
EndIf
If PlayerAction = 6
If PlayerY = 38
PlayerY = PlayerY + 3
EndIf
EndIf
If PlayerAction = 6
If PlayerDir = 0
PlayerX = PlayerX + 2
Else
PlayerX = PlayerX - 2
EndIf
PlayerJumpDist = PlayerJumpDist - 1
If PlayerY > 37
PlayerY = PlayerY + 1
If PlayerY > 44
PlayerY = 0
PlayerPrevY = PlayerPrevY - 45
PlayerLevelY = PlayerLevelY - 1
ScreenY = ScreenY - 45
EndIf
EndIf
If PlayerY < 7 And PlayerY > 0
PlayerY = PlayerY - 1
EndIf
If PlayerJumpDist = 0 ;PlayerY should be 0!
If CheckForHole(PlayerX, PlayerLevelX, PlayerLevelY)
PlayerY = 45
PlayerPrevY = PlayerPrevY + 45
PlayerLevelY = PlayerLevelY + 1
ScreenY = ScreenY + 45
If Board(PlayerLevelX, PlayerLevelY)\water = 1
PlayerAction = 10
PlayerJumpDir = 0
PlayerJumpDist = 10
PlayerFrame = 3
Else
graphic = Board(PlayerLevelX, PlayerLevelY)\graphic
If graphic > 0 And graphic <> 3 And graphic <> 4
If PlayerAction <> 7
PlayerFrame = 0
PlayerFallDist = Rnd(20, 65)
PlayerAction = 7
EndIf
Else
PlayerFrame = 3
PlayerAction = 8
If PlayerDir = 0
PlayerJumpDir = 1
PlayerX = PlayerX - 2 ;adjust for new action
EndIf
If PlayerDir = 1
PlayerJumpDir = -1
PlayerX = PlayerX + 2 ;adjust for new action
EndIf
PlayerJumpDist = 1
EndIf
EndIf
Else
PlayerAction = 1
EndIf
EndIf
EndIf
If PlayerAction < 2 Or PlayerAction = 7
If PlayerY <> 0
PlayerY = PlayerY - 2
If PlayerY < 0 Then PlayerY = 0
EndIf
If PlayerY = 0
If CheckForHole(PlayerX, PlayerLevelX, PlayerLevelY)
PlayerY = 45
PlayerPrevY = PlayerPrevY + 45
PlayerLevelY = PlayerLevelY + 1
ScreenY = ScreenY + 45
If Board(PlayerLevelX, PlayerLevelY)\water = 1
PlayerAction = 10
PlayerJumpDir = 0
PlayerJumpDist = 10
PlayerFrame = 3
Else
graphic = Board(PlayerLevelX, PlayerLevelY)\graphic
If graphic > 0 And graphic <> 3 And graphic <> 4
If PlayerAction <> 7
PlayerFrame = 0
PlayerFallDist = Rnd(20, 65)
PlayerAction = 7
EndIf
Else
PlayerFrame = 3
PlayerAction = 8
PlayerJumpDir = 0
PlayerJumpDist = 1
EndIf
EndIf
Else
If PlayerAction = 7
PlayerAction = 0
score = score - 100
If score < 0 Then score = 0
crash = 12
chnlHit = PlaySound(sndHit)
EndIf
EndIf
EndIf
EndIf
If PlayerAction = 4
If PlayerClimb > 3
PlayerClimb = 0
If downkey
PlayerAction = 3
PlayerY = 34
PlayerX = 146
Else
PlayerAction = 5
PlayerY = 38
PlayerX = 144
EndIf
EndIf
EndIf
If PlayerAction = 8
If PlayerJumpDir = 1
PlayerX = PlayerX + 2
If PlayerX > 282 And board(PlayerLevelX, PlayerLevelY)\right_blocked > 0
PlayerX = PlayerX - 4
PlayerDir = 1
PlayerJumpDir = -1
EndIf
Else If PlayerJumpDir = -1
PlayerX = PlayerX - 2
If PlayerX < 22 And board(PlayerLevelX, PlayerLevelY)\left_blocked > 0
PlayerX = PlayerX + 4
PlayerDir = 0
PlayerJumpDir = 1
EndIf
EndIf
PlayerJumpDist = PlayerJumpDist - 1
Select PlayerJumpDist
;Case 15
; PlayerY = PlayerY + 2
Case 14
PlayerY = PlayerY + 4
Case 13
PlayerY = PlayerY + 2
Case 12
PlayerY = PlayerY + 1
Case 11
PlayerY = PlayerY + 1
Case 10
PlayerY = PlayerY + 0
Case 9
PlayerY = PlayerY + 0
Case 8
PlayerY = PlayerY + 0
Case 7
PlayerY = PlayerY + 0
Case 6
PlayerY = PlayerY - 1
Case 5
PlayerY = PlayerY - 0
Case 4
PlayerY = PlayerY - 2
Case 3
PlayerY = PlayerY - 1
Case 2
PlayerY = PlayerY - 2
Case 1
PlayerY = PlayerY - 1
End Select
If PlayerJumpDist = 0
For iter = 1 To 2
If PlayerY = 0
If Not CheckForHole(PlayerX, PlayerLevelX, PlayerLevelY)
PlayerAction = 1
Else
PlayerY = 45
PlayerPrevY = PlayerPrevY + 45
PlayerLevelY = PlayerLevelY + 1
ScreenY = ScreenY + 45
PlayerJumpDist = 1
If Board(PlayerLevelX, PlayerLevelY)\water = 1
PlayerAction = 10
PlayerJumpDist = 10
PlayerFrame = 3
If PlayerJumpDir = 1
PlayerX = PlayerX - 2 ;adjust for new action
ElseIf PlayerJumpDir = -1
PlayerX = PlayerX + 2 ;adjust for new action
EndIf
Else
graphic = board(PlayerLevelX, PlayerLevelY - 1)\graphic
If graphic > 0 And graphic <> 3 And graphic <> 4 And graphic <> 13
PlayerFallDist = Rnd(20, 65)
PlayerAction = 7
PlayerJumpDir = 0
PlayerFrame = 0
EndIf
graphic = board(PlayerLevelX, PlayerLevelY)\graphic
If graphic = 0 Or graphic = 3 Or graphic = 4 Or graphic = 13
PlayerAction = 8
PlayerFrame = 3
EndIf
If graphic > 0 And graphic <> 3 And graphic <> 4 And graphic <> 13
If PlayerAction <> 7
PlayerFallDist = Rnd(20, 65)
PlayerAction = 7
PlayerJumpDir = 0
PlayerFrame = 0
EndIf
EndIf
EndIf
EndIf
Else
PlayerJumpDist = 1
PlayerY = PlayerY - 1
EndIf
Next
EndIf
EndIf ;playeraction=8
If PlayerAction = 9
If PlayerJumpDir = 1
PlayerX = PlayerX + 2
Else If PlayerJumpDir = -1
PlayerX = PlayerX - 2
EndIf
PlayerJumpDist = PlayerJumpDist - 1
Select PlayerJumpDist
Case 13
PlayerY = 44
Case 12
PlayerY = 44
PlayerFrame = 3
Case 11
PlayerPrevY = PlayerPrevY - 45
PlayerLevelY = PlayerLevelY - 1
ScreenY = ScreenY - 45
PlayerY = 0
Case 10
PlayerY = 1
Case 9
PlayerY = 1
Case 8
PlayerY = 2
Case 7
PlayerY = 2
Case 6
PlayerY = 3
Case 5
PlayerY = 2
Case 4
PlayerY = 2
Case 3
PlayerY = 1
Case 2
PlayerY = 0
Case 1
PlayerY = 0
Case 0
PlayerY = 0
PlayerAction = 1
End Select
EndIf ;playeraction=9
If PlayerAction = 10
If PlayerJumpDir = 1
PlayerX = PlayerX + 2
Else If PlayerJumpDir = -1
PlayerX = PlayerX - 2
EndIf
For iter = 1 To 2
PlayerJumpDist = PlayerJumpDist - 1
If PlayerJumpDist > 0
PlayerY = PlayerY - 1
Else
PlayerAction = 2
iter = 2
EndIf
Next
EndIf ;playeraction=10
If PlayerAction = 12
PlayerJumpDist = PlayerJumpDist - 1
Select PlayerJumpDist
Case 24
PlayerY = PlayerY + 2
Case 23
PlayerY = PlayerY + 2
Case 22
PlayerY = PlayerY + 2
Case 21
PlayerY = PlayerY + 2
Case 20
PlayerY = PlayerY + 2
Case 19
PlayerY = PlayerY + 2
Case 18
PlayerY = PlayerY + 2
Case 17
PlayerY = PlayerY + 2
Case 16
PlayerY = PlayerY + 2
Case 15
PlayerY = PlayerY + 2
Case 14
PlayerY = PlayerY + 2
Case 13
PlayerY = PlayerY + 2
Case 12
PlayerY = PlayerY + 2
Case 11
PlayerY = PlayerY - 2
Case 10
PlayerY = PlayerY - 2
Case 9
PlayerY = PlayerY - 2
Case 8
PlayerY = PlayerY - 2
Case 7
PlayerY = PlayerY - 2
Case 6
PlayerY = PlayerY - 2
Case 5
PlayerY = PlayerY - 2
Case 4
PlayerY = PlayerY - 2
Case 3
PlayerY = PlayerY - 2
Case 2
PlayerY = PlayerY - 2
Case 1
PlayerY = PlayerY - 2
PlayerAction = 0
End Select
EndIf ;playeraction=12
;Check if player went offscreen
If PlayerX > 284
PlayerX = 26
PlayerLevelX = PlayerLevelX + 1
EndIf
If PlayerX < 20
PlayerX = 280
PlayerLevelX = PlayerLevelX - 1
EndIf
EndIf ;HalfUpdate and not hurt
;If AllUpdate
If PlayerAction = 11
If BalloonClimb > 4
BalloonClimb = 0
PlayerY = PlayerY + 1
If PlayerY > 44
PlayerPrevY = PlayerPrevY - 45
PlayerLevelY = PlayerLevelY - 1
ScreenY = ScreenY - 45
PlayerY = PlayerY - 45
EndIf
EndIf
If Board(PlayerLevelX, PlayerLevelY - 1)\background_image = 4
If PlayerY > 3
PlayerAction = 8
PlayerJumpDist = 1
PopBalloon = True
If HalfUpdate <> 1
PlayerScreenY = PlayerScreenY - (PlayerY - PlayerPrevY)
EndIf
EndIf
EndIf
EndIf ;playeraction=11
;endif ;AllUpdate
;;;;;;;; update variables ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
If HalfUpdate = 1 Or (FourthUpdate = 1 And (PlayerAction = 2 Or PlayerAction = 10)) Or (PlayerAction = 11 And BalloonClimb = 0)
PlayerScreenY = PlayerScreenY - (PlayerY - PlayerPrevY)
EndIf
If HalfUpdate = 1
If PlayerLevelY > 2
If ScreenY <> 152
SubLevel = True
EndIf
EndIf
If PlayerAction > 2
PlayerClimb = PlayerClimb + 1
EndIf
EndIf ;HalfUpdate
If PlayerAction < 3
curFrame = Floor(PlayerFrame)
EndIf
BalloonClimb = BalloonClimb + 3
If PlayerHurt
If PlayerPauseTime = 1
PlayerAction = 0
PlayerFrame = 0
chnlMusic = PlaySound(mscSad)
Music = 3
EndIf
If PlayerPauseTime = 0
If PlayerLevelX = PlayerLastCheckPoint\levelX
If PlayerX > PlayerLastCheckPoint\x
PlayerDir = 1
PlayerX = PlayerX - 2
EndIf
If PlayerX < PlayerLastCheckPoint\x
PlayerDir = 0
PlayerX = PlayerX + 2
EndIf
EndIf
If PlayerLevelX > PlayerLastCheckPoint\levelX
PlayerDir = 1
PlayerX = PlayerX - 2
EndIf
If PlayerX < 20
PlayerX = 282
PlayerLevelX = PlayerLevelX - 1
EndIf
If PlayerLevelX < PlayerLastCheckPoint\levelX
PlayerDir = 0
PlayerX = PlayerX + 2
EndIf
If PlayerX > 284
PlayerX = 22
PlayerLevelX = PlayerLevelX + 1
EndIf
If PlayerLevelY = PlayerLastCheckPoint\levelY
If PlayerY > 0
PlayerY = PlayerY - 1
EndIf
EndIf
If PlayerLevelY < PlayerLastCheckPoint\levelY
PlayerY = PlayerY - 1
If PlayerY < 0 Then PlayerY = 0
If PlayerY = 0
PlayerY = 45
PlayerPrevY = PlayerPrevY + 45
PlayerLevelY = PlayerLevelY + 1
ScreenY = ScreenY + 45
EndIf
EndIf
If PlayerLevelY > PlayerLastCheckPoint\levelY
PlayerY = PlayerY + 1
If PlayerY > 45 Then PlayerY = 45
If PlayerY = 45
PlayerY = 0
PlayerPrevY = PlayerPrevY - 45
PlayerLevelY = PlayerLevelY - 1
ScreenY = ScreenY - 45
EndIf
EndIf
If PlayerLevelX = PlayerLastCheckPoint\levelX
If PlayerX = PlayerLastCheckPoint\x
If PlayerLevelY = PlayerLastCheckPoint\levelY
If PlayerY = 0
PlayerHurt = False
EndIf
EndIf
EndIf
EndIf
score = score - 7
If score < 0 Then score = 0
EndIf ;playerpausetime
PlayerScreenY = PlayerScreenY - (PlayerY - PlayerPrevY)
EndIf ;playerhurt
;testing purposes only -----------------------------------------------------------------
If FrameRate
time = MilliSecs()-curTime
Text 5 + 8 * (time < 10), 0, MilliSecs()-curTime
EndIf
;testing purposes only------------------------------------------------------------------
If KeyHit(1)
GamePaused = True
PauseChannel chnlMusic
FlushKeys()
EndIf
;scroll screen if necessary
If PlayerHurt
If PlayerScreenY > 140
scrollScreen = scrollscreen - 2
EndIf
If PlayerScreenY < 61
scrollScreen = scrollscreen + 2
EndIf
If scrollscreen < 0
scrollscreen = scrollscreen + 2
ScreenY = ScreenY - 2
PlayerScreenY = PlayerScreenY - 2
EndIf
If scrollscreen > 0
scrollscreen = scrollscreen - 2
ScreenY = ScreenY + 2
PlayerScreenY = PlayerScreenY + 2
EndIf
Else
If PlayerScreenY > 137
If PlayerAction = 3
If scrollscreen > -2 Then scrollscreen = scrollscreen - 45
Else
scrollScreen = scrollscreen - 1
EndIf
EndIf
If PlayerScreenY < 116
If PlayerScreenY < 105 And Board(PlayerLevelX, PlayerLevelY - 1)\animal = 7 And PlayerAction <> 12
scrollscreen = scrollscreen + 1
ElseIf PlayerScreenY < 61
If PlayerAction = 3
If scrollscreen < 2 scrollscreen = scrollscreen + 45
Else
scrollScreen = scrollScreen + 1
EndIf
Else
If PlayerAction = 11
scrollscreen = scrollscreen + 1
EndIf
EndIf
EndIf
If scrollscreen < 0
scrollscreen = scrollscreen + 1
ScreenY = ScreenY - 1
PlayerScreenY = PlayerScreenY - 1
EndIf
If scrollscreen > 0
scrollscreen = scrollscreen - 1
ScreenY = ScreenY + 1
PlayerScreenY = PlayerScreenY + 1
EndIf
EndIf ;playerhurt
;;;;;;;;;;;;;; Manage Animals ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Erase offscreen animals
For curAnimal.Animal = Each Animal
deleteAnimal = False
If curAnimal\levelX <> PlayerLevelX Then deleteAnimal = True
If curAnimal\levelY < PlayerLevelY - 3 Then deleteAnimal = True
If curAnimal\levelY > PlayerLevelY + 3 Then deleteAnimal = True
If deleteAnimal = True Then Delete curAnimal
Next
;Replace balloons if they are offscreen
If BalloonBoardX <> 0
If PlayerAction <> 11
If BalloonBoardX <> PlayerLevelX Or (BalloonBoardY < PlayerLevelY - 2) Or (BalloonBoardY > PlayerLevelY + 2)
Board(BalloonBoardX, BalloonBoardY)\animal = 7
BalloonBoardX = 0
BalloonBoardY = 0
If Balloon2BoardX <> 0
BalloonBoardX = Balloon2BoardX
BalloonBoardY = Balloon2BoardY
Balloon2BoardX = 0
Balloon2BoardY = 0
EndIf
EndIf
EndIf
EndIf
;Create new onscreen animals
For yiter = (PlayerLevelY + 3) To (PlayerLevelY - 3) Step -1
If yiter > 0 And yiter < 31
If board(PlayerLevelX, yiter)\animal
newAnimal = True
If yiter = PlayerLevelY + 3 Or yiter = PlayerLevelY - 3
If board(PlayerLevelX, yiter)\animal <> 4 Then newAnimal = False
EndIf
For curAnimal.Animal = Each Animal
If curAnimal\levelY = yiter Then newAnimal = False
Next
If newAnimal
curAnimal.Animal = New Animal
curAnimal\animaltype = board(PlayerLevelX, yiter)\animal
curAnimal\levelX = PlayerLevelX
curAnimal\levelY = yiter
Select curAnimal\animaltype
Case 1 ;bat
curAnimal\x = 56
curAnimal\y = batY
curAnimal\dir = 1
curAnimal\state = 0 ;has no state
Case 2 ;bird
curAnimal\x = 268
curAnimal\y = birdY
curAnimal\dir = -1
curAnimal\state = 0 ;has no state
Case 3 ;scorpion
curAnimal\x = 120
curAnimal\y = 10
curAnimal\dir = 1
curAnimal\state = 0 ;has no state
Case 4 ;frog
curAnimal\x = frogX
curAnimal\y = frogY
curAnimal\dir = frogDir ;1=right, -1=left
curAnimal\state = frogState ;0=sitting, 1=jumping
Case 5 ;eel
curAnimal\x = 56
curAnimal\y = -batY + 2 - 1*(batY > 8)
curAnimal\dir = 0 ;0=tail up, 1=tail down
curAnimal\state = 0;0=not shocking, 1=shocking
Case 6 ;mouse
curAnimal\x = 64 ;needs work
curAnimal\y = 0
curAnimal\dir = 1
curAnimal\state = 1 ;0=stopped, 1=running
MouseStopped = False
MouseXPos = 64
Case 7 ;bat that can become balloon
curAnimal\x = 56
curAnimal\y = batY
curAnimal\dir = 1
curAnimal\state = 0 ;0=bat 1=balloon
;Case 8 ;bat that has become balloon
; curAnimal\x = PlayerX + 2 * (PlayerDir = 0)
; curAnimal\y = PlayerY + 28
; curAnimal\dir = PlayerDir
; curAnimal\state = 0 ;0=alone 1=attached to player
End Select
EndIf
EndIf
EndIf
Next
;update animal variables
If FourthUpdate = 1 And PlayerPauseTime = 0
;bat
batY = batY + batDir
If batY > 12
batY = 12
batDir = -1
EndIf
If batY < 5
batY = 5
batDir = 1
EndIf
;bird
birdY = birdY + birdDir
If birdY > 3
birdY = 3
birdDir = -1
EndIf
If birdY < -12
birdY = -12
birdDir = 1
EndIf
;eel
eelY = eelY + eelDir
If eelY > 11
eelY = 11
eelDir = -1
EndIf
If eelY < 4
eelY = 4
eelDir = 1
EndIf
EndIf ;fourthupdate
If HalfUpdate = 1 And PlayerPauseTime = 0
;frog
frogInc = frogInc + 1
Select frogInc
Case 1
frogY = 12
frogState = 1
Case 2
frogY = 11
Case 3
frogY = 10
frogX = frogX + frogDir * 2
Case 4
frogY = 8
frogX = frogX + frogDir * 2
Case 5
frogY = 7
Case 6
frogY = 6
frogX = frogX + frogDir * 2
Case 7
frogY = 5
Case 8
frogY = 4
frogX = frogX + frogDir * 2
Case 9
frogY = 3
Case 10
frogY = 2
frogX = frogX + frogDir * 2
Case 11
frogY = 1
Case 12
frogY = 0
frogX = frogX + frogDir * 2
Case 13
frogY = -1
Case 14
frogY = -2
frogX = frogX + frogDir * 2
Case 15
frogY = -3
Case 16
frogY = -2
frogX = frogX + frogDir * 2
Case 17
frogY = -1
Case 18
frogY = 0
frogX = frogX + frogDir * 2
Case 19
frogY = 1
frogX = frogX + frogDir * 2
Case 20
frogY = 2
frogX = frogX + frogDir * 2
Case 21
frogY = 3
Case 22
frogY = 4
frogX = frogX + frogDir * 2
Case 23
frogY = 5
Case 24
frogY = 6
frogX = frogX + frogDir * 2
Case 25
frogY = 7
Case 26
frogY = 8
frogX = frogX + frogDir * 2
Case 27
frogY = 10
Case 28
frogY = 11
frogX = frogX + frogDir * 2
Case 29
frogY = 12
Case 30
frogY = 15
frogState = 0
Case 46
frogDir = frogDir * -1
End Select
If frogInc = 62 Then frogInc = 0
EndIf ;halfupdate
;Move animals
If FourthUpdate = 1 And PlayerPauseTime = 0
For curAnimal.Animal = Each Animal
Select curAnimal\animaltype
Case 3 ;scorpion
curAnimal\x = curAnimal\x + curAnimal\dir * 2
If curAnimal\x > 312 Then curAnimal\x = -6
If curAnimal\x < -6 Then curAnimal\x = 312
End Select
Next
EndIf ;fourthupdate
If HalfUpdate = 1 And PlayerPauseTime = 0
For curAnimal.Animal = Each Animal
Select curAnimal\animaltype
Case 1 ;bat
curAnimal\x = curAnimal\x + 2
If curAnimal\x > 312 Then curAnimal\x = -6
Case 2 ;bird
curAnimal\x = curAnimal\x + curAnimal\dir * 2
If curAnimal\x > 312 Then curAnimal\x = -6
If curAnimal\x < -6 Then curAnimal\dir = 1
Case 3 ;scorpion
chase = False
If PlayerLevelY = curAnimal\levelY And PlayerY = 0 Then chase = True
If PlayerAction = 3 Or PlayerAction = 5
If PlayerLevelY = curAnimal\levelY And PlayerY < 36 Then chase = True
If PlayerLevelY = curAnimal\levelY + 1 And PlayerY > 30 Then chase = True
EndIf
If chase
prevDir = curAnimal\dir
If PlayerX < curAnimal\x + 4 Then curAnimal\dir = -1
If PlayerX > curAnimal\x + 4 Then curAnimal\dir = 1
If curAnimal\dir <> prevDir Then curAnimal\x = curAnimal\x + curAnimal\dir * 2
EndIf
Case 4 ;frog
curAnimal\x = frogX
curAnimal\y = frogY
curAnimal\dir = frogDir
curAnimal\state = frogState
Case 5 ;eel
curAnimal\x = curAnimal\x + 2
If curAnimal\x > 312 Then curAnimal\x = -6
curAnimal\y = -eelY + 1*(eelY > 7)
curAnimal\dir = Animation2
eelshock = eelshock + 1
If eelshock > 1
curAnimal\state = Rnd(0, 1)
eelshock = 0
EndIf
Case 6 ;mouse
If curAnimal\levelY = PlayerLevelY
If curAnimal\x < 288
curAnimal\x = curAnimal\x + 4
MouseXPos = MouseXPos + 4
MouseAnim = MouseAnim + 1
If MouseAnim > 1 Then MouseAnim = 0
Else
curAnimal\state = 0
MouseStopped = True
MouseAnim = 0
EndIf
EndIf
Case 7 ;bat that can become balloon
curAnimal\x = curAnimal\x + 2
If curAnimal\x > 312
curAnimal\x = -6
If curAnimal\levelY = PlayerLevelY - 1
If (PlayerAction < 2 Or PlayerAction = 12) And (Not PlayerHurt)
curAnimal\animaltype = 8 ;balloon
curAnimal\dir = 1
EndIf
EndIf
EndIf
Case 8 ;bat that has become balloon
If curAnimal\state = 0
curAnimal\x = curAnimal\x + 2
If curAnimal\x > 312 Then curAnimal\x = -6
curAnimal\y = baty - 7
EndIf
End Select
Next
EndIf ;HalfUpdate
;If AllUpdate
For curAnimal.Animal = Each Animal
If curAnimal\animaltype = 8
If curAnimal\state = 1
curAnimal\x = PlayerX + 2 * (PlayerDir = 0)
curAnimal\dir = PlayerDir
curAnimal\y = PlayerY + 28
curAnimal\LevelY = PlayerLevelY
EndIf
EndIf
Next
;EndIf ;AllUpdate
;;;;;;;;;;;;;; Check for Collisions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
If Not PlayerHurt
image1 = Player
x1 = PlayerX
y1 = ScreenY - PlayerY
frame1 = curFrame
Select PlayerAction
Case 0
frame1 = 0 + 6*(PlayerDir = 1)
Case 1
frame1 = curFrame + 1 + 6*(PlayerDir = 1)
Case 2
image1 = Plays
frame1 = curFrame + 4*(PlayerDir = 1)
Case 3
image1 = Playl
Case 4
image1 = Playlbo
x1 = PlayerX - 2
Case 5
frame1 = 0 + 6*(PlayerDir = 1)
Case 6
frame1 = 3 + 6*(PlayerDir = 1)
Case 7
frame1 = 0 + 6*(PlayerDir = 1)
Case 8
frame1 = PlayerFrame + 6*(PlayerDir = 1)
Case 9
frame1 = PlayerFrame + 6*(PlayerDir = 1)
Case 10
frame1 = PlayerFrame + 6*(PlayerDir = 1)
Case 11
image1 = Playb
frame1 = PlayerDir
Case 12
frame1 = PlayerFrame + 6*(PlayerDir = 1)
End Select
;collide with animal
For curAnimal.Animal = Each Animal
YOffset = ((PlayerLevelY - curAnimal\levelY) * -45) + ScreenY
Select curAnimal\animaltype
Case 1 ;bat
If ImagesCollide(image1, x1, y1, frame1, Bat, curAnimal\x, -batY + YOffset, Animation2)
PlayerHurt = True
PlayerPauseTime = 100
EndIf
Case 2 ;bird
If ImagesCollide(image1, x1, y1, frame1, Bird, curAnimal\x, birdY + YOffset, Animation3 + 2*(curAnimal\dir = 1))
PlayerHurt = True
PlayerPauseTime = 100
EndIf
Case 3 ;scorpion
If ImagesCollide(image1, x1, y1, frame1, Scorpion, curAnimal\x, curAnimal\y + YOffset, Animation2 + 2*(curAnimal\dir = 1))
PlayerHurt = True
PlayerPauseTime = 100
EndIf
Case 4 ;frog
If ImagesCollide(image1, x1, y1, frame1, Frog, curAnimal\x, curAnimal\y + YOffset, 2 - 2*(curAnimal\dir = -1) + curAnimal\state)
PlayerHurt = True
PlayerPauseTime = 100
EndIf
Case 5 ;eel
If ImagesCollide(image1, x1, y1, frame1, Eel, curAnimal\x, curAnimal\y + YOffset, curAnimal\dir * 2)
PlayerHurt = True
PlayerPauseTime = 100
EndIf
Case 6 ;mouse
If PlayerLevelY = curAnimal\levelY
If x1 < curAnimal\x + 10 And x1 > curAnimal\x - 4
If curAnimal\state = 1
PlayerX = curAnimal\x + 10
PlayerDir = 0
MouseCollide = True
MouseLevelX = curAnimal\levelX
EndIf
EndIf
EndIf
Case 7 ;bat that can become balloon
If ImagesCollide(image1, x1, y1, frame1, Bat, curAnimal\x, -batY + YOffset, Animation2)
PlayerHurt = True
PlayerPauseTime = 100
EndIf
Case 8 ;balloon
If curAnimal\state = 0
If ImagesCollide(image1, x1, y1, frame1, Balloon, curAnimal\x, -curAnimal\y + YOffset, curAnimal\dir)
PlayerAction = 11
If BalloonBoardX = 0
BalloonBoardX = curAnimal\LevelX
BalloonBoardY = curAnimal\LevelY
Board(BalloonBoardX, BalloonBoardY)\animal = 0
Else
Balloon2BoardX = curAnimal\LevelX
Balloon2BoardY = curAnimal\LevelY
Board(Balloon2BoardX, Balloon2BoardY)\animal = 0
EndIf
curAnimal\levelY = PlayerLevelY
curAnimal\x = PlayerX + 2 * (PlayerDir = 0)
curAnimal\y = PlayerY + 28
curAnimal\dir = PlayerDir
curAnimal\state = 1
StopChannel chnlMusic
chnlMusic = PlaySound(mscBalloon)
Music = 4
EndIf
EndIf
End Select
Next
If PlayerHurt = True
StopChannel chnlMusic
StopChannel chnlCP
StopChannel chnlJump
Music = 0
If PlayerAction = 11
PlayerAction = 8
PlayerJumpDist = 1
PopBalloon = True
EndIf
EndIf
;balloon collide with animal
For ThisBalloon.Animal = Each Animal
If ThisBalloon\animaltype = 8
BallYOff = ((PlayerLevelY - ThisBalloon\levelY) * -45) + ScreenY
For curAnimal.Animal = Each Animal
YOffset = ((PlayerLevelY - curAnimal\levelY) * -45) + ScreenY
Select curAnimal\animaltype
Case 1
If ImagesCollide(Balloon, ThisBalloon\x, -ThisBalloon\y + BallYOff, ThisBalloon\dir, Bat, curAnimal\x, -batY + YOffset, Animation2)
PlayerAction = 8
PlayerJumpDist = 1
PopBalloon = True
EndIf
Case 2
If ImagesCollide(Balloon, ThisBalloon\x, -ThisBalloon\y + BallYOff, ThisBalloon\dir, Bird, curAnimal\x, birdY + YOffset, Animation3 + 2*(curAnimal\dir = 1))
PlayerAction = 8
PlayerJumpDist = 1
PopBalloon = True
EndIf
Case 7
If ImagesCollide(Balloon, ThisBalloon\x, -ThisBalloon\y + BallYOff, ThisBalloon\dir, Bat, curAnimal\x, -batY + YOffset, Animation2)
PlayerAction = 8
PlayerJumpDist = 1
PopBalloon = True
EndIf
End Select
Next
EndIf
Next
;Pop Balloon if necessary
If PopBalloon = True
PopBalloon = False
For curAnimal.Animal = Each Animal
If curAnimal\animaltype = 8 Then Delete curAnimal
Next
If PlayerHurt
PlaySound sndSPop
Else
PlaySound sndBPop
StopChannel chnlMusic
chnlMusic = PlaySound(mscChorus)
Music = 1
EndIf
EndIf
;collide with checkpoint
If Board(PlayerLevelX, PlayerLevelY)\Checkpoint = True
If PlayerLastCheckpoint\levelX <> PlayerLevelX Or PlayerLastCheckpoint\levelY <> PlayerLevelY
YOffset = ScreenY
If ImagesCollide(image1, x1, y1, frame1, Checkpoint, PlayerLastCheckpoint\x, 15 + YOffset, 0)
PlayerLastCheckpoint\LevelX = PlayerLevelX
PlayerLastCheckpoint\LevelY = PlayerLevelY
chnlCP = PlaySound(sndCheckpoint)
EndIf
EndIf
EndIf
;collide with treasure
treasure = Board(PlayerLevelX, PlayerLevelY)\treasure
If treasure > 0
YOffset = ScreenY
Select treasure
Case 1 ;gold
If ImagesCollide(image1, x1, y1, frame1, Goldtemplate, 248, 8 + YOffset, 0)
Score = Score + 5000
Board(PlayerLevelX, PlayerLevelY)\treasure = 0
chnlTreasure = PlaySound(sndTreasure)
If Music <> 2
StopChannel chnlMusic
chnlMusic = PlaySound(mscHappy)
Music = 2
EndIf
GoldBars = GoldBars + 1
EndIf
Case 2 ;gold
If ImagesCollide(image1, x1, y1, frame1, Goldtemplate, 56, 8 + YOffset, 0)
Score = Score + 5000
Board(PlayerLevelX, PlayerLevelY)\treasure = 0
chnlTreasure = PlaySound(sndTreasure)
If Music <> 2
StopChannel chnlMusic
chnlMusic = PlaySound(mscHappy)
Music = 2
EndIf
GoldBars = GoldBars + 1
EndIf
Case 3 ;Cat
If ImagesCollide(image1, x1, y1, frame1, Cat, 54, -1 + YOffset, Animation1)
Score = Score + 10000
Board(PlayerLevelX, PlayerLevelY)\treasure = 0
chnlTreasure = PlaySound(sndTreasure)
If Music <> 2
StopChannel chnlMusic
chnlMusic = PlaySound(mscHappy)
Music = 2
EndIf
NumTreasures = NumTreasures - 1
EndIf
Case 4 ;girl
If ImagesCollide(image1, x1, y1, frame1, Girl, 58, 2 + YOffset, 0)
Score = Score + 10000
Board(PlayerLevelX, PlayerLevelY)\treasure = 0
chnlTreasure = PlaySound(sndTreasure)
If Music <> 2
StopChannel chnlMusic
chnlMusic = PlaySound(mscHappy)
Music = 2
EndIf
NumTreasures = NumTreasures - 1
EndIf
Case 5 ;ring
If ImagesCollide(image1, x1, y1, frame1, Ring, 136, 5 + YOffset, 0)
Score = Score + 20000
Board(PlayerLevelX, PlayerLevelY)\treasure = 0
chnlTreasure = PlaySound(sndTreasure)
If Music <> 2
StopChannel chnlMusic
chnlMusic = PlaySound(mscHappy)
Music = 2
EndIf
NumTreasures = NumTreasures - 1
EndIf
Case 6 ;mouse
If MouseStopped
For curAnimal.Animal = Each Animal
If curAnimal\animaltype = 6
MouseState = curAnimal\state
EndIf
Next
If ImagesCollide(image1, x1, y1, frame1, Mouse, MouseXPos, 7 + YOffset, MouseAnim)
Score = Score + 15000
Board(PlayerLevelX, PlayerLevelY)\treasure = 0
Board(PlayerLevelX, PlayerLevelY)\animal = 0
;Erase mouse from animals
For curAnimal.Animal = Each Animal
If curAnimal\animaltype = 6 Then Delete curAnimal
Next
MouseCollide = False
chnlTreasure = PlaySound(sndTreasure)
If Music <> 2
StopChannel chnlMusic
chnlMusic = PlaySound(mscHappy)
Music = 2
EndIf
EndIf
EndIf
End Select
EndIf
If NumTreasures = 0
GameRunning = False
GameWon = True
;Erase animals on same level as player
For curAnimal.Animal = Each Animal
If curAnimal\levelY = PlayerLevelY Then Delete curAnimal
Next
EndIf
EndIf ;not playerhurt
EndIf ;if gamerunning
If GameWon
HalfUpdate = HalfUpdate * -1
If HalfUpdate = 1
If PlayerAction = 6
If PlayerDir = 0
PlayerX = PlayerX + 2
Else
PlayerX = PlayerX - 2
EndIf
PlayerJumpDist = PlayerJumpDist - 1
If PlayerY > 37
PlayerY = PlayerY + 1
If PlayerY > 44
PlayerY = 0
PlayerPrevY = PlayerPrevY - 45
PlayerLevelY = PlayerLevelY - 1
ScreenY = ScreenY - 45
EndIf
EndIf
If PlayerY < 7 And PlayerY > 0
PlayerY = PlayerY - 1
EndIf
If PlayerJumpDist = 0 ;PlayerY should be 0!
PlayerAction = 1
EndIf
EndIf
If PlayerAction < 2
If board(PlayerLevelX, PlayerLevelY)\graphic > 0
If board(PlayerLevelX, PlayerLevelY)\graphic < 7 Or Board(PlayerLevelX, PlayerLevelY)\graphic = 13
If Not CheckForHole(PlayerX, PlayerLevelX, PlayerLevelY)
PlayerAction = 8
PlayerJumpDist = 15
PlayerFrame = 3
PlayerDir = 0
chnlJump = PlaySound(sndJump)
Else
Repeat
PlayerX = PlayerX - 2
If PlayerX < 0 Then RuntimeError("Pitfall II - Error: Player off screen. Fatal error.")
Until Not CheckForHole(PlayerX, PlayerLevelX, PlayerLevelY)
EndIf
EndIf
EndIf
EndIf
If PlayerAction = 8
PlayerJumpDist = PlayerJumpDist - 1
Select PlayerJumpDist
Case 15
PlayerY = 2
Case 14
PlayerY = 4
Case 13
PlayerY = 6
Case 12
PlayerY = 7
Case 11
PlayerY = 8
Case 10
PlayerY = 8
Case 9
PlayerY = 8
PlayerDir = 1
Case 8
PlayerY = 8
Case 7
PlayerY = 8
Case 6
PlayerY = 7
Case 5
PlayerY = 7
Case 4
PlayerY = 5
Case 3
PlayerY = 4
Case 2
PlayerY = 2
Case 1
PlayerY = 1
End Select
If PlayerJumpDist = 0
PlayerY = 0
PlayerAction = 0
PlayerFrame = 0
curFrame = 0
PlayerDir = 0
EndIf
EndIf ;playeraction=8
If (Not ChannelPlaying(chnlMusic)) And PlayerJumpDist = 0
If GameLevel = 1
UnlockMoreLostCaverns()
EndIf
GameWon = False
FlushKeys()
EndIf
EndIf
EndIf ;gamewon
Cls
;Draw board
For yiter = (PlayerLevelY+3) To (PlayerLevelY-3) Step -1
If yiter > 0 And yiter < 31
YOffset = ((PlayerLevelY - yiter) * -45) + ScreenY
backgroundimage = Board(PlayerLevelX, yiter)\background_image
If backgroundimage = 0 Or backgroundimage = 6 Or backgroundimage = 7 Or backgroundimage = 10
If yiter + 1 < 31
If Board(PlayerLevelX, yiter + 1)\background_image = 1
DrawBlockRect Wave, 8, 21 + YOffset, 0, 6 + (curWave * 6), 304, 6
EndIf
EndIf
EndIf
If backgroundimage <> 0
If backgroundimage < 6
DrawImage BgImage(backgroundimage), 8, -20 + YOffset
Else
If backgroundimage = 6 Or backgroundimage > 7
extraYOffset = 0
If backgroundimage = 10 Then extraYOffset = -1
If backgroundimage = 9
If yiter Mod 2 = 0 Then extraYOffset = 1
EndIf
DrawImage BgImage(backgroundimage), 8, -12 + YOffset + extraYOffset, Animation1
EndIf
If backgroundimage = 7
DrawImage BgImage(7), 278, -12 + YOffset, Animation1
EndIf
EndIf
EndIf
If Board(PlayerLevelX, yiter)\graphic <> 0
DrawImage LevelGraphic(Board(PlayerLevelX, yiter)\graphic), 8, 15 + YOffset
EndIf
If Board(PlayerLevelX, yiter)\checkpoint = True
DrawImage Checkpoint, 70, 15 + YOffset
EndIf
If Board(PlayerLevelX, yiter)\left_blocked = 1
DrawImage Left_block, 8, -11 + YOffset
EndIf
If Board(PlayerLevelX, yiter)\left_blocked = 2
DrawImage Left_block_striped, 8, -11 + YOffset
EndIf
If Board(PlayerLevelX, yiter)\right_blocked = 1
DrawImage Right_block, 280, -11 + YOffset
EndIf
If Board(PlayerLevelX, yiter)\right_blocked = 2
DrawImage Right_block_striped, 280, -11 + YOffset
EndIf
If Board(PlayerLevelX, yiter)\ladder = 1
If GameLevel = 2
XOffset = -1
Y2Offset = -3
width = 2
Else
XOffset = 0 |
Comments
| ||
And here is the remainder since it didn't all fit above:
Y2Offset = 0
width = 0
EndIf
If (Board(PlayerLevelX, yiter)\graphic = 1 Or Board(PlayerLevelX, yiter)\graphic = 6) And GameLevel = 2
DrawImageRect Ladder, 148 + XOffset, -13 + YOffset + Y2Offset, 0, 0, 10, 35
Else
DrawImage Ladder, 148 + XOffset, -13 + YOffset + Y2Offset
EndIf
If yiter < 30
If Board(PlayerLevelX, yiter + 1)\ladder = 1
graphic = Board(PlayerLevelX, yiter)\graphic
If graphic = 0 Or (graphic > 2 And graphic < 5)
DrawImageRect Ladder, 148 + XOffset, 25 + YOffset + Y2Offset, 0, 1, 8 + width, 7
EndIf
EndIf
EndIf
EndIf
If Board(PlayerLevelX, yiter)\treasure = 1
DrawImage Gold, 248, 3 + YOffset, Animation1
EndIf
If Board(PlayerLevelX, yiter)\treasure = 2
DrawImage Gold, 56, 3 + YOffset, Animation1
EndIf
If Board(PlayerLevelX, yiter)\treasure = 3
DrawImage Cat, 54, -1 + YOffset, Animation1
EndIf
If Board(PlayerLevelX, yiter)\treasure = 4
DrawImage Girl, 58, 2 + YOffset
EndIf
If Board(PlayerLevelX, yiter)\treasure = 5
DrawImage Ring, 136, 5 + YOffset
EndIf
EndIf
Next
;draw sky
If PlayerLevelY < 4
YOffset = (-45 * PlayerLevelY) + ScreenY - 1
If PlayerLevelX Mod 2 = 0
DrawImage LevelGraphic(12), 8, 15 + YOffset
Else
DrawImage LevelGraphic(10), 8, 15 + YOffset
EndIf
EndIf
;draw bottom of ground
If PlayerLevelY > 27
YOffset = (45 * (31 - PlayerLevelY)) + ScreenY - 1
DrawImage BgImage(4), 8, -20 + YOffset
EndIf
;Draw animals
For curAnimal.Animal = Each Animal
YOffset = ((PlayerLevelY - curAnimal\levelY) * -45) + ScreenY
Select curAnimal\animaltype
Case 1
DrawImage Bat, curAnimal\x, -batY + YOffset, Animation2
Case 2
DrawImage Bird, curAnimal\x, birdY + YOffset, Animation3 + 2*(curAnimal\dir = 1)
Case 3
DrawImage Scorpion, curAnimal\x, curAnimal\y + YOffset, Animation2 + 2*(curAnimal\dir = 1)
Case 4
DrawImage Frog, curAnimal\x, curAnimal\y + YOffset, 2 - 2*(curAnimal\dir = -1) + curAnimal\state
Case 5
DrawImage Eel, curAnimal\x, curAnimal\y + YOffset, curAnimal\dir * 2 + curAnimal\state
Case 6
DrawImage Mouse, curAnimal\x, 7 + YOffset, 0 + MouseAnim
Case 7
DrawImage Bat, curAnimal\x, -batY + YOffset, Animation2
Case 8
DrawImage Balloon, curAnimal\x, -curAnimal\y + YOffset, curAnimal\dir
End Select
Next
;Draw Player
If (Not PlayerHurt) Or (PlayerHurt And Animation4)
If PlayerAction < 2
DrawImage Player, PlayerX, ScreenY - PlayerY, curFrame + 1*(PlayerAction > 0) + 6*(PlayerDir = 1)
EndIf
If PlayerAction = 2
DrawImage Plays, PlayerX, ScreenY - PlayerY, curFrame + 4*(PlayerDir = 1)
EndIf
If PlayerAction = 3
DrawImage Playl, PlayerX, ScreenY - PlayerY, curFrame
EndIf
If PlayerAction = 4
DrawImage Playlbo, PlayerX - 2, ScreenY - PlayerY, curFrame
EndIf
If PlayerAction = 5 Or PlayerAction = 7
DrawImage Player, PlayerX, ScreenY - PlayerY, 0 + 6*(PlayerDir = 1)
EndIf
If PlayerAction = 6
DrawImage Player, PlayerX, ScreenY - PlayerY, 3 + 6*(PlayerDir = 1)
EndIf
If PlayerAction = 8 Or PlayerAction = 12
DrawImage Player, PlayerX, ScreenY - PlayerY, PlayerFrame + 6*(PlayerDir = 1)
EndIf
If PlayerAction = 9 Or PlayerAction = 10
If PlayerJumpDist = 13
DrawImage Plays, PlayerX, ScreenY - PlayerY, curFrame + 4*(PlayerDir = 1)
Else
DrawImage Player, PlayerX, ScreenY - PlayerY, PlayerFrame + 6*(PlayerDir = 1)
EndIf
EndIf
If PlayerAction = 11
DrawImage Playb, PlayerX, ScreenY - PlayerY, 0 + 1*(PlayerDir = 1)
EndIf
EndIf
;draw bottom of levels (to cover player if climbing through hole)
If PlayerAction <> 2 And PlayerAction <> 11
For yiter = (PlayerLevelY+3) To (PlayerLevelY-3) Step -1
If yiter > 0 And yiter < 31
graphic = Board(PlayerLevelX, yiter)\graphic
If graphic <> 0
DrawImageRect LevelGraphic(graphic), 8, 22 - ((PlayerLevelY-yiter) * 45) + ScreenY, 0, 7, 304, 7
EndIf
EndIf
Next
EndIf
;redraw balloon
If PlayerAction <> 11
For curAnimal.Animal = Each Animal
YOffset = ((PlayerLevelY - curAnimal\levelY) * -45) + ScreenY
If curAnimal\animaltype = 8 Then DrawImage Balloon, curAnimal\x, -curAnimal\y + YOffset, curAnimal\dir
Next
EndIf
;Erase top of screen and draw score
Color 0, 0, 255
Rect 8, 8, 304, 23
Color 0, 0, 0
Rect 8, 0, 304, 8
If SubLevel
Rect 8, 31, 304, 2
EndIf
If DisplayScore
scoreX = 108
tempscore = score
multiplier = 10
For iter = 1 To 6
number = tempscore Mod multiplier
digit = number / (multiplier / 10)
DrawImage Digits, scoreX, 11, digit
scoreX = scoreX - 16
multiplier = multiplier * 10
tempscore = tempscore - number
If tempscore = 0 Then Exit
Next
If Cheat
Text 150, 7, "Location: X:" + PlayerLevelX + ", Y:" + PlayerLevelY
Text 150, 17, "Gold collected: " + GoldBars
EndIf
EndIf
;Erase bottom of screen
Color 0, 0, 0
Rect 8, 184, 304, 16
;Erase sides of screen
Rect 0, 0, 8, 200
Rect 312, 0, 8, 200
If GamePaused
Color 255, 255, 255
;animate Pause graphic
PausePause = PausePause + 1
If PausePause > 90
PauseScroll = PauseScroll + 1
If PauseScroll > 8
PauseScroll = 0
PauseY = PauseY + 1
If PauseY > 9 Then PauseY = 9
EndIf
EndIf
If PausePause > 260
PausePause = 0
PauseY = 0
PauseScroll = 0
EndIf
DrawImageRect Pause, 188, 186, 0, PauseY, 100, 7
If KeyHit(1);esc
GamePaused = False
PausePause = 0
PauseY = 0
PauseScroll = 0
ResumeChannel chnlMusic
FlushKeys()
EndIf
If KeyHit(16);q
GameRunning = False
GamePaused = False
StopChannel chnlMusic
LogoY = 0
FlushKeys()
EndIf
EndIf
If (Not GameRunning) And (Not GameWon)
If KeyHit(28) ;enter
;Initialize new game
NumTreasures = LoadLevelData(GameLevel)
DisplayScore = True
GameAlmostRunning = True
GameWon = 0
PlayerX = 68
PlayerY = 0
ScreenY = 107
PlayerScreenY = 107
PlayerLevelX = 1
PlayerLevelY = 2
PlayerAction = 0 ;0 = standing
PlayerLastAction = 0
PlayerDir = 0 ;0 = right, 1 = left
PlayerFrame# = 0
curFrame = 0
PlayerHurt = False
PlayerLastCheckPoint\LevelX = 1
PlayerLastCheckPoint\LevelY = 2
PlayerLastCheckPoint\x = 70
PlayerPauseTime = 0
PlayerJustJumped = False
PlayerJustHoppedOnLadder = False
PlayerJustHoppedOffLadder = False
Score = 4000
GoldBars = 0
Music = 0
SubLevel = False
HalfUpdate = -1
FourthUpdate = 0
batY = 11
batDir = 1
birdY = 11
birdDir = 1
eelY = 11
eelDir = 1
frogX = 128
frogY = 15
frogDir = 1
frogState = 0
frogInc = 0
eelState = 0
MouseStopped = False
MouseXPos = 64
MouseCollide = False
MouseLevelX = 0
MouseAnim = 0
BalloonBoardX = 0
BalloonBoardY = 0
Balloon2BoardX = 0
Balloon2BoardY = 0
curWave = -1
WaveInc = 1
LogoY = 9
For curAnimal.Animal = Each Animal
Delete curAnimal
Next
StopChannel chnlMusic
EndIf
If KeyDown(1) Then Goto TheEnd
If Not GameAlmostRunning
;animate logo
LogoPause = LogoPause + 1
If LogoPause > 90
LogoScroll = LogoScroll + 1
If LogoScroll > 8
LogoScroll = 0
LogoY = LogoY + 1
If LogoY > 9 Then LogoY = 9
EndIf
EndIf
If LogoPause > 260
LogoPause = 0
LogoY = 0
LogoScroll = 0
EndIf
;reset message
If KeyDown(200) Or KeyDown(203) Or KeyDown(205) Or KeyDown(208) Or KeyDown(57)
DrawImage Reset, 188, 186
EndIf
EndIf
EndIf
;Draw Logo
DrawImageRect Logo, 32, 186, 0, LogoY, 100, 7
;testing drawing functions
;Color 255, 255, 255
;Text 0, 0, PlayerJustHoppedOnLadder
If GameAlmostRunning
If KeyDown(200) Or KeyDown(203) Or KeyDown(205) Or KeyDown(208) Or KeyDown(57)
GameRunning = True
GameAlmostRunning = False
chnlMusic = PlaySound(mscHappy)
Music = 2
EndIf
EndIf
;framerate
If FrameRate
timeelapsed = MilliSecs()-curTime
;If timeelapsed > 0 Then timeelapsed = 1000/timeelapsed
Text 10, 15, timeelapsed
;curTime=MilliSecs()
EndIf
Flip
Goto GameLoop
.TheEnd
FreeTimer frametimer
Goto TitleScreen
End
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; FUNCTIONS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Function CheckForHole(x, lx, ly)
leveltype = board(lx, ly)\graphic
If leveltype > 6 And leveltype <> 8 And leveltype <> 11 And leveltype <> 13
RuntimeError("Pitfall II - Error: You shouldn't be able to get there. *Info: "+lx+" "+ly+" "+leveltype)
EndIf
level = -1
holes = 0
If GameLevel = 1
Restore LevelData
Else
Restore Level2Data
EndIf
While level <> leveltype
Read level
Read holes
If holes > 0
Read hole1a
Read hole1b
If holes = 3
Read hole2a
Read hole2b
Read hole3a
Read hole3b
EndIf
EndIf
Wend
If holes > 0
If x > hole1a And x < hole1b
Return True ;hole
EndIf
If holes = 3
If x > hole2a And x < hole2b
Return True ;hole
EndIf
If x > hole3a And x < hole3b
Return True; hole
EndIf
EndIf
Else
Return False ; no hole
EndIf
End Function
Function LoadLevelData(level)
;fill level data
If level = 2
l$ = "2"
Else
l$ = ""
EndIf
; Open the file to Read
filein = ReadFile("level"+l$+"data\leveldata")
If filein = 0 Then RuntimeError("Pitfall II - Error: Can't read level data. Reinstall program.")
For xiter = 1 To 8
For yiter = 1 To 30
; Read the data from the file
Board.Level(xiter, yiter) = New Level
Board(xiter, yiter)\graphic = ReadByte( filein )
Board(xiter, yiter)\water = ReadByte( filein )
Board(xiter, yiter)\left_blocked = ReadByte( filein )
Board(xiter, yiter)\right_blocked = ReadByte( filein )
Board(xiter, yiter)\animal = ReadByte( filein )
Board(xiter, yiter)\ladder = ReadByte( filein )
Board(xiter, yiter)\checkpoint = ReadByte( filein )
Board(xiter, yiter)\background_image = ReadByte( filein )
Board(xiter, yiter)\treasure = ReadByte( filein )
If Board(xiter, yiter)\treasure > 2
If Board(xiter, yiter)\treasure < 6
NumTreasures = NumTreasures + 1
EndIf
EndIf
Next
Next
; Close the file once reading is finished
CloseFile( filein )
Return NumTreasures
End Function
Function UnlockMoreLostCaverns()
;Create Unlocked.txt file
fileout = WriteFile("Unlocked.txt")
WriteLine(fileout, "Congratulations on your successful rescue of Rhonda, Quickclaw, and the Raj Diamond!")
WriteLine(fileout, "")
WriteLine(fileout, "")
WriteLine(fileout, "New Objectives:")
WriteLine(fileout, " You are once again Pitfall Harry (with a slightly upgraded image!) and you are on a journey")
WriteLine(fileout, " once again to rescue your niece Rhonda, your cat Quickclaw, and the Raj Diamond from the")
WriteLine(fileout, " new underground caverns where they are now dreadfully lost again.")
WriteLine(fileout, " To win, you must find Rhonda, Quickclaw, and the Raj Diamond.")
WriteLine(fileout, " There are also now -51- gold bars and another stone-aged rat that can be collected for")
WriteLine(fileout, " additional points.")
WriteLine(fileout, " Points awarded for collection of each item are the same as the original.")
WriteLine(fileout, " 4000 points are once again given in advance at the beginning of the game.")
WriteLine(fileout, "")
WriteLine(fileout, " This time a total of 314,000 points is achievable (And well earned!).")
WriteLine(fileout, "")
CloseFile(fileout)
MemBank = CreateBank(50000)
Offset = 0
file = 11
;Read in file lengths
filein = ReadFile("leveldata\extradata2")
If filein = 0 Then RuntimeError("Pitfall II - Error: Can't read extradata2. Reinstall program.")
For iter = 1 To file
;read the data from the file
FileLength(iter) = ReadInt( filein )
Next
;Close the file once reading is finished
CloseFile( filein )
For iter = 1 To file
Offset = Offset + FileLength(iter)
Next
;load in file data
filein = ReadFile("leveldata\extradata")
If filein = 0 Then RuntimeError("Pitfall II - Error: Can't read extradata. Reinstall program.")
For iter = 0 To Offset
; read the data from the file
PokeByte(MemBank, iter, ReadByte( filein ))
Next
;Close the file once reading is finished
CloseFile( filein )
;Write files to disk
CreateDir("level2data")
fileout = WriteFile("level2data\leveldata")
If fileout = 0 Then RuntimeError("Pitfall II - Error: Can't write leveldata. Reinstall program.")
For iter = 0 To FileLength(1)
WriteByte(fileout, PeekByte(MemBank, iter))
Next
;Close the file once writing is finished
CloseFile( fileout )
LastOffset = FileLength(1)
Restore Filenames
CreateDir("level2graphics")
For iter = 1 To 10
Read filename$
;Create the file to Write
fileout = WriteFile("level2graphics\"+filename$)
If fileout = 0 Then RuntimeError("Pitfall II - Error: Can't write levelgraphics. Reinstall program.")
For loop = LastOffset To LastOffset + FileLength(iter+1)
WriteByte(fileout, PeekByte(MemBank, loop))
Next
;Close the file once writing is finished
CloseFile( fileout )
LastOffset = LastOffset + FileLength(iter+1)
Next
FreeBank(MemBank)
End Function
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DATA ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.LevelData
Data 0, 1, 0, 320
Data 1, 0
Data 2, 1, 136, 152
Data 3, 1, 52, 320
Data 4, 1, 0, 242
Data 5, 3, 88, 112, 136, 152, 176, 200
Data 6, 0
Data 7, 0
Data 8, 1, 0, 152
Data 9, 0
Data 10, 0
Data 11, 1, 136, 320
.Level2Data
Data 0, 1, 0, 320
Data 1, 0
Data 2, 1, 136, 152
Data 3, 1, 52, 320
Data 4, 1, 0, 242
Data 5, 3, 88, 112, 136, 152, 176, 200
Data 6, 0
Data 7, 0
Data 8, 1, 0, 152
Data 9, 0
Data 10, 0
Data 11, 1, 136, 320
Data 13, 3, 0, 112, 136, 152, 176, 320
.Filenames
Data "ladder", "playb", "player", "playl", "playlbo", "plays", "wf2", "wfb", "wfm", "wft"
;end of file2792 lines of code **Note again that there is a gap in the code above between this codebox and the one above it. |
| ||
| Nice work :) |
| ||
| @WolRon You mentioned in another post that you could - if asked - post the ORIGINAL hacked graphics. I would LOVE to 1: see the hacked graphics 2: know more about HOW you hacked the original Atari 2600 version, since I am myself looking for a TRUE River Raid (also 2600) to rip and replicate as a retro remake. |
| ||
| You mentioned in another post that you could - if asked - post the ORIGINAL hacked graphics. No, I did not. In my other post I stated that if anyone would like to see the MAPS of the original cavern and the cavern that I created, that I would show them to them. "I" created the map images using the level editor I wrote. Also, all the graphics in the game were hand-drawn by me from screenshots of the original. I did not rip them from anywhere. |
| ||
| nice job wolron. @olsen. come on. atari gfx isnt that hard to replicate, you're just being lazy :P |
| ||
| @DanJo To me - everything related to graphics is hard. very hard. |
| ||
| True: especially collission and gravity. Very Nice of You to Share. I know someone who would love to see this game ('s code: 4 educational purposes) |
| ||
| Thankyou. How long did it take you to get the right 'feel' of the gameplay? |
| ||
| It just happened all by itself, being that I copied the original... But I did put a LOT of effort into making it as true to the original as I could (besides my scrolling name :). |
Code Archives Forum