SourceCastle


Description:
The source file Castle.bb modified by RepeatUntil to include a few comments.


The source file:
; The castle demo documented by Cod2Doc!
; This is a very basic example to show how to comment your code.
; Some Piece of code are commented (by RepeatUntil, sorry Mark ;), some are not
;; (just to show that even without comment, nice documentation is produced).
;
; You can also see the [bb source file]SourceCastle.html from which the documentation was created.


;author Mark Sibly


Global ATYPE_PLAYER=1,AATYPE_BULLET=2,AAATYPE_TARGET=3


Const FPS=30
Const n_trees=100 ; Numbers of trees

Global info1$="Castle Demo"
Global info2$="Featuring dynamic terrain, sliding collisions,"
Global info3$="transparency effects and an intelligent camera"
Global info4$="Arrow keys/A/Z to move, Space to jump, Left-Alt to fire"

Include "../start.bb"

Global shoot=Load3DSound( "sounds\shoot.wav" ) ; The sound when Marios fire
Global boom=Load3DSound( "sounds\boom.wav" ) ; The sound when the bullet hit something
SoundVolume boom,.5

Type Player
  Field entity,model                   ; Entity stuff
  Field anim_speed#,player_y#,roll#    ; Parameters of the entity
End Type

Type ChaseCam
  Field entity,camera,target,heading,sky
End Type

Type Spark
  Field alpha#
  Field sprite
End Type
  
; Type describing the bullet fired by Marios
Type Bullet
  Field rot#        ; The rotation!    
  Field sprite      ; The sprite!
  Field time_out    ; The time after which the bullet disappears
End Type

; Damage created by the bullet
Type Hole
  Field alpha#,sprite ; The sprite and the alpha (yes, really!)
End Type

Const TYPE_PLAYER=1,TYPE_BULLET=2,TYPE_TARGET=3

Const TYPE_SCENERY=10  ; Variable used for the collision
Const TYPE_TERRAIN=11  ; Variable used for the collision

Collisions TYPE_PLAYER,TYPE_TERRAIN,2,3
Collisions TYPE_PLAYER,TYPE_SCENERY,2,2

Collisions TYPE_BULLET,TYPE_TERRAIN,2,1
Collisions TYPE_BULLET,TYPE_SCENERY,2,1

Collisions TYPE_TARGET,TYPE_TERRAIN,2,2
Collisions TYPE_TARGET,TYPE_SCENERY,2,2

Global water_level=-98
Global light,castle,land,ground,water,sky
Global spark_sprite,bull_sprite,player_model,hole_sprite,tree_sprite ; Some sprites!!
Global bull_x#=1.5

Setup()

ChangeDir "environ"
LoadEnviron( "terrain-1.jpg","water-2_mip.bmp","sky","heightmap_256.bmp" )
ChangeDir "..\"

player1.Player=CreatePlayer( 0,10,0 )
camera1.ChaseCam=CreateChaseCam( player1\entity )

period=1000/FPS
time=Millisecs()-period

listener=CreateListener( player1\entity,.1,1,.2 )
piv=CreatePivot()
PositionEntity piv,0,10,40

While Not KeyHit(1)
  If KeyHit(17)
    wire=Not wire
    Wireframe wire
  EndIf
  Repeat
    elapsed=Millisecs()-time
  Until elapsed

  ;how many 'frames' have elapsed  
  ticks=elapsed/period
  
  ;fractional remainder
  tween#=Float(elapsed Mod period)/Float(period)
  
  For k=1 To ticks
    time=time+period
    If k=ticks Then CaptureWorld

    TurnEntity piv,0,5,0
    PositionEntity piv,0,7,40;47+Sin(time*.1)*40,40
    
    UpdateGame()
    UpdateWorld
    PositionEntity water,Sin(time*.01)*10,water_level+Sin(time*.05)*.5,Cos(time*.02)*10
    For c.ChaseCam=Each ChaseCam
      UpdateChaseCam( c )
      PositionEntity sky,EntityX(c\camera),EntityY(c\camera),EntityZ(c\camera)
    Next
  Next
  
  RenderWorld tween
  Flip
  
Wend

End

