Code archives/3D Graphics - Misc/A Wee Tank Game - Now with Mouse option
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| Was messing about with this over the last few weeks. All graphics generated in code. If you want sound you'll need to add your own in the GAMEinit() function, and set SOUNDon to TRUE. No web space I'm afraid! It's an ANALOGUE / MOUSE deathmatch for one or two players. Analogues ... left analogue for movement, right for firing ala Super Smash TV. R3 drops / activates mines, P pauses, ESC to quit. Mouse / Keyboard ... cursors to move, mouse to move Gun Target, LeftMouse to fire, RightMouse to drop/activate mine. Use cursors and enter for menus or change all the keys to whatever at the top of the code. If you trigger an explosion you will get points for anything killed as a result of any chain explosions. Pick up a bonus and you keep it until dead. Hud ... Top bar is Life which will recharge up to a max of the power, both go down when hit, power only a fraction though. Your dead when life is 0. Bottom Bar is laser recharge, if 0 you can't fire. The more bullet bonuses you have the faster this is used up. Bonuses .. Tank Speed Bullet Speed Bullet Damage Bullet Spread Bullet Reload Life Recharge Shield Mine That's about it I think. Not really planning on expanding as meant to be very simple but feel free to give me feedback of any kind or maybe ideas for more features. You can change the polycount on the graphics by using the Detail variable. | |||||
Graphics3D 1280,960,16,1
SetFont LoadFont("Tahoma",32,1)
SeedRnd MilliSecs()
Global JOYSTICK
Global GunTarget
Global KUP = 200
Global KDOWN = 208
Global KLEFT = 203
Global KRIGHT = 205
Global KSELECT = 28
Global HGW = GraphicsWidth()*.5
Global HGH = GraphicsHeight()*.5
Const Detail# = 15
Const FPS = 30
Const FadeSpeed# = .02
Const Gravity# = 0.05
Const tanks = 4
Const bullets = 100
Const particles = 750
Const drums = 8
Const menus = 2
Const FireTurn# = .25
Const MoveTurn# = .1
Const BulletLife# = 30
Const T_TANK = 1
Const T_ARENA = 2
Const T_DRUM = 3
Const T_BULLET = 4
Const AI_Attack = 0
Const AI_Retreat = 1
Const AI_GoForBonus = 2
Const AI_Flee = 3
Const AI_Straffe = 4
Global SOUNDon = False
Global SOUNDexplode
Global SOUNDclang
Global SOUNDhit
Global SOUNDlaser
Global SOUNDmenu
Global SOUNDbonus
Global camera=CreateCamera()
Global menu_cam = CreateCamera()
Global Pivot = CreatePivot()
Global Light = CreateLight()
Global AIPivot = CreatePivot()
Global FrameTimer = CreateTimer(FPS)
Global BulletMesh
Global ParticleMesh
Global DrumMesh
Global BubbleMesh
Global NextBullet
Global NextParticle
Global ParticleTemplate
Global Fade
Global FadeStatus#
Global NX#
Global NZ#
Global MINEactivate, FIREactivate
Global zoom#=6.75
Global GAMEOVER
Global QUIT
Global PLAYERS
Global KILLS
Global DIFFICULTY
Collisions T_TANK,T_TANK,1,2
Collisions T_TANK,T_ARENA,2,2
Collisions T_TANK,T_DRUM,1,2
Collisions T_BULLET,T_ARENA,2,1
Collisions T_BULLET,T_TANK,1,1
Collisions T_BULLET,T_DRUM,1,1
Type tank_type
Field ID
Field Model
Field Turret
Field MaxSpeed#
Field BulletReload
Field BulletSpeed#
Field BulletSpread
Field BulletHeat#
Field BulletTimer
Field Shield#
Field Damage#
Field Score
Field ScoreTexture
Field Respawn
Field BubbleShield
Field Life#
Field LifeBar
Field LifeRecharge#
Field Power#
Field PowerBar
Field Cooler#
Field CoolerBar
Field MineCounter
Field Mine
Field Control
Field r#,g#,b#
;ai stuff
Field MoveCounter
Field FireCounter
Field MX#, MZ#
Field FX# , FZ#
Field Target
End Type
Type bullet_type
Field ID
Field Model
Field Life
Field Speed#
Field Damage#
End Type
Type drum_type
Field ID
Field Model
Field Life#
End Type
Type particle_type
Field Vertex
Field x#,y#,z#
Field vx#,vy#,vz#
Field r,g,b
Field life#
Field fade#
Field size#
Field weight#
End Type
Type bonus_type
Field ID
Field Model
Field timer
End Type
Type arena_type
Field Model
Field Hud
Field Radar
End Type
Type menu_type
Field Model
Field ID
Field texture
Field options
Field title$
Field initial
Field current
Field sub_options[5]
Field sub_string$[5]
Field sub_current[5]
End Type
Dim tank.tank_type(tanks-1)
Dim bullet.bullet_type( bullets -1 )
Dim drum.drum_type ( drums - 1)
Dim particle.particle_type ( particles - 1)
Dim menu.menu_type( menus -1 )
Global BONUS.bonus_type = New bonus_type
Global ARENA.arena_type = New arena_type
GAMEinit()
Repeat
GAMEstart()
Repeat
WaitTimer(FrameTimer)
BULLETSupdate()
PARTICLESupdate()
BONUSupdate()
TANKSupdate()
UpdateWorld()
RenderWorld()
Flip
Until QUIT Or GAMEOVER
If GAMEOVER GAMEend()
Until (1=2)
End
;==========================================================
;==========================================================
;==========================================================
Function TANKSupdate()
;radar
TurnEntity ARENA\radar,0,5,0
For t.tank_type = Each tank_type
t\BulletTimer = t\BulletTimer - ( t\BulletTimer > 0 )
If t\Life > 0
FIREactivate = True
;control
If t\Control < 2
If JOYSTICK
;analogue
t\MX = JoyX(t\ID)
t\MZ = -JoyY(t\ID)
t\FX = JoyRoll(t\ID) / 180.0
t\FZ = -JoyZ(t\ID)
MINEactivate = JoyDown( 12,t\ID )
Else
;mouse / keyboard
t\MX = KeyDown( KRIGHT )-KeyDown( KLEFT )
t\MZ = KeyDown( KUP )-KeyDown( KDOWN )
FIREactivate = MouseDown(1)
MINEactivate = MouseDown(2)
EndIf
Else
AI ( t )
EndIf
;moving
speed# = NORMALxz( t\MX , t\MZ )
If speed > 0.3
PositionEntity Pivot,EntityX(t\Model) + NX * 5 , 0 , EntityZ(t\Model) + NZ * 5
RotateEntity t\Model,0,EntityYaw(t\Model)+DeltaYaw(t\Model,Pivot) * MoveTurn ,0
speed = speed * t\MaxSpeed
TranslateEntity t\Model , NX * speed , (3-EntityY(t\Model)) , NZ * speed
PARTICLEnew( t\Model, 0,-1.5,-3, -.1,.1, -.1,.1, -.2,-.1 , 64,80,64,80,64,80, .25,.5, .25 , .1, 1)
EndIf
;firing - joystick / ai control
speed# = NORMALxz( t\FX , t\FZ )
If speed > 0.5
PositionEntity Pivot,EntityX(t\Model) + NX * 5 , 0 , EntityZ(t\Model) + NZ * 5
yaw# = DeltaYaw(t\Turret,Pivot)
TurnEntity t\Turret,0, yaw *FireTurn ,0
If t\BulletTimer = 0 And t\Cooler > t\BulletHeat And ( Abs(yaw)< 15 )
If t\respawn = 0 And FIREactivate BULLETnew( t )
EndIf
EndIf
PositionEntity t\Turret,EntityX(t\Model),3,EntityZ(t\Model),1
;firing - mouse
If t\Control < 2 And ( Not JOYSTICK )
PositionEntity GunTarget,( MouseX() - HGW ) *.145 , 3 , ( HGH - MouseY() ) *.17
PointEntity t\Turret , GunTarget
RotateEntity t\Turret,0,EntityYaw( t\Turret ),0
If t\BulletTimer = 0 And Abs(yaw)< 15 And t\Cooler > t\BulletHeat
If t\respawn = 0 And FIREactivate BULLETnew( t )
EndIf
End If
;recharge gun & life
t\Life = LIMIT( t\Life + t\LifeRecharge, 0, t\Power )
t\Cooler = LIMIT( t\Cooler + .0075, 0, 1)
;lay / trigger mine
If t\MineCounter = 1 And MINEactivate MINEnew( t, 0 )
If t\MineCounter > 1 t\MineCounter = t\mineCounter + 1
If t\MineCounter > 30 And MINEactivate MINEnew( t,1 )
EndIf
;bonus pickup
If BONUS\timer > 0 And EntityDistance( BONUS\Model, t\Model ) < 3
BONUS\timer = 0
TANKbonus (t , BONUS\ID )
PARTICLEnew ( BONUS\Model, 0,0,0, 0,0,.5,.5,0,0, 255,255,255,255,0,0, .25,.5, 1 , .01 , 8, 10 )
SOUNDplay( SOUNDbonus )
EndIf
;respawn
If t\Respawn > 0 TANKrespawn( t )
;update hud
ScaleEntity t\LifeBar,t\Life,1,1
ScaleEntity t\PowerBar,t\Power,1,1
ScaleEntity t\CoolerBar,t\Cooler,1,1
Next
;quit
QUIT = KeyDown(1)
;pause
If KeyDown(25) MENUshow ( MENU(1) )
End Function
;==========================================================
;==========================================================
;==========================================================
Function BULLETSupdate()
For b.bullet_type = Each bullet_type
MoveEntity b\Model,0,0,b\speed
b\Life = b\Life - (b\Life > 0)
;do collisions
If CountCollisions(b\Model) > 0
For ID = 1 To 3
entity = EntityCollided (b\Model,ID)
If entity <> 0
Select ID
Case T_TANK
t.tank_type = Object.tank_type( EntityName( entity ) )
damage# = b\Damage * (1.0 - t\Shield)
t\Power = LIMIT( t\Power - damage*.25,0.0,1.0)
t\Life = LIMIT( t\Life - damage,0.0,1.0)
If t\Life = 0 And t\Respawn = 0
;destroy tank
EXPLOSION ( t\Turret, 20 , b\ID, t\r,t\g,t\b, True )
Else
;hit tank
h.tank_type = tank( b\ID )
HIT ( b\Model, h\r,h\g,h\b, False , SOUNDhit, True )
EndIf
Case T_ARENA
;hit arena
HIT ( b\Model, 142,100,142, True, SOUNDclang, False )
Case T_DRUM
d.drum_type = Object.drum_type( EntityName( entity ) )
d\Life = LIMIT( d\Life - b\Damage,0.0,2.0)
If d\Life = 0
;destroy drum
EXPLOSION ( d\Model, 20 , b\ID, 168,116,100, False )
Else
;hit drum
HIT ( b\Model, 168,116,100, True, SOUNDclang, False )
EndIf
End Select
EndIf
Next
b\Life =0
EndIf
If b\Life = 0 HideEntity b\Model:ResetEntity b\Model
Next
End Function
;==========================================================
;==========================================================
;==========================================================
Function PARTICLESupdate()
s = GetSurface( ParticleMesh , 1 )
t = GetSurface( ParticleTemplate , 1 )
cv = CountVertices(t)-1
For p.particle_type = Each particle_type
p\Life = LIMIT( p\Life - p\fade ,0 , 1.0 )
p\vy = p\vy - Gravity * p\weight
p\x = p\x + p\vx
p\y = p\y + p\vy
p\z = p\z + p\vz
If p\y < p\size
p\y = p\size
p\vx = p\vx * .75
p\vy = -p\vy*.5
p\vz = p\vz * .75
EndIf
For v=0 To cv
px# = p\x + VertexX(t,v) * p\size
py# = p\y + VertexY(t,v) * p\size
pz# = p\z + VertexZ(t,v) * p\size
VertexCoords s , p\Vertex + v , px, py, pz
VertexColor s, p\Vertex + v , p\r , p\g , p\b , .75 * p\Life
Next
Next
End Function
;==========================================================
;==========================================================
;==========================================================
Function BONUSupdate()
If BONUS\timer = 0
HideEntity BONUS\Model
If Rand(60)=1
BONUS\ID = Rand(1,8)
BONUS\timer = 150
bx = ( Rand(0,1)*2-1 ) * ( 5 + Rand(0,3) * 10 )
bz = ( Rand(0,1)*2-1 ) * ( 5 + Rand(0,3) * 10 )
PositionEntity BONUS\Model,bx,3,bz
ShowEntity BONUS\Model
EndIf
EndIf
If BONUS\timer > 0
BONUS\timer = BONUS\timer - 1
alpha# = 1.0
If BONUS\timer <= 30 alpha# = Float( BONUS\timer)*.033
If BONUS\timer > 120 alpha# = Float(150.0 - BONUS\timer ) * .033
EntityAlpha BONUS\Model,alpha
TurnEntity BONUS\Model,0,10,0
EndIf
End Function
;==========================================================
;==========================================================
;==========================================================
Function AI ( t.tank_type )
t\MoveCounter = t\MoveCounter - (t\MoveCounter > 0 )
t\FireCounter = t\FireCounter - (t\FireCounter > 0 )
FireRange# = ( BulletLife * t\BulletSpeed )
MINEactivate = ( t\MineCounter = 1 And Rand(60)=1 )
If t\Target > -1
TargetDistance# = EntityDistance( t\Model, tank(t\target)\Model )
If tank(t\target)\respawn > 0 t\Target = -1
Else
TargetDistance# = 1000.0
t\FireCounter = 0
EndIf
;find a new target
If t\FireCounter = 0
FleeX# = 0
FleeZ# = 0
For c.tank_type = Each tank_type
If t<>c
FleeX = FleeX + EntityX(c\Model) * .33
FleeZ = FleeZ + EntityZ(c\Model) * .33
CheckDistance# = EntityDistance( t\Model, c\Model )
If c\Respawn = 0 And CheckDistance < TargetDistance
t\Target = c\ID
TargetDistance = CheckDistance
EndIf
;Detonate the mine?
If c\Respawn = 0 And t\MineCounter > 1
If EntityDistance( t\mine, c\Model ) < Rand(5, 20) And EntityDistance( t\mine, t\model) > 20
MINEactivate = True
EndIf
EndIf
EndIf
Next
t\FireCounter = 20
EndIf
;shoot at target if within range
If t\Target > -1 And (TargetDistance < FireRange+10 ) And ( t\Cooler > ( Rand(2,8) * t\BulletHeat ) )
c.tank_type = tank(t\Target)
time# = TargetDistance / t\BulletSpeed
ox# = c\MaxSpeed * time
oz# = c\MaxSpeed * time
PositionEntity Pivot,EntityX(c\Model) + Rnd(-ox,ox) , 0, EntityZ(c\Model) + Rnd(-oz,oz)
Distance# = NORMALxz ( EntityX( Pivot) - EntityX(t\Model) , EntityZ(Pivot) - EntityZ( t\Model) )
t\FX = NX
t\FZ = NZ
Else
t\FX = 0
t\FZ = 0
EndIf
;move
If t\MoveCounter = 0
MoveRange# = t\MaxSpeed * 10.0
BonusRange# = MoveRange * 10 * (BONUS\timer > 0 )
BonusDistance# = EntityDistance(t\Model,BONUS\Model)
;decide on action
If t\Target > -1
Action = AI_Straffe
PositionEntity AIPivot, EntityX( tank(t\Target)\Model ), 0, EntityZ( tank(t\Target)\Model )
If TargetDistance > ( FireRange + 10.0) Action = AI_Attack
If TargetDistance < ( FireRange - 10.0 ) Action = AI_Retreat
Else
Action = AI_Flee
PositionEntity AIPivot, FleeX, 0, FleeZ
EndIf
If BonusDistance < BonusRange
Action = AI_GoForBonus
PositionEntity AIPivot, EntityX( BONUS\Model ), 0, EntityZ( BONUS\Model )
EndIf
Distance# = NORMALxz( EntityX( AIPivot ) - EntityX( t\Model), EntityZ( AIPivot ) - EntityZ( t\Model ) )
If Action = AI_Attack Or Action = AI_GoForBonus Distance# = 1000.00
If Action = AI_Flee Or Action = AI_Retreat Distance# =0.0
;check possible moves
choice = -1
angle = Rand( 0,7 )
For l = 0 To 7
angle = (angle + 1 ) Mod 8
vx# = NX * Cos( angle*45) - NZ * Sin( angle*45)
vz# = NZ * Cos( angle*45) + NX * Sin(angle*45)
PositionEntity pivot, EntityX(t\Model) + vx * MoveRange , 0, EntityZ( t\Model) + vz * MoveRange
unused = LinePick ( EntityX(t\Model) , 3 , EntityZ(t\Model) , vx * MoveRange, 0 , vz * MoveRange , 2 )
;If Nothing blocking route
If PickedEntity() = 0
;Is there a live mine near New point?
NoGo = False
For c.tank_type = Each tank_type
If c <> t And c\MineCounter > 1
If EntityDistance( pivot, c\Mine ) < Rand(5,10) NoGo = True
EndIf
Next
If NoGo = False
CheckDistance# = EntityDistance( pivot, AIPivot )
Select Action
Case AI_Attack, AI_GoForBonus
If CheckDistance < Distance
Distance = CheckDistance
choice = angle
EndIf
Case AI_Flee, AI_Retreat
If CheckDistance > Distance
Distance = CheckDistance
choice = angle
EndIf
Case AI_straffe
If angle = 2 Or angle = 6 choice = angle
End Select
EndIf
EndIf
Next
t\MoveCounter = 10
If choice > -1
;found a move
t\MX = NX * Cos( choice * 45) - NZ * Sin( choice*45)
t\MZ = NZ * Cos( choice * 45 ) + NX * Sin( choice*45)
Else
;no move
choice = Rand(3,5)
t\MX = NX * Cos( choice * 45) - NZ * Sin( choice*45)
t\MZ = NZ * Cos( choice * 45 ) + NX * Sin( choice*45)
EndIf
EndIf
End Function
;==========================================================
;==========================================================
;==========================================================
Function FADE ( target# )
direction# = Sgn(target - FadeStatus )
Repeat
FadeStatus = LIMIT( FadeStatus + direction * FadeSpeed , 0.0,1.0)
EntityAlpha fade, (1.0 - FadeStatus)
RenderWorld()
Flip
Until ( FadeStatus >= target And direction = 1) Or (FadeStatus <= target And direction= -1) Or (direction=0)
End Function
;==========================================================
;==========================================================
;==========================================================
Function NORMALxz#( jx# , jz# )
speed# = Sqr ( jx * jx + jz * jz )
NX = jx / speed
NZ = jz / speed
Return speed
End Function
;==========================================================
;==========================================================
;==========================================================
Function HIT ( entity, r, g, b, Mark, Sound, IsTANK )
SOUNDplay( Sound )
If IsTANK
PARTICLEnew ( entity, 0,0,0, 0,0,.5,.5,0,0, r,r,g,g,b,b, .4,.6, 1 , .01 , 2, 33 )
PARTICLEnew( entity, 0,0,0, -.25,.25, -.5,.5, -.5,0 , 255,255,128,255,0,0, .25,.5, .5, .02, 3)
Else
PARTICLEnew( entity, 0,0,0, -.25,.25, -.5,.5, -.5,0 , 128,192,128,192,128,192, .2,.3, .5, .01, 3)
EndIf
If Mark PARTICLEnew( entity, 0,0,-1, 0,0, 0,0, 0,0 ,16,48,16,48,16,48 ,.2,.3, 0, .05, 1)
End Function
;==========================================================
;==========================================================
;==========================================================
Function EXPLOSION( entity, range#, ID ,r,g,b, IsTank )
;do explosion
HideEntity entity
SOUNDplay( SOUNDexplode )
PARTICLEnew( entity, 0,0,0, -.25,.25, .5,1.5, -.25,.25 , r,r,g,g,b,b, .5,.75,1, .005,10)
PARTICLEnew( entity, 0,0,0, -.25,.25, .5,1.5, -.25,.25 , 255,255,128,255,0,0, .25,.5, 1, .01,10)
PARTICLEnew ( entity, 0,0,0, 0,0,.25,.5,0,0, 255,255,255,255,255,255, .75,1, .5 , 0 , 16, range )
;if tank destroyed start respawn & updatescore for the tank that was responsible
If IsTank
t.tank_type = Object.tank_type( EntityName( entity ) )
t\Shield = 1
t\Respawn = 1
If t\MineCounter > 1
EXPLOSION ( t\Mine, 20, t\ID, t\r,t\g,t\b, False )
Else
HideEntity t\Mine
EndIf
TANKbonus ( t )
c.tank_type = tank( ID )
If c<>t
PARTICLEnew( entity, 0,3,0, 0,0, .25,.25,0,0 , c\r,c\r,c\g,c\g,c\b,c\b, 1.5,1.5, 0, .01,1)
SCOREupdate( c , 1 )
Else
SCOREupdate( c, -1 )
EndIf
EndIf
;check tanks
For t.tank_type = Each tank_type
If t\Life > 0
distance# = EntityDistance( t\Turret, entity )
If distance < range
damage# = ( ( range - distance ) / range ) * (1.0-t\Shield)
t\Power = LIMIT( t\Power - damage*.25,0.0,1.0)
t\Life = Limit (t\Life - damage, 0 , 1 )
If t\Life = 0 EXPLOSION( t\Turret, 20, ID, t\r,t\g,t\b, True )
EndIf
EndIf
Next
;check drums
For d.drum_type = Each drum_type
If d\Life > 0
distance# = EntityDistance( d\Model, entity )
If distance < range
damage# = ( ( range - distance ) / range )
d\Life = Limit (d\Life - damage, 0 , 2 )
If d\Life = 0 EXPLOSION ( d\Model, 20 , ID, 168,116,100, False )
EndIf
EndIf
Next
End Function
;==========================================================
;==========================================================
;==========================================================
Function TANKbonus ( t.tank_type , bonus=0 )
Select bonus
Case 0
t\BulletReload = 9
t\BulletSpeed = 1.25
t\MaxSpeed = .4
t\Shield = 0.0
EntityAlpha t\BubbleShield, 0
t\Damage = .1
t\LifeRecharge = .002
t\BulletSpread=0
t\MineCounter = 0
Case 1
t\BulletReload =LIMIT( t\BulletReload - 3, 3,9 )
Case 2
t\BulletSpeed = LIMIT( t\BulletSpeed + .25, 1.25, 1.75 )
Case 3
t\MaxSpeed = Limit ( t\MaxSpeed + .1, .4, .6)
Case 4
t\Shield = Limit ( t\Shield + .25, 0, .75 )
EntityAlpha t\BubbleShield, t\Shield*.5
Case 5
t\Damage = Limit ( t\Damage + .05, .1,.2 )
Case 6
t\LifeRecharge = LIMIT( t\LifeRecharge + .002, .002, .01 )
Case 7
t\BulletSpread = LIMIT( t\BulletSpread+1,0,2 )
Case 8
If t\MineCounter = 0
t\MineCounter = 1
ShowEntity t\Mine
EntityParent t\Mine, t\Model
PositionEntity t\Mine, 0,0,-2.5
EndIf
End Select
t\BulletHeat# = .025 * ( ( t\BulletSpread + 1.0 ) + ( t\Damage * 10.0 ) + ( t\BulletSpeed / 1.25 ) )
End Function
;==========================================================
;==========================================================
;==========================================================
Function TANKrespawn( t.tank_type )
t\Respawn = t\Respawn + 1
;stage 0 - smoking
If t\Respawn < 91
PARTICLEnew( t\Model, 0,1,0, -.1,.1, .2,.3, -.1,.1 , 64,80,64,80,64,80, .25,.5, 0,.02,1)
EndIf
;stage 1 - show BubbleShield
If t\Respawn > 90 And t\Respawn <= 120
scale# = Float(t\Respawn - 91) / 29.0
EntityAlpha t\BubbleShield, scale*.5
EndIf
;stage 2 - scale Turret, fill energy
If t\Respawn > 120 And t\Respawn <= 150
ShowEntity t\Turret
scale# = Float(t\Respawn - 121) / 29.0
t\Life = scale
t\Power = Limit (t\Power + .04, 0.0,1.0)
EndIf
;stage 3 - hide BubbleShield
If t\Respawn > 150 And t\Respawn <= 180
scale# = Float(t\Respawn - 151) / 29.0
EntityAlpha t\BubbleShield, .5 - scale*.5
EndIf
;stage 4 - back in play
If t\Respawn = 180
t\Respawn = 0
If t\Shield = 1 t\Shield = 0
EndIf
End Function
;==========================================================
;==========================================================
;==========================================================
Function MINEnew( t.tank_type , action )
Select action
Case 0 ;drop mine
EntityParent t\Mine,0
t\MineCounter = 2
Case 1 ;detonate mine
EXPLOSION ( t\Mine, 20 , t\ID , t\r,t\g,t\b , False )
t\MineCounter = 0
End Select
End Function
;==========================================================
;==========================================================
;==========================================================
Function BULLETnew( t.tank_type )
angle# = t\BulletSpread * 5
SOUNDplay( SOUNDlaser )
t\Cooler = Limit ( t\Cooler - t\BulletHeat , 0, 1.0)
PARTICLEnew( t\Turret, 0,0,3 , -.25,.25, -.25,.25, 0.05,0.1, 255,255,255,255,255,255, .25,.25, 0, .04,t\BulletSpread+1)
For fired = -Sgn( t\BulletSpread ) To Sgn( t\BulletSpread )
If t\BulletSpread <>1 Or fired <> 0
b.bullet_type = bullet( NextBullet)
EntityParent b\Model,t\Turret
EntityColor b\Model,t\r,t\g,t\b
PositionEntity b\Model,0,0,3
RotateEntity b\Model,0,fired*angle,0
scale# = t\Damage*10.0
ScaleEntity b\Model,1,1,scale
EntityParent b\Model,0
ShowEntity b\Model
b\Life = BulletLife
b\ID = t\ID
b\speed = t\BulletSpeed
b\Damage = t\Damage
t\BulletTimer = t\BulletReload
NextBullet = ( NextBullet + 1 ) Mod bullets
EndIf
Next
End Function
;==========================================================
;==========================================================
;==========================================================
Function PARTICLEnew( mesh, x#,y#,z#, vx1#,vx2#, vy1#,vy2#, vz1#,vz2#, r1,r2, g1,g2, b1,b2 , s1#,s2# , w#, f#, number, range#=0)
random# = Rand( -180,180 )
For l = 1 To number
p.particle_type = particle( NextParticle)
If range = 0
TFormVector x,y,z, mesh, 0
Else
angle# = 360 * l / number + random
TFormVector Cos(angle),y,Sin(angle), mesh,0
f# = 1.0 / ( range * 3.0)
EndIf
p\x = EntityX(mesh,1)+TFormedX()
p\y = EntityY(mesh,1)+TFormedY()
p\z = EntityZ(mesh,1)+TFormedZ()
If range = 0
TFormVector Rnd(vx1,vx2),Rnd(vy1,vy2),Rnd(vz1,vz2), mesh, 0
Else
TFormVector Cos(angle)*.5,Rnd(vy1,vy2),Sin(angle)*.5,mesh,0
EndIf
p\vx = TFormedX()
p\vy = TFormedY()
p\vz = TFormedZ()
p\r = Rand(r1,r2)
p\g = Rand(g1,g2)
p\b = Rand(b1,b2)
p\size = Rnd(s1,s2)
p\weight = w
p\fade = f
p\Life = 1.0
NextParticle = ( NextParticle + 1 ) Mod particles
Next
End Function
;==========================================================
;==========================================================
;==========================================================
Function SCOREupdate( t.tank_type , add#=0 )
t\Score = t\Score + add
If t\Score = KILLS And ( Not GAMEOVER) GAMEOVER = t\ID+1
SetBuffer TextureBuffer (t\ScoreTexture)
Color 0,0,0:Rect 0,0,32,32
Color t\r,t\g,t\b:Text 16,16,t\Score,1,1
SetBuffer BackBuffer()
End Function
;==========================================================
;==========================================================
;==========================================================
Function GAMEend()
Winner = tank(GAMEOVER-1)\Model
CAMERApoint( EntityX(Winner),EntityY(Winner),EntityZ(Winner), 36.75 , 150 , .1 )
CAMERApoint( 0,0,0, 6.75 , 60 , .1 )
End Function
;==========================================================
;==========================================================
;==========================================================
Function GAMEstart()
MENUshow( MENU(0) )
FADE( 0 )
GAMEreset ()
FADE( 1 )
End Function
;==========================================================
;==========================================================
;==========================================================
Function CAMERApoint( x#,y#,z#, zoomtarget#, iterations, smooth#, show =True)
PositionEntity Pivot,x,y,z
For l = 1 To iterations
TurnEntity camera, DeltaPitch(camera, pivot)*smooth, DeltaYaw( camera, pivot)*smooth, 0
zoom = zoom + Sgn( zoomtarget - zoom )
CameraZoom camera, zoom
If show
WaitTimer (FrameTimer)
PARTICLESupdate()
RenderWorld()
Flip
EndIf
Next
End Function
;==========================================================
;==========================================================
;==========================================================
Function GAMEreset( )
;tanks
For t.tank_type = Each tank_type
t\Score = 0
t\BulletTimer=0
t\Life = 1.0
t\Power = 1.0
t\Cooler = 1.0
t\Respawn = 0
t\Control = ( t\ID < PLAYERS ) + 2 * ( t\ID >=PLAYERS )
x# = ( (t\ID=0 Or t\ID=2) - (t\ID=1 Or t\ID=3) )*30
z# = ( (t\ID=1 Or t\ID=2) - (t\ID=0 Or t\ID=3) )*30
PositionEntity t\Model,x,3,z
PointEntity t\Model,ARENA\Model:TurnEntity t\Model,0,180,0
RotateEntity t\Turret,0,EntityYaw(t\Model),0
ResetEntity t\Model
PositionEntity t\Turret,x,3,z
ShowEntity t\Turret:ScaleEntity t\Turret,1,1,1
ShowEntity t\Model
SCOREupdate (t)
TANKbonus (t)
ScaleEntity t\LifeBar,t\Life,1,1
ScaleEntity t\PowerBar,t\Power,1,1
HideEntity t\Mine
t\FX = 0:t\FZ = 0
t\MX = 0:t\MZ = 0
t\MoveCounter = t\ID * 2
t\FireCounter = t\ID * 2
t\Target = -1
Next
;bullets
For w.bullet_type = Each bullet_type
HideEntity w\Model
ResetEntity w\Model
Next
;drums
For b.drum_type = Each drum_type
x# = Cos( -22.5 + b\ID *45.0) * 27
z# = Sin(-22.5 + b\ID * 45.0) * 27
b\Life = 2.0
PositionEntity b\Model,x,2,z
ResetEntity b\Model
ShowEntity b\Model
Next
;particles
For p.particle_type = Each particle_type
p\Life = 0
Next
PARTICLESupdate()
;bonus
HideEntity BONUS\Model
BONUS\timer = 0
;misc
zoom# = 6.75
GAMEOVER = False
;Gun Target Reset
If ( Not JOYSTICK ) And PLAYERS > 0
ShowEntity GunTarget
MoveMouse HGW, HGH
Else
HideEntity GunTarget
EndIf
End Function
;==========================================================
;==========================================================
;==========================================================
Function LIMIT#( q# , low# , hi# )
If q < low q = low
If q > hi q = hi
Return q
End Function
;==========================================================
;==========================================================
;==========================================================
Function SOUNDplay ( sound )
If SOUNDon
new_channel = PlaySound( sound )
EndIf
End Function
;==========================================================
;==========================================================
;==========================================================
Function MENUshow ( m.menu_type )
;reset
m\current = m\initial
MENUupdate( m )
;fade in
ShowEntity m\model
For l= 0 To 30
RotateEntity m\model, 0,0,l*12
PositionEntity m\model,0,0,2+(30-l)
RenderWorld()
Flip
Next
Repeat
;user input
jx = KeyDown( KRIGHT ) - KeyDown( KLEFT )
jy = KeyDown( KDOWN) - KeyDown( KUP )
jb = KeyDown( KSELECT)
If KeyDown(1) End
;change current option
If jy <> 0
old = m\current
m\current = Limit (m\current + jy, 0, m\options-1 )
jx=0:jy = (old <> m\current)
EndIf
;change current sub option
If jx <> 0
old = m\sub_current[m\current]
m\sub_current[m\current] = Limit ( m\sub_current[m\current] + jx , 0, m\sub_options[m\current]-1 )
jx = ( old <> m\sub_current[m\current] )
EndIf
;update menu
If (jx+jy) <> 0
SOUNDplay( SOUNDmenu)
If m\sub_current[2] = 0 m\sub_current[0] = LIMIT ( m\sub_current[0], 0, 1 )
MENUupdate ( m )
EndIf
RenderWorld()
Flip
Until m\sub_options[m\current] = 1 And jb
SOUNDplay ( SOUNDmenu )
;fade out
For l= 0 To 30
RotateEntity m\model, 0,0,l*12
PositionEntity m\model,0,0,2+l
RenderWorld()
Flip
Next
HideEntity m\model
;get details
Select m\ID
Case 0
PLAYERS = m\sub_current[0]
KILLS = ( m\sub_current[1] + 1 ) * 10
JOYSTICK = ( m\sub_current[2] = 1 )
Case 1
QUIT = ( m\current = 1)
End Select
End Function
;==========================================================
;==========================================================
;==========================================================
Function MENUupdate(m.menu_type, update_title=False )
SetBuffer TextureBuffer(m\texture)
If update_title
Color 64,64,128:Rect 0,0,256,128,1
MyText( 128,12,m\title, 1,1, 255,255,0 )
Else
Color 64,64,128:Rect 0,28,256,88,1
EndIf
y = 22 + ( m\options = 2 ) * 48
For option = 0 To m\options - 1
r = 255
g = 155+100*(m\current = option)
b = 155+100*(m\current = option)
x = 8 + 120 * ( m\sub_options[option]=1 )
MyText ( x, y + option * 24, Left$( m\sub_string[option], 12), m\sub_options[option]=1,0, r,g,b )
If m\sub_options[option] > 0
MyText ( 136, y + option * 24 , Mid$(m\sub_string[option], ( m\sub_current[option] + 1)*12,12 ), 0,0, r,g,b )
EndIf
Next
SetBuffer BackBuffer()
Delay 100
End Function
;==========================================================
;==========================================================
;==========================================================
Function MyText ( x, y, t$, cx, cy, r, g, b )
Color 32,23,64
For l = 0 To 4
px = ( ( l = 0) - (l = 2) ) * 1
py = ( ( l = 1) - (l = 3) ) * 1
If l= 4 Color r,g,b
Text x+ px , y+ py , t$ , cx , cy
Next
End Function
;==========================================================
;==========================================================
;==========================================================
;==========================================================
; THESE FUNCTIONS ARE ONLY USED ONCE
;==========================================================
;==========================================================
;==========================================================
;==========================================================
Function MENUinit()
Restore MENUdata
For l = 0 To menus-1
m.menu_type = New menu_type
menu( l ) = m
m\ID = l
w# = .5
h# = .25
m\model = QUADnew(menu_cam,-90, w,h,1 )
frame = CYLINDERnew( 3, 128,128,128, 0,0,90, .01,w,.01, 0,h+.01,0 )
CYLINDERnew( 3, 128,128,128, 0,0,90, .01,w,.01, 0,-(h+.01),0, frame )
CYLINDERnew( 3, 128,128,128, 0,0,0, .01,h,.01, -(w+.01),0,0, frame )
CYLINDERnew( 3, 128,128,128, 0,0,0, .01,h,.01, w+.01,0,0, frame )
CYLINDERnew( 3, 142,100,142, 0,0,-45, .04,.02,.04, w,h,0, frame )
CYLINDERnew( 3, 142,100,142, 0,0,-45, .04,.02,.04, -w,-h,0, frame )
CYLINDERnew( 3, 142,100,142, 0,0,45, .04,.02,.04, w,-h,0, frame )
CYLINDERnew( 3, 142,100,142, 0,0,45, .04,.02,.04, -w,h,0, frame )
EntityParent frame, m\model
PositionEntity frame, 0,0,0
PositionEntity m\model,0,0,2
HideEntity m\model
m\texture = CreateTexture (256,128, 16+32+1)
EntityTexture m\model, m\texture
Read m\title
Read m\options
Read m\initial
For option = 0 To m\options-1
Read m\sub_options[option]
Read m\sub_string[option]
m\sub_current[option] = ( m\sub_options[option] > 1 )
Next
MENUupdate( m, True )
Next
End Function
;==========================================================
;==========================================================
;==========================================================
Function GAMEinit()
;light
RotateEntity light,30,-60,0
;camera
PositionEntity camera,0,250,-250
CameraZoom camera, zoom
CAMERApoint( 0,0,0, 6.75, 1 , 1 , False )
fade = QUADnew( camera , -90 )
EntityColor fade,0,0,0
PositionEntity fade,0,0,6.75
FADE(0)
;menu camera
PositionEntity menu_cam,-25000,0,0
CameraClsMode menu_cam,False,True
PositionEntity menu_cam,65000,65000,65000
EntityOrder menu_cam,-999
;bonus
BONUS\Model = CYLINDERnew(3,255,255,0, -90,0,0, 1,.5,1, 0,0,0, 0, 1,1, 1,1,0 )
;BubbleShield
BubbleMesh = CYLINDERnew( 3,128,128,128, 0,0,0, 3,2,3, 0,-1,0 ,0, 1,1, 1,1, 0)
HideEntity BubbleMesh
EntityShininess BubbleMesh,1
;bullets
BulletMesh = CYLINDERnew( 6, 128,128,128, -90,0,0, .25,.375,.25, 0,0,0 ,0, 1,2, 1,1, 0, 1)
HideEntity BulletMesh
EntityType BulletMesh,T_BULLET
EntityRadius BulletMesh,.5
For b=0 To bullets-1
bullet(b) = New bullet_type
bullet(b)\Model = CopyEntity ( BulletMesh )
bullet(b)\Life = 0
HideEntity bullet(b)\Model
Next
;tanks
For l = 0 To tanks-1
tank(l) = New tank_type
tank(l)\ID = l
tank(l)\r = 100+84*(l=1)+42*(l=3)
tank(l)\g = 100+84*(l=2)+42*(l=3)
tank(l)\b = 100+84*(l=0)
TANKinit ( tank(l) )
Next
;drums
DrumMesh = CYLINDERnew( 3, 168,116,100, 0,0,0, 1,2,1, 0,0,0 )
HideEntity DrumMesh
For l=0 To drums-1
drum(l) = New drum_type
drum(l)\Model = CopyEntity ( DrumMesh )
drum(l)\ID = l
EntityType drum(l)\Model,T_DRUM
EntityRadius drum(l)\Model,1.5,2
NameEntity drum(l)\Model,Handle(drum(l))
EntityPickMode drum(l)\Model, 1
Next
;sounds
If SOUNDon
SOUNDexplode = LoadSound("Explode.wav")
SOUNDclang = LoadSound("Clang.wav")
SOUNDhit = LoadSound("Hit.wav")
SOUNDlaser = LoadSound("Laser.wav")
SOUNDmenu = LoadSound("Menu.wav")
SOUNDbonus = LoadSound("Bonus.wav")
EndIf
;GunTarget
GunTarget = CreateSphere()
EntityColor GunTarget,50,20,20
EntityBlend GunTarget,3
ScaleEntity GunTarget,2,2,2
HideEntity GunTarget
ARENAinit()
PARTICLEinit()
MENUinit()
GAMEreset ()
End Function
;==========================================================
;==========================================================
;==========================================================
Function PARTICLEinit()
ParticleTemplate = CYLINDERnew(6, 0,0,0, 0,30,0, 1,.75,1, 0,0,0 , 0, 2,2, 1,1, 2, 1)
ParticleMesh = CreateMesh()
EntityFX ParticleMesh,32+2
EntityShininess ParticleMesh,1
s= CreateSurface( ParticleMesh )
gs = GetSurface(ParticleTemplate,1)
cv = CountVertices ( gs )
ct = CountTriangles ( gs )
For l= 0 To particles-1
vs= l * cv
particle(l) = New particle_type
particle(l)\Vertex = vs
For v=0 To cv-1
v0 = AddVertex(s,0,0,0)
VertexNormal s,v0,VertexNX(gs,v),VertexNY(gs,v),VertexNZ(gs,v)
Next
For t=0 To ct - 1
AddTriangle s, TriangleVertex( gs,t,0)+vs,TriangleVertex( gs,t,1)+vs,TriangleVertex( gs,t,2)+vs
Next
Next
End Function
;==========================================================
;==========================================================
;==========================================================
Function ARENAinit()
Ground=QUADnew( 0, 0, 45,1,45)
EntityOrder Ground,1
EntityColor Ground,0,0,0
EntityBlend Ground,3
;EntityAlpha Ground,.75
Plane = CreatePlane()
EntityColor Plane,0,0,0
PositionEntity Plane,0,-.5,0
EntityAlpha Plane,.5 ;75
EntityOrder Plane,1
Mirror = CreateMirror()
PositionEntity Mirror,0,-.1,0
Texture=CreateTexture(64,64)
SetBuffer TextureBuffer(Texture)
For y=0 To 1:For x=0 To 1
If ( x + y ) Mod 2 = 0 Color 128,32,128 Else Color 64,16,64
Rect x*32,y*32,32,32,1
Next:Next
SetBuffer BackBuffer()
ScaleTexture Texture,1.0/9.0,1.0/9.0
TextureBlend Texture,3
EntityTexture Ground,Texture
FreeTexture Texture
part = CYLINDERnew( 3, 142,100,142, 0,0,0, 2,3,2, -45,3,45 )
CYLINDERnew( 3, 142,100,142, 90,0,0, 2,3,2, -45,3,0 ,part)
CYLINDERnew( 3, 128,128,128, 90,0,0, .5,20.5,.5 ,-45,4,-22.5 ,part)
CYLINDERnew( 3, 128,128,128, 0,0,90, .5,20.5,.5 ,-22.5,4,-45 ,part)
CYLINDERnew( 3, 128,128,128, 90,0,0, .5,20.5,.5 ,-45,2,-22.5 ,part)
CYLINDERnew( 3, 128,128,128, 0,0,90, .5,20.5,.5 ,-22.5,2,-45 ,part)
CYLINDERnew(3, 128,128,128, 90,0,0, .5,4,.5, -20,4.5,25, part)
CYLINDERnew(3, 128,128,128, 90,0,0, .5,4,.5, -20,1.5,25, part)
CYLINDERnew(3, 128,128,128, 0,0,90, .5,4,.5, -25,4.5,20, part)
CYLINDERnew(3, 128,128,128, 0,0,90, .5,4,.5, -25,1.5,20, part)
CYLINDERnew(3, 142,100,142, 0,0,0, 1,3,1, -20,3,20, part)
CYLINDERnew(3, 142,100,142, 0,0,0, 1,3,1, -30,3,20, part)
CYLINDERnew(3, 142,100,142, 0,0,0, 1,3,1, -20,3,30, part)
ARENA\model = CYLINDERnew( 3,142,100,142, 0,0,0 ,3,2,3, 0,2,0 ,0, 1,1, 1,.5 )
ARENA\radar = CYLINDERnew( 3,128,128,128,0,0,0,.5,1,1,0,5,0, 0,1,1 )
CYLINDERnew( 3,142,100,142,90,0,0,2,2,2,0,8,0, ARENA\radar,2,2, 1, 1 )
EntityType ARENA\Model,T_ARENA
EntityPickMode ARENA\Model,2
For l=0 To 3
temp = CopyMesh(part):RotateMesh temp,0,l*90,0
AddMesh temp,ARENA\Model:FreeEntity temp
px = 39*( ( l=3 ) - ( l = 0) ) + 13 * ( (l = 2) - ( l = 1) )
ARENA\hud = CYLINDERnew( 3, 96,96,96, 0,0,90, .25,8,.25, px,13,45 )
temp = CYLINDERnew( 3, 96,96,96, 0,0,90, 2,.5,1, px - 8.5,12,45, ARENA\hud)
temp = CYLINDERnew( 3, 96,96,96, 0,0,90, 2,.5,1, px + 8.5,12,45, ARENA\hud )
temp = CYLINDERnew( 3, 96,96,96, 0,0,90, .2,8,.2, px ,10.5,45, ARENA\hud )
Next
FreeEntity part
End Function
;==========================================================
;==========================================================
;==========================================================
Function TANKinit( t.tank_type )
;Turret
t\Turret = CYLINDERnew( 6 , 128,128,128 , 0,0,0 , 1,.5,1 , 0,0,0 )
;ariel
CYLINDERnew( 4 , t\r,t\g,t\b , 0,0,0 , .1,1,.1 , .5,1,-.5 , t\Turret)
;hatch
CYLINDERnew( 4 , t\r,t\g,t\b , 0,0,0 , .3,.25,.3 , -.25,.5,.25, t\Turret)
;barrel
CYLINDERnew( 4 , 128,128,128 , 90,0,0 , .25,.5,.25 ,0,0,1.5, t\Turret )
;nosel
CYLINDERnew( 6 , t\r,t\g,t\b , 90,0,0 , .5,.5,.5 , 0,0,2.5 , t\Turret ,0,1 , .75,1)
;Turret base
CYLINDERnew( 6, t\r,t\g,t\b , 0,0,0 , 1.5,.25,1.5 , 0,-.75,0 , t\Turret )
;Base
t\Model = CYLINDERnew( 6, 128,128,128 , 0,0,0 , .75,.5,1.75 , 0,1.5,-.5 )
;Exhaust
CYLINDERnew( 6, t\r,t\g,t\b , 90,0,0 , .25,.25,.25 , 0,1.5,-2.5 , t\Model ,1,0 )
EntityRadius t\Model,2.75
EntityPickMode t\Model, 1
EntityType t\Model,T_TANK
;tracks
For x# = -1.25 To 1.25 Step 2.5
CYLINDERnew( 6, 64,64,64 , 0,0,90 , 1,.5,2 , x ,1,0 , t\Model ,0,0 )
CYLINDERnew( 3, t\r,t\g,t\b, 0,0,-90 , .5,.5,.5 , x,1,0 , t\Model ,1,1)
CYLINDERnew( 3, t\r,t\g,t\b, 0,0,-90 , .4,.4,.4 , x,1,-1 , t\Model ,1,1)
CYLINDERnew( 3, t\r,t\g,t\b, 0,0,-90 , .4,.4,.4 , x,1,1 , t\Model ,1,1)
Next
PositionMesh t\Model,0,-3,0
NameEntity t\Model,Handle(t)
NameEntity t\Turret,Handle(t)
;mine model
t\Mine = CYLINDERnew( 6 , 128,128,128 , 0,0,0 , 1,.1,1 , 0,-2.8,0 )
CYLINDERnew( 6 , t\r,t\g,t\b , 0,0,0 , .5,.1,.5 , 0,-2.6,0, t\Mine )
;bubble shield for respawn
t\BubbleShield = CopyEntity (BubbleMesh, t\Model)
EntityColor t\BubbleShield,t\r,t\g,t\b
;hud
px = 39*( ( t\ID=3 ) - ( t\ID = 0) ) +13 * ( (t\ID = 2) - ( t\ID = 1) )
t\LifeBar = CYLINDERnew( 3, t\r,t\g,t\b, 0,0,90, 1,8,1, 0,0,0 )
PositionEntity t\LifeBar,px,13,45
t\PowerBar = CYLINDERnew( 3, t\r*.5,t\g*.5,t\b*.5, 0,0,90, .5,8,.5, 0,0,0 )
PositionEntity t\PowerBar,px,13,45
t\CoolerBar = CYLINDERnew( 3, t\r*.75,t\g*.75,t\b*.75, 0,0,90,.5,8,.5,0,0,0 )
PositionEntity t\CoolerBar,px,10.5,45
ScoreMesh = QUADnew(Plane,-90,2.5,2.5,1)
PositionEntity ScoreMesh,px,7.5,45
t\ScoreTexture = CreateTexture(32,32)
EntityTexture ScoreMesh, t\ScoreTexture
End Function
;==========================================================
;==========================================================
;==========================================================
Function CYLINDERnew( segs=12 ,r,g,b, rx,ry,rz, sx#,sy#,sz# , px#,py#,pz# ,parent = 0, b_in#=1.0, t_in#=1.0 , b_wi#=1.0, t_wi#=1.0, fx#=2, de#=Detail )
segs = segs * de
mesh = CreateMesh():s = CreateSurface(mesh)
For y# = -1 To 1 Step 2
w# = b_wi * (y=-1) + t_wi * (y=1)
For v = 0 To segs-1
a# = Float(v) * ( 360.0 / Float(segs) )
v0 = AddVertex( s,w*Cos(a),y,w*Sin(a) )
VertexColor s,v0,r,g,b
Next
Next
vb = AddVertex(s,0,b_in,0):VertexColor s,vb,r*b_in,g*b_in,b*b_in
vt = AddVertex(s,0,-t_in,0):VertexColor s,vt,r*t_in,g*t_in,b*t_in
For v1 = 0 To segs-1
v2 = ( v1 + 1) Mod segs
v3 = ( v2 + segs )
v4 = ( v1 + segs )
AddTriangle s,vt,v1,v2
AddTriangle s,vb,v3,v4
AddTriangle s,v3,v2,v1
AddTriangle s,v1,v4,v3
Next
ScaleMesh mesh,sx,sy,sz
RotateMesh mesh,rx,ry,rz
PositionMesh mesh ,px,py,pz
UpdateNormals mesh
EntityFX mesh,fx
EntityShininess mesh,1.0
If fx=0 EntityColor mesh,r,g,b
If parent > 0
AddMesh mesh,parent:FreeEntity mesh
Else
Return mesh
EndIf
End Function
;==========================================================
;==========================================================
;==========================================================
Function QUADnew( parent=0, rx=0 ,sx#=1, sy#=1, sz#=1 )
mesh=CreateMesh(parent)
surface=CreateSurface(mesh)
AddVertex surface,-1,0,1,0,0
AddVertex surface,1,0,1,1,0
AddVertex surface,1,0,-1,1,1
AddVertex surface,-1,0,-1,0,1
AddTriangle surface,0,1,2
AddTriangle surface,2,3,0
RotateMesh mesh,rx,0,0
ScaleMesh mesh,sx,sy,sz
EntityFX mesh,1
Return mesh
End Function
;==========================================================
;==========================================================
;==========================================================
.MENUdata
Data "TANX by Stevie G"
Data 4, 0
Data 3,"Players Demo One Two "
Data 5,"Kills 10 20 30 40 50 "
Data 2,"Control Mouse JoyPad "
Data 1,"Start"
Data "Paused"
Data 2,0
Data 1,"Continue"
Data 1,"Quit" |
Comments
| ||
| Very nice! Love the fact that it's all done in-game, and the particle stuff looks lovely. |
| ||
| This is very fun! Can you please explain to me how to add items to the menu though, because I plan to make a multiplayer version as a little side project. |
| ||
| If it's for a net based multiplayer then let me know what extra options / menus you need and I'll add them for you. The menu code was a bit thrown together , serving it's purpose and not much else. ... or E-mail me @ Stevie.Goodwin@... as I'd be interested to see how you go with this. |
| ||
| cool graphics!! great! |
| ||
| Cheers for the comments guys ... in built sound effects to come. Working on it atm. |
| ||
| Very Nice Stevie G! I would like to develop a TournamentBlitz Edition version. You will receive 100% of the credit. |
| ||
| Sent you an e-mail Frank. |
| ||
| Hey, handy that this has been bumped... Would I be able to use this as a demo program for my free plugin creation system that I've made? I already did the conversion (very simple process... you'll know what I'm talking about in a week...), but it would probably be nice to ask if I can use it. |
| ||
| Mr P / Frank, As long as you give me a bit of credit feel free to do what you like with it :) Feel free to e-mail me at StevieATStevieGoodwin.plus.com if you think I can assist. Stevie |
| ||
| 4 Years later. Incredible. Thanks :-)) JP |
| ||
| its amazing the similarities between the feel of this and the feel polymaniacs has to it. good work (oops it apears i was 4 years late) |
Code Archives Forum