diff options
author | Astatin <[email protected]> | 2025-04-11 11:41:48 +0200 |
---|---|---|
committer | Astatin <[email protected]> | 2025-04-11 11:41:48 +0200 |
commit | 690ff7c09726d9e760b52b717c70e9567531175c (patch) | |
tree | 4e951d5ca5914b998dbb066aee11b03955e7281b /entity | |
parent | 5eb4fc176cae7907a90789051e1e3a9d1fc10f37 (diff) |
Add per entity spawning rate
Diffstat (limited to 'entity')
-rw-r--r-- | entity/bunny.gbasm | 2 | ||||
-rw-r--r-- | entity/init.gbasm | 132 | ||||
-rw-r--r-- | entity/list.gbasm | 21 | ||||
-rw-r--r-- | entity/utils.gbasm | 26 |
4 files changed, 158 insertions, 23 deletions
diff --git a/entity/bunny.gbasm b/entity/bunny.gbasm index 7789ec5..4ae93f3 100644 --- a/entity/bunny.gbasm +++ b/entity/bunny.gbasm @@ -296,7 +296,7 @@ Move_Bunny: INC A DAA JR C, =.End_movement.skip_mana_regen - CP $30 + CP $31 JR NC, =.End_movement.skip_mana_regen LD $mem_bunny_mana, A diff --git a/entity/init.gbasm b/entity/init.gbasm index 4351265..09ca315 100644 --- a/entity/init.gbasm +++ b/entity/init.gbasm @@ -128,12 +128,9 @@ Fix_Bunny_screen: RET Initialize_Enemy: ; HL => pointer to entity struct - LD A, $mem_enemies_alive_count - INC A - LD $mem_enemies_alive_count, A - - CALL =RNG_Step - AND $03 + CALL =Enemy_idx_to_spawn + CP $ff + RET Z ADD $03 Initialize_Entity: ; HL => pointer to entity struct, A => entity loaded index, 1 in $tmp_var_3 if should retry if collsion (could potentially fail multiple time/infinite loop) @@ -241,21 +238,10 @@ Initialize_Entity: ; HL => pointer to entity struct, A => entity loaded index, 1 LD A, $03 LD (HL+), A - LD BC, =Entity_list - LD D, high($mem_loaded_entities_indices) - LD A, low($mem_loaded_entities_indices) - ADD E - LD E, A - LD A, (DE) - SLA A - SLA A - SLA A - ADD $02 - ADD low(=Entity_list) - LD C, A - LD A, high(=Entity_list) - ADC $00 - LD B, A + LD A, E + CALL =Entity_idx_to_entity_list_ptr + INC BC + INC BC ; Turn LD A, (BC) @@ -292,6 +278,16 @@ Initialize_Entity: ; HL => pointer to entity struct, A => entity loaded index, 1 ADD $06 LD L, A + LD A, E + CP $03 + RET C + + CP $07 + RET NC + + LD A, $mem_enemies_alive_count + INC A + LD $mem_enemies_alive_count, A RET FindFreeEntity: @@ -325,7 +321,7 @@ Respawn_Entities: LD $tmp_var_3, A CALL =RNG_Step - AND $0f + AND $07 CP $00 RET NZ @@ -333,3 +329,95 @@ Respawn_Entities: CALL =Initialize_Enemy RET + +Enemy_spawn_pattern_to_probability: ; (1/(x + 1)) + .DB 0b11111111 + .DB 0b00000111 + .DB 0b00000001 + .DB 0b00000000 + +Enemy_idx_to_spawn: ; Return in A, ff if no entity to be spawned + PUSH BC + + LD A, $mem_entity_spawning_pattern + LD B, A + + CALL =RNG_Step + AND $03 + LD C, A + SLA A + CALL =RRx + LD A, B + AND $03 + + PUSH DE + LD DE, =Enemy_spawn_pattern_to_probability + ADD E + LD E, A + LD A, D + ADC $00 + LD D, A + LD A, (DE) + POP DE + + LD B, A + CALL =RNG_Step + AND B + CP $00 + LD A, $ff + JR NZ, =.skip_set_enemy_idx + + LD A, C + + .skip_set_enemy_idx: + + POP BC + RET + +.MACRODEF GET_ENTITY_IDX_SPAWN_RATE idx ; breaks BC & A + LD A, low($idx) + CALL =Entity_idx_to_entity_list_ptr + LD A, C + ADD $07 + LD C, A + LD A, B + ADC $00 + LD B, A + LD A, (BC) + AND $03 +.END + +Update_Enemies_Spawning_Pattern: + PUSH AF + PUSH BC + PUSH DE + + LD E, $00 + .GET_ENTITY_IDX_SPAWN_RATE $06 + OR E + LD E, A + + SLA E + SLA E + .GET_ENTITY_IDX_SPAWN_RATE $05 + OR E + LD E, A + + SLA E + SLA E + .GET_ENTITY_IDX_SPAWN_RATE $04 + OR E + LD E, A + + SLA E + SLA E + .GET_ENTITY_IDX_SPAWN_RATE $03 + OR E + + LD $mem_entity_spawning_pattern, A + DBG + + POP DE + POP BC + POP AF + RET diff --git a/entity/list.gbasm b/entity/list.gbasm index 5aa71bd..0e2ba86 100644 --- a/entity/list.gbasm +++ b/entity/list.gbasm @@ -18,6 +18,9 @@ Entity_list: ; Starting mana .DB $05 + ; Spawning rate (2 lsb) + .DB 0b11 + .PADTO =.Fox+8 .Frog: @@ -39,6 +42,9 @@ Entity_list: ; Starting mana .DB $00 + ; Spawning rate (2 lsb) + .DB 0b01 + .PADTO =.Frog+8 .Cat: @@ -60,6 +66,9 @@ Entity_list: ; Starting mana .DB $00 + ; Spawning rate (2 lsb) + .DB 0b11 + .PADTO =.Cat+8 .Penguin: @@ -81,6 +90,9 @@ Entity_list: ; Starting mana .DB $05 + ; Spawning rate (2 lsb) + .DB 0b01 + .PADTO =.Penguin+8 .Mouse: @@ -102,6 +114,9 @@ Entity_list: ; Starting mana .DB $00 + ; Spawning rate (2 lsb) + .DB 0b10 + .PADTO =.Mouse+8 .Fimsh: @@ -123,6 +138,9 @@ Entity_list: ; Starting mana .DB $00 + ; Spawning rate (2 lsb) + .DB 0b00 + .PADTO =.Fimsh+8 .QuestGoalBunny: @@ -144,4 +162,7 @@ Entity_list: ; Starting mana .DB $00 + ; Spawning rate (2 lsb) + .DB 0b00 + .PADTO =.QuestGoalBunny+8 diff --git a/entity/utils.gbasm b/entity/utils.gbasm index 8a44d6d..8394f9f 100644 --- a/entity/utils.gbasm +++ b/entity/utils.gbasm @@ -80,3 +80,29 @@ Get_Position_After_Move: ; entity (whatever alignement) in HL, direction to test POP DE POP HL RET + +Entity_idx_to_entity_list_ptr: ; loaded idx in A, return in BC + PUSH DE + + LD D, high($mem_loaded_entities_indices) + LD E, low($mem_loaded_entities_indices) + ADD E + LD E, A + LD A, (DE) + LD C, A + LD B, $00 + SLA C + RL B + SLA C + RL B + SLA C + RL B + LD A, C + ADD low(=Entity_list) + LD C, A + LD A, B + ADC high(=Entity_list) + LD B, A + + POP DE + RET |