' Particle Pinch ' ' Copyright 2005 Ian Cowburn ' ' $Id$ ' Strict Import noddybox.vector Import noddybox.bitmapfont Import "types.bmx" Import "level.bmx" Type TGame Const LEVEL_NOTOVER:Int= 0 Const LEVEL_WON:Int= 1 Const LEVEL_LOST:Int= 2 Field level:TLevel Field mass:TList Field point:TList Field timer:Int Field num:Int Field lost:Int Field captured:Int Field done:Int Field frame:Int Field placed:Int Field txtoff:Int[] Field playing:Int Field col:Int Field coli:Int Field final_percent:Int Field pass_time:Int Function Create:TGame(level:TLevel) Local o:TGame=New TGame o.level=level o.mass=CreateList() o.point=CreateList() o.level.CreatePlayfield(o.mass,o.point) o.timer=o.level.timer o.num=o.point.Count() o.done=LEVEL_NOTOVER o.frame=0 o.placed=0 o.txtoff=[GameGFX.font.TextWidth("PARTICLES"),GameGFX.font.TextWidth("CAPTURED"),GameGFX.font.TextWidth("TIMER"),GameGFX.font.TextWidth("LEFT")] o.playing=False o.col=0 o.coli=5 o.final_percent=0 o.pass_time=0 Return o End Function Method Intro() Local y:Int=GraphicsHeight()/4 Local yi:Int=25 col:+coli If col=255 Or col=0 coli=-coli EndIf SetScale(2,2) GameGFX.font.CentreColoured(level.name,y,col,col,255-col) y:+yi GameGFX.font.CentreColoured("Need "+level.winpercent+"% to clear",y,col/2,col,col) y:+yi If level.maxmass>1 GameGFX.font.CentreColoured("You can place only "+level.maxmass+" masses",y,col/2,col,col) Else GameGFX.font.CentreColoured("You can place only 1 mass",y,col/2,col,col) EndIf y:+yi If level.invmass GameGFX.font.CentreColoured("PLACED MASSES ARE INVERTED!",y,col,col/2,col/2) y:+yi EndIf If level.placefriend GameGFX.font.CentreColoured("PLACED MASSES ARE COLLECTORS!",y,col,col/2,col/2) y:+yi EndIf y:+yi GameGFX.font.Centre("Press Left Mouse Button",y) y:+yi SetScale(1,1) End Method Method Play:Int() captured=0 lost=0 If playing For Local m:TMass=EachIn mass For Local s:TPoint=EachIn point s.Attract(m) Next Next EndIf TParticleMachine.Process() If playing For Local m:TMass=EachIn mass m.Move() m.Draw() Next Else For Local m:TMass=EachIn mass m.Draw() Next EndIf If playing For Local s:TPoint=EachIn point s.Move() s.Draw() If s.dead captured:+1 ElseIf s.lost lost:+1 EndIf Next Else For Local s:TPoint=EachIn point s.Draw() Next EndIf If playing And done=LEVEL_NOTOVER frame:+1 If frame=60 And timer>0 frame=0 timer:-1 EndIf EndIf Local percent:Int If done<>LEVEL_NOTOVER percent=final_percent Else percent:Int=Int(Float(captured)/Float(num)*100.0) If percent>=level.winpercent And pass_time=0 pass_time=timer EndIf EndIf If (timer=0 Or num=captured+lost) And done=LEVEL_NOTOVER final_percent=percent If percent>=level.winpercent done=LEVEL_WON Else done=LEVEL_LOST EndIf EndIf GameGFX.font.Draw("PARTICLES",0,0) GameGFX.font.DrawColoured(num-captured-lost,txtoff[0]+10,0,255,255,0) GameGFX.font.Draw("CAPTURED",200,0) If percent10 GameGFX.font.Draw(timer,txtoff[2]+610,0) Else GameGFX.font.DrawColoured(timer,txtoff[2]+610,0,255,0,0) EndIf Select done Case LEVEL_NOTOVER If playing If placed