Code:
'==============================================================================================
'THE DEVIL'S TRIANGLE v3
'Stage 1. Dangerous Mission
'Stage 2. Devil's Shadow
'
'Control Keys :
'- UP, DOWN move the plane (stage 1)
'- UP, LEFT,RIGHT move the jet's yoke (stage 2)
'- SPACE BAR shoot (stage 2)
'- ESC quit
'- M ON/OFF music
'- ENTER continue
'
'Acknowledgement :
'- s3d library, thanx to Marcus for push and pop transformation
'
'3D Model :
'- Voxel Plane by maxparata https://maxparata.itch.io/voxel-plane?download
'- Ball by @Spacemonkeyl_1458647 https://www.printables.com/model/651543-low-poly-ball/files
'
'Images and Sound :
'- Background image https://images.app.goo.gl/J2SdZoV6YyNRPXBM6
'- Cool Slow Rock by Nick Valerson https://pixabay.com/music/search/rock%20background%20music/
'- Fighter Jet Cockpit https://images.app.goo.gl/ouzXGwgNkwcMgCkc7
'- Yoke steering wheel https://images.app.goo.gl/2k42XiBYfLt2Nfk16
'- Skull island https://images.app.goo.gl/qBy2hv1UtFmnRXV98
'
'DISCLAIMER
'This tiny game is a work of fiction.
'It is a proof of 3D game concept using s3d library.
'It is not intended for commercial use and not for sale
'No person or entity associated with this game received payment
'or anything of value, or entered into any agreement,
'in connection with any game assets used in this game.
'Names, characters, places, events and incidents
'are either the products of the author’s imagination
'or used in a fictitious manner.
'Any resemblance to actual persons,
'living or dead, or actual events is purely coincidental.
'
'===============================================================================================
'----------------
' INITIALIZATION
'----------------
#win32
include "s3d.n7"; S3D_SetView(primary, rad(45), 0.1, 50)
include "plane/s3d_addon.n7"
include "plane/transform.n7"
set window "The Devil's Triangle",800,400,false
set redraw off
randomize clock()
'color definition
white = [255,255,255]
black = [0,0,0]
gray = [200,200,200]
red = [255,0,0,100]
yellow = [255,255,0,120]
'plane
plane = []
plane.model = S3D_LoadMesh("plane/Plane01.obj", 0.5,-0.5,0.5, false)
plane.rotate = 30
plane.rotype = 1
plane.x = -5 ; plane.y = 0 ; plane.z = 0
plane.music_ = loadmusic("plane/rock.wav")
plane.unmute = true
'explosion
explosion = []
explosion.model = S3D_LoadMesh("plane/explosion.obj",1,-1,1,false)
explosion.rotate = 0
explosion.rotype = 0
explosion.x = -5; explosion.y = 0 ; explosion.z = 0
'ball
ball = []
ball.count = 3
for i = 1 to ball.count
ball[i] = []
ball[i].model = S3D_LoadMesh("plane/icoball.obj",0.25,-0.25,0.25,false)
ball[i].rotate = 0
ball[i].rotype = 2
ball[i].x = rnd(7,10)
ball[i].y = rnd(-4,4)
ball[i].z = 0
ball[i].speed = rnd(3,5)/100
next
'background
back = []
back.sea = loadimage("plane/background.png")
back.x = 0 ; back.y = 0
'other initial value
info = []
info.score = 0
info.lifes = 5
info.font_ = loadfont("plane/meiryo24")
'------------
' DISCLAIMER
'------------
set color black; cls; set color white; set caret 50,50; set font 0
wln "DISCLAIMER"
wln
wln "This tiny game is a work of fiction."
wln "It is a proof of 3D game concept using s3d library."
wln "It is not intended for commercial use and not for sale"
wln "No person or entity associated with this game received payment"
wln "or anything of value, or entered into any agreement,"
wln "in connection with any game assets used in this game."
wln "Names, characters, places, events and incidents"
wln "are either the products of the author’s imagination"
wln "or used in a fictitious manner."
wln "Any resemblance to actual persons,"
wln "living or dead, or actual events is purely coincidental."
wln
wln "Press ENTER to continue"
redraw
do; wait 1; until keydown(KEY_RETURN,true)
'opening title
words = []
words[1] ="THE DEVIL'S TRIANGLE"
words[2] =""
words[3] ="In December 1945, Flight 19 - Avenger Torpedo Bombers"
words[4] ="disappeared over the Bermuda Triangle."
words[5] ="The Bermuda Triangle is known as The Devil's Triangle"
words[6] ="It is on an area bounded by Florida,Bermuda and Puerto Rico."
words[7] ="And now, you are assigned to investigate the area."
words[8] ="Beware, it is a dangerous area !"
words[9] =""
words[10] =""
words[11] =""
words[12] =""
words[13] =""
words[14] ="Please proceed to military airbase"
'--------
' TITLE
'--------
'text animation of opening title
set font info.font_
play music plane.music_,1 'loop
set music volume plane.music_, 0.25
for i = height(primary) to 30
set color black; cls; set color white
set caret width(primary)/2,i
for j = 1 to 14
center words[j]
next
redraw
fwait 30
next
'just an animation of 3D plane
plane.y = 2
do
set color black; cls; set color white; S3D_Clear()
set caret width(primary)/2,i
for j = 1 to 14
center words[j]
next
S3D_Translate(-1, 0, 5)
if plane.x < 7 then
plane.x = plane.x + 0.03
else
plane.x = -2
plane.y = rnd(0,2)
plane.rotype = 1
endif
plane.y = plane.y - 0.003
plane.rotate = (plane.rotate + 30*0.005)%360
S3D_Draw(plane.x,plane.y,plane.z,plane.rotype,plane.rotate,plane.model)
redraw
wait 1
until keydown(KEY_RETURN,true)
'reset to initial value
plane.rotate = 30
plane.rotype = 1
plane.x = -5
plane.y = 0
plane.z = 0
info.message =""
'----------------------------
' STAGE 1. DANGEROUS MISSION
'----------------------------
set color black; cls; set color white
set caret 50,50
wln "Stage 1 : DANGEROUS JOURNEY"
wln
wln "Press UP or DOWN continuously"
wln "Just avoid bombs as long as possible"
wln "Till you reach the devil's island"
wln
wln "Press ENTER to continue"
redraw
do;wait 1; until keydown(KEY_RETURN,true)
do
set color black; cls; set color white; S3D_Clear()
if keydown(KEY_ESCAPE,true) then end
'background music
if keydown(KEY_M,true)
plane.unmute = not plane.unmute
if plane.unmute then
play music plane.music_,1
set music volume plane.music_, 0.5
else
stop music plane.music_
endif
endif
'background image
draw image back.sea,back.x,back.y
draw image back.sea,back.x + width(primary),back.y
if back.x <= -width(primary) then
back.x = 0
else
back.x = back.x - 1.3
endif
'information
set color white
set caret 5,10
if plane.unmute then
wln "Background Music : ON"
else
wln "Background Music : OFF"
endif
wln "Score : "+int(info.score) ; info.score = info.score + 0.01
if info.lifes <0 then
do
set caret 5,height(primary)-50; wln "Insert COIN to continue (Y/N)";redraw
if keydown(KEY_N,true) then end
if keydown(KEY_Y,true) then info.lifes = 5
wait 2
until info.lifes = 5
endif
wln "Lifes : "+info.lifes
'x-axis, y-axis
'set color gray
'cx = width(primary)/2
'cy = height(primary)/2
'draw line cx,0,cx,cy*2
'draw line 0,cy,cx*2,cy
'plane control
if keydown(KEY_UP,true) then
if plane.y > -5 then
plane.y = plane.y - 0.08
plane.rotate = (plane.rotate + 90*0.03)%360
endif
endif
if keydown(KEY_DOWN,true) then
if plane.y < 5 then
plane.y = plane.y + 0.08
plane.rotate = (plane.rotate - 90*0.03)%360
endif
endif
if plane.y <= -5 then plane.y = 4
if plane.y >= 5 then plane.y = -4
' Move everything 10 units into the screen, it affect all other drawing
S3D_Translate(0, 0, 10)
S3D_Draw(plane.x,plane.y,plane.z,plane.rotype,plane.rotate,plane.model)
'Ball
for i = 1 to ball.count
ball[i].rotate = (ball[i].rotate + 30*0.03)%360
if ball[i].x >= -10 then
ball[i].x = ball[i].x - ball[i].speed
else
ball[i].x = rnd(7,10)
ball[i].y = rnd(-4,4)
ball[i].speed = rnd(3,5)/100
endif
S3D_Draw(ball[i].x,ball[i].y,ball[i].z,ball[i].rotype,ball[i].rotate,ball[i].model)
'Explosion
dbp = sqr(pow((ball[i].x-plane.x),2)+pow((ball[i].y-plane.y),2))
if dbp<=1 then
temp = ball[i].x
for j = 1 to ball.count
ball[j].x = rnd(7,10) 'reset position
next
set caret 5,height(primary)-50; wln "Press ENTER to continue"
S3D_Draw(temp,plane.y,explosion.z,explosion.rotype, explosion.rotate,explosion.model)
redraw
do; wait 1; until keydown(KEY_RETURN,true)
info.lifes = info.lifes - 1
endif
next
redraw
wait 1
until info.score >= 50
set caret 5,height(primary)-60
wln "Be ready for Stage 2"
wln "Press ENTER to continue"
redraw
do; wait 1; until keydown(KEY_RETURN,true)
'----------------------------
' STAGE 2. DEVIL'S SHADOW
'----------------------------
set color black; cls; set color white
set caret 50,50;
wln "Stage 2 : DEVIL'S SHADOW"
wln
wln "There are 3 possible enemy's positions"
wln " enemy on the left, LEFT then shoot with SPACE BAR"
wln " enemy at the center, UP then shoot with SPACE BAR"
wln " enemy on the right, RIGHT then shoot with SPACE BAR"
wln
wln "Shoot when an enemy is close enough"
wln "but not too close"
wln
wln
wln
wln "Press ENTER to continue"
redraw
do;wait 1; until keydown(KEY_RETURN,true)
'background image of stage 2
back.island = loadimage("plane/island.png")
back.scale = 1.2
'info
info.score = 0
info.status = ""
info.lifes = 3
info.shot = ""
'translate
translate = []
translate.x = 0
'jet
jet = []
jet.cockpit = loadimage("plane/cockpit.png")
jet.yoke = loadimage("plane/yoke.png")
jet.angle = 0
jet.position =""
'plane
plane.x1 = rnd(-3,3)
plane.x2 = rnd(-3,3)
plane.x3 = rnd(-3,3)
plane.y1 = rnd(-2,0)
plane.y2 = rnd(-2,0)
plane.y3 = rnd(-2,0)
plane.z1 = rnd(10,30)
plane.z2 = rnd(10,30)
plane.z3 = rnd(10,30)
plane.rotype = 2
plane.rotate = 90
plane.position1 =""
plane.position2 =""
plane.position3 =""
do
set color black; cls; set color white; S3D_Clear()
if keydown(KEY_ESCAPE,true) then end
'background music
if keydown(KEY_M,true)
plane.unmute = not plane.unmute
if plane.unmute then
play music plane.music_,1
set music volume plane.music_, 0.5
else
stop music plane.music_
endif
endif
'control
if keydown(KEY_RIGHT,true) then
jet.angle = rad(15)
jet.position = "right"
elseif keydown(KEY_LEFT,true) then
jet.angle = rad(-15)
jet.position = "left"
elseif keydown(KEY_UP,true) then
jet.angle = rad(0)
jet.position = "center"
endif
'enemy's plane
if plane.x1 = 0 then
plane.position1 = "center"
elseif plane.x1 > 0 then
plane.position1 = "right"
elseif plane.x1 < 0 then
plane.position1 = "left"
else
plane.position1 = ""
endif
if plane.x2 = 0 then
plane.position2 = "center"
elseif plane.x2 > 0 then
plane.position2 = "right"
elseif plane.x2 < 0 then
plane.position2 = "left"
else
plane.position2 = ""
endif
if plane.x3 = 0 then
plane.position3 = "center"
elseif plane.x3 > 0 then
plane.position3 = "right"
elseif plane.x3 < 0 then
plane.position3 = "left"
else
plane.position3 = ""
endif
'enemy's plane animation
S3D_Translate(translate.x, 0, 10)
if plane.z1 >= -7 then
plane.z1 = plane.z1 -0.1
info.status =""
elseif plane.z1 < -7 then
plane.x1 = rnd(-3,3)
plane.y1 = rnd(-2,0)
plane.z1 = 10
info.lifes = info.lifes - 1
set color red
draw rect 0,0,width(primary),height(primary),1
set color white
set caret 10,10
wln "You've been attacked !"
wln "You lost your life"
wln
wln "Press ENTER to continue"
redraw
do; wait 1 ; until keydown(KEY_RETURN,true)
endif
if (plane.z1 >-7 and plane.z1<-3) then
info.status = "SHOOT NOW !!!!"
tempx1 = plane.x1
tempy1 = plane.y1
tempz1 = plane.z1
if keydown(KEY_SPACE,true) and jet.position = plane.position1 then
info.score = info.score + 1
plane.x1 = rnd(-3,3)
plane.y1 = rnd(-2,0)
plane.z1 = 10
info.shot = "plane1"
endif
else
info.status = ""
endif
if plane.z2 >= -7 then
plane.z2 = plane.z2 -0.1
info.status =""
elseif plane.z2 < -7 then
plane.x2 = rnd(-3,3)
plane.y2 = rnd(-2,0)
plane.z2 = 20
info.lifes = info.lifes - 1
set color red
draw rect 0,0,width(primary),height(primary),1
set color white
set caret 10,10
wln "You've been attacked !"
wln "You lost your life"
wln
wln "Press ENTER to continue"
redraw
do; wait 1 ; until keydown(KEY_RETURN,true)
endif
if (plane.z2 >-7 and plane.z2<-3) then
info.status = "SHOOT NOW !!!!"
tempx2 = plane.x2
tempy2 = plane.y2
tempz2 = plane.z2
if keydown(KEY_SPACE,true) and jet.position = plane.position2 then
info.score = info.score + 1
plane.x2 = rnd(-3,3)
plane.y2 = rnd(-2,0)
plane.z2 = 20
info.shot = "plane2"
endif
else
info.status = ""
endif
if plane.z3 >= -7 then
plane.z3 = plane.z3 -0.1
info.status =""
elseif plane.z3 < -7 then
plane.x3 = rnd(-3,3)
plane.y3 = rnd(-2,0)
plane.z3 = 30
info.lifes = info.lifes - 1
set color red
draw rect 0,0,width(primary),height(primary),1
set color white
set caret 10,10
wln "You've been attacked !"
wln "You lost your life"
wln
wln "Press ENTER to continue"
redraw
do; wait 1 ; until keydown(KEY_RETURN,true)
endif
if (plane.z3 >-7 and plane.z3<-3) then
info.status = "SHOOT NOW !!!!"
tempx3 = plane.x3
tempy3 = plane.y3
tempz3 = plane.z3
if keydown(KEY_SPACE,true) and jet.position = plane.position3 then
info.score = info.score + 1
plane.x3 = rnd(-3,3)
plane.y3 = rnd(-2,0)
plane.z3 = 10
info.shot = "plane3"
endif
else
info.status = ""
endif
'background animation
back.scale = back.scale + 0.002
'Draw and Render
Draw(back.island,width(back.island)/2,height(back.island)/2-20,back.scale,jet.angle)
S3D_Draw(plane.x1,plane.y1,plane.z1,plane.rotype,plane.rotate,plane.model)
S3D_Draw(plane.x2,plane.y2,plane.z2,plane.rotype,plane.rotate,plane.model)
S3D_Draw(plane.x3,plane.y3,plane.z3,plane.rotype,plane.rotate,plane.model); S3D_Render()
if info.shot = "plane1" then
S3D_Draw(tempx1,tempy1,tempz1,0,0,explosion.model)
elseif info.shot = "plane2" then
S3D_Draw(tempx2,tempy2,tempz2,0,0,explosion.model)
elseif info.shot = "plane3" then
S3D_Draw(tempx3,tempy3,tempz3,0,0,explosion.model)
endif
Draw(jet.cockpit,width(primary)/2+10,230,1.6,jet.angle)
Draw(jet.yoke,width(primary)/2+10,360,1,jet.angle)
'information
set color white
set caret 5,10
if plane.unmute then
wln "Background Music : ON"
else
wln "Background Music : OFF"
endif
wln "Score : "+int(info.score)
wln "Lifes : "+info.lifes
wln
wln info.status
if info.shot="plane1" or info.shot="plane2" or info.shot="plane3" then
wln "Press ENTER to continue"
redraw
do; wait 1; until keydown(KEY_RETURN,true)
info.shot = ""
endif
if info.lifes <0 then
do
set caret 5,height(primary)-50; wln "Insert COIN to continue (Y/N)";redraw
if keydown(KEY_N,true) then end
if keydown(KEY_Y,true) then info.lifes = 3
wait 2
until info.lifes = 3
endif
redraw
wait 1
until info.score > 20
set caret 5,height(primary)-150
wln "Even though you've gone so far"
wln "The mystery is still unsolved"
wln "..."
wln
wln "Press ESCAPE to quit"
redraw
do; wait 1; until keydown(KEY_RETURN,true)