windstille-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Windstille-devel] rev 399 - trunk/src


From: Ingo Ruhnke
Subject: [Windstille-devel] rev 399 - trunk/src
Date: Sun, 06 Jun 2004 23:57:44 +0200

Author: grumbel
Date: 2004-06-06 23:57:44 +0200 (Sun, 06 Jun 2004)
New Revision: 399

Added:
   trunk/src/level.rb
   trunk/src/sector.rb
Modified:
   trunk/src/gui.rb
   trunk/src/gui2.rb
   trunk/src/sexpr.rb
   trunk/src/supertux.rb
Log:
- some more fixes

Modified: trunk/src/gui.rb
===================================================================
--- trunk/src/gui.rb    2004-06-06 19:28:47 UTC (rev 398)
+++ trunk/src/gui.rb    2004-06-06 21:57:44 UTC (rev 399)
@@ -217,17 +217,17 @@
 end
 
 def supertux_load_level(filename)
-  print "Loading: ", filename
-  level = Level(filename)
-  level.activate(workspace)
+  print "Loading: ", filename, "\n"
+  level = Level.new(filename)
+  level.activate($workspace)
   
-  if not(config.recent_files.find(filename)) then
-    config.recent_files.append(filename)
+  if not($recent_files.find{|el| el == filename}) then
+    $recent_files.push(filename)
     $recent_files_menu.add_item($mysprite, filename, 
-                               proc { supertux_load_level(filename) })
+                                proc { supertux_load_level(filename) })
   end
 
-  minimap.update_minimap()
+  $minimap.update_minimap()
 end
 
 def gui_set_zoom(zoom)
@@ -240,19 +240,20 @@
 def menu_file_open()
   print "File/Open"
   level = 
Level('/home/ingo/cvs/supertux/supertux/data/levels/world1/level2.stl')
-  print "Loading done"
-  level.activate(workspace)
+  print "Loading done\n"
+  level.activate($workspace)
   connect(level.editormap.sig_change(), proc{on_map_change()})
   print "Activation done"
 end
 
 def supertux_save_level(filename)
-  $workspace.get_map().get_metadata().save(filename)
+  $workspace.get_map().get_metadata().parent.save(filename)
 end
 
 def gui_switch_sector_menu()
   mymenu = Menu.new(CL_Point.new(530, 54), $gui.get_component())
   for i in $workspace.get_map().get_metadata().parent.get_sectors()
+    print "Sectors: ", i, "\n"
     mymenu.add_item($mysprite, "Sector (%s)" % i,
                     proc { 
$workspace.get_map().get_metadata().parent.activate_sector(i, $workspace) })
   end

Modified: trunk/src/gui2.rb
===================================================================
--- trunk/src/gui2.rb   2004-06-06 19:28:47 UTC (rev 398)
+++ trunk/src/gui2.rb   2004-06-06 21:57:44 UTC (rev 399)
@@ -104,8 +104,6 @@
 $background_icon.set_callback(proc{ gui_show_background() })
 $eye_icon.set_callback(proc{ $layer_menu.run() })
 
-$mysprite = make_sprite("../data/images/icons16/stock_paste-16.png")
-
 $layer_menu.add_item($mysprite, "Show all", proc{ gui_show_all() })
 $layer_menu.add_item($mysprite, "Show current", proc{ gui_show_current() })
 $layer_menu.add_item($mysprite, "Show only current", proc{ 
gui_show_only_current() })
@@ -169,7 +167,7 @@
   for i in objmap_select_tool.get_selection()
     obj = get_python_object(i.get_metadata())
     if obj.__class__ == PathNode
-      pathnodes.append(obj.node)
+      pathnodes.push(obj.node)
     end
   end
 

