1 ;;; Copyright 2009 Christoph Senjak
3 (in-package :uxul-world)
5 (defmethod on-collision ((obj T) (obj2 T) collision)
6 "Per default do not react on objects at all. Warn only."
7 (format t "Warning: On-Collision is not overridden for some object
8 it is called for. Classes of Arguments: ~A ~A~%"
9 (class-name (class-of obj))
10 (class-name (class-of obj))))
12 ;; Player colliding with other objects
14 (defmethod on-collision
15 ((moving-rectangle player)
16 (standing-rectangle stone)
17 (collision collision))
18 (if (eql (direction collision) :DOWN)
19 ;; "bottom" - allow jumping again
20 (setf (mayjump moving-rectangle) T)
21 ;; "ceiling" - dont allow continuing jump
22 (if (eql (direction collision) :UP)
23 (setf (maycontjump moving-rectangle) nil))
25 (collide-blocks moving-rectangle standing-rectangle collision))
27 (defmethod on-collision
28 ((moving-rectangle player)
29 (standing-rectangle tulip)
30 (collision collision))
31 (setf (visible standing-rectangle) nil)
32 (setf (active standing-rectangle) nil)
33 (setf (colliding standing-rectangle) nil)
34 (if (< (power moving-rectangle) 10)
35 (incf (power moving-rectangle)))
36 (incf (tulips moving-rectangle)))
38 (defmethod on-collision
39 ((moving-rectangle player)
40 (standing-rectangle bottom)
41 (collision collision))
42 (if (eql (direction collision) :DOWN)
46 (setf (colliding standing-rectangle) nil)
47 (move-about moving-rectangle (desired-movement collision))
48 (setf (colliding standing-rectangle) t))))
50 (defmethod on-collision
51 ((moving-rectangle player)
52 (standing-rectangle moving-enemy)
53 (collision collision))
54 (collide-blocks moving-rectangle
57 (setf (bounced moving-rectangle) T)
58 (setf (mayjump moving-rectangle) T)
59 (setf (autojump moving-rectangle) 5)
60 (player-hits-enemy moving-rectangle
64 (defmethod on-collision
65 ((moving-rectangle player)
66 (standing-rectangle standing-enemy)
67 (collision collision))
68 (collide-blocks moving-rectangle
71 (player-hits-enemy moving-rectangle
75 (defmethod on-collision
76 ((moving-rectangle player)
77 (standing-rectangle standing-item)
78 (collision collision))
79 (collide-blocks moving-rectangle
82 (item-catch standing-rectangle moving-rectangle))
84 (defmethod on-collision
85 ((moving-rectangle player)
86 (standing-rectangle moving-item)
87 (collision collision))
88 (collide-blocks moving-rectangle
91 (item-catch standing-rectangle moving-rectangle))
94 ;; moving-item colliding with other objects
96 (defmethod on-collision
97 ((moving-rectangle moving-item)
98 (standing-rectangle player)
99 (collision collision))
100 (collide-blocks moving-rectangle
103 (item-catch moving-rectangle standing-rectangle))
105 (defmethod on-collision
106 ((moving-rectangle moving-item)
107 (standing-rectangle bottom)
108 (collision collision))
109 (if (eql (direction collision) :DOWN)
113 (setf (colliding standing-rectangle) nil)
114 (move-about moving-rectangle (desired-movement collision))
115 (setf (colliding standing-rectangle) t))))
117 (defmethod on-collision
118 ((moving-rectangle moving-item)
119 (standing-rectangle stone)
120 (collision collision))
121 (collide-blocks moving-rectangle standing-rectangle collision))
123 ;; simple-enemy special methods
125 (defmethod on-collision ((m simple-enemy) (s stone) (c collision))
126 (cond ((eql (direction c) :left)
127 (setf (direction m) :right))
128 ((eql (direction c) :right)
129 (setf (direction m) :left)))
130 (collide-blocks m s c))
132 ;; burning-marshmallow special methods
134 (defmethod on-collision ((m burning-marshmallow) (s stone) (c collision))
136 ((eql (direction c) :LEFT)
137 (setf (horizontal-direction m) :RIGHT))
138 ((eql (direction c) :RIGHT)
139 (setf (horizontal-direction m) :LEFT))
140 ((eql (direction c) :UP)
141 (setf (vertical-direction m) :DOWN))
142 ((eql (direction c) :DOWN)
143 (setf (vertical-direction m) :UP))
145 (setf (horizontal-direction m)
146 (if (eql (horizontal-direction m) :LEFT) :RIGHT :LEFT))
147 (setf (vertical-direction m)
148 (if (eql (vertical-direction m) :UP) :DOWN :UP))))
149 (set-burning-marshmallow-animation m))
151 (defmethod on-collision
152 ((moving-rectangle burning-marshmallow)
153 (standing-rectangle bottom)
154 (collision collision))
155 (if (eql (direction collision) :DOWN)
159 (setf (colliding standing-rectangle) nil)
160 (move-about moving-rectangle (desired-movement collision))
161 (setf (colliding standing-rectangle) t))))
163 (defmethod on-collision
164 ((moving-rectangle burning-marshmallow)
165 (standing-rectangle player)
166 (collision collision))
167 (enemy-hits-player moving-rectangle
170 (setf (colliding standing-rectangle) nil)
171 (move-about moving-rectangle (desired-movement collision))
172 (setf (colliding standing-rectangle) t))
174 (defmethod on-collision
175 ((moving-rectangle player)
176 (standing-rectangle burning-marshmallow)
177 (collision collision))
178 (enemy-hits-player standing-rectangle
181 (setf (colliding standing-rectangle) nil)
182 (move-about moving-rectangle (desired-movement collision))
183 (setf (colliding standing-rectangle) t))
184 ;; moving-enemy colliding with other objects
186 (defmethod on-collision ((m moving-enemy) (s stone) (c collision))
187 (collide-blocks m s c))
189 (defmethod on-collision
190 ((moving-rectangle moving-enemy)
191 (standing-rectangle bottom)
192 (collision collision))
193 (if (eql (direction collision) :DOWN)
197 (setf (colliding standing-rectangle) nil)
198 (move-about moving-rectangle (desired-movement collision))
199 (setf (colliding standing-rectangle) t))))
201 (defmethod on-collision
202 ((moving-rectangle moving-enemy)
203 (standing-rectangle player)
204 (collision collision))
205 (collide-blocks moving-rectangle
208 (enemy-hits-player moving-rectangle