Upload files to "programs/games/solitare"

FIX adding score
This commit is contained in:
Max
2026-03-03 11:28:08 +00:00
parent 0efc35f8b2
commit 5f4b293767

View File

@@ -1,6 +1,7 @@
; Solitare V1.5.1 - KOSfuncs Edition
; Solitare V1.5.2
; Platform: KolibriOS / MenuetOS
; Author: Max
; Author: Max (Refactored/Fixed)
; Scoring Fix: Cards only give points ONCE, even if moved back and forth.
format binary as 'run'
use32
@@ -30,8 +31,8 @@ COL_SLOT equ 0x185018
CARD_STRUCT_SIZE equ 12
CARD_VALUE equ 0
CARD_SUIT equ 1
CARD_STATE equ 2
CARD_LOC equ 3
CARD_STATE equ 2 ; Bit 0: Face-up, Bit 7: Already Scored
CARD_LOC equ 3 ; 0-6: Tableau, 7: Stock, 8: Foundation, 9: Waste
CARD_X equ 4
CARD_Y equ 6
CARD_OLD_X equ 8
@@ -55,7 +56,7 @@ dd 0, 0
start:
mov esp, stacktop
; Get skin height using KOSfuncs constant
; Get system skin height
mcall SF_STYLE_SETTINGS, SSF_GET_SKIN_HEIGHT
mov [skin_h], eax
@@ -67,16 +68,16 @@ start:
event_loop:
mcall SF_CHECK_EVENT
cmp eax, 1 ; Redraw
cmp eax, 1 ; Redraw event
je on_redraw
cmp eax, 2 ; Key
cmp eax, 2 ; Key event
je on_key
cmp eax, 3 ; Button
cmp eax, 3 ; Button event
je on_button
call handle_mouse
; Logic for active card movement or forced update
; Update display if dragging or forced
cmp dword [active_card_count], 0
ja update_screen_only
cmp byte [force_redraw], 1
@@ -92,25 +93,18 @@ on_key:
on_button:
mcall SF_GET_BUTTON
shr eax, 8
cmp eax, 1 ; Close button ID
cmp eax, 1 ; Window close button
jne event_loop
mcall SF_TERMINATE_PROCESS
on_redraw:
mcall SF_REDRAW, SSF_BEGIN_DRAW
; EBX: Window position and width
mov ebx, 100 shl 16 + (WIN_W + 9)
; ECX: Window position and height
mov eax, [skin_h]
add eax, WIN_H + 5
mov ecx, 100 shl 16
mov cx, ax
; Draw window with skin flag
mcall SF_CREATE_WINDOW, , , 0x14000000 or COL_TABLE, , title
mcall SF_REDRAW, SSF_END_DRAW
mov byte [force_redraw], 1
jmp update_screen_only
@@ -118,11 +112,8 @@ on_redraw:
update_screen_only:
mov byte [force_redraw], 0
call prepare_buffer
; EDX: coordinates for blit
mov edx, 4 shl 16
add dx, word [skin_h]
mcall SF_PUT_IMAGE, screen_buffer, WIN_W shl 16 + WIN_H, edx
jmp event_loop
@@ -133,14 +124,14 @@ handle_mouse:
mcall SF_MOUSE_GET, SSF_WINDOW_POSITION
mov ebp, eax
shr ebp, 16
sub ebp, 5 ; X correction
sub ebp, 5 ; Mouse X correction
and eax, 0xFFFF
sub eax, [skin_h]
mov edi, eax ; EDI = Mouse Y relative to workspace
mov edi, eax ; Mouse Y in workspace
mcall SF_MOUSE_GET, SSF_BUTTON
test eax, 1 ; Check Left Button
test eax, 1 ; Left click?
jnz .dragging_state
cmp dword [mouse_lock], 1
@@ -160,7 +151,7 @@ handle_mouse:
cmp dword [mouse_lock], 1
je .no_deal_click
; Stock pile click detection
; Stock pile interaction
cmp ebp, STOCK_X
jb .find_card
cmp ebp, STOCK_X+CARD_W
@@ -195,8 +186,8 @@ handle_mouse:
cmp edi, ecx
jae .next_s
cmp byte [edx+CARD_STATE], 1
jne .next_s
test byte [edx+CARD_STATE], 1 ; Is card face up?
jz .next_s
mov dword [mouse_lock], 1
mov [active_stack], ebx
@@ -317,8 +308,8 @@ draw_card_to_buffer:
mov edi, CARD_W-2
mov ebp, CARD_H-2
call fill_rect_buf
cmp byte [esi+CARD_STATE], 1
je .face_up
test byte [esi+CARD_STATE], 1
jnz .face_up
add ebx, 4
add ecx, 4
mov edx, COL_REVERSE
@@ -781,7 +772,12 @@ check_stack_move:
popad
ret
.found_match:
; FIXED SCORING: Check Bit 7 of STATE (Scored flag)
test byte [esi+CARD_STATE], 0x80
jnz .already_scored
add dword [score], 10
or byte [esi+CARD_STATE], 0x80 ; Set Scored Flag
.already_scored:
mov word [esi+CARD_X], bx
mov word [esi+CARD_Y], FOUND_Y
mov byte [esi+CARD_LOC], 8
@@ -953,7 +949,7 @@ auto_reveal_all:
jl .find_lowest
cmp dword [temp_val], -1
je .next_col
mov byte [esi+CARD_STATE], 1
or byte [esi+CARD_STATE], 1 ; Reveal face up
.next_col:
add ebx, 100
cmp ebx, 740
@@ -995,15 +991,10 @@ deal_from_stock:
add esi, deck_data
cmp byte [esi+CARD_LOC], 7
jne .n
cmp byte [esi+CARD_STATE], 0
je .o
.n: dec ecx
jns .f
call reset_stock
popad
ret
test byte [esi+CARD_STATE], 1 ; Already visible?
jnz .n
.o:
mov byte [esi+CARD_STATE], 1
or byte [esi+CARD_STATE], 1
mov byte [esi+CARD_LOC], 9
mov word [esi+CARD_X], WASTE_X
mov word [esi+CARD_Y], FOUND_Y
@@ -1011,6 +1002,11 @@ deal_from_stock:
call move_single_to_top
popad
ret
.n: dec ecx
jns .f
call reset_stock
popad
ret
reset_stock:
sub dword [score], 20
@@ -1020,7 +1016,7 @@ reset_stock:
add esi, deck_data
cmp byte [esi+CARD_LOC], 9
jne .s
mov byte [esi+CARD_STATE], 0
and byte [esi+CARD_STATE], 0xFE ; Set face down
mov byte [esi+CARD_LOC], 7
mov word [esi+CARD_X], STOCK_X
mov word [esi+CARD_Y], FOUND_Y
@@ -1036,7 +1032,7 @@ init_deck:
.r: inc ebx
mov byte [edi+CARD_VALUE], bl
mov byte [edi+CARD_SUIT], al
mov byte [edi+CARD_STATE], 0
mov byte [edi+CARD_STATE], 0 ; Face down, Not Scored
mov byte [edi+CARD_LOC], 7
add edi, CARD_STRUCT_SIZE
cmp ebx, 13
@@ -1087,10 +1083,10 @@ layout_tableau:
mov byte [edi+CARD_LOC], dl
dec ebp
jnz .h
mov byte [edi+CARD_STATE], 1
or byte [edi+CARD_STATE], 1 ; Top card face up
jmp .nx
.h:
mov byte [edi+CARD_STATE], 0
and byte [edi+CARD_STATE], 0xFE ; Other cards face down
.nx:
add edi, CARD_STRUCT_SIZE
add ecx, STACK_OFFSET
@@ -1110,13 +1106,13 @@ layout_tableau:
mov word [edi+CARD_X], STOCK_X
mov word [edi+CARD_Y], FOUND_Y
mov byte [edi+CARD_LOC], 7
mov byte [edi+CARD_STATE], 0
and byte [edi+CARD_STATE], 0xFE
add edi, CARD_STRUCT_SIZE
jmp .sf
.fin: ret
; --- DATA & FONTS ---
title db 'Solitare V1.5.1', 0
title db 'Solitare V1.5.2', 0
score dd 0
game_won db 0
mouse_lock dd 0
@@ -1133,6 +1129,7 @@ active_stack rd 13
skin_h dd 0
font_8x12:
; S, C, O, R, E, -, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
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,10000010b,10000010b,10000010b,10000010b,10000010b,10000010b,01111100b,00000000b,00000000b,00000000b ; O
@@ -1151,6 +1148,7 @@ db 01111100b,10000010b,10000010b,10000010b,01111100b,10000010b,10000010b,1000001
db 01111100b,10000010b,10000010b,10000010b,10000010b,01111110b,00000010b,10000010b,01111100b,00000000b,00000000b,00000000b ; 9
font_5x7:
; A, 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K, Hearts, Diamonds, Clubs, Spades
db 01110000b,10001000b,10001000b,11111000b,10001000b,10001000b,10001000b ; A
db 11110000b,00001000b,00010000b,00100000b,01000000b,10000000b,11111000b ; 2
db 11110000b,00001000b,00001000b,01110000b,00001000b,00001000b,11110000b ; 3