[Scummvm-cvs-logs] SF.net SVN: scummvm: [21349] scummvm/trunk/engines/lure/diassembly

dreammaster at users.sourceforge.net dreammaster at users.sourceforge.net
Fri Mar 17 14:00:04 CET 2006


Revision: 21349
Author:   dreammaster
Date:     2006-03-17 13:59:29 -0800 (Fri, 17 Mar 2006)
ViewCVS:  http://svn.sourceforge.net/scummvm/?rev=21349&view=rev

Log Message:
-----------
Further work on disassembling player tick/movement handler

Modified Paths:
--------------
    scummvm/trunk/engines/lure/diassembly/LURE.ASM
    scummvm/trunk/engines/lure/diassembly/Lure_notes.txt
Modified: scummvm/trunk/engines/lure/diassembly/LURE.ASM
===================================================================
--- scummvm/trunk/engines/lure/diassembly/LURE.ASM	2006-03-17 20:49:12 UTC (rev 21348)
+++ scummvm/trunk/engines/lure/diassembly/LURE.ASM	2006-03-17 21:59:29 UTC (rev 21349)
@@ -135,13 +135,14 @@
 ANIM_TICK_PROC            equ  11h
 ANIM_WIDTH_COPY           equ  13h
 ANIM_HEIGHT_COPY          equ  15h
+ANIM_Y_CORRECTION         equ  17h
 ANIM_HOTSPOT_OFFSET       equ  19h
 ANIM_HOTSPOT_ID           equ  1Bh
 ANIM_LAYER1_SKIP          equ  1Dh
 ANIM_VOICE_CHAR_ID        equ  1Eh
 ANIM_VOICE_CTR            equ  24h
 ANIM_DIRECTION            equ  26h
-ANIM_UNKOWN1              equ  27h
+ANIM_UNKNOWN1              equ  27h
 ANIM_START_COLOUR         equ  28h
 
 ; Hotspot header record constants
@@ -166,6 +167,8 @@
 HS_LAYER                  equ  15h
 HS_TICK_PROC              equ  17h
 HS_WIDTH_COPY             equ  19h
+HS_HEIGHT_COPY            equ  1Bh
+HS_Y_CORRECTION           equ  1Dh
 HS_FRAME_CTR              equ  1Fh
 HS_PIXEL_OFFSET           equ  21h
 HS_START_COLOUR           equ  23h
@@ -186,11 +189,6 @@
 HS_ACTION_OFFSET          equ  61h
 HS_FIRST_ACTION_OFFSET    equ  63h
 
-; Room header record constants
-RH_ROOM_NUM               equ  2
-RH_DESC_ID                equ  4
-RH_TABLE_ENTRY_SIZE       equ  9
-
 ; Pixel record constants
 PIXEL_DISK_ID             equ   0
 PIXEL_FLAGS               equ   2
@@ -222,6 +220,11 @@
 REHS_HOTSPOT_2            equ  8
 REHS_EXIT_BLOCKED         equ  12
 
+; Room header record constants
+RH_ROOM_NUM               equ  2
+RH_DESC_ID                equ  4
+RH_TABLE_ENTRY_SIZE       equ  9
+
 ; Room record constants
 ROOM_NUM_LAYERS           equ  8
 ROOM_FIRST_LAYER          equ  9
@@ -231,6 +234,16 @@
 ROOM_X_END                equ  1Bh
 ROOM_EXITS_START          equ  1Dh
 
+; Room exit constants for room exit list within room records
+ROOMREC_EXIT_X_START          equ  0
+ROOMREC_EXIT_X_END            equ  2
+ROOMREC_EXIT_Y_START          equ  4
+ROOMREC_EXIT_Y_END            equ  6
+ROOMREC_EXIT_SEQUENCE         equ  8
+ROOMREC_EXIT_ROOM_NUM         equ  10
+ROOMREC_EXIT_NEW_X            equ  12
+ROOMREC_EXIT_NEW_Y            equ  14
+
 ; Room number constants
 ROOMNUM_TOWN_HALL         equ  1fh
 ROOMNUM_MIDDLE_STREET     equ  0Eh
@@ -2769,7 +2782,7 @@
 273F:10E8 \xFABF B14E                              mov     di,offset animation_table
 273F:10EB  B9 002D                              mov     cx, NUM_ANIMATION_SLOTS
 
-273F:10EE                       locloop_157:                     ; Check if hotspot can be unloaded
+273F:10EE                       locloop_157:                                    ; Check if hotspot can be unloaded
 273F:10EE  F6 45 10 FF                          test    byte ptr [di+ANIM_CAN_UNLOAD],0FFh
 273F:10F2  74 11                                jz      loc_159                 ; If no, then skip
 
@@ -2798,7 +2811,7 @@
 273F:110D  8B 55 0E                             mov     dx, [di+ANIM_ROOM_NUM]
 273F:1110 \xFABE B14E                              mov     si, offset animation_table
 273F:1113  B9 002D                              mov     cx, NUM_ANIMATION_SLOTS
-273F:1116 \xFABB 10C0                              mov     bx, 10C0h 
+273F:1116 \xFABB 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)
@@ -2875,72 +2888,78 @@
 
 273F:11B5                       sub_41          proc    near
 273F:11B5  53                                   push    bx
-273F:11B6 \xFABB 10C0                              mov     bx,10C0h                ; (273F:10C0=3)
-273F:11B9  C7 06 10EE 0000                      mov     word ptr ds:[10EEh],0   ; (273F:10EE=45F6h)
-273F:11BF                       loc_163:                                        ;  xref 273F:11F9, 126F
-273F:11BF \xFA8B 07                                mov     ax,[bx]
-273F:11C1  83 C3 02                             add     bx,2
-273F:11C4  0B C0                                or      ax,ax                   ; Zero ?
+273F:11B6 \xFABB 10C0                              mov     bx, offset data_616
+273F:11B9  C7 06 10EE 0000                      mov     data_617, 0
+273F:11BF                       loc_163:
+
+273F:11BF \xFA8B 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,word ptr ds:[10EEh]  ; (273F:10EE=45F6h)
+273F:11C8  A1 10EE                              mov     ax, data_617
 273F:11CB  5B                                   pop     bx
 273F:11CC  C3                                   retn
