use_item:
	ld	a,(current_alpha)
	ld	hl,item_attribute_table+4
	ld	b,0
	ld	c,a
	add	hl,bc
	ld	a,(hl)
	inc	hl
	ld	h,(hl)
	ld	l,a
	jp	(hl)

use_bow:
	bit	f_have_bow,(iy+flags+1)
	ret	z
	ld	hl,fire_arrow_com
	ld	a,2
	jp	set_p_com
	
use_shield:
	bit	f_have_shield,(iy+flags+1)
	ret	z

	set	f_shield,(iy+flags)
	set	f_change_gen,(iy+flags)
	ret
	
leave_grotto_com:
	.dw	stationary_jump
	.db	1
	.dw	blacken_screen
	.db	15
	.dw	no_action	
	
kill_player_commands_light:
	ld	a,(gen_buf+1)
	or	a
	call	nz,use_shield
kill_player_commands:
kill_p_com:
kill_pcom:
	ld	a,(game_flags)
	and	%01010110
;f_input		= 0	;1 - disable full input
;f_change_gen		= 1	;1 - disable direction change
;f_pushing		= 2	;1 - character is pushing
;f_push = f_pushing
;f_invunerable		= 3	;1 - player is impervious to enemy attack
;f_shield		= 4	;1 - player shield is out
;f_shielding = f_shield
;f_uninterruptable	= 5	;1 - may not interrupt this player command
;f_noint	= f_uninterruptable
;not used		= 6	;
;f_input2		= 7	;1 - disable sword and shield
	ld	(game_flags),a
	xor	a
	ld	(p_com_ctr),a
	ld	(damage_array),a
	ld	a,18
	ld	(push_ctr),a
	ret

player_dead:
	call	kill_player_commands
	call	kill_screen_commands
	set	f_input,(iy+flags)
	set	f_invunerable,(iy+flags)
	PCALL(clear_overhead)
	PCALL(clear_animate)
	PCALL(clear_objects)
	call	fuck_map
	ld	hl,die_player
	ld	a,5
	call	set_p_com_skip
stop_player_flip:
	ld	hl,player_flip_counter
	ld	(hl),255
	ret

begin_die:
	PCALL(clear_all)
	ld	a,10
	ld	(overhead_array),a		;how far dizzie are from player's head
	ld	hl,0
	ld	(buf80+61),hl
	ld	(m_com_ctr),hl
	ld	hl,dead_shrink
	ld	a,5
	call	set_m_com
	jr	stop_player_flip
	
die_player:
	.dw	player_opposite_double
	.db	1
	.dw	begin_die
	.db	8
	.dw	no_anim
	.db	1
	.dw	triple_gira
	.db	10
	.dw	no_anim
	.db	1
	.dw	triple_gira
	.db	8
	.dw	no_anim
	.db	1
	.dw	triple_gira
	.db	4
	.dw	no_anim
	.db	1
	.dw	stop_player_flip
	.db	(5*8)+1
	.dw	spin_player
	.db	1
	.dw	plop_dead1
	.db	11
	.dw	player_move_jump1
	.db	49
	.dw	no_anim
	.db	1
	.dw	display_death_text


	
dead_shrink:
	.dw	shrink_screen
	.db	255
	.dw	maintain_narrow_dizzy
maintain_narrow_dizzy:
	call	m_draw_player_dizzy
	jp	maintain_narrow
	
display_death_text:
	call	fuck_map
	ld	a,5
	ld	(gen_state),a
	call	kill_player_commands
	ld	hl,death_text
	ld	de,pop_exit
	jp	code_text
	
link_dead_anim:
	.dw	link_dead_gfx
	.db	0
	.dw	link_dead_anim-1
	
plop_dead1:	
 	ld	hl,player_xc
 	inc	(hl)
	ld	hl,p_anim_ctr
	ld	(hl),255
	inc	hl
	ld	(hl),link_dead_anim & $00FF
	inc	hl
	ld	(hl),(link_dead_anim & $FF00) >> 8
	ld	a,d_right
	ld	(gen_state),a
	ret
	
m_draw_player_dizzy:
	ld	hl,m_com_ctr
	ld	a,(hl)
	ld	bc,0
	and	%00011000		;a = counts sets of 8 (x8)
	sub	%00001000
	jr	nc,_nsmdpd
	ld	a,(hl)
	sub	%00001000
	ld	(hl),a
	jr	m_draw_player_dizzy
