
рдирдорд╕реНрддреЗ, рдпрд╣ рдореЗрд░реЗ рдкреНрд░рдХрд╛рд╢рдиреЛрдВ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рддреАрд╕рд░рд╛ рднрд╛рдЧ рд╣реИ, рдЬреЛ рдиреНрдпреВрд░реЛрдорд╛рдВрд╕рд░ рдХреЗ рд░рд┐рд╡рд░реНрд╕ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рд╣реИ - рд╡рд┐рд▓рд┐рдпрдо рдЧрд┐рдмреНрд╕рди рджреНрд╡рд╛рд░рд╛ рдЗрд╕реА рдирд╛рдо рдХреЗ рдЙрдкрдиреНрдпрд╛рд╕ рдХрд╛ рдПрдХ рд╡реАрдбрд┐рдпреЛ рдЧреЗрдо рдЕрд╡рддрд╛рд░ред
рдиреНрдпреВрд░реЛрдорд╛рдВрд╕рд░ рдХрд╛ рдЙрд▓рдЯрд╛ред рднрд╛рдЧ 1: рд╕реНрдкреНрд░рд╛рдЗрдЯреНрд╕
рдиреНрдпреВрд░реЛрдорд╛рдВрд╕рд░ рдХрд╛ рдЙрд▓рдЯрд╛ред рднрд╛рдЧ 2: рд░реЗрдВрдбрд░ рдлрд╝реЙрдиреНрдЯ
рдпрд╣ рд╣рд┐рд╕реНрд╕рд╛ рдХреБрдЫ рдЕрд╡реНрдпрд╡рд╕реНрдерд┐рдд рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдЬреЛ рдХреБрдЫ рднреА рд╡рд░реНрдгрд┐рдд рд╣реИ, рдЙрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкрд┐рдЫрд▓реЗ рдПрдХ рд▓рд┐рдЦрдиреЗ рдХреЗ рд╕рдордп рддреИрдпрд╛рд░ рдерд╛ред рдЬрдм рд╕реЗ рджреЛ рдорд╣реАрдиреЗ рдкрд╣рд▓реЗ рд╣реА рд╕рдорд╛рдкреНрдд рд╣реЛ рдЪреБрдХреЗ рд╣реИрдВ, рдФрд░, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореБрдЭреЗ рдХрд╛рдо рдиреЛрдЯ рд░рдЦрдиреЗ рдХреА рдЖрджрдд рдирд╣реАрдВ рд╣реИ, рдореИрдВ рдмрд╕ рдХреБрдЫ рд╡рд┐рд╡рд░рдг рднреВрд▓ рдЧрдпрд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рд╣реИ, рдЪрд▓рд┐рдПред
[рдЬрдм рдореИрдВрдиреЗ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рдирд╛ рд╕реАрдЦ рд▓рд┐рдпрд╛, рддреЛ рд╕рдВрд╡рд╛рдж рдмреЙрдХреНрд╕ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдЙрд▓рдЯ рджреЗрдирд╛ рдЬрд╛рд░реА рд░рдЦрдирд╛ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди, рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдореБрдЭреЗ рднрд╛рдЧрдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреНрд░рддрд┐рдкрд╛рджрди рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдореЗрдВ рдЪрд▓рд╛ рдЧрдпрд╛ред] рдПрдХ рдмрд╛рд░ рдлрд┐рд░, main
рд╕рд╛рде рдЪрд▓рддреЗ рд╣реБрдП, рдореИрдВ рдЙрд╕ рдХреЙрд▓ рдХреЛ рд╕реНрдерд╛рдиреАрдпрдХреГрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ рдЬреЛ рдкрд╣рд▓реЗ рд╕реНрдХреНрд░реАрди рдкрд░ рдХреБрдЫ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ: seg000:0159: call sub_1D0B2
ред "рдХреБрдЫ рднреА", рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореБрдЦреНрдп рдореЗрдиреВ рдХрд╛ рдХрд░реНрд╕рд░ рдФрд░ рдкреГрд╖реНрдарднреВрдорд┐ рдЫрд╡рд┐ рд╣реИ:

