windstille-devel
[Top][All Lists]
Advanced

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

[Windstille-devel] rev 391 - in trunk/src: . SuperTux


From: Ingo Ruhnke
Subject: [Windstille-devel] rev 391 - in trunk/src: . SuperTux
Date: Sat, 05 Jun 2004 17:09:19 +0200

Author: grumbel
Date: 2004-06-05 17:09:18 +0200 (Sat, 05 Jun 2004)
New Revision: 391

Modified:
   trunk/src/SuperTux/__init__.py
   trunk/src/SuperTux/level.py
   trunk/src/SuperTux/tileset.py
   trunk/src/editor.cxx
   trunk/src/layer.cxx
   trunk/src/layer.hxx
   trunk/src/layer_impl.hxx
   trunk/src/objmap_object.cxx
   trunk/src/objmap_object.hxx
   trunk/src/sexpr.py
   trunk/src/supertux.py
   trunk/src/tileset.cxx
   trunk/src/tileset.hxx
Log:
- some basic support to support subsector supertux files

Modified: trunk/src/SuperTux/__init__.py
===================================================================
--- trunk/src/SuperTux/__init__.py      2004-06-05 12:44:53 UTC (rev 390)
+++ trunk/src/SuperTux/__init__.py      2004-06-05 15:09:18 UTC (rev 391)
@@ -13,11 +13,12 @@
 execfile("SuperTux/tileset.py")
 execfile("SuperTux/gui.py")
 execfile("SuperTux/shell.py")
+execfile("SuperTux/sector.py")
 execfile("SuperTux/level.py")
 execfile("SuperTux/display_properties.py")
 
 tileset = Tileset(32)
