mirror of
https://github.com/mariiaan/Bugtris.git
synced 2026-05-14 10:11:20 +02:00
make it suck less
This commit is contained in:
@@ -74,18 +74,22 @@ RECT ends
|
||||
SND_ASYNC EQU 1
|
||||
|
||||
; Tetromino shape definitions
|
||||
TETRO_0 db 2, 4, "x x x xx" ; L
|
||||
TETRO_1 db 2, 4, " x x xxx" ; Reverse L
|
||||
TETRO_2 db 2, 2, "xxxx" ; Block
|
||||
TETRO_3 db 4, 1, "xxxx" ; Line
|
||||
TETRO_4 db 3, 2, " xxxx " ; snake from BL to TR
|
||||
TETRO_5 db 3, 2, "xx xx" ; snake from TR to BL
|
||||
TETRO_6 db 3, 2, " x xxx" ; penith
|
||||
TETRO_0 db 2, 4, 1, "x x x xx" ; L
|
||||
TETRO_1 db 2, 4, 2, " x x xxx" ; Reverse L
|
||||
TETRO_2 db 2, 2, 3, "xxxx" ; Block
|
||||
TETRO_3 db 4, 1, 4, "xxxx" ; Line
|
||||
TETRO_4 db 3, 2, 5, " xxxx " ; snake from BL to TR
|
||||
TETRO_5 db 3, 2, 6, "xx xx" ; snake from TR to BL
|
||||
TETRO_6 db 3, 2, 7, " x xxx" ; penith
|
||||
|
||||
poolStart:
|
||||
shapePoolStart:
|
||||
TETRO_SHAPE_POOL dq TETRO_0, TETRO_1, TETRO_2, TETRO_3, TETRO_4, TETRO_5, TETRO_6
|
||||
; Tetromino shape pool
|
||||
TETRO_SHAPE_POOL_SIZE EQU ($-poolStart)/8
|
||||
TETRO_SHAPE_POOL_SIZE EQU ($-shapePoolStart) / 8
|
||||
colorPoolStart:
|
||||
COLOR_POOL dq 0H, 0000F0A0H, 00FF0000H, 00F000F0H, 00F0F000H, 0000FF00H, 000000FFH, 0000F0A0H
|
||||
COLOR_POOL_SIZE EQU ($-colorPoolStart) / 8
|
||||
|
||||
TETRO_MAX_WIDTH EQU 4
|
||||
TETRO_MAX_HEIGHT EQU 4
|
||||
TETRO_BUFFER_SIZE EQU TETRO_MAX_WIDTH * TETRO_MAX_HEIGHT
|
||||
@@ -99,6 +103,7 @@ RECT ends
|
||||
tetroBufferRotateTmp db TETRO_BUFFER_SIZE dup(?)
|
||||
tetroBufferCurrentWidth db ?
|
||||
tetroBufferCurrentHeight db ?
|
||||
tetroBufferCurrentState db ?
|
||||
playerPosX db ?
|
||||
playerPosY db ?
|
||||
hdc dq ?
|
||||
@@ -107,6 +112,24 @@ RECT ends
|
||||
|
||||
.code ; --------------------------
|
||||
|
||||
; (in) rcx state
|
||||
; (out) rax color
|
||||
GetColor PROC
|
||||
push r8
|
||||
push rdx
|
||||
mov rax, rcx
|
||||
mov r8, 8
|
||||
mul r8
|
||||
|
||||
lea r8, COLOR_POOL
|
||||
add r8, rax
|
||||
|
||||
mov rax, [r8]
|
||||
pop rdx
|
||||
pop r8
|
||||
ret
|
||||
GetColor ENDP
|
||||
|
||||
main PROC
|
||||
call InitRandom
|
||||
|
||||
@@ -158,10 +181,11 @@ main PROC
|
||||
mov rax, GRID_SIZE_X
|
||||
mul r11
|
||||
mov r12, rax
|
||||
add r12, 16
|
||||
mov rax, GRID_SIZE_Y
|
||||
mul r11
|
||||
mov r13, rax
|
||||
add r13, 12
|
||||
add r13, 24 + 12
|
||||
|
||||
; Create Window
|
||||
xor ecx, ecx ; dwExStyle
|
||||
@@ -322,15 +346,20 @@ LoadTetromino PROC
|
||||
|
||||
; r8 -> [0] tetro width
|
||||
mov al, byte ptr [r8]
|
||||
mov [tetroBufferCurrentWidth], al
|
||||
mov byte ptr [tetroBufferCurrentWidth], al
|
||||
inc r8
|
||||
|
||||
; r8 -> [1] tetro height
|
||||
mov al, byte ptr [r8]
|
||||
mov [tetroBufferCurrentHeight], al
|
||||
mov byte ptr [tetroBufferCurrentHeight], al
|
||||
inc r8
|
||||
|
||||
; r8 -> [2] tetromino data
|
||||
; r8 -> [2] tetro color
|
||||
mov al, byte ptr [r8]
|
||||
mov byte ptr [tetroBufferCurrentState], al
|
||||
inc r8
|
||||
|
||||
; r8 -> [3] tetromino data
|
||||
|
||||
push r10 ; x = 0
|
||||
push r11 ; y = 0
|
||||
@@ -663,8 +692,7 @@ SetTetroTmpState ENDP
|
||||
GetFieldState PROC
|
||||
push r8
|
||||
push rdx
|
||||
mov r8, GRID_SIZE_Y
|
||||
cmp rdx, r8
|
||||
cmp rdx, GRID_SIZE_Y
|
||||
jge false_oob
|
||||
mov r8, GRID_SIZE_X
|
||||
cmp rcx, r8
|
||||
@@ -776,58 +804,6 @@ RenderBlock PROC
|
||||
ret
|
||||
RenderBlock ENDP
|
||||
|
||||
; (in) rcx row index
|
||||
CheckIfRowFull PROC
|
||||
push rdx
|
||||
xor rdx, rdx
|
||||
push r8
|
||||
xor r8, r8
|
||||
mov r8b, byte ptr [GRID_SIZE_X]
|
||||
|
||||
_loop:
|
||||
cmp rdx, r8
|
||||
je _loop_break_true
|
||||
|
||||
push rcx
|
||||
push rdx
|
||||
mov rdx, rcx
|
||||
mov rcx, r8
|
||||
call GetFieldState
|
||||
pop rdx
|
||||
pop rcx
|
||||
test rax, rax
|
||||
jz _loop_break_false
|
||||
|
||||
jmp _loop
|
||||
|
||||
_loop_break_false:
|
||||
mov rax, 0
|
||||
jmp _loop_break
|
||||
|
||||
_loop_break_true:
|
||||
mov rax, 1
|
||||
_loop_break:
|
||||
pop r8
|
||||
pop rdx
|
||||
|
||||
ret
|
||||
CheckIfRowFull ENDP
|
||||
|
||||
; (in) rcx row to clear
|
||||
ClearAndMoveDown PROC
|
||||
|
||||
ret
|
||||
ClearAndMoveDown ENDP
|
||||
|
||||
CheckRowClear PROC
|
||||
push rcx
|
||||
mov rcx, GRID_SIZE_Y - 1 ; row index
|
||||
|
||||
|
||||
pop rdx
|
||||
ret
|
||||
CheckRowClear ENDP
|
||||
|
||||
RenderPlayerField PROC
|
||||
push rcx
|
||||
push rdx
|
||||
@@ -852,14 +828,19 @@ loop_x:
|
||||
je loop_x_break
|
||||
|
||||
call GetFieldState
|
||||
cmp al, 1 ; Set field;
|
||||
je draw_single_block
|
||||
test al, al
|
||||
jnz draw_single_block
|
||||
|
||||
jmp loop_x_continue
|
||||
|
||||
draw_single_block:
|
||||
push r8
|
||||
mov r8, 00FF0000h
|
||||
push rcx
|
||||
;mov r8, 00FF0000h
|
||||
mov cl, al
|
||||
call GetColor
|
||||
mov r8, rax
|
||||
pop rcx
|
||||
call RenderBlock
|
||||
pop r8
|
||||
jmp loop_x_continue
|
||||
@@ -935,8 +916,16 @@ _loopX:
|
||||
mov rdx, rbx
|
||||
add rdx, r9
|
||||
push r8
|
||||
mov r8, 000000FFh ; Todo state to color
|
||||
|
||||
push rax
|
||||
push rcx
|
||||
mov cl, byte ptr [tetroBufferCurrentState]
|
||||
call GetColor
|
||||
pop rcx
|
||||
mov r8, rax ; Todo state to color
|
||||
;pop rax
|
||||
|
||||
;push rax
|
||||
call RenderBlock
|
||||
pop rax
|
||||
pop r8
|
||||
@@ -966,6 +955,108 @@ _loopY_break:
|
||||
ret
|
||||
RenderPlayer ENDP
|
||||
|
||||
; (in) rcx row index
|
||||
CheckIfRowFull PROC
|
||||
push rdx
|
||||
xor rdx, rdx
|
||||
push r8
|
||||
xor r8, r8
|
||||
mov r8b, GRID_SIZE_X
|
||||
|
||||
_loop:
|
||||
cmp rdx, r8
|
||||
je _loop_break_true
|
||||
|
||||
push rcx
|
||||
push rdx
|
||||
xchg rcx, rdx
|
||||
call GetFieldState
|
||||
pop rdx
|
||||
pop rcx
|
||||
test rax, rax
|
||||
jz _loop_break_false
|
||||
|
||||
inc rdx
|
||||
jmp _loop
|
||||
|
||||
_loop_break_false:
|
||||
mov rax, 0
|
||||
jmp _loop_break
|
||||
|
||||
_loop_break_true:
|
||||
mov rax, 1
|
||||
_loop_break:
|
||||
pop r8
|
||||
pop rdx
|
||||
|
||||
ret
|
||||
CheckIfRowFull ENDP
|
||||
|
||||
; (in) rcx: base row
|
||||
MoveRowDown PROC
|
||||
|
||||
ret
|
||||
MoveRowDown ENDP
|
||||
|
||||
; (in) rcx row to clear
|
||||
ClearRow PROC
|
||||
push r8
|
||||
xor r8, r8
|
||||
_loop:
|
||||
cmp r8, GRID_SIZE_X
|
||||
je _loop_break
|
||||
|
||||
push rcx
|
||||
push rdx
|
||||
push r8
|
||||
mov rdx, rcx
|
||||
mov rcx, r8
|
||||
mov r8, 0
|
||||
call SetFieldState
|
||||
pop r8
|
||||
pop rdx
|
||||
pop rcx
|
||||
|
||||
inc r8
|
||||
jmp _loop
|
||||
|
||||
_loop_break:
|
||||
pop r8
|
||||
|
||||
ret
|
||||
ClearRow ENDP
|
||||
|
||||
CheckRowClear PROC
|
||||
push rcx
|
||||
mov rcx, GRID_SIZE_Y - 1 ; row index
|
||||
push r8
|
||||
|
||||
_loop:
|
||||
cmp rcx, 0
|
||||
jl loop_break
|
||||
xor r8, r8
|
||||
|
||||
innerloop:
|
||||
call CheckIfRowFull
|
||||
test rax, rax
|
||||
jz loop_continue
|
||||
inc r8
|
||||
call ClearRow
|
||||
call MoveRowDown
|
||||
jmp innerloop
|
||||
|
||||
loop_continue:
|
||||
; todo attrib points with combo in r8
|
||||
dec rcx
|
||||
jmp _loop
|
||||
|
||||
loop_break:
|
||||
|
||||
pop r8
|
||||
pop rdx
|
||||
ret
|
||||
CheckRowClear ENDP
|
||||
|
||||
GameUpdate PROC
|
||||
call MovePlayerDown
|
||||
ret
|
||||
@@ -1077,12 +1168,14 @@ IsPlayerJammedInBounds PROC
|
||||
|
||||
mov rcx, GRID_SIZE_X
|
||||
sub cl, byte ptr [tetroBufferCurrentWidth]
|
||||
inc cl
|
||||
cmp bl, cl
|
||||
jge return_true
|
||||
|
||||
mov bl, byte ptr [playerPosY]
|
||||
mov rcx, GRID_SIZE_Y
|
||||
sub cl, byte ptr [tetroBufferCurrentHeight]
|
||||
inc cl
|
||||
cmp bl, cl
|
||||
jge return_true
|
||||
|
||||
@@ -1139,7 +1232,7 @@ loopX:
|
||||
add cl, byte ptr [playerPosX]
|
||||
add dl, byte ptr [playerPosY]
|
||||
push r8
|
||||
mov r8, 1
|
||||
mov r8b, [tetroBufferCurrentState]
|
||||
call SetFieldState
|
||||
pop r8
|
||||
sub dl, byte ptr [playerPosY]
|
||||
|
||||
Reference in New Issue
Block a user