_nsmdpd:
	jr	z,_zmdpd
	ld	d,a
	rla \ rla \ rla		;by 64
	sub	d		;a * 56
	ld	c,a
_zmdpd:
	ld	hl,dizzy_gfx
	add	hl,bc
	ex	de,hl
	ld	a,(player_yc)
	ld	bc,(overhead_array)
	sub	c
	ld	l,a
	ld	a,(player_xc)
	ld	b,14
	call	prepare_draw
	PCALL(std_sprite)		;WATCH OUT THIS IS QUESTIONABLE
	ld	a,(p_anim_ctr)
	or	a
	ret	z
	ld	hl,overhead_array
	ld	a,(hl)
	cp	50
	ret	nc
	inc	(hl)
	ret
		
spin_player:
	set	f_invunerable,(iy+flags)
	set	f_noint,(iy+flags)
	ld	a,(p_com_ctr)
	dec	a
	and	%00000111
	ret	nz
triple_gira:
	call	gira_gen_state
	call	gira_gen_state
	jp	gira_gen_state
	
fuck_map:
	ld	hl,map_data
	ld	b,0
f_map_loop:
	ld	(hl),76		;white tile
	inc	hl
	djnz	f_map_loop

	xor	a
fill_map_variable:
fill_map_var:
	ld	hl,terrain_buffer
	ld	de,terrain_buffer+1
	ld	(hl),a
	ld	bc,1535
	ldir
	ret

no_anim:
	ld	hl,player_anim_counter
	ld	(hl),2
	inc	hl
	ld	(hl),0
	ret
		
shrink_player:
	ld	a,(p_com_ctr)
	cp	7			;first run?
	jr	nz,assure_pimages
	PCALL(load_reg_link)
assure_pimages:
	ld	a,(gen_buf)
	call	player_seek	

	xor	a
	ld	bc,(gen_buf-1)
	ld	c,a
	rr	b	;x128
	rr	c

	ld	a,4
	ld	(gen_state),a

	ld	hl,player_images
	add	hl,bc
	push	hl
	ld	de,invert_buffer+1
	ld	a,(invert_buffer)
	dec	a
	dec	a
	add	a,a
	ld	b,0
	ld	c,a
	ldir
	pop	hl
	ld	c,32
	add	hl,bc
	ld	c,a
	ldir
	ld	de,invert_buffer+1
	ld	bc,(screen_xc)
	ld	a,(player_yc)
	sub	b
	ld	l,a
	ld	a,(invert_buffer)
	dec	a
	dec	a
	ld	b,a
	ld	(invert_buffer),a
	ld	a,16
	sub	b
	add	a,l
	ld	l,a
	ld	a,(player_xc)
	sub	c
	jp	standard_sprite

; draw_current:
; 	ld	a,(invert_buffer)
; 	ld	b,a
; 	ld	a,(player_yc)
; 	ld	l,a
; 	ld	a,16
; 	sub	b
; 	add	a,l
; 	ld	l,a
; 	ld	a,(player_xc)
; 	ld	de,invert_buffer+1
; 	call	prepare_draw
; 	jp	standard_sprite
	
replace_player:
	ld	hl,player_flip_counter
	ld	(hl),10
	;ld	a,(trudir)		;we want opposite of the direction he actually fell
	jp	player_opposite

idle_player:
	ld	hl,player_flip_counter
	inc	(hl)
	ret	
	
show_blinking:
	ld	a,(gen_buf)
	sub	4
	cpl
	ld	(gen_state),a

	xor	a
	ld	(m_com_ctr),a
	
	ld	hl,player_health
	dec	(hl)
	jp	z,player_dead

	ld	a,30
	ld	hl,player_blink
	jp	set_p_com
	
flip_gen_buf:
	ld	hl,gen_buf
	ld	a,(hl)
	sub	4
	cpl
	ld	(hl),a
	ret
	
fall_com:
	.dw	no_action
	.db	7
	.dw	shrink_player
	.db	1
	.dw	flip_gen_buf
	.db	15
	.dw	no_action
	.db	1
	.dw	narrow_screen
	.db	20
	.dw	no_action
	.db	16
	.dw	replace_player
	.db	1
	.dw	show_blinking

fall_enter_com:
	.dw	no_action
	.db	7
	.dw	shrink_player
	.db	7
	.dw	no_action
	.db	1
	.dw	darken_screen		;darken for short load time
	.db	8
	.dw	no_action
	.db	1
	.dw	page2_enter
	.db	8
