ReC98/th04/main/gather_add.asm

185 lines
3.9 KiB
NASM

public GATHER_BULLET_TEMPLATE_PULL
gather_bullet_template_pull proc near
@@gather = word ptr 4
push bp
mov bp, sp
push si
push di
if GAME eq 5
mov cx, size _bullet_template / 2
push ds
pop es
assume es:_DATA
mov si, offset _bullet_template
mov di, [bp+@@gather]
add di, gather_t.G_bullet_template
else
push ds
pop es
assume es:_DATA
mov si, offset _bullet_template
mov di, [bp+@@gather]
add di, gather_t.G_bullet_template
mov cx, size _bullet_template / 2
endif
rep movsw
pop di
pop si
pop bp
retn 2
gather_bullet_template_pull endp
public _gather_add_bullets
_gather_add_bullets proc near
push bp
mov bp, sp
push si
push di
mov si, offset _gather_circles
xor di, di
jmp short @@more?
; ---------------------------------------------------------------------------
@@loop:
cmp [si+gather_t.G_flag], 0
jnz short @@next
mov [si+gather_t.G_flag], 1
call gather_bullet_template_pull pascal, si
mov ax, _gather_template.GT_center.x
mov [si+gather_t.G_center.x], ax
mov ax, _gather_template.GT_center.y
mov [si+gather_t.G_center.y], ax
mov ax, _gather_template.GT_radius
mov [si+gather_t.G_radius_cur], ax
mov [si+gather_t.G_radius_prev], ax
mov ax, _gather_template.GT_velocity.x
mov [si+gather_t.G_center.velocity.x], ax
mov ax, _gather_template.GT_velocity.y
mov [si+gather_t.G_center.velocity.y], ax
mov [si+gather_t.G_angle_cur], 0
mov al, _gather_template.GT_angle_delta
mov [si+gather_t.G_angle_delta], al
mov al, _gather_template.GT_col
mov [si+gather_t.G_col], al
mov ax, _gather_template.GT_ring_points
mov [si+gather_t.G_ring_points], ax
mov ax, _gather_template.GT_radius
mov bx, GATHER_FRAMES
cwd
idiv bx
mov [si+gather_t.G_radius_delta], ax
jmp short @@ret
; ---------------------------------------------------------------------------
@@next:
inc di
add si, size gather_t
@@more?:
cmp di, GATHER_CAP
jl short @@loop
@@ret:
pop di
pop si
pop bp
retn
_gather_add_bullets endp
public _gather_add_only
_gather_add_only proc near
push bp
mov bp, sp
push si
mov si, offset _gather_circles
xor cx, cx
jmp short @@more?
; ---------------------------------------------------------------------------
@@loop:
cmp [si+gather_t.G_flag], 0
jnz short @@next
mov [si+gather_t.G_flag], 1
mov [si+gather_t.G_bullet_template.spawn_type], BST_GATHER_ONLY
mov ax, _gather_template.GT_center.x
mov [si+gather_t.G_center.x], ax
mov ax, _gather_template.GT_center.y
mov [si+gather_t.G_center.y], ax
mov ax, _gather_template.GT_radius
mov [si+gather_t.G_radius_cur], ax
mov [si+gather_t.G_radius_prev], ax
mov ax, _gather_template.GT_velocity.x
mov [si+gather_t.G_center.velocity.x], ax
mov ax, _gather_template.GT_velocity.y
mov [si+gather_t.G_center.velocity.y], ax
mov [si+gather_t.G_angle_cur], 0
mov al, _gather_template.GT_angle_delta
mov [si+gather_t.G_angle_delta], al
mov al, _gather_template.GT_col
mov [si+gather_t.G_col], al
mov ax, _gather_template.GT_ring_points
mov [si+gather_t.G_ring_points], ax
mov ax, _gather_template.GT_radius
mov bx, GATHER_FRAMES
cwd
idiv bx
mov [si+gather_t.G_radius_delta], ax
jmp short @@ret
; ---------------------------------------------------------------------------
@@next:
inc cx
add si, size gather_t
@@more?:
cmp cx, GATHER_CAP
jl short @@loop
@@ret:
pop si
pop bp
retn
_gather_add_only endp
public GATHER_ADD_ONLY_3STACK
gather_add_only_3stack proc near
@@col_for_2_and_4 = byte ptr 4
@@col_for_0 = byte ptr 6
@@frame = word ptr 8
push bp
mov bp, sp
mov ax, [bp+@@frame]
or ax, ax
jz short @@0
cmp ax, 2
jz short @@2_4
cmp ax, 4
jz short @@add
pop bp
retn 6
; ---------------------------------------------------------------------------
@@0:
mov al, [bp+@@col_for_0]
jmp short @@set_col
; ---------------------------------------------------------------------------
@@2_4:
mov al, [bp+@@col_for_2_and_4]
@@set_col:
mov _gather_template.GT_col, al
@@add:
call _gather_add_only
pop bp
retn 6
gather_add_only_3stack endp