06-07-2024, 11:38 AM
THE STARGATE
Don't sleep, your nightmare is coming ...
click each image to zoom in
Tips
- Each kind of weapons has certain number of power / bullet
- Switch your weapon when it has no power / bullet anymore
- Use gun or crossbow to shoot
- Use trident or bare hands for close combat
Control keys :
- W,A,S,D movement
- Mouse rotation
- ESC quit
- 1,2,3,4,5 select weapon
- left click to shoot
Don't sleep, your nightmare is coming ...
click each image to zoom in
Tips
- Each kind of weapons has certain number of power / bullet
- Switch your weapon when it has no power / bullet anymore
- Use gun or crossbow to shoot
- Use trident or bare hands for close combat
Control keys :
- W,A,S,D movement
- Mouse rotation
- ESC quit
- 1,2,3,4,5 select weapon
- left click to shoot
Code:
'========================================================================================
' THE STARGATE
' Don't sleep, your nightmare is coming ...
'
' Tips
' - Each kind of weapons has certain number of power / bullet
' - Switch your weapon when it has no power / bullet anymore
' - Use gun or crossbow to shoot
' - Use trident or bare hands for close combat
'
' Control keys :
' - W,A,S,D movement
' - Mouse rotation
' - ESC quit
' - 1,2,3,4,5 select weapon
' - left click to shoot
'
' Acknowledgement :
' - Marcus, enginea library, https://naalaa.com/forum/thread-124-post-929.html
' - Game assets
' *Building Pixel by LandEnd Studios https://isaquerr.itch.io/building-pixel
' *Free 3D Fps-Shooter Models | TurboSquid https://images.app.goo.gl/NQtoZhALCWDoYFPp6
' *Stealth Battle background music by Mark, meak363 from Pixabay.com
' *Different kinds of weapons such as trident, hands, crossbow of The Spriting Dark
' Carnival https://www.altarofstone.com/forums/viewtopic.php?t=42
' *Man Silhouette https://pixabay.com/vectors/man-silhouette-male-people-4329249/
' *Monster https://images.app.goo.gl/6HiZncjYoCaJ7zSr9
'========================================================================================
'----------------
' INITIALIZATION
'----------------
#win32
include "myassets/enginea.n7"
include "myassets/disclaimer.n7"
set window "stargate",1000,500,false
set redraw off
'constant
constant ENEMY_ID = 6
'color definition
visible white = [255,255,255]
visible black = [0,0,0]
visible green = [0,255,0,150]
visible darkgreen = [0,50,0]
visible red = [255,0,0]
visible gray = [0,0,0,150]
'set stage (view, fog, player, camera)
EA_SetView(primary, rad(65), 0.1,6)
EA_SetFog(EA_NORMAL, white[0],white[1],white[2])
'load game assets (font, music, weapon, map, player, enemy)
visible font20 = createfont("Courier New", 20, false, false, false, false)
visible font40 = createfont("Courier New", 40, false, false, false, false)
visible music_ = loadmusic("myassets/battle3.wav")
play music music_,1
visible weapon = []
visible w = 1
weapon[1] = loadimage("myassets/shooter.png")
weapon[2] = loadimage("myassets/crossbow.png")
weapon[3] = loadimage("myassets/triple.png")
weapon[4] = loadimage("myassets/hands.png")
visible info = []
info.gun = 2
info.crossbow = 2
info.trident = 2
info.barehands = 2
info.lifes = 100
visible abort = loadimage("myassets/abort.png")
visible failed = loadimage("myassets/failed.png")
visible enemy1 = loadimage("myassets/man.png",4,1)
visible enemy2 = loadimage("myassets/monster.png",4,1)
visible enemyBullet = loadimage("myassets/enemy_bullet.png",4,1)
visible playerBullet = []
playerBullet[1] = loadimage("myassets/shooter_bullet.png", 4, 1)
playerBullet[2] = loadimage("myassets/crossbow_arrow.png", 4, 1)
flags = EA_LoadMap("myassets/map.json")
visible player = unset
foreach f in flags
select f.flag
case "player"
player = CreatePlayer(f.x, f.floorY, f.z)
EA_AddObject(player)
EA_SetCamera(player)
case "monster"
o = CreateEnemy(f.x, f.ceilingY, f.z)
EA_AddObject(o)
endsel
next
Disclaimer()
'-------------------------
' MAIN (update,draw,run)
'-------------------------
EA_SetUpdateAction(Update)
EA_SetDrawAction(Draw)
EA_Run()
'------------------------
'-----------
' FUNCTIONS
'-----------
function Update(dt)
if keydown(KEY_ESCAPE,true) then
EA_SetDrawAction(Message(abort))
EA_Stop()
endif
if keydown(KEY_M) then stop music music_
endfunc
function Draw()
set color white
if keydown(KEY_1) then w=1 'gun shooter
if keydown(KEY_2) then w=2 'crossbow
if keydown(KEY_3) then w=3 'trident close combat
if keydown(KEY_4) then w=4 'bare hands close combat
draw image weapon[w],
(width(primary)-width(weapon[w]))/2 - 23 + cos(player.bobAngle*0.5)*player.bobEffect*8,
height(primary)-height(weapon[w])+15 + sin(player.bobAngle)*player.bobEffect*6,
0
' info box
set color gray
draw rect 20,20,200,200,1
set color white
set caret 40,40
wln "INFO BOX"
wln "-------------------"
wln "Weapon Power"
wln "1.Gun : " + info.gun
wln "2.Crossbow : " + info.crossbow
wln "3.Trident : " + info.trident
wln "4.Bare hands : " + info.barehands
wln
wln "Lifes : " + info.lifes
wln "-------------------"
' Crosshair.
if w=1 then
set color darkgreen
cx = width(primary)/2+ cos(player.bobAngle*0.5)*player.bobEffect*8
cy = height(primary)/2+10+ sin(player.bobAngle)*player.bobEffect*6
draw ellipse cx,cy, 20, 20, false
draw line cx-40, cy, cx+40, cy
draw line cx,cy-40, cx, cy+40
endif
'Player's angle and coordinates
angle = round(deg(player.Yaw())%360)'0=south, 90=west, 180= north, 270=east
x = round(player.X())
y = abs(round(player.Y()))
z = round(player.Z())
set font font20
'Compass
set color white
set caret 50,320; wln "Compass"
set color green
draw ellipse 80,410,70,70,1
set color darkgreen
draw ellipse 80,410,70,70
draw ellipse 80,410,60,60
draw ellipse 80,410,20,20
set color white
draw ellipse 80,410,10,10,1
needle = [
80-10*cos(rad(angle+180)),410-10*sin(rad(angle+180)),
80+70*cos(rad(angle+90)),410+70*sin(rad(angle+90)),
80+10*cos(rad(angle-180)),410+10*sin(rad(angle-180))
]
draw poly needle,1
draw line 80,410,80+70*cos(rad(angle+90)),410+70*sin(rad(angle+90))
'Map
size = 30
w_map = 7
h_map = 5
x_rect = width(primary)-w_map*size-40
z_rect = 340
set color green 'frame
draw rect x_rect,z_rect,(w_map+1)*size,h_map*size,1
set color darkgreen 'grid
for i = 0 to w_map+1 draw line x_rect+i*size,z_rect,x_rect+i*size,z_rect+h_map*size 'vertical
for i = 0 to h_map draw line x_rect,z_rect+i*size,x_rect+(w_map+1)*size,z_rect+i*size 'horiontal
'Player's position on the map
posx = x_rect+(w_map-x+2)*size
posz = z_rect+(z-2)*size
set color white
draw rect posx,posz,size,size,1
'Map title
set color white
set caret x_rect,z_rect-20; wln "Map "+x+","+y+","+z
set font 0 'default
endfunc
function CreatePlayer(x, y, z)
player = EA_FpsPlayer()
player.SetPos(x, y, z)
player.SetMouseSens(0.3)
player.bobAngle = 0
player.bobEffect = 0
player.stimer = 0
player.SetYaw(rad(180)) '0=south, 90=west, 180= north, 270=east
player.SetJumpKey(unset) 'disable jump (SPACE BAR)
player.Update = function(dt)
.bobAngle = (.bobAngle + 8*dt)%(PI*4)
.bobEffect = min(.bobEffect + 2.0*dt, 1)
.stimer = max(.stimer - dt, 0)
if mousebutton(0, true) and .stimer = 0 and (w=1 or w=2) then
'left mouse, gun shooter or crossbow
.stimer = 0.5
if w=1 and info.gun>0 then
EA_AddObject(CreatePlayerBullet(
playerBullet[w],
.X() + .DX()*0.2, .Y() - 0.3 + .DY()*0.2, .Z() + .DZ()*0.2,
.DX()*4, .DY()*4, .DZ()*4))
info.gun = info.gun - 1
endif
if w=2 and info.crossbow>0 then
EA_AddObject(CreatePlayerBullet(
playerBullet[w],
.X() + .DX()*0.2, .Y() - 0.3 + .DY()*0.2, .Z() + .DZ()*0.2,
.DX()*4, .DY()*4, .DZ()*4))
info.crossbow = info.crossbow - 1
endif
endif
endfunc
return player
endfunc
function CreatePlayerBullet(img, x, y, z, dx, dy, dz)
b = EA_Object()
b.SetPos(x, y, z)
b.SetSprite(img, 0, false)
b.SetHeight(height(img)/64)
b.SetRadius(0.5*width(img)/64)
b.dx = dx
b.dy = dy
b.dz = dz
b.numCels = cels(img)
b.cel = 0
b.Update = function(dt)
if .numCels > 1
.cel = (.cel + dt*30)%.numCels
.SetCel(int(.cel))
endif
res = .Move(.dx*dt, .dy*dt, .dz*dt, 0)
if res.any
EA_RemoveObject(this)
else
objs = .SectorObjects()
if objs and sizeof(objs)
for i = 0 to sizeof(objs) - 1
if objs[i].id = ENEMY_ID
if .CollidesWith(objs[i])
objs[i].Hit(.dx, .dz)
EA_RemoveObject(this) 'remove bullet
EA_RemoveObject(objs[i]) 'remove enemy
break
endif
endif
next
endif
endif
endfunc
return b
endfunc
function CreateEnemy(x, y, z)
enemy = EA_Object()
enemy.id = ENEMY_ID
enemy.state = 0 ' State 0 = falling, state 1 = on the gound.
enemy.SetSprite(enemy1, 0, true)
enemy.SetHeight(height(enemy1)/400)
enemy.SetRadius(0.5*width(enemy1)/400)
enemy.dy = 0.01 + rnd()/20 'vertical random speed
enemy.SetPos(x, y, z)
enemy.SetYaw(rad(rnd(360)))
enemy.cel = 0
enemy.push = 0
enemy.pushDX = 0
enemy.pushDZ = 0
enemy.Update = function(dt)
.stimer = max(.stimer - dt, 0)
if .stimer = 0 and .state=1
.stimer = 0.5
EA_AddObject(CreateEnemyBullet(
enemyBullet,
.X() + .DX()*0.2, .Y() - 0.3 + .DY()*0.2, .Z() + .DZ()*0.2,
.DX()*4, .DY()*4, .DZ()*4))
endif
.cel = (.cel + dt*4)%4 'animation
.SetCel(int(.cel)) 'animation
if .state = 0 'Falling from the sky (... ceiling).
res = .Move(0, .dy*dt, 0, 0) 'only move vertically
if res.g 'ground collision
.state = 1 'change state to 1
.dy = 1 'set gravity to 1
.SetSprite(enemy2, 0, true)
endif
else
res = .Move(.DX()*0.75*dt, .dy, .DZ()*0.75*dt, 0)
if res.w 'wall
.SetYaw(rad(deg(atan2(res.dx, res.dz)) - 90 + rnd()*180))
endif
.push = max(.push - 1.5*dt, 0)
endif
'collision enemy and player (close combat)
if .CollidesWith(player) and (w=3 or w=4) then
'close combat trident or barehands
if info.trident > 0 and w=3 then
EA_RemoveObject(this)
info.trident = info.trident - 1
endif
if info.barehands > 0 and w=4 then
EA_RemoveObject(this)
info.barehands = info.barehands - 1
endif
endif
'collision enemy and player (not close combat)
if .CollidesWith(player) and (w=1 or w=2) then 'not a close combat, only gun or crossbow
info.lifes = info.lifes - 1
if info.lifes<=0 then Message(failed)
set color red
draw rect 0,0,width(primary),height(primary),1
redraw
fwait 60
endif
endfunc
enemy.Hit = function(dx, dz)
.pushDX = .push*.pushDX + dx
.pushDZ = .push*.pushDZ + dz
.push = 1
.htimer = 0.15
endfunc
return enemy
endfunc
function CreateEnemyBullet(img, x, y, z, dx, dy, dz)
b = EA_Object()
b.SetPos(x, y, z)
b.SetSprite(img, 0, false)
b.SetHeight(height(img)/64)
b.SetRadius(0.5*width(img)/64)
b.dx = dx
b.dy = dy
b.dz = dz
b.numCels = cels(img)
b.cel = 0
b.Update = function(dt)
if .numCels > 1
.cel = (.cel + dt*30)%.numCels
.SetCel(int(.cel))
endif
res = .Move(.dx*dt, .dy*dt, .dz*dt, 0)
if res.any
EA_RemoveObject(this)
else
'collision detection enemy bullet and player
if .CollidesWith(player)
info.lifes = info.lifes - 1
if info.lifes<=0 then Message(failed)
set color red
draw rect 0,0,width(primary),height(primary),1
redraw
fwait 60
endif
endif
endfunc
return b
endfunc
function Message(img)
set color white
draw image img,(width(primary)-width(img))/2,(height(primary)-height(img))/2
set font font40
set caret width(primary)/2,height(primary)-50
center "Press ESC to continue"
redraw
do; wait 1 ;until keydown(KEY_ESCAPE,true)
set font 0 'default
Closing_Credits()
end
endfunc