-273F:11CD                       loc_164:                                        ;  xref 273F:11C6
-273F:11CD  8B EB                                mov     bp,bx
+273F:11CD                       loc_164:
+
+273F:11CD  8B EB                                mov     bp,bx                   ; Store current table offset
 273F:11CF  50                                   push    ax
 273F:11D0  56                                   push    si
-273F:11D1  E8 FB16                              call    get_room_resource_pointer2
-273F:11D4  8B DE                                mov     bx,si
-273F:11D6  03 5C 61                             add     bx,[si+61h]
-273F:11D9  83 C3 63                             add     bx,63h
-273F:11DC  8A 1F                                mov     bl,[bx]
+273F:11D1  E8 FB16                              call    get_room_resource_pointer2 ;Get hotspot resource
+273F:11D4  8B DE                                mov     bx, si
+273F:11D6  03 5C 61                             add     bx, [si+HS_ACTION_OFFSET]
+273F:11D9  83 C3 63                             add     bx, HS_FIRST_ACTION_OFFSET
+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,3
-273F:11E3  74 12                                je      loc_166                 ; Jump if equal
+273F:11E0  80 FB 03                             cmp     bl, PLAYER_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
 273F:11E8  B9 0014                              mov     cx, NUM_HOTSPOT_ACTION_SLOTS
 273F:11EB  8B 55 1B                             mov     dx, [di+ANIM_HOTSPOT_ID]
 
 273F:11EE                       locloop_165:
-273F:11EE  3B 17                                cmp     dx, [bx]
-273F:11F0  75 09                                jne     loc_167                 ; Jump if not equal
-273F:11F2  3B 47 02                             cmp     ax, [bx+2]
+273F:11EE  3B 17                                cmp     dx, [bx]                ; Source char in list?
+273F:11F0  75 09                                jne     loc_167                 ; Jump if not
+273F:11F2  3B 47 02                             cmp     ax, [bx+2]              ; List char Id in list?
 273F:11F5  75 04                                jne     loc_167                 ; Jump if not equal
-273F:11F7                       loc_166:                                        ;  xref 273F:11E3
-273F:11F7  8B DD                                mov     bx,bp
-273F:11F9  EB C4                                jmp     short loc_163           ; (11BF)
-273F:11FB                       loc_167:                                        ;  xref 273F:11F0, 11F5
+273F:11F7                       loc_166:
+273F:11F7  8B DD                                mov     bx,bp                   ; Restore cached table offset
+273F:11F9  EB C4                                jmp     short loc_163           ; Check next entry
+273F:11FB                       loc_167:
 273F:11FB  83 C3 08                             add     bx, HOTSPOT_ACTION_SLOT_SIZE
-273F:11FE  E2 EE                                loop    locloop_165             ; Loop if cx > 0
+273F:11FE  E2 EE                                loop    locloop_165             ; Loop remaining action list
 
-273F:1200  8B D8                                mov     bx,ax
+; 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
+; against the calling character (such as the player) in the hotspot action list
+
+273F:1200  8B D8                                mov     bx, ax
 273F:1202  57                                   push    di
-273F:1203  8B FE                                mov     di,si
+273F:1203  8B FE                                mov     di, si
 273F:1205  E8 FAE0                              call    get_room_resource_pointer
-273F:1208  87 F7                                xchg    si,di
-273F:120A  8B C3                                mov     ax,bx
-273F:120C  3D 03E8                              cmp     ax, PLAYER_HOTSPOT_ID
-273F:120F  75 0F                                jne     loc_168                 ; Jump if not equal
-273F:1211  F6 45 49 FF                          test    byte ptr [di+49h],0FFh
+273F:1208  87 F7                                xchg    si, di                  ;di=list hotspot rec, si=caller rec
+273F:120A  8B C3                                mov     ax, bx
+273F:120C  3D 03E8                              cmp     ax, PLAYER_HOTSPOT_ID   ; Is caller Id the player?
+273F:120F  75 0F                                jne     loc_168                 ; Jump if not
+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                  ; (4366)
+273F:1218  E8 314B                              call    sub_93
 273F:121B  5B                                   pop     bx
-273F:121C  B8 0001                              mov     ax,1
+273F:121C  B8 0001                              mov     ax, 1
 273F:121F  C3                                   retn
-273F:1220                       loc_168:                                        ;  xref 273F:120F, 1215
 
+273F:1220                       loc_168:
 273F:1220  BB B0AE                              mov     bx, offset hotspot_action_list
-273F:1223                       loc_169:                                        ;  xref 273F:122C
-273F:1223 \xFAF7 07 FFFF                           test    word ptr [bx],0FFFFh
-273F:1227  74 05                                jz      loc_170                 ; Jump if zero
+273F:1223                       loc_169:                                        ; Scan for end of list
+273F:1223 \xFAF7 07 FFFF                           test    word ptr [bx], 0FFFFh
+273F:1227  74 05                                jz      loc_170
 273F:1229  83 C3 08                             add     bx, HOTSPOT_ACTION_SLOT_SIZE
-273F:122C  EB F5                                jmp     short loc_169           ; (1223)
-273F:122E                       loc_170:                                        ;  xref 273F:1227
-273F:122E  89 17                                mov     [bx],dx
-273F:1230  89 47 02                             mov     [bx+2],ax
+273F:122C  EB F5                                jmp     short loc_169
+273F:122E                       loc_170:                                        ; Inject entry into hotspot action list
+273F:122E  89 17                                mov     [bx], dx
+273F:1230  89 47 02                             mov     [bx+2], ax
 273F:1233  C7 47 04 000F                        mov     word ptr [bx+4],0Fh
 273F:1238  89 7F 06                             mov     [bx+6],di
 273F:123B  C6 44 4C 01                          mov     byte ptr [si+4Ch],1
@@ -2953,21 +2972,21 @@
 273F:1251  75 09                                jnz     loc_172                 ; Jump if not zero
 273F:1253  F6 45 44 FF                          test    byte ptr [di+44h],0FFh
 273F:1257  75 03                                jnz     loc_172                 ; Jump if not zero
