Display_Entities: LD HL, $mem_entities_list CALL =Display_Entity CALL =Display_Entity CALL =Display_Entity CALL =Display_Entity CALL =Display_Entity CALL =Display_Entity CALL =Display_Entity CALL =Display_Entity CALL =Display_Entity CALL =Display_Entity CALL =Display_Entity CALL =Display_Entity CALL =Display_Entity CALL =Display_Entity CALL =Display_Entity CALL =Display_Entity LD BC, $00a0 LD HL, $mem_oam_buffer LD A, $mem_oam_buffer_low ADD L LD L, A LD A, $mem_oam_buffer_low XOR $ff INC A ADD C LD C, A CALL =bzero RET Display_Entity: LD A, (HL+) LD E, A CP $00 JP Z, =.skip LD A, (HL+) ADD $80 LD D, A LD A, $mem_viewport_x LD B, A SUB $82 CP D JP NC, =.skip ADD $0e CP D JP C, =.skip LD A, D SUB $80 SUB B AND $0f SWAP A LD B, A LD A, (HL+) ADD $80 LD D, A LD A, $mem_viewport_y LD C, A SUB $82 CP D JP NC, =.skip ADD $0d CP D JP C, =.skip LD A, D SUB $80 SUB C AND $0f SWAP A ADD $06 LD C, A .Check_Window_Overlap: LD A, $mem_display_flag BIT 3, A JR Z, =.Check_Window_Overlap.end LD A, $6f CP B JR NC, =.Check_Window_Overlap.end LD A, $55 CP C JP C, =.skip .Check_Window_Overlap.end: .ADD_MOVING_ANIMATION_OFFSET LD A, (HL+) BIT 3, A LD D, A .Moving_Animation: JR Z, =.Moving_Animation.end LD A, $mem_moving_animation_step .ADD_A_TO_DIRECTION_BC .Moving_Animation.end: .Blinking_Animation: LD A, L AND $f0 OR $07 LD L, A BIT 3, (HL) JR Z, =.Blinking_Animation.end LD A, $mem_blinking_animation_counter AND $02 CP $02 JP Z, =.skip .Blinking_Animation.end: .Action_Animation: LD A, L AND $f0 OR $0a LD L, A LD A, $01 CP (HL) JR NZ, =.Action_Animation.end LD A, $mem_moving_animation_step CP $04 JR C, =.Action_Animation.Step1 CP $0c JR C, =.Action_Animation.Step2 JR =.Action_Animation.end .Action_Animation.Step1: SLA A SLA A JR =.Action_Animation.Apply .Action_Animation.Step2: SUB $04 SLA A XOR $ff INC A ADD $10 .Action_Animation.Apply: .ADD_A_TO_DIRECTION_BC .Action_Animation.end: .SuperJump_Animation: LD A, L AND $f0 OR $0a LD L, A LD A, $03 CP (HL) JR NZ, =.SuperJump_Animation.end LD A, $mem_moving_animation_step CP $00 JR Z, =.SuperJump_Animation.end .ADD_A_TO_DIRECTION_BC LD A, $mem_moving_animation_step SUB $08 .ABS SLA A CPL INC A ADD $10 CPL INC A ADD C LD C, A .SuperJump_Animation.end: .Shaking_Animation: LD A, L AND $f0 OR $0a LD L, A LD A, $04 CP (HL) JR NZ, =.Shaking_Animation.end LD A, $mem_moving_animation_step CP $00 JR Z, =.Shaking_Animation.end LD A, $mem_moving_animation_step SRA A AND $03 BIT 1, A RES 1, A JR NZ, =.Shaking_Animation.skip_invert CPL INC A .Shaking_Animation.skip_invert: ADD B LD B, A .Shaking_Animation.end: .Moving_2x: LD A, L AND $f0 OR $0a LD L, A LD A, $05 CP (HL) JR NZ, =.Moving_2x.end LD A, $mem_moving_animation_step CP $00 JR Z, =.Moving_2x.end SLA A AND $0f PUSH BC LD B, A LD A, $mem_moving_animation_step CPL INC A ADD B POP BC .ADD_A_TO_DIRECTION_BC LD A, $mem_moving_animation_step SUB $08 .ABS SUB $04 .ABS CPL INC A ADD $04 CPL INC A ADD C LD C, A .Moving_2x.end: .Moving_Hops: BIT 3, D JR Z, =.Moving_Hops.end LD A, L AND $f0 OR $0a LD L, A LD A, (HL) LD A, $00 CP (HL) JR NZ, =.Moving_Hops.end LD A, $mem_moving_animation_step SUB $08 .ABS SUB $04 .ABS CPL INC A ADD $04 CPL INC A ADD C LD C, A .Moving_Hops.end: LD A, D SWAP A AND $07 CP $enum_direction_left JR Z, =.Left_Direction_sprite CP $enum_direction_right JR Z, =.Right_Direction_sprite CP $enum_direction_up JR Z, =.Up_Direction_sprite JP =.Down_Direction_sprite .Left_Direction_sprite: CALL =Flags_From_Animation ; Uses and changes HL LD D, A JP =.Write_OBJ .Right_Direction_sprite: LD A, $02 ADD E LD E, A CALL =Flags_From_Animation ; Uses and changes HL OR $20 LD D, A JP =.Write_OBJ .Up_Direction_sprite: LD A, $04 ADD E LD E, A CALL =Flags_From_Animation ; Uses and changes HL LD D, A JP =.Write_OBJ .Down_Direction_sprite: LD A, $08 ADD E LD E, A CALL =Flags_From_Animation ; Uses and changes HL LD D, A JP =.Write_OBJ .Write_OBJ: PUSH HL ; First OBJ (left) LD HL, $mem_oam_buffer LD A, $mem_oam_buffer_low LD L, A LD A, C LD (HL+), A LD A, B LD (HL+), A LD A, E INC A LD (HL+), A LD A, D LD (HL+), A ; Second OBJ LD A, B ADD $08 LD B, A LD A, C LD (HL+), A LD A, B LD (HL+), A LD A, E XOR $02 INC A LD (HL+), A LD A, D LD (HL+), A LD A, L LD $mem_oam_buffer_low, A POP HL .skip: LD A, L AND $f0 ADD $10 LD L, A RET Flags_From_Animation: ; Expect entity in HL (offset doesn't matter) + breaks D (but result in A) LD A, L AND $f0 OR $0a LD L, A LD A, $02 CP (HL) LD D, $00 JR NZ, =Flags_From_Animation.Shadow_Palette LD D, $40 Flags_From_Animation.Shadow_Palette: LD A, L AND $f0 OR $07 LD L, A BIT 1, (HL) LD A, D RET Z OR $10 RET