Added: trunk/src/level.rb
===================================================================
--- trunk/src/level.rb  2004-06-06 19:28:47 UTC (rev 398)
+++ trunk/src/level.rb  2004-06-06 21:57:44 UTC (rev 399)
@@ -0,0 +1,214 @@
+class Level
+  version = 2
+  filename = nil
+  
+  name   = "no name"
+  author = "no author"
+  theme = "antarctica"
+  time = 999
+  music = "Mortimers_chipdisko.mod"
+  
+  objects = nil
+  camera  = nil
+  
+  sectors = nil
+  current_sector = nil
+
+  attr_reader :version, :filename, :name, :author, :theme, :time, :music, 
:objects, :camera, :sectors, :current_sector
+  attr_writer :version, :filename, :name, :author, :theme, :time, :music, 
:objects, :camera, :sectors, :current_sector
+  
+  def initialize(*params)
+    if params.length() == 2 then
+      # New Level
+      (width, height) = params
+      
+      @name   = "No Name"
+      @author = "No Author"
+      
+      @width  = width
+      @height = height
+      
+      @current_sector = Sector.new(self)
+      @current_sector.new_from_size(width, height)
+      @sectors = []
+      @sectors.push(@current_sector)
+      
+    elsif params.length() == 1 then
+      # Load Level from file
+      (@filename,) = params
+      
+      tree = sexpr_read_from_file(@filename)
+      if tree == nil
+        raise("Couldn't load level: ", filename)
+      end
+      
+      data = tree[1..-1]
+      
+      @version = get_value_from_tree(["version", "_"], data, 0)
+      
+      print "VERSION: ", @version, "\n"
+      
+      if (@version == 1) then
+        parse_v1(data)
+      else
+        parse_v2(data)
+      end
+    else
+      raise "Wrong arguments for SuperTux::___init__"
+    end
+  end
+  
+  def parse_v2(data)
+    @name    = get_value_from_tree(["name", "_"], data, "no name")
+    @author  = get_value_from_tree(["author", "_"], data, "no author")
+    @time    = get_value_from_tree(["time", "_"], data, 999)
+    
+    @current_sector = nil
+    @sectors = []
+    for sec in sexpr_filter("sector", data)
+      sector = Sector.new(self)
+      print("DATA: ", sec, "\n")
+      sector.load_v2(sec)
+      @sectors.push(sector)
+      if sector.name == "main"
+        @current_sector = sector
+      end
+    end
+    
+    if @current_sector == nil
+      print "Error: No main sector defined: ", sectors, "\n"
+      @current_sector = @sectors[0]
+    end
+  end
+
+  def parse_v1(data)
+    sector = Sector.new(self)
+    sector.load_v1(data)
+    
+    @sectors = []
+    @sectors.push(sector)
+    @current_sector = sector
+    
+    @name    = get_value_from_tree(["name", "_"], data, "no name")
+    @author  = get_value_from_tree(["author", "_"], data, "no author")
+    @time    = get_value_from_tree(["time", "_"], data, 999)
+  end
+  
+  def save(filename)
+    save_v2(filename)
+  end
+  
+  def save_v2(filename)
+    f = File.new(filename, "w")
+    f.write(";; Generated by Flexlay Editor\n" +
+                                                "(supertux-level\n")
+    f.write("  (version 2)\n")
+    f.write("  (name   \"%s\")\n" % @name)
+    f.write("  (author \"%s\")\n" % @author)
+    f.write("  (time   \"%s\")\n" % @time)   
+    
+    for sector in @sectors
+      f.write("  (sector\n")
+      sector.save(f)
+      f.write("   )\n")
+    end
+
+    f.write(" )\n\n;; EOF ;;\n")
+  end
+  
+  def save_v1(filename)
+    f = File.new(filename, "w")
+    f.write(";; Generated by Flexlay Editor\n" +
+                                                "(supertux-level\n")
+    f.write("  (version 1)\n")
+    f.write("  (name   \"%s\")\n" % @name)
+    f.write("  (author \"%s\")\n" % @author)
+    f.write("  (width  %s)\n"  % @width)
+    f.write("  (height  %s)\n" % @height)
+    
+    f.write("  (music  \"%s\")\n" % @music)
+    f.write("  (time   \"%s\")\n" % @time)
+    
+    f.write("  (gravity %d)\n" % @gravity)
+    
+    f.write("  (theme \"%s\")\n" % @theme)
+    
+    f.write("  (interactive-tm\n")
+    for i in @interactive.get_data()
+      f.write("%d " % i)
+    end
+    f.write("  )\n\n")
+
+    f.write("  (background-tm\n")
+    for i in @background.get_data()
+      f.write("%d " % i)
+    end
+    f.write("  )\n\n")
+
+    f.write("  (foreground-tm\n")
+    for i in @foreground.get_data()
+      f.write("%d " % i)
+    end
+    f.write("  )\n\n")
+
+    f.write("  (camera\n")
+    f.write("    (mode \"autoscroll\")\n")
+    f.write("    (path\n")
+    for obj in @objects.get_objects()
+      pathnode = get_python_object(obj.get_metadata())
+      if (pathnode.__class__ == PathNode)
+        f.write("     (point (x %d) (y %d) (speed 1))\n" % obj.get_pos().x, 
obj.get_pos().y)
+      end
+    end
+    f.write("  ))\n\n")
+    
+    f.write("  (objects\n")
+    for obj in @objects.get_objects()
+      badguy = get_python_object(obj.get_metadata())
+      if (badguy.__class__ == BadGuy)
+        pos    = obj.get_pos()
+        if (badguy.type != "resetpoint")
+          f.write("     (%s (x %d) (y %d))\n" % badguy.type, int(pos.x), 
int(pos.y))
+        end
+      end
+    end
+    f.write("  )\n\n")
+    
+    f.write("  (reset-points\n")
+    for obj in @objects.get_objects()
+      badguy = get_python_object(obj.get_metadata())
+      if (badguy.__class__ == BadGuy)
+        pos    = obj.get_pos()
+        if (badguy.type == "resetpoint")
+          f.write("     (point (x %d) (y %d))\n" % (pos.x.to_i), pos.y.to_i)
+        end
+      end
+    end
+    f.write("  )\n\n")
+    
+    f.write(" )\n\n;; EOF ;;\n")
+  end
+
+  def activate_sector(sector, workspace)
+    for sec in @sectors
+      if sec.name == sector
+        sec.activate(workspace)
+        break
+      end
+    end
+  end
+
+  def add_sector(sector)
+    @sectors.push(sector)
+  end
+
+  def get_sectors()
+    return @sectors.map {|sec| sec.name}
+  end
+
+  def activate(workspace)
+    @current_sector.activate(workspace)
+  end
+end
+
+# EOF #

