' Hardwire ' ' Copyright 2005 Ian Cowburn ' ' $Id$ ' Strict Import "types.bmx" Import "particle.bmx" Import "sounds.bmx" Import "gametypes.bmx" Type TBufferedKey Global list:TList Field key:Int Field del:Int Field cnt:Int Function Clear() list=CreateList() End Function Function Create:TBufferedKey(key:Int, del:Int=30) Local o:TBufferedKey=New TBufferedKey o.key=key o.del=del o.cnt=0 list.AddLast(o) Return o End Function Function Flush() For Local k:TBufferedKey=EachIn list k.cnt=0 Next End Function Function Idle() For Local k:TBufferedKey=EachIn list If k.cnt k.cnt:-1 EndIf Next End Function Method ForceRelease() cnt=999999 End Method Method Poll:Int() If KeyDown(key) If cnt cnt:-1 Return False Else cnt=del Return True EndIf Else cnt=0 Return False EndIf End Method End Type Type TGame Field level:Int Field score:Int Field gm:TGameMap Field timer:Int Field alpha:Double Field alphainc:Double Field count:Int Field total:Int Field block:TPiece Field nextblock:TPiece Field drop:Int Field fade:TFadeScreen Field bdrop:TGameBackdrop Field kleft:TBufferedKey Field kright:TBufferedKey Field krotleft:TBufferedKey Field krotright:TBufferedKey Field kdrop:TBufferedKey Method New() score=0 gm=New TGameMap level=1 Particles.Clear() TextParticles.Clear() ExplosionParticles.Clear() alpha=0.0 alphainc=0.01 count=0 total=0 nextblock=TPiece.Create(False) drop=False CreateNext(False) fade=TFadeScreen.FadeIn() bdrop=New TGameBackdrop TBufferedKey.Clear() kleft=TBufferedKey.Create(GameConfig.kleft) kright=TBufferedKey.Create(GameConfig.kright) krotleft=TBufferedKey.Create(GameConfig.krotleft) krotright=TBufferedKey.Create(GameConfig.krotright) kdrop=TBufferedKey.Create(GameConfig.kdrop,1) End Method Method SetInitLevel(l:Int) level=l SetTimer() End Method Method SetTimer() If drop timer=5 Else timer=Max(HERTZ/5,(16-level)*HERTZ/5) EndIf End Method Method LevelUp() level:+1 count=0 End Method Method CreateNext(special:Int) block=nextblock block.y=-3 block.x=Pit.WIDTH/2 nextblock=TPiece.Create(special) nextblock.x=Pit.WIDTH+3 nextblock.y=1 drop=False End Method Method Pause() Local i:Timage=CreateImage(GraphicsWidth(),GraphicsHeight(),1,MASKEDIMAGE|DYNAMICIMAGE|FILTEREDIMAGE) GrabImage(i,0,0) MidHandleImage(i) SetColor(255,255,255) FlushKeys() Local a:Int[]=[0,0,0,0,0,0,0,0] Local ac:Int[]=[7,6,5,4,3,2,1,0] While Not KeyHit(GameConfig.kpause) Cls Local al:Double=0.3 For Local f:Int=0 Until a.length SetAlpha(al) SetRotation(a[f]) SetScale(al*2,al*2) DrawImage(i,GraphicsWidth()/2,GraphicsHeight()/2) If ac[f]>0 ac[f]:-1 Else If f Mod 2 a[f]:+1 Else a[f]:-1 EndIf EndIf al:+0.1 Next SetRotation(0) SetScale(1,1) GameGFX.large.Centre("PAUSED",GraphicsHeight()/2-16) Flip Wend SetAlpha(1) SetRotation(0) SetScale(1,1) FlushKeys TBufferedKey.Flush() End Method Method Play:Int() Local playing:Int=True Cls bdrop.Draw() GameGFX.large.Draw("SCORE",0,0,255,255,0) GameGFX.large.Draw(score,0,20) GameGFX.large.Draw("LEVEL",0,100,255,255,0) GameGFX.large.Draw(level,0,120) GameGFX.large.Draw("HISCORE",0,200,255,255,0) If score>GameConfig.hiscore GameConfig.hiscore=score EndIf GameGFX.large.Draw(GameConfig.hiscore,0,220) nextblock.Draw() block.Draw() If Not gm.overflow If KeyHit(KEY_ESCAPE) playing=False EndIf If Not gm.BlockInteract() timer:-1 If timer<=0 SetTimer() block.y:+1 If block.Collides(gm) block.y:-1 block.AddToMap(gm) count:+1 total:+1 If count>10 LevelUp() EndIf kdrop.ForceRelease() If Not gm.overflow score:+level*2 CreateNext((total Mod 17)=0) ' 17 Else FlushKeys() TBufferedKey.Flush() EndIf EndIf EndIf If kleft.Poll() block.x:-1 If block.Collides(gm) block.x:+1 EndIf EndIf If kright.Poll() block.x:+1 If block.Collides(gm) block.x:-1 EndIf EndIf If krotright.Poll() block.RotateRight() If block.Collides(gm) block.x:-1 If block.Collides(gm) block.x:+1 block.RotateLeft() EndIf EndIf EndIf If krotleft.Poll() block.RotateLeft() If block.Collides(gm) block.x:+1 If block.Collides(gm) block.x:-1 block.RotateRight() EndIf EndIf EndIf If kdrop.Poll() timer=0 'drop=True EndIf Else TBufferedKey.Idle() EndIf score:+gm.Draw()*level*20 Else gm.Draw() SetAlpha(alpha) SetColor(255,255,255) DrawImage(GameGFX.gameover,GraphicsWidth()/2,GraphicsHeight()/2) SetAlpha(1) alpha:+alphainc If (alpha<=0.7 And alphainc<0) Or (alpha>=1.0 And alphainc>0) alpha=Max(0,Min(1,alpha)) alphainc=-alphainc EndIf If KeyHit(KEY_ENTER) Or KeyHit(KEY_ESCAPE) playing=False EndIf EndIf Particles.Draw() ExplosionParticles.Draw() TextParticles.Draw() If KeyHit(GameConfig.kpause) And Not gm.overflow Pause() EndIf Sound.Process() If fade If fade.Fade() fade.Draw() Else fade=Null EndIf EndIf Flip Return playing End Method End Type