-273F:1259                       loc_171:                                        ;  xref 273F:124A
-273F:1259  89 55 47                             mov     [di+47h],dx
-273F:125C                       loc_172:                                        ;  xref 273F:1251, 1257
-273F:125C  C7 45 4A 000F                        mov     word ptr [di+4Ah],0Fh
-273F:1261                       loc_173:                                        ;  xref 273F:1242
-273F:1261  C7 06 10EE 0002                      mov     word ptr ds:[10EEh],2   ; (273F:10EE=45F6h)
+273F:1259                       loc_171:
+273F:1259  89 55 47                             mov     [di+47h], dx
+273F:125C                       loc_172:
+273F:125C  C7 45 4A 000F                        mov     word ptr [di+4Ah], 0Fh
+273F:1261                       loc_173:
+273F:1261  C7 06 10EE 0002                      mov     data_617, 2
 273F:1267  5F                                   pop     di
 273F:1268  5B                                   pop     bx
-273F:1269  C6 07 01                             mov     byte ptr [bx],1
+273F:1269  C6 07 01                             mov     byte ptr [bx], 1
 273F:126C  53                                   push    bx
 273F:126D  8B DD                                mov     bx,bp
-273F:126F  E9 FF4D                              jmp     loc_163                 ; (11BF)
+273F:126F  E9 FF4D                              jmp     loc_163
+
                                 sub_41          endp
 
-
                                 ;\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF
                                 ;                              SUBROUTINE
                                 ;
@@ -10040,14 +10059,14 @@
 273F:4199  B9 002D                              mov     cx, NUM_ANIMATION_SLOTS
 
 273F:419C                       locloop_822:
-273F:419C  F6 45 0C FF                          test    byte ptr [di+0Ch],0FFh
+273F:419C  F6 45 0C FF                          test    byte ptr [di+0Ch], 0FFh
 273F:41A0  74 16                                jz      loc_823
 
-273F:41A2  8B 45 1B                             mov     ax,[di+1Bh]
+273F:41A2  8B 45 1B                             mov     ax, [di+ANIM_HOTSPOT_ID]
 273F:41A5  A3 BA17                              mov     current_hotspot, ax
 273F:41A8  89 3E 1927                           mov     active_animation_offset, di
-273F:41AC  8B 45 11                             mov     ax,[di+11h]             ; ax = handler offset
-273F:41AF  8B 75 19                             mov     si,[di+19h]             ; si = hotspot rsc
+273F:41AC  8B 45 11                             mov     ax, [di+ANIM_TICK_PROC]
+273F:41AF  8B 75 19                             mov     si, [di+ANIM_HOTSPOT_OFFSET]
 273F:41B2  57                                   push    di
 273F:41B3  51                                   push    cx
 273F:41B4  FF D0                                call    ax                      ; Call entry's handler proc
@@ -10189,65 +10208,69 @@
                                 ;         Called from:   273F:5242
                                 ;\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC
 
-273F:4288                       sub_91          proc    near
-273F:4288                       loc_833:                                        ;  xref 273F:6036
+                 character_check_room_change    proc    near
 273F:4288 \xFA56                                   push    si
 273F:4289  8B 45 0E                             mov     ax, [di+ANIM_ROOM_NUM]
-273F:428C  E8 CA5B                              call    get_room_resource_pointer2
-273F:428F  83 C6 1D                             add     si, 1Dh                 ; Move to list start
-273F:4292  8B 05                                mov     ax, [di]                ; get X start
-273F:4294  8B 4D 13                             mov     cx, [di+13h]            ; Get animation width?
-273F:4297  D1 E9                                shr     cx,1
-273F:4299  03 C1                                add     ax,cx
-273F:429B  8B 55 02                             mov     dx,[di+ANIM_Y]
-273F:429E  03 55 15                             add     dx,[di+ANIM_HEIGHT_COPY]
-273F:42A1  8B 4D 17                             mov     cx,[di+17h]
+273F:428C  E8 CA5B                              call    get_room_resource_pointer2 ; Get room resource
+273F:428F  83 C6 1D                             add     si, ROOM_EXITS_START    ; Get pointer to room exits list
+273F:4292  8B 05                                mov     ax, [di+ANIM_X]         ; get X start
+273F:4294  8B 4D 13                             mov     cx, [di+ANIM_WIDTH_COPY]; Get animation width
+273F:4297  D1 E9                                shr     cx, 1
+273F:4299  03 C1                                add     ax, cx
+273F:429B  8B 55 02                             mov     dx, [di+ANIM_Y]
+273F:429E  03 55 15                             add     dx, [di+ANIM_HEIGHT_COPY]
+273F:42A1  8B 4D 17                             mov     cx, [di+ANIM_Y_CORRECTION]
 273F:42A4  D1 E9                                shr     cx,1
 273F:42A6  2B D1                                sub     dx,cx                   ; ax=x, dx=y
 
 273F:42A8                       loc_834:
 273F:42A8 \xFA83 3C FF                             cmp     word ptr [si],0FFFFh    ; End of list reached?
 273F:42AB  74 3A                                je      loc_837                 ; Jump if yes
-273F:42AD  3B 04                                cmp     ax, [si]                ; Bounds x left
-273F:42AF  72 27                                jb      loc_836
-273F:42B1  3B 44 02                             cmp     ax, [si+2]              ; Bounds x right
+273F:42AD  3B 04                                cmp     ax, [si+ROOMREC_EXIT_X_START] ; Check bounds of the
+273F:42AF  72 27                                jb      loc_836                 ;  room exit against character
+273F:42B1  3B 44 02                             cmp     ax, [si+ROOMREC_EXIT_X_END]
 273F:42B4  73 22                                jae     loc_836
-273F:42B6  3B 54 04                             cmp     dx, [si+4]              ; Bounds y start
+273F:42B6  3B 54 04                             cmp     dx, [si+ROOMREC_EXIT_Y_START]
 273F:42B9  72 1D                                jb      loc_836
-273F:42BB  3B 54 06                             cmp     dx, [si+6]              ; Bounds y end
+273F:42BB  3B 54 06                             cmp     dx, [si+ROOMREC_EXIT_Y_END]
 273F:42BE  73 18                                jae     loc_836
-273F:42C0  8B 44 08                             mov     ax, [si+8]
+273F:42C0  8B 44 08                             mov     ax, [si+ROOMREC_EXIT_SEQUENCE]
 273F:42C3  3D FFFF                              cmp     ax, 0FFFFh              ; Any sequence to run?
-273F:42C6  74 04                                je      loc_835                 ; If no, go set room
+273F:42C6  74 04                                je      loc_835                 ; If no, go set room directly
 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+0Ah]            ; Get new room #