Added: trunk/src/sector.rb
===================================================================
--- trunk/src/sector.rb 2004-06-06 19:28:47 UTC (rev 398)
+++ trunk/src/sector.rb 2004-06-06 21:57:44 UTC (rev 399)
@@ -0,0 +1,266 @@
+class Sector
+  parent    = nil
+  name      = nil
+  song      = nil
+  gravity   = 10.0
+  
+  width  = nil
+  height = nil
+  
+  background  = nil
+  interactive = nil
+  foreground  = nil
+  
+  objects   = nil
+  editormap = nil
+
+  attr_reader :name, :background, :interactive, :foreground, :parent, :width, 
:height
+  attr_writer :name, :song, :gravity
+  
+  def initialize(parent)
+    @parent = parent
+  end
+
+  def get_level()
+    return @parent
+  end
+
+  def resize(size, pos)
+    @width  = size.width
+    @height = size.height
+    @background.resize(size, pos)
+    @interactive.resize(size, pos)
+    @foreground.resize(size, pos)
+  end
+
+  def new_from_size(width, height)
+    @name = "<No Name>"
+    @song = "<No Song>"
+    @gravity = 10.0
+    
+    @width  = width
+    @height = height
+    
+    @foreground  = TilemapLayer.new($tileset, @width, @height)
+    @interactive = TilemapLayer.new($tileset, @width, @height)
+    @background  = TilemapLayer.new($tileset, @width, @height)       
+    @objects = ObjectLayer.new()
+
+    @editormap = EditorMap.new()
+    @editormap.add_layer(@background.to_layer())
+    @editormap.add_layer(@interactive.to_layer())
+    @editormap.add_layer(@objects.to_layer())
+    @editormap.add_layer(@foreground.to_layer())
+    # FIXME: Data might not get freed since its 'recursively' refcounted
+    @editormap.set_metadata(make_metadata(self))
+    return self
+  end
+
+  def load_v1(data)
+    @name = "<No Name>"
+    @song = "<No Song>"
+    @gravity = 10.0
+    
+    @width  = get_value_from_tree(["width", "_"], data, 20)
+    @height = get_value_from_tree(["height""_"], data, 15)
+    
+    @foreground  = TilemapLayer.new($tileset, @width, @height)
+    @foreground.set_data(get_value_from_tree(["foreground-tm"], data, []))
+    
+    @interactive = TilemapLayer.new($tileset, @width, @height)
+    @interactive.set_data(get_value_from_tree(["interactive-tm"], data, []))
+    
+    @background  = TilemapLayer.new($tileset, @width, @height)
+    @background.set_data(get_value_from_tree(["background-tm"], data, []))
+    
+    @objects = ObjectLayer.new()
+    for i in get_value_from_tree(["objects"], data, [])
+      type = i[0]
+      x = get_value_from_tree(["x", "_"], i[1..-1], 0)
+      y = get_value_from_tree(["y", "_"], i[1..-1], 0)
+      print("Object position: ", type, " ", x, " ", y, "\n")
+      object = $game_objects.find{|x| x[0] == type}
+      print "Resolved object: ", object, "\n"
+      if object
+        # fixme
+        #        
@objects.add_object(ObjMapSpriteObject.new(make_sprite($datadir + object[1]),
+        #                                                   CL_Point.new(x, y),
+        #                                                   
make_metadata(BadGuy.new(object[0]))).to_object())
+      else
+        print "Error: Couldn't resolve object type: ", type, "\n"
+      end
+    end
+    
+    for i in get_value_from_tree(["reset-points"], data, [])
+      type = i[0]
+      x = get_value_from_tree(["x", "_"], i[1..-1], [])
+      y = get_value_from_tree(["y", "_"], i[1..-1], [])
+      object = find($game_objects, "resetpoint")
+      @objects.add_object(ObjMapSpriteObject.new(make_sprite($datadir + 
object[1]),
+                                                 CL_Point.new(x, y),
+                                                 
make_metadata(BadGuy.new(object[0]))).to_object())
+    end
+
+    @editormap = EditorMap.new()
+    @editormap.add_layer(@background.to_layer())
+    @editormap.add_layer(@interactive.to_layer())
+    @editormap.add_layer(@objects.to_layer())
+    @editormap.add_layer(@foreground.to_layer())
+    # FIXME: Data might not get freed since its 'recursively' refcounted
+    @editormap.set_metadata(make_metadata(self))
+  end
+  
+  def load_v2(data)
+    @name = "<No Name>"
+    @song = "<No Song>"
+    @gravity = 10.0
+    
+    @width  = 20
+    @height = 15
+
+    @background  = nil
+    @interactive = nil
+    @foreground  = nil
+    
+    @objects = ObjectLayer.new()
+    print "Data: ", data, "\n"
+    for i in data
+      print "I: ", i, "\n"
+      (name,data) = i[0], i[1..-1]
+      if name == "name"
+        @name = data[0]
+      elsif name == "gravity"
+        @gravity = data[0]
+      elsif name == "playerspawn"
+        print "playerspawn unhandled"
+      elsif name == "tilemap"
+        width   = get_value_from_tree(["width", "_"],  data, 20)
+        height  = get_value_from_tree(["height", "_"], data, 15)
+        solid   = get_value_from_tree(["solid", "_"],  data, false)
+
+        tilemap = TilemapLayer.new($tileset, width, height)
+        tilemap.set_data(get_value_from_tree(["tiles"], data, []))
+        
+        print "Solid: ", solid
+        if solid
+          @interactive = tilemap
+          @width       = width
+          @height      = height
+        elsif not(@background)
+          @background = tilemap
+        elsif not(@foreground)
+          @foreground = tilemap
+        else
+          print "Error: Duplicate tilemap in levelfile\n"
+        end
+      elsif name == "background"
+        print "background unhandled\n"
+      else
+        object = $game_objects.find {|x| x[0] == name}
+        if object != nil
+          (name, image) = object
+          x = get_value_from_tree(["x", "_"], data, 0)
+          y = get_value_from_tree(["y", "_"], data, 0)
+          @objects.add_object(ObjMapSpriteObject.new(make_sprite($datadir + 
image),
+                                                     CL_Point.new(x, y),
+                                                     
make_metadata(BadGuy.new(name))).to_object())
+        else
+          print "Error: Couldn't resolve object type: ", name, "\n"
+          print "Sector: Unhandled tag: ", name, "\n"
+        end
+      end
+    end
+    
+    print "Tileset: ", $tileset, " ", width, " ", height, "\n"
+
+    if (@background == nil)
+      @background = TilemapLayer.new($tileset, @width, @height)
+    end
+
+    if (@interactive == nil)
+      @interactive = TilemapLayer.new($tileset, @width, @height)
+    end
+    
+    if (@foreground == nil)
+      @foreground = TilemapLayer.new($tileset, @width, @height)
+    end
+
+    @editormap = EditorMap.new()
+    @editormap.add_layer(@background.to_layer()) if @background
+    @editormap.add_layer(@interactive.to_layer()) if @interactive
+    @editormap.add_layer(@foreground.to_layer()) if @foreground
+    @editormap.add_layer(@objects.to_layer())
+    
+    @editormap.set_metadata(make_metadata(self))
+  end
+
+  def activate(workspace)
+    workspace.set_map(@editormap)
+    TilemapLayer.set_current(@interactive)
+    ObjectLayer.set_current(@objects)
+    connect(@editormap.sig_change(), proc{on_map_change()})
+  end
+
+  def save(f)   
+    f.write("    (name  \"%s\")\n"  % @name)
+    f.write("    (width  %s)\n"  % @width)
+    f.write("    (height  %s)\n" % @height)   
+    f.write("    (music  \"%s\")\n" % @song)
+    f.write("    (gravity %d)\n" % @gravity)
+
+    f.write("     (interactive-tm\n")
+    for i in interactive.get_data()
+      f.write("%d " % i)
+    end
+    f.write("    )\n\n")
+    
+    f.write("    (background-tm\n")
+    for i in background.get_data()
+      f.write("%d " % i)
+    end
+    f.write("    )\n\n")
+
+    f.write("    (foreground-tm\n")
+    for i in foreground.get_data()
+      f.write("%d " % i)
+    end
+    f.write("    )\n\n")
+
+    f.write("    (camera\n")
+    f.write("      (mode \"autoscroll\")\n")
+    f.write("      (path\n")
+    for obj in @objects.get_objects()
+      pathnode = get_python_object(obj.get_metadata())
+      if (pathnode.__class__ == PathNode)
+        f.write("       (point (x %d) (y %d) (speed 1))\n" % obj.get_pos().x, 
obj.get_pos().y)
+      end
+    end
+    f.write("    ))\n\n")
+
+    f.write("    (objects\n")
+    for obj in @objects.get_objects()
+      badguy = get_python_object(obj.get_metadata())
+      if (badguy.__class__ == BadGuy)
+        pos    = obj.get_pos()
+        if (badguy.type != "resetpoint")
+          f.write("       (%s (x %d) (y %d))\n" % badguy.type, int(pos.x), 
int(pos.y))
+        end
+      end
+    end
+    f.write("    )\n\n")
+
+    f.write("    (reset-points\n")
+    for obj in @objects.get_objects()
+      badguy = get_python_object(obj.get_metadata())
+      if (badguy.__class__ == BadGuy)
+        pos    = obj.get_pos()
+        if (badguy.type == "resetpoint")
+          f.write("       (point (x %d) (y %d))\n" % int(pos.x), int(pos.y))
+        end
+      end
+    end
+    f.write("    )\n\n")
+  end
+end
+
+# EOF #