fall_end_com:
	.dw	stationary_jump
	.db	1
	.dw	kill_player_commands

grotto_exit_com:
exit_grotto_com:
	.dw	no_action
	.db	16
	.dw	stationary_jump
 	.db	1
 	.dw	darken_screen
 	.db	10
 	.dw	no_action
	.db	1
	.dw	page2_grotto_exit
	.db	16
	.dw	player_move_jump1
	.db	1
	.dw	kill_player_commands

player_move_jump1:
	PCALL(player_move_jump)
	ret	
		
page2_enter:
	PCALL(erc)
	ret
	
stationary_jump:
	ld	a,3
	call	already_up
	xor	a
	ld	(gen_state),a
	PCALL(player_move_jump)
	ld	a,(p_com_ctr)
	cp	9
	ret	nz
	ld	a,1
	ld	(p_com_ctr),a
	ret
	
	
page2_grotto_exit:
	PCALL(erc)
	xor	a
	ld	(gen_state),a
	PCALL(clear_misc)
	ret
	
darken_screen:
blacken_screen:
	PCALL(clear_all)
	ld	a,4
	ld	(gen_state),a
	ld	a,$FF
	jp	fill_map_variable		


player_knock_back:
player_hard_knock:
	.dw	player_opposite_double
	.db	40
player_blink:
	.dw	player_flash
	.db	1
	.dw	kill_player_commands


player_light_knock:
	.dw	player_opposite_spark
	.db	1
	.dw	kill_player_commands_light


display_over_head:
	.dw	player_show_object
	.db	45
show_rupee_com:
	.dw	show_rupee_number
	.db	1
	.dw	kill_misc_commands


display_key_over_head:
	.dw	player_show_object
	.db	60
	.dw	show_key_number
	.db	1
	.dw	kill_misc_commands

display_heart_over_head:
disp_oh_com:
	.dw	player_show_object
	.db	1
	.dw	kill_misc_commands
	.db	1
	.dw	kill_player_commands

player_show_object:
player_show_obj:
	ld	hl,buf80+80
	xor	a
	or	(hl)
	jr	z,simple_extract
	call	extract_on_count
	ex	de,hl
finish_show_draw:
	ld	bc,(screen_xc)
	ld	a,(player_y)
	sub	15
	sub	b
	ld	l,a
	ld	a,(player_x)
	sub	c
	ld	b,15
	jp	standard_sprite

simple_extract:
	ld	de,(buf80+81)
	jr	finish_show_draw	

player_flash:
	res	f_input,(iy+flags)
	ld	a,(p_com_ctr)
	bit	2,a
	ret	z
	pop	bc
	jp	skip_player_draw

player_opposite_spark:
	ld	a,(damage_array+da_y)
	ld	l,a
	ld	a,(damage_array+da_x)
	ld	de,spark_gfx
	ld	b,11
	call	prepare_draw
	call	standard_sprite
	call	player_opposite
	jp	lock_end
	
player_opposite:
	ld	a,10
	ld	(player_anim_counter),a
	ld	a,(gen_buf+1)
	or	a
	call	nz,use_shield
no_shielding:
	ld	a,(gen_buf)
player_opposite_skip:
	or	a
	jp	z,already_down
	cp	1
	jp	z,already_left
	cp	2
	jp	z,already_right
	cp	3
	jp	z,already_up
	ret

player_opposite_double:
	ld	a,(gen_buf)
	call	player_object_check
	call	z,player_opposite
	call	silent_update
	ld	a,(gen_buf)
	call	player_object_check
	call	z,player_opposite
	call	silent_update
	ld	a,(gen_buf)
	call	player_object_check
	call	z,player_opposite
lock_end:
	bit	f_lockscreen,(iy+flags+1)
	ret	z
	ld	a,4
	ld	(draw_mode),a
	ret
	

push_block_buf80_60:
	;call	reset_enemies		;this is a good idea, but interferes with traps

	ld	hl,game_flags
	set	f_input2,(hl)
	res	f_input,(hl)
	set	f_invunerable,(hl)

	ld	a,(p_com_ctr)
	cp	16
	jr	nc,delay_move
	
	dec	a
	jr	z,last_push
	inc	a
more_check:
	rra
	ret	c			;first push even.  Last push odd.

