mirror of https://github.com/nmlgc/ReC98.git
160 lines
3.4 KiB
NASM
160 lines
3.4 KiB
NASM
|
public B6BALLS_ADD
|
||
|
b6balls_add proc near
|
||
|
|
||
|
@@speed = word ptr -2
|
||
|
|
||
|
enter 2, 0
|
||
|
push si
|
||
|
push di
|
||
|
mov al, b6ball_template.B6B_speed
|
||
|
call @playperf_adjust_speed
|
||
|
mov ah, 0
|
||
|
mov [bp+@@speed], ax
|
||
|
mov si, offset b6balls
|
||
|
mov di, 1
|
||
|
jmp short @@more?
|
||
|
; ---------------------------------------------------------------------------
|
||
|
|
||
|
@@loop:
|
||
|
cmp [si+b6ball_t.flag], 0
|
||
|
jnz short @@next
|
||
|
mov [si+b6ball_t.flag], 1
|
||
|
mov eax, b6ball_template.pos.cur
|
||
|
mov dword ptr [si+b6ball_t.pos.cur], eax
|
||
|
lea ax, [si+b6ball_t.pos.velocity]
|
||
|
call vector2_near pascal, ax, word ptr b6ball_template.B6B_angle, [bp+@@speed]
|
||
|
mov ax, b6ball_template.B6B_patnum_tiny
|
||
|
mov [si+b6ball_t.B6B_patnum_tiny], ax
|
||
|
mov [si+b6ball_t.cloud_radius], (48 shl 4)
|
||
|
jmp short @@ret
|
||
|
; ---------------------------------------------------------------------------
|
||
|
|
||
|
@@next:
|
||
|
inc di
|
||
|
add si, size b6ball_t
|
||
|
|
||
|
@@more?:
|
||
|
cmp di, 1 + B6BALL_COUNT
|
||
|
jl short @@loop
|
||
|
|
||
|
@@ret:
|
||
|
pop di
|
||
|
pop si
|
||
|
leave
|
||
|
retn
|
||
|
b6balls_add endp
|
||
|
|
||
|
|
||
|
public B6BALLS_UPDATE
|
||
|
b6balls_update proc near
|
||
|
push bp
|
||
|
mov bp, sp
|
||
|
push si
|
||
|
push di
|
||
|
mov si, offset b6balls
|
||
|
mov di, 1
|
||
|
jmp @@more?
|
||
|
; ---------------------------------------------------------------------------
|
||
|
|
||
|
@@loop:
|
||
|
cmp [si+b6ball_t.flag], 0
|
||
|
jz @@next
|
||
|
cmp [si+b6ball_t.flag], 1
|
||
|
jnz short @@no_cloud
|
||
|
sub [si+b6ball_t.cloud_radius], (2 shl 4)
|
||
|
cmp [si+b6ball_t.cloud_radius], ((B6BALL_W / 2) shl 4)
|
||
|
jge @@next
|
||
|
inc [si+b6ball_t.flag]
|
||
|
|
||
|
@@no_cloud:
|
||
|
cmp _bullet_clear_time, 0
|
||
|
jnz short @@decay
|
||
|
cmp _bullet_clear_trigger, 0
|
||
|
jz short @@motion_update
|
||
|
|
||
|
@@decay:
|
||
|
mov [si+b6ball_t.flag], 3
|
||
|
|
||
|
@@motion_update:
|
||
|
inc [si+b6ball_t.B6B_age]
|
||
|
lea ax, [si+b6ball_t.pos.cur]
|
||
|
call _motion_update_2 pascal, ax
|
||
|
cmp ax, (-16 shl 4)
|
||
|
jle short @@clip
|
||
|
cmp ax, ((PLAYFIELD_W + 16) shl 4)
|
||
|
jge short @@clip
|
||
|
cmp dx, (-16 shl 4)
|
||
|
jle short @@clip
|
||
|
cmp dx, ((PLAYFIELD_H + 16) shl 4)
|
||
|
jl short @@hitbox_active_or_already_decaying?
|
||
|
|
||
|
@@clip:
|
||
|
jmp short @@remove
|
||
|
; ---------------------------------------------------------------------------
|
||
|
|
||
|
@@hitbox_active_or_already_decaying?:
|
||
|
cmp [si+b6ball_t.flag], 3
|
||
|
jz short @@in_decay_state
|
||
|
sub ax, _player_pos.cur.x
|
||
|
sub dx, _player_pos.cur.y
|
||
|
add ax, 8 * 16
|
||
|
cmp ax, 16 * 16
|
||
|
ja short @@not_hitting_player
|
||
|
add dx, 8 * 16
|
||
|
cmp dx, 16 * 16
|
||
|
ja short @@not_hitting_player
|
||
|
mov _player_is_hit, 1
|
||
|
mov [si+b6ball_t.flag], 3
|
||
|
jmp short @@next
|
||
|
; ---------------------------------------------------------------------------
|
||
|
|
||
|
@@not_hitting_player:
|
||
|
jmp short @@next
|
||
|
; ---------------------------------------------------------------------------
|
||
|
|
||
|
@@in_decay_state:
|
||
|
cmp [si+b6ball_t.B6B_patnum_tiny], PAT_DECAY_B6BALL
|
||
|
jge short @@already_decaying
|
||
|
mov [si+b6ball_t.B6B_patnum_tiny], PAT_DECAY_B6BALL
|
||
|
mov ax, [si+b6ball_t.pos.velocity.x]
|
||
|
cwd
|
||
|
sub ax, dx
|
||
|
sar ax, 1
|
||
|
mov [si+b6ball_t.pos.velocity.x], ax
|
||
|
mov ax, [si+b6ball_t.pos.velocity.y]
|
||
|
cwd
|
||
|
sub ax, dx
|
||
|
sar ax, 1
|
||
|
mov [si+b6ball_t.pos.velocity.y], ax
|
||
|
mov [si+b6ball_t.B6B_decay_frames], 0
|
||
|
jmp short @@next
|
||
|
; ---------------------------------------------------------------------------
|
||
|
|
||
|
@@already_decaying:
|
||
|
inc [si+b6ball_t.B6B_decay_frames]
|
||
|
mov ax, [si+b6ball_t.B6B_decay_frames]
|
||
|
mov bx, 4
|
||
|
cwd
|
||
|
idiv bx
|
||
|
or dx, dx
|
||
|
jnz short @@next
|
||
|
inc [si+b6ball_t.B6B_patnum_tiny]
|
||
|
cmp [si+b6ball_t.B6B_patnum_tiny], (PAT_DECAY_B6BALL + BULLET_DECAY_CELS)
|
||
|
jl short @@next
|
||
|
|
||
|
@@remove:
|
||
|
mov [si+b6ball_t.flag], 0
|
||
|
|
||
|
@@next:
|
||
|
inc di
|
||
|
add si, size b6ball_t
|
||
|
|
||
|
@@more?:
|
||
|
cmp di, 1 + B6BALL_COUNT
|
||
|
jl @@loop
|
||
|
pop di
|
||
|
pop si
|
||
|
pop bp
|
||
|
retn
|
||
|
b6balls_update endp
|