-273F:42CF  8B 4C 0C                             mov     cx, [si+0Ch]            ; Get new X
-273F:42D2  8B 5C 0E                             mov     bx, [si+0Eh]            ; Get new Y
+273F:42CC  8B 54 0A                             mov     dx, [si+ROOMREC_EXIT_ROOM_NUM] ; Get new room #
+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
-273F:42D6  EB 11                                jmp     sub_92                  ; Set room and exit
+273F:42D6  EB 11                                jmp     character_change_room
 273F:42D8                       loc_836:
-273F:42D8  8B 5C 08                             mov     bx,[si+8]
-273F:42DB  83 C6 0A                             add     si,0Ah                  ; Move to next entry?
-273F:42DE  0B DB                                or      bx,bx                   ; Was it a script entry?
-273F:42E0  79 C6                                jns     loc_834                 ; If yes, check next rec
-273F:42E2  83 C6 06                             add     si,6                    ; Skip over room/x/y vals
+273F:42D8  8B 5C 08                             mov     bx, [si+ROOMREC_EXIT_SEQUENCE] ; Get sequence Id
+273F:42DB  83 C6 0A                             add     si, 0Ah                 ; Move to next entry
+273F:42DE  0B DB                                or      bx, bx                  ; Did entry have a script?
+273F:42E0  79 C6                                jns     loc_834                 ; If not, go check next record
+273F:42E2  83 C6 06                             add     si, 6                   ; Skip over room/x/y vals
 273F:42E5  EB C1                                jmp     short loc_834           ; Check next record
-273F:42E7                       loc_837:                                        
+273F:42E7                       loc_837:
 273F:42E7  5E                                   pop     si
 273F:42E8  C3                                   retn
+                 character_check_room_change    endp
 
-                                ;\xDF\xDF\xDF\xDF External Entry into Subroutine \xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF
+                                ;\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF
+                                ;                              SUBROUTINE
                                 ;
                                 ;         Called from:   273F:960F, 9628
+                                ;\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC
 
-273F:42E9                       sub_92:
+                      character_change_room     proc    near
 273F:42E9  A1 BA17                              mov     ax, current_hotspot
-273F:42EC  3D 03E8                              cmp     ax, PLAYER_HOTSPOT_ID
-273F:42EF  75 2E                                jne     loc_840                 ; Jump if not equal
-273F:42F1  F6 06 9834 FF                        test    byte ptr data_427,0FFh  ; (273F:9834=0F9h)
+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:42F6  75 26                                jnz     loc_ret_839             ; Jump if not zero
+
+; Room change code for the player
 273F:42F8 \xFABE 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
@@ -10259,12 +10282,12 @@
 273F:4313  E8 1D23                              call    sub_136                 ; (6039)
 273F:4316  75 06                                jnz     loc_ret_839             ; Jump if not zero
 273F:4318  C7 06 982C 0000                      mov     new_room_number_2, 0
+273F:431E                       loc_ret_839:    retn
 
-273F:431E                       loc_ret_839:                                    ;  xref 273F:42F6, 4316
-273F:431E  C3                                   retn
-273F:431F                       loc_840:                                        ;  xref 273F:42EF
+; Room change code for other characters
+273F:431F                       loc_840:
 273F:431F  8B 3E 1927                           mov     di, active_animation_offset
-273F:4323  8B 75 19                             mov     si,[di+19h]
+273F:4323  8B 75 19                             mov     si, [di+ANIM_HOTSPOT_OFFSET]
 273F:4326  53                                   push    bx
 273F:4327  51                                   push    cx
 273F:4328  52                                   push    dx
@@ -10277,23 +10300,23 @@
 273F:4333  E8 01F2                              call    sub_104                 ; (4528)
 273F:4336  C3                                   retn
 273F:4337                       loc_841:                                        ;  xref 273F:432F
-273F:4337  83 E1 F8                             and     cx,0FFF8h
-273F:433A  83 C9 05                             or      cx,5
-273F:433D  89 0D                                mov     [di],cx
-273F:433F  89 4C 0D                             mov     [si+0Dh],cx
-273F:4342  8A CE                                mov     cl,dh
-273F:4344  32 F6                                xor     dh,dh                   ; Zero register
-273F:4346  89 55 0E                             mov     [di+0Eh],dx
-273F:4349  89 54 06                             mov     [si+6],dx
-273F:434C  2B 5C 1B                             sub     bx,[si+1Bh]
-273F:434F  83 E3 F8                             and     bx,0FFF8h
-273F:4352  89 5D 02                             mov     [di+2],bx
-273F:4355  89 5C 0F                             mov     [si+0Fh],bx
-273F:4358  8B DE                                mov     bx,si
-273F:435A  03 5C 61                             add     bx,[si+61h]
-273F:435D  83 C3 63                             add     bx,63h
-273F:4360  E9 0EE3                              jmp     loc_1067                ; (5246)
-                                sub_91          endp
+273F:4337  83 E1 F8                             and     cx, 0FFF8h
+273F:433A  83 C9 05                             or      cx, 5
+273F:433D  89 0D                                mov     [di+ANIM_X], cx
+273F:433F  89 4C 0D                             mov     [si+HS_X], cx
+273F:4342  8A CE                                mov     cl, dh
+273F:4344  32 F6                                xor     dh, dh                  ; Zero register
+273F:4346  89 55 0E                             mov     [di+ANIM_ROOM_NUM], dx
+273F:4349  89 54 06                             mov     [si+HS_ROOM_NUM], dx
+273F:434C  2B 5C 1B                             sub     bx, [si+HS_HEIGHT_COPY]
+273F:434F  83 E3 F8                             and     bx, 0FFF8h
+273F:4352  89 5D 02                             mov     [di+ANIM_Y], bx
+273F:4355  89 5C 0F                             mov     [si+HS_Y], bx
+273F:4358  8B DE                                mov     bx, si
+273F:435A  03 5C 61                             add     bx, [si+HS_ACTION_OFFSET]
+273F:435D  83 C3 63                             add     bx, HS_FIRST_ACTION_OFFSET
+273F:4360  E9 0EE3                              jmp     character_change_room_2
+                      character_change_room     endp
 
                                 ;\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF
                                 ;                              JUMP POINT
@@ -10548,7 +10571,7 @@
 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    sub_131                 ; (55A1)