Modified: trunk/src/sexpr.rb
===================================================================
--- trunk/src/sexpr.rb  2004-06-06 19:28:47 UTC (rev 398)
+++ trunk/src/sexpr.rb  2004-06-06 21:57:44 UTC (rev 399)
@@ -31,7 +31,7 @@
   ret = []
   for i in tree
     if i[0] == name
-      ret.push(*i[1..-1])
+      ret.push(i[1..-1])
     end
   end
     

Modified: trunk/src/supertux.rb
===================================================================
--- trunk/src/supertux.rb       2004-06-06 19:28:47 UTC (rev 398)
+++ trunk/src/supertux.rb       2004-06-06 21:57:44 UTC (rev 399)
@@ -1,3 +1,5 @@
+require "/home/ingo/.flexlay/supertux.rb"
+
 BACKGROUND_LAYER  = 1
 INTERACTIVE_LAYER = 2
 FOREGROUND_LAYER  = 3
@@ -35,10 +37,11 @@
 
 $workspace.set_tool($tilemap_paint_tool.to_tool());
 
-$recent_files = []
+$mysprite = make_sprite("../data/images/icons16/stock_paste-16.png")
+
 $recent_files_menu = Menu.new(CL_Point.new(32*2, 54), $gui.get_component())
 for filename in $recent_files
