' Missile Lock ' ' Copyright (C) 2006 Ian Cowburn (ianc@noddybox.co.uk) ' ' This program is free software; you can redistribute it and/or modify ' it under the terms of the GNU General Public License as published by ' the Free Software Foundation; either version 2 of the License, or ' (at your option) any later version. ' ' This program is distributed in the hope that it will be useful, ' but WITHOUT ANY WARRANTY; without even the implied warranty of ' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ' GNU General Public License for more details. ' ' You should have received a copy of the GNU General Public License ' along with this program; if not, write to the Free Software ' Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ' ' ------------------------------------------------------------------------- ' ' $Id$ ' Strict Import brl.pngloader Import noddybox.bitmapfont Import noddybox.gfxmenu ' Included binaries ' Incbin "GFX/font.bmf" Incbin "GFX/title.png" Incbin "GFX/ship.png" Incbin "GFX/missile.png" Incbin "GFX/exhaust.png" Incbin "GFX/flame.png" Incbin "GFX/star.png" Incbin "GFX/twinkle.png" Incbin "GFX/asteroid.png" Incbin "GFX/fireball.png" Const HERTZ:Int=70 Const MISSILE_LAYER:Int=1 Const ASTEROID_LAYER:Int=2 Const ALL_LAYERS:Int=3 Type GFX Global font:TBitmapFont Global title:TImage Global ship:TImage Global missile:TImage Global exhaust:TImage Global flame:TImage Global star:TImage Global twinkle:TImage Global asteroid:TImage Global fireball:TImage Function SafeLoadImage:TImage(p:String, mode:Int) Local i:TImage=LoadImage(p,mode) Assert i,"Failed to load " + p Return i End Function Function SafeLoadAnimImage:TImage(p:String, w:Int, h:Int, f:Int, c:Int, mode:Int) Local i:TImage=LoadAnimImage(p,w,h,f,c,mode) Assert i,"Failed to load " + p Return i End Function Function Init() font=TBitmapFont.Load("incbin::GFX/font.bmf",0) Assert font,"Failed to load incbin::GFX/font.bmf" title=SafeLoadImage("incbin::GFX/title.png",0) ship=SafeLoadImage("incbin::GFX/ship.png",FILTEREDIMAGE) flame=SafeLoadImage("incbin::GFX/flame.png",FILTEREDIMAGE) MidHandleImage(ship) MidHandleImage(flame) missile=SafeLoadImage("incbin::GFX/missile.png",FILTEREDIMAGE) exhaust=SafeLoadImage("incbin::GFX/exhaust.png",FILTEREDIMAGE) SetImageHandle(missile,3,7) SetImageHandle(exhaust,3,3) star=SafeLoadImage("incbin::GFX/star.png",0) SetImageHandle(star,1,1) twinkle=SafeLoadAnimImage("incbin::GFX/twinkle.png",8,8,0,6,0) SetImageHandle(star,2,2) asteroid=SafeLoadImage("incbin::GFX/asteroid.png",FILTEREDIMAGE) MidHandleImage(asteroid) fireball=SafeLoadImage("incbin::GFX/fireball.png",FILTEREDIMAGE) SetImageHandle(fireball,15,15) End Function End Type Type GameConfig Global kleft:Int Global kright:Int Global kpause:Int Global kthrust:Int Global hiscore:Int Global maxlevel:Int Global accepted:Int Function Load() Local s:TStream=ReadStream("mlock.config") If s=Null kleft=KEY_LEFT kright=KEY_RIGHT kthrust=KEY_SPACE kpause=KEY_P hiscore=0 maxlevel=1 accepted=False Return EndIf s=LittleEndianStream(s) kleft=s.ReadInt() kright=s.ReadInt() kthrust=s.ReadInt() kpause=s.ReadInt() hiscore=s.ReadInt() maxlevel=s.ReadInt() accepted=s.ReadInt() s.Close() End Function Function Save() Local s:TStream=WriteStream("mlock.config") If s=Null Return EndIf s=LittleEndianStream(s) s.WriteInt(kleft) s.WriteInt(kright) s.WriteInt(kthrust) s.WriteInt(kpause) s.WriteInt(hiscore) s.WriteInt(maxlevel) s.WriteInt(accepted) s.Close() End Function EndType Type TEasyLink Field l:TLink Function Create:TEasyLink(l:TList) Local o:TEasyLink=New TEasyLink o.l=l.FirstLink() Return o End Function Method Value:Object() If l Return l.Value() Else Return Null EndIf End Method Method MoveNext() If l l=l.NextLink() EndIf End Method Method Remove() Local ol:TLink=l MoveNext() ol.Remove() End Method End Type Type Scroller Global msg:String Global msgp:Int Global msgx:Int Function Init() Rem msg=" " msg:+"DURING A TEST-FLIGHT OF THE STAR-FIGHTER OGL-X YOU ARE AMBUSHED IN THE ASTEROID FIELD OUTSIDE OF MARS... " msg:+"THE EVIL EMPIRE CANNOT BE ALLOWED TO DESTROY THE PROTOTYPE SO YOU MUST PILOT THE WEAPONLESS CRAFT, " msg:+"AVOIDING THE DEADLY MISSILES UNTIL HELP ARRIVES... " msg:+"SHOW HEART YOUNG PILOT, STAR-FLEET IS DEPENDING UPON YOU!" EndRem msg=" " msg:+"IT IS A TIME OF WAR. IN A LAST DITCH ATTEMPT TO WIN A LOSING WAR THAT HAS RAGED THROUGH THE GALAXY AGAINST THE EVIL EMPIRE " msg:+"A NEW SHIP, THE DX-9, HAS BEEN DEVELOPED. ON A ROUTINE TEST FLIGHT THE SHIP HAS BEEN AMBUSHED IN AN ASTEROID FIELD. " msg:+"WEAPONLESS, YOU MUST PILOT THE DX-9 AND AVOID THE EMPIRE'S MISSILE SALVOS AMONGST THE ASTEROIDS... HELP WILL ARRIVE EVENTUALLY, " msg:+"BUT UNTIL THEN YOU ARE OUR LAST HOPE. IF THE DX-9 IS LOST THEN SO IS THE EARTH. EARTH IS DEPENDING ON YOU!!!" msgx=0 msgp=0 End Function Function Draw(y:Int) GFX.font.Draw(msg[..70],msgx,y) msgx:-2 If msgx<-GFX.font.TextWidth(msg[0..1]) msgx:+GFX.font.TextWidth(msg[0..1]) msg=msg[1..]+msg[0..1] EndIf End Function End Type Type VText Field t:String Field y:Int Function Create:VText(t:String, y:Int) Local o:VText=New VText o.t=t o.y=y Return o End Function End Type Type VerticalScroller Global msg:TList Global maxy:Int Method New() msg=CreateList() maxy=0 End Method Method Add(s:String) SetScale(2,2) msg.AddLast(VText.Create(s,maxy+800)) maxy:+GFX.font.TextHeight(s) SetScale(1,1) End Method Method Draw() SetScale(2,2) For Local o:VText=EachIn msg o.y:-1 If o.y<-GFX.font.TextHeight(o.t) o.y:+maxy EndIf If o.y<799 GFX.font.Centre(o.t,o.y) EndIf Next SetScale(1,1) End Method End Type Type Thanks Global item:String[] Global i:Int Global wait:Int Global a:Double Global ai:Double Function Init() item=["HTTP://WWW.SLAYRADIO.ORG/", .. "HTTP://WWW.BLITZBASIC.COM/"] i=0 a=0 ai=0.05 End Function Function Draw(y:Int) SetAlpha(a) GFX.font.Centre(item[i],y) SetAlpha(1) If wait wait:-1 Else a:+ai If a>1 wait=HERTZ*5 ai=-0.05 a=1 ElseIf a<0 i=(i+1) Mod item.length ai=0.05 a=0 EndIf EndIf End Function End Type Type TFadeScreen Field a:Double Field ai:Double Function Create:TFadeScreen(a:Double, ai:Double) Local o:TFadeScreen=New TFadeScreen o.a=a o.ai=ai Return o End Function Function FadeOut:TFadeScreen() Return Create(0,0.05) End Function Function FadeIn:TFadeScreen() Return Create(1,-0.05) End Function Function DoFadeIn() Local fade:TFadeScreen=TFadeScreen.FadeIn() Local pm:TPixmap=GrabPixmap(0,0,GraphicsWidth(),GraphicsHeight()) While fade.Fade() Cls DrawPixmap(pm,0,0) fade.Draw() Flip Wend End Function Function DoFadeOut() Local fade:TFadeScreen=TFadeScreen.FadeOut() Local pm:TPixmap=GrabPixmap(0,0,GraphicsWidth(),GraphicsHeight()) While fade.Fade() Cls DrawPixmap(pm,0,0) fade.Draw() Flip Wend End Function Method Fade:Int() a:+ai Return a>0 And a<1 End Method Method Draw() Local r:Int,g:Int,b:Int Local x:Float,y:Float Local oa:Double=GetAlpha() GetColor(r,g,b) GetOrigin(x,y) SetAlpha(a) SetColor(0,0,0) DrawRect(-x,-y,GraphicsWidth(),GraphicsHeight()) SetColor(r,g,b) SetAlpha(oa) End Method End Type Type Number Function Format:String(num:Int) Local c:Int=0 Local ret:String="" Local a:String=String.FromInt(num) For Local f:Int=a.length-1 To 0 Step -1 If ret.length And (c Mod 3)=0 ret=","+ret EndIf ret=a[f..f+1]+ret c:+1 Next Return ret End Function End Type