' Hardwire ' ' Copyright 2005 Ian Cowburn ' ' $Id$ ' ' ' This should really be called Global.bmx probably... ' Strict Import noddybox.bitmapfont Import noddybox.gfxmenu ' Included binaries ' Incbin "GFX/font.bmf" Incbin "GFX/small.bmf" Incbin "GFX/large.bmf" Incbin "GFX/pointer.png" Incbin "GFX/play_button.png" Incbin "GFX/quit_button.png" Incbin "GFX/keys_button.png" Incbin "GFX/rules_button.png" Incbin "GFX/left_button.png" Incbin "GFX/right_button.png" Incbin "GFX/copper.png" Incbin "GFX/copperslice.png" Incbin "GFX/dust.png" Incbin "GFX/title.png" Incbin "GFX/gameover.png" Incbin "GFX/bdropstar.png" Incbin "TILES/tile.png" Incbin "TILES/pit_top.png" Incbin "TILES/pit_bottomleft.png" Incbin "TILES/pit_bottomright.png" Incbin "TILES/pit_bottom.png" Incbin "TILES/pit_side.png" Incbin "TILES/trode_left.png" Incbin "TILES/trode_right.png" Incbin "TILES/trode_bottom.png" Incbin "TILES/top_bottom.png" Incbin "TILES/left_right.png" Incbin "TILES/cross.png" Incbin "TILES/top_left.png" Incbin "TILES/top_right.png" Incbin "TILES/bottom_left.png" Incbin "TILES/bottom_right.png" Incbin "TILES/special_bomb.png" Incbin "TILES/special_twister.png" Const HERTZ:Int=60 Type Lookup Global si:Double[] Global co:Double[] Function Init() si=New Double[360] co=New Double[360] For Local a:Int=0 To 359 si[a]=Sin(a) co[a]=Cos(a) Next End Function End Type Type GameGFX Global font:TBitmapFont Global small:TBitmapFont Global large:TBitmapFont Global title:TImage Global gameover:TImage Global pointer:TImage Global copper:TImage Global copperslice:TImage Global dust:TImage Global play_button:TImage Global quit_button:TImage Global left_button:TImage Global right_button:TImage Global rules_button:TImage Global keys_button:TImage Global tile:TImage Global pit_top:TImage Global pit_bottomleft:TImage Global pit_bottomright:TImage Global pit_bottom:TImage Global pit_side:TImage Global trode_left:TImage Global trode_right:TImage Global trode_bottom:TImage Global top_bottom:Timage Global left_right:Timage Global cross:Timage Global top_left:Timage Global top_right:Timage Global bottom_left:Timage Global bottom_right:Timage Global special_bomb:TImage Global special_twister:TImage Global bdropstar: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) small=TBitmapFont.Load("incbin::GFX/small.bmf",0) large=TBitmapFont.Load("incbin::GFX/large.bmf",0) Assert font,"Failed to load incbin::GFX/font.bmf" Assert small,"Failed to load incbin::GFX/small.bmf" Assert large,"Failed to load incbin::GFX/large.bmf" title=SafeLoadImage("incbin::GFX/title.png",0) gameover=SafeLoadImage("incbin::GFX/gameover.png",0) MidHandleImage(gameover) pointer=SafeLoadImage("incbin::GFX/pointer.png",0) copper=SafeLoadImage("incbin::GFX/copper.png",0) copperslice=SafeLoadImage("incbin::GFX/copperslice.png",0) dust=SafeLoadImage("incbin::GFX/dust.png",FILTEREDIMAGE) MidHandleImage(dust) play_button=SafeLoadImage("incbin::GFX/play_button.png",0) quit_button=SafeLoadImage("incbin::GFX/quit_button.png",0) rules_button=SafeLoadImage("incbin::GFX/rules_button.png",0) keys_button=SafeLoadImage("incbin::GFX/keys_button.png",0) left_button=SafeLoadImage("incbin::GFX/left_button.png",0) right_button=SafeLoadImage("incbin::GFX/right_button.png",0) tile=SafeLoadImage("incbin::TILES/tile.png",0) pit_top=SafeLoadImage("incbin::TILES/pit_top.png",0) pit_bottom=SafeLoadImage("incbin::TILES/pit_bottom.png",0) pit_bottomleft=SafeLoadImage("incbin::TILES/pit_bottomleft.png",0) pit_bottomright=SafeLoadImage("incbin::TILES/pit_bottomright.png",0) pit_side=SafeLoadImage("incbin::TILES/pit_side.png",0) trode_left=SafeLoadImage("incbin::TILES/trode_left.png",0) trode_right=SafeLoadImage("incbin::TILES/trode_right.png",0) trode_bottom=SafeLoadImage("incbin::TILES/trode_bottom.png",0) top_bottom=SafeLoadImage("incbin::TILES/top_bottom.png",0) left_right=SafeLoadImage("incbin::TILES/left_right.png",0) cross=SafeLoadImage("incbin::TILES/cross.png",0) top_left=SafeLoadImage("incbin::TILES/top_left.png",0) top_right=SafeLoadImage("incbin::TILES/top_right.png",0) bottom_left=SafeLoadImage("incbin::TILES/bottom_left.png",0) bottom_right=SafeLoadImage("incbin::TILES/bottom_right.png",0) special_bomb=SafeLoadAnimImage("incbin::TILES/special_bomb.png",32,32,0,4,DYNAMICIMAGE) special_twister=SafeLoadAnimImage("incbin::TILES/special_twister.png",32,32,0,4,DYNAMICIMAGE) bdropstar=SafeLoadAnimImage("incbin::GFX/bdropstar.png",8,8,0,6,0)'FILTEREDIMAGE) End Function End Type Type GameConfig Global kleft:Int Global kright:Int Global krotright:Int Global krotleft:Int Global kdrop:Int Global kpause:Int Global start_level:Int Global hiscore:Int Function Load() Local s:TStream=ReadStream("hardwire.config") If s=Null kleft=KEY_LEFT kright=KEY_RIGHT krotright=KEY_UP krotleft=KEY_DOWN kdrop=KEY_SPACE kpause=KEY_P start_level=1 hiscore=0 Return EndIf s=LittleEndianStream(s) kleft=s.ReadInt() kright=s.ReadInt() krotright=s.ReadInt() krotleft=s.ReadInt() kdrop=s.ReadInt() kpause=s.ReadInt() start_level=s.ReadInt() hiscore=s.ReadInt() s.Close() End Function Function Save() Local s:TStream=WriteStream("hardwire.config") If s=Null Return EndIf s=LittleEndianStream(s) s.WriteInt(kleft) s.WriteInt(kright) s.WriteInt(krotright) s.WriteInt(krotleft) s.WriteInt(kdrop) s.WriteInt(kpause) s.WriteInt(start_level) s.WriteInt(hiscore) 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 TMenuBdrop_Orig Extends TGfxMenuBackdrop Const NUM:Int=3 Const SIZE:Double=50.0 Const OFFSET:Double=500.0 Field a:Int[NUM] Field msg:String Field msgp:Int Field msgx:Int Field msgy:Int Method New() For Local f:Int=0 Until NUM a[f]=360/NUM*f Next msg=" " msg:+"Welcome to Hardwire. " 'msg:+"Welcome to Hardwire. The object of the game is to connect the electrodes around the side of the pit using " 'msg:+"the wires embedded in the blocks. " 'msg:+"If you let the pit overflow the game is over. That's all there is to it... Press the RULES button for help on how to play. " msg:+"Hardwire was written using BlitzMax -- http://www.blitzbasic.com/ -- and a variety of tools available at " msg:+"http://www.noddybox.demon.co.uk/ Please feel free to forward this game to whoever you hate enough " msg:+"to inflict this monstrosity upon. Enjoy. This game written under the influence of Slay Radio -- http://www.slayradio.org" msgx=0 msgp=0 msgy=OFFSET End Method Method Create:TGfxMenuBackdrop() Return Self End Method Method Update() For Local f:Int=0 Until NUM a[f]=(a[f]+2) Mod 360 If a[f]<=180 Local c:Int=128-Abs(64*Lookup.si[a[f]]) SetColor(c,c,c) DrawImage(GameGFX.copper,0,OFFSET+SIZE*Lookup.co[a[f]]) EndIf Next GameGFX.large.Draw(msg[..80],msgx,msgy) msgx:-2 If msgx<-GameGFX.large.TextWidth(msg[0..1]) msgx:+GameGFX.large.TextWidth(msg[0..1]) msg=msg[1..]+msg[0..1] EndIf For Local f:Int=0 Until NUM If a[f]>180 Local c:Int=128+Abs(64*Lookup.si[a[f]]) SetColor(c,c,c) DrawImage(GameGFX.copper,0,OFFSET+SIZE*Lookup.co[a[f]]) EndIf Next SetColor(255,255,255) End Method End Type Type TMenuBdrop Extends TGfxMenuBackdrop Field msg:String Field msgp:Int Field msgx:Int Field msgy:Int Method New() msg=" " msg=" " msg:+"Welcome to Hardwire. " 'msg:+"Welcome to Hardwire. The object of the game is to connect the electrodes around the side of the pit using " 'msg:+"the wires embedded in the blocks. " 'msg:+"If you let the pit overflow the game is over. That's all there is to it... Press the RULES button for help on how to play. " msg:+"Hardwire was written using BlitzMax -- http://www.blitzbasic.com/ -- and a variety of tools available at " msg:+"http://www.noddybox.demon.co.uk/ Please feel free to forward this game to whoever you hate enough " msg:+"to inflict this monstrosity upon. Enjoy. This game written under the influence of Slay Radio -- http://www.slayradio.org" msgx=0 msgp=0 msgy=560 End Method Method Create:TGfxMenuBackdrop() Return Self End Method Method Update() GameGFX.large.Draw(msg[..80],msgx,msgy) msgx:-2 If msgx<-GameGFX.large.TextWidth(msg[0..1]) msgx:+GameGFX.large.TextWidth(msg[0..1]) msg=msg[1..]+msg[0..1] EndIf End Method 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 Method Fade:Int() a:+ai Return a>0 And a<1 End Method Method Draw() Local r:Int,g:Int,b:Int Local oa:Double=GetAlpha() GetColor(r,g,b) SetAlpha(a) SetColor(0,0,0) DrawRect(0,0,GraphicsWidth(),GraphicsHeight()) SetColor(r,g,b) SetAlpha(oa) End Method End Type Type TGameBackdropStar Field x:Double Field y:Double Field dy:Double Field r:Int Field g:Int Field b:Int Field frame:Int Field cnt:Int Method New() x=Rnd(0,GraphicsWidth()) y=Rnd(0,GraphicsHeight()) dy=Rnd(0.1,2) r=Rand(128,255) g=Rand(128,255) b=Rand(128,255) frame=Rand(0,5) cnt=5 End Method Method Draw(anim:Int) If anim frame=(frame+1) Mod 6 EndIf y:+dy If y>GraphicsHeight()+8 y=-8 EndIf SetColor(r,g,b) DrawImage(GameGFX.bdropstar,x,y,frame) End Method End Type Type TGameBackdrop Field num:Int Field star:TGameBackdropStar[] Field cnt:Int Method New() num=100 star=New TGameBackdropStar[num] cnt=5 For Local f:Int=0 Until num star[f]=New TGameBackdropStar Next End Method Method Draw() For Local f:Int=0 Until num star[f].Draw(cnt=0) Next cnt:-1 If cnt=-1 cnt=5 EndIf End Method End Type