' Hardwire ' ' Copyright 2005 Ian Cowburn ' ' $Id$ ' 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/scores_button.png" Incbin "GFX/keys_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 "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 scores_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 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) title=LoadImage("incbin::GFX/title.png",0) gameover=LoadImage("incbin::GFX/gameover.png",0) MidHandleImage(gameover) pointer=LoadImage("incbin::GFX/pointer.png",0) copper=LoadImage("incbin::GFX/copper.png",0) copperslice=LoadImage("incbin::GFX/copperslice.png",0) dust=LoadImage("incbin::GFX/dust.png",FILTEREDIMAGE) MidHandleImage(dust) play_button=LoadImage("incbin::GFX/play_button.png",0) quit_button=LoadImage("incbin::GFX/quit_button.png",0) scores_button=LoadImage("incbin::GFX/scores_button.png",0) keys_button=LoadImage("incbin::GFX/keys_button.png",0) left_button=LoadImage("incbin::GFX/left_button.png",0) right_button=LoadImage("incbin::GFX/right_button.png",0) tile=LoadImage("incbin::TILES/tile.png",0) pit_top=LoadImage("incbin::TILES/pit_top.png",0) pit_bottom=LoadImage("incbin::TILES/pit_bottom.png",0) pit_bottomleft=LoadImage("incbin::TILES/pit_bottomleft.png",0) pit_bottomright=LoadImage("incbin::TILES/pit_bottomright.png",0) pit_side=LoadImage("incbin::TILES/pit_side.png",0) trode_left=LoadImage("incbin::TILES/trode_left.png",0) trode_right=LoadImage("incbin::TILES/trode_right.png",0) trode_bottom=LoadImage("incbin::TILES/trode_bottom.png",0) top_bottom=LoadImage("incbin::TILES/top_bottom.png",0) left_right=LoadImage("incbin::TILES/left_right.png",0) cross=LoadImage("incbin::TILES/cross.png",0) top_left=LoadImage("incbin::TILES/top_left.png",0) top_right=LoadImage("incbin::TILES/top_right.png",0) bottom_left=LoadImage("incbin::TILES/bottom_left.png",0) bottom_right=LoadImage("incbin::TILES/bottom_right.png",0) special_bomb=LoadAnimImage("incbin::TILES/special_bomb.png",32,32,0,40) special_twister=LoadAnimImage("incbin::TILES/special_twister.png",32,32,0,40) 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 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 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() 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.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 Extends TGfxMenuBackdrop Const NUM:Int=2 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. The object of the game is to connect the electrodes around the side of the pit using " msg:+"the wires embedded in the blocks. Once a circuit is completed those blocks are removed. Once in a while new blocks will fall from the sky. " msg:+"If you let the pit overflow the game is over. That's all there is to it... " 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 on to whoever you despise enough " msg:+"to inflict this monstrosity upon. Enjoy." 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