-load_game_tiles(tileset, 
"/home/ingo/cvs/supertux/supertux/data/images/tilesets/supertux.stgt")
+tileset.load("/home/ingo/cvs/supertux/supertux/data/images/tilesets/supertux.stgt")
 
     
 game_objects = [["money", "images/shared/jumpy-left-middle-0.png"],

Modified: trunk/src/SuperTux/level.py
===================================================================
--- trunk/src/SuperTux/level.py 2004-06-05 12:44:53 UTC (rev 390)
+++ trunk/src/SuperTux/level.py 2004-06-05 15:09:18 UTC (rev 391)
@@ -5,6 +5,7 @@
 from sexpr   import *
 
 class Level:
+    version = 2
     filename = None
     
     name   = "no name"
@@ -19,13 +20,17 @@
     foreground  = None
     interactive = None
     background  = None
+    
     objects = None
     camera  = None
 
+    sectiors = None
+
     editormap = None
 
     def __init__(self, *params):
         if len(params) == 2:
+            # New Level
             (width, height) = params
             
             self.name   = "No Name"
@@ -38,8 +43,18 @@
             self.interactive = TilemapLayer(tileset, self.width, self.height)
             self.background  = TilemapLayer(tileset, self.width, self.height)
             self.objects = ObjectLayer()
+
+            self.editormap = EditorMap()
+            self.editormap.add_layer(self.background.to_layer())
+            self.editormap.add_layer(self.interactive.to_layer())
+            self.editormap.add_layer(self.objects.to_layer())
+            self.editormap.add_layer(self.foreground.to_layer())
             
+            # FIXME: Data might not get freed since its 'recursively' 
refcounted
+            self.editormap.set_metadata(make_metadata(self))
+            
         elif len(params) == 1:
+            # Load Level from file
             (self.filename,) = params
             
             tree = sexpr_read_from_file(self.filename)
@@ -48,49 +63,76 @@
             
             data = tree[1:]
 
-            self.name   = get_value_from_tree(["name", "_"], data, "no name")
-            self.author = get_value_from_tree(["author", "_"], data, "no 
author")
+            self.version = get_value_from_tree(["version", "_"], data, 1)
 
-            self.width  = get_value_from_tree(["width", "_"], data, 20)
-            self.height = get_value_from_tree(["height""_"], data, 15)
+            if (self.version == 1):
+                self.parse_v1(data)
+            else:
+                self.parse_v2(data)
+        else:
+            raise "Wrong arguments for SuperTux::___init__"
 
-            self.foreground  = TilemapLayer(tileset, self.width, self.height)
-            self.foreground.set_data(get_value_from_tree(["foreground-tm"], 
data, []))
+    def parse_v2(self, data):
+        self.name    = get_value_from_tree(["name", "_"], data, "no name")
+        self.author  = get_value_from_tree(["author", "_"], data, "no author")
+        self.time    = int(get_value_from_tree(["time", "_"], data, "999"))
+        
+        self.sectors = []
+        for sec in sexpr_filter("sector", data):
+            sector = Sector(self, sec)
+            self.sectors.append(sector)
+            self.interactive = sector.tilemap
+            self.background  = sector.tilemap
+            self.foreground  = sector.tilemap
+            self.objects     = sector.objects
 
-            self.interactive = TilemapLayer(tileset, self.width, self.height)
-            self.interactive.set_data(get_value_from_tree(["interactive-tm"], 
data, []))
+        self.editormap = EditorMap()
+        self.editormap.add_layer(self.interactive.to_layer())
+        self.editormap.add_layer(self.objects.to_layer())
+        # FIXME: Data might not get freed since its 'recursively' refcounted
+        self.editormap.set_metadata(make_metadata(self))
 
-            self.background  = TilemapLayer(tileset, self.width, self.height)
-            self.background.set_data(get_value_from_tree(["background-tm"], 
data, []))
+    def parse_v1(self, data):
+        self.name    = get_value_from_tree(["name", "_"], data, "no name")
+        self.author  = get_value_from_tree(["author", "_"], data, "no author")
+        self.time    = int(get_value_from_tree(["time", "_"], data, "999"))
+        
+        self.width  = get_value_from_tree(["width", "_"], data, 20)
+        self.height = get_value_from_tree(["height""_"], data, 15)
+        
+        self.foreground  = TilemapLayer(tileset, self.width, self.height)
+        self.foreground.set_data(get_value_from_tree(["foreground-tm"], data, 
[]))
+        
+        self.interactive = TilemapLayer(tileset, self.width, self.height)
+        self.interactive.set_data(get_value_from_tree(["interactive-tm"], 
data, []))
+        
+        self.background  = TilemapLayer(tileset, self.width, self.height)
+        self.background.set_data(get_value_from_tree(["background-tm"], data, 
[]))
 
-            def find(lst, obj):
-                for i in lst:
-                    if i[0] == obj:
-                        return i
-                return None
+        def find(lst, obj):
+            for i in lst:
+                if i[0] == obj:
+                    return i
+            return None
             
-            self.objects = ObjectLayer()
-            for i in get_value_from_tree(["objects"], data, []):
-                type = i[0]
-                x = get_value_from_tree(["x", "_"], i[1:], [])
-                y = get_value_from_tree(["y", "_"], i[1:], [])
-                object = find(game_objects, type)
-                
self.objects.add_object(ObjMapSpriteObject(make_sprite(config.datadir + 
object[1]),
-                                                           CL_Point(x, y),
-                                                           
make_metadata(BadGuy(object[0]))).to_object())
+        self.objects = ObjectLayer()
+        for i in get_value_from_tree(["objects"], data, []):
+            type = i[0]
+            x = get_value_from_tree(["x", "_"], i[1:], [])
+            y = get_value_from_tree(["y", "_"], i[1:], [])
+            object = find(game_objects, type)
+            
self.objects.add_object(ObjMapSpriteObject(make_sprite(config.datadir + 
object[1]),
+                                                       CL_Point(x, y),
+                                                       
make_metadata(BadGuy(object[0]))).to_object())
                 
-            for i in get_value_from_tree(["reset-points"], data, []):
-                type = i[0]
-                x = get_value_from_tree(["x", "_"], i[1:], [])
-                y = get_value_from_tree(["y", "_"], i[1:], [])
-                object = find(game_objects, "resetpoint")
-                
self.objects.add_object(ObjMapSpriteObject(make_sprite(config.datadir + 
object[1]),
-                                                           CL_Point(x, y),
-                                                           
make_metadata(BadGuy(object[0]))).to_object())
-           
-        else:
-            raise "Wrong arguments for SuperTux::___init__"
-
+        for i in get_value_from_tree(["reset-points"], data, []):
+            type = i[0]
+            x = get_value_from_tree(["x", "_"], i[1:], [])
+            y = get_value_from_tree(["y", "_"], i[1:], [])
+            object = find(game_objects, "resetpoint")
+            
self.objects.add_object(ObjMapSpriteObject(make_sprite(config.datadir + 
object[1]),
+                                                       CL_Point(x, y),
+                                                       
make_metadata(BadGuy(object[0]))).to_object())
         self.editormap = EditorMap()
         self.editormap.add_layer(self.background.to_layer())
         self.editormap.add_layer(self.interactive.to_layer())
@@ -98,7 +140,8 @@
         self.editormap.add_layer(self.foreground.to_layer())
         # FIXME: Data might not get freed since its 'recursively' refcounted
         self.editormap.set_metadata(make_metadata(self))
-
+            
+          
     def resize(self, size, pos):
         self.width  = size.width
         self.height = size.height
@@ -107,9 +150,73 @@
         self.foreground.resize(size, pos)
         
     def save(self, filename):
+        self.save_v2(filename)
+
+    def save_v2(self, filename):
         f = file(filename, 'w')
         f.write(";; Generated by Flexlay Editor\n"
                 "(supertux-level\n")
+        f.write("  (version 2)\n")
+        f.write("  (name   \"%s\")\n" % self.name)
+        f.write("  (author \"%s\")\n" % self.author)
+        f.write("  (width  %s)\n"  % self.width)
+        f.write("  (height  %s)\n" % self.height)
+
+        f.write("  (music  \"%s\")\n" % self.music)
+        f.write("  (time   \"%s\")\n" % self.time)
+
+        f.write("  (gravity %d)\n" % self.gravity)
+
+        f.write("  (theme \"%s\")\n" % self.theme)
+
+        f.write("  (interactive-tm\n")
+        for i in self.interactive.get_data():
+            f.write("%d " % i)
+        f.write("  )\n\n")
+
+        f.write("  (background-tm\n")
+        for i in self.background.get_data():
+            f.write("%d " % i)
+        f.write("  )\n\n")
+
+        f.write("  (foreground-tm\n")
+        for i in self.foreground.get_data():
+            f.write("%d " % i)
+        f.write("  )\n\n")
+
+        f.write("  (camera\n")
+        f.write("    (mode \"autoscroll\")\n")
+        f.write("    (path\n")
+        for obj in self.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))
+        f.write("  ))\n\n")
+
+        f.write("  (objects\n")
+        for obj in self.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)))
+        f.write("  )\n\n")
+
+        f.write("  (reset-points\n")
+        for obj in self.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)))
+        f.write("  )\n\n")
+        
+        f.write(" )\n\n;; EOF ;;\n")
+
+    def save_v1(self, filename):
+        f = file(filename, 'w')
+        f.write(";; Generated by Flexlay Editor\n"
+                "(supertux-level\n")
         f.write("  (version 1)\n")
         f.write("  (name   \"%s\")\n" % self.name)
         f.write("  (author \"%s\")\n" % self.author)