+273F:44C7  E8 10D7                              call    skorl_caught_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
@@ -12104,17 +12127,18 @@
                                 ;\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF
                                 ;                              SUBROUTINE
                                 ;
+                                ; Contains all the standard handling for characters, such as the Skorl
                                 ;\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC
 
-273F:4F82                       loc_1021:                                       ;  xref 273F:7C8B, 7C98, 7D37
+                standard_character_tick_proc    proc    near
 273F:4F82 \xFA8B DE                                mov     bx, si
-273F:4F84  03 5C 61                             add     bx, [si+61h]
-273F:4F87  83 C3 63                             add     bx, 63h
+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: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:4F97  3D 002A                              cmp     ax,2Ah
+273F:4F94  8B 44 2B                             mov     ax, [si+2Bh]
+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:4F9F                       loc_1022:                                       ;  xref 273F:4F9A
@@ -12133,10 +12157,10 @@
 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:4FC8  F7 06 10BE FFFF                      test    data_615, 0FFFFh
 273F:4FCE  74 40                                jz      loc_1027                ; Jump if zero
 273F:4FD0  56                                   push    si
-273F:4FD1 \xFABE 10C0                              mov     si,10C0h                ; (273F:10C0=3)
+273F:4FD1 \xFABE 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 ?
@@ -12220,7 +12244,7 @@
 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    sub_131                 ; (55A1)
+273F:509D  E8 0501                              call    skorl_caught_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
@@ -12247,7 +12271,7 @@
 273F:50C8                       loc_1040:                                       ;  xref 273F:505A
 273F:50C8  F7 44 58 FFFF                        test    word ptr [si+58h],0FFFFh
 273F:50CD  74 0F                                jz      loc_1041                ; Jump if zero
-273F:50CF  F6 06 6D52 FF                        test    player_action_state, 0FFh 
+273F:50CF  F6 06 6D52 FF                        test    player_action_state, 0FFh
 273F:50D4  74 08                                jz      loc_1041                ; Jump if zero
 273F:50D6  C6 44 2A C7                          mov     byte ptr [si+2Ah],0C7h
 273F:50DA  C6 07 02                             mov     byte ptr [bx],2
@@ -12336,7 +12360,7 @@
 273F:518B  C3                                   retn
 273F:518C                       loc_1054:                                       ;  xref 273F:5166
 273F:518C  53                                   push    bx
-273F:518D \xFABB 10C0                              mov     bx,10C0h                ; (273F:10C0=3)
+273F:518D \xFABB 10C0                              mov     bx, offset data_616
 273F:5190                       loc_1055:                                       ;  xref 273F:519C
 273F:5190  8B 07                                mov     ax,[bx]
 273F:5192  0B C0                                or      ax,ax                   ; Zero ?
@@ -12350,6 +12374,7 @@
 273F:51A6  C3                                   retn
 273F:51A7                       loc_1056:                                       ;  xref 273F:5194
 273F:51A7  5B                                   pop     bx
+                standard_character_tick_proc    endp
 
                                 ;\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF
                                 ;                              SUBROUTINE
@@ -12415,50 +12440,61 @@
 273F:521E  F6 44 49 FF                          test    byte ptr [si+49h],0FFh
 273F:5222  74 03                                jz      loc_1063                ; Jump if zero
 273F:5224  E8 F160                              call    sub_94                  ; (4387)
-273F:5227                       loc_1063:                                       ;  xref 273F:5222
+273F:5227                       loc_1063:
 273F:5227  8B DE                                mov     bx,si
 273F:5229  03 5C 61                             add     bx, [si+HS_ACTION_OFFSET]
 273F:522C  83 C3 63                             add     bx, HS_FIRST_ACTION_OFFSET
 273F:522F  E8 BC7E                              call    character_update_frame
-273F:5232  0A C0                                or      al,al                   ; Zero ?
+273F:5232  0A C0                                or      al, al                  ; Zero ?
 273F:5234  75 02                                jnz     loc_1064                ; Jump if not zero
-273F:5236  EB 03                                jmp     short loc_1065          ; (523B)
-273F:5238                       loc_1064:                                       ;  xref 273F:5234
-273F:5238  C6 07 02                             mov     byte ptr [bx],2
-273F:523B                       loc_1065:                                       ;  xref 273F:5236
-273F:523B  F7 44 52 FFFF                        test    [si+HS_DEST_HOTSPOT], 0FFFFh
-273F:5240  74 03                                jz      loc_ret_1066            ; Jump if zero
-273F:5242  E8 F043                              call    sub_91                  ; (4288)
+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: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
+273F:5242  E8 F043                              call    character_check_room_change ; Room change check
 
-273F:5245                       loc_ret_1066:                                   ;  xref 273F:5240
+273F:5245                       loc_ret_1066:
 273F:5245  C3                                   retn
-273F:5246                       loc_1067:                                       ;  xref 273F:4360
-273F:5246  80 25 F8                             and     byte ptr [di],0F8h
-273F:5249  80 64 0D F8                          and     byte ptr [si+0Dh],0F8h
-273F:524D  80 0D 05                             or      byte ptr [di],5
-273F:5250  80 4C 0D 05                          or      byte ptr [si+0Dh],5
-273F:5254  C6 44 60 00                          mov     byte ptr [si+60h],0
-273F:5258  C6 45 1D 2A                          mov     byte ptr [di+1Dh],2Ah   ; '*'
-273F:525C  C6 07 02                             mov     byte ptr [bx],2
-273F:525F  F6 C1 FF                             test    cl,0FFh
-273F:5262  74 12                                jz      loc_ret_1068            ; Jump if zero
-273F:5264  F6 C1 80                             test    cl,80h
-273F:5267  75 0E                                jnz     loc_1069                ; Jump if not zero
-273F:5269  F6 C1 40                             test    cl,40h                  ; '@'
-273F:526C  75 0C                                jnz     loc_1070                ; Jump if not zero
-273F:526E  F6 C1 20                             test    cl,20h                  ; ' '
-273F:5271  75 0A                                jnz     loc_1071                ; Jump if not zero
+
+                                ;\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF
+                                ;                              JUMP POINT
+                                ;
+                                ;\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF
+
+                     character_change_room_2:
+273F:5246  80 25 F8                             and     byte ptr [di+ANIM_X], 0F8h
+273F:5249  80 64 0D F8                          and     byte ptr [si+HS_X], 0F8h
+273F:524D  80 0D 05                             or      byte ptr [di+ANIM_X], 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: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
+273F:5267  75 0E                                jnz     loc_1069                ; Face up
+273F:5269  F6 C1 40                             test    cl, 40h
+273F:526C  75 0C                                jnz     loc_1070                ; Face down
+273F:526E  F6 C1 20                             test    cl, 20h
+273F:5271  75 0A                                jnz     loc_1071                ; Face left
 273F:5273  E9 F296                              jmp     char_face_right
 