finish_push:
	ld	ix,(buf80+61)
	ld	hl,damage_array
	ld	(hl),1			;alive
	inc	hl
	ld	a,(ix+object_x)
	ld	(hl),a
	ld	a,(ix+object_w)
	inc	hl
	ld	(hl),a
	ld	a,(ix+object_y)
	inc	hl
	ld	(hl),a
	ld	a,(ix+object_h)
	inc	hl
	ld	(hl),a

	ld	a,(buf80+60)
	inc	hl
	ld	(hl),a
	inc	hl
	ld	(hl),1
	or	a
	jr	z,block_down
	dec	a
	jr	z,block_left
	dec	a
	jr	z,block_right
	PCALL(enemy_skip_up)
	ret
block_down:
	PCALL(enemy_skip_down)
	ret
block_left:
	PCALL(enemy_skip_left)
	ret
block_right:
	PCALL(enemy_skip_right)
	ret
	
delay_move:
	set	f_input,(hl)
	set	f_pushing,(hl)
	ld	hl,player_flip_counter
	inc	(hl)

	cp	18
	jr	nc,more_check
	res	f_pushing,(iy+flags)
	jr	more_check

last_push:
	ld	ix,(buf80+61)
	ld	hl,0
	ld	(buf80+61),hl
	
	ld	hl,block_dest_table
	ld	a,(ix+object_ID)
	sub	kPush_object1
	
	add	a,a
	add	a,a	;x4

	add	a,l
	ld	l,a
	adc	a,h
	sub	l
	ld	h,a
	ld	a,(ix+object_x)
	cp	(hl)
	ret	nz
	ld	a,(ix+object_y)
	inc	hl
	cp	(hl)
	ret	nz

	inc	hl
	ld	a,(hl)
	inc	hl
	ld	h,(hl)
	ld	l,a
	PCALL(load_script)
	jp	run_script		;run block's code
	

block_dest_table:
	.db	128,128
	.dw	graveyard_push
	
	.db	48,48
	.dw	p1_open_locked
	
	.db	0,0
	.dw	no_action


push_block_buf80_cycle:
	.dw	push_block_buf80_60
	.db	1
	.dw	kill_player_commands

ready_scroll:
	ld	hl,(p_com_ptr)
	inc	hl
	inc	hl
	inc	hl
	ld	(p_com_ptr),hl
	ld	a,(invert_buffer)
	ld	(p_com_ctr),a
	ret

revert_screen:
	ld	hl,(player_xc)
	call	set_all_coords
	jp	great_update

set_m_com:
set_mcom:
set_misc_com:
	ld	(m_com_ctr),a
	ld	(m_com_ptr),hl
	ret


show_key_number:
	ld	a,12			;character 12 = key
	ld	c,96-16
	call	draw_small_number

	ld	a,(keys)
	jr	show_small_number

show_rupee_number:
	ld	a,11			;character 11 = rupee
	ld	c,96-16
	call	draw_small_number


	ld	a,(rupees)

show_small_number:			;will take a character and a y position
	push	af
	and	%11110000
	rra \ rra \ rra \ rra

	ld	c,96-10
	call	draw_small_number
	pop	af
	
	and	%00001111


	ld	c,96-5
;c - x-position
draw_small_number:
	ld	b,64-8
;b - y-position
;c - x-position
draw_small_nskip:
	push	bc
	add	a,a ;x2
	add	a,a ;x4
	add	a,a ;x8
	add	a,a ;x16

	ld	d,0
	ld	e,a
	ld	hl,rupee_numbers+15
	add	hl,de

	ld	de,invert_buffer+16+15
	ld	b,8
copy_number_loop1:
	ld	b,8
	ld	c,$FF
	call	fill_tbuffer
	inc	c
	ld	b,8
	call	fill_tbuffer
	
	inc	de
	pop	bc
	ld	l,b
	ld	a,c
	ld	b,8
	jp	standard_sprite

;converts an 8x8 sprite	to 16x8 
;c filler byte
;b height
fill_tbuffer:
	ld	a,c
	ld	(de),a
	dec	de
	ld	a,(hl)
	dec	hl
	ld	(de),a
	dec	de
	djnz	fill_tbuffer
	ret

