Right, Ive got an updated version, has both jump and crouching and crawling code. Its taken me a while so that the jumping allows you to land on boxes =)
Please post what you think, any criticism, ideas, or bugs/ problems that you find.
Controls:
WASD : Movement
QE : Lean
Mouse : look
LClick : shooting
RClick : Zoom
Shift : Sprint
C : Raise stance
V : Lower Stance
I think thats it.... Requires Sparkys plugin and IanM Matrix Utility Plugin.
Version with line concantenations (Easier to read)
`credits
//Camera - Object lock code - Milkman - http://forum.thegamecreators.com/?m=forum_view&t=99244&b=6
//Matrix Movement - Dark Coder - http://forum.thegamecreators.com/?m=forum_view&t=144237&b=1
// NEED TO SLOW IT DOWN!!!! THE SYNC STUFF WORKED BUT NOW ITS REALLY QUICK!!!
`setup
set display mode 1024,768,32
sync on : sync rate 50
autocam off : hide mouse
randomize 2
// scale as 1 world unit = 1/10 of a metre
type vector
x as float
y as float
z as float
endtype
type bullet
state as boolean
vel as vector
ang as vector
pos as vector
endtype
type gun
name as string
number as integer `weapon slot
weight as integer `in kilos, bout 3-7 av assault
size as vector `length
angle as vector
reload as integer `in millisecs
zoom_level as integer `magnification level
zoom as boolean `zoom active or sight
fire_rate as integer `shots per sec
accuracy as integer
mag_size as integer
mag_count as integer `to keep count
bullet_damage as integer `percent of health
bullet_speed as integer `metres per sec, bout 500 av for assault
endtype
type person
health as integer `100 for human, easy enemies are less, tanks/adats/buildings are more
pos as vector
head as vector
view as vector
firing as boolean
shotno as integer
vel as vector
run_state as integer ` 3 = running, 2 = walking, 1 = crawling
target as boolean
targetpos as vector
endtype
#constant enemynumber = 2
global elapsedtime# as float
player as person
dim enemies(enemynumber) as person
dim guns(0) as gun
dim enguns(enemynumber) as gun
gosub set_vars
make_objects()
position mouse 512,378
position camera 498,12,6
set camera range 1,3000
set camera fov 60
set ambient light 20
make light 1
position light 1,-100,1500,800
set point light 1, 500,0,500
make object sphere 1000,200
position object 1000,-100,1500,800
null = Make Matrix4( 1 )
null = Make Matrix4( 2 )
null = Make Matrix4( 3 )
null = Make Matrix4( 4 )
null = Make Vector3( 5 ) // lX
null = Make Vector3( 6 ) // lY
null = Make Vector3( 7 ) // lZ
starttime = timer()
do
elapsedtime#=(timer()-starttime)/1000.0
starttime = timer()
`move crosshairs
paste image 3,462,332,1
`gosub keyboard
Movement()
gosub Firing
gosub enemyai
gosub physics
if mouseclick() = 0 then click = 0
`extra features
`zoom
if mouseclick() = 2 and click = 0
click = 1
if guns(0).zoom = 0
guns(0).zoom = 1
set camera fov 20
else
if guns(0).zoom = 1
guns(0).zoom = 0
set camera fov 60
endif
endif
endif
if keystate(19) = 1 and press = 0 `r
press = 1
if guns(0).fire_rate = 10
guns(0).fire_rate = 1
else
guns(0).fire_rate = 10
endif
endif
if scancode() = 0
press = 0
endif
if shiftkey() = 1
player.run_state = 4
else
player.run_state = player.run_state
endif
if player.run_state = 4 and shiftkey() = 0
player.run_state = 3
endif
if shiftkey() = 0
if keystate(18) = 1
press = 1
player.view.z = -40.0
else
if keystate(16) = 1
press = 1
player.view.z = 40.0
else
player.view.z = 0.0
endif
endif
endif
if keystate(46) = 1 and press = 0 `c
press = 1
if player.run_state > 1
dec player.run_state
endif
endif
if keystate(47) = 1 and press = 0 `v
press = 1
if player.run_state < 3
inc player.run_state
endif
endif
if keystate(57) = 1 and spacepress = 0 `space
spacepress = 1
jump = 1
endif
if keystate(57) = 0 and jump = 0
spacepress = 0
endif
fps = 1/elapsedtime#
text 0, 0,str$(elapsedtime#)
text 0,10,str$(scancode())
text 0,20,str$(feet)
text 0,30,str$(player.vel.y)
text 0,40,str$(fps)
text 0,50,str$(player.pos.x)
text 0,60,str$(player.pos.y)
text 0,70,str$(player.pos.z)
text 0,90,str$(enemies(1).health)
text 0,100,str$(enemies(0).health)
text 0,110,str$(player.health)
gosub update
synctime# = synctime# + elapsedtime#
if synctime# > 0.01
sync
synctime# = 0
endif
loop
end
function make_objects()
`make player
make object box 1,8,20,5
position object 1,498,0,6
`make gun
make object box 2,2,5,50
make object box 3,2,10,6
make object box 4,2,2,20
make mesh from object 3,3
make mesh from object 4,4
add limb 2,1,3 : offset limb 2,1, 0,-5,0 `mag
add limb 2,2,4 : offset limb 2,2, 0,5,0 `scope
delete object 3 : delete object 4
delete mesh 3 : delete mesh 4
position object 2, 500,10,10 `gun
scale object 2,30,30,30
`join gun to player
make mesh from object 2,2
add limb 1,1,2
offset limb 1,1,2,8,8
delete mesh 2 : delete object 2
offset limb 1,0,0,10,0
link limb 1,0,1
`head
make object sphere 1000,5
make mesh from object 1000,1000
add limb 1,2,1000
delete object 1000 : delete mesh 1000
offset limb 1,2,0,10,0
link limb 1,0,2
position object 1,498,0,10
sc_setupobject 1,1,2
`make textures
create bitmap 1,300,100
set current bitmap 1
`make grass texture
ink rgb(17,187,26),rgb(17,187,26)
box 0,0,100,100
get image 1, 0,0,100,100
`make tracer texture
ink rgb(255,255,0),rgb(255,255,0)
box 100,0,200,100
get image 2,100,0,200,100
`make crosshairs
ink rgb(255,255,255),rgb(255,255,255)
line 250,0, 250,100
line 200,50, 300,50
get image 3, 200,0,300,100
set current bitmap 0
`dont need bullets to raycast
`make range
`make plain
make object plain 10,2000,2000
texture object 10,1
xrotate object 10,90
position object 10,500,0,500
sc_setupobject 10,4,2
`make obstacles
for blox = 400 to 450
make object cube blox,rnd(40)+2
position object blox, rnd(1000),object size y(blox)/2 ,rnd(1000)
sc_setupobject blox,3,2
next
`make enemy
make object box 200,8,20,5
color object 200,rgb(255,0,0)
offset limb 200,0,0,10,0
sc_setupobject 200,2,2
`clone enemy
for en = 1 to enemynumber
clone object 200+en,200
sc_setupobject 200+en,2,2
next en
endfunction
set_vars:
randomize timer()
guns(0).name = "m416"
guns(0).number = 1
guns(0).weight = 4
guns(0).size.x = 2
guns(0).size.y = 4
guns(0).size.z = 12
guns(0).angle.x = 0
guns(0).angle.y = 0
guns(0).angle.z = 0
guns(0).reload = 500
guns(0).zoom_level = 2
guns(0).zoom = 0
guns(0).fire_rate = 10
guns(0).accuracy = 5
guns(0).mag_size = 30
guns(0).mag_count = 0
guns(0).bullet_damage = 20
guns(0).bullet_speed = 8000
dim bullets(guns(0).mag_size) as bullet
for bul = 1 to guns(0).mag_size
bullets(bul).state = 0
bullets(bul).vel.x = 0
bullets(bul).vel.y = 0
bullets(bul).vel.z = 0
bullets(bul).ang.x = 0
bullets(bul).ang.y = 0
bullets(bul).pos.x = 498
bullets(bul).pos.y = 12
bullets(bul).pos.z = 6
next bul
for en = 0 to enemynumber
enguns(en).name = "m416"
enguns(en).number = 1
enguns(en).weight = 4
enguns(en).size.x = 2
enguns(en).size.y = 4
enguns(en).size.z = 12
enguns(en).angle.x = 0
enguns(en).angle.y = 0
enguns(en).angle.z = 0
enguns(en).reload = 1000
enguns(en).zoom_level = 2
enguns(en).zoom = 0
enguns(en).fire_rate = 10
enguns(en).accuracy = 5
enguns(en).mag_size = 30
enguns(en).mag_count = 0
enguns(en).bullet_damage = 10
enguns(en).bullet_speed = 8000
next
dim enbullets(enemynumber,enguns(0).mag_size) as bullet `enemy all use same gun, which for now shall be gun 0
dim enreload(enemynumber)
for en = 0 to enemynumber
enemies(en).health = 100
enemies(en).pos.x = rnd(1000)
enemies(en).pos.y = 0
enemies(en).pos.z = rnd(1000)
enemies(en).view.x = 0
enemies(en).view.y = rnd(360)
enemies(en).view.z = 0
enemies(en).target = 0
enemies(en).firing = 0
next
player.health = 100
player.pos.x = rnd(1000)
player.pos.y = 0
player.pos.z = rnd(1000)
player.view.x = 0
player.view.y = rnd(360)
player.view.z = 0
player.run_state = 3 `walk upright
randomize 2
return
`locks an object to the screen with offsets
function lockObjectToCamera(object as integer,xOff as float,yOff as float,zOff as float)
sx as float : sy as float : sz as float
cx as float : cy as float : cz as float
xPos as float : yPos as float : zPos as float
sx = sin(camera angle x()) : cx = cos(camera angle x())
sy = sin(camera angle y()) : cy = cos(camera angle y())
sz = sin(camera angle z()) : cz = cos(camera angle z())
xPos = camera position x() + xOff*(cy*cz) + yOff*(sx*sy*cz-cx*sz) + zOff*(cx*sy*cz+sx*sz)
yPos = camera position y() + xOff*(cy*sz) + yOff*(cx*cz+sx*sy*sz) + zOff*(cx*sy*sz-sx*cz)
zPos = camera position z() + xOff*(-1*sy) + yOff*(sx*cy) + zOff*(cx*cy)
position object object,xPos,yPos,zPos
set object to camera orientation object
endfunction
function lockCameraToObject(camera as integer,lockTo as integer,xOff as float,yOff as float,zOff as float)
sx as float : sy as float : sz as float
cx as float : cy as float : cz as float
xPos as float : yPos as float : zPos as float
sx = sin(object angle x(lockTo)) : cx = cos(object angle x(lockTo))
sy = sin(object angle y(lockTo)) : cy = cos(object angle y(lockTo))
sz = sin(object angle z(lockTo)) : cz = cos(object angle z(lockTo))
xPos = object position x(lockTo) + xOff*(cy*cz) + yOff*(sx*sy*cz-cx*sz) + zOff*(cx*sy*cz+sx*sz)
yPos = object position y(lockTo) + xOff*(cy*sz) + yOff*(cx*cz+sx*sy*sz) + zOff*(cx*sy*sz-sx*cz)
zPos = object position z(lockTo) + xOff*(-1*sy) + yOff*(sx*cy) + zOff*(cx*cy)
position camera camera,xPos,yPos,zPos
`set camera to object orientation camera,lockTo
xrotate camera camera,player.view.x
yrotate camera camera,player.view.y
endfunction
function camera(cam,obj,limb)
position camera cam, limb position x(obj,limb),limb position y(obj,limb),limb position z(obj,limb)`-50
xrotate camera cam,player.view.x
yrotate camera cam,player.view.y
endfunction
function Movement()
rX# = player.view.x
ry# = player.view.y
rz# = 0
Set Vector3 5, 1.0, 0.0, 0.0
Build Rotation Axis Matrix4 1, 5, rX# * 0.017453292519943295769236907684886
Set Vector3 5, 0.0, 1.0, 0.0
Build Rotation Axis Matrix4 2, 5, rY# * 0.017453292519943295769236907684886
Set Vector3 5, 0.0, 0.0, 1.0
Build Rotation Axis Matrix4 3, 5, rZ# * 0.017453292519943295769236907684886
Multiply Matrix4 4, 1, 2
Multiply Matrix4 4, 4, 3
Set Vector3 5, 1.0, 0.0, 0.0
Transform Coords Vector3 5, 5, 4
Set Vector3 6, 0.0, 1.0, 0.0
Transform Coords Vector3 6, 6, 4
Set Vector3 7, 0.0, 0.0, 1.0
Transform Coords Vector3 7, 7, 4
select player.run_state
case 1,2,3
movementx# = ( Keystate(32) - Keystate(30) ) * 0.5*player.run_state
movementz# = ( Keystate(17) - Keystate(31) ) * 0.5*player.run_state
endcase
case 4
movementx# = ( Keystate(32) - Keystate(30) ) * 1.1*player.run_state
movementz# = ( Keystate(17) - Keystate(31) ) * 1.1*player.run_state
endcase
endselect
x# = player.pos.x + X Vector3( 5 ) * movementx#
y# = player.pos.y + Y Vector3( 5 ) * movementx#
z# = player.pos.z + Z Vector3( 5 ) * movementx#
x# = x# + X Vector3( 6 ) * movementY#
y# = y# + Y Vector3( 6 ) * movementY#
z# = z# + Z Vector3( 6 ) * movementY#
x# = x# + X Vector3( 7 ) * movementz#
y# = y# + Y Vector3( 7 ) * movementz#
z# = z# + Z Vector3( 7 ) * movementz#
player.vel.x = x# - player.pos.x
player.vel.y = y# - player.pos.y
player.vel.z = z# - player.pos.z
`control viewing
if guns(0).zoom = 0
player.view.y = player.view.y + mousemovex()/5.0
player.view.x = player.view.x + mousemovey()/5.0
else
player.view.y = player.view.y + (1.0/guns(0).zoom_level)*(mousemovex()/5.0)
player.view.x = player.view.x + (1.0/guns(0).zoom_level)*(mousemovey()/5.0)
endif
player.head.x = limb position x(1,2)
player.head.y = limb position y(1,2)
player.head.z = limb position z(1,2)
Endfunction
Firing:
`fire
if mouseclick() = 1 and reload = 0
if guns(0).fire_rate = 1
if click = 0
click = 1
inc guns(0).mag_count
bullets(guns(0).mag_count).state = 1
bullets(guns(0).mag_count).ang.y = player.view.y
bullets(guns(0).mag_count).ang.x = player.view.x
bullets(guns(0).mag_count).pos.x = player.head.x
bullets(guns(0).mag_count).pos.y = player.head.y
bullets(guns(0).mag_count).pos.z = player.head.z
bullets(guns(0).mag_count).vel.x = sin(player.view.y) * guns(0).bullet_speed * elapsedtime#
bullets(guns(0).mag_count).vel.y = -sin(player.view.x) * guns(0).bullet_speed * elapsedtime#
bullets(guns(0).mag_count).vel.z = cos(player.view.y) * guns(0).bullet_speed * elapsedtime#
`recoil
player.view.x = player.view.x - 0.1
player.view.y = player.view.y +(rnd(6)/10.0) - 0.3
endif
else
if gt = 0
gt = timer()
st = timer()
endif
if st <= gt + 100
st = timer()
else
gt = timer()
inc guns(0).mag_count
bullets(guns(0).mag_count).state = 1
bullets(guns(0).mag_count).ang.y = player.view.y
bullets(guns(0).mag_count).ang.x = player.view.x
bullets(guns(0).mag_count).pos.x = player.head.x
bullets(guns(0).mag_count).pos.y = player.head.y
bullets(guns(0).mag_count).pos.z = player.head.z
bullets(guns(0).mag_count).vel.x = sin(player.view.y) * guns(0).bullet_speed * elapsedtime#
bullets(guns(0).mag_count).vel.y = -sin(player.view.x) * guns(0).bullet_speed * elapsedtime#
bullets(guns(0).mag_count).vel.z = cos(player.view.y) * guns(0).bullet_speed * elapsedtime#
`recoil
player.view.x = player.view.x - 0.1
player.view.y = player.view.y +(rnd(6)/10.0) - 0.3
endif
endif
if guns(0).mag_count >= guns(0).mag_size
reload = 1
endif
endif
`reload
if reload = 1 and click = 0
inc t
if t = 50
t = 0
reload = 0
guns(0).mag_count = 0
for bul = 1 to guns(0).mag_size
bullets(bul).state = 0
bullets(guns(0).mag_count).pos.x = player.head.x
bullets(guns(0).mag_count).pos.y = player.head.y
bullets(guns(0).mag_count).pos.z = player.head.z
bullets(bul).vel.x = 0
bullets(bul).vel.y = 0
bullets(bul).vel.z = 0
next bul
endif
endif
Return
enemyai:
for en = 0 to enemynumber
enemies(en).run_state = 3
if enemies(en).health > 0
if enemies(en).target = 0 and enemies(en).firing = 0
enemies(en).target = 1
enemies(en).targetpos.x = rnd(2000)-500
enemies(en).targetpos.z = rnd(2000)-500
dx# = enemies(en).targetpos.x - enemies(en).pos.x
dz# = enemies(en).targetpos.z - enemies(en).pos.z
enemies(en).view.y = atanfull(dx#,dz#)
enemies(en).vel.x = sin(enemies(en).view.y) * enemies(en).run_state
enemies(en).vel.y = -sin(enemies(en).view.x) * enemies(en).run_state
enemies(en).vel.z = cos(enemies(en).view.y) * enemies(en).run_state
endif
if enemies(en).pos.x > enemies(en).targetpos.x-10
if enemies(en).pos.x < enemies(en).targetpos.x+10
if enemies(en).pos.z > enemies(en).targetpos.z-10
if enemies(en).pos.z < enemies(en).targetpos.z+10
enemies(en).target = 0
endif
endif
endif
endif
`work out differences in position
dx# = player.pos.x - enemies(en).pos.x
dy# = player.pos.y - enemies(en).pos.y
dz# = player.pos.z - enemies(en).pos.z
if vector exist(8) = 0 `has to be 8 since i have 7 world matrix4's for movement
null = make vector3 (8)
endif
set vector3 8, dx#, dy#, dz#
l3# = length vector3(8)
if vector exist(9) = 0
null = make vector2 (9)
endif
set vector2 9, dx#, dz#
l2# = length vector2(9)
ang# = atanfull(dx# , dz#)
angx# = atanfull(dy# , l2#)
if ang# > enemies(en).view.y - 45 and ang# < enemies(en).view.y + 45
hit = sc_raycast(0, enemies(en).pos.x, enemies(en).pos.y, enemies(en).pos.z, ...
player.pos.x, player.pos.y, player.pos.z, 0)
if hit = 1
`player is in line of sight
color object 200, rgb(0,255,0)
enemies(en).view.y = ang#
enemies(en).view.x = angx#
enemies(en).firing = 1
else
color object 200, rgb(255,0,0)
enemies(en).firing = 0
endif
else
color object 200, rgb(255,0,0)
enemies(en).firing = 0
endif
else
enemies(en).firing = 0 `if dead dont shoot
endif
next
gosub enemyfiring
return
enemyfiring:
for en = 0 to enemynumber
if enemies(en).firing = 1 and enreload(en) <> 1
enemies(en).target = 0
enemies(en).vel.x = 0
enemies(en).vel.y = 0
enemies(en).vel.z = 0
if egt = 0
egt = timer()
est = timer()
endif
if est <= egt + 100
est = timer()
else
egt = timer()
inc enguns(en).mag_count
enbullets(en,enguns(en).mag_count).state = 1
enbullets(en,enguns(en).mag_count).ang.y = enemies(en).view.y + rnd(20.0)/10.0 - 1.0
enbullets(en,enguns(en).mag_count).ang.x = enemies(en).view.x + rnd(20.0)/10.0 - 1.0
enbullets(en,enguns(en).mag_count).pos.x = enemies(en).pos.x
enbullets(en,enguns(en).mag_count).pos.y = enemies(en).pos.y+19
enbullets(en,enguns(en).mag_count).pos.z = enemies(en).pos.z
enbullets(en,enguns(en).mag_count).vel.x = sin(enbullets(en,enguns(en).mag_count).ang.y) * enguns(en).bullet_speed * elapsedtime#
enbullets(en,enguns(en).mag_count).vel.y = -sin(enbullets(en,enguns(en).mag_count).ang.x) * enguns(en).bullet_speed * elapsedtime#
enbullets(en,enguns(en).mag_count).vel.z = cos(enbullets(en,enguns(en).mag_count).ang.y) * enguns(en).bullet_speed * elapsedtime#
remstart
`recoil
enemies(en).view_angle_x = enemies(en).view_angle_x - 0.1
enemies(en).view_angle_y = enemies(en).view_angle_y +(rnd(6)/10.0) - 0.3
remend
endif
if enguns(en).mag_count >= enguns(en).mag_size
enreload(en) = 1
endif
endif
`reload
if enreload(en) = 1
inc et
if et >= 50
et = 0
enreload(en) = 0
enguns(en).mag_count = 0
for ebul = 1 to enguns(en).mag_size
enbullets(en,ebul).state = 0
enbullets(en,ebul).pos.x = enemies(en).pos.x
enbullets(en,ebul).pos.y = enemies(en).pos.y+19
enbullets(en,ebul).pos.z = enemies(en).pos.z
enbullets(en,ebul).vel.x = 0
enbullets(en,ebul).vel.y = 0
enbullets(en,ebul).vel.z = 0
next ebul
endif
endif
next
return
physics:
`jumping needs to be done first else collision with vel.y doesnt work
if jump = 1
inc h,5 `speed of jump
player.vel.y = cos(h) `height ''
if h > 180 or bottom > 0
h = 0
jump = 0
endif
else
player.vel.y = -38 * elapsedtime#
endif
`walking collision player
`top and bottom checks for collision, will help to determine object height later on.
`bottom is at waist height so can "stride" over some objects
top = sc_spherecastgroup(3, player.pos.x, player.pos.y+15, player.pos.z, ...
player.pos.x + player.vel.x, player.pos.y + player.vel.y + 15, player.pos.z + player.vel.z , 5, 0)
middle = sc_spherecastgroup(3, player.pos.x, player.pos.y+10, player.pos.z, ...
player.pos.x + player.vel.x, player.pos.y + player.vel.y + 10, player.pos.z + player.vel.z , 5, 0)
if top <> 0 and middle <> 0
player.pos.x = sc_getcollisionslidex()
`player.pos.y = sc_getcollisionslidey()
player.pos.z = sc_getcollisionslidez()
endif
feet = sc_raycast(0,player.pos.x, player.pos.y+20, player.pos.z, ...
player.pos.x + player.vel.x, player.pos.y + player.vel.y, player.pos.z + player.vel.z ,1)
if feet <> 0
select player.run_state
case 4,3
player.pos.y = 100.1 - sc_intersectobject(feet,player.pos.x, 100, player.pos.z, ...
player.pos.x + player.vel.x, -10, player.pos.z + player.vel.z)
endcase
case 2
player.pos.y = 90.1 - sc_intersectobject(feet,player.pos.x, 100, player.pos.z, ...
player.pos.x + player.vel.x, -10, player.pos.z + player.vel.z)
endcase
case 1
player.pos.y = 93.1 - sc_intersectobject(feet,player.pos.x, 100, player.pos.z, ...
player.pos.x + player.vel.x, -10, player.pos.z + player.vel.z)
endcase
endselect
endif
player.pos.x = player.pos.x + player.vel.x
player.pos.y = player.pos.y + player.vel.y
player.pos.z = player.pos.z + player.vel.z
`player bullet collision
for bul = 1 to guns(0).mag_count
if bullets(bul).state = 1
`check walls
walled = sc_raycastgroup(3, bullets(bul).pos.x , bullets(bul).pos.y , bullets(bul).pos.z , ...
bullets(bul).pos.x +bullets(bul).vel.x, bullets(bul).pos.y+ bullets(bul).vel.y, ...
bullets(bul).pos.z+ bullets(bul).vel.z,1)
if walled > 0
bullets(bul).state = 0
bullets(guns(0).mag_count).pos.x = player.head.x
bullets(guns(0).mag_count).pos.y = player.head.y
bullets(guns(0).mag_count).pos.z = player.head.z
bullets(bul).vel.x = 0
bullets(bul).vel.y = 0
bullets(bul).vel.z = 0
else
`hit
hit = sc_raycastgroup(2, bullets(bul).pos.x , bullets(bul).pos.y , bullets(bul).pos.z , ...
bullets(bul).pos.x +bullets(bul).vel.x, bullets(bul).pos.y+ bullets(bul).vel.y, ...
bullets(bul).pos.z+ bullets(bul).vel.z,1)
if hit > 0
bullets(bul).state = 0
bullets(guns(0).mag_count).pos.x = player.head.x
bullets(guns(0).mag_count).pos.y = player.head.y
bullets(guns(0).mag_count).pos.z = player.head.z
bullets(bul).vel.x = 0
bullets(bul).vel.y = 0
bullets(bul).vel.z = 0
x# = sc_getstaticcollisionx()
y# = sc_getstaticcollisiony()
z# = sc_getstaticcollisionz()
enemies(hit-200).health = enemies(hit-200).health - guns(0).bullet_damage
else
bullets(bul).pos.x = bullets(bul).pos.x + bullets(bul).vel.x
bullets(bul).pos.y = bullets(bul).pos.y + bullets(bul).vel.y
bullets(bul).pos.z = bullets(bul).pos.z + bullets(bul).vel.z
endif
endif
if object exist(500) = 0
make object plain 500,0.3,3
texture object 500, 2
set object emissive 500,rgb(255,255,0)
endif
position object 500, bullets(bul).pos.x , bullets(bul).pos.y , bullets(bul).pos.z
yrotate object 500, player.view.y
`miss
if bullets(bul).pos.y < 0
bullets(bul).state = 0
bullets(guns(0).mag_count).pos.x = player.head.x
bullets(guns(0).mag_count).pos.y = player.head.y
bullets(guns(0).mag_count).pos.z = player.head.z
bullets(bul).vel.x = 0
bullets(bul).vel.y = 0
bullets(bul).vel.z = 0
endif
endif
next bul
`enemy walking collision
for en = 0 to enemynumber
walk = sc_sphereslidegroup(3, enemies(en).pos.x, enemies(en).pos.y+15, enemies(en).pos.z, ...
enemies(en).pos.x + enemies(en).vel.x, enemies(en).pos.y + enemies(en).vel.y+15, ...
enemies(en).pos.z + enemies(en).vel.z , 5, 0)
if walk = 0
enemies(en).pos.x = enemies(en).pos.x + enemies(en).vel.x
enemies(en).pos.y = enemies(en).pos.y + enemies(en).vel.y
enemies(en).pos.z = enemies(en).pos.z + enemies(en).vel.z
else
enemies(en).pos.x = sc_getcollisionslidex()
enemies(en).pos.y = sc_getcollisionslidey()
enemies(en).pos.z = sc_getcollisionslidez()
endif
`enemy bullets collision
for ebul = 1 to enguns(en).mag_count
if enbullets(en,ebul).state = 1
`check for walls
ewalled = sc_raycastgroup(3,enbullets(en,ebul).pos.x,enbullets(en,ebul).pos.y,enbullets(en,ebul).pos.z,...
enbullets(en,ebul).pos.x + enbullets(en,ebul).vel.x, enbullets(en,ebul).pos.y + enbullets(en,ebul).vel.y, ...
enbullets(en,ebul).pos.z + enbullets(en,ebul).vel.z, en)
if ewalled > 0
enbullets(en,ebul).state = 0
enbullets(en,ebul).pos.x = enemies(en).pos.x
enbullets(en,ebul).pos.y = enemies(en).pos.y+19
enbullets(en,ebul).pos.z = enemies(en).pos.z
enbullets(en,ebul).vel.x = 0
enbullets(en,ebul).vel.y = 0
enbullets(en,ebul).vel.z = 0
else
`hit
ehit = sc_raycast(1,enbullets(en,ebul).pos.x,enbullets(en,ebul).pos.y,enbullets(en,ebul).pos.z,...
enbullets(en,ebul).pos.x + enbullets(en,ebul).vel.x, enbullets(en,ebul).pos.y + enbullets(en,ebul).vel.y, ...
enbullets(en,ebul).pos.z + enbullets(en,ebul).vel.z, en)
if ehit > 0
enbullets(en,ebul).state = 0
enbullets(en,ebul).pos.x = enemies(en).pos.x
enbullets(en,ebul).pos.y = enemies(en).pos.y+19
enbullets(en,ebul).pos.z = enemies(en).pos.z
enbullets(en,ebul).vel.x = 0
enbullets(en,ebul).vel.y = 0
enbullets(en,ebul).vel.z = 0
ex# = sc_getstaticcollisionx()
ey# = sc_getstaticcollisiony()
ez# = sc_getstaticcollisionz()
player.health = player.health - enguns(en).bullet_damage
else
enbullets(en,ebul).pos.x = enbullets(en,ebul).pos.x + enbullets(en,ebul).vel.x
enbullets(en,ebul).pos.y = enbullets(en,ebul).pos.y + enbullets(en,ebul).vel.y
enbullets(en,ebul).pos.z = enbullets(en,ebul).pos.z + enbullets(en,ebul).vel.z
endif
endif
if object exist(503+en) = 0
make object plain 503+en,0.3,3
texture object 503+en, 2 `rgb(255,255,0)
set object specular 503+en,rgb(255,255,0)
endif
position object 503+en,enbullets(en,ebul).pos.x,enbullets(en,ebul).pos.y,enbullets(en,ebul).pos.z
yrotate object 503+en, enbullets(en,enguns(en).mag_count).ang.y
`miss
if enbullets(en,ebul).pos.y < 0
enbullets(en,ebul).state = 0
enbullets(en,ebul).pos.x = enemies(en).pos.x
enbullets(en,ebul).pos.y = enemies(en).pos.y+19
enbullets(en,ebul).pos.z = enemies(en).pos.z
enbullets(en,ebul).vel.x = 0
enbullets(en,ebul).vel.y = 0
enbullets(en,ebul).vel.z = 0
endif
endif
next ebul
next en
return
update:
`player
leanangle# = curveangle(player.view.z,limb angle z(1,0),6)
position object 1, player.pos.x, player.pos.y, player.pos.z
rotate object 1,player.view.x,player.view.y,0.0
if player.run_state = 1
rotate limb 1,0,90,0.0,leanangle#
rotate limb 1,1,-90,0.0,leanangle#
offset limb 1,1,1.5,13,1 `y and z seem to have swapped.... y move forward and z up/down
else
rotate limb 1,0,0.0,0.0,leanangle#
rotate limb 1,1,0.0,0.0,leanangle#
offset limb 1,1,2,8,8
endif
sc_updateobject 1
`lockObjectToCamera(1,0.0,-11.0,0.0)
`lockCameraToObject(0,1,0.0,18.0,-100.0)
camera(0,1,2)
`enemies
for en = 0 to enemynumber
if enemies(en).health > 0
yrotate object 200+en, enemies(en).view.y
`move object 200, 2
enemies(en).pos.y = 100 - sc_intersectobject(10,enemies(en).pos.x,100,enemies(en).pos.z,...
enemies(en).pos.x,0,enemies(en).pos.z)
position object 200+en,enemies(en).pos.x,enemies(en).pos.y,enemies(en).pos.z
sc_updateobject 200+en
endif
next
return
if memblock exist(1) then delete memblock 1
Version with out ... symbol
`credits
//Camera - Object lock code - Milkman - http://forum.thegamecreators.com/?m=forum_view&t=99244&b=6
//Matrix Movement - Dark Coder - http://forum.thegamecreators.com/?m=forum_view&t=144237&b=1
// NEED TO SLOW IT DOWN!!!! THE SYNC STUFF WORKED BUT NOW ITS REALLY QUICK!!!
`setup
set display mode 1024,768,32
sync on : sync rate 50
autocam off : hide mouse
randomize 2
// scale as 1 world unit = 1/10 of a metre
type vector
x as float
y as float
z as float
endtype
type bullet
state as boolean
vel as vector
ang as vector
pos as vector
endtype
type gun
name as string
number as integer `weapon slot
weight as integer `in kilos, bout 3-7 av assault
size as vector `length
angle as vector
reload as integer `in millisecs
zoom_level as integer `magnification level
zoom as boolean `zoom active or sight
fire_rate as integer `shots per sec
accuracy as integer
mag_size as integer
mag_count as integer `to keep count
bullet_damage as integer `percent of health
bullet_speed as integer `metres per sec, bout 500 av for assault
endtype
type person
health as integer `100 for human, easy enemies are less, tanks/adats/buildings are more
pos as vector
head as vector
view as vector
firing as boolean
shotno as integer
vel as vector
run_state as integer ` 3 = running, 2 = walking, 1 = crawling
target as boolean
targetpos as vector
endtype
#constant enemynumber = 2
global elapsedtime# as float
player as person
dim enemies(enemynumber) as person
dim guns(0) as gun
dim enguns(enemynumber) as gun
gosub set_vars
make_objects()
position mouse 512,378
position camera 498,12,6
set camera range 1,3000
set camera fov 60
set ambient light 20
make light 1
position light 1,-100,1500,800
set point light 1, 500,0,500
make object sphere 1000,200
position object 1000,-100,1500,800
null = Make Matrix4( 1 )
null = Make Matrix4( 2 )
null = Make Matrix4( 3 )
null = Make Matrix4( 4 )
null = Make Vector3( 5 ) // lX
null = Make Vector3( 6 ) // lY
null = Make Vector3( 7 ) // lZ
starttime = timer()
do
elapsedtime#=(timer()-starttime)/1000.0
starttime = timer()
`move crosshairs
paste image 3,462,332,1
`gosub keyboard
Movement()
gosub Firing
gosub enemyai
gosub physics
if mouseclick() = 0 then click = 0
`extra features
`zoom
if mouseclick() = 2 and click = 0
click = 1
if guns(0).zoom = 0
guns(0).zoom = 1
set camera fov 20
else
if guns(0).zoom = 1
guns(0).zoom = 0
set camera fov 60
endif
endif
endif
if keystate(19) = 1 and press = 0 `r
press = 1
if guns(0).fire_rate = 10
guns(0).fire_rate = 1
else
guns(0).fire_rate = 10
endif
endif
if scancode() = 0
press = 0
endif
if shiftkey() = 1
player.run_state = 4
else
player.run_state = player.run_state
endif
if player.run_state = 4 and shiftkey() = 0
player.run_state = 3
endif
if shiftkey() = 0
if keystate(18) = 1
press = 1
player.view.z = -40.0
else
if keystate(16) = 1
press = 1
player.view.z = 40.0
else
player.view.z = 0.0
endif
endif
endif
if keystate(46) = 1 and press = 0 `c
press = 1
if player.run_state > 1
dec player.run_state
endif
endif
if keystate(47) = 1 and press = 0 `v
press = 1
if player.run_state < 3
inc player.run_state
endif
endif
if keystate(57) = 1 and spacepress = 0 `space
spacepress = 1
jump = 1
endif
if keystate(57) = 0 and jump = 0
spacepress = 0
endif
fps = 1/elapsedtime#
text 0, 0,str$(elapsedtime#)
text 0,10,str$(scancode())
text 0,20,str$(feet)
text 0,30,str$(player.vel.y)
text 0,40,str$(fps)
text 0,50,str$(player.pos.x)
text 0,60,str$(player.pos.y)
text 0,70,str$(player.pos.z)
text 0,90,str$(enemies(1).health)
text 0,100,str$(enemies(0).health)
text 0,110,str$(player.health)
gosub update
synctime# = synctime# + elapsedtime#
if synctime# > 0.01
sync
synctime# = 0
endif
loop
end
function make_objects()
`make player
make object box 1,8,20,5
position object 1,498,0,6
`make gun
make object box 2,2,5,50
make object box 3,2,10,6
make object box 4,2,2,20
make mesh from object 3,3
make mesh from object 4,4
add limb 2,1,3 : offset limb 2,1, 0,-5,0 `mag
add limb 2,2,4 : offset limb 2,2, 0,5,0 `scope
delete object 3 : delete object 4
delete mesh 3 : delete mesh 4
position object 2, 500,10,10 `gun
scale object 2,30,30,30
`join gun to player
make mesh from object 2,2
add limb 1,1,2
offset limb 1,1,2,8,8
delete mesh 2 : delete object 2
offset limb 1,0,0,10,0
link limb 1,0,1
`head
make object sphere 1000,5
make mesh from object 1000,1000
add limb 1,2,1000
delete object 1000 : delete mesh 1000
offset limb 1,2,0,10,0
link limb 1,0,2
position object 1,498,0,10
sc_setupobject 1,1,2
`make textures
create bitmap 1,300,100
set current bitmap 1
`make grass texture
ink rgb(17,187,26),rgb(17,187,26)
box 0,0,100,100
get image 1, 0,0,100,100
`make tracer texture
ink rgb(255,255,0),rgb(255,255,0)
box 100,0,200,100
get image 2,100,0,200,100
`make crosshairs
ink rgb(255,255,255),rgb(255,255,255)
line 250,0, 250,100
line 200,50, 300,50
get image 3, 200,0,300,100
set current bitmap 0
`dont need bullets to raycast
`make range
`make plain
make object plain 10,2000,2000
texture object 10,1
xrotate object 10,90
position object 10,500,0,500
sc_setupobject 10,4,2
`make obstacles
for blox = 400 to 450
make object cube blox,rnd(40)+2
position object blox, rnd(1000),object size y(blox)/2 ,rnd(1000)
sc_setupobject blox,3,2
next
`make enemy
make object box 200,8,20,5
color object 200,rgb(255,0,0)
offset limb 200,0,0,10,0
sc_setupobject 200,2,2
`clone enemy
for en = 1 to enemynumber
clone object 200+en,200
sc_setupobject 200+en,2,2
next en
endfunction
set_vars:
randomize timer()
guns(0).name = "m416"
guns(0).number = 1
guns(0).weight = 4
guns(0).size.x = 2
guns(0).size.y = 4
guns(0).size.z = 12
guns(0).angle.x = 0
guns(0).angle.y = 0
guns(0).angle.z = 0
guns(0).reload = 500
guns(0).zoom_level = 2
guns(0).zoom = 0
guns(0).fire_rate = 10
guns(0).accuracy = 5
guns(0).mag_size = 30
guns(0).mag_count = 0
guns(0).bullet_damage = 20
guns(0).bullet_speed = 8000
dim bullets(guns(0).mag_size) as bullet
for bul = 1 to guns(0).mag_size
bullets(bul).state = 0
bullets(bul).vel.x = 0
bullets(bul).vel.y = 0
bullets(bul).vel.z = 0
bullets(bul).ang.x = 0
bullets(bul).ang.y = 0
bullets(bul).pos.x = 498
bullets(bul).pos.y = 12
bullets(bul).pos.z = 6
next bul
for en = 0 to enemynumber
enguns(en).name = "m416"
enguns(en).number = 1
enguns(en).weight = 4
enguns(en).size.x = 2
enguns(en).size.y = 4
enguns(en).size.z = 12
enguns(en).angle.x = 0
enguns(en).angle.y = 0
enguns(en).angle.z = 0
enguns(en).reload = 1000
enguns(en).zoom_level = 2
enguns(en).zoom = 0
enguns(en).fire_rate = 10
enguns(en).accuracy = 5
enguns(en).mag_size = 30
enguns(en).mag_count = 0
enguns(en).bullet_damage = 10
enguns(en).bullet_speed = 8000
next
dim enbullets(enemynumber,enguns(0).mag_size) as bullet `enemy all use same gun, which for now shall be gun 0
dim enreload(enemynumber)
for en = 0 to enemynumber
enemies(en).health = 100
enemies(en).pos.x = rnd(1000)
enemies(en).pos.y = 0
enemies(en).pos.z = rnd(1000)
enemies(en).view.x = 0
enemies(en).view.y = rnd(360)
enemies(en).view.z = 0
enemies(en).target = 0
enemies(en).firing = 0
next
player.health = 100
player.pos.x = rnd(1000)
player.pos.y = 0
player.pos.z = rnd(1000)
player.view.x = 0
player.view.y = rnd(360)
player.view.z = 0
player.run_state = 3 `walk upright
randomize 2
return
`locks an object to the screen with offsets
function lockObjectToCamera(object as integer,xOff as float,yOff as float,zOff as float)
sx as float : sy as float : sz as float
cx as float : cy as float : cz as float
xPos as float : yPos as float : zPos as float
sx = sin(camera angle x()) : cx = cos(camera angle x())
sy = sin(camera angle y()) : cy = cos(camera angle y())
sz = sin(camera angle z()) : cz = cos(camera angle z())
xPos = camera position x() + xOff*(cy*cz) + yOff*(sx*sy*cz-cx*sz) + zOff*(cx*sy*cz+sx*sz)
yPos = camera position y() + xOff*(cy*sz) + yOff*(cx*cz+sx*sy*sz) + zOff*(cx*sy*sz-sx*cz)
zPos = camera position z() + xOff*(-1*sy) + yOff*(sx*cy) + zOff*(cx*cy)
position object object,xPos,yPos,zPos
set object to camera orientation object
endfunction
function lockCameraToObject(camera as integer,lockTo as integer,xOff as float,yOff as float,zOff as float)
sx as float : sy as float : sz as float
cx as float : cy as float : cz as float
xPos as float : yPos as float : zPos as float
sx = sin(object angle x(lockTo)) : cx = cos(object angle x(lockTo))
sy = sin(object angle y(lockTo)) : cy = cos(object angle y(lockTo))
sz = sin(object angle z(lockTo)) : cz = cos(object angle z(lockTo))
xPos = object position x(lockTo) + xOff*(cy*cz) + yOff*(sx*sy*cz-cx*sz) + zOff*(cx*sy*cz+sx*sz)
yPos = object position y(lockTo) + xOff*(cy*sz) + yOff*(cx*cz+sx*sy*sz) + zOff*(cx*sy*sz-sx*cz)
zPos = object position z(lockTo) + xOff*(-1*sy) + yOff*(sx*cy) + zOff*(cx*cy)
position camera camera,xPos,yPos,zPos
`set camera to object orientation camera,lockTo
xrotate camera camera,player.view.x
yrotate camera camera,player.view.y
endfunction
function camera(cam,obj,limb)
position camera cam, limb position x(obj,limb),limb position y(obj,limb),limb position z(obj,limb)`-50
xrotate camera cam,player.view.x
yrotate camera cam,player.view.y
endfunction
function Movement()
rX# = player.view.x
ry# = player.view.y
rz# = 0
Set Vector3 5, 1.0, 0.0, 0.0
Build Rotation Axis Matrix4 1, 5, rX# * 0.017453292519943295769236907684886
Set Vector3 5, 0.0, 1.0, 0.0
Build Rotation Axis Matrix4 2, 5, rY# * 0.017453292519943295769236907684886
Set Vector3 5, 0.0, 0.0, 1.0
Build Rotation Axis Matrix4 3, 5, rZ# * 0.017453292519943295769236907684886
Multiply Matrix4 4, 1, 2
Multiply Matrix4 4, 4, 3
Set Vector3 5, 1.0, 0.0, 0.0
Transform Coords Vector3 5, 5, 4
Set Vector3 6, 0.0, 1.0, 0.0
Transform Coords Vector3 6, 6, 4
Set Vector3 7, 0.0, 0.0, 1.0
Transform Coords Vector3 7, 7, 4
select player.run_state
case 1,2,3
movementx# = ( Keystate(32) - Keystate(30) ) * 0.5*player.run_state
movementz# = ( Keystate(17) - Keystate(31) ) * 0.5*player.run_state
endcase
case 4
movementx# = ( Keystate(32) - Keystate(30) ) * 1.1*player.run_state
movementz# = ( Keystate(17) - Keystate(31) ) * 1.1*player.run_state
endcase
endselect
x# = player.pos.x + X Vector3( 5 ) * movementx#
y# = player.pos.y + Y Vector3( 5 ) * movementx#
z# = player.pos.z + Z Vector3( 5 ) * movementx#
x# = x# + X Vector3( 6 ) * movementY#
y# = y# + Y Vector3( 6 ) * movementY#
z# = z# + Z Vector3( 6 ) * movementY#
x# = x# + X Vector3( 7 ) * movementz#
y# = y# + Y Vector3( 7 ) * movementz#
z# = z# + Z Vector3( 7 ) * movementz#
player.vel.x = x# - player.pos.x
player.vel.y = y# - player.pos.y
player.vel.z = z# - player.pos.z
`control viewing
if guns(0).zoom = 0
player.view.y = player.view.y + mousemovex()/5.0
player.view.x = player.view.x + mousemovey()/5.0
else
player.view.y = player.view.y + (1.0/guns(0).zoom_level)*(mousemovex()/5.0)
player.view.x = player.view.x + (1.0/guns(0).zoom_level)*(mousemovey()/5.0)
endif
player.head.x = limb position x(1,2)
player.head.y = limb position y(1,2)
player.head.z = limb position z(1,2)
Endfunction
Firing:
`fire
if mouseclick() = 1 and reload = 0
if guns(0).fire_rate = 1
if click = 0
click = 1
inc guns(0).mag_count
bullets(guns(0).mag_count).state = 1
bullets(guns(0).mag_count).ang.y = player.view.y
bullets(guns(0).mag_count).ang.x = player.view.x
bullets(guns(0).mag_count).pos.x = player.head.x
bullets(guns(0).mag_count).pos.y = player.head.y
bullets(guns(0).mag_count).pos.z = player.head.z
bullets(guns(0).mag_count).vel.x = sin(player.view.y) * guns(0).bullet_speed * elapsedtime#
bullets(guns(0).mag_count).vel.y = -sin(player.view.x) * guns(0).bullet_speed * elapsedtime#
bullets(guns(0).mag_count).vel.z = cos(player.view.y) * guns(0).bullet_speed * elapsedtime#
`recoil
player.view.x = player.view.x - 0.1
player.view.y = player.view.y +(rnd(6)/10.0) - 0.3
endif
else
if gt = 0
gt = timer()
st = timer()
endif
if st <= gt + 100
st = timer()
else
gt = timer()
inc guns(0).mag_count
bullets(guns(0).mag_count).state = 1
bullets(guns(0).mag_count).ang.y = player.view.y
bullets(guns(0).mag_count).ang.x = player.view.x
bullets(guns(0).mag_count).pos.x = player.head.x
bullets(guns(0).mag_count).pos.y = player.head.y
bullets(guns(0).mag_count).pos.z = player.head.z
bullets(guns(0).mag_count).vel.x = sin(player.view.y) * guns(0).bullet_speed * elapsedtime#
bullets(guns(0).mag_count).vel.y = -sin(player.view.x) * guns(0).bullet_speed * elapsedtime#
bullets(guns(0).mag_count).vel.z = cos(player.view.y) * guns(0).bullet_speed * elapsedtime#
`recoil
player.view.x = player.view.x - 0.1
player.view.y = player.view.y +(rnd(6)/10.0) - 0.3
endif
endif
if guns(0).mag_count >= guns(0).mag_size
reload = 1
endif
endif
`reload
if reload = 1 and click = 0
inc t
if t = 50
t = 0
reload = 0
guns(0).mag_count = 0
for bul = 1 to guns(0).mag_size
bullets(bul).state = 0
bullets(guns(0).mag_count).pos.x = player.head.x
bullets(guns(0).mag_count).pos.y = player.head.y
bullets(guns(0).mag_count).pos.z = player.head.z
bullets(bul).vel.x = 0
bullets(bul).vel.y = 0
bullets(bul).vel.z = 0
next bul
endif
endif
Return
enemyai:
for en = 0 to enemynumber
enemies(en).run_state = 3
if enemies(en).health > 0
if enemies(en).target = 0 and enemies(en).firing = 0
enemies(en).target = 1
enemies(en).targetpos.x = rnd(2000)-500
enemies(en).targetpos.z = rnd(2000)-500
dx# = enemies(en).targetpos.x - enemies(en).pos.x
dz# = enemies(en).targetpos.z - enemies(en).pos.z
enemies(en).view.y = atanfull(dx#,dz#)
enemies(en).vel.x = sin(enemies(en).view.y) * enemies(en).run_state
enemies(en).vel.y = -sin(enemies(en).view.x) * enemies(en).run_state
enemies(en).vel.z = cos(enemies(en).view.y) * enemies(en).run_state
endif
if enemies(en).pos.x > enemies(en).targetpos.x-10
if enemies(en).pos.x < enemies(en).targetpos.x+10
if enemies(en).pos.z > enemies(en).targetpos.z-10
if enemies(en).pos.z < enemies(en).targetpos.z+10
enemies(en).target = 0
endif
endif
endif
endif
`work out differences in position
dx# = player.pos.x - enemies(en).pos.x
dy# = player.pos.y - enemies(en).pos.y
dz# = player.pos.z - enemies(en).pos.z
if vector exist(8) = 0 `has to be 8 since i have 7 world matrix4's for movement
null = make vector3 (8)
endif
set vector3 8, dx#, dy#, dz#
l3# = length vector3(8)
if vector exist(9) = 0
null = make vector2 (9)
endif
set vector2 9, dx#, dz#
l2# = length vector2(9)
ang# = atanfull(dx# , dz#)
angx# = atanfull(dy# , l2#)
if ang# > enemies(en).view.y - 45 and ang# < enemies(en).view.y + 45
hit = sc_raycast(0, enemies(en).pos.x, enemies(en).pos.y, enemies(en).pos.z, player.pos.x, player.pos.y, player.pos.z, 0)
if hit = 1
`player is in line of sight
color object 200, rgb(0,255,0)
enemies(en).view.y = ang#
enemies(en).view.x = angx#
enemies(en).firing = 1
else
color object 200, rgb(255,0,0)
enemies(en).firing = 0
endif
else
color object 200, rgb(255,0,0)
enemies(en).firing = 0
endif
else
enemies(en).firing = 0 `if dead dont shoot
endif
next
gosub enemyfiring
return
enemyfiring:
for en = 0 to enemynumber
if enemies(en).firing = 1 and enreload(en) <> 1
enemies(en).target = 0
enemies(en).vel.x = 0
enemies(en).vel.y = 0
enemies(en).vel.z = 0
if egt = 0
egt = timer()
est = timer()
endif
if est <= egt + 100
est = timer()
else
egt = timer()
inc enguns(en).mag_count
enbullets(en,enguns(en).mag_count).state = 1
enbullets(en,enguns(en).mag_count).ang.y = enemies(en).view.y + rnd(20.0)/10.0 - 1.0
enbullets(en,enguns(en).mag_count).ang.x = enemies(en).view.x + rnd(20.0)/10.0 - 1.0
enbullets(en,enguns(en).mag_count).pos.x = enemies(en).pos.x
enbullets(en,enguns(en).mag_count).pos.y = enemies(en).pos.y+19
enbullets(en,enguns(en).mag_count).pos.z = enemies(en).pos.z
enbullets(en,enguns(en).mag_count).vel.x = sin(enbullets(en,enguns(en).mag_count).ang.y) * enguns(en).bullet_speed * elapsedtime#
enbullets(en,enguns(en).mag_count).vel.y = -sin(enbullets(en,enguns(en).mag_count).ang.x) * enguns(en).bullet_speed * elapsedtime#
enbullets(en,enguns(en).mag_count).vel.z = cos(enbullets(en,enguns(en).mag_count).ang.y) * enguns(en).bullet_speed * elapsedtime#
remstart
`recoil
enemies(en).view_angle_x = enemies(en).view_angle_x - 0.1
enemies(en).view_angle_y = enemies(en).view_angle_y +(rnd(6)/10.0) - 0.3
remend
endif
if enguns(en).mag_count >= enguns(en).mag_size
enreload(en) = 1
endif
endif
`reload
if enreload(en) = 1
inc et
if et >= 50
et = 0
enreload(en) = 0
enguns(en).mag_count = 0
for ebul = 1 to enguns(en).mag_size
enbullets(en,ebul).state = 0
enbullets(en,ebul).pos.x = enemies(en).pos.x
enbullets(en,ebul).pos.y = enemies(en).pos.y+19
enbullets(en,ebul).pos.z = enemies(en).pos.z
enbullets(en,ebul).vel.x = 0
enbullets(en,ebul).vel.y = 0
enbullets(en,ebul).vel.z = 0
next ebul
endif
endif
next
return
physics:
`jumping needs to be done first else collision with vel.y doesnt work
if jump = 1
inc h,5 `speed of jump
player.vel.y = cos(h) `height ''
if h > 180 or bottom > 0
h = 0
jump = 0
endif
else
player.vel.y = -38 * elapsedtime#
endif
`walking collision player
`top and bottom checks for collision, will help to determine object height later on.
`bottom is at waist height so can "stride" over some objects
top = sc_spherecastgroup(3, player.pos.x, player.pos.y+15, player.pos.z, player.pos.x + player.vel.x, player.pos.y + player.vel.y + 15, player.pos.z + player.vel.z , 5, 0)
middle = sc_spherecastgroup(3, player.pos.x, player.pos.y+10, player.pos.z, player.pos.x + player.vel.x, player.pos.y + player.vel.y + 10, player.pos.z + player.vel.z , 5, 0)
if top <> 0 and middle <> 0
player.pos.x = sc_getcollisionslidex()
`player.pos.y = sc_getcollisionslidey()
player.pos.z = sc_getcollisionslidez()
endif
feet = sc_raycast(0,player.pos.x, player.pos.y+20, player.pos.z, player.pos.x + player.vel.x, player.pos.y + player.vel.y, player.pos.z + player.vel.z ,1)
if feet <> 0
select player.run_state
case 4,3
player.pos.y = 100.1 - sc_intersectobject(feet,player.pos.x, 100, player.pos.z, player.pos.x + player.vel.x, -10, player.pos.z + player.vel.z)
endcase
case 2
player.pos.y = 90.1 - sc_intersectobject(feet,player.pos.x, 100, player.pos.z, player.pos.x + player.vel.x, -10, player.pos.z + player.vel.z)
endcase
case 1
player.pos.y = 93.1 - sc_intersectobject(feet,player.pos.x, 100, player.pos.z, player.pos.x + player.vel.x, -10, player.pos.z + player.vel.z)
endcase
endselect
endif
player.pos.x = player.pos.x + player.vel.x
player.pos.y = player.pos.y + player.vel.y
player.pos.z = player.pos.z + player.vel.z
`player bullet collision
for bul = 1 to guns(0).mag_count
if bullets(bul).state = 1
`check walls
walled = sc_raycastgroup(3, bullets(bul).pos.x , bullets(bul).pos.y , bullets(bul).pos.z , bullets(bul).pos.x +bullets(bul).vel.x, bullets(bul).pos.y+ bullets(bul).vel.y, bullets(bul).pos.z+ bullets(bul).vel.z,1)
if walled > 0
bullets(bul).state = 0
bullets(guns(0).mag_count).pos.x = player.head.x
bullets(guns(0).mag_count).pos.y = player.head.y
bullets(guns(0).mag_count).pos.z = player.head.z
bullets(bul).vel.x = 0
bullets(bul).vel.y = 0
bullets(bul).vel.z = 0
else
`hit
hit = sc_raycastgroup(2, bullets(bul).pos.x , bullets(bul).pos.y , bullets(bul).pos.z , bullets(bul).pos.x +bullets(bul).vel.x, bullets(bul).pos.y+ bullets(bul).vel.y, bullets(bul).pos.z+ bullets(bul).vel.z,1)
if hit > 0
bullets(bul).state = 0
bullets(guns(0).mag_count).pos.x = player.head.x
bullets(guns(0).mag_count).pos.y = player.head.y
bullets(guns(0).mag_count).pos.z = player.head.z
bullets(bul).vel.x = 0
bullets(bul).vel.y = 0
bullets(bul).vel.z = 0
x# = sc_getstaticcollisionx()
y# = sc_getstaticcollisiony()
z# = sc_getstaticcollisionz()
enemies(hit-200).health = enemies(hit-200).health - guns(0).bullet_damage
else
bullets(bul).pos.x = bullets(bul).pos.x + bullets(bul).vel.x
bullets(bul).pos.y = bullets(bul).pos.y + bullets(bul).vel.y
bullets(bul).pos.z = bullets(bul).pos.z + bullets(bul).vel.z
endif
endif
if object exist(500) = 0
make object plain 500,0.3,3
texture object 500, 2
set object emissive 500,rgb(255,255,0)
endif
position object 500, bullets(bul).pos.x , bullets(bul).pos.y , bullets(bul).pos.z
yrotate object 500, player.view.y
`miss
if bullets(bul).pos.y < 0
bullets(bul).state = 0
bullets(guns(0).mag_count).pos.x = player.head.x
bullets(guns(0).mag_count).pos.y = player.head.y
bullets(guns(0).mag_count).pos.z = player.head.z
bullets(bul).vel.x = 0
bullets(bul).vel.y = 0
bullets(bul).vel.z = 0
endif
endif
next bul
`enemy walking collision
for en = 0 to enemynumber
walk = sc_sphereslidegroup(3, enemies(en).pos.x, enemies(en).pos.y+15, enemies(en).pos.z, enemies(en).pos.x + enemies(en).vel.x, enemies(en).pos.y + enemies(en).vel.y+15, enemies(en).pos.z + enemies(en).vel.z , 5, 0)
if walk = 0
enemies(en).pos.x = enemies(en).pos.x + enemies(en).vel.x
enemies(en).pos.y = enemies(en).pos.y + enemies(en).vel.y
enemies(en).pos.z = enemies(en).pos.z + enemies(en).vel.z
else
enemies(en).pos.x = sc_getcollisionslidex()
enemies(en).pos.y = sc_getcollisionslidey()
enemies(en).pos.z = sc_getcollisionslidez()
endif
`enemy bullets collision
for ebul = 1 to enguns(en).mag_count
if enbullets(en,ebul).state = 1
`check for walls
ewalled = sc_raycastgroup(3,enbullets(en,ebul).pos.x,enbullets(en,ebul).pos.y,enbullets(en,ebul).pos.z,enbullets(en,ebul).pos.x + enbullets(en,ebul).vel.x, enbullets(en,ebul).pos.y + enbullets(en,ebul).vel.y, enbullets(en,ebul).pos.z + enbullets(en,ebul).vel.z, en)
if ewalled > 0
enbullets(en,ebul).state = 0
enbullets(en,ebul).pos.x = enemies(en).pos.x
enbullets(en,ebul).pos.y = enemies(en).pos.y+19
enbullets(en,ebul).pos.z = enemies(en).pos.z
enbullets(en,ebul).vel.x = 0
enbullets(en,ebul).vel.y = 0
enbullets(en,ebul).vel.z = 0
else
`hit
ehit = sc_raycast(1,enbullets(en,ebul).pos.x,enbullets(en,ebul).pos.y,enbullets(en,ebul).pos.z,enbullets(en,ebul).pos.x + enbullets(en,ebul).vel.x, enbullets(en,ebul).pos.y + enbullets(en,ebul).vel.y, enbullets(en,ebul).pos.z + enbullets(en,ebul).vel.z, en)
if ehit > 0
enbullets(en,ebul).state = 0
enbullets(en,ebul).pos.x = enemies(en).pos.x
enbullets(en,ebul).pos.y = enemies(en).pos.y+19
enbullets(en,ebul).pos.z = enemies(en).pos.z
enbullets(en,ebul).vel.x = 0
enbullets(en,ebul).vel.y = 0
enbullets(en,ebul).vel.z = 0
ex# = sc_getstaticcollisionx()
ey# = sc_getstaticcollisiony()
ez# = sc_getstaticcollisionz()
player.health = player.health - enguns(en).bullet_damage
else
enbullets(en,ebul).pos.x = enbullets(en,ebul).pos.x + enbullets(en,ebul).vel.x
enbullets(en,ebul).pos.y = enbullets(en,ebul).pos.y + enbullets(en,ebul).vel.y
enbullets(en,ebul).pos.z = enbullets(en,ebul).pos.z + enbullets(en,ebul).vel.z
endif
endif
if object exist(503+en) = 0
make object plain 503+en,0.3,3
texture object 503+en, 2 `rgb(255,255,0)
set object specular 503+en,rgb(255,255,0)
endif
position object 503+en,enbullets(en,ebul).pos.x,enbullets(en,ebul).pos.y,enbullets(en,ebul).pos.z
yrotate object 503+en, enbullets(en,enguns(en).mag_count).ang.y
`miss
if enbullets(en,ebul).pos.y < 0
enbullets(en,ebul).state = 0
enbullets(en,ebul).pos.x = enemies(en).pos.x
enbullets(en,ebul).pos.y = enemies(en).pos.y+19
enbullets(en,ebul).pos.z = enemies(en).pos.z
enbullets(en,ebul).vel.x = 0
enbullets(en,ebul).vel.y = 0
enbullets(en,ebul).vel.z = 0
endif
endif
next ebul
next en
return
update:
`player
leanangle# = curveangle(player.view.z,limb angle z(1,0),6)
position object 1, player.pos.x, player.pos.y, player.pos.z
rotate object 1,player.view.x,player.view.y,0.0
if player.run_state = 1
rotate limb 1,0,90,0.0,leanangle#
rotate limb 1,1,-90,0.0,leanangle#
offset limb 1,1,1.5,13,1 `y and z seem to have swapped,y move forward and z up/down
else
rotate limb 1,0,0.0,0.0,leanangle#
rotate limb 1,1,0.0,0.0,leanangle#
offset limb 1,1,2,8,8
endif
sc_updateobject 1
`lockObjectToCamera(1,0.0,-11.0,0.0)
`lockCameraToObject(0,1,0.0,18.0,-100.0)
camera(0,1,2)
`enemies
for en = 0 to enemynumber
if enemies(en).health > 0
yrotate object 200+en, enemies(en).view.y
`move object 200, 2
enemies(en).pos.y = 100 - sc_intersectobject(10,enemies(en).pos.x,100,enemies(en).pos.z,enemies(en).pos.x,0,enemies(en).pos.z)
position object 200+en,enemies(en).pos.x,enemies(en).pos.y,enemies(en).pos.z
sc_updateobject 200+en
endif
next
return
if memblock exist(1) then delete memblock 1
Cheers
Monk