summaryrefslogtreecommitdiff
path: root/level.bmx
diff options
context:
space:
mode:
Diffstat (limited to 'level.bmx')
-rw-r--r--level.bmx242
1 files changed, 242 insertions, 0 deletions
diff --git a/level.bmx b/level.bmx
new file mode 100644
index 0000000..50411a1
--- /dev/null
+++ b/level.bmx
@@ -0,0 +1,242 @@
+' Particle Pinch
+'
+' Copyright 2005 Ian Cowburn
+'
+' $Id$
+'
+Strict
+Import noddybox.vector
+Import noddybox.bitmapfont
+Import "types.bmx"
+
+Const MAGIC:String="$Version$"
+
+Const MAX_GRAV:Int=10
+Const MAX_POINT:Int=1000
+
+Const GRAV_ATTRACT:Int=0
+Const GRAV_REPEL:Int=0
+
+Const LINE_EVEN:Int=0
+Const LINE_RAND:Int=1
+
+Type TLevelException
+ Field message:String
+
+ Function Error(msg:String)
+ Local o:TLevelException=New TLevelException
+ o.message=msg
+ Throw o
+ End Function
+End Type
+
+Type TGravPoint
+ Field mode:Int
+ Field friendly:Int
+ Field x:Float
+ Field y:Float
+ Field mass:Float
+
+ Method CreateMass:TMass()
+ Local m:TMass=New TMass
+ m.mass=mass
+
+ If friendly
+ m.img=GameGFX.collector
+ m.friend=True
+ Else
+ m.img=GameGFX.star
+ m.friend=False
+ EndIf
+
+ m.x=x
+ m.y=y
+ m.inverse=(mode=GRAV_REPEL)
+ End Method
+
+ Function FromStream:TGravPoint(s:TStream)
+ Local o:TGravPoint=New TGravPoint
+ o.mode=s.ReadInt()
+ o.friendly=s.ReadInt()
+ o.x=s.ReadFloat()
+ o.y=s.ReadFloat()
+ o.mass=s.ReadFloat()
+ Return o
+ End Function
+
+ Method ToStream(s:TStream)
+ s.WriteInt(mode)
+ s.WriteInt(friendly)
+ s.WriteFloat(x)
+ s.WriteFloat(y)
+ s.WriteFloat(mass)
+ End Method
+End Type
+
+Type TPointLine
+ Field mode:Int
+ Field x1:Float
+ Field y1:Float
+ Field x2:Float
+ Field y2:Float
+ Field num:Int
+ Field v:TVector
+
+ Method New()
+ v=TVector.Create()
+ End Method
+
+ Method CreatePoints(l:TList)
+ End Method
+
+ Function FromStream:TPointLine(s:TStream)
+ Local o:TPointLine=New TPointLine
+ o.mode=s.ReadInt()
+ o.x1=s.ReadFloat()
+ o.y1=s.ReadFloat()
+ o.x2=s.ReadFloat()
+ o.y2=s.ReadFloat()
+ o.num=s.ReadInt()
+ o.v.x=s.ReadInt()
+ o.v.y=s.ReadInt()
+ Return o
+ End Function
+
+ Method ToStream(s:TStream)
+ s.WriteInt(mode)
+ s.WriteFloat(x1)
+ s.WriteFloat(y1)
+ s.WriteFloat(x2)
+ s.WriteFloat(y2)
+ s.WriteInt(num)
+ s.WriteInt(v.x)
+ s.WriteInt(v.y)
+ End Method
+End Type
+
+Type TLevel
+ Field name:String
+ Field maxmass:Int
+ Field grav:TList
+ Field point:TList
+ Field winpercent:Int
+ Field timer:Int
+ Field invmass:Int
+
+ Method New()
+ grav=CreateList()
+ point=CreateList()
+ name="Unititled"
+ maxmass=5
+ winpercent=50
+ timer=60
+ invmass=False
+ End Method
+
+ Method CreatePlayfield(masslist:TList, pointlist:TList)
+ For Local gp:TGravPoint=EachIn grav
+ masslist.AddLast(gp.CreateMass())
+ Next
+ For Local lp:TPointLine=EachIn point
+ lp.CreatePoints(pointlist)
+ Next
+ End Method
+
+ Function FromStream:TLevel(s:TStream)
+ Local o:TLevel=New TLevel
+ Local c:Int
+
+ o.name=s.ReadLine()
+ o.maxmass=s.ReadInt()
+ o.winpercent=s.ReadInt()
+ o.timer=s.ReadInt()
+ o.invmass=s.ReadInt()
+
+ c=s.ReadInt()
+ For Local f:Int=1 To c
+ o.grav.AddLast(TGravPoint.FromStream(s))
+ Next
+
+ c=s.ReadInt()
+ For Local f:Int=1 To c
+ o.point.AddLast(TPointLine.FromStream(s))
+ Next
+
+ Return o
+ End Function
+
+ Method ToStream(s:TStream)
+ s.WriteLine(name)
+ s.WriteInt(maxmass)
+ s.WriteInt(winpercent)
+ s.WriteInt(timer)
+ s.WriteInt(invmass)
+ s.WriteInt(grav.Count())
+ For Local o:TGravPoint=EachIn grav
+ o.ToStream(s)
+ Next
+ s.WriteInt(point.Count())
+ For Local o:TPointLine=EachIn point
+ o.ToStream(s)
+ Next
+ End Method
+End Type
+
+
+Type TLevelSet
+ Field name:String
+ Field level:TList
+
+ Method New()
+ level=CreateList()
+ name="Untitled"
+ End Method
+
+ Function FromStream:TLevelSet(file:String)
+ Local s:TStream=ReadStream(file)
+
+ If s=Null
+ TLevelException.Error(file + " couldn't be opened")
+ EndIf
+
+ Local o:TLevelSet=New TLevelSet
+ Local c:Int
+
+ Local m:String=s.ReadLine()
+
+ If m<>MAGIC
+ s.Close()
+ TLevelException.Error(file + " doesn't appear to be a valid file for this version")
+ EndIf
+
+ o.name=s.ReadLine()
+
+ c=s.ReadInt()
+ For Local f:Int=1 To c
+ o.level.AddLast(TLevel.FromStream(s))
+ Next
+
+ s.Close()
+
+ Return o
+ End Function
+
+ Method ToStream:Int(file:String)
+ Local s:TStream=WriteStream(file)
+
+ If s=Null
+ Return False
+ EndIf
+
+ s.WriteLine(MAGIC)
+ s.WriteLine(name)
+ s.WriteInt(level.Count())
+ For Local o:TLevel=EachIn level
+ o.ToStream(s)
+ Next
+
+ s.Close()
+
+ Return True
+ End Method
+End Type