diff --git a/Bugtris/Bugtris.vcxproj b/Bugtris/Bugtris.vcxproj index 93e8e41..6cb4138 100644 --- a/Bugtris/Bugtris.vcxproj +++ b/Bugtris/Bugtris.vcxproj @@ -128,15 +128,13 @@ true true true + main - - - - + diff --git a/Bugtris/Bugtris.vcxproj.filters b/Bugtris/Bugtris.vcxproj.filters index aed0bfb..e58b30c 100644 --- a/Bugtris/Bugtris.vcxproj.filters +++ b/Bugtris/Bugtris.vcxproj.filters @@ -15,12 +15,7 @@ - - Quelldateien - - - - + Quelldateien diff --git a/Bugtris/main2.asm b/Bugtris/app.asm similarity index 87% rename from Bugtris/main2.asm rename to Bugtris/app.asm index 9b7657c..0a6fc4a 100644 --- a/Bugtris/main2.asm +++ b/Bugtris/app.asm @@ -22,6 +22,8 @@ GetClientRect PROTO GetTickCount PROTO PlaySoundA PROTO Sleep PROTO +MessageBoxA PROTO +KillTimer PROTO RECT struct left dd ? @@ -51,12 +53,15 @@ RECT ends myClassName db "TestKlasse", 0 myWindowTitle db "Tetris", 0 - GRID_SIZE_X EQU 20 - GRID_SIZE_Y EQU 30 - BLOCK_PIXEL_LENGTH EQU 24 + GRID_SIZE_X EQU 30 + GRID_SIZE_Y EQU 40 + BLOCK_PIXEL_LENGTH EQU 25 GRID_NUM_ELEMENTS EQU GRID_SIZE_X * GRID_SIZE_Y GRID_BYTE_SIZE EQU GRID_NUM_ELEMENTS + StrPoints db "Score: ", 0 + StrGameOver db "You have lost.",0 + StrGameOverCaption db "Game Over!",0 .const ; Win32 Definitions --- WS_OVERLAPPEDWINDOW EQU 13565952 @@ -65,7 +70,7 @@ RECT ends WM_CREATE EQU 1 WM_DESTROY EQU 2 WM_PAINT EQU 15 - WM_TIMER EQU 275 + WM_TIMER EQU 275 WM_KEYDOWN EQU 256 WM_ERASEBACKGROUND EQU 014h VK_W EQU 110001h @@ -73,18 +78,18 @@ RECT ends VK_S EQU 1F0001h VK_D EQU 200001h SND_ASYNC EQU 1 - ; Tetromino shape definitions - 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 + ; width height color data + TETRO_0 db 2, 3, 1, "x x xx" ; L + TETRO_1 db 2, 3, 2, " x xxx" ; J + TETRO_2 db 2, 2, 3, "xxxx" ; Block + TETRO_3 db 4, 1, 4, "xxxx" ; Line + TETRO_4 db 3, 2, 5, " xxxx " ; S: snake from BL to TR + TETRO_5 db 3, 2, 6, "xx xx" ; Z: from TR to BL + TETRO_6 db 3, 2, 7, " x xxx" ; T shapePoolStart: - TETRO_SHAPE_POOL dq TETRO_0, TETRO_1, TETRO_2, TETRO_3, TETRO_4, TETRO_5, TETRO_6 + TETRO_SHAPE_POOL dq TETRO_0, TETRO_1, TETRO_2, TETRO_3, TETRO_4, TETRO_5, TETRO_6, TETRO_3 ; Tetromino shape pool TETRO_SHAPE_POOL_SIZE EQU ($-shapePoolStart) / 8 colorPoolStart: @@ -110,6 +115,8 @@ RECT ends hdc dq ? rndSeed dq ? skipNextGL db ? + points dq ? + pointsBuf db 12 dup(?) .code ; -------------------------- @@ -140,10 +147,12 @@ main PROC ; mov rax, OFFSET TETRO_0 ;mov qword ptr [TETRO_SHAPE_POOL], rax + mov byte ptr [pointsBuf], '0' call InitPlayField call LoadRandomTetromino + call UpdatePointsString mov rcx, 0 mov rdx, 0 @@ -152,7 +161,7 @@ main PROC mov rdx, 0 call GetTetroState - + mov qword ptr [points], 0 mov byte ptr [playerPosX], 0 mov byte ptr [playerPosY], 0 @@ -310,6 +319,40 @@ RandomRange PROC ret RandomRange ENDP +; Unsigned integer to string +; rsi -> Target string address (must support at least 10 bytes) +; rax -> Integer value to be interpreted (32 bit) +IntToStr PROC + push rax ; Preserve + push r9 ; String index + push r10 ; Temporary register for digit character + push r11 ; Register for divison, holds the base + push rdx ; Holds the remainder + + mov r8, 0 + mov r9, 9 ; We start at the end of the string because little endian + mov r11, 10 ; The base we operate in +itos_loop: + cmp r9, -1 ; Check if we did the whole number (32 bit -> 8 bytes) + je itos_ret + + mov rdx, 0 + idiv r11 + + add rdx, '0' ; Convert to ASCII + mov byte ptr [rsi + r9], dl ; Move charater into the string + dec r9 ; Increase the string index + + jmp itos_loop +itos_ret: + pop rdx + pop r11 + pop r10 + pop r9 + pop rax + ret +IntToStr ENDP + LoadRandomTetromino PROC push rcx push rdx @@ -1048,32 +1091,44 @@ _loop_break: MoveAllRowsDown 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 +; 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 +UpdatePointsString PROC + push rsi + push rax + mov rax, qword ptr [points] + lea rsi, pointsBuf + call IntToStr + + pop rax + pop rsi ret -ClearRow ENDP +UpdatePointsString ENDP CheckRowClear PROC push rcx @@ -1090,12 +1145,22 @@ innerloop: test rax, rax jz loop_continue inc r8 - call ClearRow + ;call ClearRow call MoveAllRowsDown jmp innerloop loop_continue: - ; todo attrib points with combo in r8 + push rax + push rdx + mov rax, r8 + mul rax + mov r8, rax + pop rdx + pop rax + + add qword ptr [points], r8 + call UpdatePointsString + dec rcx jmp _loop @@ -1128,7 +1193,23 @@ GamePaint PROC call RenderPlayer + sub rsp, 16 + mov rcx, [hdc] + mov rdx, 10 + mov r8, 10 + lea r9, OFFSET strPoints + mov dword ptr [rsp + 32], 6 + call TextOutA + mov rcx, [hdc] + mov rdx, 60 + mov r8, 10 + lea r9, OFFSET pointsBuf + add r9, 5 + mov dword ptr [rsp + 32], 5 + call TextOutA + + add rsp, 16 mov rcx, [hwndWindow] mov rdx, ps @@ -1319,14 +1400,44 @@ MovePlayerDown PROC mov byte ptr [playerPosY], 0 call LoadRandomTetromino + push r10 decollide_loop: + inc r10 + cmp r10, 2048 + jge decollide_gameOver call IsPlayerJammed test rax, rax jz decollide_break dec [playerPosX] jmp decollide_loop +decollide_gameOver: + push rcx + push rdx + push r8 + push r9 + + mov rcx, 0 + mov rdx, 1 + sub rsp, 32 + call KillTimer + add rsp, 32 + mov rcx, 0 + lea rdx, strGameOver + lea r8, strGameOverCaption + mov r9, 0 + sub rsp, 32 + ;scall MessageBoxA + add rsp, 32 + mov rcx, 0 + call ExitProcess + pop r9 + pop r8 + pop rdx + pop rcx + decollide_break: + pop r10 cleanup: ret MovePlayerDown ENDP diff --git a/Bugtris/main.asm b/Bugtris/main.asm deleted file mode 100644 index e69de29..0000000