new level loader is working!
[awish.git] / asm / game / utils.awa
blob24edbefa6f864af90a7cf9a04c7cbed0d5f6621c
1 /*
2  * This program is free software: you can redistribute it and/or modify
3  * it under the terms of the GNU General Public License as published by
4  * the Free Software Foundation, either version 3 of the License, or
5  * (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
14  */
15 ; out:
16 ;  item_id: item id or 0 (be careful: it DESTROYS item_id tvar)
17 ;  rst_result: item thread id
18 ;  stack: item id (or 0)
20 proc: game_item_at_prof
21 locals: .cnt, .type
22   set [.cnt], 1
23 .loop:
24   ; only running thread
25   sta [.cnt]
26   jne .next, THREAD_STATE_RUNNING
27   ; only items
28   get [.cnt], item_id, [.type]
29   jlt .next, [.type], ITEM_KEY
30   ;jgt .next, [.type], ITEM_GLOVES
31   ; only not activated
32   get [.cnt], activated
33   jne .next, 0
34   ; only standing on tile
35   get [.cnt], pos_tx
36   jne .next, 0
37   get [.cnt], pos_ty
38   jne .next, 0
39   ; only our coords
40   get [.cnt], pos_x
41   jne .next, [pos_x]
42   get [.cnt], pos_y
43   jne .next, [pos_y]
44   ; found
45   set [item_id], [.type]
46   set [rst_result], [.cnt]
47   ret [.type]
48 .next:
49   add [.cnt], 1
50   rst FRST_GET_MAX_THREAD_ID
51   jle .loop, [.cnt], [rst_result]
52   set [item_id], 0
53   set [rst_result], 0
54   ret 0
55 endp: game_item_at_prof
58 prof_fix_position:
59   jeq .quit, [prof_item], 0
60   set pos_x, [pos_x], [prof_item]
61   set pos_y, [pos_y], [prof_item]
62 .quit:
63   ret
66 prof_turn_to_player:
67   jeq .quit, [spr_num], PSPR_FACING
68   set [spr_num], PSPR_TURNING
69   bsr game_next_frame
70   bsr game_next_frame
71   set [spr_dir], DIR_LEFT
72   set [spr_num], PSPR_FACING
73   bsr game_next_frame
74   bsr game_next_frame
75 .quit:
76   set [prof_dir], PDIR_FACING
77   ret
80 ; set 'prof_dir' to new dir and call this
81 prof_turn_to_dir:
82   jeq prof_turn_to_player, [prof_dir], PDIR_FACING
83   ; to left or to right, maybe thru 'facing'
84   jeq .looking_to_player, [spr_num], PSPR_FACING
85   jeq .looking_left, [spr_dir], DIR_LEFT
86   ;
87 ;;;.looking_right:
88   jeq .quit, [prof_dir], PDIR_RIGHT ; ok
89   ; want to turn left
90   bsr prof_turn_to_player
91   set [prof_dir], PDIR_LEFT
92 .to_left:
93 .complete_turning:
94   set [spr_num], PSPR_TURNING
95   bsr game_next_frame
96   bsr game_next_frame
97   set [spr_num], PSPR_STANDING
98   bsr game_next_frame
99   bsr game_next_frame
100   ret
101   ;
102 .looking_left:
103   jeq .quit, [prof_dir], PDIR_LEFT ; ok
104   ; want to turn right
105   bsr prof_turn_to_player
106   set [prof_dir], PDIR_RIGHT
107 .to_right:
108   set [spr_dir], DIR_RIGHT
109   jmp .complete_turning
110   ;
111 .looking_to_player:
112   ; left or right
113   jeq .to_left, [prof_dir], PDIR_LEFT
114   jmp .to_right
115   ;
116 .quit:
117   ret
120 prof_allowed_move_in_dir:
121   psh [pos_x]
122   add [prof_dir]
123   psh -666
124   mgb
125   jne game_no_no, 0
126   ret
129 ;proc: prof_allowed_move_in_dir_check
130 ;locals: .t
131 ;  add [pos_x], [prof_dir], [.t]
132 ;  mgb [.t], -666, [.t]
133 ;  ret [.t]
134 ;endp: prof_allowed_move_in_dir_check
136 ; funny hack
137 prof_allowed_move_in_dir_check:
138   psh [pos_x]
139   add [prof_dir]
140   psh -666
141   mgb
142   ;swp
143   rol -2
144   ret
147 proc: game_do_pick
148 arg: .profdir
149   set [spr_num], PSPR_TAKING0
150   bsr game_next_frame
151   bsr game_next_frame
152   set [spr_num], PSPR_TAKING1
153   bsr game_next_frame
154   bsr game_next_frame
155   ; remove item name
156   bsr set_item_name_vars, -1
157   ; set [rst_result] to new item_tid
158   bsr game_item_at_prof
159   drp ; result
160   set [item_id], 0
161   ; have something to put?
162   jeq .nopitem, [prof_item], 0
163   ; put prof's item
164   get [prof_item], item_id
165   jeq .a_fan, ITEM_FAN
166   set spr_dir, DIR_LEFT, [prof_item]
167   jmp .put_item
168 .a_fan:
169   jeq .put_item, [.profdir], PDIR_FACING
170   set spr_dir, DIR_LEFT, [prof_item]
171   jeq .put_item, [.profdir], PDIR_LEFT
172   set spr_dir, DIR_RIGHT, [prof_item]
173 .put_item:
174   set pos_x, [pos_x], [prof_item]
175   set pos_y, [pos_y], [prof_item]
176   set pos_tx, 0, [prof_item]
177   set pos_ty, 0, [prof_item]
178   res [prof_item]
179   set [prof_item], 0
180 .nopitem:
181   jeq .done, [rst_result], 0 ; there was no item at prof position
182   ; take item
183   set [prof_item], [rst_result]
184   sus [prof_item]
185   ; setup name
186   get [prof_item], item_id
187   bsr set_item_name_vars
188 .done:
189   set [spr_num], PSPR_TAKING0
190   bsr game_next_frame
191   bsr game_next_frame
192   set [spr_num], PSPR_FACING
193   bsr game_next_frame
194   bsr game_next_frame
195   ret
196 endp: game_do_pick
199 proc: get_tile_at_dy
200 arg: .dy
201 locals: .x, .y
202   add [prof_dir], [pos_x], [.x]
203   add [.dy], [pos_y], [.y]
204   mgf [.x], [.y], [.dy]
205   ret [.dy]
206 endp: get_tile_at_dy
209 proc: set_tile_at_dy
210 arg: .dy, .tile
211 locals: .x, .y
212   add [prof_dir], [pos_x], [.x]
213   add [.dy], [pos_y], [.y]
214   msf [.x], [.y], [.tile]
215   ret
216 endp: set_tile_at_dy
219 proc: get_tile_at_dx_dy
220 arg: .dx, .dy
221 locals: .x, .y
222   add [prof_dir], [pos_x], [.x]
223   add [.x], [.dx]
224   add [.dy], [pos_y], [.y]
225   mgf [.x], [.y], [.dy]
226   ret [.dy]
227 endp: get_tile_at_dx_dy
230 proc: set_tile_at_dx_dy
231 arg: .tile, .dx, .dy
232 locals: .x, .y
233   add [prof_dir], [pos_x], [.x]
234   add [.x], [.dx]
235   add [.dy], [pos_y], [.y]
236   msf [.x], [.y], [.tile]
237   ret
238 endp: set_tile_at_dx_dy
241 ; in:
242 ;  .dy: direction
243 proc: game_lift_all_items
244 arg: .dy
245 locals: .cnt, .type
246   set [.cnt], 1
247 .loop:
248   ; only running thread
249   sta [.cnt]
250   jne .next, THREAD_STATE_RUNNING
251   ; only items
252   get [.cnt], item_id, [.type]
253   jlt .next, [.type], ITEM_KEY
254   ;jgt .next, [.type], ITEM_GLOVES
255   get [.cnt], liftdown
256   jne .fixitem, 0
257   ; only not activated
258   ;get [.cnt], activated
259   ;jne .next, 0
260   ; only standing on tile
261   get [.cnt], pos_tx
262   jne .next, 0
263   get [.cnt], pos_ty
264   jne .next, 0
265   ; only our coords
266   get [.cnt], pos_x
267   jne .next, [pos_x]
268   get [.cnt], pos_y
269   jne .next, [pos_y]
270   ; found, kick it up
271 .fixitem:
272   set pos_ty, [.dy], [.cnt]
273   set liftdown, 0, [.cnt]
274 .next:
275   add [.cnt], 1
276   rst FRST_GET_MAX_THREAD_ID
277   jle .loop, [.cnt], [rst_result]
278   ret
279 endp: game_lift_all_items