adding Christoph's badguy code for Grumbel's AngryStone
authorStephen Groundwater <slacker@gluebox.com>
Fri, 3 Mar 2006 12:21:35 +0000 (12:21 +0000)
committerStephen Groundwater <slacker@gluebox.com>
Fri, 3 Mar 2006 12:21:35 +0000 (12:21 +0000)
SVN-Revision: 3064

data/images/creatures/angrystone/attacking-0.png [new file with mode: 0644]
data/images/creatures/angrystone/charging-0.png [new file with mode: 0644]
data/images/creatures/angrystone/idle-0.png [new file with mode: 0644]
data/images/sprites.strf
data/levels/world2/castledoor.stl
src/badguy/angrystone.cpp [new file with mode: 0644]
src/badguy/angrystone.hpp [new file with mode: 0644]

diff --git a/data/images/creatures/angrystone/attacking-0.png b/data/images/creatures/angrystone/attacking-0.png
new file mode 100644 (file)
index 0000000..e7b89ae
Binary files /dev/null and b/data/images/creatures/angrystone/attacking-0.png differ
diff --git a/data/images/creatures/angrystone/charging-0.png b/data/images/creatures/angrystone/charging-0.png
new file mode 100644 (file)
index 0000000..7f396d9
Binary files /dev/null and b/data/images/creatures/angrystone/charging-0.png differ
diff --git a/data/images/creatures/angrystone/idle-0.png b/data/images/creatures/angrystone/idle-0.png
new file mode 100644 (file)
index 0000000..7941644
Binary files /dev/null and b/data/images/creatures/angrystone/idle-0.png differ
index b882252..144e638 100644 (file)
          (y-offset -19)
          (mirror-action "squished-left")))
 
