diff options
Diffstat (limited to 'engines/lure/diassembly/LURE.ASM')
-rw-r--r-- | engines/lure/diassembly/LURE.ASM | 2416 |
1 files changed, 1258 insertions, 1158 deletions
diff --git a/engines/lure/diassembly/LURE.ASM b/engines/lure/diassembly/LURE.ASM index 3cbcc416b0..0054928d28 100644 --- a/engines/lure/diassembly/LURE.ASM +++ b/engines/lure/diassembly/LURE.ASM @@ -140,9 +140,10 @@ ANIM_HOTSPOT_OFFSET equ 19h ANIM_HOTSPOT_ID equ 1Bh ANIM_LAYER1_SKIP equ 1Dh ANIM_VOICE_CHAR_ID equ 1Eh +ANIM_CHAR_RECT_Y equ 22h ANIM_VOICE_CTR equ 24h ANIM_DIRECTION equ 26h -ANIM_UNKNOWN1 equ 27h +ANIM_UNKNOWN1 equ 27h ANIM_START_COLOUR equ 28h ; Hotspot header record constants @@ -174,18 +175,34 @@ HS_PIXEL_OFFSET equ 21h HS_START_COLOUR equ 23h HS_SCRIPT_OFFSET equ 24h HS_MOVEMENT_OFFSET equ 24h +HS_STEP_CTR equ 26h +HS_FRAME_OFFSET equ 28h HS_FRAME_NUM equ 2Ah +HS_V2B equ 2Bh +HS_HOTSPOT_SCRIPT_ID equ 2Dh +HS_USE_HOTSPOT_ID equ 2Fh +HS_V33 equ 33h HS_TALK_X equ 35h HS_TALK_Y equ 36h HS_TALK_COUNTDOWN equ 37h HS_TALK_CHAR_ID equ 39h HS_RESPONSE_ID equ 3Ch -HS_UNKNOWN1 equ 44h +HS_V42 equ 42h +HS_V44 equ 44h +HS_HOTSPOT2_SCRIPT_ID equ 45h +HS_USE2_HOTSPOT_ID equ 47h +HS_V49 equ 49h +HS_V4A equ 4Ah +HS_V4C equ 4Ch +HS_V4D equ 4Dh +HS_V4E equ 4Eh HS_DIRECTION equ 50h HS_DEST_HOTSPOT equ 52h HS_DEST_X equ 54h HS_DEST_Y equ 56h -HS_MOMENT_SRC_OFFSET equ 5Ah +HS_V58 equ 58h +HS_MOVEMENT_SRC_OFFSET equ 5Ah +HS_V60 equ 60h HS_ACTION_OFFSET equ 61h HS_FIRST_ACTION_OFFSET equ 63h @@ -195,9 +212,18 @@ PIXEL_FLAGS equ 2 PIXEL_DATA_SEGMENT equ 3 PIXEL_DATA_SIZE equ 5 PIXEL_FRAME_SIZE equ 7 +PIXEL_MOVEREC_UP equ 9 +PIXEL_MOVEREC_DOWN equ 0Bh +PIXEL_MOVEREC_LEFT equ 0Dh +PIXEL_MOVEREC_RIGHT equ 0Fh +PIXEL_FRAMENUM_UP equ 11h +PIXEL_FRAMENUM_DOWN equ 12h +PIXEL_FRAMENUM_LEFT equ 13h +PIXEL_FRAMENUM_RIGHT equ 14h + PIXELFLAG_HAS_TABLE equ 4 -NOONE_HOTSPOT_ID equ 3E7h +NOONE_HOTSPOT_ID equ 3E7h PLAYER_HOTSPOT_ID equ 3E8h SKORL_HOTSPOT_ID equ 3EAh @@ -214,11 +240,15 @@ ROOMEXIT_DEST_ROOM equ 12 ; Room exit hotspot record constants REHS_RECORD_SIZE equ 11h -REHS_HOTSPOT_1 equ 0 -REHS_RESULT_1 equ 2 -REHS_HOTSPOT_2 equ 6 -REHS_HOTSPOT_2 equ 8 -REHS_EXIT_BLOCKED equ 12 +REHS_HOTSPOT1_ID equ 0 +REHS_HOTSPOT1_CURRENT_FRAME equ 2 +REHS_HOTSPOT1_DEST_FRAME equ 3 +REHS_HOTSPOT2_ID equ 6 +REHS_HOTSPOT2_CURRENT_FRAME equ 8 +REHS_HOTSPOT2_DEST_FRAME equ 9 +REHS_EXIT_BLOCKED equ 0Ch +REHS_HOTSPOT1_OFFSET equ 0Dh +REHS_HOTSPOT2_OFFSET equ 0Fh ; Room header record constants RH_ROOM_NUM equ 2 @@ -264,10 +294,16 @@ FACING_DOWN equ 1 FACING_LEFT equ 2 FACING_RIGHT equ 3 +FACING2_LEFT equ 1 +FACING2_RIGHT equ 2 +FACING2_DOWN equ 3 +FACING2_UP equ 4 + ; Movement record constants MOVEMENT_FRAME_NUM equ 0 MOVEMENT_X_CHANGE equ 2 MOVEMENT_Y_CHANGE equ 4 +MOVEMENT_REC_SIZE equ 6 ; Talk constants TALK_PRE_SEQUENCE equ 0 @@ -283,10 +319,16 @@ TALK_MAGIC_ID equ 424h TALK_DIALOG_WIDTH equ 128 ; Player actions used in player_tick_proc -PLAYER_ACTION_START_WALK equ 1 -PLAYER_ACTION_DISPATCH_ACTION equ 2 -PLAYER_ACTION_EXEC_SCRIPT equ 3 -PLAYER_ACTION_CONTINUE_WALK equ 5 +CURRENT_ACTION_RECORD_SIZE equ 5 +CURRENT_ACTION_SUPPORT_TABLE equ 1 +CURRENT_ACTION_ROOM_NUM equ 3 + +CHAR_ACTION_NONE equ 0 +CHAR_ACTION_START_WALK equ 1 +CHAR_ACTION_DISPATCH_ACTION equ 2 +CHAR_ACTION_EXEC_SCRIPT equ 3 +CHAR_ACTION_PROCESSING_PATH equ 4 +CHAR_ACTION_CONTINUE_WALK equ 5 ; The following equates show data references outside the range of the program. @@ -1407,9 +1449,9 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:0801 8E C0 mov es, ax 273F:0803 B1 03 mov cl,3 273F:0805 A1 11D8 mov ax, mouse_y2 -273F:0808 A3 0784 mov word ptr ds:[784h],ax ; (273F:0784=0BA07h) +273F:0808 A3 0784 mov saved_mouse_y, ax 273F:080B A1 11D6 mov ax, mouse_x2 -273F:080E A3 0782 mov word ptr ds:[782h],ax ; (273F:0782=0E1Eh) +273F:080E A3 0782 mov saved_mouse_x, ax 273F:0811 A1 076C mov ax, menu_items_proc 273F:0814 26: A3 3368 mov es:data_78e,ax ; (0874:3368=4758h) 273F:0818 A0 9835 mov al, num_inventory_items @@ -1468,25 +1510,25 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:08A1 33 C0 xor ax,ax ; Zero register 273F:08A3 AB stosw ; Store ax to es:[di] 273F:08A4 8E DD mov ds,bp -273F:08A6 C6 06 9834 01 mov byte ptr data_427,1 ; (273F:9834=0F9h) +273F:08A6 C6 06 9834 01 mov byte ptr data_1084,1 ; (273F:9834=0F9h) 273F:08AB A3 1924 mov hotspot_id, ax 273F:08AE úBE 6CEF mov si, offset player_hotspot_rec 273F:08B1 89 44 52 mov [si+HS_DEST_HOTSPOT],ax 273F:08B4 88 44 2A mov [si+2Ah],al 273F:08B7 88 44 FF mov [si-1],al 273F:08BA 8B DE mov bx,si -273F:08BC 03 5C 61 add bx,[si+61h] -273F:08BF 83 C3 63 add bx,63h -273F:08C2 89 44 42 mov [si+42h],ax -273F:08C5 88 44 44 mov [si+44h],al -273F:08C8 C6 07 02 mov byte ptr [bx],2 +273F:08BC 03 5C 61 add bx, [si+HS_ACTION_OFFSET] +273F:08BF 83 C3 63 add bx, HS_FIRST_ACTION_OFFSET +273F:08C2 89 44 42 mov [si+HS_V42], ax +273F:08C5 88 44 44 mov [si+HS_V44], al +273F:08C8 C6 07 02 mov byte ptr [bx], CHAR_ACTION_DISPATCH_ACTION 273F:08CB C7 47 01 65F3 mov word ptr [bx+1], offset player_action_support_record -273F:08D0 loc_65: ; xref 273F:0897 +273F:08D0 loc_65: 273F:08D0 8E DD mov ds,bp -273F:08D2 8B 0E 0782 mov cx,word ptr ds:[782h] ; (273F:0782=0E1Eh) +273F:08D2 8B 0E 0782 mov cx, saved_mouse_x 273F:08D6 89 0E 11D6 mov mouse_x2, cx 273F:08DA 89 0E 11D1 mov mouse_x, cx -273F:08DE 8B 16 0784 mov dx,word ptr ds:[784h] ; (273F:0784=0BA07h) +273F:08DE 8B 16 0784 mov dx, saved_mouse_y 273F:08E2 89 16 11D8 mov mouse_y2, dx 273F:08E6 89 16 11D3 mov mouse_y, dx 273F:08EA D1 E1 shl cx,1 ; Shift w/zeros fill @@ -2465,13 +2507,13 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:0EB1 57 push di 273F:0EB2 53 push bx 273F:0EB3 8B 5C 24 mov bx, [si+HS_MOVEMENT_OFFSET] -273F:0EB6 8B 44 26 mov ax, [si+26h] -273F:0EB9 3B 47 02 cmp ax, [bx+2] ; Match found? -273F:0EBC 75 23 jne loc_130 -273F:0EBE 83 C3 04 add bx, 4 ; Move to next entry -273F:0EC1 C7 44 26 0000 mov word ptr [si+26h], 0 -273F:0EC6 C7 44 28 0000 mov word ptr [si+28h], 0 -273F:0ECB 89 5C 24 mov [si+HS_MOVEMENT_OFFSET], bx +273F:0EB6 8B 44 26 mov ax, [si+HS_STEP_CTR] +273F:0EB9 3B 47 02 cmp ax, [bx+2] ; Any steps remaining? +273F:0EBC 75 23 jne loc_130 ; Yes, so carry on +273F:0EBE 83 C3 04 add bx, 4 ; Move to next movement rec +273F:0EC1 C7 44 26 0000 mov word ptr [si+HS_STEP_CTR], 0 ; Reset counter +273F:0EC6 C7 44 28 0000 mov word ptr [si+HS_FRAME_OFFSET], 0 ; Reset offset +273F:0ECB 89 5C 24 mov [si+HS_MOVEMENT_OFFSET], bx ; Update movement ptr 273F:0ECE 83 3F FF cmp word ptr [bx], 0FFFFh ; At end of list? 273F:0ED1 75 07 jne loc_129 273F:0ED3 B8 0001 mov ax,1 ; Yes - so return @@ -2481,22 +2523,22 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:0ED9 C3 retn 273F:0EDA loc_129: 273F:0EDA 57 push di -273F:0EDB 8B 3F mov di, [bx] ; Get entry offset -273F:0EDD 33 DB xor bx,bx ; Zero register +273F:0EDB 8B 3F mov di, [bx] ; Get ptr to direction frames +273F:0EDD 33 DB xor bx, bx 273F:0EDF EB 14 jmp short loc_131 273F:0EE1 loc_130: 273F:0EE1 57 push di -273F:0EE2 8B 3F mov di, [bx] -273F:0EE4 8B 5C 28 mov bx, [si+28h] -273F:0EE7 03 FB add di,bx -273F:0EE9 83 3D FF cmp word ptr [di], 0FFFFh -273F:0EEC 75 07 jne loc_131 ; Jump if not equal +273F:0EE2 8B 3F mov di, [bx] ; Get ptr to direction frames +273F:0EE4 8B 5C 28 mov bx, [si+HS_FRAME_OFFSET]; Get offset for movement frame +273F:0EE7 03 FB add di, bx ; Add on offset +273F:0EE9 83 3D FF cmp word ptr [di], 0FFFFh ; End of movement set for direciton? +273F:0EEC 75 07 jne loc_131 ; Jump if not 273F:0EEE 2B FB sub di, bx 273F:0EF0 33 DB xor bx, bx -273F:0EF2 89 5C 28 mov [si+28h], bx +273F:0EF2 89 5C 28 mov [si+HS_FRAME_OFFSET], bx ; Reset to start of movement data ; di=movement record 5bb8h, si=6cefh 273F:0EF5 loc_131: -273F:0EF5 8B 05 mov ax, [diMOVEMENT_FRAME_NUM] ; Get new frame number +273F:0EF5 8B 05 mov ax, [di+MOVEMENT_FRAME_NUM] ; Get new frame number 273F:0EF7 57 push di 273F:0EF8 8B 7C 21 mov di, [si+HS_PIXEL_OFFSET] 273F:0EFB 8B 4D 07 mov cx, [di+PIXEL_FRAME_SIZE] @@ -2535,8 +2577,8 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:0F48 89 45 02 mov [di+ANIM_Y], ax 273F:0F4B 8B 05 mov ax, [di+ANIM_X] 273F:0F4D loc_137: -273F:0F4D 83 44 28 06 add word ptr [si+28h], 6 -273F:0F51 83 44 26 01 add word ptr [si+26h], 1 +273F:0F4D 83 44 28 06 add word ptr [si+HS_FRAME_OFFSET], MOVEMENT_REC_SIZE +273F:0F51 83 44 26 01 add word ptr [si+HS_STEP_CTR], 1 273F:0F55 33 C0 xor ax, ax 273F:0F57 5B pop bx 273F:0F58 5F pop di @@ -2733,7 +2775,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 seq_set_blocking_hotspot_script proc near 273F:10A3 81 FB 03E8 cmp bx, PLAYER_HOTSPOT_ID 273F:10A7 75 05 jne loc_154 ; Jump if not equal -273F:10A9 C6 06 9834 02 mov byte ptr data_427,2 ; (273F:9834=0F9h) +273F:10A9 C6 06 9834 02 mov byte ptr data_1084,2 ; (273F:9834=0F9h) 273F:10AE loc_154: ; xref 273F:10A7 273F:10AE E8 FC37 call get_room_resource_pointer 273F:10B1 D1 E1 shl cx,1 ; Shift w/zeros fill @@ -2744,10 +2786,10 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:10BE 8B DE mov bx, si 273F:10C0 03 5C 61 add bx, [si+HS_ACTION_OFFSET] 273F:10C3 83 C3 63 add bx, HS_FIRST_ACTION_OFFSET -273F:10C6 C6 07 03 mov byte ptr [bx], PLAYER_ACTION_EXEC_SCRIPT +273F:10C6 C6 07 03 mov byte ptr [bx], CHAR_ACTION_EXEC_SCRIPT 273F:10C9 8B 7C 0B mov di, [si+HS_ANIM_OFFSET] 273F:10CC C6 44 49 01 mov byte ptr [si+49h], 1 -273F:10D0 E9 605B jmp loc_1413 ; (712E) +273F:10D0 E9 605B jmp pathfind_flag_covered_cells seq_set_blocking_hotspot_script endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß @@ -2805,80 +2847,77 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 ; Called from: 273F:4FBF, 5E61, 60E7 ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ -273F:110B sub_40 proc near + character_find_impinging_chars proc near 273F:110B 56 push si 273F:110C 53 push bx 273F:110D 8B 55 0E mov dx, [di+ANIM_ROOM_NUM] 273F:1110 úBE B14E mov si, offset animation_table 273F:1113 B9 002D mov cx, NUM_ANIMATION_SLOTS -273F:1116 úBB 10C0 mov bx, offset data_616 -273F:1119 C7 06 10BE 0000 mov data_615, 0 -273F:111F 8B 05 mov ax, [di] -273F:1121 A3 10E6 mov word ptr ds:[10E6h],ax ; (273F:10E6=0C329h) -273F:1124 03 45 13 add ax,[di+13h] -273F:1127 A3 10E8 mov word ptr ds:[10E8h],ax ; (273F:10E8=4EBFh) -273F:112A 8B 45 02 mov ax,[di+2] -273F:112D 03 45 15 add ax,[di+15h] +273F:1116 úBB 10C0 mov bx, offset impinging_char_list +273F:1119 C7 06 10BE 0000 mov num_impinging_chars, 0 +273F:111F 8B 05 mov ax, [di+ANIM_X] +273F:1121 A3 10E6 mov char_rect_left, ax +273F:1124 03 45 13 add ax, [di+ANIM_WIDTH_COPY] +273F:1127 A3 10E8 mov char_rect_right, ax +273F:112A 8B 45 02 mov ax, [di+ANIM_Y] +273F:112D 03 45 15 add ax, [di+ANIM_HEIGHT_COPY] 273F:1130 50 push ax -273F:1131 2B 45 17 sub ax,[di+17h] -273F:1134 2B 45 22 sub ax,[di+22h] -273F:1137 A3 10EA mov word ptr ds:[10EAh],ax ; (273F:10EA=0B9B1h) +273F:1131 2B 45 17 sub ax, [di+ANIM_Y_CORRECTION] +273F:1134 2B 45 22 sub ax, [di+ANIM_CHAR_RECT_Y] +273F:1137 A3 10EA mov char_rect_top, ax 273F:113A 58 pop ax -273F:113B 03 45 22 add ax,[di+22h] -273F:113E A3 10EC mov word ptr ds:[10ECh],ax ; (273F:10EC=2Dh) - -273F:1141 locloop_160: ; xref 273F:119D -273F:1141 3B FE cmp di,si -273F:1143 74 55 je loc_161 ; Jump if equal -273F:1145 F6 44 0C FF test byte ptr [si+0Ch],0FFh -273F:1149 74 4F jz loc_161 ; Jump if zero -273F:114B 3B 54 0E cmp dx,[si+0Eh] -273F:114E 75 4A jne loc_161 ; Jump if not equal -273F:1150 8B 44 1B mov ax,[si+1Bh] -273F:1153 3D 0408 cmp ax,408h -273F:1156 73 42 jae loc_161 ; Jump if above or = -273F:1158 F6 44 1D FF test byte ptr [si+1Dh],0FFh -273F:115C 75 3C jnz loc_161 ; Jump if not zero -273F:115E 8B 44 19 mov ax,[si+19h] -273F:1161 3B 45 24 cmp ax,[di+24h] +273F:113B 03 45 22 add ax, [di+ANIM_CHAR_RECT_Y] +273F:113E A3 10EC mov char_rect_bottom, ax + +273F:1141 locloop_160: ; Loop through animations +273F:1141 3B FE cmp di, si ; Is it the char's animation? +273F:1143 74 55 je loc_161 ; Skip if yes +273F:1145 F6 44 0C FF test byte ptr [si+ANIM_LAYER], 0FFh +273F:1149 74 4F jz loc_161 ; If no layer, then skip +273F:114B 3B 54 0E cmp dx, [si+ANIM_ROOM_NUM] +273F:114E 75 4A jne loc_161 ; Skip if not in same room +273F:1150 8B 44 1B mov ax, [si+ANIM_HOTSPOT_ID] +273F:1153 3D 0408 cmp ax, 408h +273F:1156 73 42 jae loc_161 ; Skip if anim not a character +273F:1158 F6 44 1D FF test byte ptr [si+ANIM_LAYER1_SKIP], 0FFh +273F:115C 75 3C jnz loc_161 ; Skip if skip flag set +273F:115E 8B 44 19 mov ax, [si+ANIM_HOTSPOT_OFFSET] +273F:1161 3B 45 24 cmp ax, [di+ANIM_VOICE_CTR] 273F:1164 74 34 je loc_161 ; Jump if equal -273F:1166 8B 04 mov ax,[si] -273F:1168 3B 06 10E8 cmp ax,word ptr ds:[10E8h] ; (273F:10E8=4EBFh) +273F:1166 8B 04 mov ax, [si+ANIM_X] +273F:1168 3B 06 10E8 cmp ax, char_rect_right 273F:116C 73 2C jae loc_161 ; Jump if above or = -273F:116E 03 44 13 add ax,[si+13h] -273F:1171 3B 06 10E6 cmp ax,word ptr ds:[10E6h] ; (273F:10E6=0C329h) +273F:116E 03 44 13 add ax, [si+ANIM_WIDTH_COPY] +273F:1171 3B 06 10E6 cmp ax, char_rect_left 273F:1175 72 23 jb loc_161 ; Jump if below 273F:1177 74 21 jz loc_161 ; Jump if zero -273F:1179 8B 44 02 mov ax,[si+2] -273F:117C 03 44 15 add ax,[si+15h] -273F:117F 8B E8 mov bp,ax -273F:1181 03 44 22 add ax,[si+22h] -273F:1184 3B 06 10EA cmp ax,word ptr ds:[10EAh] ; (273F:10EA=0B9B1h) +273F:1179 8B 44 02 mov ax, [si+ANIM_Y] +273F:117C 03 44 15 add ax, [si+ANIM_HEIGHT_COPY] +273F:117F 8B E8 mov bp, ax +273F:1181 03 44 22 add ax, [si+ANIM_CHAR_RECT_Y] +273F:1184 3B 06 10EA cmp ax, char_rect_top 273F:1188 72 10 jb loc_161 ; Jump if below -273F:118A 8B C5 mov ax,bp -273F:118C 2B 44 17 sub ax,[si+17h] -273F:118F 2B 44 22 sub ax,[si+22h] -273F:1192 3B 06 10EC cmp ax,word ptr ds:[10ECh] ; (273F:10EC=2Dh) +273F:118A 8B C5 mov ax, bp +273F:118C 2B 44 17 sub ax, [si+ANIM_Y_CORRECTION] +273F:118F 2B 44 22 sub ax, [si+ANIM_CHAR_RECT_Y] +273F:1192 3B 06 10EC cmp ax, char_rect_bottom 273F:1196 74 0E je loc_162 ; Jump if equal 273F:1198 72 0C jc loc_162 ; Jump if carry Set -273F:119A loc_161: ; xref 273F:1143, 1149, 114E, 1156 - ; 115C, 1164, 116C, 1175 - ; 1177, 1188, 11B3 -273F:119A ú83 C6 29 add si,29h -273F:119D E2 A2 loop locloop_160 ; Loop if cx > 0 +273F:119A loc_161: +273F:119A ú83 C6 29 add si, ANIMATION_SLOT_SIZE +273F:119D E2 A2 loop locloop_160 -273F:119F C7 07 0000 mov word ptr [bx],0 +273F:119F C7 07 0000 mov word ptr [bx], 0 ; Flag end of list 273F:11A3 5B pop bx 273F:11A4 5E pop si 273F:11A5 C3 retn -273F:11A6 loc_162: ; xref 273F:1196, 1198 -273F:11A6 8B 44 1B mov ax,[si+1Bh] -273F:11A9 89 07 mov [bx],ax -273F:11AB 83 C3 02 add bx,2 -273F:11AE 83 06 10BE 01 add data_615, 1 +273F:11A6 loc_162: ; Animation is impinging char +273F:11A6 8B 44 1B mov ax, [si+ANIM_HOTSPOT_ID] +273F:11A9 89 07 mov [bx], ax ; Store character Id +273F:11AB 83 C3 02 add bx, 2 +273F:11AE 83 06 10BE 01 add num_impinging_chars, 1 273F:11B3 EB E5 jmp short loc_161 ; (119A) - sub_40 endp - + character_find_impinging_chars endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE @@ -2888,15 +2927,15 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:11B5 sub_41 proc near 273F:11B5 53 push bx -273F:11B6 úBB 10C0 mov bx, offset data_616 +273F:11B6 úBB 10C0 mov bx, offset impinging_char_list 273F:11B9 C7 06 10EE 0000 mov data_617, 0 273F:11BF loc_163: 273F:11BF ú8B 07 mov ax, [bx] ; Get character Id -273F:11C1 83 C3 02 add bx, 2 -273F:11C4 0B C0 or ax, ax ; Is it zero? -273F:11C6 75 05 jnz loc_164 ; Jump if not zero -273F:11C8 A1 10EE mov ax, data_617 +273F:11C1 83 C3 02 add bx, 2 ; Move to next entry +273F:11C4 0B C0 or ax, ax ; Is it the end of the list? +273F:11C6 75 05 jnz loc_164 ; Jump if not +273F:11C8 A1 10EE mov ax, data_617 ; Set return result 273F:11CB 5B pop bx 273F:11CC C3 retn 273F:11CD loc_164: @@ -2911,7 +2950,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:11DC 8A 1F mov bl, [bx] ; bl = char's current action 273F:11DE 5E pop si 273F:11DF 58 pop ax -273F:11E0 80 FB 03 cmp bl, PLAYER_ACTION_EXEC_SCRIPT ; Char in animation sequence? +273F:11E0 80 FB 03 cmp bl, CHAR_ACTION_EXEC_SCRIPT ; Char in animation sequence? 273F:11E3 74 12 je loc_166 ; Jump if yes 273F:11E5 BB B0AE mov bx, offset hotspot_action_list @@ -2930,8 +2969,8 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:11FB 83 C3 08 add bx, HOTSPOT_ACTION_SLOT_SIZE 273F:11FE E2 EE loop locloop_165 ; Loop remaining action list -; At this point we've found a character in the data_616 list that isn't currently -; blocked to execute a hotspot animation, and doesn't have a cross reference +; At this point we've found a character in the impinging_char_list list that isn't +; currently blocked to execute a hotspot animation, and doesn't have a cross reference ; against the calling character (such as the player) in the hotspot action list 273F:1200 8B D8 mov bx, ax @@ -2945,7 +2984,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:1211 F6 45 49 FF test byte ptr [di+49h], 0FFh ; ??? 273F:1215 75 09 jnz loc_168 ; Jump if not zero 273F:1217 5F pop di -273F:1218 E8 314B call sub_93 +273F:1218 E8 314B call character_update_movement 273F:121B 5B pop bx 273F:121C B8 0001 mov ax, 1 273F:121F C3 retn @@ -3117,7 +3156,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:1357 A1 1924 mov ax, hotspot_id 273F:135A 89 45 02 mov [di+2],ax 273F:135D C7 45 04 0000 mov word ptr [di+4], 0 -273F:1362 C6 07 02 mov byte ptr [bx], PLAYER_ACTION_DISPATCH_ACTION +273F:1362 C6 07 02 mov byte ptr [bx], CHAR_ACTION_DISPATCH_ACTION 273F:1365 E8 5C9D call menubar_clear_image 273F:1368 úBF 4B93 mov di, offset action_name ; Set up the "look at HOTSPOT" 273F:136B úBE 10B5 mov si, offset look_at_str ; string @@ -3158,14 +3197,14 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:13B8 E8 401F call sub_126 273F:13BB 81 E2 0FFF and dx,0FFFh 273F:13BF úBE 6CEF mov si, offset player_hotspot_rec -273F:13C2 8B DE mov bx,si -273F:13C4 03 5C 61 add bx,[si+61h] -273F:13C7 83 C3 63 add bx,63h +273F:13C2 8B DE mov bx, si +273F:13C4 03 5C 61 add bx, [si+HS_ACTION_OFFSET] +273F:13C7 83 C3 63 add bx, HS_FIRST_ACTION_OFFSET 273F:13CA 89 4C 54 mov [si+HS_DEST_X], cx 273F:13CD 89 54 56 mov [si+HS_DEST_Y], dx 273F:13D0 C7 44 52 FFFF mov [si+HS_DEST_HOTSPOT], 0FFFFh 273F:13D5 A1 1920 mov ax, room_exit_hotspot_id -273F:13D8 0B C0 or ax,ax +273F:13D8 0B C0 or ax, ax 273F:13DA 74 2A jz loc_192 273F:13DC 89 44 52 mov [si+HS_DEST_HOTSPOT], ax 273F:13DF EB 25 jmp short loc_192 ; (1406) @@ -3182,7 +3221,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:1400 A1 11DD mov ax, char_dest_y 273F:1403 89 44 56 mov [si+HS_DEST_Y], ax 273F:1406 loc_192: ; xref 273F:13DA, 13DF -273F:1406 C6 07 01 mov byte ptr [bx], PLAYER_ACTION_START_WALK +273F:1406 C6 07 01 mov byte ptr [bx], CHAR_ACTION_START_WALK 273F:1409 33 C0 xor ax,ax ; Zero register 273F:140B A2 9834 mov data_1084, al 273F:140E úBF 65F3 mov di, offset player_action_support_record @@ -4550,7 +4589,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:1C18 72 24 jb loc_437 ; No 273F:1C1A 3D 0009 cmp ax, CURSOR_TIME_UP_LEFT 273F:1C1D 73 1F jae loc_437 ; Too high -273F:1C1F 80 3E 6D52 01 cmp player_action_state, PLAYER_ACTION_START_WALK +273F:1C1F 80 3E 6D52 01 cmp player_action_state, CHAR_ACTION_START_WALK 273F:1C24 74 07 je loc_435 ; Jump if equal 273F:1C26 80 3E 6D52 04 cmp player_action_state, 4 273F:1C2B 75 11 jne loc_437 ; Jump if not equal @@ -9589,7 +9628,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 ; 9635 ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ -273F:3E34 sequence_execute proc near +273F:3E34 sequence_execute proc near 273F:3E34 ú57 push di 273F:3E35 56 push si 273F:3E36 55 push bp @@ -10096,28 +10135,28 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:41CE 83 C5 02 add bp, 2 273F:41D1 D1 E3 shl bx, 1 ; Shift w/zeros fill 273F:41D3 8B 87 3850 mov ax,word ptr ds:[actions2_proc_list][bx] -273F:41D7 FF E0 jmp ax +273F:41D7 FF E0 jmp ax action_dispatch endp 273F:41D9 loc_825: ; xref 273F:52BB -273F:41D9 ú8B DE mov bx,si -273F:41DB 03 5C 61 add bx,[si+61h] -273F:41DE 83 C3 63 add bx,63h -273F:41E1 F7 44 61 FFFF test word ptr [si+61h],0FFFFh +273F:41D9 ú8B DE mov bx, si +273F:41DB 03 5C 61 add bx, [si+HS_ACTION_OFFSET] +273F:41DE 83 C3 63 add bx, HS_FIRST_ACTION_OFFSET +273F:41E1 F7 44 61 FFFF test word ptr [si+HS_ACTION_OFFSET], 0FFFFh 273F:41E6 74 0F jz loc_826 ; Jump if zero -273F:41E8 83 6C 61 05 sub word ptr [si+61h],5 -273F:41EC 83 EB 05 sub bx,5 -273F:41EF C6 44 4D 00 mov byte ptr [si+4Dh],0 -273F:41F3 C6 07 02 mov byte ptr [bx],2 +273F:41E8 83 6C 61 05 sub word ptr [si+HS_ACTION_OFFSET], CURRENT_ACTION_RECORD_SIZE +273F:41EC 83 EB 05 sub bx, CURRENT_ACTION_RECORD_SIZE +273F:41EF C6 44 4D 00 mov byte ptr [si+4Dh], 0 +273F:41F3 C6 07 02 mov byte ptr [bx], CHAR_ACTION_DISPATCH_ACTION 273F:41F6 C3 retn 273F:41F7 loc_826: ; xref 273F:41E6 -273F:41F7 C6 07 00 mov byte ptr [bx],0 -273F:41FA 81 7D 1B 03E8 cmp word ptr [di+1Bh], PLAYER_HOTSPOT_ID +273F:41F7 C6 07 00 mov byte ptr [bx], CHAR_ACTION_NONE +273F:41FA 81 7D 1B 03E8 cmp word ptr [di+ANIM_HOTSPOT_ID], PLAYER_HOTSPOT_ID 273F:41FF 75 0B jne loc_ret_827 ; Jump if not equal assume ds:seg_code -273F:4201 C6 06 9834 00 mov byte ptr data_427,0 ; (273F:9834=0F9h) -273F:4206 C7 06 11E4 FFFF mov word ptr ds:[11E4h],0FFFFh ; (273F:11E4=0BB12h) +273F:4201 C6 06 9834 00 mov byte ptr data_1084, 0 +273F:4206 C7 06 11E4 FFFF mov hotspot_name_id2, 0FFFFh 273F:420C loc_ret_827: ; xref 273F:41FF 273F:420C C3 retn @@ -10129,77 +10168,72 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 ; Called from: 273F:51EE, 5FE0 ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ -; si = Hotspot offset -; bx = Pointer to decode data - [bx] == 0 -> end of list - - -273F:420D sub_90 proc near -273F:420D 8B 4C 21 mov cx,[si+HS_PIXEL_OFFSET] -273F:4210 8B 44 5A mov ax,[si+HS_MOMENT_SRC_OFFSET] -273F:4213 89 44 24 mov [si+24h],ax -273F:4216 C7 44 26 0000 mov word ptr [si+26h],0 -273F:421B C7 44 28 0000 mov word ptr [si+28h],0 + character_translate_movements proc near +273F:420D 8B 4C 21 mov cx, [si+HS_PIXEL_OFFSET] +273F:4210 8B 44 5A mov ax, [si+HS_MOVEMENT_SRC_OFFSET] +273F:4213 89 44 24 mov [si+HS_MOVEMENT_OFFSET], ax +273F:4216 C7 44 26 0000 mov word ptr [si+HS_STEP_CTR], 0 +273F:421B C7 44 28 0000 mov word ptr [si+HS_FRAME_OFFSET], 0 273F:4220 56 push si 273F:4221 57 push di 273F:4222 53 push bx -273F:4223 8B F8 mov di,ax -273F:4225 8B F1 mov si,cx -273F:4227 8B DA mov bx,dx -; si=animation record, di=loading position, bx=393ch src data -273F:4229 loc_828: ; xref 273F:4250, 425E, 426E, 427E -273F:4229 ú8B 0F mov cx,[bx] -273F:422B 0B C9 or cx,cx ; Zero ? -273F:422D 74 51 jz loc_832 ; Jump if zero -273F:422F 8B 57 02 mov dx,[bx+2] -273F:4232 83 C3 04 add bx,4 -273F:4235 83 FA 01 cmp dx,1 +273F:4223 8B F8 mov di, ax +273F:4225 8B F1 mov si, cx +273F:4227 8B DA mov bx, dx + +273F:4229 loc_828: +273F:4229 ú8B 0F mov cx, [bx] +273F:422B 0B C9 or cx, cx ; No more movements needed? +273F:422D 74 51 jz loc_832 ; Exit if yes +273F:422F 8B 57 02 mov dx, [bx+2] ; Get direction +273F:4232 83 C3 04 add bx, 4 ; Move ptr to next move rec +273F:4235 83 FA 01 cmp dx, FACING2_LEFT 273F:4238 74 26 je loc_830 ; Jump if equal -273F:423A 83 FA 02 cmp dx,2 +273F:423A 83 FA 02 cmp dx, FACING2_RIGHT 273F:423D 74 31 je loc_831 ; Jump if equal -273F:423F 83 FA 04 cmp dx,4 +273F:423F 83 FA 04 cmp dx, FACING2_UP 273F:4242 74 0E je loc_829 ; Jump if equal -273F:4244 83 C1 01 add cx,1 -273F:4247 D1 E9 shr cx,1 ; Shift w/zeros fill -273F:4249 8B 44 0B mov ax,[si+0Bh] -273F:424C AB stosw ; Store ax to es:[di] +273F:4244 83 C1 01 add cx, 1 +273F:4247 D1 E9 shr cx, 1 +273F:4249 8B 44 0B mov ax, [si+PIXEL_MOVEREC_DOWN] +273F:424C AB stosw ; Store movement records 273F:424D 8B C1 mov ax,cx -273F:424F AB stosw ; Store ax to es:[di] -273F:4250 EB D7 jmp short loc_828 ; (4229) -273F:4252 loc_829: ; xref 273F:4242 -273F:4252 83 C1 01 add cx,1 -273F:4255 D1 E9 shr cx,1 ; Shift w/zeros fill -273F:4257 8B 44 09 mov ax,[si+9] -273F:425A AB stosw ; Store ax to es:[di] +273F:424F AB stosw ; Store steps +273F:4250 EB D7 jmp short loc_828 +273F:4252 loc_829: +273F:4252 83 C1 01 add cx, 1 +273F:4255 D1 E9 shr cx, 1 +273F:4257 8B 44 09 mov ax, [si+PIXEL_MOVEREC_UP] +273F:425A AB stosw ; Store movement records 273F:425B 8B C1 mov ax,cx -273F:425D AB stosw ; Store ax to es:[di] -273F:425E EB C9 jmp short loc_828 ; (4229) -273F:4260 loc_830: ; xref 273F:4238 -273F:4260 83 C1 03 add cx,3 -273F:4263 D1 E9 shr cx,1 ; Shift w/zeros fill -273F:4265 D1 E9 shr cx,1 ; Shift w/zeros fill -273F:4267 8B 44 0D mov ax,[si+0Dh] -273F:426A AB stosw ; Store ax to es:[di] +273F:425D AB stosw ; Store steps +273F:425E EB C9 jmp short loc_828 +273F:4260 loc_830: +273F:4260 83 C1 03 add cx, 3 +273F:4263 D1 E9 shr cx, 1 +273F:4265 D1 E9 shr cx, 1 +273F:4267 8B 44 0D mov ax, [si+PIXEL_MOVEREC_LEFT] +273F:426A AB stosw ; Store movement records 273F:426B 8B C1 mov ax,cx -273F:426D AB stosw ; Store ax to es:[di] -273F:426E EB B9 jmp short loc_828 ; (4229) -273F:4270 loc_831: ; xref 273F:423D -273F:4270 83 C1 03 add cx,3 -273F:4273 D1 E9 shr cx,1 ; Shift w/zeros fill -273F:4275 D1 E9 shr cx,1 ; Shift w/zeros fill -273F:4277 8B 44 0F mov ax,[si+0Fh] -273F:427A AB stosw ; Store ax to es:[di] +273F:426D AB stosw ; Store steps +273F:426E EB B9 jmp short loc_828 +273F:4270 loc_831: +273F:4270 83 C1 03 add cx, 3 +273F:4273 D1 E9 shr cx, 1 +273F:4275 D1 E9 shr cx, 1 +273F:4277 8B 44 0F mov ax, [si+PIXEL_MOVEREC_RIGHT] +273F:427A AB stosw ; Store movement records 273F:427B 8B C1 mov ax,cx -273F:427D AB stosw ; Store ax to es:[di] -273F:427E EB A9 jmp short loc_828 ; (4229) -273F:4280 loc_832: ; xref 273F:422D +273F:427D AB stosw ; Store steps +273F:427E EB A9 jmp short loc_828 +273F:4280 loc_832: 273F:4280 B8 FFFF mov ax,0FFFFh -273F:4283 AB stosw ; Store ax to es:[di] +273F:4283 AB stosw ; Store end makrer 273F:4284 5B pop bx 273F:4285 5F pop di 273F:4286 5E pop si 273F:4287 C3 retn - sub_90 endp + character_translate_movements endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß @@ -10240,7 +10274,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:42C8 5E pop si 273F:42C9 E9 FB68 jmp sequence_execute 273F:42CC loc_835: ; xref 273F:42C6 -273F:42CC 8B 54 0A mov dx, [si+ROOMREC_EXIT_ROOM_NUM] ; Get new room # +273F:42CC 8B 54 0A mov dx, [si+ROOMREC_EXIT_ROOM_NUM] ; Get new room #/direction 273F:42CF 8B 4C 0C mov cx, [si+ROOMREC_EXIT_NEW_X] ; Get new X 273F:42D2 8B 5C 0E mov bx, [si+ROOMREC_EXIT_NEW_Y] ; Get new Y 273F:42D5 5E pop si @@ -10267,13 +10301,13 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:42E9 A1 BA17 mov ax, current_hotspot 273F:42EC 3D 03E8 cmp ax, PLAYER_HOTSPOT_ID ; Is character the player? 273F:42EF 75 2E jne loc_840 ; Jump if not -273F:42F1 F6 06 9834 FF test byte ptr data_427, 0FFh +273F:42F1 F6 06 9834 FF test byte ptr data_1084, 0FFh 273F:42F6 75 26 jnz loc_ret_839 ; Jump if not zero ; Room change code for the player 273F:42F8 úBE 6CEF mov si, offset player_hotspot_rec -273F:42FB 88 74 50 mov [si+50h],dh -273F:42FE C6 44 51 00 mov byte ptr [si+51h],0 +273F:42FB 88 74 50 mov [si+HS_DIRECTION], dh +273F:42FE C6 44 51 00 mov byte ptr [si+HS_DIRECTION+1], 0 273F:4302 32 F6 xor dh,dh ; Zero register 273F:4304 83 EB 30 sub bx,30h 273F:4307 89 16 982C mov new_room_number_2, dx @@ -10291,13 +10325,13 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:4326 53 push bx 273F:4327 51 push cx 273F:4328 52 push dx -273F:4329 E8 017D call sub_99 ; (44A9) +273F:4329 E8 017D call check_for_impinging_characters 273F:432C 5A pop dx 273F:432D 59 pop cx 273F:432E 5B pop bx 273F:432F 75 06 jnz loc_841 ; Jump if not zero 273F:4331 33 C0 xor ax,ax ; Zero register -273F:4333 E8 01F2 call sub_104 ; (4528) +273F:4333 E8 01F2 call increment_action_offset 273F:4336 C3 retn 273F:4337 loc_841: ; xref 273F:432F 273F:4337 83 E1 F8 and cx, 0FFF8h @@ -10323,36 +10357,29 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 ; ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ -273F:4363 loc_842: ; xref 273F:50E7, 5F24 -273F:4363 ú88 44 44 mov [si+HS_UNKNOWN1], al + character_update_movement_2: +273F:4363 ú88 44 44 mov [si+HS_V44], al - ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß - ; SUBROUTINE - ; - ; Called from: 273F:1218, 5033, 5063, 5081, 51AB, 58C7, 5EAA - ; 5EE3, 85A0, 8636, 8A31 - ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ -273F:4366 sub_93 proc near -273F:4366 loc_843: ; xref 273F:4F9C + character_update_movement proc near 273F:4366 ú53 push bx -273F:4367 8B DE mov bx,si -273F:4369 03 5C 61 add bx,[si+61h] -273F:436C 83 C3 63 add bx,63h -273F:436F 8A 07 mov al,[bx] +273F:4367 8B DE mov bx, si +273F:4369 03 5C 61 add bx, [si+HS_ACTION_OFFSET] +273F:436C 83 C3 63 add bx, HS_FIRST_ACTION_OFFSET +273F:436F 8A 07 mov al, [bx] 273F:4371 5B pop bx -273F:4372 3C 03 cmp al,3 -273F:4374 74 10 je loc_ret_845 ; Jump if equal -273F:4376 F6 44 49 FF test byte ptr [si+49h],0FFh +273F:4372 3C 03 cmp al, CHAR_ACTION_EXEC_SCRIPT +273F:4374 74 10 je loc_ret_845 ; Exit if running script +273F:4376 F6 44 49 FF test byte ptr [si+HS_V49], 0FFh 273F:437A 75 07 jnz loc_844 ; Jump if not zero -273F:437C C6 44 49 01 mov byte ptr [si+49h],1 -273F:4380 E8 2DAB call sub_178 ; (712E) +273F:437C C6 44 49 01 mov byte ptr [si+HS_V49], 1 +273F:4380 E8 2DAB call pathfind_flag_covered_cells 273F:4383 loc_844: ; xref 273F:437A -273F:4383 E9 032B jmp loc_890 ; (46B1) +273F:4383 E9 032B jmp character_reset_direction 273F:4386 loc_ret_845: ; xref 273F:4374, 438B 273F:4386 C3 retn - sub_93 endp + character_update_movement endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß @@ -10363,10 +10390,10 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ 273F:4387 sub_94 proc near -273F:4387 F6 44 49 FF test byte ptr [si+49h],0FFh +273F:4387 F6 44 49 FF test byte ptr [si+HS_V49], 0FFh 273F:438B 74 F9 jz loc_ret_845 ; Jump if zero -273F:438D C6 44 49 00 mov byte ptr [si+49h],0 -273F:4391 E9 2DAF jmp loc_1417 ; (7143) +273F:438D C6 44 49 00 mov byte ptr [si+HS_V49], 0 +273F:4391 E9 2DAF jmp pathfind_clear_covered_cells sub_94 endp @@ -10376,69 +10403,71 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 ; Called from: 273F:56D0, 712F, 7144 ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ -273F:4394 sub_95 proc near -273F:4394 8B 45 0E mov ax,[di+0Eh] -273F:4397 2D 0001 sub ax,1 -273F:439A 8B D8 mov bx,ax -273F:439C B1 04 mov cl,4 -273F:439E D3 E3 shl bx,cl ; Shift w/zeros fill -273F:43A0 2B D8 sub bx,ax -273F:43A2 B1 03 mov cl,3 -273F:43A4 D3 E3 shl bx,cl ; Shift w/zeros fill -273F:43A6 81 C3 984A add bx,984Ah -273F:43AA 8B 45 02 mov ax,[di+2] -273F:43AD 2D 0088 sub ax,88h -273F:43B0 03 45 15 add ax,[di+15h] -273F:43B3 2D 0004 sub ax,4 -273F:43B6 D3 E8 shr ax,cl ; Shift w/zeros fill -273F:43B8 3D 0018 cmp ax,18h -273F:43BB 73 50 jae loc_850 ; Jump if above or = -273F:43BD 8B D0 mov dx,ax -273F:43BF D1 E0 shl ax,1 ; Shift w/zeros fill -273F:43C1 D1 E0 shl ax,1 ; Shift w/zeros fill -273F:43C3 03 C2 add ax,dx -273F:43C5 03 D8 add bx,ax -273F:43C7 8B 05 mov ax,[di] -273F:43C9 D3 E8 shr ax,cl ; Shift w/zeros fill -273F:43CB 8B 55 13 mov dx,[di+13h] -273F:43CE D3 EA shr dx,cl ; Shift w/zeros fill -273F:43D0 75 03 jnz loc_846 ; Jump if not zero -273F:43D2 BA 0001 mov dx,1 -273F:43D5 loc_846: ; xref 273F:43D0 -273F:43D5 2D 0010 sub ax,10h + pathfind_get_cell proc near +273F:4394 8B 45 0E mov ax, [di+ANIM_ROOM_NUM] +273F:4397 2D 0001 sub ax, 1 ; ax=room # - 1 +273F:439A 8B D8 mov bx, ax +273F:439C B1 04 mov cl, 4 +273F:439E D3 E3 shl bx, cl ; bx=(R-1)*16 +273F:43A0 2B D8 sub bx, ax ; bx=(R-1)*15 +273F:43A2 B1 03 mov cl, 3 +273F:43A4 D3 E3 shl bx, cl ; bx=(R-1)*120 +273F:43A6 81 C3 984A add bx, offset pathfind_data2 +273F:43AA 8B 45 02 mov ax, [di+ANIM_Y] +273F:43AD 2D 0088 sub ax, 88h +273F:43B0 03 45 15 add ax, [di+ANIM_HEIGHT_COPY] +273F:43B3 2D 0004 sub ax, 4 +273F:43B6 D3 E8 shr ax, cl +273F:43B8 3D 0018 cmp ax, 18h ; (y+height-8-4) >= 200? +273F:43BB 73 50 jae loc_850 ; If yes then jump to exit +273F:43BD 8B D0 mov dx, ax ; ax=0->17 +273F:43BF D1 E0 shl ax, 1 +273F:43C1 D1 E0 shl ax, 1 ; ax=ax*4 +273F:43C3 03 C2 add ax, dx ; ax=ax*5 +273F:43C5 03 D8 add bx, ax ; Add bx onto offset + +; At this point bx = (Room# - 1) * 120 + (Y# * 5), where Y# is between 0 to 17 +273F:43C7 8B 05 mov ax, [di+ANIM_X] +273F:43C9 D3 E8 shr ax, cl +273F:43CB 8B 55 13 mov dx, [di+ANIM_WIDTH_COPY] +273F:43CE D3 EA shr dx, cl ; ax=left/8, dx=width/8 +273F:43D0 75 03 jnz loc_846 ; Is width < 8 pixels? +273F:43D2 BA 0001 mov dx, 1 ; Yes, default to 1 (8 pixels) +273F:43D5 loc_846: +273F:43D5 2D 0010 sub ax, 10h ; Is left <= 128 273F:43D8 73 0A jnc loc_847 ; Jump if carry=0 273F:43DA F7 D8 neg ax -273F:43DC 2B D0 sub dx,ax -273F:43DE 72 2D jc loc_850 ; Jump if carry Set -273F:43E0 74 2B jz loc_850 ; Jump if zero -273F:43E2 33 C0 xor ax,ax ; Zero register -273F:43E4 loc_847: ; xref 273F:43D8 -273F:43E4 8B E8 mov bp,ax -273F:43E6 03 EA add bp,dx -273F:43E8 83 ED 29 sub bp,29h -273F:43EB 72 09 jc loc_848 ; Jump if carry Set -273F:43ED 83 C5 01 add bp,1 -273F:43F0 2B D5 sub dx,bp +273F:43DC 2B D0 sub dx, ax +273F:43DE 72 2D jc loc_850 ; Exit if offscreen to left +273F:43E0 74 2B jz loc_850 +273F:43E2 33 C0 xor ax, ax ; Default to 0 +273F:43E4 loc_847: +273F:43E4 8B E8 mov bp, ax +273F:43E6 03 EA add bp, dx ; Add width +273F:43E8 83 ED 29 sub bp, 29h +273F:43EB 72 09 jc loc_848 ; Jump if on screen +273F:43ED 83 C5 01 add bp, 1 +273F:43F0 2B D5 sub dx, bp 273F:43F2 72 19 jc loc_850 ; Jump if carry Set 273F:43F4 74 17 jz loc_850 ; Jump if zero -273F:43F6 loc_848: ; xref 273F:43EB -273F:43F6 8B E8 mov bp,ax -273F:43F8 D3 E8 shr ax,cl ; Shift w/zeros fill -273F:43FA 03 D8 add bx,ax -273F:43FC 8B CD mov cx,bp -273F:43FE B8 0080 mov ax,80h -273F:4401 83 E1 07 and cx,7 -273F:4404 74 02 jz loc_849 ; Jump if zero -273F:4406 D3 E8 shr ax,cl ; Shift w/zeros fill +273F:43F6 loc_848: +273F:43F6 8B E8 mov bp, ax ; bp,ax=(left/8)-10h +273F:43F8 D3 E8 shr ax, cl +273F:43FA 03 D8 add bx, ax ; Increment X offset +273F:43FC 8B CD mov cx, bp +273F:43FE B8 0080 mov ax, 80h +273F:4401 83 E1 07 and cx, 7 +273F:4404 74 02 jz loc_849 +273F:4406 D3 E8 shr ax, cl ; Setup bit mask 273F:4408 loc_849: ; xref 273F:4404 -273F:4408 8B CA mov cx,dx -273F:440A 0B C9 or cx,cx ; Zero ? +273F:4408 8B CA mov cx, dx +273F:440A 0B C9 or cx, cx 273F:440C C3 retn 273F:440D loc_850: ; xref 273F:43BB, 43DE, 43E0, 43F2 ; 43F4 -273F:440D 33 C9 xor cx,cx ; Zero register +273F:440D 33 C9 xor cx, cx ; Zero register 273F:440F C3 retn - sub_95 endp + pathfind_get_cell endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß @@ -10557,33 +10586,33 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 ; Called from: 273F:4329, 603C ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ -273F:44A9 sub_99 proc near + check_for_impinging_characters proc near 273F:44A9 úBB B14E mov bx, offset animation_table 273F:44AC B9 002D mov cx, NUM_ANIMATION_SLOTS -273F:44AF 8B 55 0E mov dx,[di+0Eh] +273F:44AF 8B 55 0E mov dx, [di+ANIM_ROOM_NUM] 273F:44B2 locloop_858: ; xref 273F:44D0 -273F:44B2 F6 47 1D FF test byte ptr [bx+1Dh],0FFh +273F:44B2 F6 47 1D FF test byte ptr [bx+ANIM_LAYER1_SKIP], 0FFh 273F:44B6 74 15 jz loc_859 ; Jump if zero -273F:44B8 F6 47 0C FF test byte ptr [bx+0Ch],0FFh +273F:44B8 F6 47 0C FF test byte ptr [bx+ANIM_LAYER], 0FFh 273F:44BC 74 0F jz loc_859 ; Jump if zero -273F:44BE 3B 57 0E cmp dx,[bx+0Eh] +273F:44BE 3B 57 0E cmp dx, [bx+ANIM_ROOM_NUM] 273F:44C1 75 0A jne loc_859 ; Jump if not equal 273F:44C3 53 push bx -273F:44C4 8B 5F 19 mov bx,[bx+19h] -273F:44C7 E8 10D7 call skorl_caught_check +273F:44C4 8B 5F 19 mov bx, [bx+ANIM_HOTSPOT_OFFSET] +273F:44C7 E8 10D7 call characters_impinging_check 273F:44CA 5B pop bx 273F:44CB 75 09 jnz loc_860 ; Jump if not zero 273F:44CD loc_859: ; xref 273F:44B6, 44BC, 44C1 -273F:44CD 83 C3 29 add bx,29h +273F:44CD 83 C3 29 add bx, ANIMATION_SLOT_SIZE 273F:44D0 E2 E0 loop locloop_858 ; Loop if cx > 0 -273F:44D2 0D 0001 or ax,1 +273F:44D2 0D 0001 or ax, 1 273F:44D5 C3 retn 273F:44D6 loc_860: ; xref 273F:44CB -273F:44D6 33 C0 xor ax,ax ; Zero register +273F:44D6 33 C0 xor ax, ax 273F:44D8 C3 retn - sub_99 endp + check_for_impinging_characters endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß @@ -10593,40 +10622,40 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ char_face_up proc near -273F:44D9 ú8B 5C 21 mov bx,[si+HS_PIXEL_OFFSET] -273F:44DC 8A 47 11 mov al,[bx+11h] -273F:44DF C7 45 22 0004 mov word ptr [di+22h], 4 -273F:44E4 C6 45 26 00 mov byte ptr [di+26h], 0 +273F:44D9 ú8B 5C 21 mov bx, [si+HS_PIXEL_OFFSET] +273F:44DC 8A 47 11 mov al, [bx+PIXEL_FRAMENUM_UP] +273F:44DF C7 45 22 0004 mov word ptr [di+ANIM_CHAR_RECT_Y], 4 +273F:44E4 C6 45 26 00 mov byte ptr [di+ANIM_DIRECTION], FACING_UP 273F:44E8 EB 33 jmp short char_face_end char_face_up endp char_face_down proc near -273F:44EA ú8B 5C 21 mov bx,[si+HS_PIXEL_OFFSET] -273F:44ED 8A 47 12 mov al,[bx+12h] -273F:44F0 C7 45 22 0004 mov word ptr [di+22h],4 -273F:44F5 C6 45 26 01 mov byte ptr [di+26h],1 +273F:44EA ú8B 5C 21 mov bx, [si+HS_PIXEL_OFFSET] +273F:44ED 8A 47 12 mov al, [bx+PIXEL_FRAMENUM_DOWN] +273F:44F0 C7 45 22 0004 mov word ptr [di+ANIM_CHAR_RECT_Y], 4 +273F:44F5 C6 45 26 01 mov byte ptr [di+ANIM_DIRECTION], FACING_DOWN 273F:44F9 EB 22 jmp short char_face_end char_face_down endp char_face_left proc near -273F:44FB ú8B 5C 21 mov bx,[si+HS_PIXEL_OFFSET] -273F:44FE 8A 47 13 mov al,[bx+13h] -273F:4501 C7 45 22 0000 mov word ptr [di+22h],0 -273F:4506 C6 45 26 02 mov byte ptr [di+26h],2 +273F:44FB ú8B 5C 21 mov bx, [si+HS_PIXEL_OFFSET] +273F:44FE 8A 47 13 mov al, [bx+PIXEL_FRAMENUM_LEFT] +273F:4501 C7 45 22 0000 mov word ptr [di+ANIM_CHAR_RECT_Y], 0 +273F:4506 C6 45 26 02 mov byte ptr [di+ANIM_DIRECTION], FACING_LEFT 273F:450A EB 11 jmp short char_face_end char_face_left endp char_face_right proc near -273F:450C ú8B 5C 21 mov bx,[si+HS_PIXEL_OFFSET] -273F:450F 8A 47 14 mov al,[bx+14h] -273F:4512 C7 45 22 0000 mov word ptr [di+22h],0 -273F:4517 C6 45 26 03 mov byte ptr [di+26h],3 +273F:450C ú8B 5C 21 mov bx, [si+HS_PIXEL_OFFSET] +273F:450F 8A 47 14 mov al, [bx+PIXEL_FRAMENUM_RIGHT] +273F:4512 C7 45 22 0000 mov word ptr [di+ANIM_CHAR_RECT_Y], 0 +273F:4517 C6 45 26 03 mov byte ptr [di+ANIM_DIRECTION], FACING_RIGHT 273F:451B EB 00 jmp short char_face_end char_face_right endp -273F:451D char_face_end: -273F:451D 8B 5F 07 mov bx,[bx+PIXEL_FRAME_SIZE] ; Calculate frame offset -273F:4520 32 E4 xor ah,ah +273F:451D char_face_end: +273F:451D 8B 5F 07 mov bx, [bx+PIXEL_FRAME_SIZE] ; Calculate frame offset +273F:4520 32 E4 xor ah, ah 273F:4522 F7 E3 mul bx 273F:4524 89 45 08 mov [di+ANIM_FRAME_OFFSET], ax 273F:4527 C3 retn @@ -10638,11 +10667,10 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 ; Called from: 273F:4333 ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ -273F:4528 sub_104 proc near -273F:4528 loc_866: ; xref 273F:5353 -273F:4528 ú83 44 61 05 add word ptr [si+61h],5 -273F:452C EB 0C jmp short loc_868 - sub_104 endp + increment_action_offset proc near +273F:4528 ú83 44 61 05 add word ptr [si+HS_ACTION_OFFSET], CURRENT_ACTION_RECORD_SIZE +273F:452C EB 0C jmp short loc_868 + increment_action_offset endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE @@ -10654,22 +10682,22 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:452F 8B C1 mov ax, cx 273F:4531 E8 C7B6 call get_room_resource_pointer2 273F:4534 58 pop ax -273F:4535 loc_867: ; xref 273F:813B -273F:4535 úC7 44 61 0005 mov word ptr [si+61h],5 -273F:453A loc_868: ; xref 273F:452C -273F:453A C6 44 4D 00 mov byte ptr [si+4Dh],0 -273F:453E D1 E0 shl ax,1 ; Shift w/zeros fill -273F:4540 05 1380 add ax,1380h -273F:4543 8B D8 mov bx,ax -273F:4545 8B 07 mov ax,[bx] -273F:4547 8B DE mov bx,si -273F:4549 03 5C 61 add bx,[si+61h] -273F:454C 83 C3 63 add bx,63h -273F:454F 89 47 01 mov [bx+1],ax -273F:4552 C6 07 02 mov byte ptr [bx],2 -273F:4555 8B 44 06 mov ax,[si+6] -273F:4558 89 47 03 mov [bx+3],ax -273F:455B C6 44 2A 00 mov byte ptr [si+2Ah],0 +273F:4535 loc_867: +273F:4535 úC7 44 61 0005 mov word ptr [si+HS_ACTION_OFFSET], CURRENT_ACTION_RECORD_SIZE +273F:453A loc_868: +273F:453A C6 44 4D 00 mov byte ptr [si+HS_V4D], 0 +273F:453E D1 E0 shl ax, 1 ; Shift w/zeros fill +273F:4540 05 1380 add ax, offset seq48_offset_list +273F:4543 8B D8 mov bx, ax +273F:4545 8B 07 mov ax, [bx] +273F:4547 8B DE mov bx, si +273F:4549 03 5C 61 add bx, [si+HS_ACTION_OFFSET] +273F:454C 83 C3 63 add bx, HS_FIRST_ACTION_OFFSET +273F:454F 89 47 01 mov [bx+CURRENT_ACTION_SUPPORT_TABLE], ax +273F:4552 C6 07 02 mov byte ptr [bx], CHAR_ACTION_DISPATCH_ACTION +273F:4555 8B 44 06 mov ax, [si+HS_ROOM_NUM] +273F:4558 89 47 03 mov [bx+CURRENT_ACTION_ROOM_NUM], ax +273F:455B C6 44 2A 00 mov byte ptr [si+HS_FRAME_NUM], 0 273F:455F C3 retn seq_method_48 endp @@ -10681,24 +10709,24 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:4560 sub_105 proc near 273F:4560 loc_869: ; xref 273F:5EC8 -273F:4560 úF6 44 4C FF test byte ptr [si+4Ch],0FFh +273F:4560 úF6 44 4C FF test byte ptr [si+HS_V4C], 0FFh 273F:4564 74 2C jz loc_ret_873 ; Jump if zero 273F:4566 loc_870: ; xref 273F:5042 273F:4566 ú53 push bx 273F:4567 BB B0AE mov bx, offset hotspot_action_list 273F:456A B9 0014 mov cx, NUM_HOTSPOT_ACTION_SLOTS -273F:456D 8B 45 1B mov ax,[di+1Bh] +273F:456D 8B 45 1B mov ax, [di+ANIM_HOTSPOT_ID] 273F:4570 locloop_871: ; xref 273F:458F -273F:4570 3B 07 cmp ax,[bx] +273F:4570 3B 07 cmp ax, [bx] 273F:4572 75 18 jne loc_872 ; Jump if not equal -273F:4574 C7 47 04 000F mov word ptr [bx+4],0Fh -273F:4579 81 7F 02 2710 cmp word ptr [bx+2],2710h -273F:457E 73 0C jae loc_872 ; Jump if above or = +273F:4574 C7 47 04 000F mov word ptr [bx+4], 0Fh +273F:4579 81 7F 02 2710 cmp word ptr [bx+2], 2710h +273F:457E 73 0C jae loc_872 273F:4580 56 push si 273F:4581 51 push cx -273F:4582 8B 77 06 mov si,[bx+6] -273F:4585 C7 44 4A 000F mov word ptr [si+4Ah],0Fh +273F:4582 8B 77 06 mov si, [bx+6] +273F:4585 C7 44 4A 000F mov word ptr [si+HS_V4A], 0Fh 273F:458A 59 pop cx 273F:458B 5E pop si 273F:458C loc_872: ; xref 273F:4572, 457E @@ -10741,47 +10769,47 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ 273F:45A7 sub_107 proc near -273F:45A7 3D 0420 cmp ax,420h +273F:45A7 3D 0420 cmp ax, 420h 273F:45AA 74 0A je loc_876 ; Jump if equal -273F:45AC 3D 0436 cmp ax,436h +273F:45AC 3D 0436 cmp ax, 436h 273F:45AF 74 05 je loc_876 ; Jump if equal -273F:45B1 3D 0429 cmp ax,429h +273F:45B1 3D 0429 cmp ax, 429h 273F:45B4 75 1A jne loc_879 ; Jump if not equal 273F:45B6 loc_876: ; xref 273F:45AA, 45AF 273F:45B6 50 push ax 273F:45B7 55 push bp 273F:45B8 E8 3F9F call sub_213 ; (855A) 273F:45BB 5D pop bp -273F:45BC 0B C0 or ax,ax ; Zero ? +273F:45BC 0B C0 or ax, ax ; Zero ? 273F:45BE 74 0B jz loc_878 ; Jump if zero 273F:45C0 58 pop ax 273F:45C1 56 push si 273F:45C2 E8 C725 call get_room_resource_pointer2 273F:45C5 5B pop bx -273F:45C6 87 F3 xchg si,bx +273F:45C6 87 F3 xchg si, bx 273F:45C8 loc_877: ; xref 273F:45F4, 4600 273F:45C8 E9 00BB jmp loc_888 ; (4686) -273F:45CB loc_878: ; xref 273F:45BE +273F:45CB loc_878: 273F:45CB 58 pop ax -273F:45CC B8 0003 mov ax,3 -273F:45CF C3 retn -273F:45D0 loc_879: ; xref 273F:45B4 +273F:45CC B8 0003 mov ax, 3 ; Initial call for action +273F:45CF C3 retn ; (prior to moving to it) +273F:45D0 loc_879: 273F:45D0 56 push si 273F:45D1 E8 C716 call get_room_resource_pointer2 273F:45D4 5B pop bx -273F:45D5 87 DE xchg bx,si +273F:45D5 87 DE xchg bx, si ;ßßßß External Entry into Subroutine ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; ; Called from: 273F:58B0 273F:45D7 sub_108: -273F:45D7 8B 44 06 mov ax,[si+HS_ROOM_NUM] -273F:45DA 3B 47 06 cmp ax,[bx+HS_ROOM_NUM] +273F:45D7 8B 44 06 mov ax, [si+HS_ROOM_NUM] +273F:45DA 3B 47 06 cmp ax, [bx+HS_ROOM_NUM] 273F:45DD 75 72 jne loc_884 ; Jump if not equal -273F:45DF F6 44 2A FF test byte ptr [si+2Ah],0FFh +273F:45DF F6 44 2A FF test byte ptr [si+HS_FRAME_NUM], 0FFh 273F:45E3 75 46 jnz loc_883 ; Jump if not zero -273F:45E5 C6 44 2A 01 mov byte ptr [si+2Ah],1 +273F:45E5 C6 44 2A 01 mov byte ptr [si+HS_FRAME_NUM], 1 273F:45E9 81 3E BA1B 0408 cmp active_hotspot_id, 408h 273F:45EF 72 09 jb loc_881 ; Jump if below 273F:45F1 loc_880: ; xref 273F:4606, 463B, 4641, 4647 @@ -10791,10 +10819,10 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:45F6 B8 0003 mov ax,3 273F:45F9 C3 retn 273F:45FA loc_881: ; xref 273F:45EF -273F:45FA 8B 45 1B mov ax,[di+1Bh] -273F:45FD 3B 47 50 cmp ax,[bx+50h] +273F:45FA 8B 45 1B mov ax, [di+ANIM_HOTSPOT_ID] +273F:45FD 3B 47 50 cmp ax, [bx+HS_DIRECTION] 273F:4600 74 C6 je loc_877 ; Jump if equal -273F:4602 80 7F 44 04 cmp byte ptr [bx+44h],4 +273F:4602 80 7F 44 04 cmp byte ptr [bx+HS_V44], 4 273F:4606 74 E9 je loc_880 ; Jump if equal 273F:4608 80 3E BAB9 02 cmp byte ptr script_val_88, 2 273F:460D 74 0D je loc_882 ; Jump if equal @@ -10804,14 +10832,14 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:4616 5B pop bx 273F:4617 C7 44 42 0004 mov word ptr [si+42h],4 273F:461C loc_882: ; xref 273F:460D -273F:461C C7 47 2B 002A mov word ptr [bx+2Bh],2Ah -273F:4621 8B 45 1B mov ax,[di+1Bh] -273F:4624 89 47 2F mov [bx+2Fh],ax +273F:461C C7 47 2B 002A mov word ptr [bx+HS_V2B], 2Ah +273F:4621 8B 45 1B mov ax, [di+ANIM_HOTSPOT_ID] +273F:4624 89 47 2F mov [bx+HS_USE_HOTSPOT_ID], ax 273F:4627 B8 0003 mov ax,3 273F:462A C3 retn 273F:462B loc_883: ; xref 273F:45E3 -273F:462B 80 44 2A 01 add byte ptr [si+2Ah],1 -273F:462F 80 7C 2A 06 cmp byte ptr [si+2Ah],6 +273F:462B 80 44 2A 01 add byte ptr [si+HS_FRAME_NUM], 1 +273F:462F 80 7C 2A 06 cmp byte ptr [si+HS_FRAME_NUM], 6 273F:4633 73 41 jae loc_887 ; Jump if above or = 273F:4635 81 3E BA1B 0408 cmp active_hotspot_id, 408h 273F:463B 73 B4 jae loc_880 ; Jump if above or = @@ -10880,39 +10908,38 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 ; Called from: 273F:7FD1 ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ -273F:46B1 sub_109 proc near -273F:46B1 loc_890: ; xref 273F:4383 + 1character_reset_direction proc near 273F:46B1 53 push bx -273F:46B2 80 25 F8 and byte ptr [di],0F8h -273F:46B5 80 64 0D F8 and byte ptr [si+0Dh],0F8h -273F:46B9 80 0D 05 or byte ptr [di],5 -273F:46BC 80 4C 0D 05 or byte ptr [si+0Dh],5 -273F:46C0 8B 5C 21 mov bx,[si+21h] -273F:46C3 8A 45 26 mov al,[di+26h] -273F:46C6 3C 01 cmp al,1 -273F:46C8 72 10 jb loc_893 ; Jump if below -273F:46CA 74 09 jz loc_892 ; Jump if zero -273F:46CC 3C 03 cmp al,3 -273F:46CE 72 0F jb loc_894 ; Jump if below -273F:46D0 loc_891: ; xref 273F:4740 -273F:46D0 ú8A 47 14 mov al,[bx+14h] -273F:46D3 EB 0D jmp short loc_895 ; (46E2) -273F:46D5 loc_892: ; xref 273F:46CA, 473A -273F:46D5 8A 47 12 mov al,[bx+12h] -273F:46D8 EB 08 jmp short loc_895 ; (46E2) -273F:46DA loc_893: ; xref 273F:46C8, 4738 -273F:46DA 8A 47 11 mov al,[bx+11h] -273F:46DD EB 03 jmp short loc_895 ; (46E2) -273F:46DF loc_894: ; xref 273F:46CE, 473E -273F:46DF 8A 47 13 mov al,[bx+13h] -273F:46E2 loc_895: ; xref 273F:46D3, 46D8, 46DD -273F:46E2 8B 5F 07 mov bx,[bx+7] -273F:46E5 32 E4 xor ah,ah ; Zero register +273F:46B2 80 25 F8 and byte ptr [di+ANIM_X], 0F8h +273F:46B5 80 64 0D F8 and byte ptr [si+HS_X], 0F8h +273F:46B9 80 0D 05 or byte ptr [di+ANIM_X], 5 +273F:46BC 80 4C 0D 05 or byte ptr [si+HS_X], 5 +273F:46C0 8B 5C 21 mov bx, [si+HS_PIXEL_OFFSET] +273F:46C3 8A 45 26 mov al, [di+ANIM_DIRECTION] +273F:46C6 3C 01 cmp al, FACING_DOWN +273F:46C8 72 10 jb loc_893 ; Jump if up +273F:46CA 74 09 jz loc_892 ; Jump if down +273F:46CC 3C 03 cmp al, 3 +273F:46CE 72 0F jb loc_894 ; Jump if left +273F:46D0 loc_891: +273F:46D0 ú8A 47 14 mov al, [bx+PIXEL_FRAMENUM_RIGHT] +273F:46D3 EB 0D jmp short loc_895 +273F:46D5 loc_892: +273F:46D5 8A 47 12 mov al, [bx+PIXEL_FRAMENUM_DOWN] +273F:46D8 EB 08 jmp short loc_895 +273F:46DA loc_893: +273F:46DA 8A 47 11 mov al, [bx+PIXEL_FRAMENUM_UP] +273F:46DD EB 03 jmp short loc_895 +273F:46DF loc_894: +273F:46DF 8A 47 13 mov al, [bx+PIXEL_FRAMENUM_LEFT] +273F:46E2 loc_895: +273F:46E2 8B 5F 07 mov bx, [bx+PIXEL_FRAME_SIZE] +273F:46E5 32 E4 xor ah, ah ; Zero register 273F:46E7 F7 E3 mul bx ; dx:ax = reg * ax -273F:46E9 89 45 08 mov [di+8],ax +273F:46E9 89 45 08 mov [di+ANIM_FRAME_OFFSET], ax 273F:46EC 5B pop bx 273F:46ED C3 retn - sub_109 endp + character_reset_direction endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß @@ -10922,20 +10949,21 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 ; 5B43, 5BAA, 5C76, 5CC7, 8A00 ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ -273F:46EE sub_110 proc near + character_face_hotspot proc near 273F:46EE 53 push bx 273F:46EF 57 push di 273F:46F0 56 push si 273F:46F1 EB 17 jmp short loc_896 ; (470A) ;* No entry point to code -273F:46F3 8B 45 1B mov ax,[di+1Bh] + +273F:46F3 8B 45 1B mov ax, [di+ANIM_HOTSPOT_ID] 273F:46F6 8B 1E BA1B mov bx, active_hotspot_id ;ßßßß External Entry into Subroutine ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; ; Called from: 273F:61C5, 61CA -273F:46FA sub_111: + character_face_hotspot_2: 273F:46FA 53 push bx 273F:46FB 57 push di 273F:46FC 56 push si @@ -10953,44 +10981,44 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:4712 3D 0408 cmp ax,408h 273F:4715 73 6B jae loc_903 ; Jump if above or = 273F:4717 53 push bx -273F:4718 8B DE mov bx,si -273F:471A 03 5C 61 add bx,[si+61h] -273F:471D 83 C3 63 add bx,63h -273F:4720 8A 07 mov al,[bx] +273F:4718 8B DE mov bx, si +273F:471A 03 5C 61 add bx, [si+HS_ACTION_OFFSET] +273F:471D 83 C3 63 add bx, HS_FIRST_ACTION_OFFSET +273F:4720 8A 07 mov al, [bx] 273F:4722 5B pop bx 273F:4723 81 3E BA1B 7530 cmp active_hotspot_id, 7530h -273F:4729 72 17 jb loc_897 ; Jump if below -273F:472B 5E pop si +273F:4729 72 17 jb loc_897 +273F:472B 5E pop si ; Non selectable hotspot 273F:472C 5F pop di -273F:472D 8A 47 08 mov al,[bx+8] -273F:4730 88 45 26 mov [di+26h],al -273F:4733 8B 5C 21 mov bx,[si+21h] -273F:4736 3C 01 cmp al,1 -273F:4738 72 A0 jb loc_893 ; Jump if below -273F:473A 74 99 jz loc_892 ; Jump if zero -273F:473C 3C 03 cmp al,3 -273F:473E 72 9F jb loc_894 ; Jump if below -273F:4740 EB 8E jmp short loc_891 ; (46D0) -273F:4742 loc_897: ; xref 273F:4729 -273F:4742 8B 54 0F mov dx,[si+0Fh] -273F:4745 03 54 1B add dx,[si+1Bh] -273F:4748 2B 57 0F sub dx,[bx+0Fh] -273F:474B 2B 57 1B sub dx,[bx+1Bh] -273F:474E 8B 4C 0D mov cx,[si+0Dh] -273F:4751 2B 4F 0D sub cx,[bx+0Dh] -273F:4754 8B C1 mov ax,cx -273F:4756 0B C0 or ax,ax ; Zero ? +273F:472D 8A 47 08 mov al, [bx+8] +273F:4730 88 45 26 mov [di+ANIM_DIRECTION], al +273F:4733 8B 5C 21 mov bx, [si+HS_PIXEL_OFFSET] +273F:4736 3C 01 cmp al, FACING_DOWN +273F:4738 72 A0 jb loc_893 ; Jump if up +273F:473A 74 99 jz loc_892 ; Jump if down +273F:473C 3C 03 cmp al, FACING_LEFT +273F:473E 72 9F jb loc_894 ; Jump if left +273F:4740 EB 8E jmp short loc_891 ; Jump for right +273F:4742 loc_897: +273F:4742 8B 54 0F mov dx, [si+HS_Y] +273F:4745 03 54 1B add dx, [si+HS_HEIGHT_COPY] +273F:4748 2B 57 0F sub dx, [bx+HS_Y] +273F:474B 2B 57 1B sub dx, [bx+HS_HEIGHT_COPY] +273F:474E 8B 4C 0D mov cx, [si+HS_X] +273F:4751 2B 4F 0D sub cx, [bx+HS_X] +273F:4754 8B C1 mov ax, cx +273F:4756 0B C0 or ax, ax ; Zero ? 273F:4758 79 02 jns loc_898 ; Jump if not sign 273F:475A F7 D8 neg ax 273F:475C loc_898: ; xref 273F:4758 -273F:475C 8B DA mov bx,dx -273F:475E 0B DB or bx,bx ; Zero ? +273F:475C 8B DA mov bx, dx +273F:475E 0B DB or bx, bx ; Zero ? 273F:4760 79 02 jns loc_899 ; Jump if not sign 273F:4762 F7 DB neg bx 273F:4764 loc_899: ; xref 273F:4760 -273F:4764 3B D8 cmp bx,ax +273F:4764 3B D8 cmp bx, ax 273F:4766 72 09 jb loc_900 ; Jump if below -273F:4768 0B D2 or dx,dx ; Zero ? +273F:4768 0B D2 or dx, dx ; Zero ? 273F:476A 78 0E js loc_901 ; Jump if sign=1 273F:476C E8 FD6A call char_face_up 273F:476F EB 11 jmp short loc_903 ; (4782) @@ -11010,7 +11038,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:4783 5F pop di 273F:4784 5B pop bx 273F:4785 C3 retn - sub_110 endp + character_face_hotspot endp ;* No entry point to code 273F:4786 8B DD mov bx,bp @@ -11026,9 +11054,9 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:479A C7 44 42 0016 mov word ptr [si+42h],16h 273F:479F E8 FC9F call sub_97 ; (4441) 273F:47A2 8B DE mov bx,si -273F:47A4 03 5C 61 add bx,[si+61h] -273F:47A7 83 C3 63 add bx,63h -273F:47AA 89 6F 01 mov [bx+1],bp +273F:47A4 03 5C 61 add bx, [si+HS_ACTION_OFFSET] +273F:47A7 83 C3 63 add bx, HS_FIRST_ACTION_OFFSET +273F:47AA 89 6F 01 mov [bx+1], bp 273F:47AD C3 retn ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß @@ -11390,86 +11418,104 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 ; ax=character Hotspot Id, bx=dest x, cx=dest y, dl=[4ch] ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ -273F:49F6 sub_119 proc near -273F:49F6 89 26 3942 mov word ptr ds:[3942h],sp ; (273F:3942=5901h) -273F:49FA C7 06 3944 0FA0 mov word ptr ds:[3944h],0FA0h ; (273F:3944=0B0E2h) -273F:4A00 F6 06 3946 FF test byte ptr ds:[3946h],0FFh ; (273F:3946=1Fh) +3983h/4227h = record + 2 = ax hotspot Id + 4 = HS[4Ch] + 6 = dest x + 8 = dest y +end; + +TEMP_CHARACTER_ID equ 2 +TEMP_HS4C equ 04h +TEMP_DEST_X equ 06h +TEMP_DEST_Y equ 08h +TEMP_X equ 0Ch +TEMP_Y equ 0Ah +TEMP_DEST_X2 equ 10h + character_pathfind proc near +273F:49F6 89 26 3942 mov pathfind_sp, sp +273F:49FA C7 06 3944 0FA0 mov pathfind_v2, 0FA0h +273F:4A00 F6 06 3946 FF test pathfind_v3, 0FFh 273F:4A05 74 0E jz loc_933 ; Jump if zero 273F:4A07 3D 03E8 cmp ax, PLAYER_HOTSPOT_ID 273F:4A0A 74 03 je loc_932 ; Jump if equal 273F:4A0C 33 C0 xor ax,ax ; Zero register 273F:4A0E C3 retn 273F:4A0F loc_932: ; xref 273F:4A0A -273F:4A0F úBE 3983 mov si,3983h ; (273F:3983=1Fh) -273F:4A12 8B 24 mov sp,[si] +273F:4A0F úBE 3983 mov si, offset player_pathfind_data +273F:4A12 8B 24 mov sp, [si] 273F:4A14 C3 retn 273F:4A15 loc_933: ; xref 273F:4A05 -273F:4A15 BE 3983 mov si,3983h +273F:4A15 BE 3983 mov si, offset player_pathfind_data 273F:4A18 BD 03E8 mov bp, PLAYER_HOTSPOT_ID 273F:4A1B 3D 03E8 cmp ax, PLAYER_HOTSPOT_ID 273F:4A1E 74 17 je loc_935 ; Jump if equal -273F:4A20 úBE 4227 mov si,4227h ; (273F:4227=8Bh) -273F:4A23 BD 057A mov bp,57Ah -273F:4A26 F7 04 FFFF test word ptr [si],0FFFFh +273F:4A20 úBE 4227 mov si, offset chars_pathfind_data +273F:4A23 BD 057A mov bp, 57Ah +273F:4A26 F7 04 FFFF test word ptr [si], 0FFFFh 273F:4A2A 74 10 jz loc_936 ; Jump if zero -273F:4A2C 3B 44 02 cmp ax,[si+2] +273F:4A2C 3B 44 02 cmp ax, [si+2] 273F:4A2F 74 03 je loc_934 ; Jump if equal -273F:4A31 33 C0 xor ax,ax ; Zero register +273F:4A31 33 C0 xor ax, ax ; Zero register 273F:4A33 C3 retn 273F:4A34 loc_934: ; xref 273F:4A2F -273F:4A34 8B 24 mov sp,[si] +273F:4A34 8B 24 mov sp, [si] 273F:4A36 C3 retn 273F:4A37 loc_935: ; xref 273F:4A1E -273F:4A37 C6 06 3946 01 mov byte ptr ds:[3946h],1 ; (273F:3946=1Fh) +273F:4A37 C6 06 3946 01 mov pathfind_v3, 1 273F:4A3C loc_936: ; xref 273F:4A2A -273F:4A3C 88 54 04 mov [si+4],dl -273F:4A3F 89 44 02 mov [si+2],ax -273F:4A42 8B E5 mov sp,bp -273F:4A44 81 FB 008A cmp bx,8Ah -273F:4A48 73 05 jae loc_937 ; Jump if above or = -273F:4A4A 83 EB 32 sub bx,32h +273F:4A3C 88 54 04 mov [si+TEMP_HS4C], dl ; Store HS[4Ch] +273F:4A3F 89 44 02 mov [si+TEMP_CHARACTER_ID], ax ; Store character Id +273F:4A42 8B E5 mov sp, bp + +; Handle adjusting destination X for left & right screen edges to place it completely +; off-screen. This will allows characters to walk completely off-screen as they exit +273F:4A44 81 FB 008A cmp bx, 80h + 10 ; dest x >= 10? +273F:4A48 73 05 jae loc_937 ; Jump if yes +273F:4A4A 83 EB 32 sub bx, 50 273F:4A4D EB 09 jmp short loc_938 ; (4A58) 273F:4A4F loc_937: ; xref 273F:4A48 -273F:4A4F 81 FB 01B6 cmp bx,1B6h +273F:4A4F 81 FB 01B6 cmp bx, 80h + 310 273F:4A53 72 03 jb loc_938 ; Jump if below -273F:4A55 83 C3 32 add bx,32h -273F:4A58 loc_938: ; xref 273F:4A4D, 4A53 -273F:4A58 89 5C 06 mov [si+6],bx -273F:4A5B 89 4C 08 mov [si+8],cx -273F:4A5E 8B 6D 13 mov bp,[di+13h] -273F:4A61 83 ED 01 sub bp,1 -273F:4A64 B1 03 mov cl,3 -273F:4A66 D3 ED shr bp,cl ; Shift w/zeros fill +273F:4A55 83 C3 32 add bx, 50 +273F:4A58 loc_938: +273F:4A58 89 5C 06 mov [si+TEMP_DEST_X], bx ; Store X +273F:4A5B 89 4C 08 mov [si+TEMP_DEST_Y], cx ; Store Y + +273F:4A5E 8B 6D 13 mov bp, [di+ANIM_WIDTH_COPY] +273F:4A61 83 ED 01 sub bp, 1 +273F:4A64 B1 03 mov cl, 3 +273F:4A66 D3 ED shr bp, cl ; bp=width/8 273F:4A68 57 push di -273F:4A69 ú81 C6 08A2 add si,8A2h ; (273F:08A2=0C0h) -273F:4A6D 8B 45 0E mov ax,[di+0Eh] -273F:4A70 8B D8 mov bx,ax -273F:4A72 B1 04 mov cl,4 -273F:4A74 D3 E0 shl ax,cl ; Shift w/zeros fill -273F:4A76 2B C3 sub ax,bx -273F:4A78 B1 03 mov cl,3 -273F:4A7A D3 E0 shl ax,cl ; Shift w/zeros fill -273F:4A7C 05 9849 add ax,9849h +273F:4A69 ú81 C6 08A2 add si, 8A2h +273F:4A6D 8B 45 0E mov ax, [di+ANIM_ROOM_NUM] +273F:4A70 8B D8 mov bx, ax +273F:4A72 B1 04 mov cl, 4 +273F:4A74 D3 E0 shl ax, cl +273F:4A76 2B C3 sub ax, bx +273F:4A78 B1 03 mov cl, 3 +273F:4A7A D3 E0 shl ax, cl ; ax=Room # * 120 +273F:4A7C 05 9849 add ax, offset pathfind_data 273F:4A7F 1E push ds 273F:4A80 07 pop es -273F:4A81 8B FE mov di,si -273F:4A83 8B F0 mov si,ax -273F:4A85 FD std ; Set direction flag -273F:4A86 33 C0 xor ax,ax ; Zero register -273F:4A88 B9 002B mov cx,2Bh -273F:4A8B F3/ AB rep stosw ; Rep when cx >0 Store ax to es:[di] -273F:4A8D 83 C7 01 add di,1 -273F:4A90 B6 18 mov dh,18h -273F:4A92 loc_939: ; xref 273F:4AE8 +273F:4A81 8B FE mov di, si ; for player di=4225h +273F:4A83 8B F0 mov si, ax ; si=room ? record offset +273F:4A85 FD std ; Set for reverse direction +273F:4A86 33 C0 xor ax, ax +273F:4A88 B9 002B mov cx, 2Bh +273F:4A8B F3/ AB rep stosw ; Clear area +273F:4A8D 83 C7 01 add di, 1 ; For player di=41D0h +273F:4A90 B6 18 mov dh, 18h +273F:4A92 loc_939: 273F:4A92 B2 05 mov dl,5 -273F:4A94 loc_940: ; xref 273F:4ADC -273F:4A94 AC lodsb ; String [si] to al -273F:4A95 86 E0 xchg ah,al -273F:4A97 32 C0 xor al,al ; Zero register -273F:4A99 B9 0008 mov cx,8 +273F:4A94 loc_940: +273F:4A94 AC lodsb ; ax=c6h, si=98c0h +273F:4A95 86 E0 xchg ah, al +273F:4A97 32 C0 xor al, al ; ax=c600h +273F:4A99 B9 0008 mov cx, 8 273F:4A9C locloop_941: ; xref 273F:4AA2, 4AB3 -273F:4A9C D0 EC shr ah,1 ; Shift w/zeros fill +273F:4A9C D0 EC shr ah, 1 ; Shift w/zeros fill 273F:4A9E 72 06 jc loc_942 ; Jump if carry Set 273F:4AA0 AA stosb ; Store al to es:[di] 273F:4AA1 AA stosb ; Store al to es:[di] @@ -11511,106 +11557,112 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:4AD2 80 EA 01 sub dl,1 273F:4AD5 75 E0 jnz loc_944 ; Jump if not zero 273F:4AD7 EB 05 jmp short loc_949 ; (4ADE) + 273F:4AD9 loc_948: ; xref 273F:4AA4, 4AB5 273F:4AD9 80 EA 01 sub dl,1 273F:4ADC 75 B6 jnz loc_940 ; Jump if not zero + 273F:4ADE loc_949: ; xref 273F:4AD7 -273F:4ADE B9 0004 mov cx,4 +273F:4ADE B9 0004 mov cx, 4 273F:4AE1 F3/ AA rep stosb ; Rep when cx >0 Store al to es:[di] -273F:4AE3 B2 05 mov dl,5 -273F:4AE5 80 EE 01 sub dh,1 +273F:4AE3 B2 05 mov dl, 5 +273F:4AE5 80 EE 01 sub dh, 1 273F:4AE8 75 A8 jnz loc_939 ; Jump if not zero -273F:4AEA 83 EF 01 sub di,1 -273F:4AED B9 0029 mov cx,29h -273F:4AF0 33 C0 xor ax,ax ; Zero register +273F:4AEA 83 EF 01 sub di, 1 +273F:4AED B9 0029 mov cx, 29h +273F:4AF0 33 C0 xor ax, ax ; Zero register 273F:4AF2 F3/ AB rep stosw ; Rep when cx >0 Store ax to es:[di] -273F:4AF4 83 EF 1A sub di,1Ah -273F:4AF7 5E pop si -273F:4AF8 33 C0 xor ax,ax ; Zero register -273F:4AFA 89 45 0A mov [di+0Ah],ax -273F:4AFD 89 45 0C mov [di+0Ch],ax -273F:4B00 89 45 10 mov [di+10h],ax -273F:4B03 89 45 0E mov [di+0Eh],ax -273F:4B06 88 45 05 mov [di+5],al -273F:4B09 81 2E 3944 02BC sub word ptr ds:[3944h],2BCh ; (273F:3944=0B0E2h) -273F:4B0F 8B 04 mov ax,[si] -273F:4B11 2D 0080 sub ax,80h -273F:4B14 73 05 jnc loc_950 ; Jump if carry=0 -273F:4B16 89 45 0C mov [di+0Ch],ax -273F:4B19 33 C0 xor ax,ax ; Zero register -273F:4B1B loc_950: ; xref 273F:4B14 -273F:4B1B BB 013F mov bx,13Fh -273F:4B1E 2B 5C 13 sub bx,[si+13h] -273F:4B21 3B C3 cmp ax,bx -273F:4B23 72 07 jb loc_951 ; Jump if below -273F:4B25 2B C3 sub ax,bx -273F:4B27 89 45 0C mov [di+0Ch],ax -273F:4B2A 8B C3 mov ax,bx -273F:4B2C loc_951: ; xref 273F:4B23 -273F:4B2C 8B 5C 02 mov bx,[si+2] -273F:4B2F 80 E3 F8 and bl,0F8h -273F:4B32 03 5C 15 add bx,[si+15h] -273F:4B35 83 EB 04 sub bx,4 -273F:4B38 81 EB 0088 sub bx,88h +273F:4AF4 83 EF 1A sub di, 1Ah ; di=3983 again + +273F:4AF7 5E pop si ; si=anim slot +273F:4AF8 33 C0 xor ax, ax ; Zero register +273F:4AFA 89 45 0A mov [di+0Ah], ax +273F:4AFD 89 45 0C mov [di+0Ch], ax +273F:4B00 89 45 10 mov [di+10h], ax +273F:4B03 89 45 0E mov [di+0Eh], ax +273F:4B06 88 45 05 mov [di+5], al +273F:4B09 81 2E 3944 02BC sub pathfind_v2, 2BCh +273F:4B0F 8B 04 mov ax, [si+ANIM_X] ; Get current X +273F:4B11 2D 0080 sub ax, 80h ; Subtract the 80h offset +273F:4B14 73 05 jnc loc_950 ; Jump if current X on-screen +273F:4B16 89 45 0C mov [di+TEMP_X], ax +273F:4B19 33 C0 xor ax, ax ; Zero register +273F:4B1B loc_950: ; ax = max(0, X) +273F:4B1B BB 013F mov bx, 319 +273F:4B1E 2B 5C 13 sub bx, [si+ANIM_WIDTH_COPY] +273F:4B21 3B C3 cmp ax, bx +273F:4B23 72 07 jb loc_951 ; X + full width on screen? +273F:4B25 2B C3 sub ax, bx +273F:4B27 89 45 0C mov [di+TEMP_X], ax ; X = min(X, 319 - width) +273F:4B2A 8B C3 mov ax, bx +273F:4B2C loc_951: +273F:4B2C 8B 5C 02 mov bx, [si+ANIM_Y] +273F:4B2F 80 E3 F8 and bl, 0F8h +273F:4B32 03 5C 15 add bx, [si+ANIM_HEIGHT_COPY] +273F:4B35 83 EB 04 sub bx, 4 +273F:4B38 81 EB 0088 sub bx, 88h 273F:4B3C 73 05 jnc loc_952 ; Jump if carry=0 -273F:4B3E 89 5D 0A mov [di+0Ah],bx -273F:4B41 33 DB xor bx,bx ; Zero register +273F:4B3E 89 5D 0A mov [di+TEMP_Y], bx +273F:4B41 33 DB xor bx, bx ; Zero register 273F:4B43 loc_952: ; xref 273F:4B3C -273F:4B43 81 FB 00C0 cmp bx,0C0h +273F:4B43 81 FB 00C0 cmp bx, 192 273F:4B47 72 0A jb loc_953 ; Jump if below -273F:4B49 81 EB 00BF sub bx,0BFh -273F:4B4D 89 5D 0A mov [di+0Ah],bx -273F:4B50 BB 00BF mov bx,0BFh +273F:4B49 81 EB 00BF sub bx, 191 +273F:4B4D 89 5D 0A mov [di+TEMP_Y], bx +273F:4B50 BB 00BF mov bx, 191 273F:4B53 loc_953: ; xref 273F:4B47 -273F:4B53 8B 4D 06 mov cx,[di+6] -273F:4B56 81 E9 0080 sub cx,80h -273F:4B5A 73 05 jnc loc_954 ; Jump if carry=0 -273F:4B5C 89 4D 10 mov [di+10h],cx -273F:4B5F 33 C9 xor cx,cx ; Zero register -273F:4B61 loc_954: ; xref 273F:4B5A -273F:4B61 BA 0140 mov dx,140h -273F:4B64 2B 54 13 sub dx,[si+13h] -273F:4B67 3B CA cmp cx,dx -273F:4B69 72 07 jb loc_955 ; Jump if below -273F:4B6B 2B CA sub cx,dx -273F:4B6D 89 4D 10 mov [di+10h],cx -273F:4B70 8B CA mov cx,dx +273F:4B53 8B 4D 06 mov cx, [di+TEMP_DEST_X] +273F:4B56 81 E9 0080 sub cx, 128 +273F:4B5A 73 05 jnc loc_954 ; Jump if x >= 0 +273F:4B5C 89 4D 10 mov [di+TEMP_DEST_X2], cx ; Store X (will be negative) +273F:4B5F 33 C9 xor cx, cx +273F:4B61 loc_954: +273F:4B61 BA 0140 mov dx, 320 +273F:4B64 2B 54 13 sub dx, [si+ANIM_WIDTH_COPY] +273F:4B67 3B CA cmp cx, dx +273F:4B69 72 07 jb loc_955 ; Jump if fully on screen +273F:4B6B 2B CA sub cx, dx +273F:4B6D 89 4D 10 mov [di+TEMP_DEST_X2], cx +273F:4B70 8B CA mov cx, dx 273F:4B72 loc_955: ; xref 273F:4B69 -273F:4B72 8B 55 08 mov dx,[di+8] -273F:4B75 81 EA 0088 sub dx,88h +273F:4B72 8B 55 08 mov dx, [di+TEMP_DEST_Y] +273F:4B75 81 EA 0088 sub dx, 88h 273F:4B79 73 02 jnc loc_956 ; Jump if carry=0 -273F:4B7B 33 D2 xor dx,dx ; Zero register +273F:4B7B 33 D2 xor dx, dx ; Zero register 273F:4B7D loc_956: ; xref 273F:4B79 -273F:4B7D 81 FA 00C0 cmp dx,0C0h +273F:4B7D 81 FA 00C0 cmp dx, 192 273F:4B81 72 03 jb loc_957 ; Jump if below -273F:4B83 BA 00BF mov dx,0BFh +273F:4B83 BA 00BF mov dx, 191 273F:4B86 loc_957: ; xref 273F:4B81 -273F:4B86 8B E9 mov bp,cx -273F:4B88 B1 03 mov cl,3 -273F:4B8A D3 E8 shr ax,cl ; Shift w/zeros fill -273F:4B8C D3 EB shr bx,cl ; Shift w/zeros fill -273F:4B8E D3 ED shr bp,cl ; Shift w/zeros fill -273F:4B90 D3 EA shr dx,cl ; Shift w/zeros fill -273F:4B92 3B C5 cmp ax,bp +273F:4B86 8B E9 mov bp, cx + +; current=(ax,bx), dest=(bp,dx). Check to see if a move of only a few pixels is required +273F:4B88 B1 03 mov cl, 3 +273F:4B8A D3 E8 shr ax, cl ; Shift w/zeros fill +273F:4B8C D3 EB shr bx, cl ; Shift w/zeros fill +273F:4B8E D3 ED shr bp, cl ; Shift w/zeros fill +273F:4B90 D3 EA shr dx, cl ; Shift w/zeros fill +273F:4B92 3B C5 cmp ax, bp 273F:4B94 75 2B jne loc_961 ; Jump if not equal -273F:4B96 3B DA cmp bx,dx +273F:4B96 3B DA cmp bx, dx 273F:4B98 75 27 jne loc_961 ; Jump if not equal -273F:4B9A úBB 3940 mov bx,3940h ; (273F:3940=0C7h) -273F:4B9D C7 07 0000 mov word ptr [bx],0 -273F:4BA1 8B 45 10 mov ax,[di+10h] -273F:4BA4 0B C0 or ax,ax ; Zero ? + +273F:4B9A úBB 3940 mov bx, offset pathfind_buffer_end +273F:4B9D C7 07 0000 mov word ptr [bx], 0 ; Set end of pathfind sequence +273F:4BA1 8B 45 10 mov ax, [di+TEMP_DEST_X2] +273F:4BA4 0B C0 or ax, ax ; Any partial off-screen move? 273F:4BA6 74 16 jz loc_960 ; Jump if zero 273F:4BA8 78 07 js loc_958 ; Jump if sign=1 -273F:4BAA C7 47 FE 0002 mov word ptr [bx-2],2 +273F:4BAA C7 47 FE 0002 mov word ptr [bx-2], FACING2_RIGHT 273F:4BAF EB 07 jmp short loc_959 ; (4BB8) 273F:4BB1 loc_958: ; xref 273F:4BA8 -273F:4BB1 C7 47 FE 0001 mov word ptr [bx-2],1 +273F:4BB1 C7 47 FE 0001 mov word ptr [bx-2], FACING2_LEFT 273F:4BB6 F7 D8 neg ax 273F:4BB8 loc_959: ; xref 273F:4BAF -273F:4BB8 89 47 FC mov [bx-4],ax -273F:4BBB 83 EB 04 sub bx,4 -273F:4BBE loc_960: ; xref 273F:4BA6 -273F:4BBE E9 02B3 jmp loc_1003 ; (4E74) +273F:4BB8 89 47 FC mov [bx-4], ax ; Store # steps +273F:4BBB 83 EB 04 sub bx, 4 ; Move back for next record +273F:4BBE loc_960: +273F:4BBE E9 02B3 jmp loc_1003 273F:4BC1 loc_961: ; xref 273F:4B94, 4B98 273F:4BC1 50 push ax 273F:4BC2 53 push bx @@ -11701,13 +11753,13 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:4C85 loc_971: ; xref 273F:4CC6, 4CCE, 4CDA 273F:4C85 ú56 push si 273F:4C86 53 push bx -273F:4C87 8B 36 3944 mov si,word ptr ds:[3944h] ; (273F:3944=0B0E2h) -273F:4C8B 8B 4D 1A mov cx,[di+1Ah] +273F:4C87 8B 36 3944 mov si, pathfind_v2 +273F:4C8B 8B 4D 1A mov cx, [di+1Ah] 273F:4C8E locloop_972: ; xref 273F:4C9F 273F:4C8E 51 push cx 273F:4C8F 53 push bx -273F:4C90 8B 4D 18 mov cx,[di+18h] +273F:4C90 8B 4D 18 mov cx, [di+18h] 273F:4C93 locloop_973: ; xref 273F:4C98 273F:4C93 E8 021A call sub_120 ; (4EB0) @@ -11719,7 +11771,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:4C9C 03 5D 16 add bx,[di+16h] 273F:4C9F E2 ED loop locloop_972 ; Loop if cx > 0 -273F:4CA1 89 36 3944 mov word ptr ds:[3944h],si ; (273F:3944=0B0E2h) +273F:4CA1 89 36 3944 mov pathfind_v2, si 273F:4CA5 5B pop bx 273F:4CA6 5E pop si 273F:4CA7 F7 04 FFFF test word ptr [si],0FFFFh @@ -11924,27 +11976,28 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:4E72 loc_1002: ; xref 273F:4E55, 4E69 273F:4E72 5E pop si 273F:4E73 58 pop ax -273F:4E74 loc_1003: ; xref 273F:4BBE, 4D3F + +273F:4E74 loc_1003: 273F:4E74 FC cld ; Clear direction -273F:4E75 8B 45 0C mov ax,[di+0Ch] -273F:4E78 A9 FFFF test ax,0FFFFh -273F:4E7B 74 19 jz loc_1006 ; Jump if zero -273F:4E7D 78 0A js loc_1004 ; Jump if sign=1 -273F:4E7F C7 47 FE 0001 mov word ptr [bx-2],1 -273F:4E84 89 47 FC mov [bx-4],ax -273F:4E87 EB 0A jmp short loc_1005 ; (4E93) +273F:4E75 8B 45 0C mov ax, [di+TEMP_X] +273F:4E78 A9 FFFF test ax, 0FFFFh ; Check X position +273F:4E7B 74 19 jz loc_1006 +273F:4E7D 78 0A js loc_1004 ; Move +273F:4E7F C7 47 FE 0001 mov word ptr [bx-2], FACING2_LEFT +273F:4E84 89 47 FC mov [bx-4], ax ; Save # steps +273F:4E87 EB 0A jmp short loc_1005 273F:4E89 loc_1004: ; xref 273F:4E7D -273F:4E89 C7 47 FE 0002 mov word ptr [bx-2],2 +273F:4E89 C7 47 FE 0002 mov word ptr [bx-2], FACING2_RIGHT 273F:4E8E F7 D8 neg ax -273F:4E90 89 47 FC mov [bx-4],ax -273F:4E93 loc_1005: ; xref 273F:4E87 -273F:4E93 83 EB 04 sub bx,4 -273F:4E96 loc_1006: ; xref 273F:4E7B -273F:4E96 C7 05 0000 mov word ptr [di],0 -273F:4E9A 8B 26 3942 mov sp,word ptr ds:[3942h] ; (273F:3942=5901h) -273F:4E9E C6 06 3946 00 mov byte ptr ds:[3946h],0 ; (273F:3946=1Fh) -273F:4EA3 B8 0001 mov ax,1 -273F:4EA6 02 45 05 add al,[di+5] +273F:4E90 89 47 FC mov [bx-4], ax ; Save # steps +273F:4E93 loc_1005: +273F:4E93 83 EB 04 sub bx, 4 ; Move back one record +273F:4E96 loc_1006: ; End of pathfinding +273F:4E96 C7 05 0000 mov word ptr [di], 0 +273F:4E9A 8B 26 3942 mov sp, pathfind_sp +273F:4E9E C6 06 3946 00 mov pathfind_v3, 0 +273F:4EA3 B8 0001 mov ax, 1 +273F:4EA6 02 45 05 add al, [di+5] 273F:4EA9 50 push ax 273F:4EAA 53 push bx 273F:4EAB 06 push es @@ -11952,7 +12005,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:4EAD 5B pop bx 273F:4EAE 58 pop ax 273F:4EAF C3 retn - sub_119 endp + character_pathfind endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß @@ -12007,7 +12060,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:4EFE 83 EE 01 sub si,1 273F:4F01 73 FA jnc loc_ret_1012 ; Jump if carry=0 273F:4F03 loc_1014: ; xref 273F:4EFB -273F:4F03 89 36 3944 mov word ptr ds:[3944h],si ; (273F:3944=0B0E2h) +273F:4F03 89 36 3944 mov pathfind_v2, si 273F:4F07 50 push ax 273F:4F08 53 push bx 273F:4F09 51 push cx @@ -12029,7 +12082,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:4F1B 59 pop cx 273F:4F1C 5B pop bx 273F:4F1D 58 pop ax -273F:4F1E 8B 36 3944 mov si,word ptr ds:[3944h] ; (273F:3944=0B0E2h) +273F:4F1E 8B 36 3944 mov si, pathfind_v2 273F:4F22 C3 retn sub_120 endp @@ -12090,24 +12143,24 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 ; Called from: 273F:5039, 5127, 5EB0, 5EE9, 5F56 ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ -273F:4F52 sub_123 proc near + pathfind_reset proc near 273F:4F52 53 push bx 273F:4F53 3D 03E8 cmp ax, PLAYER_HOTSPOT_ID 273F:4F56 75 0E jne loc_1019 ; Jump if not equal -273F:4F58 úBB 3983 mov bx,3983h ; (273F:3983=1Fh) -273F:4F5B C6 06 3946 00 mov byte ptr ds:[3946h],0 ; (273F:3946=1Fh) -273F:4F60 C7 07 0000 mov word ptr [bx],0 +273F:4F58 úBB 3983 mov bx, offset player_pathfind_data +273F:4F5B C6 06 3946 00 mov pathfind_v3, 0 +273F:4F60 C7 07 0000 mov word ptr [bx], 0 273F:4F64 5B pop bx 273F:4F65 C3 retn 273F:4F66 loc_1019: ; xref 273F:4F56 -273F:4F66 úBB 4227 mov bx,4227h ; (273F:4227=8Bh) -273F:4F69 3B 47 02 cmp ax,[bx+2] +273F:4F66 úBB 4227 mov bx, offset chars_pathfind_data +273F:4F69 3B 47 02 cmp ax, [bx+2] 273F:4F6C 75 04 jne loc_1020 ; Jump if not equal -273F:4F6E C7 07 0000 mov word ptr [bx],0 +273F:4F6E C7 07 0000 mov word ptr [bx], 0 273F:4F72 loc_1020: ; xref 273F:4F6C 273F:4F72 5B pop bx 273F:4F73 C3 retn - sub_123 endp + pathfind_reset endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE @@ -12117,7 +12170,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:4F74 sub_124 proc near 273F:4F74 C6 06 3946 00 mov byte ptr ds:[3946h],0 ; (273F:3946=1Fh) -273F:4F79 úBE 4227 mov si, 4227h ; (273F:4227=8Bh) +273F:4F79 úBE 4227 mov si, offset chars_pathfind_data 273F:4F7C C7 04 0000 mov word ptr [si],0 273F:4F80 C3 retn sub_124 endp @@ -12135,116 +12188,121 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:4F84 03 5C 61 add bx, [si+HS_ACTION_OFFSET] 273F:4F87 83 C3 63 add bx, HS_FIRST_ACTION_OFFSET 273F:4F8A E8 11EB call talk_countdown_handler -273F:4F8D F7 44 2F FFFF test word ptr [si+2Fh], 0FFFFh -273F:4F92 74 1F jz loc_1023 ; Jump if zero -273F:4F94 8B 44 2B mov ax, [si+2Bh] +273F:4F8D F7 44 2F FFFF test word ptr [si+HS_USE_HOTSPOT_ID], 0FFFFh +273F:4F92 74 1F jz loc_1023 ; Jump if no hotspot to use +273F:4F94 8B 44 2B mov ax, [si+HS_V2B] 273F:4F97 3D 002A cmp ax, 2Ah 273F:4F9A 74 03 je loc_1022 ; Jump if equal -273F:4F9C E9 F3C7 jmp loc_843 ; (4366) +273F:4F9C E9 F3C7 jmp character_update_movement + 273F:4F9F loc_1022: ; xref 273F:4F9A 273F:4F9F A3 BA1B mov active_hotspot_id, ax -273F:4FA2 8B 44 2F mov ax,[si+2Fh] +273F:4FA2 8B 44 2F mov ax, [si+HS_USE_HOTSPOT_ID] 273F:4FA5 A3 BA19 mov use_hotspot_id, ax -273F:4FA8 8B 44 2D mov ax,[si+2Dh] +273F:4FA8 8B 44 2D mov ax, [si+HS_HOTSPOT_SCRIPT_ID 273F:4FAB E8 EE86 call sequence_execute -273F:4FAE C7 44 2F 0000 mov word ptr [si+2Fh],0 -273F:4FB3 loc_1023: ; xref 273F:4F92 -273F:4FB3 F7 44 1F FFFF test word ptr [si+1Fh],0FFFFh -273F:4FB8 74 05 jz loc_1024 ; Jump if zero -273F:4FBA 83 6C 1F 01 sub word ptr [si+1Fh],1 +273F:4FAE C7 44 2F 0000 mov word ptr [si+HS_USE_HOTSPOT_ID], 0 +273F:4FB3 loc_1023: +273F:4FB3 F7 44 1F FFFF test word ptr [si+HS_FRAME_CTR], 0FFFFh +273F:4FB8 74 05 jz loc_1024 +273F:4FBA 83 6C 1F 01 sub word ptr [si+HS_FRAME_CTR], 1 273F:4FBE C3 retn -273F:4FBF loc_1024: ; xref 273F:4FB8 -273F:4FBF E8 C149 call sub_40 ; (110B) -273F:4FC2 F6 45 1D FF test byte ptr [di+1Dh],0FFh -273F:4FC6 74 4C jz loc_1028 ; Jump if zero -273F:4FC8 F7 06 10BE FFFF test data_615, 0FFFFh -273F:4FCE 74 40 jz loc_1027 ; Jump if zero +273F:4FBF loc_1024: +273F:4FBF E8 C149 call character_find_impinging_chars +273F:4FC2 F6 45 1D FF test byte ptr [di+ANIM_LAYER1_SKIP], 0FFh +273F:4FC6 74 4C jz loc_1028 ; Skip if necessary +273F:4FC8 F7 06 10BE FFFF test num_impinging_chars, 0FFFFh ; Bumped into anyone? +273F:4FCE 74 40 jz loc_1027 ; Jump if not 273F:4FD0 56 push si -273F:4FD1 úBE 10C0 mov si, offset data_616 -273F:4FD4 loc_1025: ; xref 273F:4FDC -273F:4FD4 AD lodsw ; String [si] to ax -273F:4FD5 0B C0 or ax,ax ; Zero ? -273F:4FD7 74 2C jz loc_1026 ; Jump if zero -273F:4FD9 3D 03E8 cmp ax, PLAYER_HOTSPOT_ID -273F:4FDC 75 F6 jne loc_1025 ; Jump if not equal -273F:4FDE 80 3E 6D33 02 cmp byte ptr ds:[6D33h],2 ; (273F:6D33=0Bh) +273F:4FD1 úBE 10C0 mov si, offset impinging_char_list +273F:4FD4 loc_1025: +273F:4FD4 AD lodsw ; Get character Id +273F:4FD5 0B C0 or ax, ax ; End of list reached? +273F:4FD7 74 2C jz loc_1026 ; Jump if yes +273F:4FD9 3D 03E8 cmp ax, PLAYER_HOTSPOT_ID ; Is it the player? +273F:4FDC 75 F6 jne loc_1025 ; Skip if yes +273F:4FDE 80 3E 6D33 02 cmp data_900, 2 273F:4FE3 75 20 jne loc_1026 ; Jump if not equal 273F:4FE5 5E pop si 273F:4FE6 úBE 6CEF mov si, offset player_hotspot_rec 273F:4FE9 BF B14E mov di, offset animation_table -273F:4FEC 8B DE mov bx,si -273F:4FEE 03 5C 61 add bx,[si+61h] -273F:4FF1 83 C3 63 add bx,63h -273F:4FF4 C6 44 4C 01 mov byte ptr [si+4Ch],1 +273F:4FEC 8B DE mov bx, si +273F:4FEE 03 5C 61 add bx, [si+HS_ACTION_OFFSET] +273F:4FF1 83 C3 63 add bx, HS_FIRST_ACTION_OFFSET +273F:4FF4 C6 44 4C 01 mov byte ptr [si+HS_V4C], 1 273F:4FF8 C7 44 52 0000 mov [si+HS_DEST_HOTSPOT], 0 assume ds:seg_code -273F:4FFD C6 06 9834 04 mov byte ptr data_427,4 ; (273F:9834=0F9h) -273F:5002 E9 0661 jmp loc_1108 ; (5666) -273F:5005 loc_1026: ; xref 273F:4FD7, 4FE3 +273F:4FFD C6 06 9834 04 mov byte ptr data_1084, 4 +273F:5002 E9 0661 jmp sub_133 + +273F:5005 loc_1026: 273F:5005 5E pop si -273F:5006 C6 44 44 03 mov byte ptr [si+44h],3 -273F:500A C7 44 42 000A mov word ptr [si+42h],0Ah +273F:5006 C6 44 44 03 mov byte ptr [si+HS_V44], 3 +273F:500A C7 44 42 000A mov word ptr [si+HS_V42], 10 273F:500F C3 retn -273F:5010 loc_1027: ; xref 273F:4FCE -273F:5010 C6 45 1D 00 mov byte ptr [di+1Dh],0 -273F:5014 loc_1028: ; xref 273F:4FC6 -273F:5014 F7 44 47 FFFF test word ptr [si+47h],0FFFFh + +273F:5010 loc_1027: +273F:5010 C6 45 1D 00 mov byte ptr [di+ANIM_LAYER1_SKIP], 0 +273F:5014 loc_1028: +273F:5014 F7 44 47 FFFF test [si+HS_USE2_HOTSPOT_ID], 0FFFFh 273F:5019 74 11 jz loc_1029 ; Jump if zero -273F:501B 8B 44 47 mov ax,[si+47h] +273F:501B 8B 44 47 mov ax, [si+HS_USE2_HOTSPOT_ID] 273F:501E A3 BA19 mov use_hotspot_id, ax -273F:5021 8B 44 45 mov ax,[si+45h] +273F:5021 8B 44 45 mov ax, [si+HS_HOTSPOT2_SCRIPT_ID] 273F:5024 E8 EE0D call sequence_execute -273F:5027 C7 44 47 0000 mov word ptr [si+47h],0 -273F:502C loc_1029: ; xref 273F:5019 -273F:502C F7 44 4A FFFF test word ptr [si+4Ah],0FFFFh +273F:5027 C7 44 47 0000 mov word ptr [si+HS_USE2_HOTSPOT_ID], 0 + +273F:502C loc_1029: +273F:502C F7 44 4A FFFF test word ptr [si+HS_V4A], 0FFFFh 273F:5031 74 21 jz loc_1031 ; Jump if zero -273F:5033 E8 F330 call sub_93 ; (4366) -273F:5036 8B 45 1B mov ax,[di+1Bh] -273F:5039 E8 FF16 call sub_123 ; (4F52) -273F:503C 83 7C 4A 01 cmp word ptr [si+4Ah],1 +273F:5033 E8 F330 call character_update_movement +273F:5036 8B 45 1B mov ax, [di+ANIM_HOTSPOT_ID] +273F:5039 E8 FF16 call pathfind_reset +273F:503C 83 7C 4A 01 cmp word ptr [si+HS_V4A], 1 273F:5040 74 03 je loc_1030 ; Jump if equal 273F:5042 E9 F521 jmp loc_870 ; (4566) 273F:5045 loc_1030: ; xref 273F:5040 -273F:5045 C7 44 4A 0000 mov word ptr [si+4Ah],0 -273F:504A F6 44 44 FF test byte ptr [si+44h],0FFh +273F:5045 C7 44 4A 0000 mov word ptr [si+HS_V4A], 0 +273F:504A F6 44 44 FF test byte ptr [si+HS_V4A], 0FFh 273F:504E 75 04 jnz loc_1031 ; Jump if not zero 273F:5050 E8 F334 call sub_94 ; (4387) 273F:5053 C3 retn 273F:5054 loc_1031: ; xref 273F:5031, 504E -273F:5054 F6 44 44 FF test byte ptr [si+44h],0FFh +273F:5054 F6 44 44 FF test byte ptr [si+HS_V44], 0FFh 273F:5058 75 02 jnz loc_1032 ; Jump if not zero 273F:505A EB 6C jmp short loc_1040 ; (50C8) 273F:505C loc_1032: ; xref 273F:5058 -273F:505C 8A 44 44 mov al,[si+44h] -273F:505F 3C 06 cmp al,6 +273F:505C 8A 44 44 mov al, [si+HS_V44] +273F:505F 3C 06 cmp al, 6 273F:5061 75 17 jne loc_1034 ; Jump if not equal -273F:5063 E8 F300 call sub_93 ; (4366) +273F:5063 E8 F300 call character_update_movement 273F:5066 53 push bx -273F:5067 úBB 10BE mov bx, offset data_615 +273F:5067 úBB 10BE mov bx, offset num_impinging_chars 273F:506A loc_1033: ; xref 273F:5076 -273F:506A 8B 07 mov ax,[bx] -273F:506C 0B C0 or ax,ax ; Zero ? -273F:506E 74 37 jz loc_1037 ; Jump if zero -273F:5070 83 C3 02 add bx,2 -273F:5073 3D 03E8 cmp ax, PLAYER_HOTSPOT_ID -273F:5076 75 F2 jne loc_1033 ; Jump if not equal +273F:506A 8B 07 mov ax, [bx] ; Get impinging char Id +273F:506C 0B C0 or ax, ax ; End of list reached? +273F:506E 74 37 jz loc_1037 +273F:5070 83 C3 02 add bx, 2 ; Move to next entry +273F:5073 3D 03E8 cmp ax, PLAYER_HOTSPOT_ID ; Is character the player? +273F:5076 75 F2 jne loc_1033 ; Keep looping 273F:5078 5B pop bx 273F:5079 C3 retn + 273F:507A loc_1034: ; xref 273F:5061 -273F:507A F7 44 42 FFFF test word ptr [si+42h],0FFFFh +273F:507A F7 44 42 FFFF test word ptr [si+HS_V42], 0FFFFh 273F:507F 74 27 jz loc_1038 ; Jump if zero -273F:5081 E8 F2E2 call sub_93 ; (4366) -273F:5084 F7 44 50 FFFF test word ptr [si+50h],0FFFFh +273F:5081 E8 F2E2 call character_update_movement +273F:5084 F7 44 50 FFFF test word ptr [si+HS_DIRECTION], 0FFFFh 273F:5089 74 17 jz loc_1035 ; Jump if zero 273F:508B 56 push si -273F:508C 8B 5C 50 mov bx,[si+50h] +273F:508C 8B 5C 50 mov bx, [si+HS_DIRECTION] 273F:508F E8 BC56 call get_room_resource_pointer 273F:5092 5B pop bx -273F:5093 87 F3 xchg si,bx -273F:5095 8B 44 06 mov ax,[si+6] -273F:5098 3B 47 06 cmp ax,[bx+6] +273F:5093 87 F3 xchg si, bx ; si=char Id, +273F:5095 8B 44 06 mov ax, [si+6] +273F:5098 3B 47 06 cmp ax, [bx+6] 273F:509B 75 0B jne loc_1038 ; Jump if not equal -273F:509D E8 0501 call skorl_caught_check +273F:509D E8 0501 call characters_impinging_check 273F:50A0 74 06 jz loc_1038 ; Jump if zero 273F:50A2 loc_1035: ; xref 273F:5089 273F:50A2 83 6C 42 01 sub word ptr [si+42h],1 @@ -12265,8 +12323,8 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:50B9 3C 07 cmp al,7 273F:50BB 75 E9 jne loc_ret_1036 ; Jump if not equal 273F:50BD loc_1039: ; xref 273F:50B7 -273F:50BD C7 44 33 0000 mov word ptr [si+33h],0 -273F:50C2 B8 0001 mov ax,1 +273F:50BD C7 44 33 0000 mov word ptr [si+HS_V33], 0 +273F:50C2 B8 0001 mov ax, 1 273F:50C5 E9 12E9 jmp display_message_dialog 273F:50C8 loc_1040: ; xref 273F:505A 273F:50C8 F7 44 58 FFFF test word ptr [si+58h],0FFFFh @@ -12276,29 +12334,31 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:50D6 C6 44 2A C7 mov byte ptr [si+2Ah],0C7h 273F:50DA C6 07 02 mov byte ptr [bx],2 273F:50DD C3 retn + 273F:50DE loc_1041: ; xref 273F:50CD, 50D4 -273F:50DE 8A 07 mov al,[bx] -273F:50E0 0A C0 or al,al ; Zero ? -273F:50E2 75 06 jnz loc_1042 ; Jump if not zero -273F:50E4 B8 0002 mov ax,2 -273F:50E7 E9 F279 jmp loc_842 ; (4363) +273F:50DE 8A 07 mov al, [bx] ; Get current atcion +273F:50E0 0A C0 or al,al ; Any defined? +273F:50E2 75 06 jnz loc_1042 ; Jump if yes +273F:50E4 B8 0002 mov ax, 2 +273F:50E7 E9 F279 jmp character_update_movement_2 273F:50EA loc_1042: ; xref 273F:50E2 -273F:50EA 3C 05 cmp al,5 -273F:50EC 74 28 je loc_1045 ; Jump if equal -273F:50EE 3C 01 cmp al,1 +273F:50EA 3C 05 cmp al, CHAR_ACTION_CONTINUE_WALK +273F:50EC 74 28 je loc_1045 +273F:50EE 3C 01 cmp al, CHAR_ACTION_START_WALK 273F:50F0 74 32 je loc_1048 ; Jump if equal -273F:50F2 3C 04 cmp al,4 +273F:50F2 3C 04 cmp al, CHAR_ACTION_PROCESSING_PATH 273F:50F4 74 3A je loc_1049 ; Jump if equal -273F:50F6 3C 03 cmp al,3 +273F:50F6 3C 03 cmp al, CHAR_ACTION_EXEC_SCRIPT 273F:50F8 74 1F je loc_1046 ; Jump if equal -273F:50FA 8B 45 0E mov ax,[di+0Eh] -273F:50FD F7 47 03 FFFF test word ptr [bx+3],0FFFFh + +273F:50FA 8B 45 0E mov ax, [di+ANIM_ROOM_NUM] +273F:50FD F7 47 03 FFFF test word ptr [bx+3], 0FFFFh 273F:5102 75 03 jnz loc_1043 ; Jump if not zero -273F:5104 89 47 03 mov [bx+3],ax +273F:5104 89 47 03 mov [bx+3], ax 273F:5107 loc_1043: ; xref 273F:5102 -273F:5107 3B 47 03 cmp ax,[bx+3] +273F:5107 3B 47 03 cmp ax, [bx+3] ; Compare against room number 273F:510A 74 03 je loc_1044 ; Jump if equal -273F:510C E9 01F6 jmp loc_1078 ; (5305) +273F:510C E9 01F6 jmp loc_1078 273F:510F loc_1044: ; xref 273F:510A 273F:510F C6 45 1D 00 mov byte ptr [di+1Dh],0 273F:5113 E9 F0A8 jmp action_dispatch @@ -12312,21 +12372,22 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:5123 loc_ret_1047: ; xref 273F:511E 273F:5123 C3 retn -273F:5124 loc_1048: ; xref 273F:50F0 -273F:5124 8B 45 1B mov ax,[di+1Bh] -273F:5127 E8 FE28 call sub_123 ; (4F52) -273F:512A C6 07 04 mov byte ptr [bx],4 +273F:5124 loc_1048: ; Start walk +273F:5124 8B 45 1B mov ax, [di+ANIM_HOTSPOT_ID] +273F:5127 E8 FE28 call pathfind_reset +273F:512A C6 07 04 mov byte ptr [bx], CHAR_ACTION_PROCESSING_PATH 273F:512D E8 F257 call sub_94 ; (4387) -273F:5130 loc_1049: ; xref 273F:50F4 + +273F:5130 loc_1049: ; Processing walk path 273F:5130 56 push si 273F:5131 57 push di 273F:5132 53 push bx 273F:5133 E8 F42A call sub_105 ; (4560) -273F:5136 8B 4C 56 mov cx,[si+HS_DEST_Y] -273F:5139 8B 5C 54 mov bx,[si+HS_DEST_X] -273F:513C 8B 45 1B mov ax,[di+1Bh] -273F:513F 8A 54 4C mov dl,[si+4Ch] -273F:5142 E8 F8B1 call sub_1191 ; (49F6) +273F:5136 8B 4C 56 mov cx, [si+HS_DEST_Y] +273F:5139 8B 5C 54 mov bx, [si+HS_DEST_X] +273F:513C 8B 45 1B mov ax, [di+ANIM_HOTSPOT_ID] +273F:513F 8A 54 4C mov dl, [si+HS_V4C] +273F:5142 E8 F8B1 call character_pathfind 273F:5145 5A pop dx 273F:5146 5F pop di 273F:5147 5E pop si @@ -12349,9 +12410,9 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:5168 80 44 4C 01 add byte ptr [si+4Ch],1 273F:516C F6 44 4D FF test byte ptr [si+4Dh],0FFh 273F:5170 75 0B jnz loc_1053 ; Jump if not zero -273F:5172 83 44 61 05 add word ptr [si+61h],5 -273F:5176 C6 44 4D 01 mov byte ptr [si+4Dh],1 -273F:517A 83 C3 05 add bx,5 +273F:5172 83 44 61 05 add word ptr [si+HS_ACTION_OFFSET], CURRENT_ACTION_RECORD_SIZE +273F:5176 C6 44 4D 01 mov byte ptr [si+4Dh], 1 +273F:517A 83 C3 05 add bx, CURRENT_ACTION_RECORD_SIZE 273F:517D loc_1053: ; xref 273F:5170 273F:517D C7 47 01 13C2 mov word ptr [bx+1],13C2h 273F:5182 C6 07 02 mov byte ptr [bx],2 @@ -12360,9 +12421,9 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:518B C3 retn 273F:518C loc_1054: ; xref 273F:5166 273F:518C 53 push bx -273F:518D úBB 10C0 mov bx, offset data_616 +273F:518D úBB 10C0 mov bx, offset impinging_char_list 273F:5190 loc_1055: ; xref 273F:519C -273F:5190 8B 07 mov ax,[bx] +273F:5190 8B 07 mov ax, [bx] 273F:5192 0B C0 or ax,ax ; Zero ? 273F:5194 74 11 jz loc_1056 ; Jump if zero 273F:5196 83 C3 02 add bx,2 @@ -12370,7 +12431,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:519C 75 F2 jne loc_1055 ; Jump if not equal 273F:519E 5B pop bx 273F:519F E8 0006 call sub_125 ; (51A8) -273F:51A2 C6 44 44 06 mov byte ptr [si+44h],6 +273F:51A2 C6 44 44 06 mov byte ptr [si+HS_V44], 6 273F:51A6 C3 retn 273F:51A7 loc_1056: ; xref 273F:5194 273F:51A7 5B pop bx @@ -12384,17 +12445,17 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:51A8 sub_125 proc near 273F:51A8 E8 F296 call sub_97 ; (4441) -273F:51AB E8 F1B8 call sub_93 ; (4366) -273F:51AE 83 6C 61 05 sub word ptr [si+61h],5 -273F:51B2 C6 44 4D 00 mov byte ptr [si+4Dh],0 -273F:51B6 C6 44 4C 00 mov byte ptr [si+4Ch],0 -273F:51BA C6 44 44 03 mov byte ptr [si+44h],3 -273F:51BE C7 44 42 0002 mov word ptr [si+42h],2 -273F:51C3 8B DE mov bx,si -273F:51C5 03 5C 61 add bx,[si+61h] -273F:51C8 83 C3 63 add bx,63h -273F:51CB 8B 44 06 mov ax,[si+6] -273F:51CE 3B 47 03 cmp ax,[bx+3] +273F:51AB E8 F1B8 call character_update_movement +273F:51AE 83 6C 61 05 sub word ptr [si+HS_ACTION_OFFSET], CURRENT_ACTION_RECORD_SIZE +273F:51B2 C6 44 4D 00 mov byte ptr [si+HS_V4D], 0 +273F:51B6 C6 44 4C 00 mov byte ptr [si+HS_V4C], 0 +273F:51BA C6 44 44 03 mov byte ptr [si+HS_V44], 3 +273F:51BE C7 44 42 0002 mov word ptr [si+HS_V42], 2 +273F:51C3 8B DE mov bx, si +273F:51C5 03 5C 61 add bx, [si+HS_ACTION_OFFSET] +273F:51C8 83 C3 63 add bx, HS_FIRST_ACTION_OFFSET +273F:51CB 8B 44 06 mov ax, [si+HS_ROOM_NUM] +273F:51CE 3B 47 03 cmp ax, [bx+CURRENT_ACTION_ROOM_NUM] 273F:51D1 74 05 je loc_ret_1057 ; Jump if equal 273F:51D3 C7 44 52 FFFF mov [si+HS_DEST_HOTSPOT], 0FFFFh @@ -12402,6 +12463,11 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:51D8 C3 retn sub_125 endp + ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß + ; SUBROUTINE + ; + ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ + 273F:51D9 loc_1058: ; xref 273F:515E 273F:51D9 C6 44 4C 00 mov byte ptr [si+4Ch],0 273F:51DD F7 07 FFFF test word ptr [bx],0FFFFh @@ -12411,8 +12477,8 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:51E8 C3 retn 273F:51E9 loc_1059: ; xref 273F:51E1 273F:51E9 87 DA xchg bx,dx -273F:51EB C6 07 05 mov byte ptr [bx],5 -273F:51EE E8 F01C call sub_90 ; (420D) +273F:51EB C6 07 05 mov byte ptr [bx], CHAR_ACTION_CONTINUE_WALK +273F:51EE E8 F01C call character_translate_movements 273F:51F1 83 65 02 F8 and word ptr [di+2],0FFF8h 273F:51F5 83 64 0F F8 and word ptr [si+0Fh],0FFF8h 273F:51F9 loc_1060: ; xref 273F:5116 @@ -12423,7 +12489,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:5203 74 12 je loc_1062 ; Jump if equal 273F:5205 56 push si 273F:5206 53 push bx -273F:5207 E8 1FE4 call room_exit_hs_get_pointer +273F:5207 E8 1FE4 call room_exit_hs_get_pointer 273F:520A 8A 44 0C mov al,[si+0Ch] 273F:520D 5B pop bx 273F:520E 5E pop si @@ -12449,7 +12515,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:5234 75 02 jnz loc_1064 ; Jump if not zero 273F:5236 EB 03 jmp short loc_1065 273F:5238 loc_1064: -273F:5238 C6 07 02 mov byte ptr [bx], PLAYER_ACTION_DISPATCH_ACTION +273F:5238 C6 07 02 mov byte ptr [bx], CHAR_ACTION_DISPATCH_ACTION 273F:523B loc_1065: 273F:523B F7 44 52 FFFF test [si+HS_DEST_HOTSPOT], 0FFFFh ; Walking to exit? 273F:5240 74 03 jz loc_ret_1066 ; If not then return @@ -12470,7 +12536,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:5250 80 4C 0D 05 or byte ptr [si+HS_X], 5 273F:5254 C6 44 60 00 mov byte ptr [si+60h], 0 273F:5258 C6 45 1D 2A mov byte ptr [di+ANIM_LAYER1_SKIP], 2Ah -273F:525C C6 07 02 mov byte ptr [bx], PLAYER_ACTION_DISPATCH_ACTION +273F:525C C6 07 02 mov byte ptr [bx], CHAR_ACTION_DISPATCH_ACTION 273F:525F F6 C1 FF test cl, 0FFh ; Any direction specified? 273F:5262 74 12 jz loc_ret_1068 ; Exit if not 273F:5264 F6 C1 80 test cl, 80h @@ -12519,7 +12585,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:52BB E9 EF1B jmp loc_825 ; (41D9) 273F:52BE loc_1073: ; xref 273F:530D 273F:52BE C6 44 60 00 mov byte ptr [si+60h],0 -273F:52C2 F7 44 61 FFFF test word ptr [si+61h],0FFFFh +273F:52C2 F7 44 61 FFFF test word ptr [si+HS_ACTION_OFFSET], 0FFFFh 273F:52C7 74 28 jz loc_1077 ; Jump if zero 273F:52C9 53 push bx 273F:52CA F7 44 4E FFFF test word ptr [si+4Eh],0FFFFh @@ -12547,9 +12613,10 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:52FE 8B 44 06 mov ax,[si+6] 273F:5301 89 47 03 mov [bx+3],ax 273F:5304 C3 retn + 273F:5305 loc_1078: ; xref 273F:510C -273F:5305 80 44 60 01 add byte ptr [si+60h],1 -273F:5309 80 7C 60 05 cmp byte ptr [si+60h],5 +273F:5305 80 44 60 01 add byte ptr [si+HS_V60], 1 +273F:5309 80 7C 60 05 cmp byte ptr [si+HS_V60], 5 273F:530D 73 AF jae loc_1073 ; Jump if above or = 273F:530F 53 push bx 273F:5310 8B 5F 03 mov bx,[bx+3] @@ -12583,7 +12650,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:534E 72 06 jb loc_1081 ; Jump if below 273F:5350 5B pop bx 273F:5351 33 C0 xor ax,ax ; Zero register -273F:5353 E9 F1D2 jmp loc_866 ; (4528) +273F:5353 E9 F1D2 jmp increment_action_offset 273F:5356 loc_1081: ; xref 273F:531B, 534E 273F:5356 5B pop bx 273F:5357 8A C6 mov al,dh @@ -12626,12 +12693,12 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:53A9 58 pop ax 273F:53AA 89 47 02 mov [bx+2],ax 273F:53AD C6 44 4D 00 mov byte ptr [si+4Dh],0 -273F:53B1 83 44 61 05 add word ptr [si+61h],5 +273F:53B1 83 44 61 05 add word ptr [si+HS_ACTION_OFFSET], CURRENT_ACTION_RECORD_SIZE 273F:53B5 8B C3 mov ax,bx 273F:53B7 5B pop bx 273F:53B8 8B DE mov bx,si -273F:53BA 03 5C 61 add bx,[si+61h] -273F:53BD 83 C3 63 add bx,63h +273F:53BA 03 5C 61 add bx, [si+HS_ACTION_OFFSET] +273F:53BD 83 C3 63 add bx, HS_FIRST_ACTION_OFFSET 273F:53C0 89 47 01 mov [bx+1],ax 273F:53C3 C6 07 02 mov byte ptr [bx],2 273F:53C6 8B 44 06 mov ax,[si+6] @@ -12668,11 +12735,13 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ; + ; bp = Address of offset 2 in the Support data for the DISPATCH_ACTION + ; character action that launched this action ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ get_proc proc near -273F:53F5 8B DD mov bx,bp -273F:53F7 8B 07 mov ax,[bx] +273F:53F5 8B DD mov bx, bp +273F:53F7 8B 07 mov ax, [bx] ; Get hotspot Id 273F:53F9 83 C5 02 add bp,2 273F:53FC A3 BA19 mov use_hotspot_id, ax 273F:53FF A3 BA1B mov active_hotspot_id, ax @@ -12681,11 +12750,11 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:5407 74 08 jz loc_1086 ; Jump if zero 273F:5409 3D 0003 cmp ax,3 273F:540C 74 4E je loc_ret_1090 ; Jump if equal -273F:540E E9 0170 jmp loc_1102 ; (5581) +273F:540E E9 0170 jmp sub_129 273F:5411 loc_1086: ; xref 273F:5407 -273F:5411 E8 F2DA call sub_110 ; (46EE) +273F:5411 E8 F2DA call character_face_hotspot 273F:5414 53 push bx -273F:5415 E8 0169 call sub_129 ; (5581) +273F:5415 E8 0169 call sub_129 273F:5418 5B pop bx 273F:5419 E8 01DA call hotspot_get_action_sequence 273F:541C 79 03 jns loc_1087 ; Jump if not sign @@ -12726,8 +12795,8 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:545F 8B 07 mov ax,[bx] 273F:5461 83 C5 02 add bp,2 273F:5464 8B DE mov bx,si -273F:5466 03 5C 61 add bx,[si+61h] -273F:5469 83 C3 63 add bx,63h +273F:5466 03 5C 61 add bx, [si+HS_ACTION_OFFSET] +273F:5469 83 C3 63 add bx, HS_FIRST_ACTION_OFFSET 273F:546C 89 6F 01 mov [bx+1],bp 273F:546F A3 BA19 mov use_hotspot_id, ax 273F:5472 A3 BA1B mov active_hotspot_id, ax @@ -12794,8 +12863,6 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:54E1 75 36 jnz loc_1098 ; Jump if not zero 273F:54E3 EB 65 jmp short loc_1100 ; (554A) 273F:54E5 loc_1094: ; xref 273F:5494 - nlure.lst Sourcer v6.09 17-Nov- 5 5:53 pm Page 209 - 273F:54E5 8B 4F 0D mov cx,[bx+0Dh] 273F:54E8 8B 57 0F mov dx,[bx+0Fh] 273F:54EB 03 57 1B add dx,[bx+1Bh] @@ -12842,42 +12909,46 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:5535 5E pop si 273F:5536 loc_1099: ; xref 273F:551D 273F:5536 8B DE mov bx,si -273F:5538 03 5C 61 add bx,[si+61h] -273F:553B 83 C3 63 add bx,63h -273F:553E C6 07 01 mov byte ptr [bx],1 -273F:5541 89 54 56 mov [si+HS_DEST_Y],dx -273F:5544 89 4C 54 mov [si+HS_DEST_X],cx -273F:5547 33 C0 xor ax,ax ; Zero register +273F:5538 03 5C 61 add bx, [si+HS_ACTION_OFFSET] +273F:553B 83 C3 63 add bx, HS_FIRST_ACTION_OFFSET +273F:553E C6 07 01 mov byte ptr [bx], CHAR_ACTION_START_WALK +273F:5541 89 54 56 mov [si+HS_DEST_Y], dx +273F:5544 89 4C 54 mov [si+HS_DEST_X], cx +273F:5547 33 C0 xor ax, ax 273F:5549 C3 retn 273F:554A loc_1100: ; xref 273F:54E3, 5517 273F:554A 0D 0001 or ax,1 273F:554D C3 retn sub_127 endp -273F:554E 8B db 8Bh -273F:554F 8BDD data_342 dw 8BDDh ; xref 273F:93BB -273F:5551 E807 data_343 dw 0E807h ; xref 273F:9184, 918A, 91B3, 91BB - ; 91E8, 91FC, 9226, 92DA -273F:5553 DF data_344 db 0DFh ; xref 273F:9009, 9074, 90D4, 924C -273F:5554 E8 data_345 db 0E8h ; xref 273F:926B -273F:5555 74 11 8B 47 02 db 74h, 11h, 8Bh, 47h, 02h + ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß + ; SUBROUTINE + ; + ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ + +273F:554E 8B DD mov bx, bp +273F:5550 8B 07 mov ax, [bx] +273F:5552 E8 DF E8 call sequence_execute +273F:5555 74 11 jz loca_5568 +273F:5557 8B 47 02 mov ax, [bx+2] 273F:555A loc_1101: ; xref 273F:556D -273F:555A ú8B DE mov bx,si -273F:555C 03 5C 61 add bx,[si+61h] -273F:555F 83 C3 63 add bx,63h -273F:5562 89 47 01 mov [bx+1],ax +273F:555A ú8B DE mov bx, si +273F:555C 03 5C 61 add bx, [si+HS_ACTION_OFFSET] +273F:555F 83 C3 63 add bx, HS_FIRST_ACTION_OFFSET +273F:5562 89 47 01 mov [bx+1], ax 273F:5565 E9 EC56 jmp action_dispatch - ;* No entry point to code + loca_5568: 273F:5568 8B C5 mov ax,bp 273F:556A 05 0004 add ax,4 273F:556D EB EB jmp short loc_1101 ; (555A) + ;* No entry point to code 273F:556F 8B DD mov bx,bp -273F:5571 8B 07 mov ax,[bx] -273F:5573 8B DE mov bx,si -273F:5575 03 5C 61 add bx,[si+61h] -273F:5578 83 C3 63 add bx,63h -273F:557B 89 47 01 mov [bx+1],ax +273F:5571 8B 07 mov ax, [bx] +273F:5573 8B DE mov bx, si +273F:5575 03 5C 61 add bx, [si+HS_ACTION_OFFSET] +273F:5578 83 C3 63 add bx, HS_FIRST_ACTION_OFFSET +273F:557B 89 47 01 mov [bx+1], ax 273F:557E E9 EC3D jmp action_dispatch ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß @@ -12888,29 +12959,21 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ 273F:5581 sub_129 proc near -273F:5581 loc_1102: ; xref 273F:540E, 563A, 5658, 571F - ; 576E, 58BC, 5915, 5950 - ; 5A90, 5AC3, 5B3C, 5BA2 - ; 5C40, 5CBF, 5D12, 5D85 - ; 5DB9, 5E00, 5E13, 8827 - ; 89FC, 8A12 -273F:5581 ú81 7D 1B 03E8 cmp word ptr [di+1Bh], PLAYER_HOTSPOT_ID -273F:5586 75 05 jne loc_1103 ; Jump if not equal -273F:5588 80 26 9834 02 and byte ptr data_1084,2 ; (31E4:9834=0) +273F:5581 ú81 7D 1B 03E8 cmp word ptr [di+ANIM_HOTSPOT_ID], PLAYER_HOTSPOT_ID +273F:5586 75 05 jne sub_130 ; Jump if not player +273F:5588 80 26 9834 02 and byte ptr data_1084, 2 ; (31E4:9834=0) ;ßßßß External Entry into Subroutine ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; - ; Called from: 273F:5CC3 273F:558D sub_130: -273F:558D loc_1103: ; xref 273F:5586, 5891, 89C0, 8A1E -273F:558D ú33 C0 xor ax,ax ; Zero register -273F:558F 89 45 24 mov [di+24h],ax -273F:5592 88 44 2A mov [si+2Ah],al -273F:5595 8B DE mov bx,si -273F:5597 03 5C 61 add bx,[si+61h] -273F:559A 83 C3 63 add bx,63h -273F:559D 89 6F 01 mov [bx+1],bp +273F:558D ú33 C0 xor ax, +273F:558F 89 45 24 mov [di+ANIM_VOICE_CTR], ax +273F:5592 88 44 2A mov [si+HS_FRAME_NUM], al +273F:5595 8B DE mov bx, si +273F:5597 03 5C 61 add bx, [si+HS_ACTION_OFFSET] +273F:559A 83 C3 63 add bx, HS_FIRST_ACTION_OFFSET +273F:559D 89 6F 01 mov [bx+1], bp 273F:55A0 C3 retn sub_129 endp @@ -12921,7 +12984,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 ; Called from: 273F:44C7, 509D, 7F5D ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ - skorl_caught_check proc near + characters_impinging_check proc near 273F:55A1 8B 47 0D mov ax, [bx+HS_X] 273F:55A4 03 47 19 add ax, [bx+HS_WIDTH_COPY] 273F:55A7 05 0004 add ax, 4 @@ -12956,7 +13019,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:55F3 loc_1104: ; xref 273F:55AD, 55BB, 55D4, 55ED 273F:55F3 33 C0 xor ax,ax ; Zero register 273F:55F5 C3 retn - skorl_caught_check endp + characters_impinging_check endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß @@ -13004,10 +13067,10 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:5628 89 4C 5E mov [si+5Eh],cx 273F:562B C6 44 60 00 mov byte ptr [si+60h],0 273F:562F 8B DE mov bx,si -273F:5631 03 5C 61 add bx,[si+61h] -273F:5634 83 C3 63 add bx,63h -273F:5637 89 47 03 mov [bx+3],ax -273F:563A E9 FF44 jmp loc_1102 ; (5581) +273F:5631 03 5C 61 add bx, [si+HS_ACTION_OFFSET] +273F:5634 83 C3 63 add bx, HS_FIRST_ACTION_OFFSET +273F:5637 89 47 03 mov [bx+3], ax +273F:563A E9 FF44 jmp sub_129 ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE @@ -13021,10 +13084,10 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:5644 C7 44 5E 0000 mov word ptr [si+5Eh],0 273F:5649 C6 44 60 00 mov byte ptr [si+60h],0 273F:564D 8B DE mov bx,si -273F:564F 03 5C 61 add bx,[si+61h] -273F:5652 83 C3 63 add bx,63h -273F:5655 89 47 03 mov [bx+3],ax -273F:5658 E9 FF26 jmp loc_1102 ; (5581) +273F:564F 03 5C 61 add bx, [si+HS_ACTION_OFFSET] +273F:5652 83 C3 63 add bx, HS_FIRST_ACTION_OFFSET +273F:5655 89 47 03 mov [bx+3], ax +273F:5658 E9 FF26 jmp sub_129 go_to_proc endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß @@ -13033,8 +13096,8 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß 273F:565B 8B DE mov bx, si -273F:565D 03 5C 61 add bx, [si+61h] -273F:5660 83 C3 63 add bx, 63h +273F:565D 03 5C 61 add bx, [si+HS_ACTION_OFFSET] +273F:5660 83 C3 63 add bx, HS_FIRST_ACTION_OFFSET 273F:5663 89 6F 01 mov [bx+1], bp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß @@ -13043,13 +13106,12 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 ; Called from: 273F:606B ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ -273F:5666 sub_133 proc near -273F:5666 loc_1108: ; xref 273F:5002, 5FB6 -273F:5666 úC6 07 01 mov byte ptr [bx],1 -273F:5669 C6 45 27 01 mov byte ptr [di+27h],1 + sub_133 proc near +273F:5666 úC6 07 01 mov byte ptr [bx], CHAR_ACTION_START_WALK +273F:5669 C6 45 27 01 mov byte ptr [di+ANIM_UNKNOWN1], 1 273F:566D 56 push si 273F:566E 56 push si -273F:566F 8B 44 06 mov ax,[si+6] +273F:566F 8B 44 06 mov ax, [si+HS_ROOM_NUM] 273F:5672 E8 B675 call get_room_resource_pointer2 273F:5675 8A 5C 18 mov bl,[si+18h] 273F:5678 32 FF xor bh,bh ; Zero register @@ -13109,7 +13171,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:56CE sub_134 proc near 273F:56CE 53 push bx 273F:56CF 51 push cx -273F:56D0 E8 ECC1 call sub_95 ; (4394) +273F:56D0 E8 ECC1 call pathfind_get_cell 273F:56D3 59 pop cx 273F:56D4 locloop_1112: ; xref 273F:56E1 @@ -13150,9 +13212,9 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:5702 A1 BA19 mov ax, use_hotspot_id 273F:5705 E8 1AE6 call room_exit_hs_get_pointer 273F:5708 5B pop bx -273F:5709 F6 44 0C FF test byte ptr [si+0Ch],0FFh -273F:570D 74 58 jz loc_1120 ; Jump if zero -273F:570F loc_1115: ; xref 273F:56FF +273F:5709 F6 44 0C FF test byte ptr [si+REHS_EXIT_BLOCKED], 0FFh +273F:570D 74 58 jz loc_1120 ; Jump if exit blocked (closed) +273F:570F loc_1115: 273F:570F 5E pop si 273F:5710 A1 BA19 mov ax, use_hotspot_id 273F:5713 E8 EE91 call sub_107 ; (45A7) @@ -13160,13 +13222,13 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:5718 74 08 jz loc_1116 ; Jump if zero 273F:571A 3D 0003 cmp ax,3 273F:571D 74 47 je loc_ret_1119 ; Jump if equal -273F:571F E9 FE5F jmp loc_1102 ; (5581) +273F:571F E9 FE5F jmp sub_129 273F:5722 loc_1116: ; xref 273F:5718 273F:5722 53 push bx 273F:5723 E8 FE5B call sub_129 ; (5581) 273F:5726 5B pop bx 273F:5727 C6 44 2A 00 mov byte ptr [si+2Ah],0 -273F:572B E8 EFC0 call sub_110 ; (46EE) +273F:572B E8 EFC0 call character_face_hotspot 273F:572E E8 FEC5 call hotspot_get_action_sequence 273F:5731 79 03 jns loc_1117 ; Jump if not sign 273F:5733 E9 0C7B jmp display_message_dialog_3 @@ -13196,7 +13258,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:5767 5E pop si 273F:5768 B8 0004 mov ax,4 273F:576B E8 0C43 call display_message_dialog_3 -273F:576E E9 FE10 jmp loc_1102 ; (5581) +273F:576E E9 FE10 jmp sub_129 273F:5771 loc_1121: ; xref 273F:5740 273F:5771 F6 44 60 FF test byte ptr [si+60h],0FFh 273F:5775 74 04 jz loc_1122 ; Jump if zero @@ -13241,7 +13303,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:57BE E8 FDC0 call sub_129 ; (5581) 273F:57C1 5B pop bx 273F:57C2 C6 44 2A 00 mov byte ptr [si+2Ah],0 -273F:57C6 E8 EF25 call sub_110 ; (46EE) +273F:57C6 E8 EF25 call character_face_hotspot 273F:57C9 E8 FE2A call hotspot_get_action_sequence 273F:57CC 79 03 jns loc_1125 ; Jump if not sign 273F:57CE loc_1124: ; xref 273F:57D6 @@ -13304,9 +13366,9 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:5838 loc_1130: ; xref 273F:5833 273F:5838 E8 E5F9 call sequence_execute 273F:583B 75 4E jnz loc_1134 ; Jump if not zero -273F:583D 8B 44 06 mov ax,[si+6] -273F:5840 89 47 4E mov [bx+4Eh],ax -273F:5843 C7 47 61 0005 mov word ptr [bx+61h],5 +273F:583D 8B 44 06 mov ax, [si+HS_ROOM_NUM] +273F:5840 89 47 4E mov [bx+HS_V4E],ax +273F:5843 C7 47 61 0005 mov word ptr [bx+HS_ACTION_OFFSET], CURRENT_ACTION_RECORD_SIZE 273F:5848 C6 47 4D 00 mov byte ptr [bx+4Dh],0 273F:584C 8B 4F 5C mov cx,[bx+5Ch] 273F:584F 89 4F 69 mov [bx+69h],cx @@ -13344,7 +13406,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:588B loc_1134: ; xref 273F:5821, 583B 273F:588B 8B DD mov bx,bp 273F:588D C7 07 0000 mov word ptr [bx],0 -273F:5891 E9 FCF9 jmp loc_1103 ; (558D) +273F:5891 E9 FCF9 jmp sub_130 tell_proc endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß @@ -13371,12 +13433,12 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:58B5 74 08 jz loc_1135 ; Jump if zero 273F:58B7 3D 0003 cmp ax,3 273F:58BA 74 3E je loc_ret_1139 ; Jump if equal -273F:58BC E9 FCC2 jmp loc_1102 ; (5581) +273F:58BC E9 FCC2 jmp sub_129 273F:58BF loc_1135: ; xref 273F:58B5 273F:58BF C6 44 2A 00 mov byte ptr [si+2Ah],0 -273F:58C3 E8 EE28 call sub_110 ; (46EE) +273F:58C3 E8 EE28 call character_face_hotspot 273F:58C6 55 push bp -273F:58C7 E8 EA9C call sub_93 ; (4366) +273F:58C7 E8 EA9C call character_update_movement 273F:58CA 5D pop bp 273F:58CB loc_1136: 273F:58CB 53 push bx @@ -13437,13 +13499,13 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:590E 74 08 jz loc_1141 ; Jump if zero 273F:5910 3D 0003 cmp ax,3 273F:5913 74 E6 je loc_ret_1140 ; Jump if equal -273F:5915 E9 FC69 jmp loc_1102 ; (5581) +273F:5915 E9 FC69 jmp sub_129 273F:5918 loc_1141: ; xref 273F:590E 273F:5918 88 44 2A mov [si+2Ah], al 273F:591B 53 push bx 273F:591C E8 FC62 call sub_129 ; (5581) 273F:591F 5B pop bx -273F:5920 E8 EDCB call sub_110 ; (46EE) +273F:5920 E8 EDCB call character_face_hotspot 273F:5923 E8 FCD0 call hotspot_get_action_sequence 273F:5926 79 03 jns loc_1142 ; Jump if not sign 273F:5928 E9 0A86 jmp display_message_dialog_3 @@ -13473,12 +13535,12 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:5949 74 08 jz loc_1144 ; Jump if zero 273F:594B 3D 0003 cmp ax,3 273F:594E 74 AB je loc_ret_1140 ; Jump if equal -273F:5950 E9 FC2E jmp loc_1102 ; (5581) +273F:5950 E9 FC2E jmp sub_129 273F:5953 loc_1144: ; xref 273F:5949 273F:5953 53 push bx 273F:5954 E8 FC2A call sub_129 ; (5581) 273F:5957 5B pop bx -273F:5958 E8 ED93 call sub_110 ; (46EE) +273F:5958 E8 ED93 call character_face_hotspot 273F:595B E8 FC98 call hotspot_get_action_sequence 273F:595E 79 03 jns loc_1145 ; Jump if not sign 273F:5960 E9 0A4E jmp display_message_dialog_3 @@ -13624,13 +13686,13 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß return_proc proc near -273F:5A82 8B DE mov bx,si -273F:5A84 03 5C 61 add bx,[si+61h] -273F:5A87 83 C3 63 add bx,63h -273F:5A8A 8B 44 4E mov ax,[si+4Eh] -273F:5A8D 89 47 03 mov [bx+3],ax -273F:5A90 E9 FAEE jmp loc_1102 ; (5581) - return_proc emd[ +273F:5A82 8B DE mov bx, si +273F:5A84 03 5C 61 add bx, [si+HS_ACTION_OFFSET] +273F:5A87 83 C3 63 add bx, HS_FIRST_ACTION_OFFSET +273F:5A8A 8B 44 4E mov ax, [si+HS_V4E] +273F:5A8D 89 47 03 mov [bx+CURRENT_ACTION_ROOM_NUM], ax +273F:5A90 E9 FAEE jmp sub_129 + return_proc endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE @@ -13658,14 +13720,14 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:5ABD 74 0B jz loc_1156 ; Jump if zero 273F:5ABF 3C 03 cmp al,3 273F:5AC1 74 03 je loc_ret_1154 ; Jump if equal -273F:5AC3 E9 FABB jmp loc_1102 ; (5581) +273F:5AC3 E9 FABB jmp sub_129 273F:5AC6 loc_ret_1154: ; xref 273F:5AC1, 5AF5, 5B3A 273F:5AC6 C3 retn 273F:5AC7 loc_1155: ; xref 273F:5AB3 273F:5AC7 E9 0242 jmp loc_1187 ; (5D0C) 273F:5ACA loc_1156: ; xref 273F:5ABD -273F:5ACA E8 EC21 call sub_110 ; (46EE) +273F:5ACA E8 EC21 call character_face_hotspot 273F:5ACD 53 push bx 273F:5ACE E8 FAB0 call sub_129 ; (5581) 273F:5AD1 5B pop bx @@ -13725,10 +13787,10 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:5B35 74 08 jz loc_1163 ; Jump if zero 273F:5B37 3D 0003 cmp ax,3 273F:5B3A 74 8A je loc_ret_1154 ; Jump if equal -273F:5B3C E9 FA42 jmp loc_1102 ; (5581) +273F:5B3C E9 FA42 jmp sub_129 273F:5B3F loc_1163: ; xref 273F:5B14, 5B2A, 5B35 273F:5B3F C6 44 2A 00 mov byte ptr [si+2Ah],0 -273F:5B43 E8 EBA8 call sub_110 ; (46EE) +273F:5B43 E8 EBA8 call character_face_hotspot 273F:5B46 53 push bx 273F:5B47 E8 FA37 call sub_129 ; (5581) 273F:5B4A 5B pop bx @@ -13780,12 +13842,12 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:5B9B 74 08 jz loc_1169 ; Jump if zero 273F:5B9D 3D 0003 cmp ax,3 273F:5BA0 74 CE je loc_ret_1167 ; Jump if equal -273F:5BA2 E9 F9DC jmp loc_1102 ; (5581) +273F:5BA2 E9 F9DC jmp sub_129 273F:5BA5 loc_1169: ; xref 273F:5B9B 273F:5BA5 53 push bx 273F:5BA6 E8 F9D8 call sub_129 ; (5581) 273F:5BA9 5B pop bx -273F:5BAA E8 EB41 call sub_110 ; (46EE) +273F:5BAA E8 EB41 call character_face_hotspot 273F:5BAD 81 3E BA1B 0412 cmp active_hotspot_id, 412h 273F:5BB3 75 08 jne loc_1170 ; Jump if not equal 273F:5BB5 81 3E BA19 2710 cmp use_hotspot_id, 2710h @@ -13871,7 +13933,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:5C39 74 08 jz loc_1178 ; Jump if zero 273F:5C3B 3D 0003 cmp ax,3 273F:5C3E 74 E6 je loc_ret_1177 ; Jump if equal -273F:5C40 E9 F93E jmp loc_1102 ; (5581) +273F:5C40 E9 F93E jmp sub_129 273F:5C43 loc_1178: ; xref 273F:5C39 273F:5C43 B8 014B mov ax,14Bh 273F:5C46 8B 16 BA1B mov dx, active_hotspot_id @@ -13894,7 +13956,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:5C6E 8B 0E BA1B mov cx, active_hotspot_id 273F:5C72 E8 04A7 call talk_setup 273F:5C75 5B pop bx -273F:5C76 E8 EA75 call sub_110 ; (46EE) +273F:5C76 E8 EA75 call character_face_hotspot 273F:5C79 53 push bx 273F:5C7A E8 F904 call sub_129 ; (5581) 273F:5C7D 5B pop bx @@ -13931,12 +13993,12 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:5CB8 74 08 jz loc_1183 ; Jump if zero 273F:5CBA 3D 0003 cmp ax,3 273F:5CBD 74 4C je loc_ret_1186 ; Jump if equal -273F:5CBF E9 F8BF jmp loc_1102 ; (5581) +273F:5CBF E9 F8BF jmp sub_129 273F:5CC2 loc_1183: ; xref 273F:5CB8 273F:5CC2 53 push bx 273F:5CC3 E8 F8C7 call sub_130 ; (558D) 273F:5CC6 5B pop bx -273F:5CC7 E8 EA24 call sub_110 ; (46EE) +273F:5CC7 E8 EA24 call character_face_hotspot 273F:5CCA BB 0009 mov bx,9 273F:5CCD E8 06D2 call display_message_dialog_2 273F:5CD0 E8 F923 call hotspot_get_action_sequence @@ -13977,7 +14039,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:5D0C loc_1187: ; xref 273F:5AC7, 5B90, 5D2F 273F:5D0C B8 000F mov ax,0Fh ; "What???" 273F:5D0F E8 069F call display_message_dialog_3 -273F:5D12 E9 F86C jmp loc_1102 ; (5581) +273F:5D12 E9 F86C jmp sub_129 drink_proc proc near 273F:5D15 8B DD mov bx,bp @@ -14046,17 +14108,18 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:5D7E E8 E826 call sub_107 ; (45A7) 273F:5D81 0B C0 or ax,ax ; Zero ? 273F:5D83 75 03 jnz loc_1195 ; Jump if not zero -273F:5D85 E9 F7F9 jmp loc_1102 ; (5581) +273F:5D85 E9 F7F9 jmp sub_129 273F:5D88 loc_1195: ; xref 273F:5D83 273F:5D88 3D 0003 cmp ax,3 273F:5D8B 74 E3 je loc_ret_1194 ; Jump if equal 273F:5D8D 8B DD mov bx,bp 273F:5D8F 8B 47 FE mov ax,[bx-2] 273F:5D92 8B DE mov bx,si -273F:5D94 03 5C 61 add bx,[si+61h] -273F:5D97 83 C3 63 add bx,63h -273F:5D9A 89 47 01 mov [bx+1],ax +273F:5D94 03 5C 61 add bx, [si+HS_ACTION_OFFSET] +273F:5D97 83 C3 63 add bx, HS_FIRST_ACTION_OFFSET +273F:5D9A 89 47 01 mov [bx+1], ax 273F:5D9D E9 E41E jmp action_dispatch + ;* No entry point to code 273F:5DA0 8B DD mov bx,bp 273F:5DA2 8B 07 mov ax,[bx] @@ -14068,7 +14131,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:5DB1 3D 0003 cmp ax,3 273F:5DB4 74 AE je loc_ret_1192 ; Jump if equal 273F:5DB6 83 C5 0A add bp,0Ah -273F:5DB9 E9 F7C5 jmp loc_1102 ; (5581) +273F:5DB9 E9 F7C5 jmp sub_129 273F:5DBC loc_1196: ; xref 273F:5DAF 273F:5DBC A1 BA1B mov ax, active_hotspot_id 273F:5DBF 56 push si @@ -14101,7 +14164,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:5DFC 5E pop si 273F:5DFD loc_1198: ; xref 273F:5DF0 273F:5DFD 83 C5 08 add bp,8 -273F:5E00 E9 F77E jmp loc_1102 ; (5581) +273F:5E00 E9 F77E jmp sub_129 273F:5E03 loc_ret_1199: ; xref 273F:5DCB 273F:5E03 C3 retn @@ -14111,11 +14174,11 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:5E09 89 44 42 mov [si+42h],ax 273F:5E0C C6 44 44 03 mov byte ptr [si+44h],3 273F:5E10 83 C5 04 add bp,4 -273F:5E13 E9 F76B jmp loc_1102 ; (5581) +273F:5E13 E9 F76B jmp sub_129 ;* No entry point to code -273F:5E16 8B DE mov bx,si -273F:5E18 03 5C 61 add bx,[si+61h] -273F:5E1B 83 C3 63 add bx,63h +273F:5E16 8B DE mov bx, si +273F:5E18 03 5C 61 add bx, [si+HS_ACTION_OFFSET] +273F:5E1B 83 C3 63 add bx, HS_FIRST_ACTION_OFFSET 273F:5E1E 83 47 01 06 add word ptr [bx+1],6 273F:5E22 8B DD mov bx,bp 273F:5E24 8B 17 mov dx,[bx] @@ -14125,8 +14188,8 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:5E2F E9 0319 jmp talk_converse ;* No entry point to code 273F:5E32 8B DE mov bx,si -273F:5E34 03 5C 61 add bx,[si+61h] -273F:5E37 83 C3 63 add bx,63h +273F:5E34 03 5C 61 add bx, [si+HS_ACTION_OFFSET] +273F:5E37 83 C3 63 add bx, HS_FIRST_ACTION_OFFSET 273F:5E3A 83 47 01 04 add word ptr [bx+1],4 273F:5E3E 8B DD mov bx,bp 273F:5E40 8B 07 mov ax,[bx] @@ -14152,60 +14215,61 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:5E5C 83 6C 1F 01 sub word ptr [si+HS_FRAME_CTR],1 273F:5E60 C3 retn 273F:5E61 loc_1200: -273F:5E61 E8 B2A7 call sub_40 ; (110B) +273F:5E61 E8 B2A7 call character_find_impinging_chars 273F:5E64 F6 45 1D FF test byte ptr [di+ANIM_LAYER1_SKIP], 0FFh 273F:5E68 74 13 jz loc_1202 ; Jump if zero 273F:5E6A C7 06 F010 0000 mov timer_ticks, 0 -273F:5E70 F7 06 10BE FFFF test data_615, 0FFFFh +273F:5E70 F7 06 10BE FFFF test num_impinging_chars, 0FFFFh 273F:5E76 74 01 jz loc_1201 ; Jump if zero 273F:5E78 C3 retn 273F:5E79 loc_1201: ; xref 273F:5E76 273F:5E79 C6 45 1D 00 mov byte ptr [di+ANIM_LAYER1_SKIP], 0 273F:5E7D loc_1202: ; xref 273F:5E68 -273F:5E7D 8B 44 58 mov ax, [si+58h] -273F:5E80 0B C0 or ax,ax ; Zero ? +273F:5E7D 8B 44 58 mov ax, [si+HS_V58] +273F:5E80 0B C0 or ax, ax ; Zero ? 273F:5E82 74 19 jz loc_1203 ; Jump if zero 273F:5E84 C7 06 F010 0000 mov timer_ticks, 0 -273F:5E8A C7 44 58 0000 mov word ptr [si+58h],0 +273F:5E8A C7 44 58 0000 mov word ptr [si+HS_V58], 0 273F:5E8F 56 push si 273F:5E90 E8 AE57 call get_room_resource_pointer2 -273F:5E93 80 7C 44 07 cmp byte ptr [si+HS_UNKNOWN1], 7 +273F:5E93 80 7C 44 07 cmp byte ptr [si+HS_V44], 7 273F:5E97 5E pop si -273F:5E98 74 03 jz loc_1203 ; Jump if zero -273F:5E9A C6 07 00 mov byte ptr [bx],0 -273F:5E9D loc_1203: ; xref 273F:5E82, 5E98 -273F:5E9D F7 44 4A FFFF test word ptr [si+4Ah],0FFFFh +273F:5E98 74 03 jz loc_1203 +273F:5E9A C6 07 00 mov byte ptr [bx], 0 ; Reset action + +273F:5E9D loc_1203: +273F:5E9D F7 44 4A FFFF test word ptr [si+HS_V4A], 0FFFFh 273F:5EA2 74 27 jz loc_1205 ; Jump if zero 273F:5EA4 C7 06 F010 0000 mov timer_ticks, 0 -273F:5EAA E8 E4B9 call sub_93 ; (4366) +273F:5EAA E8 E4B9 call character_update_movement 273F:5EAD 8B 45 1B mov ax, [di+ANIM_HOTSPOT_ID] -273F:5EB0 E8 F09F call sub_123 ; (4F52) -273F:5EB3 83 7C 4A 01 cmp word ptr [si+4Ah], 1 +273F:5EB0 E8 F09F call pathfind_reset +273F:5EB3 83 7C 4A 01 cmp word ptr [si+HS_V4A], 1 273F:5EB7 75 0F jne loc_1204 ; Jump if not equal -273F:5EB9 C7 44 4A 0000 mov word ptr [si+4Ah], 0 -273F:5EBE F6 44 44 FF test byte ptr [si+HS_UNKNOWN1], 0FFh +273F:5EB9 C7 44 4A 0000 mov word ptr [si+HS_V4A], 0 +273F:5EBE F6 44 44 FF test byte ptr [si+HS_V44], 0FFh 273F:5EC2 75 07 jnz loc_1205 ; Jump if not zero 273F:5EC4 E8 E4C0 call sub_94 ; (4387) 273F:5EC7 C3 retn 273F:5EC8 loc_1204: ; xref 273F:5EB7 273F:5EC8 E9 E695 jmp loc_869 ; (4560) 273F:5ECB loc_1205: ; xref 273F:5EA2, 5EC2 -273F:5ECB 8A 44 44 mov al, [si+44h] ; Hotspot selected? +273F:5ECB 8A 44 44 mov al, [si+HS_V44] 273F:5ECE 0A C0 or al, al 273F:5ED0 74 44 jz loc_1208 ; Jump if not 273F:5ED2 3C 02 cmp al,2 273F:5ED4 74 40 je loc_1208 ; Jump if equal 273F:5ED6 C7 06 F010 0000 mov timer_ticks, 0 -273F:5EDC F7 44 42 FFFF test word ptr [si+42h],0FFFFh +273F:5EDC F7 44 42 FFFF test word ptr [si+HS_V42], 0FFFFh 273F:5EE1 74 0E jz loc_1206 ; Jump if zero -273F:5EE3 E8 E480 call sub_93 ; (4366) -273F:5EE6 8B 45 1B mov ax,[di+1Bh] -273F:5EE9 E8 F066 call sub_123 ; (4F52) -273F:5EEC 83 6C 42 01 sub word ptr [si+42h],1 +273F:5EE3 E8 E480 call character_update_movement +273F:5EE6 8B 45 1B mov ax, [di+ANIM_HOTSPOT_ID] +273F:5EE9 E8 F066 call pathfind_reset +273F:5EEC 83 6C 42 01 sub word ptr [si+HS_V42], 1 273F:5EF0 C3 retn 273F:5EF1 loc_1206: ; xref 273F:5EE1 273F:5EF1 E8 E493 call sub_94 ; (4387) -273F:5EF4 C6 44 44 00 mov byte ptr [si+HS_UNKNOWN1], 0 +273F:5EF4 C6 44 44 00 mov byte ptr [si+HS_V44], 0 273F:5EF8 F6 44 FF FF test byte ptr [si-1],0FFh 273F:5EFC 74 17 jz loc_ret_1207 ; Jump if zero 273F:5EFE C6 44 FF 00 mov byte ptr [si-1],0 @@ -14213,7 +14277,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:5F05 89 44 54 mov [si+HS_DEST_X], ax 273F:5F08 8B 44 FD mov ax,[si-3] 273F:5F0B 89 44 56 mov [si+HS_DEST_Y], ax -273F:5F0E C6 07 01 mov byte ptr [bx], PLAYER_ACTION_START_WALK +273F:5F0E C6 07 01 mov byte ptr [bx], CHAR_ACTION_START_WALK 273F:5F11 C6 45 27 00 mov byte ptr [di+ANIM_UNKNOWN1], 0 273F:5F15 loc_ret_1207: ; xref 273F:5EFC @@ -14225,17 +14289,17 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:5F1A F6 C4 FF test ah, 0FFh 273F:5F1D 75 08 jnz loc_1209 ; Jump if not zero 273F:5F1F C7 44 52 0000 mov [si+HS_DEST_HOTSPOT], 0 -273F:5F24 E9 E43C jmp loc_842 ; (4363) +273F:5F24 E9 E43C jmp character_update_movement_2 273F:5F27 loc_1209: 273F:5F27 C7 06 F010 0000 mov timer_ticks, 0 -273F:5F2D 80 FC 05 cmp ah, PLAYER_ACTION_CONTINUE_WALK +273F:5F2D 80 FC 05 cmp ah, CHAR_ACTION_CONTINUE_WALK 273F:5F30 74 13 je loc_1211 ; Jump if equal -273F:5F32 80 FC 03 cmp ah, PLAYER_ACTION_EXEC_SCRIPT +273F:5F32 80 FC 03 cmp ah, CHAR_ACTION_EXEC_SCRIPT 273F:5F35 74 11 je loc_1212 ; Jump if equal -273F:5F37 80 FC 01 cmp ah, PLAYER_ACTION_START_WALK +273F:5F37 80 FC 01 cmp ah, CHAR_ACTION_START_WALK 273F:5F3A 74 17 je loc_1213 ; Jump if equal -273F:5F3C 80 FC 04 cmp ah, 4 +273F:5F3C 80 FC 04 cmp ah, CHAR_ACTION_PROCESSING_PATH 273F:5F3F 74 1E je loc_1214 ; Jump if equal 273F:5F41 E8 E27A call action_dispatch @@ -14247,18 +14311,22 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:5F48 E8 B05E call hotspot_script_execute 273F:5F4B 0B C0 or ax,ax ; Zero ? 273F:5F4D 75 F5 jnz loc_ret_1210 ; Jump if not zero -273F:5F4F C6 07 02 mov byte ptr [bx], PLAYER_ACTION_DISPATCH_ACTION +273F:5F4F C6 07 02 mov byte ptr [bx], CHAR_ACTION_DISPATCH_ACTION 273F:5F52 C3 retn ; Code below is responsible for starting the player walking 273F:5F53 loc_1213: ; xref 273F:5F3A 273F:5F53 B8 03E8 mov ax, PLAYER_HOTSPOT_ID -273F:5F56 E8 EFF9 call sub_123 ; (4F52) -273F:5F59 C6 07 04 mov byte ptr [bx], 4 +273F:5F56 E8 EFF9 call pathfind_reset +273F:5F59 C6 07 04 mov byte ptr [bx], CHAR_ACTION_PROCESSING_PATH 273F:5F5C E8 E428 call sub_94 ; (4387) + +; Jump point here calculates one sequence of the path finding required to get +; the player to a given destination + 273F:5F5F loc_1214: ; xref 273F:5F3F -273F:5F5F C6 44 44 00 mov byte ptr [si+HS_UNKNOWN1],0 +273F:5F5F C6 44 44 00 mov byte ptr [si+HS_V44], 0 273F:5F63 E8 E5FA call sub_105 ; (4560) 273F:5F66 8B 4C 54 mov cx, [si+HS_DEST_X] 273F:5F69 8B 54 56 mov dx, [si+HS_DEST_Y] @@ -14268,8 +14336,8 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:5F6F 8B 45 1B mov ax, [di+ANIM_HOTSPOT_ID] 273F:5F72 8B D9 mov bx,cx 273F:5F74 8B CA mov cx,dx -273F:5F76 8A 54 4C mov dl, [si+4Ch] -273F:5F79 E8 EA7A call sub_119 ; (49F6) +273F:5F76 8A 54 4C mov dl, [si+HS_V4C] +273F:5F79 E8 EA7A call character_pathfind 273F:5F7C 8B D3 mov dx,bx 273F:5F7E 5F pop di 273F:5F7F 5E pop si @@ -14278,55 +14346,60 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:5F83 75 01 jnz loc_1215 ; Jump if not zero 273F:5F85 C3 retn -; This code is a further part of handling player movement -; si=player hotspot, di=first animation slot, bx=si+63h +; The code below gets jumped to when the final segment of pathfinding is +; complete. 273F:5F86 loc_1215: -273F:5F86 3D 0001 cmp ax,1 -273F:5F89 74 42 je loc_1218 ; Jump if equal +273F:5F86 3D 0001 cmp ax, 1 +273F:5F89 74 42 je loc_1218 ; Immediate translate 273F:5F8B F6 45 27 01 test byte ptr [di+ANIM_UNKNOWN1], 1 273F:5F8F 75 05 jnz loc_1216 ; Jump if not zero -273F:5F91 3D 0002 cmp ax,2 -273F:5F94 74 37 je loc_1218 ; Jump if equal +273F:5F91 3D 0002 cmp ax, 2 +273F:5F94 74 37 je loc_1218 ; Jump to translate 273F:5F96 loc_1216: ; xref 273F:5F8F -273F:5F96 F6 44 4C FF test byte ptr [si+4Ch],0FFh +273F:5F96 F6 44 4C FF test byte ptr [si+HS_V4C], 0FFh 273F:5F9A 74 31 jz loc_1218 ; Jump if zero -273F:5F9C 80 7C 4C 02 cmp byte ptr [si+4Ch],2 +273F:5F9C 80 7C 4C 02 cmp byte ptr [si+HS_V4C], 2 273F:5FA0 74 17 je loc_1217 ; Jump if equal -273F:5FA2 C6 44 FF 01 mov byte ptr [si-1],1 -273F:5FA6 8B 44 54 mov ax,[si+HS_DEST_X] -273F:5FA9 89 44 FB mov [si-5],ax -273F:5FAC 8B 44 56 mov ax,[si+HS_DEST_Y] -273F:5FAF 89 44 FD mov [si-3],ax -273F:5FB2 80 44 4C 01 add byte ptr [si+4Ch],1 -273F:5FB6 E9 F6AD jmp loc_1108 ; (5666) +273F:5FA2 C6 44 FF 01 mov byte ptr [si-1], 1 +273F:5FA6 8B 44 54 mov ax, [si+HS_DEST_X] +273F:5FA9 89 44 FB mov [si-5], ax +273F:5FAC 8B 44 56 mov ax, [si+HS_DEST_Y] +273F:5FAF 89 44 FD mov [si-3], ax +273F:5FB2 80 44 4C 01 add byte ptr [si+HS_V4C], 1 +273F:5FB6 E9 F6AD jmp sub_133 273F:5FB9 loc_1217: ; xref 273F:5FA0 273F:5FB9 E8 E485 call sub_97 ; (4441) -273F:5FBC C6 44 4C 00 mov byte ptr [si+4Ch],0 -273F:5FC0 C6 07 00 mov byte ptr [bx],0 -273F:5FC3 C6 44 44 06 mov byte ptr [si+44h],6 -273F:5FC7 C7 44 42 0007 mov word ptr [si+42h],7 +273F:5FBC C6 44 4C 00 mov byte ptr [si+HS_V4C], 0 +273F:5FC0 C6 07 00 mov byte ptr [bx], 0 +273F:5FC3 C6 44 44 06 mov byte ptr [si+HS_V44], 6 +273F:5FC7 C7 44 42 0007 mov word ptr [si+HS_V42], 7 273F:5FCC C3 retn -273F:5FCD loc_1218: ; xref 273F:5F89, 5F94, 5F9A -273F:5FCD C6 44 4C 00 mov byte ptr [si+4Ch],0 -273F:5FD1 8B C3 mov ax,bx -273F:5FD3 8B DA mov bx,dx -273F:5FD5 8B 0F mov cx,[bx] -273F:5FD7 8B D8 mov bx,ax -273F:5FD9 0B C9 or cx,cx ; Zero ? +273F:5FCD loc_1218: ; dx => movement data +273F:5FCD C6 44 4C 00 mov byte ptr [si+HS_V44], 0 +273F:5FD1 8B C3 mov ax, bx +273F:5FD3 8B DA mov bx, dx +273F:5FD5 8B 0F mov cx, [bx] +273F:5FD7 8B D8 mov bx, ax +273F:5FD9 0B C9 or cx, cx ; Zero ? 273F:5FDB 74 56 jz loc_1223 ; Jump if zero -273F:5FDD C6 07 05 mov byte ptr [bx],5 -273F:5FE0 E8 E22A call sub_90 ; Load movement frames? -273F:5FE3 83 65 02 F8 and word ptr [di+2],0FFF8h -273F:5FE7 83 64 0F F8 and word ptr [si+0Fh],0FFF8h +273F:5FDD C6 07 05 mov byte ptr [bx], CHAR_ACTION_CONTINUE_WALK +273F:5FE0 E8 E22A call character_translate_movements +273F:5FE3 83 65 02 F8 and [di+ANIM_Y], 0FFF8h +273F:5FE7 83 64 0F F8 and [si+HS_Y], 0FFF8h + +; The buffer pointed to by HS[HS_MOVEMENT_SRC_OFFSET] now contains a set of +; direction numbers and steps necessary to get the player to the destination +; they've clicked on - carry on to st ; Code jumps to this point to handle the continual walking -273F:5FEB loc_1219: ; xref 273F:5F45 + +273F:5FEB loc_1219: 273F:5FEB 8B 44 52 mov ax, [si+HS_DEST_HOTSPOT] 273F:5FEE 0B C0 or ax,ax ; Walking to a room exit hotspot: 273F:5FF0 74 17 jz loc_1221 ; No, straight walking -273F:5FF2 3D FFFF cmp ax,0FFFFh +273F:5FF2 3D FFFF cmp ax, 0FFFFh 273F:5FF5 74 12 je loc_1221 273F:5FF7 56 push si 273F:5FF8 53 push bx @@ -14334,9 +14407,9 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:5FFC 8A 44 0C mov al, [si+REHS_EXIT_BLOCKED] 273F:5FFF 5B pop bx 273F:6000 5E pop si -273F:6001 0A C0 or al,al ; Is exit now blocked? +273F:6001 0A C0 or al, al ; Is exit now blocked? 273F:6003 74 04 jz loc_1221 ; Keep walking if not -273F:6005 C6 07 00 mov byte ptr [bx],0 ; Stop the player walking +273F:6005 C6 07 00 mov byte ptr [bx], 0 ; Stop the player walking 273F:6008 loc_ret_1220: ; xref 273F:600E 273F:6008 C3 retn @@ -14347,17 +14420,17 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:6010 E8 AE9D call character_update_frame 273F:6013 0A C0 or al, al ; Zero ? 273F:6015 74 1F jz loc_1224 ; Jump if zero -273F:6017 80 3E 9834 04 cmp byte ptr data_427,4 ; (273F:9834=0F9h) +273F:6017 80 3E 9834 04 cmp byte ptr data_1084,4 ; (273F:9834=0F9h) 273F:601C 75 05 jne loc_1222 ; Jump if not equal -273F:601E C6 06 9834 00 mov byte ptr data_427,0 ; (273F:9834=0F9h) +273F:601E C6 06 9834 00 mov byte ptr data_1084,0 ; (273F:9834=0F9h) 273F:6023 loc_1222: ; xref 273F:601C 273F:6023 F6 44 FF FF test byte ptr [si-1], 0FFh 273F:6027 74 0A jz loc_1223 ; Jump if zero -273F:6029 C6 44 44 06 mov byte ptr [si+HS_UNKNOWN1], 6 -273F:602D C7 44 42 000F mov word ptr [si+42h], 0Fh +273F:6029 C6 44 44 06 mov byte ptr [si+HS_V44], 6 +273F:602D C7 44 42 000F mov word ptr [si+HS_V42], 0Fh 273F:6032 C3 retn 273F:6033 loc_1223: ; xref 273F:5FDB, 6027 -273F:6033 C6 07 02 mov byte ptr [bx], PLAYER_ACTION_DISPATCH_ACTION +273F:6033 C6 07 02 mov byte ptr [bx], CHAR_ACTION_DISPATCH_ACTION 273F:6036 loc_1224: ; xref 273F:6015 273F:6036 E9 E24F jmp character_check_room_change @@ -14370,26 +14443,26 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ 273F:6039 sub_136 proc near -273F:6039 8B 7C 0B mov di,[si+0Bh] -273F:603C E8 E46A call sub_99 ; (44A9) -273F:603F 75 30 jnz loc_1225 ; Jump if not zero -273F:6041 8B DE mov bx,si -273F:6043 03 5C 61 add bx,[si+61h] -273F:6046 83 C3 63 add bx,63h -273F:6049 C6 44 FF 01 mov byte ptr [si-1],1 -273F:604D 8B 44 54 mov ax,[si+HS_DEST_X] -273F:6050 89 44 FB mov [si-5],ax +273F:6039 8B 7C 0B mov di, [si+HS_ANIM_OFFSET] +273F:603C E8 E46A call check_for_impinging_characters +273F:603F 75 30 jnz loc_1225 ; Character found +273F:6041 8B DE mov bx, si +273F:6043 03 5C 61 add bx, [si+HS_ACTION_OFFSET] +273F:6046 83 C3 63 add bx, HS_FIRST_ACTION_OFFSET +273F:6049 C6 44 FF 01 mov byte ptr [si-1], 1 +273F:604D 8B 44 54 mov ax, [si+HS_DEST_X] +273F:6050 89 44 FB mov [si-5], ax 273F:6053 8B 44 56 mov ax,[si+HS_DEST_Y] -273F:6056 89 44 FD mov [si-3],ax -273F:6059 C6 06 9834 04 mov byte ptr data_427,4 ; (273F:9834=0F9h) -273F:605E C6 44 2A 00 mov byte ptr [si+2Ah],0 -273F:6062 80 44 4C 01 add byte ptr [si+4Ch],1 +273F:6056 89 44 FD mov [si-3], ax +273F:6059 C6 06 9834 04 mov byte ptr data_1084,4 ; (273F:9834=0F9h) +273F:605E C6 44 2A 00 mov byte ptr [si+2Ah], 0 +273F:6062 80 44 4C 01 add byte ptr [si+4Ch], 1 273F:6066 C7 44 52 0000 mov word ptr [si+HS_DEST_HOTSPOT], 0 273F:606B E8 F5F8 call sub_133 ; (5666) -273F:606E 33 C0 xor ax,ax ; Zero register +273F:606E 33 C0 xor ax, ax ; Zero register 273F:6070 C3 retn 273F:6071 loc_1225: ; xref 273F:603F -273F:6071 0D 0001 or ax,1 +273F:6071 0D 0001 or ax, 1 273F:6074 loc_ret_1226: ; xref 273F:60D3 273F:6074 C3 retn @@ -14407,9 +14480,9 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:6078 8B 7C 0B mov di, [si+HS_ANIM_OFFSET] ; Get player anim rec 273F:607B C6 45 1D 2A mov byte ptr [di+1Dh], 2Ah 273F:607F 8B DE mov bx, si -273F:6081 03 5F 61 add bx, [bx+61h] -273F:6084 83 C3 63 add bx,63h -273F:6087 C6 07 00 mov byte ptr [bx],0 +273F:6081 03 5F 61 add bx, [bx+HS_ACTION_OFFSET] +273F:6084 83 C3 63 add bx, HS_FIRST_ACTION_OFFSET +273F:6087 C6 07 00 mov byte ptr [bx], CHAR_ACTION_NONE 273F:608A A1 9832 mov ax, room_number 273F:608D 89 45 0E mov [di+ANIM_ROOM_NUM], ax ; Set player's room # 273F:6090 89 44 06 mov [si+HS_ROOM_NUM], ax @@ -14457,8 +14530,8 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:60E1 loc_1230: ; xref 273F:6106 273F:60E1 úBF B14E mov di, offset animation_table 273F:60E4 BE 6CEF mov si, offset player_hotspot_rec -273F:60E7 E8 B021 call sub_40 ; (110B) -273F:60EA F7 06 10BE FFFF test data_615, 0FFFFh +273F:60E7 E8 B021 call character_find_impinging_chars +273F:60EA F7 06 10BE FFFF test num_impinging_chars, 0FFFFh 273F:60F0 74 16 jz loc_ret_1231 ; Jump if zero 273F:60F2 FF 36 6D06 push data_900 ; (31E4:6D06=5E44h) 273F:60F6 C7 06 6D06 41BD mov data_900,41BDh ; (31E4:6D06=5E44h) @@ -14619,10 +14692,10 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:61BF 89 1E BA1B mov active_hotspot_id, bx 273F:61C3 50 push ax 273F:61C4 53 push bx -273F:61C5 E8 E532 call sub_111 ; (46FA) +273F:61C5 E8 E532 call character_face_hotspot_2 273F:61C8 58 pop ax 273F:61C9 5B pop bx -273F:61CA E8 E52D call sub_111 ; (46FA) +273F:61CA E8 E52D call character_face_hotspot_2 273F:61CD loc_1242: ; xref 273F:61B7 273F:61CD 5B pop bx 273F:61CE C3 retn @@ -15003,7 +15076,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:648B 3B 1E 9841 cmp bx,data_436 ; (273F:9841=20EFh) 273F:648F 74 1E je loc_1273 ; Jump if equal 273F:6491 loc_1270: ; xref 273F:6480 -273F:6491 F6 06 9849 FF test byte ptr data_440,0FFh ; (273F:9849=64h) +273F:6491 F6 06 9849 FF test pathfind_data, 0FFh 273F:6496 75 16 jnz loc_ret_1272 ; Jump if not zero 273F:6498 F7 06 9838 FFFF test data_431,0FFFFh ; (273F:9838=5C8Bh) 273F:649E 74 07 jz loc_1271 ; Jump if zero @@ -16752,25 +16825,25 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 ; Called from: 273F:4380, 721C ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ -273F:712E sub_178 proc near -273F:712E loc_1413: ; xref 273F:10D0, 800C + pathfind_flag_covered_cells proc near 273F:712E ú53 push bx -273F:712F E8 D262 call sub_95 ; (4394) -273F:7132 74 0D jz loc_1416 ; Jump if zero - -273F:7134 locloop_1414: ; xref 273F:713F -273F:7134 09 07 or [bx],ax -273F:7136 D0 E8 shr al,1 ; Shift w/zeros fill -273F:7138 73 05 jnc loc_1415 ; Jump if carry=0 -273F:713A 83 C3 01 add bx,1 -273F:713D B0 80 mov al,80h -273F:713F loc_1415: ; xref 273F:7138 -273F:713F E2 F3 loop locloop_1414 ; Loop if cx > 0 - -273F:7141 loc_1416: ; xref 273F:7132 +273F:712F E8 D262 call pathfind_get_cell +273F:7132 74 0D jz loc_1416 ; Exit if animation offscreen + +273F:7134 locloop_1414: +273F:7134 09 07 or [bx], ax ; Flag cell as covered + +273F:7136 D0 E8 shr al, 1 ; Rotate bit mask +273F:7138 73 05 jnc loc_1415 ; Jump if not passed bit 0 +273F:713A 83 C3 01 add bx, 1 ; Move to next byte in data +273F:713D B0 80 mov al, 80h ; Reset bit mask +273F:713F loc_1415: +273F:713F E2 F3 loop locloop_1414 ; Loop for remaining cells + +273F:7141 loc_1416: 273F:7141 5B pop bx 273F:7142 C3 retn - sub_178 endp + pathfind_flag_covered_cells endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß @@ -16779,10 +16852,9 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 ; Called from: 273F:7245 ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ -273F:7143 sub_179 proc near -273F:7143 loc_1417: ; xref 273F:4391 + pathfind_clear_covered_cells proc near 273F:7143 53 push bx -273F:7144 E8 D24D call sub_95 ; (4394) +273F:7144 E8 D24D call pathfind_get_cell 273F:7147 74 12 jz loc_1420 ; Jump if zero 273F:7149 32 E4 xor ah,ah ; Zero register 273F:714B F7 D0 not ax @@ -16799,7 +16871,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:715B loc_1420: ; xref 273F:7147 273F:715B 5B pop bx 273F:715C C3 retn - sub_179 endp + pathfind_clear_covered_cells endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE @@ -16874,7 +16946,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:71CE 8B 5C 21 mov bx, [si+HS_PIXEL_OFFSET] ; Get animation record 273F:71D1 8B 47 03 mov ax, [bx+PIXEL_DATA_SEGMENT] ; Get pixel data segment 273F:71D4 89 45 0A mov [di+ANIM_SEGMENT], ax ; Set it in animation -273F:71D7 33 C9 xor cx,cx +273F:71D7 33 C9 xor cx, cx 273F:71D9 F6 47 02 04 test byte ptr [bx+PIXEL_FLAGS], PIXELFLAG_HAS_TABLE 273F:71DD 74 07 jz loc_1422 ; Jump if zero 273F:71DF 8E C0 mov es, ax @@ -16899,15 +16971,15 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:71F1 loc_1423: ; xref 273F:71FD 273F:71F1 ú3B 04 cmp ax, [si] 273F:71F3 74 0A je loc_1424 ; Jump if equal -273F:71F5 3B 44 06 cmp ax, [si+REHS_HOTSPOT_2] +273F:71F5 3B 44 06 cmp ax, [si+REHS_HOTSPOT2_ID] 273F:71F8 74 09 je loc_1425 ; Jump if equal 273F:71FA 83 C6 11 add si, REHS_RECORD_SIZE 273F:71FD EB F2 jmp short loc_1423 ; (71F1) 273F:71FF loc_1424: ; xref 273F:71F3 -273F:71FF BB 0002 mov bx, REHS_RESULT_1 +273F:71FF BB 0002 mov bx, REHS_HOTSPOT1_CURRENT_FRAME 273F:7202 C3 retn 273F:7203 loc_1425: ; xref 273F:71F8 -273F:7203 BB 0008 mov bx, REHS_RESULT_2 +273F:7203 BB 0008 mov bx, REHS_HOTSPOT2_CURRENT_FRAME 273F:7206 C3 retn room_exit_hs_get_pointer endp @@ -16929,17 +17001,17 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:7212 74 2A jz loc_1427 ; Jump if exit blocked ; Eexecution reaches this point if the room exit is blocked -273F:7214 8A 00 mov al,[bx+si] ; Get frame number -273F:7216 3A 40 01 cmp al,[bx+si+1] ; Check against dest frame +273F:7214 8A 00 mov al, [bx+si] ; Get frame number +273F:7216 3A 40 01 cmp al, [bx+si+1] ; Check against dest frame 273F:7219 74 12 je loc_1426 ; If equal, go set frame 273F:721B 50 push ax -273F:721C E8 FF0F call sub_178 ; (712E) +273F:721C E8 FF0F call pathfind_flag_covered_cells 273F:721F 58 pop ax -273F:7220 04 01 add al,1 ; Move to next frame -273F:7222 3A 40 01 cmp al,[bx+si+1] ; Reached end frame yet? +273F:7220 04 01 add al, 1 ; Move to next frame +273F:7222 3A 40 01 cmp al, [bx+si+1] ; Reached end frame yet? 273F:7225 75 06 jne loc_1426 ; No, so go set frame -273F:7227 B9 0001 mov cx,1 -273F:722A E8 00DA call sub_184 ; (7307) +273F:7227 B9 0001 mov cx, 1 +273F:722A E8 00DA call room_exit_play_sound ; The code below sets the frame number and offset of the given hotspot to the # in AL 273F:722D loc_1426: @@ -16956,29 +17028,29 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 ; Execution reaches this pointer if the room exit is currently active 273F:723E loc_1427: -273F:723E 8A 00 mov al,[bx+si] ; Get frame number -273F:7240 0A C0 or al,al ; Zero ? +273F:723E 8A 00 mov al, [bx+si] ; Get frame number +273F:7240 0A C0 or al, al ; Zero ? 273F:7242 74 E9 jz loc_1426 ; If zero, go set and exit 273F:7244 50 push ax -273F:7245 E8 FEFB call sub_179 ; (7143) +273F:7245 E8 FEFB call pathfind_clear_covered_cells 273F:7248 58 pop ax -273F:7249 3A 40 01 cmp al,[bx+si+1] ; Current frame at end frame? +273F:7249 3A 40 01 cmp al, [bx+si+1] ; Current frame at end frame? 273F:724C 75 19 jne loc_1428 ; No, so go move back 1 frame -273F:724E 33 C9 xor cx,cx ; Zero register -273F:7250 E8 00B4 call sub_184 ; (7307) +273F:724E 33 C9 xor cx, cx ; Zero register +273F:7250 E8 00B4 call room_exit_play_sound 273F:7253 80 3E BAB9 01 cmp byte ptr script_val_88, 1 273F:7258 75 0D jne loc_1428 ; Jump if not equal 273F:725A 53 push bx 273F:725B 50 push ax -273F:725C B8 0C00 mov ax,0C00h -273F:725F 32 DB xor bl,bl ; Zero register -273F:7261 FF 1E 5662 call dword ptr data_351 ; (273F:5662=8963h) +273F:725C B8 0C00 mov ax, 0C00h +273F:725F 32 DB xor bl, bl ; Zero register +273F:7261 FF 1E 5662 call dword ptr [play_music_proc] 273F:7265 58 pop ax 273F:7266 5B pop bx 273F:7267 loc_1428: -273F:7267 2C 01 sub al,1 ; Move to prior frame +273F:7267 2C 01 sub al, 1 ; Move to prior frame 273F:7269 EB C2 jmp short loc_1426 ; Go set frame room_exits_tick_proc endp @@ -17000,18 +17072,18 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:7273 úBE B14E mov si, offset animation_table 273F:7276 B9 002D mov cx, NUM_ANIMATION_SLOTS 273F:7279 8B 07 mov ax,[bx] -273F:727B A3 10E6 mov word ptr ds:[10E6h],ax ; (273F:10E6=0C329h) +273F:727B A3 10E6 mov char_rect_left, ax 273F:727E 03 47 13 add ax,[bx+13h] -273F:7281 A3 10E8 mov word ptr ds:[10E8h],ax ; (273F:10E8=4EBFh) +273F:7281 A3 10E8 mov char_rect_right, ax 273F:7284 8B 47 02 mov ax,[bx+2] 273F:7287 03 47 15 add ax,[bx+15h] 273F:728A 50 push ax 273F:728B 2B 47 17 sub ax,[bx+17h] 273F:728E 2B 47 22 sub ax,[bx+22h] -273F:7291 A3 10EA mov word ptr ds:[10EAh],ax ; (273F:10EA=0B9B1h) +273F:7291 A3 10EA mov char_rect_top, ax 273F:7294 58 pop ax 273F:7295 03 47 22 add ax,[bx+22h] -273F:7298 A3 10EC mov word ptr ds:[10ECh],ax ; (273F:10EC=2Dh) +273F:7298 A3 10EC mov char_rect_bottom, ax 273F:729B locloop_1429: ; xref 273F:72FC 273F:729B 3B FE cmp di, si ; Reached anim pointed to by DI? @@ -17034,10 +17106,10 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:72C0 3D FFFE cmp ax,0FFFEh 273F:72C3 73 34 jae loc_1431 ; Skip if Id is 0fffeh or 0ffffh 273F:72C5 8B 04 mov ax, [si] ; Get anim x pos -273F:72C7 3B 06 10E8 cmp ax, word ptr ds:[10E8h] ; More than set X pos? +273F:72C7 3B 06 10E8 cmp ax, char_rect_right ; More than set X pos? 273F:72CB 73 2C jae loc_1431 ; If yes, skip entry 273F:72CD 03 44 13 add ax,[si+13h] ; Copy of anim width -273F:72D0 3B 06 10E6 cmp ax,word ptr ds:[10E6h] ; Compare against loaded right +273F:72D0 3B 06 10E6 cmp ax, char_rect_left ; Compare against loaded right 273F:72D4 72 23 jb loc_1431 ; Skip if less or equal 273F:72D6 74 21 jz loc_1431 @@ -17049,12 +17121,12 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:72DB 03 44 15 add ax,[si+15h] ; Add copy of anim height 273F:72DE 8B E8 mov bp,ax 273F:72E0 03 44 22 add ax,[si+22h] ; ??? -273F:72E3 3B 06 10EA cmp ax,word ptr ds:[10EAh] ; (273F:10EA=0B9B1h) +273F:72E3 3B 06 10EA cmp ax, char_rect_top 273F:72E7 72 10 jb loc_1431 ; Not meeting Y start 273F:72E9 8B C5 mov ax, bp 273F:72EB 2B 44 17 sub ax, [si+17h] 273F:72EE 2B 44 22 sub ax, [si+22h] -273F:72F1 3B 06 10EC cmp ax, word ptr ds:[10ECh] +273F:72F1 3B 06 10EC cmp ax, char_rect_bottom 273F:72F5 74 0B je loc_1432 ; Jump if equal 273F:72F7 72 09 jc loc_1432 ; Jump if carry Set 273F:72F9 loc_1431: ; xref 273F:729D, 72A1, 72A7, 72AC @@ -17080,33 +17152,33 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 ; Called from: 273F:722A, 7250 ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ -273F:7307 sub_184 proc near + room_exit_play_sound proc near 273F:7307 50 push ax 273F:7308 56 push si 273F:7309 53 push bx 273F:730A 57 push di 273F:730B 8B 16 9832 mov dx, room_number -273F:730F 8B 7C 0D mov di,[si+0Dh] -273F:7312 83 FB 02 cmp bx,2 -273F:7315 74 03 je loc_1434 ; Jump if equal -273F:7317 8B 7C 0F mov di,[si+0Fh] +273F:730F 8B 7C 0D mov di, [si+REHS_HOTSPOT1_OFFSET] +273F:7312 83 FB 02 cmp bx, 2 +273F:7315 74 03 je loc_1434 +273F:7317 8B 7C 0F mov di, [si+REHS_HOTSPOT2_OFFSET] 273F:731A loc_1434: ; xref 273F:7315 -273F:731A 3B 55 06 cmp dx,[di+6] +273F:731A 3B 55 06 cmp dx, [di+HS_ROOM_NUM] 273F:731D 75 10 jne loc_1435 ; Jump if not equal -273F:731F 03 D9 add bx,cx -273F:7321 8A 58 02 mov bl,[bx+si+2] -273F:7324 32 FF xor bh,bh ; Zero register -273F:7326 0B DB or bx,bx ; Zero ? +273F:731F 03 D9 add bx, cx +273F:7321 8A 58 02 mov bl, [bx+si+2] +273F:7324 32 FF xor bh, bh +273F:7326 0B DB or bx, bx ; Zero ? 273F:7328 74 05 jz loc_1435 ; Jump if zero -273F:732A E8 2CD0 call play_sound ; (9FFD) -273F:732D 8B CE mov cx,si +273F:732A E8 2CD0 call play_sound +273F:732D 8B CE mov cx, si 273F:732F loc_1435: ; xref 273F:731D, 7328 273F:732F 5F pop di 273F:7330 5B pop bx 273F:7331 5E pop si 273F:7332 58 pop ax 273F:7333 C3 retn - sub_184 endp + room_exit_play_sound endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß @@ -17811,9 +17883,9 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:7778 C6 06 4F8A 01 mov byte ptr data_817,1 ; (31E4:4F8A=0) 273F:777D 53 push bx 273F:777E 8B DE mov bx,si -273F:7780 03 5C 61 add bx,[si+61h] -273F:7783 83 C3 63 add bx,63h -273F:7786 C6 07 02 mov byte ptr [bx],2 +273F:7780 03 5C 61 add bx, [si+HS_ACTION_OFFSET] +273F:7783 83 C3 63 add bx, HS_FIRST_ACTION_OFFSET +273F:7786 C6 07 02 mov byte ptr [bx], 2 273F:7789 5B pop bx 273F:778A loc_1507: 273F:778A 33 C0 xor ax,ax ; Couldn't resolve @@ -18498,21 +18570,21 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ 0C07:7C14 8B DE mov bx, si -0C07:7C16 03 5C 61 add bx, [si+61h] -0C07:7C19 83 C3 63 add BX, 63 +0C07:7C16 03 5C 61 add bx, [si+HS_ACTION_OFFSET] +0C07:7C19 83 C3 63 add BX, HS_FIRST_ACTION_OFFSET 0C07:7C1C F7 06 BA5F FFFF test script_val_37, 0FFFFh 0C07:7C22 75 38 jnz loc_1548_2 -0C07:7C24 8B DE mov BX,SI -0C07:7C26 03 5C 61 add BX,[SI+61] -0C07:7C29 83 C3 63 add BX,+63 -0C07:7C2C F7 44 61 FFFF test WORD PTR [SI+61], 0FFFFh +0C07:7C24 8B DE mov bx, si +0C07:7C26 03 5C 61 add bx, [si+HS_ACTION_OFFSET] +0C07:7C29 83 C3 63 add bx, HS_FIRST_ACTION_OFFSET +0C07:7C2C F7 44 61 FFFF test word ptr [si+HS_ACTION_OFFSET], 0FFFFh 0C07:7C31 75 29 jnz loc_1548_2 -0C07:7C33 8B 47 03 mov AX, [bx+3] -0C07:7C36 3B 44 06 cmp AX, [si+6] +0C07:7C33 8B 47 03 mov ax, [bx+3] +0C07:7C36 3B 44 06 cmp ax, [si+6] 0C07:7C39 74 21 jz loc_1548_2 -0C07:7C3B A1 6CF5 mov AX, [6CF5h] -0C07:7C3E 53 push BX -0C07:7C3F 81 7D 1B 03EF cmp word ptr [DI+1Bh], 03EFh +0C07:7C3B A1 6CF5 mov ax, [6CF5h] +0C07:7C3E 53 push bx +0C07:7C3F 81 7D 1B 03EF cmp word ptr [DI+ANIM_HOTSPOT_ID], 03EFh 0C07:7C44 74 12 JZ 7C58 0C07:7C46 BB 4F6D mov bx, 4F6Dh 0C07:7C49 83 C3 02 add bx, 2 @@ -18533,8 +18605,8 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:7C63 F6 06 4F8A FF test byte ptr ds:[4F8Ah],0FFh ; (273F:4F8A=0E8h) 273F:7C68 74 24 jz loc_1549 ; Jump if zero 273F:7C6A C6 06 4F8A 00 mov byte ptr ds:[4F8Ah],0 ; (273F:4F8A=0E8h) -273F:7C6F 83 44 61 05 add word ptr [si+61h],5 -273F:7C73 83 C3 05 add bx,5 +273F:7C6F 83 44 61 05 add word ptr [si+HS_ACTION_OFFSET], CURRENT_ACTION_RECORD_SIZE +273F:7C73 83 C3 05 add bx, CURRENT_ACTION_RECORD_SIZE 273F:7C76 C6 44 4D 00 mov byte ptr [si+4Dh],0 273F:7C7A C7 47 01 13C2 mov word ptr [bx+1],13C2h 273F:7C7F C6 07 02 mov byte ptr [bx],2 @@ -18586,21 +18658,21 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:7CEB 83 3F FE cmp word ptr [bx],0FFFEh 273F:7CEE 75 2A jne loc_1556 ; Jump if not equal 273F:7CF0 8B DE mov bx,si -273F:7CF2 03 5C 61 add bx,[si+61h] -273F:7CF5 83 C3 63 add bx,63h +273F:7CF2 03 5C 61 add bx, [si+HS_ACTION_OFFSET] +273F:7CF5 83 C3 63 add bx, HS_FIRST_ACTION_OFFSET 273F:7CF8 C6 07 02 mov byte ptr [bx],2 273F:7CFB C7 06 0001 69D3 mov word ptr ds:[1],69D3h ; (273F:0001=31E4h) 273F:7D01 C7 06 69D3 0020 mov word ptr ds:[69D3h],20h ; (273F:69D3=8006h) 273F:7D07 C7 06 69D5 0000 mov word ptr ds:[69D5h],0 ; (273F:69D5=433h) 273F:7D0D 83 C1 02 add cx,2 -273F:7D10 83 44 61 05 add word ptr [si+61h],5 -273F:7D14 8B 44 06 mov ax,[si+6] +273F:7D10 83 44 61 05 add word ptr [si+HS_ACTION_OFFSET], CURRENT_ACTION_RECORD_SIZE +273F:7D14 8B 44 06 mov ax,[si+HS_ROOM_NUM] 273F:7D17 89 47 08 mov [bx+8],ax 273F:7D1A loc_1556: ; xref 273F:7CEE 273F:7D1A 8B DE mov bx,si -273F:7D1C 03 5C 61 add bx,[si+61h] -273F:7D1F 83 C3 63 add bx,63h -273F:7D22 C6 07 02 mov byte ptr [bx],2 +273F:7D1C 03 5C 61 add bx,[si+HS_ACTION_OFFSET] +273F:7D1F 83 C3 63 add bx, HS_FIRST_ACTION_OFFSET +273F:7D22 C6 07 02 mov byte ptr [bx], CHAR_ACTION_DISPATCH_ACTION 273F:7D25 89 4F 01 mov [bx+1],cx 273F:7D28 C6 44 44 00 mov byte ptr [si+44h],0 273F:7D2C E8 C73D call random @@ -18960,7 +19032,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:7F12 8B 44 06 mov ax, [si+HS_ROOM_NUM] ; Is Skorl in the same 273F:7F15 3B 47 06 cmp ax, [bx+HS_ROOM_NUM] ; room as the player? 273F:7F18 75 0A jnz vskorl_2 ; No, so skip -273F:7F1A E8 84 D6 call skorl_caught_check ; Check if Skorl has 'caught' player +273F:7F1A E8 84 D6 call characters_impinging_check ; Check if Skorl has 'caught' player 273F:7F1D 74 05 jz vskorl_2 273F:7F1F 80 0E 073D 70 or status_flags2, FLAG_RESTART || FLAG_CAUGHT || FLAG_RESTORERESTART @@ -19015,7 +19087,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:7F54 F6 44 2A FF test byte ptr [si+2Ah],0FFh 273F:7F58 75 0D jnz loc_1598 ; Jump if not zero 273F:7F5A úBB 6CEF mov bx, offset player_hotspot_rec -273F:7F5D E8 D641 call skorl_caught_check +273F:7F5D E8 D641 call characters_impinging_check 273F:7F60 74 04 jz loc_ret_1597 ; Jump if zero 273F:7F62 80 44 2A 01 add byte ptr [si+2Ah],1 @@ -19070,7 +19142,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:7FC4 C7 07 0120 mov word ptr [bx],120h 273F:7FC8 C7 47 02 00E0 mov word ptr [bx+2],0E0h 273F:7FCD C6 47 26 01 mov byte ptr [bx+26h],1 -273F:7FD1 E8 C6DD call sub_109 ; (46B1) +273F:7FD1 E8 C6DD call character_reset_direction 273F:7FD4 C6 44 44 00 mov byte ptr [si+44h],0 273F:7FD8 C6 44 49 00 mov byte ptr [si+49h],0 273F:7FDC C6 06 70FD 00 mov byte ptr ds:[70FDh],0 ; (273F:70FD=79h) @@ -19101,17 +19173,22 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 fire_tick_proc proc near 273F:8009 E8 FF2E call std_animation_tick_proc -273F:800C E9 F11F jmp loc_1413 ; (712E) - fire_tick_proc endp +273F:800C E9 F11F jmp pathfind_flag_covered_cells + fire_tick_proc endp -273F:800F C6 44 2A 00 mov byte ptr [si+2A], 0 -273F:8013 loc_1600: ; xref 273F:8269, 83C8, 840E, 84C7 + ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß + ; SUBROUTINE + ; + ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ + +273F:800F C6 44 2A 00 mov byte ptr [si+HS_FRAME_NUM], 0 +273F:8013 loc_set_frame_offset: ; xref 273F:8269, 83C8, 840E, 84C7 ; 84D2, 85D1 -273F:8013 ú8A 44 2A mov al,[si+2Ah] -273F:8016 32 E4 xor ah,ah ; Zero register -273F:8018 8B 5C 21 mov bx,[si+21h] -273F:801B F7 67 07 mul word ptr [bx+7] ; dx:ax = data * ax -273F:801E 89 45 08 mov [di+8],ax +273F:8013 ú8A 44 2A mov al, [si+HS_FRAME_NUM] +273F:8016 32 E4 xor ah, ah ; Zero register +273F:8018 8B 5C 21 mov bx, [si+HS_PIXEL_OFFSET] +273F:801B F7 67 07 mul word ptr [bx+PIXEL_FRAME_SIZE] +273F:801E 89 45 08 mov [di+ANIM_FRAME_OFFSET], ax 273F:8021 C3 retn ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß @@ -19124,8 +19201,8 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:8028 C6 44 0C 00 mov byte ptr [si+0Ch],0 ; Mark door open 273F:802C úBE 70B9 mov si, 70B9h 273F:802F 8B DE mov bx,si -273F:8031 03 5C 61 add bx,[si+61h] -273F:8034 83 C3 63 add bx,63h +273F:8031 03 5C 61 add bx, [si+ACTION_OFFSET] +273F:8034 83 C3 63 add bx, HS_FIRST_ACTION_OFFSET 273F:8037 C7 47 03 0007 mov word ptr [bx+3],7 273F:803C 33 C0 xor ax,ax ; Zero register 273F:803E 8B 5F 01 mov bx,[bx+1] @@ -19423,7 +19500,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:8264 B0 02 mov al,2 273F:8266 loc_1619: ; xref 273F:825A, 8262 273F:8266 88 44 2A mov [si+2Ah], al -273F:8269 E9 FDA7 jmp loc_1600 +273F:8269 E9 FDA7 jmp loc_set_frame_offset head_animation_tick_proc endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß @@ -19467,23 +19544,28 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ 273F:8287 sub_211 proc near -273F:8287 úBB 502A mov bx,502Ah ; (273F:502A=0) -273F:828A B9 0003 mov cx,3 -273F:828D 8B 44 06 mov ax,[si+6] +273F:8287 úBB 502A mov bx, offset sub_211_list +273F:828A B9 0003 mov cx, 3 +273F:828D 8B 44 06 mov ax, [si+HS_ROOM_NUM] 273F:8290 locloop_1620: ; xref 273F:8297 -273F:8290 39 07 cmp [bx],ax -273F:8292 74 08 je loc_1621 ; Jump if equal -273F:8294 83 C3 04 add bx,4 +273F:8290 39 07 cmp [bx], ax ; Found entry for room #? +273F:8292 74 08 je loc_1621 ; Exit if yes +273F:8294 83 C3 04 add bx, 4 273F:8297 E2 F7 loop locloop_1620 ; Loop if cx > 0 -273F:8299 33 DB xor bx,bx ; Zero register +273F:8299 33 DB xor bx,bx ; Zero return 273F:829B C3 retn 273F:829C loc_1621: ; xref 273F:8292 -273F:829C 8B 5F 02 mov bx,[bx+2] +273F:829C 8B 5F 02 mov bx, [bx+2] 273F:829F C3 retn sub_211 endp + ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß + ; SUBROUTINE + ; + ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ + ;* No entry point to code 273F:82A0 E8 DED5 call talk_countdown_handler 273F:82A3 F7 44 1F FFFF test word ptr [si+1Fh],0FFFFh @@ -19618,7 +19700,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:83C1 0A C0 or al,al ; Zero ? 273F:83C3 74 06 jz loc_1641 ; Jump if zero 273F:83C5 88 44 2A mov [si+2Ah],al -273F:83C8 E9 FC48 jmp loc_1600 ; (8013) +273F:83C8 E9 FC48 jmp loc_set_frame_offset 273F:83CB loc_1641: ; xref 273F:83C3 273F:83CB 81 7D 1B 0436 cmp word ptr [di+1Bh],436h 273F:83D0 75 2F jne loc_1643 ; Jump if not equal @@ -19642,7 +19724,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:8406 loc_1644: ; xref 273F:8419 273F:8406 úC6 44 28 00 mov byte ptr [si+28h],0 273F:840A C6 44 2A 0C mov byte ptr [si+2Ah],0Ch -273F:840E E9 FC02 jmp loc_1600 ; (8013) +273F:840E E9 FC02 jmp loc_set_frame_offset 273F:8411 loc_1645: ; xref 273F:8337 273F:8411 F7 06 9838 FFFF test data_431,0FFFFh ; (273F:9838=5C8Bh) 273F:8417 75 35 jnz loc_ret_1647 ; Jump if not zero @@ -19724,11 +19806,11 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:84C0 72 08 jb loc_1657 ; Jump if below 273F:84C2 01 54 0D add [si+0Dh],dx 273F:84C5 01 15 add [di],dx -273F:84C7 E9 FB49 jmp loc_1600 ; (8013) +273F:84C7 E9 FB49 jmp loc_set_frame_offset 273F:84CA loc_1657: ; xref 273F:84C0 273F:84CA C6 44 2A 0C mov byte ptr [si+2Ah],0Ch 273F:84CE 80 64 28 7F and byte ptr [si+28h],7Fh -273F:84D2 E9 FB3E jmp loc_1600 ; (8013) +273F:84D2 E9 FB3E jmp loc_set_frame_offset ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE @@ -19737,9 +19819,9 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ 273F:84D5 sub_212 proc near -273F:84D5 8B 44 0F mov ax,[si+0Fh] -273F:84D8 03 44 1B add ax,[si+1Bh] -273F:84DB 8B 4F 18 mov cx,[bx+18h] +273F:84D5 8B 44 0F mov ax, [si+HS_Y] +273F:84D8 03 44 1B add ax, [si+HS_HEIGHT_COPY] +273F:84DB 8B 4F 18 mov cx, [bx+18h] 273F:84DE D1 E1 shl cx,1 ; Shift w/zeros fill 273F:84E0 D1 E1 shl cx,1 ; Shift w/zeros fill 273F:84E2 D1 E1 shl cx,1 ; Shift w/zeros fill @@ -19761,11 +19843,9 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:8505 03 4F 18 add cx,[bx+18h] 273F:8508 03 C1 add ax,cx 273F:850A 05 0004 add ax,4 -273F:850D úBB 984A mov bx,offset data_441 ; (273F:984A=0E5h) +273F:850D úBB 984A mov bx, offset data_441 273F:8510 03 D8 add bx,ax 273F:8512 B2 01 mov dl,1 - nlure.lst Sourcer v6.09 17-Nov- 5 5:53 pm Page 320 - 273F:8514 B9 0027 mov cx,27h 273F:8517 32 F6 xor dh,dh ; Zero register @@ -19815,8 +19895,8 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:855A sub_213 proc near 273F:855A 53 push bx -273F:855B E8 FD29 call sub_211 ; (8287) -273F:855E F6 44 2A FF test byte ptr [si+2Ah],0FFh +273F:855B E8 FD29 call sub_211 ; list[room #] => bx +273F:855E F6 44 2A FF test byte ptr [si+HS_FRAME_NUM], 0FFh 273F:8562 75 45 jnz loc_1669 ; Jump if not zero 273F:8564 58 pop ax 273F:8565 E8 FF6D call sub_212 ; (84D5) @@ -19825,25 +19905,25 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:856A ú33 C0 xor ax,ax ; Zero register 273F:856C C3 retn 273F:856D loc_1664: ; xref 273F:8568 -273F:856D 0B C0 or ax,ax ; Zero ? +273F:856D 0B C0 or ax, ax ; Zero ? 273F:856F 74 35 jz loc_1668 ; Jump if zero -273F:8571 83 C3 02 add bx,2 -273F:8574 B9 0004 mov cx,4 -273F:8577 8B 45 1B mov ax,[di+1Bh] +273F:8571 83 C3 02 add bx, 2 +273F:8574 B9 0004 mov cx, 4 +273F:8577 8B 45 1B mov ax, [di+ANIM_HOTSPOT_ID] 273F:857A locloop_1665: ; xref 273F:8581 -273F:857A 39 07 cmp [bx],ax +273F:857A 39 07 cmp [bx], ax 273F:857C 74 18 je loc_1667 ; Jump if equal 273F:857E 83 C3 04 add bx,4 273F:8581 E2 F7 loop locloop_1665 ; Loop if cx > 0 -273F:8583 B9 0004 mov cx,4 -273F:8586 83 EB 10 sub bx,10h +273F:8583 B9 0004 mov cx, 4 +273F:8586 83 EB 10 sub bx, 10h 273F:8589 locloop_1666: ; xref 273F:8592 -273F:8589 F7 07 FFFF test word ptr [bx],0FFFFh +273F:8589 F7 07 FFFF test word ptr [bx], 0FFFFh 273F:858D 74 07 jz loc_1667 ; Jump if zero -273F:858F 83 C3 04 add bx,4 +273F:858F 83 C3 04 add bx, 4 273F:8592 E2 F5 loop locloop_1666 ; Loop if cx > 0 273F:8594 EB D4 jmp short loc_1663 ; (856A) @@ -19851,32 +19931,32 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:8596 89 07 mov [bx],ax 273F:8598 C6 47 03 82 mov byte ptr [bx+3],82h 273F:859C C6 44 2A 01 mov byte ptr [si+2Ah],1 -273F:85A0 E8 BDC3 call sub_93 ; (4366) +273F:85A0 E8 BDC3 call character_update_movement 273F:85A3 E8 BF33 call char_face_up 273F:85A6 loc_1668: ; xref 273F:856F 273F:85A6 33 C0 xor ax,ax ; Zero register 273F:85A8 C3 retn 273F:85A9 loc_1669: ; xref 273F:8562 -273F:85A9 83 C3 02 add bx,2 -273F:85AC B9 0004 mov cx,4 -273F:85AF 8B 45 1B mov ax,[di+1Bh] +273F:85A9 83 C3 02 add bx, 2 +273F:85AC B9 0004 mov cx, 4 +273F:85AF 8B 45 1B mov ax, [di+ANIM_HOTSPOT_ID] 273F:85B2 locloop_1670: ; xref 273F:85B9 -273F:85B2 39 07 cmp [bx],ax +273F:85B2 39 07 cmp [bx], ax 273F:85B4 74 0D je loc_1672 ; Jump if equal 273F:85B6 83 C3 04 add bx,4 273F:85B9 E2 F7 loop locloop_1670 ; Loop if cx > 0 -273F:85BB C6 44 2A 00 mov byte ptr [si+2Ah],0 +273F:85BB C6 44 2A 00 mov byte ptr [si+HS_FRAME_NUM], 0 273F:85BF loc_1671: ; xref 273F:85C7 273F:85BF 5B pop bx 273F:85C0 33 C0 xor ax,ax ; Zero register 273F:85C2 C3 retn 273F:85C3 loc_1672: ; xref 273F:85B4 -273F:85C3 F6 47 03 80 test byte ptr [bx+3],80h +273F:85C3 F6 47 03 80 test byte ptr [bx+3], 80h 273F:85C7 75 F6 jnz loc_1671 ; Jump if not zero 273F:85C9 5B pop bx -273F:85CA B8 0001 mov ax,1 +273F:85CA B8 0001 mov ax, 1 273F:85CD C3 retn sub_213 endp @@ -19887,7 +19967,8 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 ;* No entry point to code 273F:85CE E8 DBA7 call talk_countdown_handler -273F:85D1 E9 FA3F jmp loc_1600 ; (8013) +273F:85D1 E9 FA3F jmp loc_set_frame_offset + ;* No entry point to code 273F:85D4 BA 3627 mov dx,3627h 273F:85D7 8B 44 06 mov ax,[si+6] @@ -19955,10 +20036,10 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 ;* No entry point to code 273F:8630 úBE 7D21 mov si, offset goewin_hotspot_rec 273F:8633 8B 7C 0B mov di,[si+0Bh] -273F:8636 E8 BD2D call sub_93 ; (4366) +273F:8636 E8 BD2D call character_update_movement 273F:8639 8B DE mov bx,si -273F:863B 03 5C 61 add bx,[si+61h] -273F:863E 83 C3 63 add bx,63h +273F:863B 03 5C 61 add bx, [si+HS_ACTION_OFFSET] +273F:863E 83 C3 63 add bx, HS_FIRST_ACTION_OFFSET 273F:8641 C6 07 03 mov byte ptr [bx],3 273F:8644 C7 44 28 05DC mov word ptr [si+28h],5DCh 273F:8649 C7 44 24 0616 mov word ptr [si+24h],616h @@ -19991,8 +20072,8 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:8697 úBE 7D21 mov si, offset goewin_hotspot_rec 273F:869A 8B 7C 0B mov di,[si+0Bh] 273F:869D 8B DE mov bx,si -273F:869F 03 5C 61 add bx,[si+61h] -273F:86A2 83 C3 63 add bx,63h +273F:869F 03 5C 61 add bx, [si+HS_ACTION_OFFSET] +273F:86A2 83 C3 63 add bx, HS_FIRST_ACTION_OFFSET 273F:86A5 C6 07 02 mov byte ptr [bx],2 273F:86A8 C6 44 44 00 mov byte ptr [si+44h],0 273F:86AC C7 44 50 0000 mov word ptr [si+50h],0 @@ -20130,11 +20211,12 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:87A0 81 0C 1000 or word ptr [si],1000h 273F:87A4 loc_1685: ; xref 273F:8780 273F:87A4 33 C0 xor ax,ax ; Zero register -273F:87A6 89 44 61 mov [si+61h],ax -273F:87A9 88 44 2A mov [si+2Ah],al -273F:87AC 89 44 42 mov [si+42h],ax -273F:87AF 88 44 44 mov [si+44h],al +273F:87A6 89 44 61 mov [si+HS_ACTION_OFFSET], ax +273F:87A9 88 44 2A mov [si+HS_FRAME_NUM], al +273F:87AC 89 44 42 mov [si+HS_V42], ax +273F:87AF 88 44 44 mov [si+HS_V44], al 273F:87B2 C3 retn + ;* No entry point to code 273F:87B3 E8 87F3 call hotspot_script_execute 273F:87B6 75 05 jnz loc_ret_1686 ; Jump if not zero @@ -20148,9 +20230,8 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:87CB BB 03F1 mov bx,3F1h 273F:87CE B9 0154 mov cx,154h 273F:87D1 E8 0006 call seq_set_hotspot_name -273F:87D4 BB 0AB9 mov bx,0AB9h -273F:87D7 E9 00E2 ;* jmp display_dialog -273F:87D7 E9 E2 00 db 0E9h,0E2h, 00h +273F:87D4 BB 0AB9 mov bx, 0AB9h +273F:87D7 E9 00E2 jmp display_dialog ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE @@ -20209,7 +20290,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:881C 81 3E 6CFE 00B4 cmp word ptr ds:[6CFEh],0B4h ; (273F:6CFE=76Eh) 273F:8822 73 14 jae loc_ret_1689 ; Jump if above or = 273F:8824 BD 706C mov bp,706Ch -273F:8827 E9 CD57 jmp loc_1102 ; (5581) +273F:8827 E9 CD57 jmp sub_129 ;* No entry point to code 273F:882A E8 D94B call talk_countdown_handler 273F:882D F7 44 1F FFFF test word ptr [si+1Fh],0FFFFh @@ -20414,7 +20495,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:89B7 D1 E3 shl bx,1 ; Shift w/zeros fill 273F:89B9 8B 9F 5050 mov bx,word ptr ds:[5050h][bx] ; (273F:5050=34E8h) 273F:89BD E8 00C8 call sub_220 ; (8A88) -273F:89C0 E9 CBCA jmp loc_1103 ; (558D) +273F:89C0 E9 CBCA jmp sub_130 ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE @@ -20444,12 +20525,12 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:89F5 74 09 jz loc_1708 ; Jump if zero 273F:89F7 3D 0003 cmp ax,3 273F:89FA 74 03 je loc_ret_1707 ; Jump if equal -273F:89FC E9 CB82 jmp loc_1102 ; (5581) +273F:89FC E9 CB82 jmp sub_129 273F:89FF loc_ret_1707: ; xref 273F:89FA 273F:89FF C3 retn 273F:8A00 loc_1708: ; xref 273F:89DD, 89EB, 89F5 -273F:8A00 E8 BCEB call sub_110 ; (46EE) +273F:8A00 E8 BCEB call character_face_hotspot 273F:8A03 E8 CBF0 call hotspot_get_action_sequence 273F:8A06 79 03 jns loc_1709 ; Jump if not sign 273F:8A08 E9 D9A6 jmp display_message_dialog_3 @@ -20457,12 +20538,12 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:8A0B 74 08 jz loc_1710 ; Jump if zero 273F:8A0D E8 B424 call sequence_execute 273F:8A10 74 03 jz loc_1710 ; Jump if zero -273F:8A12 E9 CB6C jmp loc_1102 ; (5581) +273F:8A12 E9 CB6C jmp sub_129 273F:8A15 loc_1710: ; xref 273F:8A0B, 8A10 273F:8A15 E8 0009 call sub_218 ; (8A21) 273F:8A18 E8 0026 call talk_get_record 273F:8A1B E8 006A call sub_220 ; (8A88) -273F:8A1E E9 CB6C jmp loc_1103 ; (558D) +273F:8A1E E9 CB6C jmp sub_130 talk_to_proc endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß @@ -20480,11 +20561,11 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:8A27 C7 47 2B 0000 mov word ptr [bx+2Bh],0 273F:8A2C 89 1E CF06 mov talk_to_hotspot_ptr, bx 273F:8A30 55 push bp -273F:8A31 E8 B932 call sub_93 ; (4366) +273F:8A31 E8 B932 call character_update_movement 273F:8A34 5D pop bp 273F:8A35 B8 8ABD mov ax, offset talk_tick_proc 273F:8A38 89 45 11 mov [di+ANIM_TICK_PROC], ax -273F:8A3B C6 06 9834 03 mov byte ptr data_427, 3 +273F:8A3B C6 06 9834 03 mov byte ptr data_1084, 3 273F:8A40 C3 retn sub_218 endp @@ -20553,7 +20634,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:8AA5 A3 983F mov data_435, ax 273F:8AA8 A1 BA1B mov ax, active_hotspot_id 273F:8AAB A3 9841 mov data_436, ax -273F:8AAE C6 06 9849 01 mov byte ptr data_440, 1 +273F:8AAE C6 06 9849 01 mov pathfind_data, 1 273F:8AB3 C3 retn sub_220 endp @@ -20845,14 +20926,14 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ 273F:8CDB loc_1750: ; xref 273F:8D24, 8D36, 8D6E -273F:8CDB úC6 06 9849 00 mov byte ptr data_440,0 ; (273F:9849=64h) +273F:8CDB úC6 06 9849 00 mov pathfind_data, 0 273F:8CE0 C7 06 B15F 5E44 mov word ptr ds:data_450e, offset player_tick_proc -273F:8CE6 C6 06 6D33 00 mov byte ptr ds:[6D33h],0 ; (273F:6D33=0Bh) -273F:8CEB C7 06 6D31 0000 mov word ptr ds:[6D31h],0 ; (273F:6D31=31E4h) +273F:8CE6 C6 06 6D33 00 mov data_900, 0 +273F:8CEB C7 06 6D31 0000 mov data_6D31, 0 273F:8CF1 8B 1E CF06 mov bx, talk_to_hotspot_ptr 273F:8CF5 C7 47 2F 0000 mov word ptr [bx+2Fh],0 273F:8CFA C7 47 42 0018 mov word ptr [bx+42h],18h -273F:8CFF C6 06 9834 00 mov byte ptr data_427,0 ; (273F:9834=0F9h) +273F:8CFF C6 06 9834 00 mov byte ptr data_1084,0 ; (273F:9834=0F9h) 273F:8D04 EB C3 jmp short loc_1749 ; (8CC9) ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß @@ -21117,7 +21198,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:8EE7 8B CA mov cx,dx 273F:8EE9 8B D0 mov dx,ax 273F:8EEB B8 4200 mov ax,4200h -273F:8EEE 8B 1E 554D mov bx,word ptr ds:[554Dh] ; (273F:554D=8BC3h) +273F:8EEE 8B 1E 554D mov bx, data_832 273F:8EF2 CD 21 int 21h ; DOS Services ah=function 42h ; move file ptr, bx=file handle ; al=method, cx,dx=offset @@ -21135,7 +21216,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:8F05 3B C3 cmp ax,bx 273F:8F07 75 EF jne loc_1770 ; Jump if not equal 273F:8F09 B4 40 mov ah,40h ; '@' -273F:8F0B 8B 1E 554D mov bx,word ptr ds:[554Dh] ; (273F:554D=8BC3h) +273F:8F0B 8B 1E 554D mov bx, data_832 273F:8F0F B9 F010 mov cx, WRITE_BUFFER_SIZE 273F:8F12 úBA 5D90 mov dx, offset write_buffer ; (273F:5D90=47h) 273F:8F15 2B CA sub cx,dx @@ -21166,7 +21247,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 ; cx=bytes from ds:dx buffer 273F:8F3D 72 B9 jc loc_1770 ; Jump if carry Set 273F:8F3F loc_1774: ; xref 273F:8F57 -273F:8F3F 8B 1E 554D mov bx,word ptr ds:[554Dh] ; (273F:554D=8BC3h) +273F:8F3F 8B 1E 554D mov bx, data_832 273F:8F43 B4 3E mov ah,3Eh 273F:8F45 CD 21 int 21h ; DOS Services ah=function 3Eh ; close file, bx=file handle @@ -21203,14 +21284,14 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:8F75 8B CA mov cx,dx 273F:8F77 8B D0 mov dx,ax 273F:8F79 B8 4200 mov ax,4200h -273F:8F7C 8B 1E 554D mov bx,data_832 ; (31E4:554D=0FFFFh) +273F:8F7C 8B 1E 554D mov bx, data_832 273F:8F80 CD 21 int 21h ; DOS Services ah=function 42h ; move file ptr, bx=file handle ; al=method, cx,dx=offset 273F:8F82 59 pop cx 273F:8F83 5B pop bx 273F:8F84 B4 3F mov ah,3Fh ; '?' -273F:8F86 8B 1E 554D mov bx,data_832 ; (31E4:554D=0FFFFh) +273F:8F86 8B 1E 554D mov bx, data_832 273F:8F8A B9 F010 mov cx, WRITE_BUFFER_SIZE 273F:8F8D úBA 5D90 mov dx, offset write_buffer ; (31E4:5D90=0) 273F:8F90 2B CA sub cx,dx @@ -21292,7 +21373,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 ; open file, al=mode,name@ds:dx 273F:9037 72 18 jc loc_1777 ; Jump if error occurred -273F:9039 A3 554D mov word ptr ds:[554Dh],ax ; (273F:554D=8BC3h) +273F:9039 A3 554D mov data_832, ax 273F:903C 8B D8 mov bx,ax 273F:903E B4 3F mov ah,3Fh 273F:9040 B9 0200 mov cx,200h @@ -21318,7 +21399,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:9062 33 C0 xor ax,ax ; Zero register 273F:9064 C3 retn 273F:9065 loc_1778: ; xref 273F:905A -273F:9065 A3 554D mov word ptr ds:[554Dh],ax ; (273F:554D=8BC3h) +273F:9065 A3 554D mov data_832, ax 273F:9068 1E push ds 273F:9069 07 pop es 273F:906A úBF 0119 mov di, offset file_buffer ; (273F:0119=0FFh) @@ -22032,20 +22113,20 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:95F4 B8 0083 mov ax,83h 273F:95F7 E8 A83A call sequence_execute 273F:95FA E8 003C call sub_234 ; (9639) -273F:95FD E8 0072 call sub_235 ; (9672) +273F:95FD E8 0072 call switch_goewin_character 273F:9600 C7 06 BA17 03E8 mov current_hotspot, PLAYER_HOTSPOT_ID -273F:9606 BA 0026 mov dx,26h -273F:9609 B9 0118 mov cx,118h -273F:960C BB 0118 mov bx,118h -273F:960F E8 ACD7 call sub_92 ; (42E9) +273F:9606 BA 0026 mov dx, 26h +273F:9609 B9 0118 mov cx, 118h +273F:960C BB 0118 mov bx, 118h +273F:960F E8 ACD7 call character_change_room 273F:9612 C3 retn ;* No entry point to code 273F:9613 C7 06 BA99 0001 mov word ptr ds:data_489e,1 ; (273F:BA99=0) 273F:9619 C7 06 BA17 03E8 mov current_hotspot, PLAYER_HOTSPOT_ID -273F:961F BA 0006 mov dx,6 -273F:9622 B9 0104 mov cx,104h -273F:9625 BB 00C8 mov bx,0C8h -273F:9628 E8 ACBE call sub_92 ; (42E9) +273F:961F BA 0006 mov dx, 6 +273F:9622 B9 0104 mov cx, 104h +273F:9625 BB 00C8 mov bx, 0C8h +273F:9628 E8 ACBE call character_change_room 273F:962B C3 retn ;* No entry point to code 273F:962C B8 0083 mov ax,83h @@ -22085,29 +22166,29 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 ; Called from: 273F:95FD ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ -273F:9672 sub_235 proc near + switch_goewin_character proc near 273F:9672 úBE 7D21 mov si, offset goewin_hotspot_rec -273F:9675 8B 7C 0B mov di,[si+0Bh] -273F:9678 0B FF or di,di ; Zero ? -273F:967A 74 03 jz loc_1849 ; Jump if zero -273F:967C E8 7BF3 call animation_unload -273F:967F loc_1849: ; xref 273F:967A -273F:967F C7 44 17 4F82 mov word ptr [si+17h],4F82h -273F:9684 C7 44 21 5D28 mov word ptr [si+21h],5D28h -273F:9689 81 0C 0800 or word ptr [si],800h -273F:968D BB 03EF mov bx,3EFh +273F:9675 8B 7C 0B mov di, [si+HS_ANIM_OFFSET] +273F:9678 0B FF or di, di +273F:967A 74 03 jz loc_1849 ; Skip if not an active anim +273F:967C E8 7BF3 call animation_unload ; Unload animation +273F:967F loc_1849: +273F:967F C7 44 17 4F82 mov word ptr [si+HS_TICK_PROC], 4F82h +273F:9684 C7 44 21 5D28 mov word ptr [si+HS_PIXEL_OFFSET], 5D28h +273F:9689 81 0C 0800 or word ptr [si+HS_ACTIONS], 800h +273F:968D BB 03EF mov bx, 3EFh 273F:9690 E8 7633 call animation_load_entry 273F:9693 úBE 7D21 mov si, offset goewin_hotspot_rec -273F:9696 8B 7C 0B mov di,[si+0Bh] -273F:9699 C7 44 06 0026 mov word ptr [si+6],26h -273F:969E C7 45 0E 0026 mov word ptr [di+0Eh],26h -273F:96A3 C7 44 17 7C24 mov word ptr [si+17h],7C24h -273F:96A8 C7 45 11 7C24 mov word ptr [di+11h],7C24h -273F:96AD C7 44 66 0026 mov word ptr [si+66h],26h -273F:96B2 C7 44 64 4EBB mov word ptr [si+64h],4EBBh -273F:96B7 C7 44 61 0000 mov word ptr [si+61h],0 +273F:9696 8B 7C 0B mov di, [si+HS_ANIM_OFFSET] +273F:9699 C7 44 06 0026 mov word ptr [si+HS_ROOM_NUM], 38 +273F:969E C7 45 0E 0026 mov word ptr [di+ANIM_ROOM_NUM], 38 +273F:96A3 C7 44 17 7C24 mov word ptr [si+HS_TICK_PROC], 7C24h +273F:96A8 C7 45 11 7C24 mov word ptr [di+ANIM_TICK_PROC], 7C24h +273F:96AD C7 44 66 0026 mov word ptr [si+HS_FIRST_ACTION_OFFSET+CURRENT_ACTION_ROOM_NUM], 38 +273F:96B2 C7 44 64 4EBB mov word ptr [si+HS_FIRST_ACTION_OFFSET+CURRENT_ACTION_SUPPORT_TABLE], 4EBBh +273F:96B7 C7 44 61 0000 mov word ptr [si+HS_ACTION_OFFSET],0 273F:96BC C3 retn - sub_235 endp + switch_goewin_character endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß @@ -23182,12 +23263,12 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:9EFD 03 D8 add bx, ax 273F:9EFF 8B 07 mov ax, [bx] 273F:9F01 8B DE mov bx,si -273F:9F03 03 5C 61 add bx,[si+61h] -273F:9F06 83 C3 63 add bx,63h -273F:9F09 89 47 01 mov [bx+1],ax +273F:9F03 03 5C 61 add bx, [si+HS_ACTION_OFFSET] +273F:9F06 83 C3 63 add bx, HS_FIRST_ACTION_OFFSET +273F:9F09 89 47 01 mov [bx+1], ax 273F:9F0C C6 07 02 mov byte ptr [bx],2 -273F:9F0F 8B 44 06 mov ax,[si+6] -273F:9F12 89 47 03 mov [bx+3],ax +273F:9F0F 8B 44 06 mov ax, [si+6] +273F:9F12 89 47 03 mov [bx+3], ax 273F:9F15 C3 retn seq_method_49 endp @@ -23199,10 +23280,10 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 seq_method_53 proc near 273F:9F16 E8 6DCF call get_room_resource_pointer 273F:9F19 8B DE mov bx, si -273F:9F1B 03 5C 61 add bx, [si+61h] -273F:9F1E 83 C3 63 add bx, 63h +273F:9F1B 03 5C 61 add bx, [si+HS_ACTION_OFFSET] +273F:9F1E 83 C3 63 add bx, HS_FIRST_ACTION_OFFSET 273F:9F21 A1 6CF5 mov ax, [player_hotspot_rec+HS_ROOM_NUM] -273F:9F24 3B 44 06 cmp ax, [si+HS_ROOM_NUM] +273F:9F24 3B 44 06 cmp ax, [si+HS_ROOM_NUM] ; Hotspot in player's room? 273F:9F27 74 12 je loc_ret_1948 ; Jump if equal 273F:9F29 úBE 4F6F mov si, 4F6Fh 273F:9F2C loc_1946: @@ -23478,7 +23559,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:A0EE 24 7F and al,7Fh 273F:A0F0 F9 stc ; Set carry flag assume ds:seg_code -273F:A0F1 FF 1E 5662 call dword ptr data_351 ; (273F:5662=8963h) +273F:A0F1 FF 1E 5662 call dword ptr [play_music_proc] 273F:A0F5 73 1D jnc loc_1968 ; Jump if carry=0 273F:A0F7 51 push cx 273F:A0F8 8A 4C 02 mov cl,[si+2] @@ -23608,7 +23689,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:A1AC 53 push bx 273F:A1AD 51 push cx assume ds:seg_code -273F:A1AE FF 1E 5662 call dword ptr data_351 ; (273F:5662=8963h) +273F:A1AE FF 1E 5662 call dword ptr [play_music_proc] 273F:A1B2 59 pop cx 273F:A1B3 5B pop bx 273F:A1B4 58 pop ax @@ -23704,7 +23785,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:A216 8A 04 mov al,[si] 273F:A218 24 7F and al,7Fh 273F:A21A B4 04 mov ah,4 -273F:A21C FF 1E 5662 call dword ptr data_351 ; (273F:5662=8963h) +273F:A21C FF 1E 5662 call dword ptr [play_music_proc] 273F:A220 C3 retn sub_258 endp @@ -23740,7 +23821,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:A24B B4 01 mov ah,1 273F:A24D 8A 04 mov al,[si] 273F:A24F 8A 5C 01 mov bl,[si+1] -273F:A252 FF 1E 5662 call dword ptr data_351 ; (273F:5662=8963h) +273F:A252 FF 1E 5662 call dword ptr [play_music_proc] 273F:A256 8A 4C 04 mov cl,[si+4] 273F:A259 E8 FF43 call sub_255 ; (A19F) 273F:A25C 59 pop cx @@ -24676,7 +24757,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:A907 B8 0004 mov ax,4 273F:A90A 5A pop dx 273F:A90B 33 C9 xor cx,cx ; Zero register -273F:A90D FF 1E 5662 call dword ptr data_351 ; (273F:5662=8963h) +273F:A90D FF 1E 5662 call dword ptr [play_music_proc] 273F:A911 loc_2044: ; xref 273F:A8F4 273F:A911 B8 FF00 mov ax,0FF00h 273F:A914 E8 91B0 call read_palette ; (3AC7) @@ -24714,7 +24795,7 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:A95B 0B C0 or ax,ax ; Zero ? 273F:A95D 74 07 jz loc_2048 ; Jump if zero 273F:A95F 8A 5D 06 mov bl, [di+6] -273F:A962 FF 1E 5662 call dword ptr data_351 ; (273F:5662=8963h) +273F:A962 FF 1E 5662 call dword ptr [play_music_proc] 273F:A966 loc_2048: ; xref 273F:A95D 273F:A966 5B pop bx 273F:A967 5A pop dx @@ -24730,18 +24811,18 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:A977 E8 F879 call sub_257 ; (A1F3) 273F:A97A B8 0100 mov ax,100h 273F:A97D 33 DB xor bx,bx ; Zero register -273F:A97F FF 1E 5662 call dword ptr data_351 ; (273F:5662=8963h) +273F:A97F FF 1E 5662 call dword ptr [play_music_proc] 273F:A983 loc_2049: ; xref 273F:A98B 273F:A983 B8 0500 mov ax,500h 273F:A986 F9 stc ; Set carry flag -273F:A987 FF 1E 5662 call dword ptr data_351 ; (273F:5662=8963h) +273F:A987 FF 1E 5662 call dword ptr [play_music_proc] 273F:A98B 73 F6 jnc loc_2049 ; Jump if carry=0 273F:A98D E8 F863 call sub_257 ; (A1F3) 273F:A990 F6 06 5660 20 test music_status, 20h 273F:A995 74 0B jz loc_2050 ; Jump if zero 273F:A997 B8 0106 mov ax,106h 273F:A99A 33 DB xor bx,bx ; Zero register -273F:A99C FF 1E 5662 call dword ptr data_351 ; (273F:5662=8963h) +273F:A99C FF 1E 5662 call dword ptr [play_music_proc] 273F:A9A0 EB 3A jmp short loc_2052 ; (A9DC) 273F:A9A2 loc_2050: ; xref 273F:A995 273F:A9A2 F6 06 5660 01 test music_status, 1 @@ -24756,15 +24837,15 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 273F:A9BE 5A pop dx 273F:A9BF 33 C9 xor cx,cx ; Zero register 273F:A9C1 B8 0001 mov ax,1 -273F:A9C4 FF 1E 5662 call dword ptr data_351 ; (273F:5662=8963h) +273F:A9C4 FF 1E 5662 call dword ptr [play_music_proc] 273F:A9C8 B8 0100 mov ax,100h 273F:A9CB 33 DB xor bx,bx ; Zero register -273F:A9CD FF 1E 5662 call dword ptr data_351 ; (273F:5662=8963h) +273F:A9CD FF 1E 5662 call dword ptr [play_music_proc] 273F:A9D1 EB 09 jmp short loc_2052 ; (A9DC) 273F:A9D3 loc_2051: ; xref 273F:A9A7 273F:A9D3 B8 0106 mov ax,106h 273F:A9D6 B7 01 mov bh,1 -273F:A9D8 FF 1E 5662 call dword ptr data_351 ; (273F:5662=8963h) +273F:A9D8 FF 1E 5662 call dword ptr [play_music_proc] 273F:A9DC loc_2052: ; xref 273F:A9A0, A9D1 273F:A9DC 5B pop bx 273F:A9DD 5A pop dx @@ -24970,22 +25051,10 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 31E4:077A 0000 draw_dialog_proc dw 0 31E4:077C 0000 decode_entry_proc dw 0 31E4:077E 0000 copy_screen_proc dw 0 - ; 273F:A36F, 273F:A3EF - ; 273F:A443, 273F:A465 - ; 273F:A496, 273F:A4C1 - ; 273F:A552, 273F:A5CD - ; 273F:A5FE, 273F:A62C - ; 273F:A67F, 273F:A6E2 -31E4:0780 0000 pic_decode_proc dw 0 ; xref 273F:05B7, 273F:067E - ; 273F:A39C, 273F:A3AA - ; 273F:A404, 273F:A411 - ; 273F:A458, 273F:A4AB - ; 273F:A4D7, 273F:A4ED - ; 273F:A503, 273F:A519 - ; 273F:A52F, 273F:A5E9 - ; 273F:A618, 273F:A63D - ; 273F:A6A3, 273F:A6F3 -31E4:0782 00 00 00 00 db 0, 0, 0, 0 +31E4:0780 0000 pic_decode_proc dw 0 + +31E4:0782 0000 saved_mouse_x dw 0 +31E4:0784 0000 saved_mouse_y dw 0 31E4:0786 00 default_drive db 0 ; xref 273F:0712, 273F:9345 31E4:0787 0009[00] db 9 dup (0) @@ -25042,8 +25111,13 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 31E4:10B5 4C 6F 6F 6B 20 61 look_at_str db 'Look at ', 0 ; xref 273F:136B 31E4:10BB 74 20 00 -31E4:10BE 0000 data_615 dw 0 -31E4:10C0 002E[00] data_616 db 48 dup (0) +31E4:10BE 0000 num_impinging_chars dw 0 +31E4:10C0 0026[00] impinging_char_list db 38 dup (0) + +31E4:10E6 0000 char_rect_left dw 0 +31E4:10E8 0000 char_rect_right dw 0 +31E4:10EA 0000 char_rect_top dw 0 +31E4:10EC 0000 char_rect_bottom dw 0 31E4:10EE 0000 data_617 dw 0 31E4:10F0 00 animation_table2 db 0 ; xref 273F:1556, 273F:1598 ; 273F:15C3 @@ -25080,10 +25154,14 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 31E4:1323 0016[00] db 22 dup (0) 31E4:1339 001F[00] db 31 dup (0) 31E4:1358 0028[00] db 40 dup (0) -31E4:1380 C2 13 95 BB 17 db 0C2h, 13h, 95h,0BBh, 17h -31E4:1385 36 5B 36 db 36h, 5Bh, 36h + +31E4:1380 13C2 seq48_offset_list dw 13C2h +31E4:1382 BB95 dw 0BB95h +31E4:1384 3617 dw 3617h +31E4:1386 365B dw 365Bh + 31E4:1388 loc_2059: ; xref 31E4:138D -31E4:1388 35 F571 xor ax,0F571h +31E4:1388 35 71 F5 xor ax,0F571h 31E4:138B 7A CB ;* jp loc_2058 ;*Jump if parity=1 31E4:138B 7A CB db 7Ah,0CBh 31E4:138D 7D F9 jge loc_2059 ; Jump if > or = @@ -26211,10 +26289,22 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 ; 273F:A89C, 273F:A8AB ; 273F:A8CC 31E4:38B3 32 data_783 db 32h ; xref 273F:4956, 273F:4967 -31E4:38B4 05DE[00] db 1502 dup (0) + +31E4:38B4 008D[00] db 140 dup (0) +31E4:3940 0000 pathfind_buffer_end dw 0 +31E4:3942 0000 pathfind_sp dw 0 +31E4:3944 0000 pathfind_v2 dw 0 +31E4:3946 0000 pathfind_v3 db 0 +31E4:3947 003C[00] db 60 dup (0) +31E4:3983 000A[00] player_pathfind_data dw 5 dup (0) + +........ 31E4:3E92 00 data_785 db 0 ; xref 31E4:18A6 31E4:3E93 01CD[00] db 461 dup (0) 31E4:4060 ú077D[00] db 1917 dup (0) +31E4:4227 000A[00] chars_pathfind_data dw 5 dup (0) + +........ 31E4:47DD 0000 0000 data_786 dd 00000h ; Data table (indexed access) 31E4:47E1 02EF[00] db 751 dup (0) 31E4:4AD0 11 04 12 04 1F 04 db 11h, 04h, 12h, 04h, 1Fh, 04h @@ -26498,9 +26588,12 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 31E4:5017 08 09 0A 0B 0C 0D db 08h, 09h, 0Ah, 0Bh, 0Ch, 0Dh 31E4:501D 0E 0F 10 11 12 13 db 0Eh, 0Fh, 10h, 11h, 12h, 13h 31E4:5023 14 15 16 17 18 00 db 14h, 15h, 16h, 17h, 18h, 00h -31E4:5029 00 1D 00 47 BB 20 db 00h, 1Dh, 00h, 47h,0BBh, 20h -31E4:502F 00 61 BB 23 00 7B db 00h, 61h,0BBh, 23h, 00h, 7Bh -31E4:5035 BB db 0BBh +31E4:5029 00 db 0 + +31E4:502A 001D BB47 sub_211_list dw 1Dh, 0BB47h +31E4:502E 0020 BB61 dw 20h, 0BB61h +31E4:5032 0023 BB7B dw 23h, 0BB7Bh + 31E4:5036 000A[00] db 10 dup (0) 31E4:5040 09 08 15 05 0A 0A look_info db 09h, 08h, 15h, 05h, 0Ah, 0Ah @@ -27589,6 +27682,11 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 31E4:6D14 0010[00] db 16 dup (0) 31E4:6D24 F8 04 00 db 0F8h, 04h, 00h 31E4:6D27 0022[00] db 34 dup (0) + +.... +31E4:6D31 0000 data_6D31 dw 0 +31E4:6D33 00 data_900 db 0 +.... 31E4:6D49 73 66 db 73h, 66h 31E4:6D4B 0007[00] db 7 dup (0) 31E4:6D52 00 player_action_state db 0 @@ -30184,7 +30282,9 @@ PLAYER_ACTION_CONTINUE_WALK equ 5 31E4:9841 0000 data_1091 dw 0 ; xref 273F:1489 31E4:9843 00 00 00 00 db 0, 0, 0, 0 31E4:9847 0000 data_1093 dw 0 ; xref 273F:62B6 -31E4:9849 00 A5 C4 00 00 00 db 00h,0A5h,0C4h, 00h, 00h, 00h + +31E4:9849 00 pathfind_data db 00 ; Set of entries each 120 bytes +31E4:984A A5 C4 00 00 00 pathfind_data2 db 00h,0A5h,0C4h, 00h, 00h, 00h 31E4:984F 96 75 5A AD 93 A0 db 96h, 75h, 5Ah,0ADh, 93h,0A0h 31E4:9855 74 C9 24 44 8F C4 db 74h,0C9h, 24h, 44h, 8Fh,0C4h 31E4:985B A9 88 93 3C 15 86 db 0A9h, 88h, 93h, 3Ch, 15h, 86h |