aboutsummaryrefslogtreecommitdiff
path: root/entity
diff options
context:
space:
mode:
authorAstatin <[email protected]>2025-04-11 11:41:48 +0200
committerAstatin <[email protected]>2025-04-11 11:41:48 +0200
commit690ff7c09726d9e760b52b717c70e9567531175c (patch)
tree4e951d5ca5914b998dbb066aee11b03955e7281b /entity
parent5eb4fc176cae7907a90789051e1e3a9d1fc10f37 (diff)
Add per entity spawning rate
Diffstat (limited to 'entity')
-rw-r--r--entity/bunny.gbasm2
-rw-r--r--entity/init.gbasm132
-rw-r--r--entity/list.gbasm21
-rw-r--r--entity/utils.gbasm26
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