-273F:5276                       loc_ret_1068:                                   ;  xref 273F:5262
+273F:5276                       loc_ret_1068:
 273F:5276  C3                                   retn
-273F:5277                       loc_1069:                                       ;  xref 273F:5267
+273F:5277                       loc_1069:
 273F:5277  E9 F25F                              jmp     char_face_up
-273F:527A                       loc_1070:                                       ;  xref 273F:526C
+273F:527A                       loc_1070:
 273F:527A  E9 F26D                              jmp     char_face_down
-273F:527D                       loc_1071:                                       ;  xref 273F:5271
+273F:527D                       loc_1071:
 273F:527D  E9 F27B                              jmp     char_face_left
 
+                                ;\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF
+                                ;                              SUBROUTINE
+                                ;
+                                ;\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF
+
                                                                                 ;* No entry point to code
 273F:5280  F6 06 6D52 FF                        test    player_action_state, 0FFh
 273F:5285  74 0E                                jz      loc_1072                ; Jump if zero
@@ -12885,41 +12921,42 @@
                                 ;         Called from:   273F:44C7, 509D, 7F5D
                                 ;\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC
 
-273F:55A1                       sub_131         proc    near
-273F:55A1  8B 47 0D                             mov     ax,[bx+0Dh]
-273F:55A4  03 47 19                             add     ax,[bx+19h]
-273F:55A7  05 0004                              add     ax,4
-273F:55AA  3B 44 0D                             cmp     ax,[si+0Dh]
+                          skorl_caught_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
+273F:55AA  3B 44 0D                             cmp     ax, [si+HS_X]
 273F:55AD  72 44                                jb      loc_1104                ; Jump if below
-273F:55AF  8B 44 0D                             mov     ax,[si+0Dh]
-273F:55B2  03 44 19                             add     ax,[si+19h]
-273F:55B5  05 0004                              add     ax,4
-273F:55B8  3B 47 0D                             cmp     ax,[bx+0Dh]
+273F:55AF  8B 44 0D                             mov     ax, [si+HS_X]
+273F:55B2  03 44 19                             add     ax, [si+HS_WIDTH_COPY]
+273F:55B5  05 0004                              add     ax, 4
+273F:55B8  3B 47 0D                             cmp     ax, [bx+HS_X]
 273F:55BB  72 36                                jb      loc_1104                ; Jump if below
-273F:55BD  8B 44 0F                             mov     ax,[si+0Fh]
-273F:55C0  03 44 1B                             add     ax,[si+1Bh]
-273F:55C3  2B 44 1D                             sub     ax,[si+1Dh]
-273F:55C6  2D 0002                              sub     ax,2
-273F:55C9  8B 4F 0F                             mov     cx,[bx+0Fh]
-273F:55CC  03 4F 1B                             add     cx,[bx+1Bh]
-273F:55CF  83 C1 02                             add     cx,2
-273F:55D2  3B C1                                cmp     ax,cx
+
+273F:55BD  8B 44 0F                             mov     ax, [si+HS_Y]
+273F:55C0  03 44 1B                             add     ax, [si+HS_HEIGHT_COPY]
+273F:55C3  2B 44 1D                             sub     ax, [si+HS_Y_CORRECTION]
+273F:55C6  2D 0002                              sub     ax, 2
+273F:55C9  8B 4F 0F                             mov     cx, [bx+HS_Y]
+273F:55CC  03 4F 1B                             add     cx, [bx+HS_HEIGHT_COPY]
+273F:55CF  83 C1 02                             add     cx, 2
+273F:55D2  3B C1                                cmp     ax, cx
 273F:55D4  73 1D                                jae     loc_1104                ; Jump if above or =
-273F:55D6  8B 44 0F                             mov     ax,[si+0Fh]
-273F:55D9  03 44 1B                             add     ax,[si+1Bh]
-273F:55DC  05 0002                              add     ax,2
-273F:55DF  8B 4F 0F                             mov     cx,[bx+0Fh]
-273F:55E2  03 4F 1B                             add     cx,[bx+1Bh]
-273F:55E5  2B 4F 1D                             sub     cx,[bx+1Dh]
-273F:55E8  83 E9 02                             sub     cx,2
-273F:55EB  3B C1                                cmp     ax,cx
+273F:55D6  8B 44 0F                             mov     ax, [si+HS_Y]
+273F:55D9  03 44 1B                             add     ax, [si+HS_HEIGHT_COPY]
+273F:55DC  05 0002                              add     ax, 2
+273F:55DF  8B 4F 0F                             mov     cx, [bx+HS_Y]
+273F:55E2  03 4F 1B                             add     cx, [bx+HS_HEIGHT_COPY]
+273F:55E5  2B 4F 1D                             sub     cx, [bx+HS_Y_CORRECTION]
+273F:55E8  83 E9 02                             sub     cx, 2
+273F:55EB  3B C1                                cmp     ax, cx
 273F:55ED  72 04                                jb      loc_1104                ; Jump if below
 273F:55EF  0D 0001                              or      ax,1
 273F:55F2  C3                                   retn
 273F:55F3                       loc_1104:                                       ;  xref 273F:55AD, 55BB, 55D4, 55ED
 273F:55F3  33 C0                                xor     ax,ax                   ; Zero register
 273F:55F5  C3                                   retn
-                                sub_131         endp
+                          skorl_caught_check    endp
 
 
                                 ;\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF
@@ -14177,7 +14214,7 @@
 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:5F11  C6 45 27 00                          mov     byte ptr [di+ANIM_UNKOWN1], 0
+273F:5F11  C6 45 27 00                          mov     byte ptr [di+ANIM_UNKNOWN1], 0
 
 273F:5F15                       loc_ret_1207:                                   ;  xref 273F:5EFC
 273F:5F15  C3                                   retn