-  $recent_files_menu.add_item(mysprite, filename, proc{ 
supertux_load_level(filename) })
+  $recent_files_menu.add_item($mysprite, filename, proc{ 
supertux_load_level(filename) })
 end
 
 $minimap = Minimap.new($editor_map, CL_Rect.new(CL_Point.new(3, 488+3-14), 
@@ -140,461 +143,8 @@
                  ["door", "images/shared/door.png"],
                  ["trampoline", "images/shared/trampoline-1.png"]]
 
-
-class Level
-  version = 2
-  filename = nil
-  
-  name   = "no name"
-  author = "no author"
-  theme = "antarctica"
-  time = 999
-  music = "Mortimers_chipdisko.mod"
-  
-  objects = nil
-  camera  = nil
-  
-  sectors = nil
-  current_sector = nil
-
-  attr_reader :version, :filename, :name, :author, :theme, :time, :music, 
:objects, :camera, :sectors, :current_sector
-  attr_writer :version, :filename, :name, :author, :theme, :time, :music, 
:objects, :camera, :sectors, :current_sector
-  
-  def initialize(*params)
-    if params.length() == 2 then
-      # New Level
-      (width, height) = params
-      
-      @name   = "No Name"
-      @author = "No Author"
-      
-      @width  = width
-      @height = height
-      
-      @current_sector = Sector.new(self)
-      @current_sector.new_from_size(width, height)
-      @sectors = []
-      @sectors.push(@current_sector)
-      
-    elsif params.length() == 1 then
-      # Load Level from file
-      (@filename,) = params
-      
-      tree = sexpr_read_from_file(@filename)
-      if tree == nil
-        raise("Couldn't load level: ", filename)
-      end
-      
-      data = tree[1..-1]
-      
-      @version = get_value_from_tree(["version", "_"], data, 1)
-      
-      if (@version == 1) then
-        parse_v1(data)
-      else
-        parse_v2(data)
-      end
-    else
-      raise "Wrong arguments for SuperTux::___init__"
-    end
-  end
-  
-  def parse_v2(data)
-    @name    = get_value_from_tree(["name", "_"], data, "no name")
-    @author  = get_value_from_tree(["author", "_"], data, "no author")
-    @time    = int(get_value_from_tree(["time", "_"], data, "999"))
-    
-    @sectors = []
-    for sec in sexpr_filter("sector", data)
-      sector = Sector.new(self)
-      sector.load_v2(sec)
-      @sectors.append(sector)
-      if sector.name == "main"
-        @current_sector = sector
-      end
-    end
-    
-    if @current_sector == nil
-      print "Error: No main sector defined: ", sectors
-    end
-  end
-
-  def parse_v1(data)
-    sector = Sector.new(self)
-    sector.load_v1(data)
-    
-    @sectors = []
-    @sectors.append(sector)
-    @current_sector = sector
-    
-    @name    = get_value_from_tree(["name", "_"], data, "no name")
-    @author  = get_value_from_tree(["author", "_"], data, "no author")
-    @time    = int(get_value_from_tree(["time", "_"], data, "999"))       
-  end
-  
-  def save(filename)
-    save_v2(filename)
-  end
-  
-  def save_v2(filename)
-    f = File.new(filename, "w")
-    f.write(";; Generated by Flexlay Editor\n" +
-                                                "(supertux-level\n")
-    f.write("  (version 2)\n")
-    f.write("  (name   \"%s\")\n" % @name)
-    f.write("  (author \"%s\")\n" % @author)
-    f.write("  (width  %s)\n"  % @width)
-    f.write("  (height  %s)\n" % @height)
-    
-    f.write("  (music  \"%s\")\n" % @music)
-    f.write("  (time   \"%s\")\n" % @time)
-    
-    f.write("  (gravity %d)\n" % @gravity)
-    
-    f.write("  (theme \"%s\")\n" % @theme)
-    
-    f.write("  (interactive-tm\n")
-    for i in interactive.get_data()
-      f.write("%d " % i)
-    end
-    f.write("  )\n\n")
-    
-    f.write("  (background-tm\n")
-    for i in background.get_data()
-      f.write("%d " % i)
-    end
-    f.write("  )\n\n")
-
-    f.write("  (foreground-tm\n")
-    for i in foreground.get_data()
-      f.write("%d " % i)
-    end
-    f.write("  )\n\n")
-
-    f.write("  (camera\n")
-    f.write("    (mode \"autoscroll\")\n")
-    f.write("    (path\n")
-    for obj in objects.get_objects()
-      pathnode = get_python_object(obj.get_metadata())
-      if (pathnode.__class__ == PathNode)
-        f.write("     (point (x %d) (y %d) (speed 1))\n" % obj.get_pos().x, 
obj.get_pos().y)
-      end
-    end
-    f.write("  ))\n\n")
-
-    f.write("  (objects\n")
-    for obj in @objects.get_objects()
-      badguy = get_python_object(obj.get_metadata())
-      if (badguy.__class__ == BadGuy)
-        pos    = obj.get_pos()
-        if (badguy.type != "resetpoint")
-          f.write("     (%s (x %d) (y %d))\n" % badguy.type, int(pos.x), 
int(pos.y))
-        end
-      end
-    end
-    f.write("  )\n\n")
-
-    f.write("  (reset-points\n")
-    for obj in @objects.get_objects()
-      badguy = get_python_object(obj.get_metadata())
-      if (badguy.__class__ == BadGuy)
-        pos    = obj.get_pos()
-        if (badguy.type == "resetpoint")
-          f.write("     (point (x %d) (y %d))\n" % int(pos.x), int(pos.y))
-        end
-      end
-    end
-    f.write("  )\n\n")
-    
-    f.write(" )\n\n;; EOF ;;\n")
-  end
-  
-  def save_v1(filename)
-    f = File.new(filename, "w")
-    f.write(";; Generated by Flexlay Editor\n" +
-                                                "(supertux-level\n")
-    f.write("  (version 1)\n")
-    f.write("  (name   \"%s\")\n" % @name)
-    f.write("  (author \"%s\")\n" % @author)
-    f.write("  (width  %s)\n"  % @width)
-    f.write("  (height  %s)\n" % @height)
-    
-    f.write("  (music  \"%s\")\n" % @music)
-    f.write("  (time   \"%s\")\n" % @time)
-    
-    f.write("  (gravity %d)\n" % @gravity)
-    
-    f.write("  (theme \"%s\")\n" % @theme)
-    
-    f.write("  (interactive-tm\n")
-    for i in @interactive.get_data()
-      f.write("%d " % i)
-    end
-    f.write("  )\n\n")
-
-    f.write("  (background-tm\n")
-    for i in @background.get_data()
-      f.write("%d " % i)
-    end
-    f.write("  )\n\n")
-
-    f.write("  (foreground-tm\n")
-    for i in @foreground.get_data()
-      f.write("%d " % i)
-    end
-    f.write("  )\n\n")
-
-    f.write("  (camera\n")
-    f.write("    (mode \"autoscroll\")\n")
-    f.write("    (path\n")
-    for obj in @objects.get_objects()
-      pathnode = get_python_object(obj.get_metadata())
-      if (pathnode.__class__ == PathNode)
-        f.write("     (point (x %d) (y %d) (speed 1))\n" % obj.get_pos().x, 
obj.get_pos().y)
-      end
-    end
-    f.write("  ))\n\n")
-    
-    f.write("  (objects\n")
-    for obj in @objects.get_objects()
-      badguy = get_python_object(obj.get_metadata())
-      if (badguy.__class__ == BadGuy)
-        pos    = obj.get_pos()
-        if (badguy.type != "resetpoint")
-          f.write("     (%s (x %d) (y %d))\n" % badguy.type, int(pos.x), 
int(pos.y))
-        end
-      end
-    end
-    f.write("  )\n\n")
-    
-    f.write("  (reset-points\n")
-    for obj in @objects.get_objects()
-      badguy = get_python_object(obj.get_metadata())
-      if (badguy.__class__ == BadGuy)
-        pos    = obj.get_pos()
-        if (badguy.type == "resetpoint")
-          f.write("     (point (x %d) (y %d))\n" % (pos.x.to_i), pos.y.to_i)
-        end
-      end
-    end
-    f.write("  )\n\n")
-    
-    f.write(" )\n\n;; EOF ;;\n")
-  end
-
-  def activate_sector(sector, workspace)
-    for sec in @sectors
-      if sec.name == sector
-        sec.activate(workspace)
-        break
-      end
-    end
-  end
-
-  def add_sector(sector)
-    @sectors.push(sector)
-  end
-
-  def get_sectors()
-    return @sectors.map {|sec| sec.name}
-  end
-
-  def activate(workspace)
-    @current_sector.activate(workspace)
-  end
-end
-
-class Sector
-  parent    = nil
-  name      = nil
-  song      = nil
-  gravity   = 10.0
-  
-  width  = nil
-  height = nil
-  
-  background  = nil
-  interactive = nil
-  foreground  = nil
-  
-  objects   = nil
-  editormap = nil
-
-  attr_reader :name, :background, :interactive, :foreground, :parent, :width, 
:height
-  attr_writer :name, :song, :gravity
- 
-  def initialize(parent)
-    @parent = parent
-  end
-
-  def get_level()
-    return @parent
-  end
-
-  def resize(size, pos)
-    @width  = size.width
-    @height = size.height
-    @background.resize(size, pos)
-    @interactive.resize(size, pos)
-    @foreground.resize(size, pos)
-  end
-
-  def new_from_size(width, height)
-    @name = "<No Name>"
-    @song = "<No Song>"
-    @gravity = 10.0
-    
-    @width  = width
-    @height = height
-    
-    @foreground  = TilemapLayer.new($tileset, @width, @height)
-    @interactive = TilemapLayer.new($tileset, @width, @height)
-    @background  = TilemapLayer.new($tileset, @width, @height)       
-    @objects = ObjectLayer.new()
-
-    @editormap = EditorMap.new()
-    @editormap.add_layer(@background.to_layer())
-    @editormap.add_layer(@interactive.to_layer())
-    @editormap.add_layer(@objects.to_layer())
-    @editormap.add_layer(@foreground.to_layer())
-    # FIXME: Data might not get freed since its 'recursively' refcounted
-    @editormap.set_metadata(make_metadata(self))
-    return self
-  end
-
-  def load_v1(data)
-    @name = "<No Name>"
-    @song = "<No Song>"
-    @gravity = 10.0
-    
-    @width  = get_value_from_tree(["width", "_"], data, 20)
-    @height = get_value_from_tree(["height""_"], data, 15)
-    
-    @foreground  = TilemapLayer($tileset, @width, @height)
-    @foreground.set_data(get_value_from_tree(["foreground-tm"], data, []))
-    
-    @interactive = TilemapLayer($tileset, @width, @height)
-    @interactive.set_data(get_value_from_tree(["interactive-tm"], data, []))
-    
-    @background  = TilemapLayer($tileset, @width, @height)
-    @background.set_data(get_value_from_tree(["background-tm"], data, []))
-    
-    @objects = ObjectLayer.new()
-    for i in get_value_from_tree(["objects"], data, [])
-      type = i[0]
-      x = get_value_from_tree(["x", "_"], i[1..-1], [])
-      y = get_value_from_tree(["y", "_"], i[1..-1], [])
-      object = $game_objects.find{|x| x[0] == type}
-      if object != nil
-        @objects.add_object(ObjMapSpriteObject(make_sprite($datadir + 
object[1]),
-                                               CL_Point(x, y),
-                                               
make_metadata(BadGuy(object[0]))).to_object())
-      else
-        print "Error: Couldn't resolve object type: ", type
-      end
-    end
-    
-    for i in get_value_from_tree(["reset-points"], data, [])
-      type = i[0]
-      x = get_value_from_tree(["x", "_"], i[1..-1], [])
-      y = get_value_from_tree(["y", "_"], i[1..-1], [])
-      object = find($game_objects, "resetpoint")
-      @objects.add_object(ObjMapSpriteObject(make_sprite($datadir + object[1]),
-                                             CL_Point(x, y),
-                                             
make_metadata(BadGuy(object[0]))).to_object())
-    end
-
-    @editormap = EditorMap.new()
-    @editormap.add_layer(@background.to_layer())
-    @editormap.add_layer(@interactive.to_layer())
-    @editormap.add_layer(@objects.to_layer())
-    @editormap.add_layer(@foreground.to_layer())
-    # FIXME: Data might not get freed since its 'recursively' refcounted
-    @editormap.set_metadata(make_metadata(self))
-  end
-  
-  def load_v2(data)
-    @name = "<No Name>"
-    @song = "<No Song>"
-    @gravity = 10.0
-    
-    @objects = ObjectLayer.new()
-    for i in data
-      (name,data) = i[0], i[1..-1]
-      if name == "name"
-        @name = data[0]
-      elsif name == "gravity"
-        @gravity = int(data[0])
-      elsif name == "playerspawn"
-        print "playerspawn unhandled"
-      elsif name == "tilemap"
-        width   = get_value_from_tree(["width", "_"], data, 20)
-        height  = get_value_from_tree(["height", "_"], data, 15)
-        solid   = get_value_from_tree(["solid", "_"], data, false)
-
-        tilemap = TilemapLayer($tileset, width, height)
-        tilemap.set_data(get_value_from_tree(["tiles"], data, []))
-        
-        print "Solid: ", solid
-        if solid and @interactive == nil
-          @interactive = tilemap
-          @width       = width
-          @height      = height
-        elsif @background == nil
-          @background = tilemap
-        elsif @foreground == nil
-          @foreground = tilemap
-        else
-          print "Error: Duplicate tilemap in levelfile"
-        end
-      elsif name == "background"
-        print "background unhandled"
-      else
-        object = $game_objects.find{|x| x[0] == name}
-        if object != nil
-          (name, image) = object
-          x = get_value_from_tree(["x", "_"], data, [])
-          y = get_value_from_tree(["y", "_"], data, [])
-          @objects.add_object(ObjMapSpriteObject.new(make_sprite($datadir + 
image),
-                                                     CL_Point.new(x, y),
-                                                     
make_metadata(BadGuy.new(name))).to_object())
-        else
-          print "Error: Couldn't resolve object type: ", name
-          print "Sector: Unhandled tag: ", name
-        end
-      end
-    end
-    
-    
-    if (@background == nil)
-      @background = TilemapLayer.new($tileset, width, height)
-    end
-
-    if (@interactive == nil)
-      @interactive = TilemapLayer.new($tileset, width, height)
-    end
-    
-    if (@foreground == nil)
-      @foreground = TilemapLayer.new($tileset, width, height)
-    end
-
-    @editormap = EditorMap()
-    @editormap.add_layer(@background.to_layer())
-    @editormap.add_layer(@interactive.to_layer())
-    @editormap.add_layer(@foreground.to_layer())
-    @editormap.add_layer(@objects.to_layer())
-    
-    @editormap.set_metadata(make_metadata(self))
-  end
-
-  def activate(workspace)
-    workspace.set_map(@editormap)
-    TilemapLayer.set_current(@interactive)
-    ObjectLayer.set_current(@objects)
-    connect(@editormap.sig_change(), proc{on_map_change()})
-  end
-end
-
+require "level.rb"
+require "sector.rb"
 require "gui2.rb"
 
 $gui.run()





reply via email to

[Prev in Thread] Current Thread [Next in Thread]