narrow_screen:
	ld	hl,(buf80+61)
	xor	a
	ld	de,24*4
	sbc	hl,de
	
	ld	a,5
	ld	(misc_com_ctr),a
	ld	hl,screen_narrow_loop-2
	ld	(misc_com_ptr),hl
	ret	nz
	ld	a,45
	ld	(misc_com_ctr),a
	inc	hl
	inc	hl
	inc	hl
	ld	(misc_com_ptr),hl
	ret

	;.db	4
	.dw	shrink_screen
screen_narrow_loop:
	.db	40
maintain_narrow_com:
	.dw	maintain_narrow
	.db	3
widen_screen_com:
	.dw	widen_screen
	.db	1
	.dw	kill_screen_commands

	.dw	shrink_screen
quick_narrow_commands:
	.db	10
	.dw	maintain_narrow

	.db	1
	.dw	widen_screen
	.db	1
	.dw	kill_screen_commands

maintain_then_widen:
	.dw	maintain_narrow
	.db	16
	.dw	widen_screen
	.db	1
	.dw	kill_screen_commands	

delay_widen:
	call	delay_m_com
	jr	maintain_narrow

widen_screen:
	ld	hl,(buf80+61)
	ld	a,h
	or	l
	ret	z			;make sure shrinking widening is necessary
	ld	de,-24			;shrink by 2 lines
	add	hl,de
	ld	(buf80+61),hl
	jr	maintain_narrow	
		
shrink_screen:
	ld	hl,(buf80+61)
	ld	de,24
	add	hl,de
	ld	(buf80+61),hl
	
maintain_narrow:
	ld	hl,player_flip_counter
	inc	(hl)
	ld	bc,(buf80+61)
	ld	a,b
	or	c
	jp	z,check_text_narrow	;if there's nothing to maintain, bail.
	
	dec	bc
	push	bc
	ld	hl,sprite_buffer
	ld	de,sprite_buffer+1
	ld	(hl),$FF
	ldir
	pop	bc

	push	bc
	ld	hl,sprite_buffer+768
	ld	de,sprite_buffer+768+1
	ld	(hl),$00
	ldir
	pop	bc
	bit	f_text,(iy+flags)
	jr	nz,text_artifacts
	
	push	bc
	ld	hl,sprite_buffer+767
	ld	de,sprite_buffer+766
	ld	(hl),$FF
	lddr
	pop	bc
	ld	hl,sprite_buffer+768+767
	ld	de,sprite_buffer+768+766
	ld	(hl),$00
	lddr
	ret

check_text_narrow:
	bit	f_text,(iy+flags)
	ret	z
	
text_artifacts:
	call	draw_text_box
	jp	restore_text

update_screen_focus_com:
 	.dw 	update_screen_focus_double
	.db	1
	.dw	kill_player_commands

update_screen_focus_double:
	call	update_screen_focus
	ld	a,(p_com_ctr)
	dec	a
	ret	z
	ld	(p_com_ctr),a
	jp	update_screen_focus	
	
update_screen_focus:
focus_screen_update:
	;call	res_enemies		;resets things sometimes it shouldn't (falling blocks)
	xor	a
	ld	(invert_buffer),a

	ld	hl,player_flip_counter
	inc	(hl)
	ld	a,4
	ld	(draw_mode),a
update_screen_focus2:
	ld	hl,(dst)
	bit	7,h
	jp	z,point_higher
point_lower:
	ld	bc,(add_dl)
	add	hl,bc
	ld	de,inc_xl
	jr	start_guide
point_higher:
	ld	bc,(add_dh)
	add	hl,bc
	ld	de,inc_xh
start_guide:
	ld	(dst),hl
	ex	de,hl
	push	hl
	ld	de,point_lower_y
	push	de
	ld	a,(hl)
	cp	1
	jp	z,silent_right
	or	a
	jr	z,point_lower_y-1
	jp	silent_left
	pop	de
point_lower_y:
	pop	hl
	inc	hl
	ld	a,(hl)
	cp	1
	jp	z,silent_down
	or	a
	ret	z
	call	silent_up
	jr	default_focus_done

start_anew:
	ld	a,(p_com_ctr)
	dec	a
	ld	(p_com_ctr),a
	jr	update_screen_focus2


default_focus_done:
	ld	hl,invert_buffer
	xor	a
	or	(hl)
	ret	nz
	dec	a
	ld	(hl),a

	ld	hl,screen_xc
	ld	a,(x2)
	sub	(hl)
	inc	hl
	jr	nc,dx_posext
	neg