@@ -14247,7 +14284,7 @@
 273F:5F86                       loc_1215:
 273F:5F86  3D 0001                              cmp     ax,1
 273F:5F89  74 42                                je      loc_1218                ; Jump if equal
-273F:5F8B  F6 45 27 01                          test    byte ptr [di+ANIM_UNKOWN1], 1
+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
@@ -14322,7 +14359,7 @@
 273F:6033                       loc_1223:                                       ;  xref 273F:5FDB, 6027
 273F:6033  C6 07 02                             mov     byte ptr [bx], PLAYER_ACTION_DISPATCH_ACTION
 273F:6036                       loc_1224:                                       ;  xref 273F:6015
-273F:6036  E9 E24F                              jmp     loc_833                 ; (4288)
+273F:6036  E9 E24F                              jmp     character_check_room_change
 
                              action_look_3      endp
 
@@ -16810,25 +16847,25 @@
 273F:717E  8B 44 0F                             mov     ax, [si+HS_Y]           ; Copy over Y start
 273F:7181  89 45 02                             mov     [di+ANIM_Y], ax
 273F:7184  8B 44 0D                             mov     ax, [si+HS_X]           ; Copy over X start
-273F:7187  89 05                                mov     [di], ax
+273F:7187  89 05                                mov     [di+ANIM_X], ax
 273F:7189  8B 44 11                             mov     ax, [si+HS_WIDTH]       ; Copy over width
 273F:718C  89 45 04                             mov     [di+ANIM_WIDTH], ax
 273F:718F  8B 44 13                             mov     ax, [si+HS_HEIGHT]      ; Copy over height
 273F:7192  89 45 06                             mov     [di+ANIM_HEIGHT], ax
 273F:7195  8A 44 15                             mov     al, [si+HS_LAYER]       ; Copy layer
 273F:7198  88 45 0C                             mov     [di+ANIM_LAYER], al
-273F:719B  8A 44 16                             mov     al, [si+16h]            ; Flags byte?
-273F:719E  88 45 0D                             mov     [di+0Dh], al
+273F:719B  8A 44 16                             mov     al, [si+16h] 
+273F:719E  88 45 0D                             mov     [di+ANIM_FLAGS], al
 273F:71A1  C6 45 10 01                          mov     byte ptr [di+ANIM_CAN_UNLOAD], 1
 273F:71A5  8B 44 17                             mov     ax, [si+HS_TICK_PROC]   ; Copy tick handler proc
 273F:71A8  89 45 11                             mov     [di+ANIM_TICK_PROC], ax
-273F:71AB  8B 44 19                             mov     ax, [si+19h]
-273F:71AE  89 45 13                             mov     [di+13h],ax
-273F:71B1  8B 44 1B                             mov     ax,[si+1Bh]
-273F:71B4  89 45 15                             mov     [di+15h],ax
-273F:71B7  8B 44 1D                             mov     ax, [si+1Dh]
-273F:71BA  89 45 17                             mov     [di+17h], ax
-273F:71BD  C7 45 1E 0000                        mov     word ptr [di+1Eh], 0    ; Hotspot Id?
+273F:71AB  8B 44 19                             mov     ax, [si+HS_WIDTH_COPY]
+273F:71AE  89 45 13                             mov     [di+ANIM_WIDTH_COPY], ax
+273F:71B1  8B 44 1B                             mov     ax, [si+HS_HEIGHT_COPY]
+273F:71B4  89 45 15                             mov     [di+ANIM_HEIGHT_COPY], ax
+273F:71B7  8B 44 1D                             mov     ax, [si+HS_Y_CORRECTION] ; Y correction
+273F:71BA  89 45 17                             mov     [di+ANIM_Y_CORRECTION], ax
+273F:71BD  C7 45 1E 0000                        mov     word ptr [di+ANIM_VOICE_CHAR_ID], 0
 273F:71C2  8B 44 06                             mov     ax, [si+HS_ROOM_NUM]    ; Copy room number
 273F:71C5  89 45 0E                             mov     [di+ANIM_ROOM_NUM], ax
 273F:71C8  8A 44 23                             mov     al, [si+HS_START_COLOUR] ; Copy colour offset
@@ -16838,13 +16875,13 @@
 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:71D9  F6 47 02 04                          test    byte ptr [bx+PIXEL_FLAGS], 4
+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
 273F:71E1  26: 8B 0E 0000                       mov     cx, es:[0]
 273F:71E6                       loc_1422:
 273F:71E6  89 4D 08                             mov     [di+ANIM_FRAME_OFFSET], cx ; Set frame
-273F:71E9  C6 45 27 01                          mov     byte ptr [di+ANIM_UNKOWN1], 1
+273F:71E9  C6 45 27 01                          mov     byte ptr [di+ANIM_UNKNOWN1], 1
 273F:71ED  C3                                   retn
                           animation_load        endp
 
@@ -18503,13 +18540,13 @@
 273F:7C7F  C6 07 02                             mov     byte ptr [bx],2
 273F:7C82  C7 47 03 0007                        mov     word ptr [bx+3],7
 273F:7C87  C6 44 2A 00                          mov     byte ptr [si+2Ah],0
-273F:7C8B  E9 D2F4                              jmp     loc_1021                ; (4F82)
+273F:7C8B  E9 D2F4                              jmp     standard_character_tick_proc
 273F:7C8E                       loc_1549:                                       ;  xref 273F:7C68
 273F:7C8E  F6 44 FF FF                          test    byte ptr [si-1],0FFh
 273F:7C92  74 07                                jz      loc_1551                ; Jump if zero
 273F:7C94  80 6C FF 01                          sub     byte ptr [si-1],1
 273F:7C98                       loc_1550:                                       ;  xref 273F:7C61
-273F:7C98  E9 D2E7                              jmp     loc_1021                ; (4F82)
+273F:7C98  E9 D2E7                              jmp     standard_character_tick_proc
 273F:7C9B                       loc_1551:                                       ;  xref 273F:7C92
 273F:7C9B  8B 5C 06                             mov     bx,[si+6]
 273F:7C9E  83 EB 01                             sub     bx,1
@@ -18571,7 +18608,7 @@
 273F:7D32  F7 E1                                mul     cx                      ; dx:ax = reg * ax
 273F:7D34  88 54 FF                             mov     [si-1],dl
 273F:7D37                       loc_1557:                                       ;  xref 273F:7CD4, 7CE2
