Initialize_Objects: LD A, $mem_map_loading_flags OR $01 LD $mem_map_loading_flags, A LD HL, $mem_object_list LD BC, $0080 CALL =bff LD HL, $mem_object_list CALL =Spawn_stairs CALL =Spawn_carrot CALL =Spawn_leaf RET Find_Free_Object_slot: ; Return free object slot in HL ($80 if none is found) LD HL, $mem_object_list .loop: LD A, $ff CP (HL) RET Z LD A, L ADD $08 LD L, A CP $80 JR NZ, =.loop RET Spawn_object_in_random_room_avoid_bunny: ; Object tile in A, Object jump table id in E, Object pointer in HL LD (HL+), A .retry: CALL =.retry.entrypoint JR =.retry .retry.entrypoint: LD A, $mem_bunny_current_room_idx CALL =Pick_Random_Room_Avoid_A JR =Spawn_object_in_random_room.place_object_in_room_A Spawn_object_in_random_room: ; Object tile in A, Object jump table id in E, Object pointer in HL LD (HL+), A .retry: CALL =.retry.entrypoint JR =.retry .retry.entrypoint: LD A, $mem_number_of_rooms CALL =RNG_Bound .place_object_in_room_A: SLA A SLA A ADD low($mem_room_list) LD C, A LD B, high($mem_room_list) LD A, (BC) LD D, A INC BC LD A, (BC) INC A CALL =RNG_Bound ADD D LD (HL+), A INC BC LD A, (BC) LD D, A INC BC LD A, (BC) INC A CALL =RNG_Bound ADD D LD (HL), A LD C, (HL) DEC HL LD B, (HL) CALL =Is_Collisionable CP $00 RET NZ ADD SP, $02 CALL =Check_other_object_collision CP $00 RET NZ INC HL INC HL LD (HL), E LD A, L AND $f8 ADD $08 LD L, A RET Check_other_object_collision: ; Object in HL (with only sprite x & y set), will be zeroed on collision and A will be 1 on return LD A, L AND $f8 ADD $01 LD L, A LD BC, $mem_object_list Object_check_collisions.loop: LD A, (BC) CP $00 JR Z, =Object_check_collisions.loop.next INC BC LD A, C CP L JR Z, =Object_check_collisions.loop.next LD A, (BC) CP (HL) JR NZ, =Object_check_collisions.loop.next INC BC INC HL LD A, (BC) CP (HL) JR NZ, =Object_check_collisions.loop.next DEC HL DEC HL XOR A LD (HL+), A LD (HL+), A LD (HL), A DEC HL DEC HL LD A, $01 RET Object_check_collisions.loop.next: LD A, L AND $f8 ADD $01 LD L, A LD A, C AND $f8 ADD $08 LD C, A CP $80 JR NZ, =Object_check_collisions.loop LD A, $00 RET Spawn_stairs: LD A, $60 LD E, $01 JP =Spawn_object_in_random_room_avoid_bunny Spawn_carrot: LD A, $64 LD E, $02 JP =Spawn_object_in_random_room Spawn_leaf: LD A, $68 LD E, $03 JP =Spawn_object_in_random_room Object_Interaction_Jump_table: ; 00 RET NOP NOP NOP ; 01 JP =Stairs_Action NOP ; 02 JP =Heal_Action NOP ; 03 JP =Restore_EP_Action NOP ; 04 JP =Heal_Attack_Box_Action NOP ; 05 JP =Freeze_Attack_Box_Action NOP ; 06 JP =Earcopter_Attack_Box_Action NOP ; 07 JP =Fimsh_Attack_Box_Action NOP Stairs_Action: LD A, $enum_dungeon_generation_mode LD $mem_current_mode, A LD $mem_requested_mode, A CALL =Update_VBlank_Handler LD A, $mem_floor_count INC A DAA JR C, =.skip_update_floor_count LD $mem_floor_count, A LD A, $mem_floor_count_bin INC A LD $mem_floor_count_bin, A .skip_update_floor_count: LD A, $mem_sound_flags BIT 1, A CALL NZ, =Reset_Music_Channel1 LD A, $mem_sound_flags BIT 2, A CALL NZ, =Reset_Music_Channel2 LD A, $mem_sound_flags BIT 3, A CALL NZ, =Reset_Music_Channel3 LD A, $mem_sound_flags BIT 4, A CALL NZ, =Reset_Music_Channel4 LD A, $mem_sound_flags AND 0b11000001 LD $mem_sound_flags, A LD A, $00 LD $mem_sound_effect_frame_count, A LD A, $ff LD ($mem_sound_effect_pc), A .SET_SOUND_EFFECT =_sound_effect_Next_Floor RET Heal_Action: LD A, $mem_bunny_health ADD $03 DAA CP $20 JR C, =.Set_health LD A, $20 .Set_health: LD $mem_bunny_health, A PUSH BC LD A, $mem_bunny_x LD B, A LD A, $mem_bunny_y LD C, A LD A, $01 PUSH DE LD E, $20 LD D, $00 CALL =Try_Launch_Animation POP DE POP BC .SET_SOUND_EFFECT =_sound_effect_Heal LD (HL), $00 RET Heal_Attack_Box_Action: LD (HL), $00 .START_SCRIPT =.Script LD A, $enum_dungeon_dialogue_mode LD $mem_requested_mode, A LD $mem_current_mode, A LD A, $mem_bunny_direction RES 3, A LD $mem_bunny_direction, A LD A, $00 LD $mem_bunny_animation, A LD A, $mem_map_loading_flags SET 5, A RES 3, A LD $mem_map_loading_flags, A RET .Script: .LEARN_ATTACK $02 .END Freeze_Attack_Box_Action: LD (HL), $00 .START_SCRIPT =.Script LD A, $enum_dungeon_dialogue_mode LD $mem_requested_mode, A LD $mem_current_mode, A LD A, $mem_bunny_direction RES 3, A LD $mem_bunny_direction, A LD A, $00 LD $mem_bunny_animation, A LD A, $mem_map_loading_flags SET 5, A RES 3, A LD $mem_map_loading_flags, A RET .Script: .LEARN_ATTACK $03 .END Earcopter_Attack_Box_Action: LD (HL), $00 .START_SCRIPT =.Script LD A, $enum_dungeon_dialogue_mode LD $mem_requested_mode, A LD $mem_current_mode, A LD A, $mem_bunny_direction RES 3, A LD $mem_bunny_direction, A LD A, $00 LD $mem_bunny_animation, A LD A, $mem_map_loading_flags SET 5, A RES 3, A LD $mem_map_loading_flags, A RET .Script: .LEARN_ATTACK $04 .END Fimsh_Attack_Box_Action: LD (HL), $00 .START_SCRIPT =Fimsh_Dialogue_Script LD A, $enum_dungeon_dialogue_mode LD $mem_requested_mode, A LD $mem_current_mode, A LD A, $mem_bunny_direction RES 3, A LD $mem_bunny_direction, A LD A, $00 LD $mem_bunny_animation, A LD A, $mem_map_loading_flags SET 5, A RES 3, A LD $mem_map_loading_flags, A RET Restore_EP_Action: LD A, $mem_bunny_mana ADD $05 DAA JR NC, =.Set_mana LD A, $99 .Set_mana: LD $mem_bunny_mana, A PUSH BC LD A, $mem_bunny_x LD B, A LD A, $mem_bunny_y LD C, A LD A, $01 PUSH DE LD E, $20 LD D, $00 CALL =Try_Launch_Animation POP DE POP BC .SET_SOUND_EFFECT =_sound_effect_Heal LD (HL), $00 RET Display_Object: LD A, $mem_display_flag BIT 5, A RET NZ LD HL, $mem_object_list LD A, $mem_object_load_counter INC A AND $0f LD $mem_object_load_counter, A SLA A SLA A SLA A AND $f8 LD L, A LD A, (HL) CP $FF RET Z LD C, A CP $00 JR NZ, =.skip_remove_object_after_display LD (HL), $FF .skip_remove_object_after_display: INC HL LD A, (HL+) ADD $80 LD D, A LD A, $mem_viewport_x SUB $83 CP D RET NC ADD $0e CP D RET C LD A, D SUB $80 LD D, A LD A, (HL+) ADD $80 LD B, A LD A, $mem_viewport_y SUB $83 CP B RET NC ADD $0e CP B RET C LD A, B SUB $80 LD B, A LD A, C CP $00 JR Z, =Display_Objects.Nothing LD A, D CALL =Construct_Tile_Address LD A, C LD (DE), A INC E INC C LD A, C LD (DE), A INC C LD A, E XOR $21 LD E, A LD A, C LD (DE), A INC C INC E LD A, C LD (DE), A RET Display_Objects.Nothing: LD A, D LD $mem_additional_loading_block_x, A LD A, B LD $mem_additional_loading_block_y, A LD A, $mem_display_flag SET 6, A LD $mem_display_flag, A RET Load_Objects: CALL =Display_Object CALL =Display_Object CALL =Display_Object CALL =Display_Object CALL =Display_Object CALL =Display_Object CALL =Display_Object CALL =Display_Object CALL =Display_Object CALL =Display_Object CALL =Display_Object CALL =Display_Object CALL =Display_Object CALL =Display_Object CALL =Display_Object CALL =Display_Object RET Object_Interactions_Check: LD A, $mem_moving_animation_step CP $00 JR NZ, =.End LD A, $mem_map_loading_flags BIT 1, A JR Z, =.End RES 1, A LD $mem_map_loading_flags, A LD HL, $mem_object_list LD A, $mem_bunny_x LD C, A LD A, $mem_bunny_y LD B, A .loop: LD A, (HL+) CP $00 JR Z, =.next CP $FF JR Z, =.next LD A, (HL+) CP C JR NZ, =.next LD A, (HL+) CP B JR NZ, =.next LD E, (HL) PUSH BC ; So we have HL set to the object pointer LD A, L AND $f8 LD L, A LD BC, =Object_Interaction_Jump_table LD A, E .JUMP_TABLE POP BC .next: LD A, L AND $f8 ADD $08 LD L, A CP $80 JR NZ, =.loop .End: RET