rem ==================================================================
rem A platform game - PICK UP THE COINS AND BLEED!!!
rem
rem Code:     JSM
rem Graphics: Some guy at opengameart.org
rem ==================================================================

import "Tilemap.lib"
import "SimpleParticle.lib"
import "Speed.lib"
import "Keycodes.lib"

rem Images.
constant:
	PLY_LEFT_IMG 1
	PLY_RIGHT_IMG 2
	COIN_IMG 3
	BLOOD_IMG 4
visible:
	vBGColor[]

hidden:

rem Setup window.
set window 32, 32, 640, 480, false
set redraw off

rem Load assets.
proc LoadAssets

rem Set viewport and load map.
proc TM_SetView 0, 0, 640, 480
if not TM_LoadMap("assets/level1.txt") then end
proc TM_SetBorder true, true, false, false
img = TM_GetImage()
set image img
vBGColor[] = pixel(0, 0)
set image primary

plyImg = PLY_RIGHT_IMG
plyCel = 0
plyX# = 100.0
plyY# = 100.0
plyDX# = 0.0
plyDY# = 0.0
plySpd# = 4.0
plyOnGround = false
plyHasReleasedJumpButton = true

proc SP_Init 100

do
	rem Urhm ... player controll.
	anim = true
	if keydown("A")
		plyImg = PLY_LEFT_IMG
		plyDX = max#(plyDX - 0.2, -plySpd)
	elseif keydown("D")
		plyImg = PLY_RIGHT_IMG
		plyDX = min#(plyDX + 0.2, plySpd)
	else
		if plyDX < 0.0
			plyDX = min#(plyDX + 0.075, 0.0)
		elseif plyDX > 0.0
			plyDX = max#(plyDX - 0.075, 0.0)
		else
			anim = false
			plyCel = 0
		endif
	endif
	if keydown("W")
		if plyOnGround and plyHasReleasedJumpButton
			plyDY = -8.0
			plyHasReleasedJumpButton = false
		endif
	else
		if plyDY < -4.0 then plyDY = -4.0
		if plyOnGround then plyHasReleasedJumpButton = true
	endif

	if anim then plyCel = (plyCel + 1)%11
	plyDY = min#(plyDY + 0.15, 8.0)


	pos#[] = TM_MoveF(plyImg, plyX, plyY, plyDX, plyDY)
	plyX = pos[TM_X]
	plyY = pos[TM_Y]
	if TM_CollisionDown()
		plyOnGround = true
	else
		plyOnGround = false
	endif
	if TM_CollisionUp()
		if plyDY < 0.0 then plyDY = 0.0

		tile[] = TM_ToTile(int(plyX) + width(plyImg)/2, int(plyY) - 16)
		if TM_GetCel(tile[TM_X], tile[TM_Y]) = 1
			proc TM_SetCel tile[TM_X], tile[TM_Y], 2
			centerX = tile[TM_X]*64 + 32
			centerY = tile[TM_Y]*64 + 32
			proc SP_AddParticle TM_GetImage(), 1, false, centerX, centerY, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.05, 0
			proc SP_AddParticle COIN_IMG, 0, false, centerX, centerY - 32, 0.0, -8.0, 0.0, 4.0, 1.0, 0.0, 0.025, 0
			proc AddBloodEffect int(plyX), int(plyY)
		endif
	endif
	
	rem Pick up coin. I think.
	t = TM_GetCelAt(int(plyX) + width(plyImg)/2, int(plyY) + height(plyImg)/2)
	if t = 24
		tp[] = TM_ToTile(int(plyX) + width(plyImg)/2, int(plyY) + height(plyImg)/2)
		proc TM_SetCel tp[TM_X], tp[TM_Y], -1
		proc AddBloodEffect int(plyX) + width(plyImg)/2, int(plyY) + height(plyImg)/2
	endif

	if int(plyY) > TM_WorldHeight() then end

	rem Set camera position.
	proc TM_SetCamera int(plyX) - (width(primary) - width(plyImg))/2, int(plyY) - (height(primary) - height(plyImg))/2

	rem Draw background.
	set color vBGColor[0], vBGColor[1], vBGColor[2]
	cls
	rem Draw tilemap.
	proc TM_Render

	rem Draw player.
	draw image plyImg, TM_ToScreenX(int(plyX)), TM_ToScreenY(int(plyY)), plyCel

	rem Update and draw particles.
	proc SP_DoParticlesAt -TM_CameraX(), -TM_CameraY()

	redraw
	proc SPD_HoldFrame 60

until keydown(27)

rem Load assets.
procedure LoadAssets()
	load image PLY_LEFT_IMG, "assets/ply_walk_left.bmp"
	load image PLY_RIGHT_IMG, "assets/ply_walk_right.bmp"
	set image grid PLY_LEFT_IMG, 11, 1
	set image grid PLY_RIGHT_IMG, 11, 1
	load image COIN_IMG, "assets/coin.bmp"
	load image BLOOD_IMG, "assets/blood.bmp"
	set image grid BLOOD_IMG, 8, 1
endproc

rem Add blood effect.
procedure AddBloodEffect(x, y)
	proc SP_SetPoofEndVector 0.0, 4.0
	proc SP_AddRandomPoof BLOOD_IMG, -1, x, y, 16, 16.0, 4.0, 0.035, false, false 
endproc