+; Angry Stone
+ (sprite (name "angrystone")
+       (action
+         (name "idle")
+         (images "creatures/angrystone/idle-0.png"))
+       (action
+         (name "charging")
+         (images "creatures/angrystone/charging-0.png"))
+       (action
+         (name "attacking")
+         (images "creatures/angrystone/attacking-0.png")))
+
 ;; Game elements follow
           
  (sprite (name "egg")
index 713d5b0..5500b54 100644 (file)
         0 0 0 0 0 0 0 0 0 0 0 0 0 1072 1072 1072 1072 1072 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
         0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
         0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
-        0 0 0 0 80 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
-        0 0 0 0 1348 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
-        0 0 0 0 79 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
-        0 0 0 0 79 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
-        0 0 0 0 79 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
-        0 0 0 0 79 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
-        0 0 1002 0 1349 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
+        0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
+        0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
+        0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
+        0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
+        0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
+        0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
+        0 0 1002 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1002 1002 0 0 
         0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1353 1353 0 1353 1353 1353 1353 1353 1353 1353 1353 1353 0 0 0 0 0 0 0 1353 0 0 0 0 0 0 0 1353 0 0 0 1353 1353 1353 1353 1353 0 0 0 0 0 0 0 0 0 0 0 0 0 
         ))
     (tilemap
         0 0 0 0 0 27 29 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
         0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
         0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
-        0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
-        0 0 0 0 0 0 0 0 0 27 29 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 0 0 0 0 0 0 133 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
-        0 0 0 0 0 0 0 0 0 0 27 29 0 0 0 0 0 27 29 0 0 0 0 0 0 0 0 0 0 132 0 0 0 0 0 0 133 133 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
-        0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 0 0 0 0 0 0 133 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
-        0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 0 0 0 0 0 0 133 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
-        0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 0 0 0 0 0 0 133 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
-        1061 0 0 0 0 0 0 0 0 0 0 0 0 0 0 27 29 0 0 0 0 0 0 0 0 0 0 0 0 132 0 0 0 0 0 0 133 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
-        1065 1066 1052 0 0 0 0 0 0 0 0 0 0 0 27 29 0 0 0 0 0 0 0 0 0 0 0 0 0 132 0 0 0 0 0 0 133 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
-        1014 1070 1048 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 132 1002 1002 1002 1001 1001 1001 133 1002 1002 1001 1001 1001 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 0 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 0 1002 1002 1002 1002 1002 1002 1002 
+        0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 133 0 0 0 
+        0 0 0 0 0 0 0 0 0 27 29 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 133 0 0 0 
+        0 0 0 0 0 0 0 0 0 0 27 29 0 0 0 0 0 27 29 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 133 133 0 0 
+        0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 132 133 0 0 
+        0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 133 133 0 0 
+        0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 133 133 0 0 
+        1061 0 0 0 0 0 0 0 0 0 0 0 0 0 0 27 29 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 132 133 0 0 
+        1065 1066 1052 0 0 0 0 0 0 0 0 0 0 0 27 29 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 133 0 0 
+        1014 1070 1048 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1001 1001 1001 1002 1002 1002 1001 1001 1001 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 1002 132 133 1002 1002 
         1010 1013 1014 1006 1005 1005 1005 1005 1005 1005 1005 1005 1005 1005 1005 1005 1005 1005 1005 1005 1005 1005 1005 1005 1005 1005 1005 1005 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 1006 
         ))
     (tilemap
         (physic-enabled #f)
         (solid #f)
       )
-      (infoblock (x 128) (y 1408)
-        (message (_ "!images/objects/voicemail/voicemail.png
-#Hey Tux,
-#Some friends have 
-#left you voicemail 
-#messages with advice
-#to find Penny. So 
-#don't forget to check
-#your voicemail and 
-#good luck!
-#The SuperTux Team"))
-      )
         (secretarea (x 632.0)
                     (y 807.0)
                     (width 124.0)
                     (height 77.0)
                     (message "check voicemail"))
+       (angrystone (x 758) (y 254))
+       (angrystone (x 22) (y 689))
+       (angrystone (x 777) (y 624))
+       (angrystone (x 1048) (y 1310))
+       (angrystone (x 1761) (y 1265))
+       (angrystone (x 2440) (y 1295))
    )
  )
 
diff --git a/src/badguy/angrystone.cpp b/src/badguy/angrystone.cpp
new file mode 100644 (file)
index 0000000..ee4d26c
--- /dev/null
@@ -0,0 +1,172 @@
+//  $Id: angrystone.cpp 2979 2006-01-10 00:00:04Z matzebraun $
+// 
+//  SuperTux
+//  Copyright (C) 2005 Matthias Braun <matze@braunis.de>
+//
+//  This program is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU General Public License
+//  as published by the Free Software Foundation; either version 2
+//  of the License, or (at your option) any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//  GNU General Public License for more details.
+// 
+//  You should have received a copy of the GNU General Public License
+//  along with this program; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+//  02111-1307, USA.
+
+#include <config.h>
+
+#include "angrystone.hpp"
+
+static const float SPEED = 240;
+
+static const float CHARGE_TIME = .5;
+static const float ATTACK_TIME = 1;
+static const float RECOVER_TIME = .5;
+
+AngryStone::AngryStone(const lisp::Lisp& reader)
+{
+  reader.get("x", start_position.x);
+  reader.get("y", start_position.y);
+  bbox.set_size(87.8, 87.8); // sprite is (88px, 88px)
+  sprite = sprite_manager->create("angrystone");
+  state = IDLE;
+}
+
+void
+AngryStone::write(lisp::Writer& writer)
+{
+  writer.start_list("angrystone");
+
+  writer.write_float("x", start_position.x);
+  writer.write_float("y", start_position.y);
+
+  writer.end_list("angrystone");
+}
+
+void
+AngryStone::activate()
+{
+  physic.set_velocity_x(0);
+  physic.set_velocity_y(0);
+  physic.enable_gravity(true);
+  sprite->set_action("idle");
+}
+
+HitResponse
+AngryStone::collision_solid(GameObject& , const CollisionHit& hit)
+{
+  if ((state == ATTACKING) && (hit.normal.x == -attackDirection.x) && (hit.normal.y == attackDirection.y)) {
+    state = IDLE;
+    sprite->set_action("idle");
+    physic.set_velocity_x(0);
+    physic.set_velocity_y(0);
+    physic.enable_gravity(true);
+    oldWallDirection.x = attackDirection.x;
+    oldWallDirection.y = attackDirection.y;
+  }
+
+  return CONTINUE;
+}
+
+HitResponse
+AngryStone::collision_badguy(BadGuy& badguy, const CollisionHit& hit)
+{
+  if (state == ATTACKING) {
+    badguy.kill_fall();
+    return FORCE_MOVE;
+  }
+
+  return FORCE_MOVE;
+}
+
+void 
+AngryStone::active_update(float elapsed_time) {
+  BadGuy::active_update(elapsed_time);
+
+  if (state == IDLE) {
+    MovingObject* player = Sector::current()->player;
+    MovingObject* badguy = this;
+    const Vector playerPos = player->get_pos();
+    const Vector badguyPos = badguy->get_pos();
+    float dx = (playerPos.x - badguyPos.x);
+    float dy = (playerPos.y - badguyPos.y);
+
+    float playerHeight = player->get_bbox().p2.y - player->get_bbox().p1.y;
+    float badguyHeight = badguy->get_bbox().p2.y - badguy->get_bbox().p1.y;
+
+    float playerWidth = player->get_bbox().p2.x - player->get_bbox().p1.x;
+    float badguyWidth = badguy->get_bbox().p2.x - badguy->get_bbox().p1.x;
+
+    if ((dx > -playerWidth) && (dx < badguyWidth)) {
+      if (dy > 0) {
+        attackDirection.x = 0;
+        attackDirection.y = -1;
+      } else {
+        attackDirection.x = 0;
+        attackDirection.y = 1;
+      }
+      if ((attackDirection.x != oldWallDirection.x) || (attackDirection.y != oldWallDirection.y)) {
+        sprite->set_action("charging");
+        timer.start(CHARGE_TIME);
+        state = CHARGING;
+      }
+    } else
+    if ((dy > -playerHeight) && (dy < badguyHeight)) {
+      if (dx > 0) {
+        attackDirection.x = 1;
+        attackDirection.y = 0;
+      } else {
+        attackDirection.x = -1;
+        attackDirection.y = 0;
+      }
+      if ((attackDirection.x != oldWallDirection.x) || (attackDirection.y != oldWallDirection.y)) {
+        sprite->set_action("charging");
+        timer.start(CHARGE_TIME);
+        state = CHARGING;
+      }
+    }
+
+  }
+
+  if (state == CHARGING) {
+    if (timer.check()) {
+      sprite->set_action("attacking");
+      timer.start(ATTACK_TIME);
+      state = ATTACKING;
+      physic.enable_gravity(false);
+      physic.set_velocity_x(SPEED * attackDirection.x);
+      physic.set_velocity_y(SPEED * attackDirection.y);
+      oldWallDirection.x = 0;
+      oldWallDirection.y = 0;
+    }
+  }
+
+  if (state == ATTACKING) {
+    if (timer.check()) {
+      timer.start(RECOVER_TIME);
+      state = RECOVERING;
+      sprite->set_action("idle");
+      physic.enable_gravity(true);
+      physic.set_velocity_x(0);
+      physic.set_velocity_y(0);
+    }
+  }
+
+  if (state == RECOVERING) {
+    if (timer.check()) {
+      state = IDLE;
+      sprite->set_action("idle");
+      physic.enable_gravity(true);
+      physic.set_velocity_x(0);
+      physic.set_velocity_y(0);
+    }
+  }
+
+}
+
+IMPLEMENT_FACTORY(AngryStone, "angrystone")
diff --git a/src/badguy/angrystone.hpp b/src/badguy/angrystone.hpp
new file mode 100644 (file)
index 0000000..106accc
--- /dev/null
@@ -0,0 +1,53 @@
+//  $Id: angrystone.hpp 2642 2005-06-26 13:38:53Z matzebraun $
+// 
+//  SuperTux
+//  Copyright (C) 2005 Matthias Braun <matze@braunis.de>
+//
+//  This program is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU General Public License
+//  as published by the Free Software Foundation; either version 2
+//  of the License, or (at your option) any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//  GNU General Public License for more details.
+// 
+//  You should have received a copy of the GNU General Public License
+//  along with this program; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+//  02111-1307, USA.
+
+#ifndef __ANGRYSTONE_H__
+#define __ANGRYSTONE_H__
+
+#include "badguy.hpp"
+
+class AngryStone : public BadGuy
+{
+public:
+  AngryStone(const lisp::Lisp& reader);
+
+  void activate();
+  void write(lisp::Writer& writer);
+  HitResponse collision_solid(GameObject& other, const CollisionHit& hit);
+  HitResponse collision_badguy(BadGuy& badguy, const CollisionHit& hit);
+  void active_update(float elapsed_time);
+
+protected:
+  Vector attackDirection;  /**< 1-normalized vector of current attack direction */
+  Vector oldWallDirection; /**< if wall was hit during last attack: 1-normalized vector of last attack direction, (0,0) otherwise */
+
+  Timer timer;
+
+  enum AngryStoneState {
+    IDLE,
+    CHARGING,
+    ATTACKING,
+    RECOVERING
+  };
+  AngryStoneState state;
+  
+};
+
+#endif