; This function is the main one of this demo
; It calls UpdateHole(), UpdateBullet(), UpdateSpark() and UpdatePlayer() at each loop
Function UpdateGame()
  For h.Hole=Each Hole
    UpdateHole( h )
  Next
  For b.Bullet=Each Bullet
    UpdateBullet( b )
  Next
  For s.Spark=Each Spark
    UpdateSpark( s )
  Next
  For p.Player=Each Player
    UpdatePlayer( p )
  Next
End Function

Function UpdateHole( h.Hole )
  h\alpha=h\alpha-.005
  If h\alpha>0
    EntityAlpha h\sprite,h\alpha
  Else
    FreeEntity h\sprite
    Delete h
  EndIf
End Function

; Function used to create Marios
; x = the x location of the new entity
; y = the y location of the new entity
; z = the z location of the new entity
; return = the new type handle, ;see Player
;example
; Type Player
;   Field entity,model                   ; Entity stuff
;   Field anim_speed#,player_y#,roll#    ; Parameters of the entity
; End Type
; ; How to use this function:
; player1.Player = CreatePlayer(0,10,0)
;/example
Function CreatePlayer.Player( x#,y#,z# )
  p.Player=New Player
  p\entity=CreatePivot()
  p\model=CopyEntity( player_model,p\entity )
  p\player_y=y
  PositionEntity p\entity,x,y,z
  EntityType p\entity,TYPE_PLAYER
  EntityRadius p\entity,1.5
  ResetEntity p\entity
  Return p
End Function

Function CreateBullet.Bullet( p.Player )
  bull_x=-bull_x
  b.Bullet=New Bullet
  b\time_out=150
  b\sprite=CopyEntity( bull_sprite,p\entity )
  TranslateEntity b\sprite,bull_x,1,.25
  EntityParent b\sprite,0
  EmitSound shoot,b\sprite
  Return b
End Function

; Function updating the bullet.
Function UpdateBullet( b.Bullet )
  If CountCollisions( b\sprite )
    If EntityCollided( b\sprite,TYPE_TERRAIN )
      EmitSound boom,b\sprite
      ex#=EntityX(b\sprite)
      ey#=EntityY(b\sprite)
      ez#=EntityZ(b\sprite)
      TFormPoint( ex,ey,ez,0,land )
      hi#=TerrainHeight( land,TFormedX(),TFormedZ() )
      If hi>0
        hi=hi-.02:If hi<0 Then hi=0
        ModifyTerrain land,TFormedX(),TFormedZ(),hi,True
      EndIf
      CreateSpark( b )
      FreeEntity b\sprite
      Delete b
      Return
    EndIf
    If EntityCollided( b\sprite,TYPE_SCENERY )
      For k=1 To CountCollisions( b\sprite )
        If GetEntityType( CollisionEntity( b\sprite,k ) )=TYPE_SCENERY
          cx#=CollisionX( b\sprite,k )
          cy#=CollisionY( b\sprite,k )
          cz#=CollisionZ( b\sprite,k )
          nx#=CollisionNX( b\sprite,k )
          ny#=CollisionNY( b\sprite,k )
          nz#=CollisionNZ( b\sprite,k )
          th.Hole=New Hole
          th\alpha=1
          th\sprite=CopyEntity( hole_sprite )
          PositionEntity th\sprite,cx,cy,cz
          AlignToVector th\sprite,-nx,-ny,-nz,3
          MoveEntity th\sprite,0,0,-.1
          Exit
        EndIf
      Next
      EmitSound boom,b\sprite
      CreateSpark( b )
      FreeEntity b\sprite
      Delete b
      Return
    EndIf
  EndIf
  b\time_out=b\time_out-1
  If b\time_out=0
    FreeEntity b\sprite
    Delete b
    Return
  EndIf
  b\rot=b\rot+30
  RotateSprite b\sprite,b\rot
  MoveEntity b\sprite,0,0,2
End Function

Function CreateSpark.Spark( b.Bullet )
  s.Spark=New Spark
  s\alpha=-90
  s\sprite=CopyEntity( spark_sprite,b\sprite )
  EntityParent s\sprite,0
  Return s
End Function

Function UpdateSpark( s.Spark )
  If s\alpha<270
    sz#=Sin(s\alpha)*5+5
    ScaleSprite s\sprite,sz,sz
    RotateSprite s\sprite,Rnd(360)
    s\alpha=s\alpha+15
  Else
    FreeEntity s\sprite
    Delete s
  EndIf
End Function

; Function to update the player
; Handle the movement of Marios as well as the shot!
; p = the handle of the player type
Function UpdatePlayer( p.Player )
  If KeyHit(56)  ;fire?
    CreateBullet( p )
  EndIf
  
  If KeyDown(203)  ;left/right
    TurnEntity p\entity,0,6,0  ;turn player left/right
  Else If KeyDown(205)
    TurnEntity p\entity,0,-6,0
  EndIf
  
  If KeyDown(30)    ;forward
    If p\anim_speed<=0
      p\anim_speed=1.75
      Animate p\model,1,p\anim_speed
    EndIf
    MoveEntity p\entity,0,0,1
  Else If KeyDown(44)  ;back
    If p\anim_speed>=0
      p\anim_speed=-1.75
      Animate p\model,1,p\anim_speed
    EndIf
    MoveEntity p\entity,0,0,-1
  Else If p\anim_speed  ;stop animating
    p\anim_speed=0
    Animate p\model,0
  EndIf

  Goto skip  
  ex#=EntityX(p\entity):ez#=EntityZ(p\entity)
  PositionEntity p\entity,ex,TerrainY( land,ex,0,ez )+1.5,ez
  Return
  .skip
  
  ty#=EntityY(p\entity)
  y_vel#=(ty-p\player_y)
  p\player_y=ty
  
  If KeyHit(57)  ;jump?
    y_vel=5  ;2.4
  Else
    y_vel=y_vel-.5  ;2
  EndIf
  TranslateEntity p\entity,0,y_vel,0
  
End Function

Function CreateChaseCam.ChaseCam( entity )
  c.ChaseCam=New ChaseCam
  c\entity=entity
  c\camera=CreateCamera()
  
  c\target=CreatePivot( entity )
  PositionEntity c\target,0,3,-10
  EntityType c\target,TYPE_TARGET
  
  c\heading=CreatePivot( entity )
  PositionEntity c\heading,0,0,20
  c\sky=CopyEntity( sky )
  Return c
End Function

Function UpdateChaseCam( c.ChaseCam )

  If KeyDown(200)
    TranslateEntity c\heading,0,-3,0
  Else If KeyDown(208)
    TranslateEntity c\heading,0,+3,0
  EndIf
  
  dx#=EntityX(c\target,True)-EntityX(c\camera,True)
  dy#=EntityY(c\target,True)-EntityY(c\camera,True)
  dz#=EntityZ(c\target,True)-EntityZ(c\camera,True)
  
  TranslateEntity c\camera,dx*.1,dy*.1,dz*.1
  
  PointEntity c\camera,c\heading
    
  PositionEntity c\target,0,0,0
  ResetEntity c\target
  PositionEntity c\target,0,3,-10

  PositionEntity c\sky,EntityX(c\camera),EntityY(c\camera),EntityZ(c\camera)
End Function

; Function creating the environ
; arg1 = The texture of the land
; arg2 = The texture of the water
; arg3 = Guess what? The texture of the sky
; arg4 = The image file representing the height map
Function LoadEnviron( land_tex$,water_tex$,sky_tex$,height_map$ )

  light=CreateLight()
  TurnEntity light,45,45,0
  
  land_tex=LoadTexture( land_tex$,1 )
  ScaleTexture land_tex,10,10

  land=LoadTerrain( height_map$ )
  EntityTexture land,land_tex
  
  TerrainShading land,True
  PositionEntity land,-1000,-100,-1000
  ScaleEntity land,2000.0/256,100,2000.0/256
  EntityType land,TYPE_TERRAIN
  TerrainDetail land,750,True
  
  For k=1 To n_trees
    Repeat
      tx#=Rnd(-70,70)-150
      tz#=Rnd(-70,70)+400
      ty#=TerrainY( land,tx,0,tz )
    Until ty>water_level
    t=CopyEntity( tree_sprite )
    PositionEntity t,tx,ty,tz
    ScaleSprite t,Rand(2,3),Rand(4,6)
  Next
  
  ground=CreatePlane()
  EntityTexture ground,land_tex
  PositionEntity ground,0,-100,0
  EntityOrder ground,9
  
  water_tex=LoadTexture( water_tex$,3 )
  ScaleTexture water_tex,20,20
  
  water=CreatePlane()
  EntityTexture water,water_tex
  PositionEntity water,0,water_level,0
    
  sky=LoadSkyBox( sky_tex$ )
  EntityOrder sky,10
  HideEntity sky

End Function

Function LoadSkyBox( file$ )
  m=CreateMesh()
  ;front face
  b=LoadBrush( file$+"_FR.jpg",49 )
  s=CreateSurface( m,b )
  AddVertex s,-1,+1,-1,0,0:AddVertex s,+1,+1,-1,1,0
  AddVertex s,+1,-1,-1,1,1:AddVertex s,-1,-1,-1,0,1
  AddTriangle s,0,1,2:AddTriangle s,0,2,3
  FreeBrush b
  ;right face
  b=LoadBrush( file$+"_LF.jpg",49 )
  s=CreateSurface( m,b )
  AddVertex s,+1,+1,-1,0,0:AddVertex s,+1,+1,+1,1,0
  AddVertex s,+1,-1,+1,1,1:AddVertex s,+1,-1,-1,0,1
  AddTriangle s,0,1,2:AddTriangle s,0,2,3
  FreeBrush b
  ;back face
  b=LoadBrush( file$+"_BK.jpg",49 )
  s=CreateSurface( m,b )
  AddVertex s,+1,+1,+1,0,0:AddVertex s,-1,+1,+1,1,0
  AddVertex s,-1,-1,+1,1,1:AddVertex s,+1,-1,+1,0,1
  AddTriangle s,0,1,2:AddTriangle s,0,2,3
  FreeBrush b
  ;left face
  b=LoadBrush( file$+"_RT.jpg",49 )
  s=CreateSurface( m,b )
  AddVertex s,-1,+1,+1,0,0:AddVertex s,-1,+1,-1,1,0
  AddVertex s,-1,-1,-1,1,1:AddVertex s,-1,-1,+1,0,1
  AddTriangle s,0,1,2:AddTriangle s,0,2,3
  FreeBrush b
  ;top face
  b=LoadBrush( file$+"_UP.jpg",49 )
  s=CreateSurface( m,b )
  AddVertex s,-1,+1,+1,0,1:AddVertex s,+1,+1,+1,0,0
  AddVertex s,+1,+1,-1,1,0:AddVertex s,-1,+1,-1,1,1
  AddTriangle s,0,1,2:AddTriangle s,0,2,3
  FreeBrush b
  ;bottom face  
  b=LoadBrush( file$+"_DN.jpg",49 )
  s=CreateSurface( m,b )
  AddVertex s,-1,-1,-1,1,0:AddVertex s,+1,-1,-1,1,1
  AddVertex s,+1,-1,+1,0,1:AddVertex s,-1,-1,+1,0,0
  AddTriangle s,0,1,2:AddTriangle s,0,2,3
  FreeBrush b
  ScaleMesh m,100,100,100
  FlipMesh m
  EntityFX m,1
  Return m
End Function

; Function creating the whole world!!
Function Setup()

  castle=LoadMesh( "castle\castle1.x" )
  ScaleEntity castle,.15,.15,.15
  EntityType castle,TYPE_SCENERY

  player_model=LoadAnimMesh( "markio\mariorun.x" )
  ScaleEntity player_model,.2,.2,.2
  TranslateEntity player_model,0,-1.25,0
  HideEntity player_model

  spark_sprite=LoadSprite( "sprites\bigspark.bmp" )
  HideEntity spark_sprite

  bull_sprite=LoadSprite( "sprites\bluspark.bmp" )
  ScaleSprite bull_sprite,3,3
  EntityRadius bull_sprite,1.5
  EntityType bull_sprite,TYPE_BULLET
  HideEntity bull_sprite
  
  hole_sprite=LoadSprite( "sprites\bullet_hole.bmp",1 )
  EntityBlend hole_sprite,2
  SpriteViewMode hole_sprite,2
  HideEntity hole_sprite
  
  tree_sprite=LoadSprite( "sprites\tree.bmp",7 )
  HandleSprite tree_sprite,0,-1
  ScaleSprite tree_sprite,2,4
  PositionEntity tree_sprite,0,0,-100
  SpriteViewMode tree_sprite,3
  EntityAutoFade tree_sprite,120,150
End Function



Documentation generated by Cod2Doc on 26 Jan 2004.