A dungeon delver roguelike using Pathfinder 2nd edition rules

Finishing up generate_dungeon

+89 -84
+88 -62
gb/src/dungeon.asm
··· 17 17 BIT_DOOR_WEST:: db $20 18 18 BIT_STAIR_BELOW:: db $40 19 19 BIT_STAIR_UP:: db $80 20 + MAX_ROOMS:: dw 512 20 21 21 22 ; Params: 22 23 ; Starting Width: B ··· 29 30 ret 30 31 31 32 GenerateDungeon:: 32 - ; Cache current register values to restore later 33 - ; In the event this is called with values in the 34 - ; registers to be used in an outer function 35 - push de 36 - push hl 37 - push af 38 - push bc 39 - 40 - ld hl, current_width ; dungeon_area = current_width * current_height 33 + ; REG_B = i 34 + ; REG_C = generated_cells_number 35 + ; REG_D = dungeon_area 36 + ld hl, current_width 41 37 ld e, [hl] 42 38 ld d, 0 43 39 ld hl, current_height 44 40 ld a, [hl] 45 41 call Mul8 46 - ld d, h 47 - ld e, l 48 - 49 - ; generated_cells_number is stored in A 50 - ld a, 0 ; generated_cells_number = 0 51 - 52 - ; i is stored in B 53 - ld b, 0 ; i = 0 54 - .LoopCheck: ; for loop begin 55 - cp a, e ; if (generated_cells_number < dungeon_area) && ((i == 0) || (i < generated_cells_number)) 56 - jp nz, GenerateDungeon.Loop_Skip ; Break Loop 57 - jp nc, GenerateDungeon.Loop_Skip 58 - .LoopCheck2: 59 - push af 42 + ld d, l 43 + ld c, 0 44 + ld b, 0 45 + .LoopCheck 46 + ld a, c 47 + cp a, d 48 + jp c, .LoopEnd 49 + jp z, .LoopEnd 60 50 ld a, b 61 51 cp a, 0 62 - pop af 63 - jp z, GenerateDungeon.Loop_Body 64 - push af 65 - push bc 66 - ld c, a 67 - ld a, b 68 - ld b, c 69 - cp a, b 70 - pop bc 71 - pop af 72 - jp nz, GenerateDungeon.Loop_Skip 73 - jp nc, GenerateDungeon.Loop_Skip 74 - .Loop_Body: 75 - push af ; if ((i == 0) && (generated_cells_number == 0)) 76 - ld a, b 52 + jp nz, .LoopCheck2 53 + jp z, .LoopBody 54 + .LoopCheck2 55 + cp a, c 56 + jp c, .LoopEnd 57 + jp z, .LoopEnd 58 + .LoopBody 77 59 cp a, 0 78 - pop af 79 - jp nz, GenerateDungeon.Loop_Body2 60 + jp nz, .LoopBody2 61 + ld a, c 80 62 cp a, 0 81 - jp nz, GenerateDungeon.Loop_Body2 63 + jp nz, .LoopBody2 82 64 push bc 83 - ld b, 0 84 - ld c, e 85 - call rand_range 86 - push hl 65 + call rand 66 + ld l, b 67 + ld h, 0 68 + ld c, d 69 + inc c 70 + call Mod8 87 71 ld hl, entrance_id 88 - ld [hl], b 89 - ld hl, generated_cells 90 - ld [hl], b 91 - ld hl, dungeon_grid 92 - push af 93 - ld a, l 94 - add a, b 95 - ld l, a 72 + ld [hl], a 73 + pop bc 74 + ld hl, generated_cells+$0 75 + ld [hl], a 96 76 ld a, BIT_ENTRANCE 97 77 or a, BIT_USED_ROOM 78 + ld hl, dungeon_grid 79 + push de 80 + push hl 81 + ld hl, entrance_id 82 + ld e, [hl] 83 + ld d, 0 84 + pop hl 85 + add hl, de 86 + pop de 98 87 ld [hl], a 99 - pop af 100 - ld a, 1 88 + ld c, 1 89 + .LoopBody2 90 + call GenerateRoom 91 + ld hl, dungeon_grid 92 + push de 93 + push hl 94 + ld hl, generated_cells 95 + ld e, b 96 + ld d, 0 97 + add hl, de 98 + ld e, [hl] 99 + ld d, 0 101 100 pop hl 101 + add hl, de 102 + pop de 103 + ld a, [hl] 104 + and a, BIT_USED_ROOM 105 + jp nz, .LoopBody3 106 + ld a, [hl] 107 + or a, BIT_USED_ROOM 108 + ld [hl], a 109 + .LoopBody3 110 + ld a, c 111 + sub a, 1 112 + ld e, a 113 + ld a, b 114 + cp a, e 115 + jp nz, .LoopBody4 116 + push bc 117 + ld l, d 118 + ld h, 0 119 + ld c, 4 120 + call Mod8 102 121 pop bc 103 - .Loop_Body2: 104 - call GenerateRoom 105 - .Loop_Skip: 106 - pop bc 107 - pop af 108 - pop hl 122 + push de 123 + ld e, l 124 + ld d, h 125 + ld a, 3 126 + call Mul8 109 127 pop de 110 - 128 + ld a, c 129 + cp a, l 130 + jp z, .LoopBody4 131 + jp c, .LoopBody4 132 + jp .LoopEnd 133 + .LoopBody4 134 + inc b 135 + jp .LoopCheck 136 + .LoopEnd 111 137 ret 112 138 113 139 GenerateRoom::
+1 -22
gb/src/utils.asm
··· 53 53 ret 54 54 55 55 ; A = HL % C 56 + ; HL = HL / C 56 57 Mod8:: 57 58 ld b, 16 58 59 .Loop ··· 65 66 sub c 66 67 jr nz, Mod8.Loop 67 68 .Exit 68 - ret 69 - 70 - ; from = b 71 - ; to = c 72 - ; ret = b 73 - rand_range:: 74 - push de 75 - 76 - call rand 77 - push hl 78 - push af 79 - ld l, b 80 - ld h, 0 81 - add c, 1 82 - add c, b 83 - call Mod8 84 - ld e, a 85 - pop af 86 - pop hl 87 - add e, b 88 - ld b, e 89 - pop de 90 69 ret