···1717BIT_DOOR_WEST:: db $20
1818BIT_STAIR_BELOW:: db $40
1919BIT_STAIR_UP:: db $80
2020+MAX_ROOMS:: dw 512
20212122; Params:
2223; Starting Width: B
···2930 ret
30313132GenerateDungeon::
3232- ; Cache current register values to restore later
3333- ; In the event this is called with values in the
3434- ; registers to be used in an outer function
3535- push de
3636- push hl
3737- push af
3838- push bc
3939-4040- ld hl, current_width ; dungeon_area = current_width * current_height
3333+ ; REG_B = i
3434+ ; REG_C = generated_cells_number
3535+ ; REG_D = dungeon_area
3636+ ld hl, current_width
4137 ld e, [hl]
4238 ld d, 0
4339 ld hl, current_height
4440 ld a, [hl]
4541 call Mul8
4646- ld d, h
4747- ld e, l
4848-4949- ; generated_cells_number is stored in A
5050- ld a, 0 ; generated_cells_number = 0
5151-5252- ; i is stored in B
5353- ld b, 0 ; i = 0
5454-.LoopCheck: ; for loop begin
5555- cp a, e ; if (generated_cells_number < dungeon_area) && ((i == 0) || (i < generated_cells_number))
5656- jp nz, GenerateDungeon.Loop_Skip ; Break Loop
5757- jp nc, GenerateDungeon.Loop_Skip
5858-.LoopCheck2:
5959- push af
4242+ ld d, l
4343+ ld c, 0
4444+ ld b, 0
4545+.LoopCheck
4646+ ld a, c
4747+ cp a, d
4848+ jp c, .LoopEnd
4949+ jp z, .LoopEnd
6050 ld a, b
6151 cp a, 0
6262- pop af
6363- jp z, GenerateDungeon.Loop_Body
6464- push af
6565- push bc
6666- ld c, a
6767- ld a, b
6868- ld b, c
6969- cp a, b
7070- pop bc
7171- pop af
7272- jp nz, GenerateDungeon.Loop_Skip
7373- jp nc, GenerateDungeon.Loop_Skip
7474-.Loop_Body:
7575- push af ; if ((i == 0) && (generated_cells_number == 0))
7676- ld a, b
5252+ jp nz, .LoopCheck2
5353+ jp z, .LoopBody
5454+.LoopCheck2
5555+ cp a, c
5656+ jp c, .LoopEnd
5757+ jp z, .LoopEnd
5858+.LoopBody
7759 cp a, 0
7878- pop af
7979- jp nz, GenerateDungeon.Loop_Body2
6060+ jp nz, .LoopBody2
6161+ ld a, c
8062 cp a, 0
8181- jp nz, GenerateDungeon.Loop_Body2
6363+ jp nz, .LoopBody2
8264 push bc
8383- ld b, 0
8484- ld c, e
8585- call rand_range
8686- push hl
6565+ call rand
6666+ ld l, b
6767+ ld h, 0
6868+ ld c, d
6969+ inc c
7070+ call Mod8
8771 ld hl, entrance_id
8888- ld [hl], b
8989- ld hl, generated_cells
9090- ld [hl], b
9191- ld hl, dungeon_grid
9292- push af
9393- ld a, l
9494- add a, b
9595- ld l, a
7272+ ld [hl], a
7373+ pop bc
7474+ ld hl, generated_cells+$0
7575+ ld [hl], a
9676 ld a, BIT_ENTRANCE
9777 or a, BIT_USED_ROOM
7878+ ld hl, dungeon_grid
7979+ push de
8080+ push hl
8181+ ld hl, entrance_id
8282+ ld e, [hl]
8383+ ld d, 0
8484+ pop hl
8585+ add hl, de
8686+ pop de
9887 ld [hl], a
9999- pop af
100100- ld a, 1
8888+ ld c, 1
8989+.LoopBody2
9090+ call GenerateRoom
9191+ ld hl, dungeon_grid
9292+ push de
9393+ push hl
9494+ ld hl, generated_cells
9595+ ld e, b
9696+ ld d, 0
9797+ add hl, de
9898+ ld e, [hl]
9999+ ld d, 0
101100 pop hl
101101+ add hl, de
102102+ pop de
103103+ ld a, [hl]
104104+ and a, BIT_USED_ROOM
105105+ jp nz, .LoopBody3
106106+ ld a, [hl]
107107+ or a, BIT_USED_ROOM
108108+ ld [hl], a
109109+.LoopBody3
110110+ ld a, c
111111+ sub a, 1
112112+ ld e, a
113113+ ld a, b
114114+ cp a, e
115115+ jp nz, .LoopBody4
116116+ push bc
117117+ ld l, d
118118+ ld h, 0
119119+ ld c, 4
120120+ call Mod8
102121 pop bc
103103-.Loop_Body2:
104104- call GenerateRoom
105105-.Loop_Skip:
106106- pop bc
107107- pop af
108108- pop hl
122122+ push de
123123+ ld e, l
124124+ ld d, h
125125+ ld a, 3
126126+ call Mul8
109127 pop de
110110-128128+ ld a, c
129129+ cp a, l
130130+ jp z, .LoopBody4
131131+ jp c, .LoopBody4
132132+ jp .LoopEnd
133133+.LoopBody4
134134+ inc b
135135+ jp .LoopCheck
136136+.LoopEnd
111137 ret
112138113139GenerateRoom::
+1-22
gb/src/utils.asm
···5353 ret
54545555; A = HL % C
5656+; HL = HL / C
5657Mod8::
5758 ld b, 16
5859.Loop
···6566 sub c
6667 jr nz, Mod8.Loop
6768.Exit
6868- ret
6969-7070-; from = b
7171-; to = c
7272-; ret = b
7373-rand_range::
7474- push de
7575-7676- call rand
7777- push hl
7878- push af
7979- ld l, b
8080- ld h, 0
8181- add c, 1
8282- add c, b
8383- call Mod8
8484- ld e, a
8585- pop af
8686- pop hl
8787- add e, b
8888- ld b, e
8989- pop de
9069 ret