From cea3ea6dc764c8a05060bec4a19f7154e372cedf Mon Sep 17 00:00:00 2001 From: nmlgc Date: Mon, 3 Feb 2020 20:32:56 +0100 Subject: [PATCH] [Reverse-engineering] [th04/th05] Bullet structure MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit And since everyone always cares about caps: • TH04: 240 for the white 8×8 pellets, 220 for 16×16 sprites • TH05: 180 for the white 8×8 pallets, 240 for 16×16 sprites Completes P0072, funded by [Anonymous] and -Tom-. --- th03/math/subpixel.hpp | 1 + th04/bullet/bullet.hpp | 96 + th04/bullet/bullets[bss].asm | 66 + th04_main.asm | 3516 +++---------------------------- th05_main.asm | 3811 +++------------------------------- 5 files changed, 784 insertions(+), 6706 deletions(-) create mode 100644 th04/bullet/bullet.hpp create mode 100644 th04/bullet/bullets[bss].asm diff --git a/th03/math/subpixel.hpp b/th03/math/subpixel.hpp index 8971d9bc..2eb2ed19 100644 --- a/th03/math/subpixel.hpp +++ b/th03/math/subpixel.hpp @@ -43,5 +43,6 @@ template struct SPPointBase { typedef SubpixelBase Subpixel; typedef SPPointBase SPPoint; // 8-bit (Q4.4) +typedef SubpixelBase SubpixelLength8; typedef SubpixelBase Subpixel8; typedef SPPointBase SPPoint8; diff --git a/th04/bullet/bullet.hpp b/th04/bullet/bullet.hpp new file mode 100644 index 00000000..8d7571c5 --- /dev/null +++ b/th04/bullet/bullet.hpp @@ -0,0 +1,96 @@ +/// States and modes +/// ---------------- +#pragma option -b- + +#define BSS_CLOUD_FRAMES 16 +#define BMS_DECAY_FRAMES 16 +#define BMS_SLOWDOWN_BASE_SPEED 4.5f +#define BMS_SLOWDOWN_FRAMES 32 + +enum bullet_spawn_state_t { + /// Hitbox is active + /// ---------------- + BSS_GRAZEABLE = 0, + BSS_GRAZED = 1, + BSS_ACTIVE = 2, + /// ---------------- + + /// Delay "cloud", no hitbox + /// ------------------------ + BSS_CLOUD_BACKWARDS = 3, + BSS_CLOUD_FORWARDS = 4, + BSS_CLOUD_END = (BSS_CLOUD_FORWARDS + BSS_CLOUD_FRAMES), + /// ------------------------ +}; + +enum bullet_move_state_t { + /// Hitbox is active + /// ---------------- + // Slows down from BMS_SLOWDOWN_BASE_SPEED to [final_speed] + BMS_SLOWDOWN = 0, + // Special processing according to [special_motion] + BMS_SPECIAL = 1, + // No special processing + BMS_NORMAL = 2, + /// ---------------- + + /// Decay, no hitbox + /// ---------------- + BMS_DECAY = 4, + BMS_DECAY_END = (BMS_DECAY + BMS_DECAY_FRAMES), + /// ---------------- +}; + +enum bullet_special_motion_t { +}; + +#pragma option -b +/// ---------------- + +struct bullet_t { + char flag; + char age; + motion_t pos; + unsigned char from_pattern; // unused + int8_t unused; + SubpixelLength8 speed_cur; + unsigned char angle; + bullet_spawn_state_t spawn_state; + bullet_move_state_t move_state; + bullet_special_motion_t special_motion; + unsigned char speed_final; + union { + unsigned char slowdown_time; // with BMS_SLOWDOWN + unsigned char turn_count; // with BMS_SPECIAL + } ax; + union { + unsigned char slowdown_speed_delta; // with BMS_SLOWDOWN + unsigned char turn_angle; // with BMS_SPECIAL + } dx; + int patnum; + +#if GAME == 5 + // Coordinates for BSM_STRAIGHT + SPPoint origin; + int distance; +#endif +}; + +#define PELLET_W 8 +#define PELLET_H 8 +#define BULLET16_W 16 +#define BULLET16_H 16 + +#if GAME == 5 +# define PELLET_COUNT 180 +# define BULLET16_COUNT 220 +#else +# define PELLET_COUNT 240 +# define BULLET16_COUNT 200 +#endif + +#define BULLET_COUNT (PELLET_COUNT + BULLET16_COUNT) + +extern bullet_t bullets[BULLET_COUNT]; +#define pellets (&bullets[0]) +#define bullets16 (&bullets[PELLET_COUNT]) diff --git a/th04/bullet/bullets[bss].asm b/th04/bullet/bullets[bss].asm new file mode 100644 index 00000000..2aee5b71 --- /dev/null +++ b/th04/bullet/bullets[bss].asm @@ -0,0 +1,66 @@ +BSS_CLOUD_FRAMES = 16 +BMS_DECAY_FRAMES = 16 +BMS_SLOWDOWN_BASE_SPEED = (4 shl 4) + 8 +BMS_SLOWDOWN_FRAMES = 32 + +BSS_GRAZEABLE = 0 +BSS_GRAZED = 1 +BSS_ACTIVE = 2 +BSS_CLOUD_BACKWARDS = 3 +BSS_CLOUD_FORWARDS = 4 +BSS_CLOUD_END = (BSS_CLOUD_FORWARDS + BSS_CLOUD_FRAMES) + +BMS_SLOWDOWN = 0 +BMS_SPECIAL = 1 +BMS_NORMAL = 2 +BMS_DECAY = 4 +BMS_DECAY_END = (BMS_DECAY + BMS_DECAY_FRAMES) + +bullet_t struc + flag db ? + age db ? + pos motion_t + from_pattern db ? + db ? + speed_cur db ? + BULLET_angle db ? + spawn_state db ? + move_state db ? + special_motion db ? + speed_final db ? + + slowdown_time label byte + turn_count label byte + db ? + + slowdown_speed_delta label byte + turn_angle label byte + db ? + + BULLET_patnum dw ? + + if GAME eq 5 + BULLET_origin Point + distance dw ? + endif +bullet_t ends + +PELLET_W = 8 +PELLET_H = 8 +BULLET16_W = 16 +BULLET16_H = 16 + +if GAME eq 5 + PELLET_COUNT = 180 + BULLET16_COUNT = 220 +else + PELLET_COUNT = 240 + BULLET16_COUNT = 200 +endif + +BULLET_COUNT = (PELLET_COUNT + BULLET16_COUNT) + +public _bullets, _pellets, _bullets16 +_bullets label bullet_t +_pellets bullet_t PELLET_COUNT dup() +_bullets16 bullet_t BULLET16_COUNT dup() diff --git a/th04_main.asm b/th04_main.asm index f83097cf..ed62f46a 100644 --- a/th04_main.asm +++ b/th04_main.asm @@ -377,7 +377,7 @@ loc_ABD8: call sparks_update call main_01:sub_10ABF call main_01:sub_104B6 - call sub_1C8C8 + call bullets_update call sub_17E59 call _midboss_update call _boss_update @@ -395,7 +395,7 @@ loc_ABD8: call main_01:sparks_render call main_01:items_render call main_01:loc_BD64 - call main_01:sub_12CE5 + call main_01:bullets_render call main_01:circles_render GRCG_OFF_CLOBBERING dx call _overlay_text_fp @@ -3055,45 +3055,45 @@ sub_CA2E endp sub_CA98 proc near push si push di - mov si, 5A22h - mov di, 1B8h + mov si, offset _bullets + mov di, BULLET_COUNT cmp _bullet_clear_trigger, 0 jnz short loc_CACF cmp _bullet_clear_time, 0 jnz short loc_CACF - mov _tile_invalidate_box, (8 shl 16) or 8 - mov di, 0F0h + mov _tile_invalidate_box, (PELLET_W shl 16) or PELLET_H + mov di, PELLET_COUNT loc_CABA: - cmp byte ptr [si], 0 + cmp [si+bullet_t.flag], 0 jz short loc_CAC6 - call main_01:tiles_invalidate_around pascal, large dword ptr [si+6] + call main_01:tiles_invalidate_around pascal, large dword ptr [si+bullet_t.pos.prev] loc_CAC6: - add si, 1Ah + add si, size bullet_t dec di jnz short loc_CABA - mov di, 0C8h + mov di, BULLET16_COUNT loc_CACF: - mov _tile_invalidate_box, (16 shl 16) or 16 + mov _tile_invalidate_box, (BULLET16_W shl 16) or BULLET16_H loc_CAD8: - cmp byte ptr [si], 0 + cmp [si+bullet_t.flag], 0 jz short loc_CAFD - cmp byte ptr [si+12h], 1 + cmp [si+bullet_t.spawn_state], BSS_GRAZED jbe short loc_CAF6 shl _tile_invalidate_box, 1 - call main_01:tiles_invalidate_around pascal, large dword ptr [si+6] + call main_01:tiles_invalidate_around pascal, large dword ptr [si+bullet_t.pos.prev] shr _tile_invalidate_box, 1 jmp short loc_CAFD ; --------------------------------------------------------------------------- loc_CAF6: - call main_01:tiles_invalidate_around pascal, large dword ptr [si+6] + call main_01:tiles_invalidate_around pascal, large dword ptr [si+bullet_t.pos.prev] loc_CAFD: - add si, 1Ah + add si, size bullet_t dec di jnz short loc_CAD8 mov si, 9292h @@ -12522,8 +12522,8 @@ sub_11ECB proc near push offset _sparks push size _sparks / 4 call main_01:sub_C34E - push 5A22h - push 0B2Ch + push offset _bullets + push (size _pellets + size _bullets16) / 4 call main_01:sub_C34E push 0B204h push 0D0h @@ -14235,8 +14235,8 @@ sub_12CC7 endp ; =============== S U B R O U T I N E ======================================= ; Attributes: bp-based frame - -sub_12CE5 proc near +public BULLETS_RENDER +bullets_render proc near var_2 = word ptr -2 @@ -14248,43 +14248,42 @@ var_2 = word ptr -2 mov ax, GRAM_400 mov es, ax assume es:nothing - mov si, 86B8h + mov si, offset _bullets[(BULLET_COUNT - 1) * size bullet_t] xor di, di - jmp loc_12D96 + jmp @@bullets16_more? ; --------------------------------------------------------------------------- -loc_12CFA: - cmp byte ptr [si], 1 - jnz loc_12D92 - cmp byte ptr [si+12h], 3 +@@sprite_bullet_loop: + cmp [si+bullet_t.flag], 1 + jnz @@sprite_bullet_next + cmp [si+bullet_t.spawn_state], BSS_CLOUD_BACKWARDS ja short loc_12D24 - mov ax, [si+4] - add ax, (8 shl 4) + mov ax, [si+bullet_t.pos.cur.y] + add ax, ((PLAYFIELD_Y - (BULLET16_H / 2)) shl 4) call main_01:scroll_subpixel_y_to_vram_seg1 pascal, ax mov dx, ax - mov ax, [si+2] + mov ax, [si+bullet_t.pos.cur.x] sar ax, 4 - add ax, 18h - push word ptr [si+18h] - call main_01:z_super_roll_put_tiny - jmp short loc_12D92 + add ax, (PLAYFIELD_X - (BULLET16_W / 2)) + call main_01:z_super_roll_put_tiny pascal, [si+bullet_t.BULLET_patnum] + jmp short @@sprite_bullet_next ; --------------------------------------------------------------------------- loc_12D24: - cmp word ptr [si+4], 0 - jl short loc_12D92 - cmp word ptr [si+4], 1700h - jge short loc_12D92 - cmp word ptr [si+2], 0 - jl short loc_12D92 - cmp word ptr [si+2], 1800h - jge short loc_12D92 - mov ax, [si+18h] - cmp ax, 36h ; '6' + cmp [si+bullet_t.pos.cur.y], 0 + jl short @@sprite_bullet_next + cmp [si+bullet_t.pos.cur.y], (PLAYFIELD_H shl 4) + jge short @@sprite_bullet_next + cmp [si+bullet_t.pos.cur.x], 0 + jl short @@sprite_bullet_next + cmp [si+bullet_t.pos.cur.x], (PLAYFIELD_W shl 4) + jge short @@sprite_bullet_next + mov ax, [si+bullet_t.BULLET_patnum] + cmp ax, 54 jz short loc_12D50 - cmp ax, 37h ; '7' + cmp ax, 55 jz short loc_12D50 - cmp ax, 39h ; '9' + cmp ax, 57 jnz short loc_12D57 loc_12D50: @@ -14296,34 +14295,34 @@ loc_12D57: mov [bp+var_2], 17h loc_12D5C: - cmp word ptr [si+18h], 4Ch ; 'L' + cmp [si+bullet_t.BULLET_patnum], 76 jl short loc_12D6D - cmp word ptr [si+18h], 5Ch + cmp [si+bullet_t.BULLET_patnum], 92 jge short loc_12D6D mov [bp+var_2], 13h loc_12D6D: - mov al, [si+12h] + mov al, [si+bullet_t.spawn_state] mov ah, 0 mov bx, 4 cwd idiv bx add [bp+var_2], ax - call main_01:scroll_subpixel_y_to_vram_seg1 pascal, word ptr [si+4] + call main_01:scroll_subpixel_y_to_vram_seg1 pascal, [si+bullet_t.pos.cur.y] mov dx, ax - mov ax, [si+2] + mov ax, [si+bullet_t.pos.cur.x] sar ax, 4 - add ax, 10h + add ax, 16 push [bp+var_2] call main_01:sub_C42C -loc_12D92: +@@sprite_bullet_next: inc di - sub si, 1Ah + sub si, size bullet_t -loc_12D96: - cmp di, 0C8h - jl loc_12CFA +@@bullets16_more?: + cmp di, BULLET16_COUNT + jl @@sprite_bullet_loop cmp _bullet_clear_trigger, 0 jnz short loc_12DBE cmp _bullet_clear_time, 0 @@ -14334,41 +14333,40 @@ loc_12D96: mov ah, GC_RG call main_01:grcg_setcolor_direct_noint_1 call main_01:sub_CA2E - jmp short loc_12DEC + jmp short @@ret ; --------------------------------------------------------------------------- loc_12DBE: xor di, di - jmp short loc_12DE6 + jmp short @@pellets_more? ; --------------------------------------------------------------------------- -loc_12DC2: - cmp byte ptr [si], 1 - jnz short loc_12DE2 - mov ax, [si+4] - add ax, (8 shl 4) +@@dot_bullet_loop: + cmp [si+bullet_t.flag], 1 + jnz short @@dot_bullet_next + mov ax, [si+bullet_t.pos.cur.y] + add ax, ((PLAYFIELD_Y - (BULLET16_H / 2)) shl 4) call main_01:scroll_subpixel_y_to_vram_seg1 pascal, ax mov dx, ax - mov ax, [si+2] + mov ax, [si+bullet_t.pos.cur.x] sar ax, 4 - add ax, 18h - push word ptr [si+18h] - call main_01:z_super_roll_put_tiny + add ax, (PLAYFIELD_X - (BULLET16_W / 2)) + call main_01:z_super_roll_put_tiny pascal, [si+bullet_t.BULLET_patnum] -loc_12DE2: +@@dot_bullet_next: inc di - sub si, 1Ah + sub si, size bullet_t -loc_12DE6: - cmp di, 0F0h - jl short loc_12DC2 +@@pellets_more?: + cmp di, PELLET_COUNT + jl short @@dot_bullet_loop -loc_12DEC: +@@ret: pop di pop si leave retn -sub_12CE5 endp +bullets_render endp include th04/item/render.asm @@ -30915,86 +30913,86 @@ off_1C6C4 dw offset loc_1C301 ; =============== S U B R O U T I N E ======================================= ; Attributes: bp-based frame +public BULLET_TURN_X +bullet_turn_x proc near -sub_1C6CE proc near - -arg_0 = word ptr 4 +@@bullet = word ptr 4 push bp mov bp, sp push si - mov si, [bp+arg_0] - inc byte ptr [si+16h] + mov si, [bp+@@bullet] + inc [si+bullet_t.turn_count] mov al, 80h - sub al, [si+11h] - mov [si+11h], al - mov al, [si+16h] + sub al, [si+bullet_t.BULLET_angle] + mov [si+bullet_t.BULLET_angle], al + mov al, [si+bullet_t.turn_count] cmp al, byte_2CFF7 jb short loc_1C6ED - mov byte ptr [si+13h], 2 + mov [si+bullet_t.move_state], BMS_NORMAL loc_1C6ED: - lea ax, [si+0Ah] + lea ax, [si+bullet_t.pos.velocity] push ax - push word ptr [si+11h] - mov al, [si+10h] + push word ptr [si+bullet_t.BULLET_angle] + mov al, [si+bullet_t.speed_cur] mov ah, 0 push ax call vector2_near pop si pop bp retn 2 -sub_1C6CE endp +bullet_turn_x endp ; =============== S U B R O U T I N E ======================================= ; Attributes: bp-based frame +public BULLET_TURN_Y +bullet_turn_y proc near -sub_1C702 proc near - -arg_0 = word ptr 4 +@@bullet = word ptr 4 push bp mov bp, sp push si - mov si, [bp+arg_0] - inc byte ptr [si+16h] - mov al, [si+11h] + mov si, [bp+@@bullet] + inc [si+bullet_t.turn_count] + mov al, [si+bullet_t.BULLET_angle] neg al - mov [si+11h], al - mov al, [si+16h] + mov [si+bullet_t.BULLET_angle], al + mov al, [si+bullet_t.turn_count] cmp al, byte_2CFF7 jb short loc_1C721 - mov byte ptr [si+13h], 2 + mov [si+bullet_t.move_state], BMS_NORMAL loc_1C721: - lea ax, [si+0Ah] + lea ax, [si+bullet_t.pos.velocity] push ax - push word ptr [si+11h] - mov al, [si+10h] + push word ptr [si+bullet_t.BULLET_angle] + mov al, [si+bullet_t.speed_cur] mov ah, 0 push ax call vector2_near pop si pop bp retn 2 -sub_1C702 endp +bullet_turn_y endp ; =============== S U B R O U T I N E ======================================= ; Attributes: bp-based frame +public BULLET_UPDATE_SPECIAL +bullet_update_special proc near -sub_1C736 proc near - -arg_0 = word ptr 4 +@@bullet = word ptr 4 push bp mov bp, sp push si - mov si, [bp+arg_0] - mov al, [si+14h] + mov si, [bp+@@bullet] + mov al, [si+bullet_t.special_motion] mov ah, 0 sub ax, 80h mov bx, ax @@ -31004,119 +31002,119 @@ arg_0 = word ptr 4 jmp cs:off_1C8B6[bx] loc_1C755: - cmp byte ptr [si+10h], 0 + cmp [si+bullet_t.speed_cur], 0 jz short loc_1C75D jmp short loc_1C790 ; --------------------------------------------------------------------------- loc_1C75D: - inc byte ptr [si+16h] + inc [si+bullet_t.turn_count] mov ax, _player_pos.cur.y - sub ax, [si+4] + sub ax, [si+bullet_t.pos.cur.y] push ax mov ax, _player_pos.cur.x - sub ax, [si+2] + sub ax, [si+bullet_t.pos.cur.x] push ax call iatan2 - mov [si+11h], al - mov al, [si+15h] - mov [si+10h], al - mov al, [si+16h] + mov [si+bullet_t.BULLET_angle], al + mov al, [si+bullet_t.speed_final] + mov [si+bullet_t.speed_cur], al + mov al, [si+bullet_t.turn_count] cmp al, byte_2CFF7 jb loc_1C831 jmp loc_1C82D ; --------------------------------------------------------------------------- loc_1C78A: - cmp byte ptr [si+10h], 0 + cmp [si+bullet_t.speed_cur], 0 jz short loc_1C7A6 loc_1C790: - lea ax, [si+0Ah] + lea ax, [si+bullet_t.pos.velocity] push ax - push word ptr [si+11h] - mov al, [si+10h] + push word ptr [si+bullet_t.BULLET_angle] + mov al, [si+bullet_t.speed_cur] mov ah, 0 push ax call vector2_near - dec byte ptr [si+10h] + dec [si+bullet_t.speed_cur] jmp loc_1C8B1 ; --------------------------------------------------------------------------- loc_1C7A6: - inc byte ptr [si+16h] - mov al, [si+17h] - add [si+11h], al - mov al, [si+15h] - mov [si+10h], al - mov al, [si+16h] + inc [si+bullet_t.turn_count] + mov al, [si+bullet_t.turn_angle] + add [si+bullet_t.BULLET_angle], al + mov al, [si+bullet_t.speed_final] + mov [si+bullet_t.speed_cur], al + mov al, [si+bullet_t.turn_count] cmp al, byte_2CFF7 jb short loc_1C831 jmp short loc_1C82D ; --------------------------------------------------------------------------- loc_1C7C0: - lea ax, [si+0Ah] + lea ax, [si+bullet_t.pos.velocity] push ax - push word ptr [si+11h] - mov al, [si+10h] + push word ptr [si+bullet_t.BULLET_angle] + mov al, [si+bullet_t.speed_cur] mov ah, 0 push ax call vector2_near mov al, byte_2CFF7 - add [si+10h], al + add [si+bullet_t.speed_cur], al jmp loc_1C8B1 ; --------------------------------------------------------------------------- loc_1C7D9: - cmp byte ptr [si+10h], 0 + cmp [si+bullet_t.speed_cur], 0 jz short loc_1C821 - lea ax, [si+0Ah] + lea ax, [si+bullet_t.pos.velocity] push ax - push word ptr [si+11h] - mov al, [si+10h] + push word ptr [si+bullet_t.BULLET_angle] + mov al, [si+bullet_t.speed_cur] mov ah, 0 push ax call vector2_near - cmp byte ptr [si+10h], 1 + cmp [si+bullet_t.speed_cur], 1 jbe short loc_1C7FF - mov al, [si+10h] - add al, 0FEh - mov [si+10h], al + mov al, [si+bullet_t.speed_cur] + add al, -2 + mov [si+bullet_t.speed_cur], al jmp short loc_1C803 ; --------------------------------------------------------------------------- loc_1C7FF: - mov byte ptr [si+10h], 0 + mov [si+bullet_t.speed_cur], 0 loc_1C803: - cmp byte ptr [si+10h], 20h ; ' ' + cmp [si+bullet_t.speed_cur], (2 shl 4) jnb loc_1C8B1 - mov al, [si+17h] - sub al, [si+11h] + mov al, [si+bullet_t.turn_angle] + sub al, [si+bullet_t.BULLET_angle] cbw mov bx, 4 cwd idiv bx - add al, [si+11h] - mov [si+11h], al + add al, [si+bullet_t.BULLET_angle] + mov [si+bullet_t.BULLET_angle], al jmp loc_1C8B1 ; --------------------------------------------------------------------------- loc_1C821: - mov al, [si+17h] - mov [si+11h], al - mov al, [si+15h] - mov [si+10h], al + mov al, [si+bullet_t.turn_angle] + mov [si+bullet_t.BULLET_angle], al + mov al, [si+bullet_t.speed_final] + mov [si+bullet_t.speed_cur], al loc_1C82D: - mov byte ptr [si+13h], 2 + mov [si+bullet_t.move_state], BMS_NORMAL loc_1C831: - lea ax, [si+0Ah] + lea ax, [si+bullet_t.pos.velocity] push ax - push word ptr [si+11h] - mov al, [si+10h] + push word ptr [si+bullet_t.BULLET_angle] + mov al, [si+bullet_t.speed_cur] mov ah, 0 push ax call vector2_near @@ -31124,60 +31122,56 @@ loc_1C831: ; --------------------------------------------------------------------------- loc_1C843: - cmp word ptr [si+2], 0 + cmp [si+bullet_t.pos.cur.x], 0 jle short loc_1C850 - cmp word ptr [si+2], 1800h + cmp [si+bullet_t.pos.cur.x], (PLAYFIELD_W shl 4) jl short loc_1C8B1 loc_1C850: - push si - call sub_1C6CE + call bullet_turn_x pascal, si jmp short loc_1C8B1 ; --------------------------------------------------------------------------- loc_1C856: - cmp word ptr [si+4], 0 + cmp [si+bullet_t.pos.cur.y], 0 jle short loc_1C89C - cmp word ptr [si+4], 1700h + cmp [si+bullet_t.pos.cur.y], (PLAYFIELD_H shl 4) jl short loc_1C8B1 jmp short loc_1C89C ; --------------------------------------------------------------------------- loc_1C865: - cmp word ptr [si+2], 0 + cmp [si+bullet_t.pos.cur.x], 0 jle short loc_1C872 - cmp word ptr [si+2], 1800h + cmp [si+bullet_t.pos.cur.x], (PLAYFIELD_W shl 4) jl short loc_1C876 loc_1C872: - push si - call sub_1C6CE + call bullet_turn_x pascal, si loc_1C876: - cmp word ptr [si+4], 0 + cmp [si+bullet_t.pos.cur.y], 0 jle short loc_1C89C - cmp word ptr [si+4], 1700h + cmp [si+bullet_t.pos.cur.y], (PLAYFIELD_H shl 4) jl short loc_1C8B1 jmp short loc_1C89C ; --------------------------------------------------------------------------- loc_1C885: - cmp word ptr [si+2], 0 + cmp [si+bullet_t.pos.cur.x], 0 jle short loc_1C892 - cmp word ptr [si+2], 1800h + cmp [si+bullet_t.pos.cur.x], (PLAYFIELD_W shl 4) jl short loc_1C896 loc_1C892: - push si - call sub_1C6CE + call bullet_turn_x pascal, si loc_1C896: - cmp word ptr [si+4], 0 + cmp [si+bullet_t.pos.cur.y], 0 jg short loc_1C8B1 loc_1C89C: - push si - call sub_1C702 + call bullet_turn_y pascal, si jmp short loc_1C8B1 ; --------------------------------------------------------------------------- @@ -31186,13 +31180,12 @@ loc_1C8A2: jz short loc_1C8B1 mov al, byte_2CFF7 mov ah, 0 - add [si+0Ch], ax + add [si+bullet_t.pos.velocity.y], ax loc_1C8B1: pop si pop bp retn 2 -sub_1C736 endp ; --------------------------------------------------------------------------- off_1C8B6 dw offset loc_1C755 @@ -31204,12 +31197,13 @@ off_1C8B6 dw offset loc_1C755 dw offset loc_1C865 dw offset loc_1C885 dw offset loc_1C8A2 +bullet_update_special endp ; =============== S U B R O U T I N E ======================================= ; Attributes: bp-based frame - -sub_1C8C8 proc far +public BULLETS_UPDATE +bullets_update proc far var_9 = byte ptr -9 var_8 = word ptr -8 @@ -31224,7 +31218,7 @@ var_2 = word ptr -2 push di mov [bp+var_2], 0 mov word_2D006, 0 - mov si, 86B8h + mov si, offset _bullets[(BULLET_COUNT - 1) * size bullet_t] cmp _bullet_clear_trigger, 0 jnz loc_1CB44 xor di, di @@ -31232,11 +31226,11 @@ var_2 = word ptr -2 ; --------------------------------------------------------------------------- loc_1C8EC: - cmp byte ptr [si], 0 + cmp [si+bullet_t.flag], 0 jz loc_1CAF8 - cmp byte ptr [si], 2 + cmp [si+bullet_t.flag], 2 jnz short loc_1C8FE - mov byte ptr [si], 0 + mov [si+bullet_t.flag], 0 jmp loc_1CAF8 ; --------------------------------------------------------------------------- @@ -31244,21 +31238,21 @@ loc_1C8FE: inc [bp+var_2] cmp _bullet_clear_time, 0 jz short loc_1C961 - cmp byte ptr [si+13h], 4 + cmp [si+bullet_t.move_state], BMS_DECAY jnb short loc_1C939 - mov byte ptr [si+13h], 4 - cmp di, 0C8h + mov [si+bullet_t.move_state], BMS_DECAY + cmp di, BULLET16_COUNT jge short loc_1C91D - mov ax, 70h ; 'p' + mov ax, 112 jmp short loc_1C920 ; --------------------------------------------------------------------------- loc_1C91D: - mov ax, 6Ch ; 'l' + mov ax, 108 loc_1C920: - mov [si+18h], ax - cmp byte ptr [si+1], 0 + mov [si+bullet_t.BULLET_patnum], ax + cmp [si+bullet_t.age], 0 jz short loc_1C931 add _score_delta, 100 jmp short loc_1C961 @@ -31270,120 +31264,117 @@ loc_1C931: ; --------------------------------------------------------------------------- loc_1C939: - inc byte ptr [si+13h] - cmp byte ptr [si+13h], 14h + inc [si+bullet_t.move_state] + cmp [si+bullet_t.move_state], BMS_DECAY_END jb short loc_1C94F - lea ax, [si+2] - push ax - call _motion_update_2 - mov byte ptr [si], 2 + lea ax, [si+bullet_t.pos] + call _motion_update_2 pascal, ax + mov [si+bullet_t.flag], 2 jmp loc_1CAF8 ; --------------------------------------------------------------------------- loc_1C94F: - mov al, [si+13h] + mov al, [si+bullet_t.move_state] mov ah, 0 mov bx, 4 cwd idiv bx or dx, dx jnz short loc_1C961 - inc word ptr [si+18h] + inc [si+bullet_t.BULLET_patnum] loc_1C961: - inc byte ptr [si+1] - cmp byte ptr [si+12h], 2 + inc [si+bullet_t.age] + cmp [si+bullet_t.spawn_state], BSS_ACTIVE jb short loc_1C9DA - cmp byte ptr [si+12h], 2 + cmp [si+bullet_t.spawn_state], BSS_ACTIVE jnz short loc_1C976 - mov byte ptr [si+12h], 0 + mov [si+bullet_t.spawn_state], BSS_GRAZEABLE jmp short loc_1C9DA ; --------------------------------------------------------------------------- loc_1C976: - cmp byte ptr [si+12h], 3 + cmp [si+bullet_t.spawn_state], BSS_CLOUD_BACKWARDS jnz short loc_1C99C - mov eax, [si+2] - mov [si+6], eax - mov ax, [si+0Ah] + mov eax, dword ptr [si+bullet_t.pos.cur] + mov dword ptr [si+bullet_t.pos.prev], eax + mov ax, [si+bullet_t.pos.velocity.x] shl ax, 3 - sub [si+2], ax - mov ax, [si+0Ch] + sub [si+bullet_t.pos.cur.x], ax + mov ax, [si+bullet_t.pos.velocity.y] shl ax, 3 - sub [si+4], ax - mov byte ptr [si+12h], 4 + sub [si+bullet_t.pos.cur.y], ax + mov [si+bullet_t.spawn_state], BSS_CLOUD_FORWARDS jmp short loc_1C9C8 ; --------------------------------------------------------------------------- loc_1C99C: - cmp byte ptr [si+12h], 4 + cmp [si+bullet_t.spawn_state], BSS_CLOUD_FORWARDS jnz short loc_1C9AB - lea ax, [si+2] - push ax - call _motion_update_2 + lea ax, [si+bullet_t.pos] + call _motion_update_2 pascal, ax jmp short loc_1C9C8 ; --------------------------------------------------------------------------- loc_1C9AB: - mov eax, [si+2] - mov [si+6], eax - mov ax, [si+0Ah] + mov eax, dword ptr [si+bullet_t.pos.cur] + mov dword ptr [si+bullet_t.pos.prev], eax + mov ax, [si+bullet_t.pos.velocity.x] mov bx, 3 cwd idiv bx - add [si+2], ax - mov ax, [si+0Ch] + add [si+bullet_t.pos.cur.x], ax + mov ax, [si+bullet_t.pos.velocity.y] cwd idiv bx - add [si+4], ax + add [si+bullet_t.pos.cur.y], ax loc_1C9C8: - inc byte ptr [si+12h] - cmp byte ptr [si+12h], 14h + inc [si+bullet_t.spawn_state] + cmp [si+bullet_t.spawn_state], BSS_CLOUD_END jb loc_1CAF8 - mov byte ptr [si+12h], 2 + mov [si+bullet_t.spawn_state], BSS_ACTIVE jmp loc_1CAF8 ; --------------------------------------------------------------------------- loc_1C9DA: - cmp byte ptr [si+13h], 1 + cmp [si+bullet_t.move_state], BMS_SPECIAL jnz short loc_1C9E6 - push si - call sub_1C736 + call bullet_update_special pascal, si jmp short loc_1CA27 ; --------------------------------------------------------------------------- loc_1C9E6: - cmp byte ptr [si+13h], 0 + cmp [si+bullet_t.move_state], BMS_SLOWDOWN jnz short loc_1CA27 - dec byte ptr [si+16h] - mov al, [si+16h] + dec [si+bullet_t.slowdown_time] + mov al, [si+bullet_t.slowdown_time] mov ah, 0 - mov dl, [si+17h] + mov dl, [si+bullet_t.slowdown_speed_delta] mov dh, 0 imul dx - mov bx, 20h ; ' ' + mov bx, BMS_SLOWDOWN_FRAMES cwd idiv bx - add al, [si+15h] - mov [si+10h], al - cmp byte ptr [si+16h], 0 + add al, [si+bullet_t.speed_final] + mov [si+bullet_t.speed_cur], al + cmp [si+bullet_t.slowdown_time], 0 jnz short loc_1CA17 - mov al, [si+15h] - mov [si+10h], al - mov byte ptr [si+13h], 2 + mov al, [si+bullet_t.speed_final] + mov [si+bullet_t.speed_cur], al + mov [si+bullet_t.move_state], BMS_NORMAL loc_1CA17: - lea ax, [si+0Ah] + lea ax, [si+bullet_t.pos.velocity] push ax - push word ptr [si+11h] - mov al, [si+10h] + push word ptr [si+bullet_t.BULLET_angle] + mov al, [si+bullet_t.speed_cur] mov ah, 0 push ax call vector2_near loc_1CA27: - lea ax, [si+2] + lea ax, [si+bullet_t.pos] call _motion_update_2 pascal, ax cmp ax, (-8 shl 4) jle short loc_1CA43 @@ -31395,7 +31386,7 @@ loc_1CA27: jl short loc_1CA49 loc_1CA43: - mov byte ptr [si], 2 + mov [si+bullet_t.flag], 2 jmp loc_1CAF8 ; --------------------------------------------------------------------------- @@ -31406,31 +31397,31 @@ loc_1CA49: sub dx, _player_pos.cur.y cmp _player_invincibility_time, 0 jnz short loc_1CAC5 - cmp byte ptr [si+12h], 0 + cmp [si+bullet_t.spawn_state], BSS_GRAZEABLE jz short loc_1CA82 - add ax, 40h - cmp ax, 80h + add ax, (4 shl 4) + cmp ax, (8 shl 4) ja short loc_1CAC5 - add dx, 40h - cmp dx, 80h + add dx, (4 shl 4) + cmp dx, (8 shl 4) ja short loc_1CAC5 - mov byte ptr [si], 2 + mov [si+bullet_t.flag], 2 mov byte_259A9, 1 jmp short loc_1CAF8 ; --------------------------------------------------------------------------- loc_1CA82: - add ax, 100h - cmp ax, 240h + add ax, (16 shl 4) + cmp ax, (36 shl 4) ja short loc_1CAC5 - add dx, 160h - cmp dx, 2C0h + add dx, (22 shl 4) + cmp dx, (44 shl 4) ja short loc_1CAC5 - push word ptr [si+2] - push word ptr [si+4] + push [si+bullet_t.pos.cur.x] + push [si+bullet_t.pos.cur.y] push large (((2 shl 4) shl 16) or 2) nopcall sparks_add_random - mov byte ptr [si+12h], 1 + mov [si+bullet_t.spawn_state], BSS_GRAZED cmp _stage_graze, GRAZE_MAX jnb short loc_1CAC5 inc _stage_graze @@ -31439,15 +31430,15 @@ loc_1CA82: add _score_delta, eax loc_1CAC5: - cmp di, 0C8h + cmp di, BULLET16_COUNT jl short loc_1CAF8 - mov ax, [si+2] + mov ax, [si+bullet_t.pos.cur.x] sar ax, 4 - add ax, 1Ch + add ax, 28 mov bx, word_2D006 shl bx, 2 mov [bx-792Eh], ax - mov ax, [si+4] + mov ax, [si+bullet_t.pos.cur.y] add ax, (12 shl 4) call scroll_subpixel_y_to_vram_seg3 pascal, ax mov bx, word_2D006 @@ -31457,10 +31448,10 @@ loc_1CAC5: loc_1CAF8: inc di - sub si, 1Ah + sub si, size bullet_t loc_1CAFC: - cmp di, 1B8h + cmp di, BULLET_COUNT jl loc_1C8EC cmp _turbo_mode, 0 jnz loc_1CC19 @@ -31527,18 +31518,17 @@ loc_1CB84: ; --------------------------------------------------------------------------- loc_1CB91: - cmp byte ptr [si], 1 + cmp [si+bullet_t.flag], 1 jnz short loc_1CBED - mov word ptr [si+0Ah], 0 - mov word ptr [si+0Ch], 0 - lea ax, [si+2] - push ax - call _motion_update_2 - cmp [bp+var_9], 4Ch ; 'L' + mov [si+bullet_t.pos.velocity.x], 0 + mov [si+bullet_t.pos.velocity.y], 0 + lea ax, [si+bullet_t.pos] + call _motion_update_2 pascal, ax + cmp [bp+var_9], 76 jnb short loc_1CBB7 mov al, [bp+var_9] mov ah, 0 - mov [si+18h], ax + mov [si+bullet_t.BULLET_patnum], ax jmp short loc_1CBED ; --------------------------------------------------------------------------- @@ -31546,8 +31536,8 @@ loc_1CBB7: movzx eax, [bp+var_4] add _popup_bonus, eax add _score_delta, eax - push word ptr [si+2] - push word ptr [si+4] + push [si+bullet_t.pos.cur.x] + push [si+bullet_t.pos.cur.y] push [bp+var_4] call sub_13DAA mov ax, [bp+var_6] @@ -31560,14 +31550,14 @@ loc_1CBB7: mov [bp+var_4], ax loc_1CBEA: - mov byte ptr [si], 2 + mov [si+bullet_t.flag], 2 loc_1CBED: inc di - sub si, 1Ah + sub si, size bullet_t loc_1CBF1: - cmp di, 1B8h + cmp di, BULLET_COUNT jl short loc_1CB91 cmp _popup_bonus, 0 jz short loc_1CC0A @@ -31590,8 +31580,6 @@ loc_1CC24: pop si leave retf -sub_1C8C8 endp - ; --------------------------------------------------------------------------- db 0 off_1CC29 dw offset loc_1CB71 @@ -31599,6 +31587,7 @@ off_1CC29 dw offset loc_1CB71 dw offset loc_1CB78 dw offset loc_1CB78 dw offset loc_1CB7F +bullets_update endp ; =============== S U B R O U T I N E ======================================= @@ -32629,10 +32618,10 @@ sub_1D230 endp sub_1D294 proc near -var_5 = byte ptr -5 +@@spawn_state = byte ptr -5 var_4 = byte ptr -4 -var_3 = byte ptr -3 -var_2 = word ptr -2 +@@move_state = byte ptr -3 +@@i = word ptr -2 push bp mov bp, sp @@ -32657,7 +32646,7 @@ loc_1D2D5: call sub_1D230 or al, al jnz loc_1D3BB - mov [bp+var_5], 0 + mov [bp+@@spawn_state], BSS_GRAZEABLE mov al, byte_266E2 mov ah, 0 cmp ax, 1 @@ -32670,25 +32659,25 @@ loc_1D2D5: ; --------------------------------------------------------------------------- loc_1D2F8: - mov si, 7268h - mov [bp+var_2], 0F0h + mov si, offset _pellets[(PELLET_COUNT - 1) * size bullet_t] + mov [bp+@@i], PELLET_COUNT jmp short loc_1D314 ; --------------------------------------------------------------------------- loc_1D302: - mov [bp+var_5], 3 + mov [bp+@@spawn_state], BSS_CLOUD_BACKWARDS jmp short loc_1D30C ; --------------------------------------------------------------------------- loc_1D308: - mov [bp+var_5], 4 + mov [bp+@@spawn_state], BSS_CLOUD_FORWARDS loc_1D30C: - mov si, 86B8h - mov [bp+var_2], 0C8h + mov si, offset _bullets16[(BULLET16_COUNT - 1) * size bullet_t] + mov [bp+@@i], BULLET16_COUNT loc_1D314: - mov [bp+var_3], 2 + mov [bp+@@move_state], BMS_NORMAL cmp byte_266EE, 40h jb short loc_1D326 cmp _bullet_clear_time, 0 @@ -32699,7 +32688,7 @@ loc_1D326: jz short loc_1D338 cmp byte_266EC, 30h ; '0' jz short loc_1D338 - mov [bp+var_3], 0 + mov [bp+@@move_state], BMS_SLOWDOWN loc_1D338: xor di, di @@ -32707,25 +32696,25 @@ loc_1D338: ; --------------------------------------------------------------------------- loc_1D33C: - cmp byte ptr [si], 0 + cmp [si+bullet_t.flag], 0 jnz short loc_1D3AF - mov byte ptr [si], 1 - mov al, [bp+var_3] - mov [si+13h], al - mov byte ptr [si+16h], 20h ; ' ' - mov al, 48h ; 'H' + mov [si+bullet_t.flag], 1 + mov al, [bp+@@move_state] + mov [si+bullet_t.move_state], al + mov [si+bullet_t.slowdown_time], BMS_SLOWDOWN_FRAMES + mov al, BMS_SLOWDOWN_BASE_SPEED sub al, byte_266EE - mov [si+17h], al - mov byte ptr [si+1], 0 + mov [si+bullet_t.slowdown_speed_delta], al + mov [si+bullet_t.age], 0 mov eax, point_266E4 - mov [si+2], eax + mov dword ptr [si+bullet_t.pos.cur], eax mov al, byte_266EC - mov [si+0Eh], al + mov [si+bullet_t.from_pattern], al mov al, byte_266E3 mov ah, 0 - mov [si+18h], ax - mov al, [bp+var_5] - mov [si+12h], al + mov [si+bullet_t.BULLET_patnum], ax + mov al, [bp+@@spawn_state] + mov [si+bullet_t.spawn_state], al push di call sub_1CFC8 mov [bp+var_4], al @@ -32734,26 +32723,26 @@ loc_1D33C: push word_2D008 call sub_1D218 mov ah, 0 - add [si+18h], ax + add [si+bullet_t.BULLET_patnum], ax loc_1D391: mov eax, point_266E8 - mov [si+0Ah], eax + mov dword ptr [si+bullet_t.pos.velocity], eax mov al, byte ptr word_2D008 - mov [si+11h], al + mov [si+bullet_t.BULLET_angle], al mov al, byte_266EE - mov [si+15h], al - mov [si+10h], al + mov [si+bullet_t.speed_final], al + mov [si+bullet_t.speed_cur], al cmp [bp+var_4], 0 jnz short loc_1D3BB inc di loc_1D3AF: - dec [bp+var_2] - sub si, 1Ah + dec [bp+@@i] + sub si, size bullet_t loc_1D3B5: - cmp [bp+var_2], 0 + cmp [bp+@@i], 0 jg short loc_1D33C loc_1D3BB: @@ -32770,9 +32759,9 @@ sub_1D294 endp sub_1D3BF proc near -var_4 = byte ptr -4 +@@spawn_state = byte ptr -4 var_3 = byte ptr -3 -var_2 = word ptr -2 +@@i = word ptr -2 push bp mov bp, sp @@ -32782,7 +32771,7 @@ var_2 = word ptr -2 call sub_1D230 or al, al jnz loc_1D48A - mov [bp+var_4], 0 + mov [bp+@@spawn_state], 0 mov al, byte_266E2 mov ah, 0 cmp ax, 1 @@ -32795,22 +32784,22 @@ var_2 = word ptr -2 ; --------------------------------------------------------------------------- loc_1D3EA: - mov si, 7268h - mov [bp+var_2], 0F0h + mov si, offset _pellets[(PELLET_COUNT - 1) * size bullet_t] + mov [bp+@@i], PELLET_COUNT jmp short loc_1D406 ; --------------------------------------------------------------------------- loc_1D3F4: - mov [bp+var_4], 3 + mov [bp+@@spawn_state], BSS_CLOUD_BACKWARDS jmp short loc_1D3FE ; --------------------------------------------------------------------------- loc_1D3FA: - mov [bp+var_4], 4 + mov [bp+@@spawn_state], BSS_CLOUD_FORWARDS loc_1D3FE: - mov si, 86B8h - mov [bp+var_2], 0C8h + mov si, offset _bullets16[(BULLET16_COUNT - 1) * size bullet_t] + mov [bp+@@i], BULLET16_COUNT loc_1D406: xor di, di @@ -32818,25 +32807,25 @@ loc_1D406: ; --------------------------------------------------------------------------- loc_1D40A: - cmp byte ptr [si], 0 + cmp [si+bullet_t.flag], 0 jnz short loc_1D47E - mov byte ptr [si], 1 - mov byte ptr [si+13h], 1 + mov [si+bullet_t.flag], 1 + mov [si+bullet_t.move_state], BMS_SPECIAL mov al, byte_266F2 - mov [si+14h], al - mov byte ptr [si+16h], 0 + mov [si+bullet_t.special_motion], al + mov [si+bullet_t.turn_count], 0 mov al, byte_2CFF8 - mov [si+17h], al - mov byte ptr [si+1], 0 + mov [si+bullet_t.turn_angle], al + mov [si+bullet_t.age], 0 mov eax, point_266E4 - mov [si+2], eax + mov dword ptr [si+bullet_t.pos.cur], eax mov al, byte_266EC - mov [si+0Eh], al + mov [si+bullet_t.from_pattern], al mov al, byte_266E3 mov ah, 0 - mov [si+18h], ax - mov al, [bp+var_4] - mov [si+12h], al + mov [si+bullet_t.BULLET_patnum], ax + mov al, [bp+@@spawn_state] + mov [si+bullet_t.spawn_state], al push di call sub_1CFC8 mov [bp+var_3], al @@ -32845,26 +32834,26 @@ loc_1D40A: push word_2D008 call sub_1D218 mov ah, 0 - add [si+18h], ax + add [si+bullet_t.BULLET_patnum], ax loc_1D460: mov eax, point_266E8 - mov [si+0Ah], eax + mov dword ptr [si+bullet_t.pos.velocity], eax mov al, byte ptr word_2D008 - mov [si+11h], al + mov [si+bullet_t.BULLET_angle], al mov al, byte_266EE - mov [si+15h], al - mov [si+10h], al + mov [si+bullet_t.speed_final], al + mov [si+bullet_t.speed_cur], al cmp [bp+var_3], 0 jnz short loc_1D48A inc di loc_1D47E: - dec [bp+var_2] - sub si, 1Ah + dec [bp+@@i] + sub si, size bullet_t loc_1D484: - cmp [bp+var_2], 0 + cmp [bp+@@i], 0 jg short loc_1D40A loc_1D48A: @@ -40115,2868 +40104,7 @@ byte_266F2 db ? include th04/midboss/vars[bss].asm include th04/boss/vars[bss].asm include th04/sparks[bss].asm - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - db ? ; - db ? ; -word_27628 dw ? - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; +include th04/bullet/bullets[bss].asm dd ? ; dd ? ; dd ? ; diff --git a/th05_main.asm b/th05_main.asm index be082b6e..446a69ae 100644 --- a/th05_main.asm +++ b/th05_main.asm @@ -6463,53 +6463,53 @@ sub_E58C endp sub_E5EE proc near push si push di - mov si, 5DC6h - mov di, 0B4h - mov _tile_invalidate_box, (8 shl 16) or 8 + mov si, offset _bullets + mov di, PELLET_COUNT + mov _tile_invalidate_box, (PELLET_W shl 16) or PELLET_H cmp _bullet_clear_trigger, 0 jnz short loc_E638 cmp _bullet_clear_time, 0 jnz short loc_E638 loc_E60D: - cmp byte ptr [si], 0 + cmp [si+bullet_t.flag], 0 jz short loc_E632 - cmp byte ptr [si+12h], 1 + cmp [si+bullet_t.spawn_state], BSS_GRAZED jbe short loc_E62B shl _tile_invalidate_box, 1 - call tiles_invalidate_around pascal, large dword ptr [si+6] + call tiles_invalidate_around pascal, large dword ptr [si+bullet_t.pos.prev] shr _tile_invalidate_box, 1 jmp short loc_E632 ; --------------------------------------------------------------------------- loc_E62B: - call tiles_invalidate_around pascal, large dword ptr [si+6] + call tiles_invalidate_around pascal, large dword ptr [si+bullet_t.pos.prev] loc_E632: - add si, 20h ; ' ' + add si, size bullet_t dec di jnz short loc_E60D loc_E638: - add di, 0DCh + add di, BULLET16_COUNT shl _tile_invalidate_box, 1 loc_E641: - cmp byte ptr [si], 0 + cmp [si+bullet_t.flag], 0 jz short loc_E666 - cmp byte ptr [si+12h], 1 + cmp [si+bullet_t.spawn_state], BSS_GRAZED jbe short loc_E65F shl _tile_invalidate_box, 1 - call tiles_invalidate_around pascal, large dword ptr [si+6] + call tiles_invalidate_around pascal, large dword ptr [si+bullet_t.pos.prev] shr _tile_invalidate_box, 1 jmp short loc_E666 ; --------------------------------------------------------------------------- loc_E65F: - call tiles_invalidate_around pascal, large dword ptr [si+6] + call tiles_invalidate_around pascal, large dword ptr [si+bullet_t.pos.prev] loc_E666: - add si, 20h ; ' ' + add si, size bullet_t dec di jnz short loc_E641 mov si, 9A96h @@ -6864,8 +6864,8 @@ sub_EACE proc near push offset _sparks push size _sparks / 4 call sub_E708 - push 5DC6h - push 0C80h + push offset _bullets + push (size _pellets + size _bullets16) / 4 call sub_E708 push 0B290h push 1A0h @@ -8652,7 +8652,7 @@ include th04/item/splashes_render.asm sub_100C6 proc near -var_2 = word ptr -2 +@@i = word ptr -2 push bp mov bp, sp @@ -8661,48 +8661,47 @@ var_2 = word ptr -2 push di mov ax, GRAM_400 mov es, ax - mov si, 8FA6h - mov [bp+var_2], 0 + mov si, offset _bullets[(BULLET_COUNT - 1) * size bullet_t] + mov [bp+@@i], 0 jmp loc_10171 ; --------------------------------------------------------------------------- loc_100DE: - cmp byte ptr [si], 1 + cmp [si+bullet_t.flag], 1 jnz loc_1016B - cmp byte ptr [si+12h], 3 + cmp [si+bullet_t.spawn_state], BSS_CLOUD_BACKWARDS ja short loc_10108 - mov ax, [si+4] - add ax, (8 shl 4) + mov ax, [si+bullet_t.pos.cur.y] + add ax, ((PLAYFIELD_Y - (BULLET16_H / 2)) shl 4) call scroll_subpixel_y_to_vram_seg1 pascal, ax mov dx, ax - mov ax, [si+2] + mov ax, [si+bullet_t.pos.cur.x] sar ax, 4 - add ax, 18h - push word ptr [si+18h] - call z_super_roll_put_tiny + add ax, (PLAYFIELD_X - (BULLET16_W / 2)) + call z_super_roll_put_tiny pascal, [si+bullet_t.BULLET_patnum] jmp short loc_1016B ; --------------------------------------------------------------------------- loc_10108: - cmp word ptr [si+4], 0 + cmp [si+bullet_t.pos.cur.y], 0 jl short loc_1016B - cmp word ptr [si+4], 1700h + cmp [si+bullet_t.pos.cur.y], (PLAYFIELD_H shl 4) jge short loc_1016B - cmp word ptr [si+2], 0 + cmp [si+bullet_t.pos.cur.x], 0 jl short loc_1016B - cmp word ptr [si+2], 1900h + cmp [si+bullet_t.pos.cur.x], ((PLAYFIELD_W + 16) shl 4) ; Huh? jge short loc_1016B - cmp word ptr [si+18h], 30h ; '0' + cmp [si+bullet_t.BULLET_patnum], 48 jl short loc_10141 - cmp word ptr [si+18h], 34h ; '4' + cmp [si+bullet_t.BULLET_patnum], 52 jl short loc_10134 - cmp word ptr [si+18h], 44h ; 'D' + cmp [si+bullet_t.BULLET_patnum], 68 jl short loc_10141 loc_10134: - cmp word ptr [si+18h], 74h ; 't' + cmp [si+bullet_t.BULLET_patnum], 116 jl short loc_10146 - cmp word ptr [si+18h], 98h + cmp [si+bullet_t.BULLET_patnum], 152 jge short loc_10146 loc_10141: @@ -8714,26 +8713,26 @@ loc_10146: mov di, 0Fh loc_10149: - mov al, [si+12h] + mov al, [si+bullet_t.spawn_state] mov ah, 0 mov bx, 4 cwd idiv bx add di, ax - call scroll_subpixel_y_to_vram_seg1 pascal, word ptr [si+4] + call scroll_subpixel_y_to_vram_seg1 pascal, [si+bullet_t.pos.cur.y] mov dx, ax - mov ax, [si+2] + mov ax, [si+bullet_t.pos.cur.x] sar ax, 4 - add ax, 10h + add ax, 16 push di call sub_E02E loc_1016B: - inc [bp+var_2] - sub si, 20h ; ' ' + inc [bp+@@i] + sub si, size bullet_t loc_10171: - cmp [bp+var_2], 0DCh + cmp [bp+@@i], BULLET16_COUNT jl loc_100DE cmp _bullet_clear_trigger, 0 jnz short loc_101DC @@ -8746,22 +8745,21 @@ loc_1018A: mov bx, word_2CDF8 add bx, bx mov si, [bx-3D50h] - mov al, [si+12h] + mov al, [si+bullet_t.spawn_state] mov ah, 0 mov bx, 4 cwd idiv bx - add ax, 93h + add ax, 147 mov di, ax - mov ax, [si+4] + mov ax, [si+bullet_t.pos.cur.y] add ax, (8 shl 4) call scroll_subpixel_y_to_vram_seg1 pascal, ax mov dx, ax - mov ax, [si+2] + mov ax, [si+bullet_t.pos.cur.x] sar ax, 4 - add ax, 18h - push di - call z_super_roll_put_tiny + add ax, 24 + call z_super_roll_put_tiny pascal, di loc_101BD: mov ax, word_2CDF8 @@ -8774,36 +8772,35 @@ loc_101BD: mov ah, byte ptr grcgcolor_2CC8E call grcg_setcolor_direct_noint_1 call sub_C0E6 - jmp short loc_10210 + jmp short @@ret ; --------------------------------------------------------------------------- loc_101DC: - mov [bp+var_2], 0 + mov [bp+@@i], 0 jmp short loc_10209 ; --------------------------------------------------------------------------- loc_101E3: - cmp byte ptr [si], 1 + cmp [si+bullet_t.flag], 1 jnz short loc_10203 - mov ax, [si+4] + mov ax, [si+bullet_t.pos.cur.y] add ax, (8 shl 4) call scroll_subpixel_y_to_vram_seg1 pascal, ax mov dx, ax - mov ax, [si+2] + mov ax, [si+bullet_t.pos.cur.x] sar ax, 4 - add ax, 18h - push word ptr [si+18h] - call z_super_roll_put_tiny + add ax, 24 + call z_super_roll_put_tiny pascal, [si+bullet_t.BULLET_patnum] loc_10203: - inc [bp+var_2] - sub si, 20h ; ' ' + inc [bp+@@i] + sub si, size bullet_t loc_10209: - cmp [bp+var_2], 0B4h + cmp [bp+@@i], PELLET_COUNT jl short loc_101E3 -loc_10210: +@@ret: pop di pop si leave @@ -14489,7 +14486,7 @@ sub_15C36 endp ; --------------------------------------------------------------------------- -loc_15C94: +loc_15C94 proc near cmp byte ptr word_25FFA, 11h jz short loc_15CA2 cmp byte ptr word_25FFA, 1 @@ -14525,34 +14522,34 @@ loc_15CE5: push di cmp byte ptr word_25FFA+1, 0 jnz short loc_15CFD - mov si, 7426h - mov di, 0B4h + mov si, offset _pellets[(PELLET_COUNT - 1) * size bullet_t] + mov di, PELLET_COUNT jmp short loc_15D03 ; --------------------------------------------------------------------------- loc_15CFD: - mov si, 8FA6h - mov di, 0DCh + mov si, offset _bullets16[(BULLET16_COUNT - 1) * size bullet_t] + mov di, BULLET16_COUNT loc_15D03: - mov dl, 0 + mov dl, BSS_GRAZEABLE mov al, byte ptr word_25FFA and al, 0Fh cmp al, 3 jz short loc_15D16 cmp al, 2 jnz short loc_15D18 - mov dl, 4 + mov dl, BSS_CLOUD_FORWARDS jmp short loc_15D18 ; --------------------------------------------------------------------------- loc_15D16: - mov dl, 3 + mov dl, BSS_CLOUD_BACKWARDS loc_15D18: cmp byte_221C0, 0 jnz short loc_15D38 - mov al, 2 + mov al, BMS_NORMAL cmp byte ptr word_26006+1, 40h jb short loc_15D2F cmp _bullet_clear_time, 0 @@ -14564,46 +14561,46 @@ loc_15D2F: xor al, al loc_15D38: - mov byte ptr cs:loc_15D52+3, dl - mov byte ptr cs:loc_15D65+3, al + mov cs:@@spawn_state, dl + mov cs:@@move_state, al mov byte_25348, 0 jmp short $+2 loc_15D48: - cmp byte ptr [si], 0 + cmp [si+bullet_t.flag], 0 jnz loc_15DD7 - mov byte ptr [si], 1 + mov [si+bullet_t.flag], 1 -loc_15D52: - mov byte ptr [si+12h], 7Bh +@@spawn_state = byte ptr $+3 + mov [si+bullet_t.spawn_state], 123 mov eax, point_25FFC - mov [si+2], eax + mov dword ptr [si+bullet_t.pos.cur], eax cmp byte_221C0, 0 jnz short loc_15D78 -loc_15D65: - mov byte ptr [si+13h], 7Bh - mov byte ptr [si+16h], 20h ; ' ' - mov al, 48h ; 'H' +@@move_state = byte ptr $+3 + mov [si+bullet_t.move_state], 123 + mov [si+bullet_t.slowdown_time], BMS_SLOWDOWN_FRAMES + mov al, BMS_SLOWDOWN_BASE_SPEED sub al, byte ptr word_26006+1 - mov [si+17h], al + mov [si+bullet_t.slowdown_speed_delta], al jmp short loc_15D95 ; --------------------------------------------------------------------------- loc_15D78: - mov [si+1Ah], eax - mov byte ptr [si+13h], 1 - mov word ptr [si+1Eh], 0 - mov byte ptr [si+16h], 0 + mov dword ptr [si+bullet_t.BULLET_origin], eax + mov [si+bullet_t.move_state], BMS_SPECIAL + mov [si+bullet_t.distance], 0 + mov [si+bullet_t.turn_count], 0 mov al, byte_2C977 - mov [si+17h], al + mov [si+bullet_t.turn_angle], al mov al, byte_26001 - mov [si+14h], al + mov [si+bullet_t.special_motion], al loc_15D95: - mov byte ptr [si+1], 0 + mov [si+bullet_t.age], 0 mov al, byte_26000 - mov [si+0Eh], al + mov [si+bullet_t.from_pattern], al call sub_15AAA mov cl, al mov al, byte ptr word_25FFA+1 @@ -14615,20 +14612,20 @@ loc_15D95: call sub_159E6 loc_15DB5: - mov [si+18h], ax + mov [si+bullet_t.BULLET_patnum], ax mov eax, point_2534B - mov [si+0Ah], eax + mov dword ptr [si+bullet_t.pos.velocity], eax mov al, byte_25349 - mov [si+11h], al + mov [si+bullet_t.BULLET_angle], al mov al, byte_2534A - mov [si+15h], al - mov [si+10h], al + mov [si+bullet_t.speed_final], al + mov [si+bullet_t.speed_cur], al or cl, cl jnz short loc_15DDF inc byte_25348 loc_15DD7: - sub si, 20h ; ' ' + sub si, size bullet_t dec di jnz loc_15D48 @@ -14636,6 +14633,7 @@ loc_15DDF: pop di pop si retn +loc_15C94 endp ; =============== S U B R O U T I N E ======================================= @@ -17607,46 +17605,46 @@ include th04/item/splashes_update.asm sub_17973 proc near var_1 = byte ptr -1 -arg_0 = word ptr 4 +@@bullet = word ptr 4 push bp mov bp, sp sub sp, 2 push si - mov si, [bp+arg_0] - cmp word ptr [si+18h], 34h ; '4' + mov si, [bp+@@bullet] + cmp [si+bullet_t.BULLET_patnum], 52 jl short loc_179BC - cmp word ptr [si+18h], 44h ; 'D' + cmp [si+bullet_t.BULLET_patnum], 68 jge short loc_1798F - mov [bp+var_1], 34h ; '4' + mov [bp+var_1], 52 jmp short loc_179AB ; --------------------------------------------------------------------------- loc_1798F: - cmp word ptr [si+18h], 54h ; 'T' + cmp [si+bullet_t.BULLET_patnum], 84 jge short loc_1799B - mov [bp+var_1], 44h ; 'D' + mov [bp+var_1], 68 jmp short loc_179AB ; --------------------------------------------------------------------------- loc_1799B: - cmp word ptr [si+18h], 74h ; 't' + cmp [si+bullet_t.BULLET_patnum], 116 jge short loc_179A7 - mov [bp+var_1], 54h ; 'T' + mov [bp+var_1], 84 jmp short loc_179AB ; --------------------------------------------------------------------------- loc_179A7: - mov [bp+var_1], 74h ; 't' + mov [bp+var_1], 116 loc_179AB: mov al, [bp+var_1] mov ah, 0 push ax - push word ptr [si+11h] + push word ptr [si+bullet_t.BULLET_angle] call sub_159E6 mov ah, 0 - mov [si+18h], ax + mov [si+bullet_t.BULLET_patnum], ax loc_179BC: pop si @@ -17658,66 +17656,65 @@ sub_17973 endp ; =============== S U B R O U T I N E ======================================= ; Attributes: bp-based frame +public BULLET_TURN_X +bullet_turn_x proc near -sub_179C1 proc near - -arg_0 = word ptr 4 +@@bullet = word ptr 4 push bp mov bp, sp push si - mov si, [bp+arg_0] - inc byte ptr [si+16h] + mov si, [bp+@@bullet] + inc [si+bullet_t.turn_count] mov al, 80h - sub al, [si+11h] - mov [si+11h], al - mov al, [si+16h] + sub al, [si+bullet_t.BULLET_angle] + mov [si+bullet_t.BULLET_angle], al + mov al, [si+bullet_t.turn_count] cmp al, byte_2C976 jb short loc_179E0 - mov byte ptr [si+13h], 2 + mov [si+bullet_t.move_state], BMS_NORMAL loc_179E0: - lea ax, [si+0Ah] + lea ax, [si+bullet_t.pos.velocity] push ax - push word ptr [si+11h] - mov al, [si+10h] + push word ptr [si+bullet_t.BULLET_angle] + mov al, [si+bullet_t.speed_cur] mov ah, 0 push ax call vector2_near - push si - call sub_17973 + call sub_17973 pascal, si pop si pop bp retn 2 -sub_179C1 endp +bullet_turn_x endp ; =============== S U B R O U T I N E ======================================= ; Attributes: bp-based frame +public BULLET_TURN_Y +bullet_turn_y proc near -sub_179F9 proc near - -arg_0 = word ptr 4 +@@bullet = word ptr 4 push bp mov bp, sp push si - mov si, [bp+arg_0] - inc byte ptr [si+16h] - mov al, [si+11h] + mov si, [bp+@@bullet] + inc [si+bullet_t.turn_count] + mov al, [si+bullet_t.BULLET_angle] neg al - mov [si+11h], al - mov al, [si+16h] + mov [si+bullet_t.BULLET_angle], al + mov al, [si+bullet_t.turn_count] cmp al, byte_2C976 jb short loc_17A18 - mov byte ptr [si+13h], 2 + mov [si+bullet_t.move_state], BMS_NORMAL loc_17A18: - lea ax, [si+0Ah] + lea ax, [si+bullet_t.pos.velocity] push ax - push word ptr [si+11h] - mov al, [si+10h] + push word ptr [si+bullet_t.BULLET_angle] + mov al, [si+bullet_t.speed_cur] mov ah, 0 push ax call vector2_near @@ -17726,22 +17723,22 @@ loc_17A18: pop si pop bp retn 2 -sub_179F9 endp +bullet_turn_y endp ; =============== S U B R O U T I N E ======================================= ; Attributes: bp-based frame +public BULLET_UPDATE_SPECIAL +bullet_update_special proc near -sub_17A31 proc near - -arg_0 = word ptr 4 +@@bullet = word ptr 4 push bp mov bp, sp push si - mov si, [bp+arg_0] - mov al, [si+14h] + mov si, [bp+@@bullet] + mov al, [si+bullet_t.special_motion] mov ah, 0 dec ax mov bx, ax @@ -17751,13 +17748,13 @@ arg_0 = word ptr 4 jmp cs:off_17BF0[bx] loc_17A4E: - cmp byte ptr [si+10h], 0 + cmp [si+bullet_t.speed_cur], 0 jz short loc_17A56 jmp short loc_17A8D ; --------------------------------------------------------------------------- loc_17A56: - inc byte ptr [si+16h] + inc [si+bullet_t.turn_count] mov ax, _player_pos.cur.y sub ax, [si+4] push ax @@ -17765,109 +17762,109 @@ loc_17A56: sub ax, [si+2] push ax call iatan2 - mov [si+11h], al + mov [si+bullet_t.BULLET_angle], al push si call sub_17973 - mov al, [si+15h] - mov [si+10h], al - mov al, [si+16h] + mov al, [si+bullet_t.speed_final] + mov [si+bullet_t.speed_cur], al + mov al, [si+bullet_t.turn_count] cmp al, byte_2C976 jb loc_17B32 jmp loc_17B2E ; --------------------------------------------------------------------------- loc_17A87: - cmp byte ptr [si+10h], 0 + cmp [si+bullet_t.speed_cur], 0 jz short loc_17AA3 loc_17A8D: - lea ax, [si+0Ah] + lea ax, [si+bullet_t.pos.velocity] push ax - push word ptr [si+11h] - mov al, [si+10h] + push word ptr [si+bullet_t.BULLET_angle] + mov al, [si+bullet_t.speed_cur] mov ah, 0 push ax call vector2_near - dec byte ptr [si+10h] + dec [si+bullet_t.speed_cur] jmp loc_17BEB ; --------------------------------------------------------------------------- loc_17AA3: - inc byte ptr [si+16h] - mov al, [si+17h] - add [si+11h], al + inc [si+bullet_t.turn_count] + mov al, [si+bullet_t.turn_angle] + add [si+bullet_t.BULLET_angle], al push si call sub_17973 - mov al, [si+15h] - mov [si+10h], al - mov al, [si+16h] + mov al, [si+bullet_t.speed_final] + mov [si+bullet_t.speed_cur], al + mov al, [si+bullet_t.turn_count] cmp al, byte_2C976 jb short loc_17B32 jmp short loc_17B2E ; --------------------------------------------------------------------------- loc_17AC1: - lea ax, [si+0Ah] + lea ax, [si+bullet_t.pos.velocity] push ax - push word ptr [si+11h] - mov al, [si+10h] + push word ptr [si+bullet_t.BULLET_angle] + mov al, [si+bullet_t.speed_cur] mov ah, 0 push ax call vector2_near mov al, byte_2C976 - add [si+10h], al + add [si+bullet_t.speed_cur], al jmp loc_17BEB ; --------------------------------------------------------------------------- loc_17ADA: - cmp byte ptr [si+10h], 0 + cmp [si+bullet_t.speed_cur], 0 jz short loc_17B22 - lea ax, [si+0Ah] + lea ax, [si+bullet_t.pos.velocity] push ax - push word ptr [si+11h] - mov al, [si+10h] + push word ptr [si+bullet_t.BULLET_angle] + mov al, [si+bullet_t.speed_cur] mov ah, 0 push ax call vector2_near - cmp byte ptr [si+10h], 1 + cmp [si+bullet_t.speed_cur], 1 jbe short loc_17B00 - mov al, [si+10h] - add al, 0FEh - mov [si+10h], al + mov al, [si+bullet_t.speed_cur] + add al, -2 + mov [si+bullet_t.speed_cur], al jmp short loc_17B04 ; --------------------------------------------------------------------------- loc_17B00: - mov byte ptr [si+10h], 0 + mov [si+bullet_t.speed_cur], 0 loc_17B04: - cmp byte ptr [si+10h], 20h ; ' ' + cmp [si+bullet_t.speed_cur], (2 shl 4) jnb loc_17BEB - mov al, [si+17h] - sub al, [si+11h] + mov al, [si+bullet_t.turn_angle] + sub al, [si+bullet_t.BULLET_angle] cbw mov bx, 4 cwd idiv bx - add al, [si+11h] - mov [si+11h], al + add al, [si+bullet_t.BULLET_angle] + mov [si+bullet_t.BULLET_angle], al jmp loc_17BEB ; --------------------------------------------------------------------------- loc_17B22: - mov al, [si+17h] - mov [si+11h], al - mov al, [si+15h] - mov [si+10h], al + mov al, [si+bullet_t.turn_angle] + mov [si+bullet_t.BULLET_angle], al + mov al, [si+bullet_t.speed_final] + mov [si+bullet_t.speed_cur], al loc_17B2E: - mov byte ptr [si+13h], 2 + mov [si+bullet_t.move_state], BMS_NORMAL loc_17B32: - lea ax, [si+0Ah] + lea ax, [si+bullet_t.pos.velocity] push ax - push word ptr [si+11h] - mov al, [si+10h] + push word ptr [si+bullet_t.BULLET_angle] + mov al, [si+bullet_t.speed_cur] mov ah, 0 push ax call vector2_near @@ -17875,60 +17872,56 @@ loc_17B32: ; --------------------------------------------------------------------------- loc_17B45: - cmp word ptr [si+2], 0 + cmp [si+bullet_t.pos.cur.x], 0 jle short loc_17B54 - cmp word ptr [si+2], 1800h + cmp [si+bullet_t.pos.cur.x], (PLAYFIELD_W shl 4) jl loc_17BEB loc_17B54: - push si - call sub_179C1 + call bullet_turn_x pascal, si jmp loc_17BEB ; --------------------------------------------------------------------------- loc_17B5B: - cmp word ptr [si+4], 0 + cmp [si+bullet_t.pos.cur.y], 0 jle short loc_17BA3 - cmp word ptr [si+4], 1700h + cmp [si+bullet_t.pos.cur.y], (PLAYFIELD_H shl 4) jl loc_17BEB jmp short loc_17BA3 ; --------------------------------------------------------------------------- loc_17B6C: - cmp word ptr [si+2], 0 + cmp [si+bullet_t.pos.cur.x], 0 jle short loc_17B79 - cmp word ptr [si+2], 1800h + cmp [si+bullet_t.pos.cur.x], (PLAYFIELD_W shl 4) jl short loc_17B7D loc_17B79: - push si - call sub_179C1 + call bullet_turn_x pascal, si loc_17B7D: - cmp word ptr [si+4], 0 + cmp [si+bullet_t.pos.cur.y], 0 jle short loc_17BA3 - cmp word ptr [si+4], 1700h + cmp [si+bullet_t.pos.cur.y], (PLAYFIELD_H shl 4) jl short loc_17BEB jmp short loc_17BA3 ; --------------------------------------------------------------------------- loc_17B8C: - cmp word ptr [si+2], 0 + cmp [si+bullet_t.pos.cur.x], 0 jle short loc_17B99 - cmp word ptr [si+2], 1800h + cmp [si+bullet_t.pos.cur.x], (PLAYFIELD_W shl 4) jl short loc_17B9D loc_17B99: - push si - call sub_179C1 + call bullet_turn_x pascal, si loc_17B9D: - cmp word ptr [si+4], 0 + cmp [si+bullet_t.pos.cur.y], 0 jg short loc_17BEB loc_17BA3: - push si - call sub_179F9 + call bullet_turn_y pascal, si jmp short loc_17BEB ; --------------------------------------------------------------------------- @@ -17937,34 +17930,33 @@ loc_17BA9: jz short loc_17BEB mov al, byte_2C976 mov ah, 0 - add [si+0Ch], ax + add [si+bullet_t.pos.velocity.y], ax jmp short loc_17BEB ; --------------------------------------------------------------------------- loc_17BBA: - mov al, [si+10h] + mov al, [si+bullet_t.speed_cur] mov ah, 0 - add [si+1Eh], ax + add [si+bullet_t.distance], ax push offset _drawpoint - push word ptr [si+1Ah] - push word ptr [si+1Ch] - push word ptr [si+1Eh] - mov al, [si+11h] + push [si+bullet_t.BULLET_origin.x] + push [si+bullet_t.BULLET_origin.y] + push [si+bullet_t.distance] + mov al, [si+bullet_t.BULLET_angle] mov ah, 0 push ax call vector2_at mov ax, _drawpoint.x - sub ax, [si+2] - mov [si+0Ah], ax + sub ax, [si+bullet_t.pos.cur.x] + mov [si+bullet_t.pos.velocity.x], ax mov ax, _drawpoint.y - sub ax, [si+4] - mov [si+0Ch], ax + sub ax, [si+bullet_t.pos.cur.y] + mov [si+bullet_t.pos.velocity.y], ax loc_17BEB: pop si pop bp retn 2 -sub_17A31 endp ; --------------------------------------------------------------------------- off_17BF0 dw offset loc_17A4E @@ -17977,6 +17969,7 @@ off_17BF0 dw offset loc_17A4E dw offset loc_17B8C dw offset loc_17BA9 dw offset loc_17BBA +bullet_update_special endp ; =============== S U B R O U T I N E ======================================= @@ -17998,7 +17991,7 @@ var_2 = word ptr -2 mov [bp+var_2], 0 mov word_2CDF8, 0 mov word_2C97E, 0 - mov si, 8FA6h + mov si, offset _bullets[(BULLET_COUNT - 1) * size bullet_t] cmp _bullet_clear_trigger, 0 jnz loc_17EC3 xor di, di @@ -18006,11 +17999,11 @@ var_2 = word ptr -2 ; --------------------------------------------------------------------------- loc_17C2E: - cmp byte ptr [si], 0 + cmp [si+bullet_t.flag], 0 jz loc_17E74 - cmp byte ptr [si], 2 + cmp [si+bullet_t.flag], 2 jnz short loc_17C40 - mov byte ptr [si], 0 + mov [si+bullet_t.flag], 0 jmp loc_17E74 ; --------------------------------------------------------------------------- @@ -18018,21 +18011,21 @@ loc_17C40: inc [bp+var_2] cmp _bullet_clear_time, 0 jz short loc_17CA3 - cmp byte ptr [si+13h], 4 + cmp [si+bullet_t.move_state], BMS_DECAY jnb short loc_17C7B - mov byte ptr [si+13h], 4 - cmp di, 0DCh + mov [si+bullet_t.move_state], BMS_DECAY + cmp di, BULLET16_COUNT jge short loc_17C5F - mov ax, 0A0h + mov ax, 160 jmp short loc_17C62 ; --------------------------------------------------------------------------- loc_17C5F: - mov ax, 9Ch + mov ax, 156 loc_17C62: - mov [si+18h], ax - cmp byte ptr [si+1], 0 + mov [si+bullet_t.BULLET_patnum], ax + cmp [si+bullet_t.age], 0 jz short loc_17C73 add _score_delta, 100 jmp short loc_17CA3 @@ -18044,98 +18037,96 @@ loc_17C73: ; --------------------------------------------------------------------------- loc_17C7B: - inc byte ptr [si+13h] - cmp byte ptr [si+13h], 14h + inc [si+bullet_t.move_state] + cmp [si+bullet_t.move_state], BMS_DECAY_END jb short loc_17C91 - lea ax, [si+2] - push ax - call _motion_update_2 - mov byte ptr [si], 2 + lea ax, [si+bullet_t.pos] + call _motion_update_2 pascal, ax + mov [si+bullet_t.flag], 2 jmp loc_17E74 ; --------------------------------------------------------------------------- loc_17C91: - mov al, [si+13h] + mov al, [si+bullet_t.move_state] mov ah, 0 mov bx, 4 cwd idiv bx or dx, dx jnz short loc_17CA3 - inc word ptr [si+18h] + inc [si+bullet_t.BULLET_patnum] loc_17CA3: - inc byte ptr [si+1] - cmp byte ptr [si+12h], 2 + inc [si+bullet_t.age] + cmp [si+bullet_t.spawn_state], BSS_ACTIVE jb loc_17D56 - cmp byte ptr [si+12h], 2 + cmp [si+bullet_t.spawn_state], BSS_ACTIVE jnz short loc_17CBB - mov byte ptr [si+12h], 0 + mov [si+bullet_t.spawn_state], BSS_GRAZEABLE jmp loc_17D56 ; --------------------------------------------------------------------------- loc_17CBB: - cmp byte ptr [si+12h], 3 + cmp [si+bullet_t.spawn_state], BSS_CLOUD_BACKWARDS jnz short loc_17CE1 - mov eax, [si+2] - mov [si+6], eax - mov ax, [si+0Ah] + mov eax, dword ptr [si+bullet_t.pos.cur] + mov dword ptr [si+bullet_t.pos.prev], eax + mov ax, [si+bullet_t.pos.velocity.x] shl ax, 3 - sub [si+2], ax - mov ax, [si+0Ch] + sub [si+bullet_t.pos.cur.x], ax + mov ax, [si+bullet_t.pos.velocity.y] shl ax, 3 - sub [si+4], ax - mov byte ptr [si+12h], 4 + sub [si+bullet_t.pos.cur.y], ax + mov [si+bullet_t.spawn_state], BSS_CLOUD_FORWARDS jmp short loc_17D0D ; --------------------------------------------------------------------------- loc_17CE1: - cmp byte ptr [si+12h], 4 + cmp [si+bullet_t.spawn_state], BSS_CLOUD_FORWARDS jnz short loc_17CF0 - lea ax, [si+2] - push ax - call _motion_update_2 + lea ax, [si+bullet_t.pos] + call _motion_update_2 pascal, ax jmp short loc_17D0D ; --------------------------------------------------------------------------- loc_17CF0: - mov eax, [si+2] - mov [si+6], eax - mov ax, [si+0Ah] + mov eax, dword ptr [si+bullet_t.pos.cur] + mov dword ptr [si+bullet_t.pos.prev], eax + mov ax, [si+bullet_t.pos.velocity.x] mov bx, 3 cwd idiv bx - add [si+2], ax - mov ax, [si+0Ch] + add [si+bullet_t.pos.cur.x], ax + mov ax, [si+bullet_t.pos.velocity.y] cwd idiv bx - add [si+4], ax + add [si+bullet_t.pos.cur.y], ax loc_17D0D: - inc byte ptr [si+12h] - cmp byte ptr [si+12h], 14h + inc [si+bullet_t.spawn_state] + cmp [si+bullet_t.spawn_state], BSS_CLOUD_END jb short loc_17D3D - cmp word ptr [si+4], 0FF80h + cmp [si+bullet_t.pos.cur.y], (-8 shl 4) jl short loc_17D30 - cmp word ptr [si+4], 1780h + cmp [si+bullet_t.pos.cur.y], ((PLAYFIELD_H + 8) shl 4) jge short loc_17D30 - cmp word ptr [si+2], 0FF80h + cmp [si+bullet_t.pos.cur.x], (-8 shl 4) jl short loc_17D30 - cmp word ptr [si+2], 1880h + cmp [si+bullet_t.pos.cur.x], ((PLAYFIELD_W + 8) shl 4) jl short loc_17D36 loc_17D30: - mov byte ptr [si], 2 + mov [si+bullet_t.flag], 2 jmp loc_17E74 ; --------------------------------------------------------------------------- loc_17D36: - mov byte ptr [si+12h], 2 + mov [si+bullet_t.spawn_state], BSS_ACTIVE jmp loc_17E74 ; --------------------------------------------------------------------------- loc_17D3D: - cmp di, 0DCh + cmp di, BULLET16_COUNT jl loc_17E74 mov bx, word_2CDF8 add bx, bx @@ -18145,44 +18136,43 @@ loc_17D3D: ; --------------------------------------------------------------------------- loc_17D56: - cmp byte ptr [si+13h], 1 + cmp [si+bullet_t.move_state], BMS_SPECIAL jnz short loc_17D62 - push si - call sub_17A31 + call bullet_update_special pascal, si jmp short loc_17DA3 ; --------------------------------------------------------------------------- loc_17D62: - cmp byte ptr [si+13h], 0 + cmp [si+bullet_t.move_state], BMS_SLOWDOWN jnz short loc_17DA3 - dec byte ptr [si+16h] - mov al, [si+16h] + dec [si+bullet_t.slowdown_time] + mov al, [si+bullet_t.slowdown_time] mov ah, 0 - mov dl, [si+17h] + mov dl, [si+bullet_t.slowdown_speed_delta] mov dh, 0 imul dx - mov bx, 20h ; ' ' + mov bx, BMS_SLOWDOWN_FRAMES cwd idiv bx - add al, [si+15h] - mov [si+10h], al - cmp byte ptr [si+16h], 0 + add al, [si+bullet_t.speed_final] + mov [si+bullet_t.speed_cur], al + cmp [si+bullet_t.slowdown_time], 0 jnz short loc_17D93 - mov al, [si+15h] - mov [si+10h], al - mov byte ptr [si+13h], 2 + mov al, [si+bullet_t.speed_final] + mov [si+bullet_t.speed_cur], al + mov [si+bullet_t.move_state], BMS_NORMAL loc_17D93: - lea ax, [si+0Ah] + lea ax, [si+bullet_t.pos.velocity] push ax - push word ptr [si+11h] - mov al, [si+10h] + push word ptr [si+bullet_t.BULLET_angle] + mov al, [si+bullet_t.speed_cur] mov ah, 0 push ax call vector2_near loc_17DA3: - lea ax, [si+2] + lea ax, [si+bullet_t.pos] call _motion_update_2 pascal, ax cmp ax, (-8 shl 4) jle short loc_17DBF @@ -18194,7 +18184,7 @@ loc_17DA3: jl short loc_17DC5 loc_17DBF: - mov byte ptr [si], 2 + mov [si+bullet_t.flag], 2 jmp loc_17E74 ; --------------------------------------------------------------------------- @@ -18205,7 +18195,7 @@ loc_17DC5: sub dx, _player_pos.cur.y cmp _player_invincibility_time, 0 jnz short loc_17E41 - cmp byte ptr [si+12h], 0 + cmp [si+bullet_t.spawn_state], BSS_GRAZEABLE jz short loc_17DFE add ax, (4 shl 4) cmp ax, (8 shl 4) @@ -18213,7 +18203,7 @@ loc_17DC5: add dx, (4 shl 4) cmp dx, (8 shl 4) ja short loc_17E41 - mov byte ptr [si], 2 + mov [si+bullet_t.flag], 2 mov _player_is_hit, 1 jmp short loc_17E74 ; --------------------------------------------------------------------------- @@ -18225,11 +18215,11 @@ loc_17DFE: add dx, (22 shl 4) cmp dx, (44 shl 4) ja short loc_17E41 - push word ptr [si+2] - push word ptr [si+4] + push [si+bullet_t.pos.cur.x] + push [si+bullet_t.pos.cur.y] push large (((2 shl 4) shl 16) or 2) nopcall sparks_add_random - mov byte ptr [si+12h], 1 + mov [si+bullet_t.spawn_state], BSS_GRAZED cmp _stage_graze, GRAZE_MAX jnb short loc_17E41 inc _stage_graze @@ -18238,15 +18228,15 @@ loc_17DFE: add _score_delta, eax loc_17E41: - cmp di, 0DCh + cmp di, BULLET16_COUNT jl short loc_17E74 - mov ax, [si+2] + mov ax, [si+bullet_t.pos.cur.x] sar ax, 4 - add ax, 1Ch + add ax, 28 mov bx, word_2C97E shl bx, 2 mov [bx-703Ah], ax - mov ax, [si+4] + mov ax, [si+bullet_t.pos.cur.y] add ax, (12 shl 4) call scroll_subpixel_y_to_vram_seg3 pascal, ax mov bx, word_2C97E @@ -18256,10 +18246,10 @@ loc_17E41: loc_17E74: inc di - sub si, 20h ; ' ' + sub si, size bullet_t loc_17E78: - cmp di, 190h + cmp di, BULLET_COUNT jl loc_17C2E cmp _turbo_mode, 0 jnz loc_17FB7 @@ -18316,18 +18306,17 @@ loc_17EFA: ; --------------------------------------------------------------------------- loc_17F0B: - cmp byte ptr [si], 1 + cmp [si+bullet_t.flag], 1 jnz short loc_17F89 - mov word ptr [si+0Ah], 0 - mov word ptr [si+0Ch], 0 - lea ax, [si+2] - push ax - call _motion_update_2 + mov [si+bullet_t.pos.velocity.x], 0 + mov [si+bullet_t.pos.velocity.y], 0 + lea ax, [si+bullet_t.pos] + call _motion_update_2 pascal, ax cmp [bp+var_9], 4Ch ; 'L' jnb short loc_17F31 mov al, [bp+var_9] mov ah, 0 - mov [si+18h], ax + mov [si+bullet_t.BULLET_patnum], ax jmp short loc_17F86 ; --------------------------------------------------------------------------- @@ -18335,8 +18324,8 @@ loc_17F31: movzx eax, [bp+var_4] add _popup_bonus, eax add _score_delta, eax - push word ptr [si+2] - push word ptr [si+4] + push [si+bullet_t.pos.cur.x] + push [si+bullet_t.pos.cur.y] push [bp+var_4] call sub_15888 mov ax, [bp+var_6] @@ -18349,7 +18338,7 @@ loc_17F31: mov [bp+var_4], ax loc_17F64: - mov byte ptr [si], 2 + mov [si+bullet_t.flag], 2 cmp byte_226C0, 0 jz short loc_17F86 mov ax, [bp+var_2] @@ -18358,17 +18347,17 @@ loc_17F64: idiv bx or dx, dx jnz short loc_17F86 - call items_add pascal, word ptr [si+2], word ptr [si+4], IT_POINT + call items_add pascal, [si+bullet_t.pos.cur.x], [si+bullet_t.pos.cur.y], IT_POINT loc_17F86: inc [bp+var_2] loc_17F89: inc di - sub si, 20h ; ' ' + sub si, size bullet_t loc_17F8D: - cmp di, 190h + cmp di, BULLET_COUNT jl loc_17F0B cmp _popup_bonus, 0 jz short loc_17FA8 @@ -33945,6 +33934,7 @@ include th04/midboss/vars[bss].asm include th04/boss/vars[bss].asm include th05/boss/vars2[bss].asm include th04/sparks[bss].asm +include th04/bullet/bullets[bss].asm dd ? ; dd ? ; dd ? ; @@ -34808,3209 +34798,6 @@ include th04/sparks[bss].asm dd ? ; dd ? ; dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; -byte_2980E db ? - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - db ? ; - db ? ; - db ? ; dword_2A722 dd ? dword_2A726 dd ? word_2A72A dw ?