рдпрд╣ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд╣реИ рдХрд┐ sub_1D0B2
рдлрд╝рдВрдХреНрд╢рди [рдЗрд╕рдХреЗ рдмрд╛рдж - render
] рдХрд╛ рдХреЛрдИ рддрд░реНрдХ рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕рдХреА рдкрд╣рд▓реА рдХреЙрд▓ рджреЛ, рдХреЛрдб рдХреЗ рд▓рдЧрднрдЧ рд╕рдорд╛рди рд╡рд░реНрдЧреЛрдВ рд╕реЗ рдкрд╣рд▓реЗ рдХреА рд╣реИ:
loc_100E5: loc_10123: mov ax, 2 mov ax, 2 mov dx, seg seg009 mov dx, seg seg010 push dx push dx push ax push ax mov ax, 506Ah mov ax, 5076h ; "cursors.imh", "title.imh" push ax push ax call load_imh call load_imh ; load_imh(res, offt, seg) add sp, 6 add sp, 6 sub ax, ax sub ax, 0Ah push ax push ax call sub_123F8 call sub_123F8 ; sub_123F8(0), sub_123F8(10) add sp, 2 add sp, 2 cmp word_5AA92, 0 mov ax, 1 jz short loc_10123 push ax sub ax, ax mov ax, 2 push ax mov dx, seg seg010 mov ax, 2 push dx mov dx, seg seg009 push ax push dx sub ax, ax push ax push ax mov ax, 64h push ax push ax mov ax 0Ah mov ax, 0A0h push ax push ax call sub_1CF5B ; sub_1CF5B(10, 0, 0, 2, seg010, 1) sub ax, ax add sp, 0Ch push ax call render call sub_1CF5B ; sub_1CF5B(0, 160, 100, 2, seg009, 0) add sp, 0Ch
render
рдХреЙрд▓ render
рд╕реЗ рдкрд╣рд▓реЗ, рдХрд░реНрд╕рд░ (рдХрд░реНрд╕рд░) ( cursors.imh
) рдФрд░ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб ( title.imh
) рдХреЛ рдореЗрдореЛрд░реА рдореЗрдВ рдЕрдирдкреИрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ( load_imh
рдХреЛ рдкрд╣рд▓реЗ рднрд╛рдЧ рд╕реЗ рдмрджрд▓рд╛ рдЧрдпрд╛ sub_126CB
рд╣реИ), рдХреНрд░рдорд╢рдГ рдиреМрд╡реЗрдВ рдФрд░ рджрд╕рд╡реЗрдВ рдЦрдВрдбреЛрдВ рдореЗрдВред рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рд╕рддрд╣реА рдЕрдзреНрдпрдпрди sub_123F8
рдиреЗ рдореБрдЭреЗ рдХреЛрдИ рдирдИ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рджреА, рд▓реЗрдХрд┐рди, рдХреЗрд╡рд▓ sub_1CF5B
рдХреЗ рддрд░реНрдХреЛрдВ рдХреЛ sub_1CF5B
, рдореИрдВрдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рд╖реНрдХрд░реНрд╖ рджрд┐рдП:
- рддрд░реНрдХреЛрдВ 4 рдФрд░ 5 рдХреЛ рдПрдХ рд╕рд╛рде рд▓рд┐рдпрд╛ рдЧрдпрд╛, рд╡рд┐рдШрдЯрд┐рдд рд╕реНрдкреНрд░рд╛рдЗрдЯ (
segment:offset
) рдХреЗ рдкрддреЗ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВ; - рддрд░реНрдХ 2 рдФрд░ 3 рд╕рдВрднрд╡рддрдГ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпреЗ рдирдВрдмрд░ рдХреЙрд▓
render
рдмрд╛рдж рдкреНрд░рджрд░реНрд╢рд┐рдд рдЫрд╡рд┐ рдХреЗ рд╕рд╛рде рд╕рд╣рд╕рдВрдмрдВрдзрд┐рдд render
; - рдЕрдВрддрд┐рдо рддрд░реНрдХ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдХреА рдкреГрд╖реНрдарднреВрдорд┐ рдХреА рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдХрд╛ рдЭрдВрдбрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдирдкреИрдХ рдХрд┐рдП рдЧрдП рд╕реНрдкреНрд░рд╛рдЗрдЯ рдореЗрдВ рдПрдХ рдХрд╛рд▓реА рдкреГрд╖реНрдарднреВрдорд┐ рд╣реЛрддреА рд╣реИ, рдФрд░ рд╣рдо рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рд╕реНрдХреНрд░реАрди рдкрд░ рдХрд░реНрд╕рд░ рджреЗрдЦрддреЗ рд╣реИрдВред
рдкрд╣рд▓реЗ рддрд░реНрдХ рдХреЗ рд╕рд╛рде [рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рдореЗрдВ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ] рд╕рдм рдХреБрдЫ рд╕рдм sub_1CF5B
рдХреЛ рдЯреНрд░реЗрд╕ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЧрдпрд╛ред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рдЦрдВрдб рдореЗрдВ, рдкрддрд╛ 0x3BD4
рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдирд┐рдореНрди рдкреНрд░рдХрд╛рд░ рдХреА 11 рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреА рдПрдХ рд╕рд░рдгреА рд╕реНрдерд┐рдд рд╣реИ:
typedef struct sprite_layer_t { uint8_t flags; uint8_t update; uint16_t left; uint16_t top; uint16_t dleft; uint16_t dtop; imh_hdr_t sprite_hdr; uint16_t sprite_segment; uint16_t sprite_pixels; imh_hdr_t _sprite_hdr; uint16_t _sprite_segment; uint16_t _sprite_pixels; } sprite_layer_t;
рдореИрдВ рдЗрд╕ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдЪреЗрди рдХрд╣рддрд╛ рд╣реВрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, sub_1CF5B
рдлрд╝рдВрдХреНрд╢рди (рдЗрд╕рдХреЗ рдмрд╛рдж add_sprite_to_chain
) рдЪрдпрдирд┐рдд рд╕реНрдкреНрд░рд╛рдЗрдЯ рдХреЛ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИред 16-рдмрд┐рдЯ рдорд╢реАрди рдкрд░, рдЗрд╕рдореЗрдВ рд▓рдЧрднрдЧ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣реЛрдВрдЧреЗ:
sprite_layer_t g_sprite_chain[11]; void add_sprite_to_chain(int index, uint16_t left, uint16_t top, uint16_t offset, uint16_t segment, uint8_t opaque);
рдпрд╣ рдЗрд╕ рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
- рдкрд╣рд▓рд╛ рддрд░реНрдХ
g_sprite_chain
рд╕рд░рдгреА рдореЗрдВ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рд╣реИ; left
рдФрд░ top
рддрд░реНрдХ g_sprite_chain[index].left
рдФрд░ g_sprite_chain[index].top
рдХреЛ рд▓рд┐рдЦреЗ рдЬрд╛рддреЗ рд╣реИрдВ;- рд╕реНрдкреНрд░рд╛рдЗрдЯ рд╣реЗрдбрд░ (
segment:offset
рдкрд░ рд╕реНрдерд┐рдд рдкрд╣рд▓реЗ 8 рдмрд╛рдЗрдЯреНрд╕ segment:offset
) рдХреЛ g_sprite_chain[index].sprite_hdr
рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ imh_hdr_t
, imh_hdr_t
(рдкрд╣рд▓реЗ рднрд╛рдЧ рд╕реЗ рдмрджрд▓рд╛ рдЧрдпрд╛ rle_hdr_t
):
typedef struct imh_hdr_t { uint32_t unknown; uint16_t width; uint16_t height; } imh_hdr_t;
- рдлрд╝реАрд▓реНрдб
g_sprite_chain[index].sprite_segment
segment
рдХрд╛ рдорд╛рди рд░рд┐рдХреЙрд░реНрдб рдХрд░рддрд╛ рд╣реИ; g_sprite_chain[index].sprite_pixels
, offset + 8
рдмрд░рд╛рдмрд░ рдПрдХ рдорд╛рди рд▓рд┐рдЦрд╛ offset + 8
рд╣реИ, рдЗрд╕рд▓рд┐рдП sprite_segment:sprite_pixels
рдмрд┐рдЯрдореИрдк рдХрд╛ рдкрддрд╛ рд╣реИ;sprite_hdr
, sprite_segment
, рдФрд░ sprite_pixels
рдХреНрд░рдорд╢рдГ _sprite_hdr
, _sprite_segment
, рдФрд░ _sprite_pixels
рдЧрдП рд╣реИрдВ [рдХреНрдпреЛрдВ? - рдореБрдЭреЗ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдпрд╣ рдЦреЗрддреЛрдВ рдХреЗ рдРрд╕реЗ рджреЛрд╣рд░рд╛рд╡ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реИ] ;- рдлрд╝реАрд▓реНрдб рдореЗрдВ
g_sprite_chain[index].flags
1 + (opaque << 4)
рдмрд░рд╛рдмрд░ рдорд╛рди рд▓рд┐рдЦрд╛ 1 + (opaque << 4)
рд╣реИ 1 + (opaque << 4)
ред рдЗрд╕ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ flags
рдореВрд▓реНрдп рдХрд╛ рдкрд╣рд▓рд╛ рдмрд┐рдЯ "рд╡рд░реНрддрдорд╛рди" рдкрд░рдд рдХреА "рдЧрддрд┐рд╡рд┐рдзрд┐" рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдкрд╛рдВрдЪрд╡реЗрдВ рдмрд┐рдЯ рдЗрд╕рдХреА рдкреГрд╖реНрдарднреВрдорд┐ рдХреА рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред [рдкрд╛рд░рджрд░реНрд╢реА рдЪрд┐рддреНрд░ рдкрд░ рдЗрд╕рдХреЗ рдкреНрд░рднрд╛рд╡ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдзреНрд╡рдЬ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░рд╛ рд╕рдВрджреЗрд╣ рджреВрд░ рд╣реЛ рдЧрдпрд╛ред рдкрд╛рдВрдЪрд╡реАрдВ рдмрд┐рдЯ рдХреЗ рд░рдирдЯрд╛рдЗрдо рдХреЗ рдореВрд▓реНрдп рдХреЛ рдмрджрд▓рддреЗ рд╣реБрдП, рд╣рдо рдЗрди рдХрд▓рд╛рдХреГрддрд┐рдпреЛрдВ рдХрд╛ рдЕрд╡рд▓реЛрдХрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ]:

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, render
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдХреЛрдИ рддрд░реНрдХ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ - рдпрд╣ рд╕реАрдзреЗ g_sprite_chain
рд╕рд░рдгреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдмрд╛рд░реА-рдмрд╛рд░реА рд╕реЗ "рд▓реЗрдпрд░реНрд╕" рдХреЛ VGA рдореЗрдореЛрд░реА рдореЗрдВ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд░рддрд╛ рд╣реИ, рдЖрдЦрд┐рд░реА ( g_sprite_chain[10]
- рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб) ( g_sprite_chain[0]
- рдЕрдЧреНрд░рднреВрдорд┐)ред sprite_layer_t
рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рдм рдХреБрдЫ рд╣реИ рдФрд░ рдЗрд╕рд╕реЗ рднреА рдЕрдзрд┐рдХред рдореИрдВ dleft
рдлрд╝реАрд▓реНрдб update
, dleft
рдФрд░ dtop
рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдБред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, render
рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рддреНрдпреЗрдХ рдлреНрд░реЗрдо рдореЗрдВ рд╕рднреА рд╕реНрдкреНрд░рд╛рдЗрдЯреНрд╕ рдХреЛ рдлрд┐рд░ рд╕реЗ рдирд╣реАрдВ рдмрдирд╛рддрд╛ рд╣реИред g_sprite_chain.update
рдлрд╝реАрд▓реНрдб рдХрд╛ рдПрдХ рдЧреИрд░-рд╢реВрдиреНрдп рдорд╛рди рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рд╕реНрдкреНрд░рд╛рдЗрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ g_sprite_chain.update
рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рдХрд░реНрд╕рд░ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ ( g_sprite_chain[0]
), рддреЛ рдорд╛рдЙрд╕ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдРрд╕рд╛ рдХреБрдЫ рд╣реЛрдЧрд╛:
void mouse_move_handler(...) { ... g_sprite_chain[0].update = 1; g_sprite_chain[0].dleft = mouse_x - g_sprite_chain[0].left; g_sprite_chain[0].dtop = mouse_y - g_sprite_chain[0].top; }
рдЬрдм рдирд┐рдпрдВрддреНрд░рдг render
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдмрд╛рдж рд╡рд╛рд▓рд╛, g_sprite_chain[0]
рд▓реЗрдпрд░ рдкрд░ рдкрд╣реБрдВрдЪ рдЬрд╛рддрд╛ рд╣реИ, рджреЗрдЦрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рддрдм:
- рд╕рднреА рдкрд┐рдЫрд▓реА рдкрд░рддреЛрдВ рдХреЗ рд╕рд╛рде рдЕрджреНрдпрддрди рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрд░реНрд╕рд░ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдХреЗ рдХрдмреНрдЬреЗ рд╡рд╛рд▓реЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдЪреМрд░рд╛рд╣реЗ рдХреА рдЧрдгрдирд╛ рдФрд░ рдЦреАрдВрдЪрд╛ рдЬрд╛рдПрдЧрд╛;
- рд╕реНрдкреНрд░рд╛рдЗрдЯ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ:
g_sprite_chain[0].update = 0; g_sprite_chain[0].left += g_sprite_chain[0].dleft g_sprite_chain[0].dleft = 0; g_sprite_chain[0].top += g_sprite_chain[0].dtop g_sprite_chain[0].dtop = 0;
- рд╕реНрдкреНрд░рд╛рдЗрдЯ рдЕрджреНрдпрддрди рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдкрд░ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдпрд╣ render
рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рд╕рдВрдЪрд╛рд▓рди рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИред
рдЗрд╕ рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рдерд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рдХрд╛рдлреА рд╕рд░рд▓ рдмрдирд╛ рджрд┐рдпрд╛ред рдЖрдзреБрдирд┐рдХ рдХрдВрдкреНрдпреВрдЯрд░реЛрдВ рдХреА рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рд╢рдХреНрддрд┐ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдлреНрд░реЗрдо рдореЗрдВ рд╕рднреА 11 рдЪреЗрди рд╕реНрдкреНрд░рд╛рдЗрдЯреНрд╕ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рдЦрд░реНрдЪ рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ g_sprite_chain.update
, .dleft
, .dtop
рдФрд░ рдЙрдирд╕реЗ рдЬреБрдбрд╝реЗ рд╕рднреА рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ .dtop
ред рдПрдХ рдФрд░ рд╕рд░рд▓реАрдХрд░рдг рдЕрдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдзреНрд╡рдЬ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдЪрд┐рдВрддрд╛ рдХрд░рддрд╛ рд╣реИред рдореВрд▓ рдХреЛрдб рдореЗрдВ, рд╕реНрдкреНрд░рд╛рдЗрдЯ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкрд╛рд░рджрд░реНрд╢реА рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рд▓рд┐рдП, рдирд┐рдЪрд▓реА рдкрд░рддреЛрдВ рдореЗрдВ рдкрд╣рд▓реЗ рдЕрдкрд╛рд░рджрд░реНрд╢реА рдкрд┐рдХреНрд╕реЗрд▓ рд╡рд╛рд▓реЗ рдЪреМрд░рд╛рд╣реЗ рдХреА рдЦреЛрдЬ рдХреА рдЬрд╛рддреА рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВ 32-рдмрд┐рдЯ рд╡реАрдбрд┐рдпреЛ рдореЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЖрд░рдЬреАрдмреАрдП рдпреЛрдЬрдирд╛ рдореЗрдВ рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдмрд╛рдЗрдЯ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реВрдВред рдирддреАрдЬрддрди, рдореБрдЭреЗ рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ (рдПрдХ) рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдЬреЛрдбрд╝рдиреЗ (рд╣рдЯрд╛рдиреЗ) рдХреЗ рдРрд╕реЗ рдХрд╛рд░реНрдп рдорд┐рд▓реЗ:
рдХреЛрдб typedef struct sprite_layer_t { uint8_t flags; uint16_t left; uint16_t top; imh_hdr_t sprite_hdr; uint8_t *sprite_pixels; imh_hdr_t _sprite_hdr; uint8_t *_sprite_pixels; } sprite_layer_t; sprite_layer_t g_sprite_chain[11]; void add_sprite_to_chain(int n, uint32_t left, uint32_t top, uint8_t *sprite, int opaque) { assert(n <= 10); sprite_layer_t *layer = &g_sprite_chain[n]; memset(layer, 0, sizeof(sprite_layer_t)); layer->left = left; layer->top = top; memmove(&layer->sprite_hdr, sprite, sizeof(imh_hdr_t)); layer->sprite_pixels = sprite + sizeof(imh_hdr_t); memmove(&layer->_sprite_hdr, &layer->sprite_hdr, sizeof(imh_hdr_t) + sizeof(uint8_t*)); layer->flags = ((opaque << 4) & 16) | 1; } void remove_sprite_from_chain(int n) { assert(n <= 10); sprite_layer_t *layer = &g_sprite_chain[n]; memset(layer, 0, sizeof(sprite_layer_t)); }
рдПрдХ рдкрд░рдд рдХреЛ рд╡реАрдЬреАрдП рдмрдлрд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:
void draw_to_vga(int left, int top, uint32_t w, uint32_t h, uint8_t *pixels, int bg_transparency); void draw_sprite_to_vga(sprite_layer_t *sprite) { int32_t top = sprite->top; int32_t left = sprite->left; uint32_t w = sprite->sprite_hdr.width * 2; uint32_t h = sprite->sprite_hdr.height; uint32_t bg_transparency = ((sprite->flags >> 4) == 0); uint8_t *pixels = sprite->sprite_pixels; draw_to_vga(left, top, w, h, pixels, bg_transparency); }
draw_to_vga
рдлрд╝рдВрдХреНрд╢рди рджреВрд╕рд░реЗ рднрд╛рдЧ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдЙрд╕реА рдирд╛рдо рдХрд╛ рдХрд╛рд░реНрдп рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдЫрд╡рд┐ рдкреГрд╖реНрдарднреВрдорд┐ рдХреА рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдХрд╛ рд╕рдВрдХреЗрдд рд╣реИред render
рдлрдВрдХреНрд╢рди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ draw_sprite_to_vga
рдХреЙрд▓ рдЬреЛрдбрд╝реЗрдВ (рдЗрд╕рдХреА рдмрд╛рдХреА рд╕рд╛рдордЧреНрд░реА рджреВрд╕рд░реЗ рднрд╛рдЧ рд╕реЗ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХреА рдЧрдИ рд╣реИ):
static void render() { for (int i = 10; i >= 0; i--) { if (!(g_sprite_chain[i].flags & 1)) { continue; } draw_sprite_to_vga(&g_sprite_chain[i]); } ... }
рдореИрдВрдиреЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рднреА рд▓рд┐рдЦрд╛ рдерд╛ рдЬреЛ рдорд╛рдЙрд╕ рдкреЙрдЗрдВрдЯрд░ ( update_cursor
), рдФрд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕рдВрд╕рд╛рдзрди рдкреНрд░рдмрдВрдзрдХ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд░реНрд╕рд░ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрджреНрдпрддрди рдХрд░рддрд╛ рд╣реИред рд╣рдо рдпрд╣ рд╕рдм рдХрд╛рдо рдПрдХ рд╕рд╛рде рдХрд░рддреЗ рд╣реИрдВ:
typedef enum spite_chain_index_t { SCI_CURSOR = 0, SCI_BACKGRND = 10, SCI_TOTAL = 11 } spite_chain_index_t; uint8_t g_cursors[399]; uint8_t g_background[32063]; int main(int argc, char *argv[]) { ... assert(resource_manager_load("CURSORS.IMH", g_cursors)); add_sprite_to_chain(SCI_CURSOR, 160, 100, g_cursors, 0); assert(resource_manager_load("TITLE.IMH", g_background)); add_sprite_to_chain(SCI_BACKGRND, 0, 0, g_background, 1); while (sfRenderWindow_isOpen(g_window)) { ... update_cursor(); render(); } ... }
рдареАрдХ рд╣реИ, рдПрдХ рдкреВрд░реНрдг-рдореБрдЦреНрдп рдореЗрдиреВ рдХреЗ рд▓рд┐рдП, рдореЗрдиреВ рд╕реНрд╡рдпрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред рд╕рдВрд╡рд╛рдж рдмреЙрдХреНрд╕реЛрдВ рдХреЗ рдЙрд▓рдЯрдиреЗ рдХрд╛ рд╕рдордп рд╣реИред [рдкрд┐рдЫрд▓реА рдмрд╛рд░, рдореИрдВрдиреЗ draw_frame
рдлрд╝рдВрдХреНрд╢рди рдХреЛ draw_frame
, рдЬреЛ рдбрд╛рдпрд▓реЙрдЧ рдмреЙрдХреНрд╕ рдмрдирд╛рддрд╛ рд╣реИ, рдФрд░, рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ, draw_string
рдлрд╝рдВрдХреНрд╢рди, рд╡рд╣рд╛рдВ рд╕реЗ рдХреЗрд╡рд▓ рдЯреЗрдХреНрд╕реНрдЯ рд░реЗрдВрдбрд░рд┐рдВрдЧ рд▓реЙрдЬрд┐рдХ рд▓реЗ рд░рд╣рд╛ рд╣реИред] draw_frame
рдирдП рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ add_sprite_to_chain
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ - рдХреБрдЫ рдЖрд╢реНрдЪрд░реНрдп рдХреА рдмрд╛рдд рдирд╣реАрдВ рд╣реИ, рдмрд╕ рдПрдХ рдбрд╛рдпрд▓реЙрдЧ рдмреЙрдХреНрд╕ рдЬреЛрдбрд╝ рд░рд╣рд╛ рд╣реИред рд╕реНрдкреНрд░рд╛рдЗрдЯ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВред рд╕рдВрд╡рд╛рдж рдмреЙрдХреНрд╕ рдХреЗ рдЕрдВрджрд░ рдкрд╛рда рдХреА рд╕реНрдерд┐рддрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдерд╛ред рдореБрдЭреЗ рдпрд╛рдж рджрд┐рд▓рд╛рдПрдВ рдХрд┐ draw_string
рдХреЙрд▓ draw_string
рджрд┐рдЦрддрд╛ рд╣реИ:
sub ax, ax push ax mov ax, 1 push ax mov ax, 5098h ; "New/Load" push ax call draw_string ; draw_string("New/Load", 1, 0)
рдФрд░ draw_frame
рднрд░рдиреЗ рдХрд╛ draw_frame
[рдпрд╣рд╛рдБ рдереЛрдбрд╝рд╛ рдЖрдЧреЗ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ draw_string
рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд▓рдЧрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдЕрдзрд┐рдХрд╛рдВрд╢ рддрддреНрд╡реЛрдВ рдХрд╛ рдирд╛рдо рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИред рд╡реИрд╕реЗ, рдпрд╣рд╛рдБ, рдЬреИрд╕рд╛ рдХрд┐ sprite_layer_t
рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЦреЗрддреЛрдВ рдХрд╛ рджреЛрд╣рд░рд╛рд╡ рд╣реИ] :
typedef struct neuro_dialog_t { uint16_t left; // word[0x65FA]: 0x20 uint16_t top; // word[0x65FC]: 0x98 uint16_t right; // word[0x65FE]: 0x7F uint16_t bottom; // word[0x6600]: 0xAF uint16_t inner_left; // word[0x6602]: 0x28 uint16_t inner_top; // word[0x6604]: 0xA0 uint16_t inner_right; // word[0x6604]: 0xA0 uint16_t inner_bottom; // word[0x6608]: 0xA7 uint16_t _inner_left; // word[0x660A]: 0x28 uint16_t _inner_top; // word[0x660C]: 0xA0 uint16_t _inner_right; // word[0x660E]: 0x77 uint16_t _inner_bottom; // word[0x6610]: 0xA7 uint16_t flags; // word[0x6612]: 0x06 uint16_t unknown; // word[0x6614]: 0x00 uint8_t padding[192] // ... uint16_t width; // word[0x66D6]: 0x30 uint16_t pixels_offset; // word[0x66D8]: 0x02 uint16_t pixels_segment; // word[0x66DA]: 0x22FB } neuro_dialog_t;
рдпрд╣рд╛рдБ рдХреНрдпрд╛, рдХреИрд╕реЗ рдФрд░ рдХреНрдпреЛрдВ рд╣реИ, рдпрд╣ рд╕рдордЭрд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдореИрдВ рд╕рд┐рд░реНрдл рдЗрд╕ рдЫрд╡рд┐ рдХреЛ рдЫреЛрдбрд╝рддрд╛ рд╣реВрдБ:

рдЪрд░ x_offt
рдФрд░ y_offt
рдХреНрд░рдорд╢рдГ draw_string
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рджреВрд╕рд░рд╛ рдФрд░ рддреАрд╕рд░рд╛ рддрд░реНрдХ рд╣реИрдВред рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рдЖрд╕рд╛рди рдерд╛ draw_frame
рдФрд░ draw_text
, рдХреЗ рдмрд╛рдж рдЙрдирдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ build_dialog_frame
рдФрд░ build_dialog_text
:
void build_dialog_frame(neuro_dialog_t *dialog, uint16_t left, uint16_t top, uint16_t w, uint16_t h, uint16_t flags, uint8_t *pixels); void build_dialog_text(neuro_dialog_t *dialog, char *text, uint16_t x_offt, uint16_t y_offt); ... typedef enum spite_chain_index_t { SCI_CURSOR = 0, SCI_DIALOG = 2, ... } spite_chain_index_t; ... uint8_t *g_dialog = NULL; neuro_dialog_t g_menu_dialog; int main(int argc, char *argv[]) { ... assert(g_dialog = calloc(8192, 1)); build_dialog_frame(&g_menu_dialog, 32, 152, 96, 24, 6, g_dialog); build_dialog_text(&g_menu_dialog, "New/Load", 8, 0); add_sprite_to_chain(SCI_DIALOG, 32, 152, g_dialog, 1); ... }

рдореЗрд░реЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдФрд░ рдореВрд▓ рд▓реЛрдЧреЛрдВ рдХреЗ рдмреАрдЪ рдореБрдЦреНрдп рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВ рдкрд┐рдХреНрд╕реЗрд▓ рдЖрдХрд╛рд░ рдХреЗ рдкреВрд░реНрдг рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ - рдпрд╣ рдЖрд╕рд╛рди рд╣реИред
рдлрд┐рд░ рднреА, рдореБрдЭреЗ рдпрдХреАрди рдерд╛ рдХрд┐ рдмрдЯрди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреБрд░рдВрдд рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рдХреЛрдб рдЕрдиреБрднрд╛рдЧ build_dialog_text
:
... mov ax, 5098h ; "New/Load" push ax call build_dialog_text ; build_dialog_text("New/Load", 1, 0) add sp, 6 mov ax, 6Eh ; 'n' - push ax sub ax, ax push ax mov ax, 3 push ax sub ax, ax push ax mov ax, 1 push ax call sub_181A3 ; sub_181A3(1, 0, 3, 0, 'n') add sp, 0Ah mov ax, 6Ch ; 'l' - push ax mov ax, 1 push ax mov ax, 4 push ax sub ax, ax push ax mov ax, 5 push ax call sub_181A3 ; sub_181A3(5, 0, 4, 1, 'l')
рдпрд╣ рд╕рдм рдЗрди рдЙрддреНрдкрдиреНрди рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ - 'n'
рдФрд░ 'l'
, рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ "New"
рдФрд░ "load"
рд╢рдмреНрджреЛрдВ рдореЗрдВ рдкрд╣рд▓реЗ рдЕрдХреНрд╖рд░ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдЧрд░ рд╣рдо build_dialog_text
рд╕рд╛рде рд╕рдорд╛рдирддрд╛ рд╕реЗ рдмрд╣рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ sub_181A3
(рдЗрд╕рдХреЗ рдмрд╛рдж - build_dialog_item
) рдХреЗ рдкрд╣рд▓реЗ рдЪрд╛рд░ рддрд░реНрдХ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдФрд░ рдЖрдХрд╛рд░реЛрдВ рдХреЗ рдХрд╛рд░рдХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ [рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдкрд╣рд▓реЗ рддреАрди рддрд░реНрдХ, рдЪреМрдереЗ, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рдЪреМрдерд╛, рдЕрдиреНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ] ред рдпрджрд┐ рдЖрдк рдЫрд╡рд┐ рдкрд░ рдЗрди рдорд╛рдиреЛрдВ рдХреЛ рдУрд╡рд░рд▓реЗ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╕рдм рдХреБрдЫ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ:

рдЫрд╡рд┐ рдореЗрдВ рдЪрд░ x_offt
, y_offt
рдФрд░ width
, рдХреНрд░рдорд╢рдГ build_dialog_item
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрд╣рд▓реЗ рддреАрди рддрд░реНрдХ рд╣реИрдВред рдЗрд╕ рдЖрдпрдд рдХреА рдКрдВрдЪрд╛рдИ рд╣рдореЗрд╢рд╛ рдкреНрд░рддреАрдХ рдХреА рдКрдВрдЪрд╛рдИ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрддреА рд╣реИ - рдЖрдаред build_dialog_item
рдкрд░ рдмрд╣реБрдд рд╣реА рдирдЬрд╝рджреАрдХреА рдирдЬрд╝рд░ build_dialog_item
, рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдореИрдВрдиреЗ neuro_dialog_t
рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ padding
(рдЕрдм items
) рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рд╣реИ, рд╡рд╣ рдирд┐рдореНрди рдлрд╝реЙрд░реНрдо рдХреА 16 рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреА рдПрдХ рд╕рд░рдгреА рд╣реИ:
typedef struct dialog_item_t { uint16_t left; uint16_t top; uint16_t right; uint16_t bottom; uint16_t unknown; char letter; } dialog_item_t;
рдФрд░ рдлрд╝реАрд▓реНрдб neuro_dialog_t.unknown
(рдЕрдм - neuro_dialog_t.items_count
) рдореЗрдиреВ рдореЗрдВ рдЖрдЗрдЯрдореЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдХрд╛рдЙрдВрдЯрд░ рд╣реИ:
typedef struct neuro_dialog_t { ... uint16_t flags; uint16_t items_count; dialog_item_t items[16]; ... } neuro_dialog_t;
dialog_item_t.unknown
рдлрд╝реАрд▓реНрдб dialog_item_t.unknown
рдЪреМрдереЗ рддрд░реНрдХ рдХреЗ рд╕рд╛рде build_dialog_item
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рд░рдВрдн рдХрд┐рдпрд╛ dialog_item_t.unknown
рд╣реИред рд╢рд╛рдпрдж рдпрд╣ рдПрд░реЗ рдореЗрдВ рддрддреНрд╡ рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП unknown
ред dialog_item_t.letter
рдлрд╝реАрд▓реНрдб dialog_item_t.letter
build_dialog_item
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрд╛рдВрдЪрд╡реЗрдВ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдЖрд░рдВрднреАрдХреГрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдлрд┐рд░, рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдмрд╛рдПрдВ рдХреНрд▓рд┐рдХ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдЧреЗрдо рдХрд┐рд╕реА рдПрдХ рдЖрдЗрдЯрдо рдХреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдорд╛рдЙрд╕ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреНрд░рдо рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдЫрд╛рдВрдЯ рд░рд╣рд╛ рд╣реИ), рдФрд░ рдпрджрд┐ рдХреЛрдИ рд╣рд┐рдЯ рд╣реИ, рддреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдВрдЫрд┐рдд рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рд╕реЗ рдЪреБрдирд╛ рдЬрд╛рддрд╛ рд╣реИред [рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдареАрдХ рдЙрд╕реА рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИред]
рдпрд╣ рдПрдХ рдкреВрд░реНрдг-рдореБрдЦреНрдп рдореЗрдиреВ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдореВрд▓ рдХреЛрдб рдХреЛ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╕ рдЦреЗрд▓ рдореЗрдВ рджреЗрдЦреЗ рдЧрдП рдЕрдкрдиреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рджреЛрд╣рд░рд╛ рд░рд╣рд╛ рд╣реИред
рдпрджрд┐ рдЖрдкрдиреЗ рдкрд┐рдЫрд▓реЗ gif рдХреЛ рдЕрдВрдд рддрдХ рджреЗрдЦрд╛ рд╣реИ, рддреЛ рд╕рдВрднрд╡рддрдГ рдЖрдкрдиреЗ рдЕрдВрддрд┐рдо рдлрд╝реНрд░реЗрдо рдкрд░ рд╕реНрдЯрд╛рд░реНрдЯ-рдЕрдк рдЧреЗрдо рд╕реНрдХреНрд░реАрди рджреЗрдЦреА рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕реЗ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдм рдХреБрдЫ рд╣реИред рдмрд╕ рдЗрд╕реЗ рд▓реЗрдВ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рд╕реНрдкреНрд░рд╛рдЗрдЯреНрд╕ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдЪреЗрди рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореБрдЦреНрдп рдЪрд░рд┐рддреНрд░ рдХреЗ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдХреЛ рдордВрдЪ рдкрд░ рд░рдЦрдХрд░, рдореИрдВрдиреЗ imh_hdr_t
рд╕рдВрд░рдЪрдирд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЦреЛрдЬ рдХреАред
рдореВрд▓ рдХреЛрдб рдореЗрдВ, add_sprite_to_chain
рдлрд╝рдВрдХреНрд╢рди, рдЬреЛ рдирд╛рдпрдХ рдХреА рдЫрд╡рд┐ рдХреЛ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдХреЛ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ 156 рдФрд░ 110 рдХреЗ рд╕рд╛рде рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдореИрдВрдиреЗ рд╡рд╣реА рджреЗрдЦрд╛, рдЬреЛ рдЦреБрдж рдХреЛ рджреЛрд╣рд░рд╛ рд░рд╣рд╛ рд╣реИ:

рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдХрд┐ рдХреНрдпрд╛ рд╣реИ, рдореБрдЭреЗ рдирд┐рдореНрди рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрд░рдЪрдирд╛ imh_hdr_t
:
typedef struct imh_hdr_t { uint16_t dx; uint16_t dy; uint16_t width; uint16_t height; } imh_hdr_t;
рдПрдХ unknown
рдХреНрд╖реЗрддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдСрдлрд╝рд╕реЗрдЯ рдорд╛рди рдЬреЛ рд╕реНрдкреНрд░реИрдб рдЪреЗрди рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╕рдВрдЧрдд рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ (рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди) рд╕реЗ рдШрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЦреАрдВрдЪреЗ рдЧрдП рд╕реНрдкреНрд░рд╛рдЗрдЯ рдХреЗ рдКрдкрд░реА рдмрд╛рдПрдВ рдХреЛрдиреЗ рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордиреНрд╡рдп рдХреА рдЧрдгрдирд╛ рд▓рдЧрднрдЧ рдЗрд╕ рддрд░рд╣ рдХреА рдЬрд╛рддреА рд╣реИ:
left = sprite_layer_t.left - sprite_layer_t.sprite_hdr.dx top = sprite_layer_t.top - sprite_layer_t.sprite_hdr.dy
рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реБрдП, рдореБрдЭреЗ рд╕рд╣реА рддрд╕реНрд╡реАрд░ рдорд┐рд▓реА, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рдореИрдВрдиреЗ рдореБрдЦреНрдп рдЪрд░рд┐рддреНрд░ рдХреЛ рдкреБрдирд░реНрдЬреАрд╡рд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореИрдВрдиреЗ рдореВрд▓ рдкрд░ рд╡рд╛рдкрд╕ рджреЗрдЦреЗ рдмрд┐рдирд╛ рдЪрд░рд┐рддреНрд░ рдХреЗ рдирд┐рдпрдВрддреНрд░рдг (рдорд╛рдЙрд╕ рдФрд░ рдХреАрдмреЛрд░реНрдб), рдЕрдкрдиреЗ рдПрдиреАрдореЗрд╢рди рдФрд░ рдЖрдВрджреЛрд▓рди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рднреА рдХреЛрдб рд▓рд┐рдЦреЗред
рдкрд╣рд▓реЗ рд╕реНрддрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд╛рда рдкрд░рд┐рдЪрдп рдорд┐рд▓рд╛ред рдореБрдЭреЗ рдпрд╛рдж рджрд┐рд▓рд╛рдирд╛ рд╣реИ рдХрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕рдВрд╕рд╛рдзрди .BIH
рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВред .BIH
рдлрд╛рдЗрд▓реЗрдВ рд╡реИрд░рд┐рдПрдмрд▓-рд╕рд╛рдЗрдЬрд╝ рд╣реИрдбрд░ рдФрд░ рдирд▓-рдЯрд░реНрдорд┐рдиреЗрдЯреЗрдб рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рдЕрдиреБрдХреНрд░рдо рд╕реЗ рдорд┐рд▓рдХрд░ рдмрдирддреА рд╣реИрдВред рдореВрд▓ рдХреЛрдб рдЬреЛ рдЗрдВрдЯреНрд░реЛ рдЦреЗрд▓рддрд╛ рд╣реИ, рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдкрд░, рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ .BIH
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрд╛рда рднрд╛рдЧ рдХреА рд╢реБрд░реБрдЖрдд рдХреА рдЪреМрдереА рд╣реЗрдбрд░ рд╢рдмреНрдж рдореЗрдВ рд╕рдорд╛рд╣рд┐рдд рд╣реИред рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдкрд░рд┐рдЪрдп рд╣реИ:
typedef struct bih_hdr_t { uint16_t unknown[3]; uint16_t text_offset; } bih_hdr_t; ... uint8_t r1_bih[12288]; assert(resource_manager_load("R1.BIH", r1_bih)); bih_hdr_t *hdr = (bih_hdr_t*)r1_bih; char *intro = r1_bih + hdr->text_offset;
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореВрд▓ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рддреЗ рд╣реБрдП, рдореИрдВрдиреЗ рдореВрд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд╡рд┐рднрд╛рдЬрди рдХреЛ рд╕рдмрд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рддрд╛рдХрд┐ рд╡реЗ рдкрд╛рда рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдлрд┐рдЯ рд╣реЛ, рдЗрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдХреНрд░реЙрд▓ рдХрд░реЗрдВ, рдФрд░ рдЕрдЧрд▓реЗ рдмреИрдЪ рдХреЛ рдЬрд╛рд░реА рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрдирдкреБрдЯ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВред
рдкреНрд░рдХрд╛рд╢рди рдХреЗ рд╕рдордп, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рддреАрди рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИ, рдореИрдВрдиреЗ рдзреНрд╡рдирд┐ рдХреЗ рдкреНрд░рдЬрдирди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ред рдЕрднреА рддрдХ рдпрд╣ рдХреЗрд╡рд▓ рдореЗрд░реЗ рд╕рд┐рд░ рдореЗрдВ рд╣реИ рдФрд░ рдЗрд╕реЗ рдореЗрд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЗрд╕реЗ рд╕рд╛рдХрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рдХреБрдЫ рд╕рдордп рд▓рдЧреЗрдЧрд╛ред рддреЛ рдЪреМрдерд╛ рднрд╛рдЧ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдзреНрд╡рдирд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред рдореИрдВ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдмрддрд╛рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рднреА рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреИрд╕рд╛ рд╣реЛрддрд╛ рд╣реИред
рдиреНрдпреВрд░реЛрдорд╛рдВрд╕рд░ рдХрд╛ рдЙрд▓рдЯрд╛ред рднрд╛рдЧ 4: рдзреНрд╡рдирд┐, рдПрдиреАрдореЗрд╢рди, рд╣рдлрдореИрди, рдЬреАрдереВрдм