A Pico-8 port of the Atari Game "Fall Down"
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

219 lines
4.0 KiB

--fall down
--by michael clemens
--clone of the atari version from aaron curtis
--game
--x,y,spritefront,spritel,spriter,
--spritestate,playernumber,color,opp
passby=false
candie=false
blue={28,-20,4,2,3,"f",0,9,2,0}
red={100,-20,7,5,6,"f",1,10,1,0}
players={blue,red}
timecode=0
lines={
--y,color,elements
{-100,11,{11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11}},
{-100,11,{11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11}},
{-100,11,{11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11}},
{-100,11,{11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11}}
}
linecount=0
function ispingap(playery)
pisingap=false
for l=1,4 do
-- if player is inbetween a line
if (playery > lines[l][1]-3 and playery < lines[l][1]+3) then
pisingap=true
end
end
return pisingap
end
--todo: define range instead of point
function playersonsamelevel()
result=false
if (red[2]-4 < blue[2])
and blue[2] < red[2]+4 then
result=true
end
return result
end
function moveplayer(p)
opponent=players[p[9]]
--left
if btn (0,p[7]) then
--check if player is in between a line
if (ispingap(p[2])==false) then
--if ((opponent[1]+7 < p[1]+2)
if (p[1]!=opponent[1]+4
or not playersonsamelevel())
or passby then
p[1]-=2
end
end
if (p[1]<-8) then
p[1]=128
end
p[6]="l"
--right
elseif btn(1,p[7]) then
--check if player is in between a line
if (ispingap(p[2])==false) then
--if ((opponent[1]+2 > p[1]+6)
if (p[1]!=opponent[1]-4
or not playersonsamelevel())
or passby then
p[1]+=2
end
end
if (p[1]>128) then
p[1]=-4
end
p[6]="r"
else
p[6]="f"
end
end
--lets fall down the player
function falldown(player)
drop=true
--check all 4 lines
for l=1,4 do
-- if player stands on a line
if (player[2]+6==lines[l][1]) then
-- and there is no gap: dont drop
-- get one or both tile numbers under players feet
pposl=flr(player[1]/8)+1
pposr=flr((player[1]+8)/8)+1
if (lines[l][3][pposl]!=12
or lines[l][3][pposr]!=12) then
drop=false
end
end
--increment player score and change line color
if (player[2]==lines[l][1] and lines[l][2]==11) then
for y=1,16 do
if lines[l][3][y]==11 then
lines[l][3][y]=player[8]
end
end
player[10]+=1
end
end
--let player fall or not
if (drop==true)
and player[2]<120 then
player[2]+=1
else
player[2]-=1
end
--end
end
--draws 4 visible lines
function drawline()
--let lines appear on bottom of screen
for i=40,160,40 do
if (linecount==i) then
resetline(lines[linecount/40])
end
end
if (linecount==160) then
linecount=0
end
--draw the lines
for l=1,4 do
for i=1,16 do
spr(lines[l][3][i],(i-1)*8,lines[l][1])
end
lines[l][1]-=1
end
linecount+=1
end
--begins a line on white on bottom of page
function resetline(l)
c=11
l[3]={c,c,c,c,c,c,c,c,c,c,c,c,c,c,c,c}
l[1]=128
gaps={flr(rnd(16)),flr(rnd(16)),flr(rnd(16))}
for x=1,flr(rnd(2)+2) do
l[3][gaps[x]]=12
l[3][gaps[x]+1]=12
end
end
function drawdots()
--todo
end
function drawheader()
rectfill(0,0,128,15,0)
if blue[10]!=-1 then
print(blue[10],7,5,12)
else
print("dead",7,5,12)
end
if red[10]!=-1 then
print(red[10],112,5,8)
else
print("dead",112,5,8)
end
end
function drawplayers()
for p in all(players) do
if p[10]!=-1 then
if (p[6]=="r") then
spr(p[5],p[1],p[2])
elseif (p[6]=="l") then
spr(p[4],p[1],p[2])
else
spr(p[3],p[1],p[2])
end
end
end
end
function checkdeath(p)
--for p in all(players) do
if p[2]<0 and candie then
p[10]=-1
elseif p[2]>0 and not candie then
candie=true
end
--end
end
function drawtitlescreen()
--todo
end
function _update()
for p in all(players) do
if p[10]!=-1 then
moveplayer(p)
falldown(p)
checkdeath(p)
timecode+=1
end
end
end
function _draw()
-- clear the screen
rectfill(0,0, 128,128, 1)
drawline()
drawdots()
drawplayers()
drawheader()
--drawtitlescreen()
--print (flr(blue[1]/8),50,50,6)
end