forked from KolibriOS/kolibrios
402 lines
9.9 KiB
PHP
402 lines
9.9 KiB
PHP
|
;---------------------------------------------------------------------
|
||
|
processing_npc_action:
|
||
|
; DEBUGF 1, "processing_npc_action\n"
|
||
|
cmp dl,ROUTE_UP
|
||
|
je npc_route_up
|
||
|
|
||
|
cmp dl,ROUTE_DOWN
|
||
|
je npc_route_down
|
||
|
|
||
|
cmp dl,ROUTE_LEFT
|
||
|
je npc_route_left
|
||
|
|
||
|
cmp dl,ROUTE_RIGHT
|
||
|
je npc_route_right
|
||
|
|
||
|
ret
|
||
|
;---------------------------------------------------------------------
|
||
|
npc_route_up:
|
||
|
; DEBUGF 1, "npc route_up\n"
|
||
|
cmp ebx,1 ; border of map?
|
||
|
jne @f
|
||
|
;--------------------------------------
|
||
|
.change_route:
|
||
|
; DEBUGF 1, "npc .change_route_up\n"
|
||
|
mov dx,0x0100+ROUTE_RIGHT
|
||
|
call get_random_binary
|
||
|
test al,al
|
||
|
jz .save_new_route
|
||
|
|
||
|
mov dx,0x0100+ROUTE_DOWN
|
||
|
;--------------------------------------
|
||
|
.save_new_route:
|
||
|
rol edx,16
|
||
|
mov [ecx],edx
|
||
|
ret
|
||
|
;--------------------------------------
|
||
|
@@:
|
||
|
; DEBUGF 1, "npc up @@:\n"
|
||
|
call npc_search_target_up_left
|
||
|
cmp [target_detected],1
|
||
|
jne @f
|
||
|
|
||
|
mov edi,TARGET_RANGE
|
||
|
sub edi,[target_action_cell_x]
|
||
|
|
||
|
mov ebx,TARGET_RANGE
|
||
|
sub ebx,[target_action_cell_y]
|
||
|
; DEBUGF 1, "%x npc_route_up target_up_left X: %x Y: %x\n",[current_cell_NPC]:1,edi,ebx
|
||
|
cmp edi,ebx
|
||
|
jb .continue
|
||
|
|
||
|
mov si,0x0100+ROUTE_LEFT
|
||
|
jmp save_route_to_current_position
|
||
|
;--------------------------------------
|
||
|
@@:
|
||
|
call npc_search_target_up_right
|
||
|
cmp [target_detected],1
|
||
|
jne @f
|
||
|
|
||
|
mov edi,[target_action_cell_x]
|
||
|
dec edi
|
||
|
|
||
|
mov ebx,TARGET_RANGE
|
||
|
sub ebx,[target_action_cell_y]
|
||
|
; DEBUGF 1, "%x npc_route_up target_up_right X: %x Y: %x\n",[current_cell_NPC]:1,edi,ebx
|
||
|
cmp edi,ebx
|
||
|
jb .continue
|
||
|
|
||
|
mov si,0x0100+ROUTE_RIGHT
|
||
|
jmp save_route_to_current_position
|
||
|
;--------------------------------------
|
||
|
@@:
|
||
|
.continue:
|
||
|
mov eax,[ecx-LEVEL_MAP_SIZE_X*4]
|
||
|
|
||
|
cmp ah,OBJECT_PROTAGONIST
|
||
|
je .continue_1
|
||
|
|
||
|
test ah,ah
|
||
|
jnz .change_route
|
||
|
;--------------------------------------
|
||
|
@@:
|
||
|
cmp al,BASE_WATER
|
||
|
jz .change_route
|
||
|
|
||
|
cmp al,BASE_LAVA
|
||
|
jz .change_route
|
||
|
;--------------------------------------
|
||
|
.continue_1:
|
||
|
; DEBUGF 1, "npc good route up\n"
|
||
|
mov si,0x0100+ROUTE_UP
|
||
|
mov edi,ecx
|
||
|
sub edi,LEVEL_MAP_SIZE_X*4
|
||
|
jmp save_new_and_clear_old_position
|
||
|
;---------------------------------------------------------------------
|
||
|
npc_route_down:
|
||
|
; DEBUGF 1, "npc route_down\n"
|
||
|
cmp ebx,LEVEL_MAP_SIZE_Y ; border of map?
|
||
|
jne @f
|
||
|
;--------------------------------------
|
||
|
.change_route:
|
||
|
; DEBUGF 1, "npc .change_route_down\n"
|
||
|
mov dx,0x0100+ROUTE_LEFT
|
||
|
call get_random_binary
|
||
|
test al,al
|
||
|
jz .save_new_route
|
||
|
|
||
|
mov dx,0x0100+ROUTE_UP
|
||
|
;--------------------------------------
|
||
|
.save_new_route:
|
||
|
rol edx,16
|
||
|
mov [ecx],edx
|
||
|
ret
|
||
|
;--------------------------------------
|
||
|
@@:
|
||
|
; DEBUGF 1, "npc down @@:\n"
|
||
|
call npc_search_target_down_left
|
||
|
cmp [target_detected],1
|
||
|
jne @f
|
||
|
|
||
|
mov edi,TARGET_RANGE
|
||
|
sub edi,[target_action_cell_x]
|
||
|
|
||
|
mov ebx,[target_action_cell_y]
|
||
|
dec ebx
|
||
|
; DEBUGF 1, "%x npc_route_down target_down_left X: %x Y: %x\n",[current_cell_NPC]:1,edi,ebx
|
||
|
cmp edi,ebx
|
||
|
jb .continue
|
||
|
|
||
|
mov si,0x0100+ROUTE_LEFT
|
||
|
jmp save_route_to_current_position
|
||
|
;--------------------------------------
|
||
|
@@:
|
||
|
call npc_search_target_down_right
|
||
|
cmp [target_detected],1
|
||
|
jne @f
|
||
|
|
||
|
mov edi,[target_action_cell_x]
|
||
|
dec edi
|
||
|
|
||
|
mov ebx,[target_action_cell_y]
|
||
|
; DEBUGF 1, "%x npc_route_down target_down_right X: %x Y: %x\n",[current_cell_NPC]:1,edi,ebx
|
||
|
cmp edi,ebx
|
||
|
jb .continue
|
||
|
|
||
|
mov si,0x0100+ROUTE_RIGHT
|
||
|
jmp save_route_to_current_position
|
||
|
;--------------------------------------
|
||
|
@@:
|
||
|
.continue:
|
||
|
mov eax,[ecx+LEVEL_MAP_SIZE_X*4]
|
||
|
|
||
|
cmp ah,OBJECT_PROTAGONIST
|
||
|
je .continue_1
|
||
|
|
||
|
test ah,ah
|
||
|
jnz .change_route
|
||
|
;--------------------------------------
|
||
|
@@:
|
||
|
cmp al,BASE_WATER
|
||
|
jz .change_route
|
||
|
|
||
|
cmp al,BASE_LAVA
|
||
|
jz .change_route
|
||
|
;--------------------------------------
|
||
|
.continue_1:
|
||
|
; DEBUGF 1, "npc good route down\n"
|
||
|
mov si,0x0100+ROUTE_DOWN
|
||
|
mov edi,ecx
|
||
|
add edi,LEVEL_MAP_SIZE_X*4
|
||
|
jmp save_new_and_clear_old_position
|
||
|
;---------------------------------------------------------------------
|
||
|
npc_route_left:
|
||
|
; DEBUGF 1, "npc route_left\n"
|
||
|
cmp eax,1 ; border of map?
|
||
|
jne @f
|
||
|
;--------------------------------------
|
||
|
.change_route:
|
||
|
; DEBUGF 1, "npc .change_route_left\n"
|
||
|
mov dx,0x0100+ROUTE_UP
|
||
|
call get_random_binary
|
||
|
test al,al
|
||
|
jz .save_new_route
|
||
|
|
||
|
mov dx,0x0100+ROUTE_RIGHT
|
||
|
;--------------------------------------
|
||
|
.save_new_route:
|
||
|
rol edx,16
|
||
|
mov [ecx],edx
|
||
|
ret
|
||
|
;--------------------------------------
|
||
|
@@:
|
||
|
; DEBUGF 1, "npc left @@:\n"
|
||
|
call npc_search_target_up_left
|
||
|
cmp [target_detected],1
|
||
|
jne @f
|
||
|
|
||
|
mov edi,TARGET_RANGE
|
||
|
sub edi,[target_action_cell_x]
|
||
|
|
||
|
mov ebx,TARGET_RANGE
|
||
|
sub ebx,[target_action_cell_y]
|
||
|
; DEBUGF 1, "%x npc_route_left target_up_left X: %x Y: %x\n",[current_cell_NPC]:1,edi,ebx
|
||
|
cmp edi,ebx
|
||
|
jae .continue
|
||
|
|
||
|
mov si,0x0100+ROUTE_UP
|
||
|
jmp save_route_to_current_position
|
||
|
;--------------------------------------
|
||
|
@@:
|
||
|
call npc_search_target_down_left
|
||
|
cmp [target_detected],1
|
||
|
jne @f
|
||
|
|
||
|
mov edi,TARGET_RANGE
|
||
|
sub edi,[target_action_cell_x]
|
||
|
|
||
|
mov ebx,[target_action_cell_y]
|
||
|
dec ebx
|
||
|
; DEBUGF 1, "%x npc_route_left target_down_left X: %x Y: %x\n",[current_cell_NPC]:1,edi,ebx
|
||
|
cmp edi,ebx
|
||
|
jae .continue
|
||
|
|
||
|
mov si,0x0100+ROUTE_DOWN
|
||
|
jmp save_route_to_current_position
|
||
|
;--------------------------------------
|
||
|
@@:
|
||
|
.continue:
|
||
|
mov eax,[ecx-4]
|
||
|
|
||
|
cmp ah,OBJECT_PROTAGONIST
|
||
|
je .continue_1
|
||
|
|
||
|
test ah,ah
|
||
|
jnz .change_route
|
||
|
;--------------------------------------
|
||
|
@@:
|
||
|
cmp al,BASE_WATER
|
||
|
jz .change_route
|
||
|
|
||
|
cmp al,BASE_LAVA
|
||
|
jz .change_route
|
||
|
;--------------------------------------
|
||
|
.continue_1:
|
||
|
; DEBUGF 1, "npc good route left\n"
|
||
|
mov si,0x0100+ROUTE_LEFT
|
||
|
mov edi,ecx
|
||
|
sub edi,4
|
||
|
jmp save_new_and_clear_old_position
|
||
|
;---------------------------------------------------------------------
|
||
|
npc_route_right:
|
||
|
; DEBUGF 1, "npc route_right\n"
|
||
|
cmp eax,LEVEL_MAP_SIZE_X ; border of map?
|
||
|
jne @f
|
||
|
;--------------------------------------
|
||
|
.change_route:
|
||
|
; DEBUGF 1, "npc .change_route_right\n"
|
||
|
mov dx,0x0100+ROUTE_DOWN
|
||
|
call get_random_binary
|
||
|
test al,al
|
||
|
jz .save_new_route
|
||
|
|
||
|
mov dx,0x0100+ROUTE_LEFT
|
||
|
;--------------------------------------
|
||
|
.save_new_route:
|
||
|
rol edx,16
|
||
|
mov [ecx],edx
|
||
|
ret
|
||
|
;--------------------------------------
|
||
|
@@:
|
||
|
; DEBUGF 1, "npc righ @@:\n"
|
||
|
call npc_search_target_up_right
|
||
|
cmp [target_detected],1
|
||
|
jne @f
|
||
|
|
||
|
mov edi,[target_action_cell_x]
|
||
|
dec edi
|
||
|
|
||
|
mov ebx,TARGET_RANGE
|
||
|
sub ebx,[target_action_cell_y]
|
||
|
; DEBUGF 1, "%x npc_route_right target_up_right X: %x Y: %x\n",[current_cell_NPC]:1,edi,ebx
|
||
|
cmp edi,ebx
|
||
|
jae .continue
|
||
|
|
||
|
mov si,0x0100+ROUTE_UP
|
||
|
jmp save_route_to_current_position
|
||
|
;--------------------------------------
|
||
|
@@:
|
||
|
call npc_search_target_down_right
|
||
|
cmp [target_detected],1
|
||
|
jne @f
|
||
|
|
||
|
mov edi,[target_action_cell_x]
|
||
|
dec edi
|
||
|
|
||
|
mov ebx,[target_action_cell_y]
|
||
|
dec ebx
|
||
|
; DEBUGF 1, "%x npc_route_right target_down_right X: %x Y: %x\n",[current_cell_NPC]:1,edi,ebx
|
||
|
cmp edi,ebx
|
||
|
jae .continue
|
||
|
|
||
|
mov si,0x0100+ROUTE_DOWN
|
||
|
jmp save_route_to_current_position
|
||
|
;--------------------------------------
|
||
|
@@:
|
||
|
.continue:
|
||
|
mov eax,[ecx+4]
|
||
|
|
||
|
cmp ah,OBJECT_PROTAGONIST
|
||
|
je .continue_1
|
||
|
|
||
|
test ah,ah
|
||
|
jnz .change_route
|
||
|
;--------------------------------------
|
||
|
@@:
|
||
|
cmp al,BASE_WATER
|
||
|
jz .change_route
|
||
|
|
||
|
cmp al,BASE_LAVA
|
||
|
jz .change_route
|
||
|
;--------------------------------------
|
||
|
.continue_1:
|
||
|
; DEBUGF 1, "npc good route righ\n"
|
||
|
mov si,0x0100+ROUTE_RIGHT
|
||
|
mov edi,ecx
|
||
|
add edi,4
|
||
|
jmp save_new_and_clear_old_position
|
||
|
;---------------------------------------------------------------------
|
||
|
npc_search_target_up_left:
|
||
|
; DEBUGF 1, "%x npc_search_target_up_left X: %x Y: %x\n",[current_cell_NPC]:1,[action_cell_x],[action_cell_y]
|
||
|
push ecx
|
||
|
sub ecx,TARGET_RANGE * 4 ; offset x
|
||
|
sub ecx,TARGET_RANGE * LEVEL_MAP_SIZE_X * 4 ; offset y
|
||
|
jmp npc_search_target
|
||
|
;---------------------------------------------------------------------
|
||
|
npc_search_target_up_right:
|
||
|
; DEBUGF 1, "%x npc_search_target_up_right X: %x Y: %x\n",[current_cell_NPC]:1,[action_cell_x],[action_cell_y]
|
||
|
push ecx
|
||
|
sub ecx,TARGET_RANGE * LEVEL_MAP_SIZE_X * 4 ; offset y
|
||
|
sub ecx,4 ; offset x
|
||
|
jmp npc_search_target
|
||
|
;---------------------------------------------------------------------
|
||
|
npc_search_target_down_left:
|
||
|
; DEBUGF 1, "%x npc_search_target_down_left X: %x Y: %x\n",[current_cell_NPC]:1,[action_cell_x],[action_cell_y]
|
||
|
push ecx
|
||
|
sub ecx,LEVEL_MAP_SIZE_X * 4 ; offset y
|
||
|
sub ecx,TARGET_RANGE * 4 ; offset x
|
||
|
jmp npc_search_target
|
||
|
;---------------------------------------------------------------------
|
||
|
npc_search_target_down_right:
|
||
|
; DEBUGF 1, "%x npc_search_target_down_right X: %x Y: %x\n",[current_cell_NPC]:1,[action_cell_x],[action_cell_y]
|
||
|
push ecx
|
||
|
sub ecx,LEVEL_MAP_SIZE_X * 4 ; offset y
|
||
|
sub ecx,4 ; offset x
|
||
|
;---------------------------------------------------------------------
|
||
|
npc_search_target:
|
||
|
push eax
|
||
|
mov [target_detected],0
|
||
|
mov ebx,TARGET_RANGE
|
||
|
;--------------------------------------
|
||
|
.y:
|
||
|
mov eax,TARGET_RANGE
|
||
|
; DEBUGF 1, "current cell next y\n"
|
||
|
;--------------------------------------
|
||
|
.x:
|
||
|
push eax ebx ecx
|
||
|
mov [target_action_cell_x],eax
|
||
|
mov [target_action_cell_y],ebx
|
||
|
shl eax,2
|
||
|
add ecx,eax
|
||
|
imul ebx,LEVEL_MAP_SIZE_X*4
|
||
|
add ecx,ebx
|
||
|
|
||
|
cmp ecx,plan_level
|
||
|
jb @f
|
||
|
|
||
|
cmp ecx,plan_level+LEVEL_MAP_SIZE_X*LEVEL_MAP_SIZE_Y*4-4
|
||
|
ja @f
|
||
|
|
||
|
mov eax,[ecx]
|
||
|
; DEBUGF 1, "current cell %x\n",eax
|
||
|
cmp ah,OBJECT_PROTAGONIST
|
||
|
jne @f
|
||
|
|
||
|
pop ecx ebx eax
|
||
|
mov [target_detected],1
|
||
|
; DEBUGF 1, "%x target_detected X: %x Y: %x\n",[current_cell_NPC]:1,[target_action_cell_x],[target_action_cell_y]
|
||
|
jmp .exit
|
||
|
;--------------------------------------
|
||
|
@@:
|
||
|
pop ecx ebx eax
|
||
|
|
||
|
dec eax
|
||
|
jnz .x
|
||
|
|
||
|
dec ebx
|
||
|
jnz .y
|
||
|
.exit:
|
||
|
pop eax ecx
|
||
|
ret
|
||
|
;---------------------------------------------------------------------
|