-273F:7D37  E9 D248                              jmp     loc_1021                ; (4F82)
+273F:7D37  E9 D248                              jmp     standard_character_tick_proc
 
                                 ;\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF
                                 ;                              SUBROUTINE
@@ -18915,18 +18952,19 @@
                              skorl_tick_proc    proc    near
 273F:7EFA  F7 06 BA2B FFFF                      TEST    data_1130, 0FFFFh
 273F:7F00  74 22                                jz      vskorl_2
-273F:7F02  F6 45 1D FF                          test    byte ptr [DI+1D], 0FFh
+273F:7F02  F6 45 1D FF                          test    byte ptr [di+ANIM_LAYER1_SKIP], 0FFh
 273F:7F06  75 1C                                jnz     vskorl_2
 273F:7F08  F6 06 1926 FF                        test    data_669, 0FFh
 273F:7F0D  75 15                                jnz     vskorl_2
 273F:7F0F  BB 6CEF                              mov     bx, offset player_hotspot_rec
-273F:7F12  8B 44 06                             mov     ax, [si+06]
-273F:7F15  3B 47 06                             cmp     ax, [bx+06]
-273F:7F18  75 0A                                jnz     vskorl_2
-273F:7F1A  E8 84 D6                             call    55A1
+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:7F1D  74 05                                jz      vskorl_2
-273F:7F1F  80 0E 073D 70                        or      status_flags2, 70h
-273F:7F24  E9 5B D0               vskorl_2:     jmp     loc_1021
+273F:7F1F  80 0E 073D 70                        or      status_flags2, FLAG_RESTART || FLAG_CAUGHT || FLAG_RESTORERESTART
+
+273F:7F24  E9 5B D0               vskorl_2:     jmp     standard_character_tick_proc
                              skorl_tick_proc    endp
 
                                 ;\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF\xDF
@@ -18977,7 +19015,7 @@
 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 \xFABB 6CEF                              mov     bx, offset player_hotspot_rec
-273F:7F5D  E8 D641                              call    sub_131                 ; (55A1)
+273F:7F5D  E8 D641                              call    skorl_caught_check
 273F:7F60  74 04                                jz      loc_ret_1597            ; Jump if zero
 273F:7F62  80 44 2A 01                          add     byte ptr [si+2Ah],1
 
@@ -25004,8 +25042,9 @@
 
 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                       ;  xref 273F:60EA
-31E4:10C0  0030[00]                             db      48 dup (0)
+31E4:10BE  0000                    data_615     dw      0
+31E4:10C0  002E[00]                data_616     db      48 dup (0)
+31E4:10EE  0000                    data_617     dw      0
 31E4:10F0  00               animation_table2    db      0                       ;  xref 273F:1556, 273F:1598
                                                                                 ;       273F:15C3
 31E4:10F1  00CF[00]                             db      207 dup (0)

Modified: scummvm/trunk/engines/lure/diassembly/Lure_notes.txt
===================================================================
--- scummvm/trunk/engines/lure/diassembly/Lure_notes.txt	2006-03-17 20:49:12 UTC (rev 21348)
+++ scummvm/trunk/engines/lure/diassembly/Lure_notes.txt	2006-03-17 21:59:29 UTC (rev 21349)
@@ -69,6 +69,18 @@
      Input:  si = Hotspot record
              di = Animation slot
 
+character_change_room - Changes the current room for a given character
+     Input:  current_hotspot = Character hotspot Id
+             dx = New room number
+             cx = New X position
+             bx = New Y position
+
+character_check_room_change - Checks whether the given character is within the
+              bounds of a room exit, and if so, handles moving the player to
+              the new room
+    Input:  si = Character hotspot Id
+            di = Chracter animation slot
+
 character_update_frame - Handles updating a character's current frame
    Input:  ?
   Output:  ax = 1 for end of ?? list, 0 = frame successfully changed
@@ -359,7 +371,7 @@
 sequence_execute - Outer execution method for handling a sequence of script instructions.
      Input: ax = Pointer to script set. See tables section for instruction formats
     Output: ax = sequence result value
-            zf = set if the result value is zero 
+            zf = set if the result value is zero
 
 sequence_execute_inner - Inner handling method for script instructions
      Input:  si = Pointer to script set
@@ -373,6 +385,13 @@
 show_startup - Shows the starting screens of the game, and then calls the
                show_introduction method to show the animated introduction sequence
 
+skorl_caught_check - Checks to see if the Skorl is close enough to the player
+              for it to 'catch' the player
+     Input:  bx = Player hotspot record
+             si = Skorl hotspot record
+             di = Skorl animation slot
+    Output:  ax = 1 -> Skorl is close to player, 0 -> Skorl is not
+
 skorl_knockout - Runs the animation sequence of a Skorl knocking out the player
 
 sleep - Sleeps for a given number of clock cycles (each being 1/18th of a second)
@@ -664,6 +683,9 @@
            17h     2    Tick handler proc offset
            19h     2    Copy of hotspot width
            1Bh     2    Copy of hotspot height
+           1Dh     2    Y correction. Currently only known use is as a Y
+                        correction factor when checking if a character is in
+                        an exit region
            1fh     2    Timeout decrement value for frame change
            21h     2    Pointer to memory containing disk resource Id for the
                         pixel data for the hotspot's animation (or possibly
@@ -781,8 +803,15 @@
                         sets this back to zero
             11h    2    Tick handler proc offset - called every frame for hotspots
                         loaded into the animation table where [0Ch] is non-zero
-            13h    2    ??? Copy of the animation width
-            15h    2    ??? Copy of the animation height
+            13h    2    Copy of the animation width - this the height copy are
+                        used in some areas to, for example, varying the strict
+                        Y ordering of objects in a scene (for example, Ratpouch
+                        has a larger height copy to make him appear on top of
+                        the rack rather than behind it).
+            15h    2    Copy of the animation height
+            17h    2    Y correction. Currently only known use is as a Y
+                        correction factor when checking if a character is in
+                        an exit region
             19h    2    Offset of the original resource record used to load this
                         animation entry.
             1Bh    2    Hotspot Id of the entry. Can also be 0ffffh, which seems


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.





More information about the Scummvm-git-logs mailing list