@@ -167,7 +274,13 @@
         
         f.write(" )\n\n;; EOF ;;\n")
 
-        # objects = None
+    def activate_sector(self, sector, workspace):
+        for sec in self.sectors:
+            if sec.name == sector:
+                workspace.set_map(sec.editormap)
+                TilemapLayer.set_current(sec.tilemap)
+                ObjectLayer.set_current(sec.objects)
+                break
 
     def activate(self, workspace):
         workspace.set_map(self.editormap)

Modified: trunk/src/SuperTux/tileset.py
===================================================================
--- trunk/src/SuperTux/tileset.py       2004-06-05 12:44:53 UTC (rev 390)
+++ trunk/src/SuperTux/tileset.py       2004-06-05 15:09:18 UTC (rev 391)
@@ -1,7 +1,7 @@
 from flexlay import *
 from sexpr   import *
 
-def load_game_tiles(tileset, filename):
+def Tileset_load(self, filename):
     "Load game tiles from filename into tileset"
     tree = sexpr_read_from_file(filename)
     tree = tree[1:]
@@ -15,9 +15,10 @@
                 image = get_value_from_tree(['images', '_'], data, 
"notile.png")
 
             if id != 0: # leave tile 0 transparent
-                tileset.add_tile(id,
-                                 Tile(config.datadir + 'images/tilesets/' + 
image,
+                self.add_tile(id,
+                              Tile(config.datadir + 'images/tilesets/' + image,
                                       CL_Color(255,   0,   0, 128)))
-                
+Tileset.load = Tileset_load
+del Tileset_load
 
 # EOF #

Modified: trunk/src/editor.cxx
===================================================================
--- trunk/src/editor.cxx        2004-06-05 12:44:53 UTC (rev 390)
+++ trunk/src/editor.cxx        2004-06-05 15:09:18 UTC (rev 391)
@@ -32,8 +32,6 @@
 
 Editor::Editor()
 {
-  current_ = this;
-
   manager      = new GUIManager();
 }
 

Modified: trunk/src/layer.cxx
===================================================================
--- trunk/src/layer.cxx 2004-06-05 12:44:53 UTC (rev 390)
+++ trunk/src/layer.cxx 2004-06-05 15:09:18 UTC (rev 391)
@@ -59,4 +59,20 @@
     return CL_Rect();
 }
 
+MetaData
+Layer::get_metadata() const
+{
+  if (impl.get())
+    return impl->data; 
+  else
+    return MetaData();
+}
+
+void
+Layer::set_metadata(MetaData data_)
+{
+  if (impl.get())
+    impl->data = data_;
+}
+
 /* EOF */

Modified: trunk/src/layer.hxx
===================================================================
--- trunk/src/layer.hxx 2004-06-05 12:44:53 UTC (rev 390)
+++ trunk/src/layer.hxx 2004-06-05 15:09:18 UTC (rev 391)
@@ -21,6 +21,7 @@
 #define HEADER_LAYER_HXX
 
 #include <ClanLib/Core/Math/rect.h>
+#include "meta_data.hxx"
 #include "shared_ptr.hxx"
 
 class EditorMapComponent;
@@ -39,6 +40,9 @@
   Layer(SharedPtr<LayerImpl> i);
   ~Layer();
 
+  MetaData get_metadata() const;
+  void     set_metadata(MetaData data_);
+
   void draw(EditorMapComponent* parent);
   bool has_bounding_rect() const;
   CL_Rect get_bounding_rect();

Modified: trunk/src/layer_impl.hxx
===================================================================
--- trunk/src/layer_impl.hxx    2004-06-05 12:44:53 UTC (rev 390)
+++ trunk/src/layer_impl.hxx    2004-06-05 15:09:18 UTC (rev 391)
@@ -21,13 +21,18 @@
 #define HEADER_LAYER_IMPL_HXX
 
 #include <ClanLib/Core/Math/rect.h>
+#include "meta_data.hxx"
 
 class EditorMapComponent;
 
 class LayerImpl
 {
-private:
 public:
+  MetaData  data;
+
+  LayerImpl() {}
+  virtual ~LayerImpl() {}
+
   virtual void draw(EditorMapComponent* parent) =0;
   virtual bool has_bounding_rect() const =0;
   virtual CL_Rect get_bounding_rect() { return CL_Rect(); }

Modified: trunk/src/objmap_object.cxx
===================================================================
--- trunk/src/objmap_object.cxx 2004-06-05 12:44:53 UTC (rev 390)
+++ trunk/src/objmap_object.cxx 2004-06-05 15:09:18 UTC (rev 391)
@@ -96,4 +96,10 @@
   return impl.get() == obj.impl.get();
 }
 
+bool
+ObjMapObject::operator<(const ObjMapObject& obj) const
+{
+  return impl.get() < obj.impl.get();
+}
+
 /* EOF */

Modified: trunk/src/objmap_object.hxx
===================================================================
--- trunk/src/objmap_object.hxx 2004-06-05 12:44:53 UTC (rev 390)
+++ trunk/src/objmap_object.hxx 2004-06-05 15:09:18 UTC (rev 391)
@@ -47,6 +47,7 @@
   bool is_null() const;
 
   bool operator==(const ObjMapObject& obj) const;
+  bool operator<(const ObjMapObject& obj) const;
 private:
   SharedPtr<ObjMapObjectImpl> impl;
 };