dx_posext:
	cp	65
	jr	nc,start_anew

	ld	a,(y2)
	sub	(hl)
	jr	nc,dy_posext
	neg
dy_posext:
	cp	40
	ret	c
	jr	start_anew

silent_update:
	bit	f_lockscreen,(iy+flags+1)
	ret	nz
	ld	a,(draw_mode)
	ld	b,a
	ld	a,4
	ld	(draw_mode),a
	ld	a,b
	or	a
	jp	z,silent_down+4
	dec	a
	jp	z,silent_left+4
	dec	a
	jp	z,silent_right+4
	dec	a
	jp	z,silent_up+4
	ret
	
silent_left:
	ld	hl,screen_xc
	dec	(hl)
	ld	a,(screen_xc)		;occasionally silent_left+4 is called
	ld	(screen_xc_e),a	
; 	ld	hl,screen_xc_e
; 	xor	a
; 	or	(hl)
; 	jr	z,no_s_left
; 	dec	a
; 	ld	(hl),a
; no_s_left:
	ld	de,vid+15
	ld	hl,16
	exx
	ld	hl,vid
	ld	b,96
	call	shift_right_block

	ld	hl,shift_h
	inc	(hl)
	ld	a,(hl)
	sub	16
	ret	nz

	ld	(hl),a
	ld	hl,(map)
	dec	hl
	ld	(map),hl
	ld	de,vid
	ld	bc,0
	jp	update_column

silent_right:
	ld	hl,screen_xc
	inc	(hl)
	ld	a,(screen_xc)
	ld	(screen_xc_e),a

	ld	de,vid+(16*95)
	ld	hl,-16
	exx
	ld	hl,vid+(16*96)-1
	ld	b,96
	call	shift_left_block

	ld	hl,shift_h
	dec	(hl)
	ld	a,(hl)
	sub	-16
	ret	nz
	
	ld	(hl),a
	ld	hl,(map)
	inc	hl
	ld	(map),hl
	ld	de,vid+14
	ld	bc,7*mem_width
	jp	update_column

silent_down:
	ld	hl,screen_yc
	inc	(hl)
	ld	a,(screen_yc)
	ld	(screen_yc_e),a
	
	ld	hl,vid
	ld	de,swap
	ld	bc,16
	ldir

	ld	de,vid
	ld	bc,16*95
	ldir

	ld	hl,swap
	ld	c,16
	ldir

	ld	hl,shift_v
	dec	(hl)
	ld	a,(hl)
	sub	-16
	ret	nz

	ld	(hl),a
	ld	de,map_width
	ld	hl,(map)
	add	hl,de
	ld	(map),hl
	ld	hl,onvid+(16*64)-2
	exx
	ld	bc,map_width*5
	jp	update_row	

silent_up:
	ld	hl,screen_yc
	dec	(hl)
	ld	a,(screen_yc)
	ld	(screen_yc_e),a

	ld	hl,vid+(96*16)-1
	ld	de,swap+15
	ld	bc,16
	lddr

	ld	de,vid+(96*16)-1
	ld	bc,16*95
	lddr

	ld	hl,swap+15
	ld	c,16
	lddr

	ld	hl,shift_v
	inc	(hl)
	ld	a,(hl)
	sub	16
	ret	nz

	ld	(hl),a
	
	ld	de,-map_width
	ld	hl,(map)
	add	hl,de
	ld	(map),hl
	ld	hl,vid
	exx
	ld	b,a
	ld	c,a
	jp	update_row

kill_screen_commands:
kill_misc_commands:
kill_misc_com:				;resets wide screen
	ld	hl,00
	ld	(buf80+61),hl
kill_m_com:				;light version
	xor	a
	ld	(misc_com_ctr),a
no_action:
	ret

fire_arrow_com:
	.dw	fire_arrow
	.db	7			;5 and 6 (one is ran first frame) of each frame
	.dw	poise_frame_1
	.db	1
	.dw	create_arrow_damage
	.db	9
	.dw	update_arrow
	.db	1
	.dw	fix_gen
;until_collide:
	.db	110		;bulk of arrow movement
	.dw	update_arrow
	.db	1
	.dw	destroy_arrow

fire_arrow:
	set	f_input,(iy+flags)
	jp	poise_frame_1
	
destroy_pshot:
destroy_arrow:
	call	kill_player_commands
	xor	a
	ld	(damage_array),a
	ld	hl,damage_array+da_x
	ld	e,(hl)			;1
	inc	hl \ inc hl
	ld	d,(hl)			;1
	ld	hl,object_array
	ld	b,object_amount
