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 (mayjump moving-rectangle) T)
58 (setf (autojump moving-rectangle) 5)
59 (player-hits-enemy moving-rectangle
63 (defmethod on-collision
64 ((moving-rectangle player)
65 (standing-rectangle standing-enemy)
66 (collision collision))
67 (collide-blocks moving-rectangle
70 (player-hits-enemy moving-rectangle
74 (defmethod on-collision
75 ((moving-rectangle player)
76 (standing-rectangle standing-item)
77 (collision collision))
78 (collide-blocks moving-rectangle
81 (item-catch standing-rectangle moving-rectangle))
83 (defmethod on-collision
84 ((moving-rectangle player)
85 (standing-rectangle moving-item)
86 (collision collision))
87 (collide-blocks moving-rectangle
90 (item-catch standing-rectangle moving-rectangle))
93 ;; moving-item colliding with other objects
95 (defmethod on-collision
96 ((moving-rectangle moving-item)
97 (standing-rectangle player)
98 (collision collision))
99 (collide-blocks moving-rectangle
102 (item-catch moving-rectangle standing-rectangle))
104 (defmethod on-collision
105 ((moving-rectangle moving-item)
106 (standing-rectangle bottom)
107 (collision collision))
108 (if (eql (direction collision) :DOWN)
112 (setf (colliding standing-rectangle) nil)
113 (move-about moving-rectangle (desired-movement collision))
114 (setf (colliding standing-rectangle) t))))
116 (defmethod on-collision
117 ((moving-rectangle moving-item)
118 (standing-rectangle stone)
119 (collision collision))
120 (collide-blocks moving-rectangle standing-rectangle collision))
122 ;; simple-enemy special methods
124 (defmethod on-collision ((m simple-enemy) (s stone) (c collision))
125 (cond ((eql (direction c) :left)
126 (setf (direction m) :right))
127 ((eql (direction c) :right)
128 (setf (direction m) :left)))
129 (collide-blocks m s c))
131 ;; burning-marshmallow special methods
133 (defmethod on-collision ((m burning-marshmallow) (s stone) (c collision))
135 ((eql (direction c) :LEFT)
136 (setf (horizontal-direction m) :RIGHT))
137 ((eql (direction c) :RIGHT)
138 (setf (horizontal-direction m) :LEFT))
139 ((eql (direction c) :UP)
140 (setf (vertical-direction m) :DOWN))
141 ((eql (direction c) :DOWN)
142 (setf (vertical-direction m) :UP))
144 (setf (horizontal-direction m)
145 (if (eql (horizontal-direction m) :LEFT) :RIGHT :LEFT))
146 (setf (vertical-direction m)
147 (if (eql (vertical-direction m) :UP) :DOWN :UP))))
148 (set-burning-marshmallow-animation m))
150 (defmethod on-collision
151 ((moving-rectangle burning-marshmallow)
152 (standing-rectangle bottom)
153 (collision collision))
154 (if (eql (direction collision) :DOWN)
158 (setf (colliding standing-rectangle) nil)
159 (move-about moving-rectangle (desired-movement collision))
160 (setf (colliding standing-rectangle) t))))
162 (defmethod on-collision
163 ((moving-rectangle burning-marshmallow)
164 (standing-rectangle player)
165 (collision collision))
166 (enemy-hits-player moving-rectangle
169 (setf (colliding standing-rectangle) nil)
170 (move-about moving-rectangle (desired-movement collision))
171 (setf (colliding standing-rectangle) t))
173 (defmethod on-collision
174 ((moving-rectangle player)
175 (standing-rectangle burning-marshmallow)
176 (collision collision))
177 (enemy-hits-player standing-rectangle
180 (setf (colliding standing-rectangle) nil)
181 (move-about moving-rectangle (desired-movement collision))
182 (setf (colliding standing-rectangle) t))
183 ;; moving-enemy colliding with other objects
185 (defmethod on-collision ((m moving-enemy) (s stone) (c collision))
186 (collide-blocks m s c))
188 (defmethod on-collision
189 ((moving-rectangle moving-enemy)
190 (standing-rectangle bottom)
191 (collision collision))
192 (if (eql (direction collision) :DOWN)
196 (setf (colliding standing-rectangle) nil)
197 (move-about moving-rectangle (desired-movement collision))
198 (setf (colliding standing-rectangle) t))))
200 (defmethod on-collision
201 ((moving-rectangle moving-enemy)
202 (standing-rectangle player)
203 (collision collision))
204 (collide-blocks moving-rectangle
207 (enemy-hits-player moving-rectangle