Modified: trunk/src/sexpr.py
===================================================================
--- trunk/src/sexpr.py  2004-06-05 12:44:53 UTC (rev 390)
+++ trunk/src/sexpr.py  2004-06-05 15:09:18 UTC (rev 391)
@@ -25,6 +25,13 @@
     else:
         return assoc_ref(lst[1:], str)
 
+def sexpr_filter(name, tree):
+    ret = []
+    for i in tree:
+        if i[0] == name:
+            ret.append(i[1:])
+    return ret
+
 def get_value_from_tree(spec, tree, default):
     if spec == []:
         return tree

Modified: trunk/src/supertux.py
===================================================================
--- trunk/src/supertux.py       2004-06-05 12:44:53 UTC (rev 390)
+++ trunk/src/supertux.py       2004-06-05 15:09:18 UTC (rev 391)
@@ -252,6 +252,9 @@
 connect_v2(editor_map.sig_on_key("i"),  lambda x, y: insert_path_node(x,y))
 connect_v2(editor_map.sig_on_key("c"),  lambda x, y: connect_path_nodes())
 
+connect_v2(editor_map.sig_on_key("7"),  lambda x, y: 
workspace.get_map().get_metadata().activate_sector("main", workspace))
+connect_v2(editor_map.sig_on_key("8"),  lambda x, y: 
workspace.get_map().get_metadata().activate_sector("another_world", workspace))
+
 gui.run()
 
 del config

Modified: trunk/src/tileset.cxx
===================================================================
--- trunk/src/tileset.cxx       2004-06-05 12:44:53 UTC (rev 390)
+++ trunk/src/tileset.cxx       2004-06-05 15:09:18 UTC (rev 391)
@@ -64,11 +64,6 @@
   impl->tile_size = tile_size_;
 }
 
-Tileset::Tileset(const Tileset& copy)
-  : impl(copy.impl)
-{
-}
-
 Tileset::~Tileset()
 {
 }

Modified: trunk/src/tileset.hxx
===================================================================
--- trunk/src/tileset.hxx       2004-06-05 12:44:53 UTC (rev 390)
+++ trunk/src/tileset.hxx       2004-06-05 15:09:18 UTC (rev 391)
@@ -39,8 +39,6 @@
       scripting to it */
   explicit Tileset(int tile_size_);
 
-  Tileset(const Tileset& copy);
-
   ~Tileset();
 
   /** Check if the tile is already loaded and return it. If it is not





reply via email to

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