- added alternative (more flexible) way to define badguys in a level
authorIngo Ruhnke <grumbel@gmx.de>
Thu, 25 Mar 2004 11:36:05 +0000 (11:36 +0000)
committerIngo Ruhnke <grumbel@gmx.de>
Thu, 25 Mar 2004 11:36:05 +0000 (11:36 +0000)
SVN-Revision: 358

src/badguy.cpp
src/badguy.h
src/gameloop.cpp
src/level.cpp
src/level.h
src/leveleditor.cpp
src/lispreader.cpp
src/lispreader.h

index d5a63e0..2b603a4 100644 (file)
@@ -31,6 +31,39 @@ texture_type img_laptop_right[3];
 texture_type img_money_left[2];
 texture_type img_money_right[2];
 
+BadGuyKind  badguykind_from_string(const std::string& str)
+{
+  if (str == "money")
+    return BAD_MONEY;
+  else if (str == "laptop")
+    return BAD_LAPTOP;
+  else if (str == "bsod")
+    return BAD_BSOD;
+  else
+    {
+      printf("Couldn't convert badguy: %s\n", str.c_str());
+      return BAD_BSOD;
+    }
+}
+
+std::string badguykind_to_string(BadGuyKind kind)
+{
+  switch(kind)
+    {
+    case BAD_MONEY:
+      return "money";
+      break;
+    case BAD_LAPTOP:
+      return "laptop";
+      break;
+    case BAD_BSOD:
+      return "bsod";
+      break;
+    default:
+      return "bsod";
+    }
+}
+
 void
 BadGuy::init(float x, float y, BadGuyKind kind_)
 {
index f2919a1..6590fa6 100644 (file)
@@ -49,6 +49,22 @@ enum BadGuyKind {
   BAD_MONEY
 };
 
+BadGuyKind  badguykind_from_string(const std::string& str);
+std::string badguykind_to_string(BadGuyKind kind);
+
+struct BadGuyData
+{
+  BadGuyKind kind;
+  int x;
+  int y;
+
+  BadGuyData(BadGuyKind kind_, int x_, int y_) 
+    : kind(kind_), x(x_), y(y_) {}
+
+  BadGuyData()
+    : kind(BAD_BSOD), x(0), y(0) {}
+};
+
 /* Badguy type: */
 class BadGuy
 {
index 399671f..099643a 100644 (file)
@@ -100,12 +100,19 @@ void start_timers(void)
 
 void activate_bad_guys(void)
 {
-  int x,y;
+  // Activate badguys the new style
+  for (std::vector<BadGuyData>::iterator i = current_level.badguy_data.begin();
+       i != current_level.badguy_data.end();
+       ++i)
+    {
+      add_bad_guy(i->x, i->y, i->kind);
+    }
 
-  /* Activate bad guys: */
-  for (y = 0; y < 15; y++)
+  // FIXME: should be removed;
+  // Activate bad guys the old style
+  for (int y = 0; y < 15; y++)
     {
-      for (x = 0; x < current_level.width; x++)
+      for (int x = 0; x < current_level.width; x++)
         {
           if (current_level.ia_tiles[y][x] >= 1000 && current_level.ia_tiles[y][x] <= 1010)
             {
index cc40d46..e8940e6 100644 (file)
@@ -298,6 +298,27 @@ int level_load(st_level* plevel, const char* filename)
       reader.read_int_vector("dynamic-tm",     &dn_tm);
       reader.read_int_vector("foreground-tm",  &fg_tm);
 
+      {
+        lisp_object_t* cur = 0;
+        if (reader.read_lisp("objects",  &cur))
+          {
+            while (!lisp_nil_p(cur))
+              {
+                lisp_object_t* data = lisp_car(cur);
+
+                BadGuyData bg_data;
+                bg_data.kind = badguykind_from_string(lisp_symbol(lisp_car(data)));
+                LispReader reader(lisp_cdr(data));
+                reader.read_int("x", &bg_data.x);
+                reader.read_int("y", &bg_data.y);
+
+                plevel->badguy_data.push_back(bg_data);
+                cur = lisp_cdr(cur);
+              }
+          }        
+      }
+
       // Convert old levels to the new tile numbers
       if (version == 0)
         {
index ed93b8b..486242e 100644 (file)
@@ -15,6 +15,7 @@
 
 #include <string>
 #include "texture.h"
+#include "badguy.h"
 #include "lispreader.h"
 
 /* This type holds meta-information about a level-subset. */
@@ -40,8 +41,22 @@ class st_subset
 
 #define LEVEL_NAME_MAX 20
 
-struct st_level 
+
+enum {
+ TM_BG,
+ TM_IA,
+ TM_DN,
+ TM_FG
+ };
+
+extern texture_type img_bkgd;
+extern texture_type img_bkgd_tile[2][4];
+extern texture_type img_solid[4];
+extern texture_type img_brick[2];
+
+class st_level 
 {
+ public:
   std::string name;
   std::string theme;
   std::string song_title;
@@ -57,16 +72,10 @@ struct st_level
   int bkgd_blue;
   int width;
   float gravity;
-};
 
-enum {
- TM_BG,
- TM_IA,
- TM_DN,
- TM_FG
- };
-
-extern texture_type img_bkgd, img_bkgd_tile[2][4], img_solid[4], img_brick[2];
+  std::vector<BadGuyData> badguy_data;
+ public:
+};
 
 void level_default  (st_level* plevel);
 int  level_load     (st_level* plevel, const char * subset, int level);
index 6fc2b3b..0cb0282 100644 (file)
@@ -597,7 +597,7 @@ void update_subset_settings_menu()
 
 void apply_level_settings_menu()
 {
-  int i,y,j;
+  int i;
   i = false;
 
   le_current_level->name = level_settings_menu->item[2].input;
index db0b5c3..7981189 100644 (file)
@@ -1048,6 +1048,19 @@ LispReader::read_int (const char* name, int* i)
 }
 
 bool
+LispReader::read_lisp(const char* name, lisp_object_t** b)
+{
+  lisp_object_t* obj = search_for (name);
+  if (obj)
+    {
+      *b = obj;
+      return true;
+    }
+  else
+    return false;
+}
+
+bool
 LispReader::read_float (const char* name, float* f)
 {
   lisp_object_t* obj = search_for (name);
index 2438ba3..f18a2f0 100644 (file)
@@ -176,6 +176,7 @@ class LispReader
     bool read_int (const char* name, int* i);
     bool read_float (const char* name, float* f);
     bool read_bool (const char* name, bool* b);
+    bool read_lisp (const char* name, lisp_object_t** b);
   };
 
 /** */