end_col_loop:
	xor	a
	or	(hl)
	jr	z,no_col
	push	bc
	push	hl	
	inc	hl			;object flags
	inc	hl			;object x
	ld	bc,(14*256)+14
	call	collision_check
	jr	nc,col_out
	pop	ix
	push	ix
	inc	ix
	inc	ix			;points to x
	bit	of_destroyable,(ix+object_flags)
	jr	z,col_out

	ld	a,(ix+object_ID)
	call	object_code_from_ref
col_out:
	pop	hl
	pop	bc
no_col:
	ld	a,object_width
	add	a,l
	ld	l,a
	adc	a,h
	sub	l
	ld	h,a
	djnz	end_col_loop
	ret

object_code_from_ref:
	add	a,a
	ld	hl,object_code_table
	ld	c,a
	ld	b,0
	add	hl,bc
	ld	e,(hl)
	inc	hl
	ld	d,(hl)
	bit	7,d
	jr	nz,_remote_script
	jp	page2_call_de	
_remote_script:
	ex	de,hl
	res	7,h
	PCALL(load_script)
	jp	run_script
	
fix_gen:
	res	f_input,(iy+flags)
	set	f_input2,(iy+flags)
	jp	update_arrow

create_arrow_damage:
	ld	b,0
	ld	a,(gen_state)
	ld	hl,damage_array
	ld	(damage_array+da_gen),a
	dec	a
	cp	2
	jr	c,up_down_type
right_left_type:
	ld	(hl),e_4dir | et_vert_arrow
	jr	type_done
up_down_type:
	ld	(hl),e_4dir | et_horz_arrow
type_done:
	inc	a
	add	a,a \ add a,a
	ld	c,a
	ex	de,hl
	ld	hl,arrow_table
	add	hl,bc
	inc	de \ ld a,(player_xc) \ add a,(hl) \ ld (de),a
	inc	de \ inc hl \ ldi	;width
	ld	a,(player_yc) \ add a,(hl) \ ld (de),a 	;y
	inc	de \ inc hl \ ldi	;height
	ex	de,hl
	inc	hl			;past gen
	ld	(hl),dt_arrow		;weapon type

	ld	ix,damage_array+da_x

	call	grid_offset_bc
	bit	7,(hl)
	jp	nz,kill_player_commands
	
	ld	a,(m_com_ctr)
	or	a
	ld	hl,show_rupee_com
	ld	a,20
	call	z,set_m_com
	
	ld	a,(rupees)
	or	a
	jp	z,kill_player_commands
	dec	a
	daa
	ld	(rupees),a
	
	ld	hl,adjust_arrow_table
	ld	a,(ix+enemy_gen)
	add	a,a	
	add	a,l		;4
	ld	l,a		;4
	adc	a,h		;4
	sub	l		;4
	ld	h,a		;4
	ld	a,(ix+enemy_x)
	sub	(hl)
	ld	(ix+enemy_x),a
	inc	hl
	ld	a,(ix+enemy_y)
	sub	(hl)
	ld	(ix+enemy_y),a
	
update_arrow:
	ld	a,(damage_array)
	or	a
	jp	z,destroy_pshot

	ld	ix,damage_array+da_x
	PCALL(do_collide_move)
	jp	nz,destroy_pshot

	ld	a,(ix+enemy_y)
	add	a,5
	ld	b,a			;offset from bottom of image for shadow
	PCALL(draw_eshad)

	ld	a,(damage_array+da_gen)
	add	a,a
	ld	b,0
	ld	c,a
	ld	hl,arrow_img_table
	add	hl,bc
	ld	e,(hl)
	inc	hl
	ld	d,(hl)
	ld	hl,damage_array+da_x
	call	prepare_for_draw
	
	bit	f_input,(iy+flags)
	ret	z
	jp	poise_frame_2


adjust_arrow_table:
	.db	0,14
	.db	0,0
	.db	14,0
	.db	0,0

;entry:
; # x
; # w
; # y
; # h
arrow_table:
	.db	4,5,16,14
	.db	-8,15,6,5
	.db	14,14,6,5
	.db	4,5,-11,14

arrow_img_table:
	.dw	arrow_down_gfx
	.dw	arrow_left_gfx
	.dw	arrow_right_gfx
	.dw	arrow_up_gfx