A dungeon delver roguelike using Pathfinder 2nd edition rules
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

I think the dungeon generation works now...

+296 -271
+1 -1
gb/src/main/states/generate_dungeon/dungeon-state.asm
··· 15 15 ld hl, PressGenerateText2 16 16 call DrawTextTilesLoop 17 17 18 - ld a, LCDCF_ON | LCDCF_BGON | LCDCF_OBJON 18 + ld a, LCDCF_ON | LCDCF_BGON 19 19 ld [rLCDC], a 20 20 ld a, 10 21 21 ld [wVBlankCount], a
+294 -269
gb/src/main/states/generate_dungeon/dungeon.asm
··· 1 1 SECTION "DungeonVariables", WRAM0 2 2 3 - wDungeonGrid:: ds 512 3 + wDungeonGrid:: ds $ff 4 4 wEntrance:: db 5 5 wCurrentRoom:: db 6 6 wCurrentWidth:: db 7 7 wCurrentHeight:: db 8 - wGeneratedCells:: ds 512 8 + wGeneratedCells:: ds $ff 9 9 wDungeonArea:: db 10 10 wTwoThirdsArea:: db 11 11 wPotentialDoors:: db 12 12 13 13 SECTION "DungeonCode", ROM0 14 14 15 - BIT_USED_ROOM:: db %00000001 16 - BIT_ENTRANCE:: db %00000010 17 - BIT_DOOR_NORTH:: db %00000100 18 - BIT_DOOR_EAST:: db %00001000 19 - BIT_DOOR_SOUTH:: db %00010000 20 - BIT_DOOR_WEST:: db %00100000 21 - BIT_STAIR_BELOW:: db %01000000 22 - BIT_STAIR_UP:: db %10000000 23 - MAX_ROOMS:: dw 512 24 - NEIGHBORS:: db %00111100 25 - 26 15 ; Params: 27 16 ; Starting Width: B 28 17 ; Starting Height: C ··· 38 27 ld a, e ; wTwoThirdsArea = REG_E 39 28 ld [wTwoThirdsArea], a 40 29 ld a, $ff ; initialize memory 41 - ld b, 2 42 30 ld hl, wDungeonGrid 43 31 .Loop 44 32 cp 0 45 - jp z, .Loop2 33 + jp z, .End 46 34 ld [hl], 0 47 35 inc l 48 36 sub 1 49 37 jp .Loop 50 - .Loop2 51 - ld [hl], 0 52 - dec b 53 - ld a, b 54 - cp 0 55 - jp z, .End 56 - ld l, 0 57 - inc h 58 - ld a, $ff 59 - jp .Loop 60 38 .End 39 + ld [hl], 0 61 40 ret 62 41 63 42 GenerateDungeon:: 64 - ; REG_B = generated_cells_number 65 - ; REG_C = i 66 - ld b, 0 ; REG_B = 0 67 - ld c, 0 ; REG_C = 0 68 - .LoopCheck 69 - ld a, [wDungeonArea] ; IF REG_B >= wDungeonArea 70 - ld e, a 71 - ld a, b 72 - cp e 73 - jp nc, .LoopSkip ; break 74 - jp z, .LoopSkip 75 - ld a, c ; IF REG_C == 0 43 + xor a 44 + ld b, a 45 + ld c, a 46 + push bc 47 + ; SP = generated_cells_number 48 + ; SP + 1 = i 49 + .Loop 50 + ld hl, sp+0 ; generated_cells_number 51 + ld a, [hl] 52 + ld hl, wDungeonArea 53 + cp [hl] 54 + jp nc, .LoopEnd 55 + ld hl, sp+1 ; i 56 + ld a, [hl] 76 57 cp 0 77 - jp z, .LoopBody ; proceed to loop 78 - cp b ; IF REG_C >= REG_B 79 - jp nc, .LoopSkip ; break 80 - jp z, .LoopSkip 58 + jp z, .LoopBody 59 + ld hl, sp+0 60 + cp [hl] 61 + jp c, .LoopBody 62 + jp .LoopEnd 81 63 .LoopBody 82 - ld a, c ; IF REG_C == 0 64 + ld hl, sp+1 ; i 65 + ld a, [hl] 83 66 cp 0 84 67 jp nz, .LoopBody2 85 - ld a, b ; AND REG_B == 0 68 + dec hl ; generated_cells_number 69 + ld a, [hl] 86 70 cp 0 87 71 jp nz, .LoopBody2 88 - ld d, b ; wEntrance = rand_range(0, wDungeonArea) 89 - ld e, c 90 72 call rand 91 73 ld a, b 92 74 ld hl, wDungeonArea 93 - .LoopBodyLoop 75 + .SmallLoop 94 76 cp [hl] 95 - jp c, .LoopBodyLoopSkip 77 + jp c, .SmallLoopEnd 96 78 sub [hl] 97 - jp .LoopBodyLoop 98 - .LoopBodyLoopSkip 79 + jp .SmallLoop 80 + .SmallLoopEnd 99 81 ld [wEntrance], a 100 - ld b, d 101 - ld c, e 102 - ld hl, wGeneratedCells ; wGeneratedCells[0] = wEntrance 103 - ld a, l 104 - add b 105 - ld l, a 106 - ld a, [wEntrance] 107 - ld [hl], a 108 - ld hl, wDungeonGrid ; wDungeonGrid[wEntrance] = BIT_ENTRANCE | BIT_USED_ROOM 82 + ld [wGeneratedCells], a 109 83 ld e, a 84 + ld hl, wDungeonGrid 110 85 ld a, l 111 86 add e 112 87 ld l, a 113 88 ld [hl], $03 114 - ld b, 1 ; REG_B = 1 89 + ld hl, sp+0 90 + ld a, 1 91 + ld [hl], a 115 92 .LoopBody2 116 - call GenerateRoom ; generate_room(wDungeonGrid, REG_B, REG_C, wGeneratedCells) 117 - ld hl, wGeneratedCells ; IF wDungeonGrid[wGeneratedCells[REG_C]] IS_NOT_USED 93 + call GenerateRoom 94 + ; This program will assume that GenerateRoom will pop all values from the stack after use 95 + ; So that... 96 + ; SP = generated_cells_number 97 + ; SP + 1 = i 98 + ld hl, sp+1 99 + ld a, [hl] 100 + ld e, a 101 + ld hl, wGeneratedCells 118 102 ld a, l 119 - add c 103 + add e 120 104 ld l, a 121 105 ld e, [hl] 122 106 ld hl, wDungeonGrid ··· 124 108 add e 125 109 ld l, a 126 110 ld a, [hl] 127 - ld hl, BIT_USED_ROOM 128 - and [hl] 111 + and $01 129 112 jp nz, .LoopBody3 130 - ld hl, wGeneratedCells ; SET USED_BIT IN wDungeonGrid[wGeneratedCells[REG_C]] 131 - ld a, l 132 - add c 133 - ld l, a 134 - ld e, [hl] 135 - ld hl, wDungeonGrid 136 - ld a, l 137 - add e 138 - ld l, a 139 113 ld a, [hl] 140 - set 7, a 114 + or $01 141 115 ld [hl], a 142 116 .LoopBody3 143 - ld a, c ; IF REG_C == REG_B - 1 144 - ld e, b 117 + ld hl, sp+1 118 + ld a, [hl] 119 + ld hl, sp+0 120 + ld e, [hl] 145 121 dec e 146 122 cp e 147 - jp nz, .LoopBody4 148 - ld a, b 149 - ld hl, wTwoThirdsArea ; AND REG_B < wTwoThirdsArea 123 + jp nz, .LoopContinue 124 + inc e 125 + ld a, e 126 + ld hl, wTwoThirdsArea 150 127 cp [hl] 151 - jp nc, .LoopBody4 152 - jp z, .LoopBody4 153 - ld c, -1 ; REG_C = -1 154 - .LoopBody4 155 - inc c ; REG_C += 1 156 - jp .LoopCheck ; LOOP 157 - .LoopSkip 158 - ; wCurrentRoom = wEntrance 159 - ld hl, wEntrance 128 + jp nc, .LoopContinue 129 + ld hl, sp+1 130 + xor a 131 + ld [hl], a 132 + jp .Loop 133 + .LoopContinue 134 + ld hl, sp+1 160 135 ld a, [hl] 161 - ld [wCurrentRoom], a 136 + inc a 137 + ld [hl], a 138 + jp .Loop 139 + .LoopEnd 140 + pop bc ; Get rid of manual value pushed on stack to get old PC back at SP 162 141 ret 163 142 164 143 GenerateRoom:: 165 - ; REG_B = queue_size => cell_index 166 - ; REG_C = cell_index_queue => neighbor_room 167 - ; REG_D = door 168 - ; REG_E = opposite_door 169 - ; cells_queue = wGeneratedCells 170 - ld d, b ; REG_D = rand_range(0, NEIGHBORS) 171 - ld e, c 172 144 call rand 145 + rlc b 146 + rlc b 147 + rlc b 148 + rlc b 173 149 ld a, b 174 - ld hl, NEIGHBORS 175 - ld l, [hl] 176 - .Loop1 177 - cp l 178 - jp c, .Loop1Skip 179 - sub l 180 - jp .Loop1 181 - .Loop1Skip 182 - ld [wPotentialDoors], a 183 - ld b, d 184 - ld c, e 150 + and $0f 151 + ld hl, wPotentialDoors 152 + ld [hl], a 153 + xor a 154 + ld b, a 155 + ld c, a 156 + push bc 185 157 push bc 186 - ld hl, wGeneratedCells ; REG_B = wGeneratedCells[REG_C] 158 + ; SP = door 159 + ; SP + 1 = opposite_door 160 + ; SP + 2 = neighbor_room 161 + ; SP + 3 = cell_index 162 + ; SP + 4 = OLD_PC_LOW 163 + ; SP + 5 = OLD_PC_HIGH 164 + ; SP + 6 = generated_cells_number 165 + ; SP + 7 = i 166 + ld hl, sp+0 167 + ld a, 1 168 + ld [hl], a 169 + ld hl, sp+7 170 + ld e, [hl] 171 + ld hl, wGeneratedCells 187 172 ld a, l 188 - add c 173 + add e 189 174 ld l, a 190 - ld b, [hl] 191 - ld d, 1 192 - .LoopCheck 193 - ld a, d ; IF REG_D > NEIGHBORS 194 - ld hl, NEIGHBORS 195 - cp [hl] 196 - jp nc, .LoopSkip ; BREAK 197 - jp z, .LoopSkip 198 - and [hl] ; IF (REG_D & NEIGHBORS) != REG_D 199 - cp d 200 - jp nz, .LoopContinue ; CONTINUE 201 - ld hl, wDungeonGrid ; IF wDungeonGrid[REG_B] & REG_D 175 + ld a, [hl] 176 + ld hl, sp+3 177 + ld [hl], a 178 + .Loop 179 + ld hl, sp+0 180 + ld a, [hl] 181 + cp 16 182 + jp z, .LoopEnd 183 + ld hl, sp+3 184 + ld e, [hl] 185 + ld hl, wDungeonGrid 202 186 ld a, l 203 - add b 187 + add e 204 188 ld l, a 205 189 ld a, [hl] 190 + ld hl, sp+0 191 + ld d, [hl] 192 + sla d 193 + sla d 206 194 and d 207 - cp 0 208 - jp nz, .LoopContinue ; CONTINUE 209 - call GetNeighborRoomIndex ; REG_C = get_neighbor_room_index(wDungeonGrid, REG_B, REG_D) 210 - ld a, c ; IF ! ~REG_C 195 + jp nz, .LoopContinue 196 + call GetNeighborRoomIndex 197 + ; This program will assume that GenerateRoom will pop all values from the stack after use 198 + ; So that... 199 + ; SP = door 200 + ; SP + 1 = opposite_door 201 + ; SP + 2 = neighbor_room 202 + ; SP + 3 = cell_index 203 + ; SP + 4 = OLD_PC_LOW 204 + ; SP + 5 = OLD_PC_HIGH 205 + ; SP + 6 = generated_cells_number 206 + ; SP + 7 = i 207 + ld hl, sp+2 208 + ld a, [hl] 211 209 cpl 212 210 cp 0 213 - jp z, .LoopContinue ; CONTINUE 214 - ld hl, wDungeonGrid ; IF wDungeonGrid[REG_C] & BIT_USED_ROOM 211 + jp z, .LoopContinue 212 + ld e, [hl] 213 + ld hl, wDungeonGrid 215 214 ld a, l 216 - add c 215 + add e 217 216 ld l, a 218 217 ld a, [hl] 219 218 and $01 220 - jp nz, .LoopContinue ; CONTINUE 221 - call GetOppositeDirectionBit ; REG_E = get_opposite_direction_bit(REG_D) 222 - ld a, [wPotentialDoors] ; IF (REG_D & wPotentialDoors) == REG_D 223 - and d 224 - cp d 219 + jp nz, .LoopContinue 220 + call GetOppositeDirecitonBit ; This will simply be stored in REG_B 221 + ; This program will assume that GenerateRoom will pop all values from the stack after use 222 + ; So that... 223 + ; SP = door 224 + ; SP + 1 = opposite_door 225 + ; SP + 2 = neighbor_room 226 + ; SP + 3 = cell_index 227 + ; SP + 4 = OLD_PC_LOW 228 + ; SP + 5 = OLD_PC_HIGH 229 + ; SP + 6 = generated_cells_number 230 + ; SP + 7 = i 231 + ld hl, sp+0 232 + ld a, [hl] 233 + ld hl, wPotentialDoors 234 + and [hl] 235 + ld hl, sp+0 236 + cp [hl] 225 237 jp nz, .LoopBody2 226 - ld hl, wDungeonGrid ; wDungeonGrid[REG_B] |= REG_D 238 + ld hl, sp+3 239 + ld e, [hl] 240 + ld hl, sp+0 241 + ld d, [hl] 242 + sla d 243 + sla d 244 + ld hl, wDungeonGrid 227 245 ld a, l 228 - add b 246 + add e 229 247 ld l, a 230 248 ld a, [hl] 231 249 or d 232 250 ld [hl], a 233 - ld hl, wDungeonGrid ; wDungeonGrid[REG_C] |= REG_E 251 + ld hl, sp+2 252 + ld e, [hl] 253 + ld hl, wDungeonGrid 234 254 ld a, l 235 - add c 255 + add e 236 256 ld l, a 237 257 ld a, [hl] 238 - or e 258 + or b 239 259 ld [hl], a 240 260 .LoopBody2 241 - ld hl, wDungeonGrid ; IF wDungeonGrid[REG_C] == REG_E 261 + ld hl, sp+2 262 + ld e, [hl] 263 + ld hl, wDungeonGrid 242 264 ld a, l 243 - add c 265 + add e 244 266 ld l, a 245 267 ld a, [hl] 246 - cp e 268 + cp b 247 269 jp nz, .LoopContinue 248 - pop hl ; wGeneratedCells[OLD_REG_B] = REG_C 249 - push de 250 - ld d, h 251 - ld e, l 270 + ld hl, sp+6 271 + ld e, [hl] 272 + ld hl, sp+2 273 + ld d, [hl] 252 274 ld hl, wGeneratedCells 253 275 ld a, l 254 - add d 276 + add e 255 277 ld l, a 256 - ld [hl], c 257 - inc d ; OLD_REG_B += 1 258 - ld h, d 259 - ld l, e 260 - pop de 261 - push hl 278 + ld [hl], d 279 + ld hl, sp+6 280 + ld a, [hl] 281 + inc a 282 + ld [hl], a 262 283 .LoopContinue 263 - rlc d ; REG_D <= 1 264 - jp .LoopCheck ; LOOP 265 - .LoopSkip 266 - pop bc 284 + ld hl, sp+0 285 + ld a, [hl] 286 + sla a 287 + ld [hl], a 288 + jp .Loop 289 + .LoopEnd 290 + pop bc ; Get rid of manual value pushed on stack to get old PC back at SP 291 + pop bc ; Get rid of manual value pushed on stack to get old PC back at SP 267 292 ret 268 293 269 294 GetNeighborRoomIndex:: 270 - ; REG_B = current_room 271 - ; REG_C = return val 272 - ; REG_D = direction 273 - ld a, d ; BEGIN SWITCH 274 - cp %00000100 ; CASE BIT_DOOR_NORTH 275 - jp nz, .Check1 276 - ld a, b ; REG_C = REG_B - wCurrentWidth 295 + ; SP = OLD_PC_LOW 296 + ; SP + 1 = OLD_PC_HIGH 297 + ; SP + 2 = door (needs to be shifted left twice) 298 + ; SP + 3 = opposite_door 299 + ; SP + 4 = neighbor_room 300 + ; SP + 5 = cell_index 301 + ; SP + 6 = OLD_PC_LOW 302 + ; SP + 7 = OLD_PC_HIGH 303 + ; SP + 8 = generated_cells_number 304 + ; SP + 9 = i 305 + ld hl, sp+2 306 + ld a, [hl] 307 + sla a 308 + sla a 309 + cp $04 310 + jp nz, .Case2 311 + ld hl, sp+5 312 + ld a, [hl] 277 313 ld hl, wCurrentWidth 278 314 sub [hl] 279 - ld c, a 280 - jp .Body2 ; BREAK 281 - .Check1 282 - cp %00001000 ; CASE BIT_DOOR_EAST 283 - jp nz, .Check2 284 - ld a, b ; REG_C = REG_B + 1 315 + ld hl, sp+4 316 + ld [hl], a 317 + cp 0 318 + ret z 319 + ret nc 320 + jp .Default 321 + .Case2 322 + cp $08 323 + jp nz, .Case3 324 + ld hl, sp+5 325 + ld a, [hl] 285 326 inc a 286 - ld c, a 287 - jp .Body2 ; BREAK 288 - .Check2 289 - cp %00010000 ; CASE BIT_DOOR_SOUTH 290 - jp nz, .Check3 291 - ld a, b ; REG_C = REG_B + wCurrentWidth 327 + ld hl, sp+4 328 + ld [hl], a 329 + ld hl, wDungeonArea 330 + cp [hl] 331 + ret c 332 + jp .Default 333 + .Case3 334 + cp $10 335 + jp nz, .Case4 336 + ld hl, sp+5 337 + ld a, [hl] 292 338 ld hl, wCurrentWidth 293 339 add [hl] 294 - ld c, a 295 - jp .Body2 ; BREAK 296 - .Check3 297 - cp %00100000 ; CASE BIT_DOOR_WEST 298 - jp nz, .Check4 299 - ld a, b ; REG_C = REG_B - 1 300 - dec a 301 - ld c, a 302 - jp .Body2 ; BREAK 303 - .Check4 ; DEFAULT_CASE 304 - ld c, -1 ; REG_C = -1 305 - .Body2 306 - ld a, d ; IF REG_D == BIT_DOOR_NORTH 307 - cp %00000100 308 - jp nz, .Body3 309 - ld a, c ; AND REG_C >= 0 310 - cp -1 311 - jp z, .Body3 312 - cp 0 313 - jp c, .Body2a ; RETURN 314 - ret 315 - .Body2a 316 - jp nz, .FuncEnd 317 - ret 318 - .Body3 319 - ld a, d ; IF REG_D == BIT_DOOR_SOUTH 320 - cp %00010000 321 - jp nz, .Body4 322 - ld a, c ; AND REG_C < wDungeonArea 340 + ld hl, sp+4 341 + ld [hl], a 342 + ld hl, wCurrentWidth 343 + ld e, [hl] 344 + ld d, a 345 + xor a 323 346 ld hl, wDungeonArea 324 - cp [hl] 325 - jp nc, .FuncEnd ; RETURN 326 - jp z, .FuncEnd 327 - ret 328 - .Body4 329 - ld a, d ; IF REG_D == BIT_DOOR_EAST 330 - cp %00001000 331 - jp nz, .Body5 332 - ; REG_A = REG_D % wCurrentWidth 333 - push bc ; AND (REG_D % wCurrentWidth) > 0 334 - ld a, d 335 - ld hl, wCurrentWidth 336 347 ld c, [hl] 337 - call Modulo 338 - pop bc 339 - cp 0 340 - jp c, .FuncEnd ; RETURN 341 - jp z, .FuncEnd 342 - ret 343 - .Body5 344 - ld a, d ; IF REG_D == BIT_DOOR_WEST 345 - cp %00100000 346 - jp nz, .FuncEnd 347 - push bc ; AND (REG_D % wCurrentWidth) < (wCurrentWidth - 1) 348 - ld a, d 348 + .Case3Loop 349 + cp d 350 + jp z, .Default 351 + cp c 352 + ret z 353 + add e 354 + jp .Case3Loop 355 + .Case4 356 + cp $20 357 + jp nz, .Default 358 + ld hl, sp+5 359 + ld a, [hl] 360 + dec a 361 + ld hl, sp+4 362 + ld [hl], a 349 363 ld hl, wCurrentWidth 364 + ld e, [hl] 365 + ld d, a 366 + xor a 367 + dec a 368 + ld hl, wDungeonArea 350 369 ld c, [hl] 351 - call Modulo 352 - pop bc 353 - ld hl, wCurrentWidth 354 - ld l, [hl] 355 - dec l 356 - cp l 357 - jp nc, .FuncEnd ; RETURN 358 - jp z, .FuncEnd 359 - ret 360 - .FuncEnd 361 - ld c, -1 370 + .Case4Loop 371 + cp c 372 + ret c 373 + cp d 374 + jp z, .Default 375 + add e 376 + jp .Case4Loop 377 + .Default 378 + ld hl, sp+4 379 + ld a, -1 380 + ld [hl], a 362 381 ret 363 382 364 - GetOppositeDirectionBit:: 365 - ; REG_D = door 366 - ; REG_E = return val 367 - ld a, d 368 - ;BIT_DOOR_NORTH:: db %00000100 369 - ;BIT_DOOR_EAST:: db %00001000 370 - ;BIT_DOOR_SOUTH:: db %00010000 371 - ;BIT_DOOR_WEST:: db %00100000 372 - cp %00000100 373 - jp nz, .Check1 374 - ld e, %00010000 375 - ret 376 - .Check1 377 - cp %00001000 378 - jp nz, .Check2 379 - ld e, %00100000 380 - ret 381 - .Check2 382 - cp %00010000 383 - jp nz, .Check3 384 - ld e, %00000100 385 - ret 386 - .Check3 387 - cp %00100000 388 - jp nz, .Check4 389 - ld e, %00001000 390 - ret 391 - .Check4 392 - ld e, -1 383 + GetOppositeDirecitonBit:: 384 + ; SP = OLD_PC_LOW 385 + ; SP + 1 = OLD_PC_HIGH 386 + ; SP + 2 = door (needs to be shifted left twice) 387 + ; SP + 3 = opposite_door 388 + ; SP + 4 = neighbor_room 389 + ; SP + 5 = cell_index 390 + ; SP + 6 = OLD_PC_LOW 391 + ; SP + 7 = OLD_PC_HIGH 392 + ; SP + 8 = generated_cells_number 393 + ; SP + 9 = i 394 + ld b, -1 395 + ld hl, sp+2 396 + ld a, [hl] 397 + sla a 398 + sla a 399 + cp $04 400 + jp nz, .Case2 401 + ld b, $10 402 + jp .Break 403 + .Case2 404 + cp $08 405 + jp nz, .Case3 406 + ld b, $20 407 + jp .Break 408 + .Case3 409 + cp $10 410 + jp nz, .Case4 411 + ld b, $04 412 + jp .Break 413 + .Case4 414 + cp $20 415 + jp nz, .Break 416 + ld b, $08 417 + .Break 393 418 ret
+1 -1
gb/src/main/states/title-screen/title-screen-state.asm
··· 17 17 ld hl, PressPlayText 18 18 call DrawTextTilesLoop 19 19 20 - ld a, LCDCF_ON | LCDCF_BGON | LCDCF_OBJON 20 + ld a, LCDCF_ON | LCDCF_BGON 21 21 ld [rLCDC], a 22 22 ret 23 23