···2424; Starting Width: B
2525; Starting Height: C
2626InitDungeon::
2727- ld hl, current_width ; current_width = B
2828- ld [hl], b
2929- ld hl, current_height ; current_height = C
3030- ld [hl], c
3131- ret
3232-3333-GenerateDungeon::
3434- ; REG_B = i
3535- ; REG_C = generated_cells_number
3636- ; REG_D = dungeon_area
3737- ld hl, current_width
3838- ld e, [hl]
3939- ld d, 0
4040- ld hl, current_height
4141- ld a, [hl]
4242- call Mul8
4343- ld d, l
4444- ld c, 0
4545- ld b, 0
4646-.LoopCheck
4747- ld a, c
4848- cp a, d
4949- jp nc, .LoopEnd
5050- jp z, .LoopEnd
5127 ld a, b
5252- cp a, 0
5353- jp nz, .LoopCheck2
5454- jp z, .LoopBody
5555-.LoopCheck2
5656- cp a, c
5757- jp nc, .LoopEnd
5858- jp z, .LoopEnd
5959-.LoopBody
6060- cp a, 0
6161- jp nz, .LoopBody2
6262- ld a, c
6363- cp a, 0
6464- jp nz, .LoopBody2
6565- push bc
6666- call rand
6767- ld l, b
6868- ld h, 0
6969- ld c, d
7070- inc c
7171- call Mod8
7272- ld hl, entrance_id
7373- ld [hl], a
7474- pop bc
7575- ld hl, generated_cells+$0
7676- ld [hl], a
7777- ld hl, BIT_ENTRANCE
7878- ld a, [hl]
7979- ld hl, BIT_USED_ROOM
8080- or a, [hl]
8181- ld hl, dungeon_grid
8282- push de
8383- push hl
8484- ld hl, entrance_id
8585- ld e, [hl]
8686- ld d, 0
8787- pop hl
8888- add hl, de
8989- pop de
9090- ld [hl], a
9191- ld c, 1
9292-.LoopBody2
9393- call GenerateRoom
9494- ld hl, dungeon_grid
9595- push de
9696- push hl
9797- ld hl, generated_cells
9898- ld e, b
9999- ld d, 0
100100- add hl, de
101101- ld e, [hl]
102102- ld d, 0
103103- pop hl
104104- add hl, de
105105- pop de
106106- ld a, [hl]
107107- push hl
108108- ld hl, BIT_USED_ROOM
109109- and a, [hl]
110110- pop hl
111111- jp nz, .LoopBody3
112112- ld a, [hl]
113113- push hl
114114- ld hl, BIT_USED_ROOM
115115- or a, [hl]
116116- pop hl
117117- ld [hl], a
118118-.LoopBody3
119119- ld a, c
120120- sub a, 1
121121- ld e, a
122122- ld a, b
123123- cp a, e
124124- jp nz, .LoopBody4
125125- push bc
126126- ld l, d
127127- ld h, 0
128128- ld c, 4
129129- call Mod8
130130- pop bc
131131- push de
132132- ld e, l
133133- ld d, h
134134- ld a, 3
135135- call Mul8
136136- pop de
137137- ld a, c
138138- cp a, l
139139- jp z, .LoopBody4
140140- jp nc, .LoopBody4
141141- jp .LoopEnd
142142-.LoopBody4
143143- inc b
144144- jp .LoopCheck
145145-.LoopEnd
146146- ret
147147-148148-GenerateRoom::
149149- ; REG_B = cell_index_queue
150150- ; REG_C = queue_size
151151- ; REG_D = potential_doors
152152- ; REG_E = door
153153- ; REG_H = neighbor_room
154154- ; REG_L = cell_index
155155- ; generated_cells = cells_queue
156156- push de
157157- push bc
158158- call rand
159159- ld hl, NEIGHBORS
160160- ld c, [hl]
161161- inc c
162162- ld b, l
163163- ld h, 0
164164- call Mod8
165165- pop bc
166166- ld d, a
167167- ld hl, generated_cells
168168- ld a, l
169169- add a, b
170170- ld l, a
171171- push de
172172- ld e, [hl]
173173- ld l, e
174174- pop de
175175- ld e, 1
176176-.LoopCheck
177177- ld a, e
178178- push hl
179179- ld hl, NEIGHBORS
180180- cp a, [hl]
181181- pop hl
182182- jp nc, .LoopEnd
183183- jp nz, .LoopEnd
184184- ld a, e
185185- push de
186186- push hl
187187- ld hl, NEIGHBORS
188188- ld e, [hl]
189189- and a, e
190190- pop hl
191191- pop de
192192- cp a, e
193193- jp nz, .LoopContinue
194194- push de
195195- ld e, l
196196- ld hl, dungeon_grid
197197- ld a, l
198198- add a, e
199199- ld l, a
200200- ld a, [hl]
201201- pop de
202202- and a, e
203203- jp nz, .LoopContinue
204204- call GetNeighborRoomIndex
205205- ld a, h
206206- cpl
207207- cp a, 0
208208- jp nz, .LoopContinue
209209- push hl
210210- push de
211211- ld e, h
212212- ld hl, dungeon_grid
213213- ld a, l
214214- add a, e
215215- ld l, a
216216- pop de
217217- ld a, [hl]
218218- ld hl, BIT_USED_ROOM
219219- and a, [hl]
220220- pop hl
221221- jp nz, .LoopContinue
222222- push bc ; b = opposite_door, cache earlier values
223223- call GetOppositeDirectionBit
224224- ld a, e
225225- and a, d
226226- cp a, e
227227- jp nz, .LoopBody2
228228- push hl
229229- push de
230230- ld e, l
231231- ld hl, dungeon_grid
232232- ld a, l
233233- add a, e
234234- ld l, a
235235- pop de
236236- ld a, [hl]
237237- or a, e
238238- ld [hl], a
239239- push de
240240- ld e, h
241241- ld hl, dungeon_grid
242242- ld a, l
243243- add a, e
244244- ld l, a
245245- pop de
246246- ld a, [hl]
247247- or a, b
248248- ld [hl], a
249249- pop hl
250250-.LoopBody2
251251- push hl
252252- push de
253253- ld e, h
254254- ld hl, dungeon_grid
255255- ld a, l
256256- add a, e
257257- ld l, a
258258- pop de
259259- ld a, [hl]
260260- pop hl
261261- cp a, b
262262- jp nz, .LoopContinue
263263- pop bc
264264- push hl
265265- push de
266266- ld e, h
267267- ld hl, generated_cells
268268- ld a, l
269269- add a, c
270270- ld l, a
271271- ld [hl], e
272272- pop de
273273- pop hl
274274- inc c
275275-.LoopContinue
276276- rlc e
277277- jp .LoopCheck
278278-.LoopEnd
279279- pop de
280280- ret
281281-282282-GetNeighborRoomIndex::
283283- ; REG_L = current_room => C
284284- ; REG_E = direction => B
285285- push de
286286- push bc
287287- push hl
288288- ld b, e
289289- ld c, l
290290- ld a, b
291291- ld hl, BIT_DOOR_NORTH
292292- cp a, [hl]
293293- jp nz, .FuncBody
294294- ld a, c
295295- ld hl, current_width
296296- sub a, [hl]
297297- ld e, a
298298- jp .FuncBody5
299299-.FuncBody
300300- ld hl, BIT_DOOR_EAST
301301- cp a, [hl]
302302- jp nz, .FuncBody2
303303- ld a, c
304304- inc a
305305- ld e, a
306306- jp .FuncBody5
307307-.FuncBody2
308308- ld hl, BIT_DOOR_SOUTH
309309- cp a, [hl]
310310- jp nz, .FuncBody3
311311- ld a, c
312312- ld hl, current_width
313313- add a, [hl]
314314- ld e, a
315315- jp .FuncBody5
316316-.FuncBody3
317317- ld hl, BIT_DOOR_WEST
318318- cp a, [hl]
319319- jp nz, .FuncBody4
2828+ ld [current_width], a
32029 ld a, c
321321- dec a
322322- ld e, a
323323- jp .FuncBody5
324324-.FuncBody4
325325- ld e, -1
326326-.FuncBody5
327327- ld a, b
328328- ld hl, BIT_DOOR_NORTH
329329- cp a, [hl]
330330- jp nz, .FuncBody6
331331- ld a, e
332332- cp a, 0
333333- jp c, .FuncBody6
334334- jp .FuncBody10
335335-.FuncBody6
336336- ld a, b
337337- ld hl, BIT_DOOR_SOUTH
338338- cp a, [hl]
339339- jp nz, .FuncBody7
340340- push de
341341- push bc
342342- ld c, e
343343- ld hl, current_width
344344- ld e, [hl]
345345- ld d, 0
346346- ld hl, current_height
347347- ld a, [hl]
348348- call Mul8
349349- ld d, l
350350- ld a, e
351351- pop bc
352352- cp a, d
353353- pop de
354354- jp nc, .FuncBody7
355355- jp z, .FuncBody7
356356- jp .FuncBody10
357357-.FuncBody7
358358- ld a, b
359359- ld hl, BIT_DOOR_EAST
360360- cp a, [hl]
361361- jp nz, .FuncBody8
362362- push bc
363363- ld hl, current_width
364364- ld c, [hl]
365365- ld l, e
366366- ld h, 0
367367- call Mod8
368368- pop bc
369369- cp a, 0
370370- jp c, .FuncBody8
371371- jp z, .FuncBody8
372372- jp .FuncBody10
373373-.FuncBody8
374374- ld a, b
375375- ld hl, BIT_DOOR_WEST
376376- cp a, [hl]
377377- jp nz, .FuncBody9
378378- push bc
379379- ld hl, current_width
380380- ld c, [hl]
381381- ld l, e
382382- ld h, 0
383383- call Mod8
384384- ld b, a
385385- ld hl, current_width
386386- ld a, [hl]
387387- dec a
388388- ld c, a
389389- ld a, b
390390- cp a, c
391391- pop bc
392392- jp nc, .FuncBody9
393393- jp z, .FuncBody9
394394- jp .FuncBody10
395395-.FuncBody9
396396- ld e, -1
397397-.FuncBody10
398398- pop hl
399399- ld h, e
400400- pop bc
401401- pop de
402402- ret
403403-404404-GetOppositeDirectionBit::
405405- push hl
406406- ld a, e
407407- push de
408408- ld hl, BIT_DOOR_NORTH
409409- ld e, [hl]
410410- cp a, e
411411- jp nz, .FuncBody
412412- ld hl, BIT_DOOR_SOUTH
413413- ld b, [hl]
414414- jp .FuncEnd
415415-.FuncBody
416416- ld hl, BIT_DOOR_WEST
417417- ld e, [hl]
418418- cp a, e
419419- jp nz, .FuncBody2
420420- ld hl, BIT_DOOR_EAST
421421- ld b, [hl]
422422- jp .FuncEnd
423423-.FuncBody2
424424- ld hl, BIT_DOOR_SOUTH
425425- ld e, [hl]
426426- cp a, e
427427- jp nz, .FuncBody3
428428- ld hl, BIT_DOOR_NORTH
429429- ld b, [hl]
430430- jp .FuncEnd
431431-.FuncBody3
432432- ld hl, BIT_DOOR_EAST
433433- ld e, [hl]
434434- cp a, e
435435- jp nz, .FuncEnd
436436- ld hl, BIT_DOOR_WEST
437437- ld b, [hl]
438438-.FuncEnd
439439- pop de
440440- pop hl
3030+ ld [current_height], a
44131 ret