Upload files to "programs/games/solitare"
Add KOSfuncs.inc
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
; Solitaire V1.5 - Window Edition
|
; Solitare V1.5.1 - KOSfuncs Edition
|
||||||
; Platform: MenuetOS / KolibriOS
|
; Platform: KolibriOS / MenuetOS
|
||||||
; Author: Max
|
; Author: Max
|
||||||
|
|
||||||
format binary as 'run'
|
format binary as 'run'
|
||||||
@@ -8,19 +8,9 @@ org 0x0
|
|||||||
|
|
||||||
; --- SYSTEM INCLUDES ---
|
; --- SYSTEM INCLUDES ---
|
||||||
include 'macros.inc'
|
include 'macros.inc'
|
||||||
|
include 'KOSfuncs.inc'
|
||||||
|
|
||||||
; --- CONSTANTS ---
|
; --- GAME CONSTANTS ---
|
||||||
SYS_REDRAW equ 12
|
|
||||||
SYS_KEY equ 2
|
|
||||||
SYS_BUTTON equ 17
|
|
||||||
SYS_MOUSE_POS equ 37
|
|
||||||
SYS_DRAW_WINDOW equ 0
|
|
||||||
SYS_EXIT equ -1
|
|
||||||
SYS_BLIT equ 7
|
|
||||||
SYS_RANDOM equ 3
|
|
||||||
SYS_DELAY equ 5
|
|
||||||
SYS_GET_SKIN_H equ 48
|
|
||||||
|
|
||||||
CARD_W equ 50
|
CARD_W equ 50
|
||||||
CARD_H equ 70
|
CARD_H equ 70
|
||||||
STACK_OFFSET equ 20
|
STACK_OFFSET equ 20
|
||||||
@@ -51,7 +41,7 @@ STOCK_X equ 20
|
|||||||
WASTE_X equ 80
|
WASTE_X equ 80
|
||||||
FOUNDATION_X equ 350
|
FOUNDATION_X equ 350
|
||||||
FOUND_Y equ 20
|
FOUND_Y equ 20
|
||||||
SCORE_Y equ 535
|
SCORE_Y equ 535
|
||||||
|
|
||||||
; --- HEADER ---
|
; --- HEADER ---
|
||||||
db 'MENUET01'
|
db 'MENUET01'
|
||||||
@@ -64,7 +54,9 @@ dd 0, 0
|
|||||||
|
|
||||||
start:
|
start:
|
||||||
mov esp, stacktop
|
mov esp, stacktop
|
||||||
mcall SYS_GET_SKIN_H, 4
|
|
||||||
|
; Get skin height using KOSfuncs constant
|
||||||
|
mcall SF_STYLE_SETTINGS, SSF_GET_SKIN_HEIGHT
|
||||||
mov [skin_h], eax
|
mov [skin_h], eax
|
||||||
|
|
||||||
call init_deck
|
call init_deck
|
||||||
@@ -74,90 +66,90 @@ start:
|
|||||||
mov byte [game_won], 0
|
mov byte [game_won], 0
|
||||||
|
|
||||||
event_loop:
|
event_loop:
|
||||||
mcall 11
|
mcall SF_CHECK_EVENT
|
||||||
cmp eax, 1
|
cmp eax, 1 ; Redraw
|
||||||
je on_redraw
|
je on_redraw
|
||||||
cmp eax, 2
|
cmp eax, 2 ; Key
|
||||||
je on_key
|
je on_key
|
||||||
cmp eax, 3
|
cmp eax, 3 ; Button
|
||||||
je on_button
|
je on_button
|
||||||
|
|
||||||
call handle_mouse
|
call handle_mouse
|
||||||
|
|
||||||
; Redraw only if there's an active card movement or forced update
|
; Logic for active card movement or forced update
|
||||||
cmp dword [active_card_count], 0
|
cmp dword [active_card_count], 0
|
||||||
ja update_screen_only
|
ja update_screen_only
|
||||||
cmp byte [force_redraw], 1
|
cmp byte [force_redraw], 1
|
||||||
je update_screen_only
|
je update_screen_only
|
||||||
|
|
||||||
mcall SYS_DELAY, 1
|
mcall SF_SLEEP, 1
|
||||||
jmp event_loop
|
jmp event_loop
|
||||||
|
|
||||||
on_key:
|
on_key:
|
||||||
mcall SYS_KEY
|
mcall SF_GET_KEY
|
||||||
jmp event_loop
|
jmp event_loop
|
||||||
|
|
||||||
on_button:
|
on_button:
|
||||||
mcall SYS_BUTTON
|
mcall SF_GET_BUTTON
|
||||||
shr eax, 8
|
shr eax, 8
|
||||||
cmp eax, 1 ; Close button (ID 1)
|
cmp eax, 1 ; Close button ID
|
||||||
jne event_loop
|
jne event_loop
|
||||||
mcall SYS_EXIT
|
mcall SF_TERMINATE_PROCESS
|
||||||
|
|
||||||
on_redraw:
|
on_redraw:
|
||||||
mcall SYS_REDRAW, 1
|
mcall SF_REDRAW, SSF_BEGIN_DRAW
|
||||||
|
|
||||||
; EBX: [X start : Window Width]
|
; EBX: Window position and width
|
||||||
mov ebx, 100 shl 16 + (WIN_W + 9)
|
mov ebx, 100 shl 16 + (WIN_W + 9)
|
||||||
|
|
||||||
; ECX: [Y start : Window Height + skin + border]
|
; ECX: Window position and height
|
||||||
mov eax, [skin_h]
|
mov eax, [skin_h]
|
||||||
add eax, WIN_H + 5
|
add eax, WIN_H + 5
|
||||||
mov ecx, 100 shl 16
|
mov ecx, 100 shl 16
|
||||||
mov cx, ax
|
mov cx, ax
|
||||||
|
|
||||||
; Draw window with skin flag (0x14)
|
; Draw window with skin flag
|
||||||
mcall SYS_DRAW_WINDOW, , , 0x14000000 or COL_TABLE, , title
|
mcall SF_CREATE_WINDOW, , , 0x14000000 or COL_TABLE, , title
|
||||||
|
|
||||||
mcall SYS_REDRAW, 2
|
mcall SF_REDRAW, SSF_END_DRAW
|
||||||
mov byte [force_redraw], 1
|
mov byte [force_redraw], 1
|
||||||
jmp update_screen_only
|
jmp update_screen_only
|
||||||
|
|
||||||
update_screen_only:
|
update_screen_only:
|
||||||
mov byte [force_redraw], 0
|
mov byte [force_redraw], 0
|
||||||
call prepare_buffer
|
call prepare_buffer
|
||||||
|
|
||||||
; EDX: [x_dest:16|y_dest:16] - Offset by border and skin height
|
; EDX: coordinates for blit
|
||||||
mov edx, 4 shl 16
|
mov edx, 4 shl 16
|
||||||
add dx, word [skin_h]
|
add dx, word [skin_h]
|
||||||
|
|
||||||
mcall SYS_BLIT, screen_buffer, WIN_W shl 16 + WIN_H, edx
|
mcall SF_PUT_IMAGE, screen_buffer, WIN_W shl 16 + WIN_H, edx
|
||||||
jmp event_loop
|
jmp event_loop
|
||||||
|
|
||||||
; --- MOUSE HANDLING ---
|
; --- MOUSE HANDLING ---
|
||||||
|
|
||||||
handle_mouse:
|
handle_mouse:
|
||||||
pushad
|
pushad
|
||||||
mcall SYS_MOUSE_POS, 1
|
mcall SF_MOUSE_GET, SSF_WINDOW_POSITION
|
||||||
mov ebp, eax
|
mov ebp, eax
|
||||||
shr ebp, 16
|
shr ebp, 16
|
||||||
sub ebp, 5 ; Mouse X correction relative to frame
|
sub ebp, 5 ; X correction
|
||||||
|
|
||||||
and eax, 0xFFFF
|
|
||||||
sub eax, [skin_h]
|
|
||||||
mov edi, eax ; EDI = Mouse Y inside workspace
|
|
||||||
|
|
||||||
mcall SYS_MOUSE_POS, 2
|
and eax, 0xFFFF
|
||||||
test eax, 1 ; Check left button
|
sub eax, [skin_h]
|
||||||
|
mov edi, eax ; EDI = Mouse Y relative to workspace
|
||||||
|
|
||||||
|
mcall SF_MOUSE_GET, SSF_BUTTON
|
||||||
|
test eax, 1 ; Check Left Button
|
||||||
jnz .dragging_state
|
jnz .dragging_state
|
||||||
|
|
||||||
cmp dword [mouse_lock], 1
|
cmp dword [mouse_lock], 1
|
||||||
jne .exit
|
jne .exit
|
||||||
|
|
||||||
mov dword [mouse_lock], 0
|
mov dword [mouse_lock], 0
|
||||||
cmp dword [active_card_count], 0
|
cmp dword [active_card_count], 0
|
||||||
je .exit
|
je .exit
|
||||||
|
|
||||||
call check_stack_move
|
call check_stack_move
|
||||||
mov dword [active_card_count], 0
|
mov dword [active_card_count], 0
|
||||||
mov byte [force_redraw], 1
|
mov byte [force_redraw], 1
|
||||||
@@ -167,8 +159,8 @@ handle_mouse:
|
|||||||
.dragging_state:
|
.dragging_state:
|
||||||
cmp dword [mouse_lock], 1
|
cmp dword [mouse_lock], 1
|
||||||
je .no_deal_click
|
je .no_deal_click
|
||||||
|
|
||||||
; Check if clicking on the stock pile
|
; Stock pile click detection
|
||||||
cmp ebp, STOCK_X
|
cmp ebp, STOCK_X
|
||||||
jb .find_card
|
jb .find_card
|
||||||
cmp ebp, STOCK_X+CARD_W
|
cmp ebp, STOCK_X+CARD_W
|
||||||
@@ -177,7 +169,7 @@ handle_mouse:
|
|||||||
jb .find_card
|
jb .find_card
|
||||||
cmp edi, FOUND_Y+CARD_H
|
cmp edi, FOUND_Y+CARD_H
|
||||||
jae .find_card
|
jae .find_card
|
||||||
|
|
||||||
mov dword [mouse_lock], 1
|
mov dword [mouse_lock], 1
|
||||||
call deal_from_stock
|
call deal_from_stock
|
||||||
mov byte [force_redraw], 1
|
mov byte [force_redraw], 1
|
||||||
@@ -185,14 +177,13 @@ handle_mouse:
|
|||||||
ret
|
ret
|
||||||
|
|
||||||
.find_card:
|
.find_card:
|
||||||
mov ebx, 51 ; Check cards from top to bottom
|
mov ebx, 51
|
||||||
.f_loop:
|
.f_loop:
|
||||||
imul edx, ebx, CARD_STRUCT_SIZE
|
imul edx, ebx, CARD_STRUCT_SIZE
|
||||||
add edx, deck_data
|
add edx, deck_data
|
||||||
movsx esi, word [edx+CARD_X]
|
movsx esi, word [edx+CARD_X]
|
||||||
movsx ecx, word [edx+CARD_Y]
|
movsx ecx, word [edx+CARD_Y]
|
||||||
|
|
||||||
; Bounds checking for the card
|
|
||||||
cmp ebp, esi
|
cmp ebp, esi
|
||||||
jb .next_s
|
jb .next_s
|
||||||
add esi, CARD_W
|
add esi, CARD_W
|
||||||
@@ -203,23 +194,21 @@ handle_mouse:
|
|||||||
add ecx, CARD_H
|
add ecx, CARD_H
|
||||||
cmp edi, ecx
|
cmp edi, ecx
|
||||||
jae .next_s
|
jae .next_s
|
||||||
|
|
||||||
; Only pick up face-up cards
|
|
||||||
cmp byte [edx+CARD_STATE], 1
|
cmp byte [edx+CARD_STATE], 1
|
||||||
jne .next_s
|
jne .next_s
|
||||||
|
|
||||||
mov dword [mouse_lock], 1
|
mov dword [mouse_lock], 1
|
||||||
mov [active_stack], ebx
|
mov [active_stack], ebx
|
||||||
mov dword [active_card_count], 1
|
mov dword [active_card_count], 1
|
||||||
|
|
||||||
; Calculate mouse offset within card
|
|
||||||
mov ax, word [edx+CARD_X]
|
mov ax, word [edx+CARD_X]
|
||||||
sub ax, bp
|
sub ax, bp
|
||||||
mov [mouse_off_x], ax
|
mov [mouse_off_x], ax
|
||||||
mov ax, word [edx+CARD_Y]
|
mov ax, word [edx+CARD_Y]
|
||||||
sub ax, di
|
sub ax, di
|
||||||
mov [mouse_off_y], ax
|
mov [mouse_off_y], ax
|
||||||
|
|
||||||
mov eax, ebx
|
mov eax, ebx
|
||||||
call build_active_stack
|
call build_active_stack
|
||||||
popad
|
popad
|
||||||
@@ -241,21 +230,20 @@ handle_mouse:
|
|||||||
mov eax, [active_stack + ecx*4]
|
mov eax, [active_stack + ecx*4]
|
||||||
imul eax, CARD_STRUCT_SIZE
|
imul eax, CARD_STRUCT_SIZE
|
||||||
add eax, deck_data
|
add eax, deck_data
|
||||||
|
|
||||||
; Move active card stack with the mouse
|
|
||||||
mov dx, [mouse_off_x]
|
mov dx, [mouse_off_x]
|
||||||
add dx, bp
|
add dx, bp
|
||||||
mov [eax+CARD_X], dx
|
mov [eax+CARD_X], dx
|
||||||
mov dx, [mouse_off_y]
|
mov dx, [mouse_off_y]
|
||||||
add dx, di
|
add dx, di
|
||||||
|
|
||||||
push eax
|
push eax
|
||||||
mov eax, ecx
|
mov eax, ecx
|
||||||
imul eax, STACK_OFFSET
|
imul eax, STACK_OFFSET
|
||||||
add dx, ax
|
add dx, ax
|
||||||
pop eax
|
pop eax
|
||||||
mov [eax+CARD_Y], dx
|
mov [eax+CARD_Y], dx
|
||||||
|
|
||||||
inc ecx
|
inc ecx
|
||||||
jmp .d_lp
|
jmp .d_lp
|
||||||
.exit_drag:
|
.exit_drag:
|
||||||
@@ -268,7 +256,6 @@ handle_mouse:
|
|||||||
; --- RENDERING ---
|
; --- RENDERING ---
|
||||||
|
|
||||||
prepare_buffer:
|
prepare_buffer:
|
||||||
; Clear buffer with table color
|
|
||||||
mov edi, screen_buffer
|
mov edi, screen_buffer
|
||||||
mov ecx, WIN_W * WIN_H
|
mov ecx, WIN_W * WIN_H
|
||||||
mov eax, COL_TABLE
|
mov eax, COL_TABLE
|
||||||
@@ -286,7 +273,6 @@ prepare_buffer:
|
|||||||
call draw_slots
|
call draw_slots
|
||||||
call render_score_ui
|
call render_score_ui
|
||||||
|
|
||||||
; Draw static cards
|
|
||||||
xor ecx, ecx
|
xor ecx, ecx
|
||||||
.draw_loop:
|
.draw_loop:
|
||||||
call is_card_active
|
call is_card_active
|
||||||
@@ -301,7 +287,6 @@ prepare_buffer:
|
|||||||
cmp ecx, 52
|
cmp ecx, 52
|
||||||
jl .draw_loop
|
jl .draw_loop
|
||||||
|
|
||||||
; Draw active (dragged) cards on top
|
|
||||||
xor ecx, ecx
|
xor ecx, ecx
|
||||||
.draw_active:
|
.draw_active:
|
||||||
cmp ecx, [active_card_count]
|
cmp ecx, [active_card_count]
|
||||||
@@ -322,25 +307,18 @@ draw_card_to_buffer:
|
|||||||
pushad
|
pushad
|
||||||
movsx ebx, word [esi+CARD_X]
|
movsx ebx, word [esi+CARD_X]
|
||||||
movsx ecx, word [esi+CARD_Y]
|
movsx ecx, word [esi+CARD_Y]
|
||||||
|
|
||||||
; Shadow/Outline
|
|
||||||
mov edx, COL_BLACK
|
mov edx, COL_BLACK
|
||||||
mov edi, CARD_W
|
mov edi, CARD_W
|
||||||
mov ebp, CARD_H
|
mov ebp, CARD_H
|
||||||
call fill_rect_buf
|
call fill_rect_buf
|
||||||
|
|
||||||
; Face
|
|
||||||
inc ebx
|
inc ebx
|
||||||
inc ecx
|
inc ecx
|
||||||
mov edx, COL_WHITE
|
mov edx, COL_WHITE
|
||||||
mov edi, CARD_W-2
|
mov edi, CARD_W-2
|
||||||
mov ebp, CARD_H-2
|
mov ebp, CARD_H-2
|
||||||
call fill_rect_buf
|
call fill_rect_buf
|
||||||
|
|
||||||
cmp byte [esi+CARD_STATE], 1
|
cmp byte [esi+CARD_STATE], 1
|
||||||
je .face_up
|
je .face_up
|
||||||
|
|
||||||
; Back of the card
|
|
||||||
add ebx, 4
|
add ebx, 4
|
||||||
add ecx, 4
|
add ecx, 4
|
||||||
mov edx, COL_REVERSE
|
mov edx, COL_REVERSE
|
||||||
@@ -349,15 +327,12 @@ draw_card_to_buffer:
|
|||||||
call fill_rect_buf
|
call fill_rect_buf
|
||||||
popad
|
popad
|
||||||
ret
|
ret
|
||||||
|
|
||||||
.face_up:
|
.face_up:
|
||||||
; Suit color determination
|
|
||||||
mov edx, COL_RED
|
mov edx, COL_RED
|
||||||
cmp byte [esi+CARD_SUIT], 2
|
cmp byte [esi+CARD_SUIT], 2
|
||||||
jb .is_red
|
jb .is_red
|
||||||
mov edx, COL_BLACK
|
mov edx, COL_BLACK
|
||||||
.is_red:
|
.is_red:
|
||||||
; Top left symbol
|
|
||||||
push edx
|
push edx
|
||||||
push esi
|
push esi
|
||||||
movzx eax, byte [esi+CARD_VALUE]
|
movzx eax, byte [esi+CARD_VALUE]
|
||||||
@@ -365,18 +340,16 @@ draw_card_to_buffer:
|
|||||||
mov esi, eax
|
mov esi, eax
|
||||||
add ebx, 3
|
add ebx, 3
|
||||||
add ecx, 3
|
add ecx, 3
|
||||||
call draw_char_to_buf
|
call draw_char_to_buf
|
||||||
pop esi
|
pop esi
|
||||||
push esi
|
push esi
|
||||||
movzx eax, byte [esi+CARD_SUIT]
|
movzx eax, byte [esi+CARD_SUIT]
|
||||||
add eax, 13
|
add eax, 13
|
||||||
add ebx, 6
|
add ebx, 6
|
||||||
mov esi, eax
|
mov esi, eax
|
||||||
call draw_char_to_buf
|
call draw_char_to_buf
|
||||||
pop esi
|
pop esi
|
||||||
pop edx
|
pop edx
|
||||||
|
|
||||||
; Bottom right symbol (inverted position)
|
|
||||||
push edx
|
push edx
|
||||||
push esi
|
push esi
|
||||||
movsx ebx, word [esi+CARD_X]
|
movsx ebx, word [esi+CARD_X]
|
||||||
@@ -546,32 +519,30 @@ draw_large_char_to_buf:
|
|||||||
|
|
||||||
render_score_ui:
|
render_score_ui:
|
||||||
mov edx, COL_BLACK
|
mov edx, COL_BLACK
|
||||||
mov ebx, 530
|
mov ebx, 530
|
||||||
mov ecx, SCORE_Y
|
mov ecx, SCORE_Y
|
||||||
xor esi, esi ; Print "SCORE"
|
xor esi, esi
|
||||||
call draw_large_char_to_buf
|
call draw_large_char_to_buf
|
||||||
add ebx, 10
|
add ebx, 10
|
||||||
mov esi, 1
|
mov esi, 1
|
||||||
call draw_large_char_to_buf
|
call draw_large_char_to_buf
|
||||||
add ebx, 10
|
add ebx, 10
|
||||||
mov esi, 2
|
mov esi, 2
|
||||||
call draw_large_char_to_buf
|
call draw_large_char_to_buf
|
||||||
add ebx, 10
|
add ebx, 10
|
||||||
mov esi, 3
|
mov esi, 3
|
||||||
call draw_large_char_to_buf
|
call draw_large_char_to_buf
|
||||||
add ebx, 10
|
add ebx, 10
|
||||||
mov esi, 4
|
mov esi, 4
|
||||||
call draw_large_char_to_buf
|
call draw_large_char_to_buf
|
||||||
add ebx, 20
|
add ebx, 20
|
||||||
|
|
||||||
; Handle score value display
|
|
||||||
mov eax, [score]
|
mov eax, [score]
|
||||||
test eax, eax
|
test eax, eax
|
||||||
jns .pos
|
jns .pos
|
||||||
neg eax
|
neg eax
|
||||||
push eax
|
push eax
|
||||||
mov ecx, SCORE_Y
|
mov ecx, SCORE_Y
|
||||||
mov esi, 5 ; Minus sign
|
mov esi, 5
|
||||||
call draw_large_char_to_buf
|
call draw_large_char_to_buf
|
||||||
add ebx, 10
|
add ebx, 10
|
||||||
pop eax
|
pop eax
|
||||||
@@ -587,7 +558,7 @@ render_score_ui:
|
|||||||
jnz .dec_loop
|
jnz .dec_loop
|
||||||
.print_dec:
|
.print_dec:
|
||||||
pop edx
|
pop edx
|
||||||
add edx, 6 ; Map digit to font index
|
add edx, 6
|
||||||
push ecx
|
push ecx
|
||||||
mov ecx, SCORE_Y
|
mov ecx, SCORE_Y
|
||||||
mov esi, edx
|
mov esi, edx
|
||||||
@@ -600,7 +571,6 @@ render_score_ui:
|
|||||||
|
|
||||||
draw_slots:
|
draw_slots:
|
||||||
pushad
|
pushad
|
||||||
; Draw foundation slots
|
|
||||||
mov ebx, FOUNDATION_X
|
mov ebx, FOUNDATION_X
|
||||||
mov ecx, FOUND_Y
|
mov ecx, FOUND_Y
|
||||||
mov dword [temp_counter2], 4
|
mov dword [temp_counter2], 4
|
||||||
@@ -612,8 +582,6 @@ draw_slots:
|
|||||||
add ebx, 60
|
add ebx, 60
|
||||||
dec dword [temp_counter2]
|
dec dword [temp_counter2]
|
||||||
jnz .f_loop
|
jnz .f_loop
|
||||||
|
|
||||||
; Draw tableau slots
|
|
||||||
mov ebx, 40
|
mov ebx, 40
|
||||||
mov ecx, 110
|
mov ecx, 110
|
||||||
mov dword [temp_counter2], 7
|
mov dword [temp_counter2], 7
|
||||||
@@ -700,8 +668,6 @@ check_stack_move:
|
|||||||
mov esi, [active_stack]
|
mov esi, [active_stack]
|
||||||
imul esi, CARD_STRUCT_SIZE
|
imul esi, CARD_STRUCT_SIZE
|
||||||
add esi, deck_data
|
add esi, deck_data
|
||||||
|
|
||||||
; Logic for single card foundation drop
|
|
||||||
cmp dword [active_card_count], 1
|
cmp dword [active_card_count], 1
|
||||||
jne .tableau_check
|
jne .tableau_check
|
||||||
mov ebx, FOUNDATION_X
|
mov ebx, FOUNDATION_X
|
||||||
@@ -724,7 +690,6 @@ check_stack_move:
|
|||||||
inc ecx
|
inc ecx
|
||||||
cmp ecx, 4
|
cmp ecx, 4
|
||||||
jl .f_lp
|
jl .f_lp
|
||||||
|
|
||||||
.tableau_check:
|
.tableau_check:
|
||||||
mov ebx, 40
|
mov ebx, 40
|
||||||
.col_lp:
|
.col_lp:
|
||||||
@@ -749,11 +714,8 @@ check_stack_move:
|
|||||||
inc ecx
|
inc ecx
|
||||||
cmp ecx, 52
|
cmp ecx, 52
|
||||||
jl .find_l
|
jl .find_l
|
||||||
|
|
||||||
cmp dword [temp_val], -1
|
cmp dword [temp_val], -1
|
||||||
je .empty_col
|
je .empty_col
|
||||||
|
|
||||||
; Check drop on another card
|
|
||||||
mov ecx, [temp_val]
|
mov ecx, [temp_val]
|
||||||
imul edi, ecx, CARD_STRUCT_SIZE
|
imul edi, ecx, CARD_STRUCT_SIZE
|
||||||
add edi, deck_data
|
add edi, deck_data
|
||||||
@@ -769,8 +731,6 @@ check_stack_move:
|
|||||||
add eax, 30
|
add eax, 30
|
||||||
cmp eax, 60
|
cmp eax, 60
|
||||||
ja .nx_col
|
ja .nx_col
|
||||||
|
|
||||||
; Rules check: Opposite color and sequence (Value + 1)
|
|
||||||
mov al, [esi+CARD_SUIT]
|
mov al, [esi+CARD_SUIT]
|
||||||
mov dl, [edi+CARD_SUIT]
|
mov dl, [edi+CARD_SUIT]
|
||||||
shr al, 1
|
shr al, 1
|
||||||
@@ -785,9 +745,7 @@ check_stack_move:
|
|||||||
mov dx, word [edi+CARD_Y]
|
mov dx, word [edi+CARD_Y]
|
||||||
add dx, STACK_OFFSET
|
add dx, STACK_OFFSET
|
||||||
jmp .apply_move
|
jmp .apply_move
|
||||||
|
|
||||||
.empty_col:
|
.empty_col:
|
||||||
; Check drop on empty column (only Kings)
|
|
||||||
movsx eax, word [esi+CARD_X]
|
movsx eax, word [esi+CARD_X]
|
||||||
sub eax, ebx
|
sub eax, ebx
|
||||||
add eax, 25
|
add eax, 25
|
||||||
@@ -802,13 +760,10 @@ check_stack_move:
|
|||||||
jne .nx_col
|
jne .nx_col
|
||||||
mov dx, 110
|
mov dx, 110
|
||||||
jmp .apply_move
|
jmp .apply_move
|
||||||
|
|
||||||
.nx_col:
|
.nx_col:
|
||||||
add ebx, 100
|
add ebx, 100
|
||||||
cmp ebx, 740
|
cmp ebx, 740
|
||||||
jl .col_lp
|
jl .col_lp
|
||||||
|
|
||||||
; No valid move found, snap back to original position
|
|
||||||
xor ecx, ecx
|
xor ecx, ecx
|
||||||
.back:
|
.back:
|
||||||
cmp ecx, [active_card_count]
|
cmp ecx, [active_card_count]
|
||||||
@@ -825,12 +780,11 @@ check_stack_move:
|
|||||||
.out:
|
.out:
|
||||||
popad
|
popad
|
||||||
ret
|
ret
|
||||||
|
|
||||||
.found_match:
|
.found_match:
|
||||||
add dword [score], 10
|
add dword [score], 10
|
||||||
mov word [esi+CARD_X], bx
|
mov word [esi+CARD_X], bx
|
||||||
mov word [esi+CARD_Y], FOUND_Y
|
mov word [esi+CARD_Y], FOUND_Y
|
||||||
mov byte [esi+CARD_LOC], 8 ; Set location to foundation
|
mov byte [esi+CARD_LOC], 8
|
||||||
pushad
|
pushad
|
||||||
mov eax, [active_stack]
|
mov eax, [active_stack]
|
||||||
mov [temp_active], eax
|
mov [temp_active], eax
|
||||||
@@ -840,7 +794,6 @@ check_stack_move:
|
|||||||
call check_win
|
call check_win
|
||||||
popad
|
popad
|
||||||
ret
|
ret
|
||||||
|
|
||||||
.apply_move:
|
.apply_move:
|
||||||
xor ecx, ecx
|
xor ecx, ecx
|
||||||
push eax
|
push eax
|
||||||
@@ -927,14 +880,11 @@ check_foundation_logic:
|
|||||||
inc ebp
|
inc ebp
|
||||||
cmp ebp, 52
|
cmp ebp, 52
|
||||||
jl .find_top
|
jl .find_top
|
||||||
|
|
||||||
mov al, [esi+CARD_VALUE]
|
mov al, [esi+CARD_VALUE]
|
||||||
mov dl, [esi+CARD_SUIT]
|
mov dl, [esi+CARD_SUIT]
|
||||||
cmp dword [temp_counter], -1
|
cmp dword [temp_counter], -1
|
||||||
jne .not_empty
|
jne .not_empty
|
||||||
|
cmp al, 1
|
||||||
; Empty foundation slot only accepts Aces (Value 1)
|
|
||||||
cmp al, 1
|
|
||||||
je .valid
|
je .valid
|
||||||
jmp .invalid
|
jmp .invalid
|
||||||
.not_empty:
|
.not_empty:
|
||||||
@@ -1003,7 +953,7 @@ auto_reveal_all:
|
|||||||
jl .find_lowest
|
jl .find_lowest
|
||||||
cmp dword [temp_val], -1
|
cmp dword [temp_val], -1
|
||||||
je .next_col
|
je .next_col
|
||||||
mov byte [esi+CARD_STATE], 1 ; Flip the bottom card of the stack face up
|
mov byte [esi+CARD_STATE], 1
|
||||||
.next_col:
|
.next_col:
|
||||||
add ebx, 100
|
add ebx, 100
|
||||||
cmp ebx, 740
|
cmp ebx, 740
|
||||||
@@ -1012,7 +962,6 @@ auto_reveal_all:
|
|||||||
ret
|
ret
|
||||||
|
|
||||||
move_single_to_top:
|
move_single_to_top:
|
||||||
; Moves a card to the end of the deck_data array so it's drawn last (on top)
|
|
||||||
mov eax, [temp_active]
|
mov eax, [temp_active]
|
||||||
cmp eax, 51
|
cmp eax, 51
|
||||||
je .done
|
je .done
|
||||||
@@ -1055,7 +1004,7 @@ deal_from_stock:
|
|||||||
ret
|
ret
|
||||||
.o:
|
.o:
|
||||||
mov byte [esi+CARD_STATE], 1
|
mov byte [esi+CARD_STATE], 1
|
||||||
mov byte [esi+CARD_LOC], 9 ; Move to waste
|
mov byte [esi+CARD_LOC], 9
|
||||||
mov word [esi+CARD_X], WASTE_X
|
mov word [esi+CARD_X], WASTE_X
|
||||||
mov word [esi+CARD_Y], FOUND_Y
|
mov word [esi+CARD_Y], FOUND_Y
|
||||||
mov [temp_active], ecx
|
mov [temp_active], ecx
|
||||||
@@ -1100,7 +1049,7 @@ init_deck:
|
|||||||
shuffle_deck:
|
shuffle_deck:
|
||||||
mov dword [temp_counter2], 51
|
mov dword [temp_counter2], 51
|
||||||
.sh:
|
.sh:
|
||||||
mcall SYS_RANDOM
|
mcall SF_GET_SYS_TIME
|
||||||
and eax, 0xFFFF
|
and eax, 0xFFFF
|
||||||
xor edx, edx
|
xor edx, edx
|
||||||
mov ebx, [temp_counter2]
|
mov ebx, [temp_counter2]
|
||||||
@@ -1167,7 +1116,7 @@ layout_tableau:
|
|||||||
.fin: ret
|
.fin: ret
|
||||||
|
|
||||||
; --- DATA & FONTS ---
|
; --- DATA & FONTS ---
|
||||||
title db 'Solitaire V1.5', 0
|
title db 'Solitare V1.5.1', 0
|
||||||
score dd 0
|
score dd 0
|
||||||
game_won db 0
|
game_won db 0
|
||||||
mouse_lock dd 0
|
mouse_lock dd 0
|
||||||
@@ -1184,7 +1133,6 @@ active_stack rd 13
|
|||||||
skin_h dd 0
|
skin_h dd 0
|
||||||
|
|
||||||
font_8x12:
|
font_8x12:
|
||||||
; Definitions for S, C, O, R, E, -, and digits 0-9
|
|
||||||
db 01111100b,10000010b,10000000b,10000000b,01111100b,00000010b,00000010b,10000010b,01111100b,00000000b,00000000b,00000000b ; S
|
db 01111100b,10000010b,10000000b,10000000b,01111100b,00000010b,00000010b,10000010b,01111100b,00000000b,00000000b,00000000b ; S
|
||||||
db 01111100b,10000010b,10000000b,10000000b,10000000b,10000000b,10000000b,10000010b,01111100b,00000000b,00000000b,00000000b ; C
|
db 01111100b,10000010b,10000000b,10000000b,10000000b,10000000b,10000000b,10000010b,01111100b,00000000b,00000000b,00000000b ; C
|
||||||
db 01111100b,10000010b,10000010b,10000010b,10000010b,10000010b,10000010b,10000010b,01111100b,00000000b,00000000b,00000000b ; O
|
db 01111100b,10000010b,10000010b,10000010b,10000010b,10000010b,10000010b,10000010b,01111100b,00000000b,00000000b,00000000b ; O
|
||||||
@@ -1192,10 +1140,10 @@ db 11111100b,10000010b,10000010b,10000010b,11111100b,10010000b,10001000b,1000010
|
|||||||
db 11111110b,10000000b,10000000b,10000000b,11111100b,10000000b,10000000b,10000000b,11111110b,00000000b,00000000b,00000000b ; E
|
db 11111110b,10000000b,10000000b,10000000b,11111100b,10000000b,10000000b,10000000b,11111110b,00000000b,00000000b,00000000b ; E
|
||||||
db 00000000b,00000000b,00000000b,00000000b,11111111b,00000000b,00000000b,00000000b,00000000b,00000000b,00000000b,00000000b ; -
|
db 00000000b,00000000b,00000000b,00000000b,11111111b,00000000b,00000000b,00000000b,00000000b,00000000b,00000000b,00000000b ; -
|
||||||
db 00111100b,01000010b,10000001b,10000001b,10000001b,10000001b,10000001b,01000010b,00111100b,00000000b,00000000b,00000000b ; 0
|
db 00111100b,01000010b,10000001b,10000001b,10000001b,10000001b,10000001b,01000010b,00111100b,00000000b,00000000b,00000000b ; 0
|
||||||
db 00011000b,00111000b,00001000b,00001000b,00001000b,00001000b,00001000b,00001000b,00111100b,00000000b,00000000b,00000000b ; 1
|
db 00011000b,00111000b,00001000b,00001000b,00001000b,00001000b,00001000b,00001000b,00111100b,00000000b,00000000b,00000000b ; 1
|
||||||
db 01111100b,10000010b,00000010b,00000010b,01111100b,10000000b,10000000b,10000000b,11111110b,00000000b,00000000b,00000000b ; 2
|
db 01111100b,10000010b,00000010b,00000010b,01111100b,10000000b,10000000b,10000000b,11111110b,00000000b,00000000b,00000000b ; 2
|
||||||
db 01111100b,10000010b,00000010b,00000010b,00111100b,00000010b,00000010b,10000010b,01111100b,00000000b,00000000b,00000000b ; 3
|
db 01111100b,10000010b,00000010b,00000010b,00111100b,00000010b,00000010b,10000010b,01111100b,00000000b,00000000b,00000000b ; 3
|
||||||
db 00001000b,00011000b,00101000b,01001000b,10001000b,11111111b,00001000b,00001000b,00001000b,00000000b,00000000b,00000000b ; 4
|
db 00001000b,00011000b,00101000b,01001000b,10001000b,11111111b,00001000b,00001000b,00001000b,00000000b,00000000b,00000000b ; 4
|
||||||
db 11111110b,10000000b,10000000b,11111100b,00000010b,00000010b,00000010b,10000010b,01111100b,00000000b,00000000b,00000000b ; 5
|
db 11111110b,10000000b,10000000b,11111100b,00000010b,00000010b,00000010b,10000010b,01111100b,00000000b,00000000b,00000000b ; 5
|
||||||
db 01111100b,10000010b,10000000b,11111100b,10000010b,10000010b,10000010b,10000010b,01111100b,00000000b,00000000b,00000000b ; 6
|
db 01111100b,10000010b,10000000b,11111100b,10000010b,10000010b,10000010b,10000010b,01111100b,00000000b,00000000b,00000000b ; 6
|
||||||
db 11111110b,00000010b,00000100b,00001000b,00010000b,00100000b,00100000b,00100000b,00100000b,00000000b,00000000b,00000000b ; 7
|
db 11111110b,00000010b,00000100b,00001000b,00010000b,00100000b,00100000b,00100000b,00100000b,00000000b,00000000b,00000000b ; 7
|
||||||
@@ -1203,7 +1151,6 @@ db 01111100b,10000010b,10000010b,10000010b,01111100b,10000010b,10000010b,1000001
|
|||||||
db 01111100b,10000010b,10000010b,10000010b,10000010b,01111110b,00000010b,10000010b,01111100b,00000000b,00000000b,00000000b ; 9
|
db 01111100b,10000010b,10000010b,10000010b,10000010b,01111110b,00000010b,10000010b,01111100b,00000000b,00000000b,00000000b ; 9
|
||||||
|
|
||||||
font_5x7:
|
font_5x7:
|
||||||
; Definitions for A, 2-10, J, Q, K, and Suits
|
|
||||||
db 01110000b,10001000b,10001000b,11111000b,10001000b,10001000b,10001000b ; A
|
db 01110000b,10001000b,10001000b,11111000b,10001000b,10001000b,10001000b ; A
|
||||||
db 11110000b,00001000b,00010000b,00100000b,01000000b,10000000b,11111000b ; 2
|
db 11110000b,00001000b,00010000b,00100000b,01000000b,10000000b,11111000b ; 2
|
||||||
db 11110000b,00001000b,00001000b,01110000b,00001000b,00001000b,11110000b ; 3
|
db 11110000b,00001000b,00001000b,01110000b,00001000b,00001000b,11110000b ; 3
|
||||||
|
|||||||
Reference in New Issue
Block a user