From 0efc35f8b275dde5ea03eb355fc1db0faa6edd26 Mon Sep 17 00:00:00 2001 From: Max Date: Mon, 2 Mar 2026 22:02:21 +0000 Subject: [PATCH] Upload files to "programs/games/solitare" Add KOSfuncs.inc --- programs/games/solitare/solitare.asm | 207 ++++++++++----------------- 1 file changed, 77 insertions(+), 130 deletions(-) diff --git a/programs/games/solitare/solitare.asm b/programs/games/solitare/solitare.asm index 305cd3711..f6b898858 100644 --- a/programs/games/solitare/solitare.asm +++ b/programs/games/solitare/solitare.asm @@ -1,5 +1,5 @@ -; Solitaire V1.5 - Window Edition -; Platform: MenuetOS / KolibriOS +; Solitare V1.5.1 - KOSfuncs Edition +; Platform: KolibriOS / MenuetOS ; Author: Max format binary as 'run' @@ -8,19 +8,9 @@ org 0x0 ; --- SYSTEM INCLUDES --- include 'macros.inc' +include 'KOSfuncs.inc' -; --- 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 - +; --- GAME CONSTANTS --- CARD_W equ 50 CARD_H equ 70 STACK_OFFSET equ 20 @@ -51,7 +41,7 @@ STOCK_X equ 20 WASTE_X equ 80 FOUNDATION_X equ 350 FOUND_Y equ 20 -SCORE_Y equ 535 +SCORE_Y equ 535 ; --- HEADER --- db 'MENUET01' @@ -64,7 +54,9 @@ dd 0, 0 start: 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 call init_deck @@ -74,90 +66,90 @@ start: mov byte [game_won], 0 event_loop: - mcall 11 - cmp eax, 1 + mcall SF_CHECK_EVENT + cmp eax, 1 ; Redraw je on_redraw - cmp eax, 2 + cmp eax, 2 ; Key je on_key - cmp eax, 3 + cmp eax, 3 ; Button je on_button - + 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 ja update_screen_only cmp byte [force_redraw], 1 je update_screen_only - - mcall SYS_DELAY, 1 + + mcall SF_SLEEP, 1 jmp event_loop on_key: - mcall SYS_KEY + mcall SF_GET_KEY jmp event_loop on_button: - mcall SYS_BUTTON + mcall SF_GET_BUTTON shr eax, 8 - cmp eax, 1 ; Close button (ID 1) + cmp eax, 1 ; Close button ID jne event_loop - mcall SYS_EXIT + mcall SF_TERMINATE_PROCESS on_redraw: - mcall SYS_REDRAW, 1 - - ; EBX: [X start : Window Width] + mcall SF_REDRAW, SSF_BEGIN_DRAW + + ; EBX: Window position and width mov ebx, 100 shl 16 + (WIN_W + 9) - - ; ECX: [Y start : Window Height + skin + border] + + ; 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 (0x14) - mcall SYS_DRAW_WINDOW, , , 0x14000000 or COL_TABLE, , title - - mcall SYS_REDRAW, 2 + + ; 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 update_screen_only: mov byte [force_redraw], 0 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 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 ; --- MOUSE HANDLING --- handle_mouse: pushad - mcall SYS_MOUSE_POS, 1 + mcall SF_MOUSE_GET, SSF_WINDOW_POSITION mov ebp, eax shr ebp, 16 - sub ebp, 5 ; Mouse X correction relative to frame - - and eax, 0xFFFF - sub eax, [skin_h] - mov edi, eax ; EDI = Mouse Y inside workspace + sub ebp, 5 ; X correction - mcall SYS_MOUSE_POS, 2 - test eax, 1 ; Check left button + and eax, 0xFFFF + 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 - + cmp dword [mouse_lock], 1 - jne .exit - + jne .exit + mov dword [mouse_lock], 0 cmp dword [active_card_count], 0 je .exit - + call check_stack_move mov dword [active_card_count], 0 mov byte [force_redraw], 1 @@ -167,8 +159,8 @@ handle_mouse: .dragging_state: cmp dword [mouse_lock], 1 je .no_deal_click - - ; Check if clicking on the stock pile + + ; Stock pile click detection cmp ebp, STOCK_X jb .find_card cmp ebp, STOCK_X+CARD_W @@ -177,7 +169,7 @@ handle_mouse: jb .find_card cmp edi, FOUND_Y+CARD_H jae .find_card - + mov dword [mouse_lock], 1 call deal_from_stock mov byte [force_redraw], 1 @@ -185,14 +177,13 @@ handle_mouse: ret .find_card: - mov ebx, 51 ; Check cards from top to bottom + mov ebx, 51 .f_loop: imul edx, ebx, CARD_STRUCT_SIZE add edx, deck_data movsx esi, word [edx+CARD_X] movsx ecx, word [edx+CARD_Y] - - ; Bounds checking for the card + cmp ebp, esi jb .next_s add esi, CARD_W @@ -203,23 +194,21 @@ handle_mouse: add ecx, CARD_H cmp edi, ecx jae .next_s - - ; Only pick up face-up cards + cmp byte [edx+CARD_STATE], 1 jne .next_s - + mov dword [mouse_lock], 1 mov [active_stack], ebx mov dword [active_card_count], 1 - - ; Calculate mouse offset within card + mov ax, word [edx+CARD_X] sub ax, bp mov [mouse_off_x], ax mov ax, word [edx+CARD_Y] sub ax, di mov [mouse_off_y], ax - + mov eax, ebx call build_active_stack popad @@ -241,21 +230,20 @@ handle_mouse: mov eax, [active_stack + ecx*4] imul eax, CARD_STRUCT_SIZE add eax, deck_data - - ; Move active card stack with the mouse + mov dx, [mouse_off_x] add dx, bp mov [eax+CARD_X], dx mov dx, [mouse_off_y] add dx, di - + push eax mov eax, ecx imul eax, STACK_OFFSET add dx, ax pop eax mov [eax+CARD_Y], dx - + inc ecx jmp .d_lp .exit_drag: @@ -268,7 +256,6 @@ handle_mouse: ; --- RENDERING --- prepare_buffer: - ; Clear buffer with table color mov edi, screen_buffer mov ecx, WIN_W * WIN_H mov eax, COL_TABLE @@ -286,7 +273,6 @@ prepare_buffer: call draw_slots call render_score_ui - ; Draw static cards xor ecx, ecx .draw_loop: call is_card_active @@ -301,7 +287,6 @@ prepare_buffer: cmp ecx, 52 jl .draw_loop - ; Draw active (dragged) cards on top xor ecx, ecx .draw_active: cmp ecx, [active_card_count] @@ -322,25 +307,18 @@ draw_card_to_buffer: pushad movsx ebx, word [esi+CARD_X] movsx ecx, word [esi+CARD_Y] - - ; Shadow/Outline mov edx, COL_BLACK mov edi, CARD_W mov ebp, CARD_H call fill_rect_buf - - ; Face inc ebx inc ecx mov edx, COL_WHITE mov edi, CARD_W-2 mov ebp, CARD_H-2 call fill_rect_buf - cmp byte [esi+CARD_STATE], 1 je .face_up - - ; Back of the card add ebx, 4 add ecx, 4 mov edx, COL_REVERSE @@ -349,15 +327,12 @@ draw_card_to_buffer: call fill_rect_buf popad ret - .face_up: - ; Suit color determination mov edx, COL_RED cmp byte [esi+CARD_SUIT], 2 jb .is_red mov edx, COL_BLACK .is_red: - ; Top left symbol push edx push esi movzx eax, byte [esi+CARD_VALUE] @@ -365,18 +340,16 @@ draw_card_to_buffer: mov esi, eax add ebx, 3 add ecx, 3 - call draw_char_to_buf + call draw_char_to_buf pop esi push esi movzx eax, byte [esi+CARD_SUIT] - add eax, 13 + add eax, 13 add ebx, 6 mov esi, eax call draw_char_to_buf pop esi pop edx - - ; Bottom right symbol (inverted position) push edx push esi movsx ebx, word [esi+CARD_X] @@ -546,32 +519,30 @@ draw_large_char_to_buf: render_score_ui: mov edx, COL_BLACK - mov ebx, 530 + mov ebx, 530 mov ecx, SCORE_Y - xor esi, esi ; Print "SCORE" + xor esi, esi call draw_large_char_to_buf add ebx, 10 - mov esi, 1 + mov esi, 1 call draw_large_char_to_buf add ebx, 10 - mov esi, 2 + mov esi, 2 call draw_large_char_to_buf add ebx, 10 - mov esi, 3 + mov esi, 3 call draw_large_char_to_buf add ebx, 10 - mov esi, 4 + mov esi, 4 call draw_large_char_to_buf add ebx, 20 - - ; Handle score value display mov eax, [score] test eax, eax jns .pos neg eax push eax mov ecx, SCORE_Y - mov esi, 5 ; Minus sign + mov esi, 5 call draw_large_char_to_buf add ebx, 10 pop eax @@ -587,7 +558,7 @@ render_score_ui: jnz .dec_loop .print_dec: pop edx - add edx, 6 ; Map digit to font index + add edx, 6 push ecx mov ecx, SCORE_Y mov esi, edx @@ -600,7 +571,6 @@ render_score_ui: draw_slots: pushad - ; Draw foundation slots mov ebx, FOUNDATION_X mov ecx, FOUND_Y mov dword [temp_counter2], 4 @@ -612,8 +582,6 @@ draw_slots: add ebx, 60 dec dword [temp_counter2] jnz .f_loop - - ; Draw tableau slots mov ebx, 40 mov ecx, 110 mov dword [temp_counter2], 7 @@ -700,8 +668,6 @@ check_stack_move: mov esi, [active_stack] imul esi, CARD_STRUCT_SIZE add esi, deck_data - - ; Logic for single card foundation drop cmp dword [active_card_count], 1 jne .tableau_check mov ebx, FOUNDATION_X @@ -724,7 +690,6 @@ check_stack_move: inc ecx cmp ecx, 4 jl .f_lp - .tableau_check: mov ebx, 40 .col_lp: @@ -749,11 +714,8 @@ check_stack_move: inc ecx cmp ecx, 52 jl .find_l - cmp dword [temp_val], -1 je .empty_col - - ; Check drop on another card mov ecx, [temp_val] imul edi, ecx, CARD_STRUCT_SIZE add edi, deck_data @@ -769,8 +731,6 @@ check_stack_move: add eax, 30 cmp eax, 60 ja .nx_col - - ; Rules check: Opposite color and sequence (Value + 1) mov al, [esi+CARD_SUIT] mov dl, [edi+CARD_SUIT] shr al, 1 @@ -785,9 +745,7 @@ check_stack_move: mov dx, word [edi+CARD_Y] add dx, STACK_OFFSET jmp .apply_move - .empty_col: - ; Check drop on empty column (only Kings) movsx eax, word [esi+CARD_X] sub eax, ebx add eax, 25 @@ -802,13 +760,10 @@ check_stack_move: jne .nx_col mov dx, 110 jmp .apply_move - .nx_col: add ebx, 100 cmp ebx, 740 jl .col_lp - - ; No valid move found, snap back to original position xor ecx, ecx .back: cmp ecx, [active_card_count] @@ -825,12 +780,11 @@ check_stack_move: .out: popad ret - .found_match: add dword [score], 10 mov word [esi+CARD_X], bx mov word [esi+CARD_Y], FOUND_Y - mov byte [esi+CARD_LOC], 8 ; Set location to foundation + mov byte [esi+CARD_LOC], 8 pushad mov eax, [active_stack] mov [temp_active], eax @@ -840,7 +794,6 @@ check_stack_move: call check_win popad ret - .apply_move: xor ecx, ecx push eax @@ -927,14 +880,11 @@ check_foundation_logic: inc ebp cmp ebp, 52 jl .find_top - mov al, [esi+CARD_VALUE] mov dl, [esi+CARD_SUIT] cmp dword [temp_counter], -1 jne .not_empty - - ; Empty foundation slot only accepts Aces (Value 1) - cmp al, 1 + cmp al, 1 je .valid jmp .invalid .not_empty: @@ -1003,7 +953,7 @@ auto_reveal_all: jl .find_lowest cmp dword [temp_val], -1 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: add ebx, 100 cmp ebx, 740 @@ -1012,7 +962,6 @@ auto_reveal_all: ret 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] cmp eax, 51 je .done @@ -1055,7 +1004,7 @@ deal_from_stock: ret .o: 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_Y], FOUND_Y mov [temp_active], ecx @@ -1100,7 +1049,7 @@ init_deck: shuffle_deck: mov dword [temp_counter2], 51 .sh: - mcall SYS_RANDOM + mcall SF_GET_SYS_TIME and eax, 0xFFFF xor edx, edx mov ebx, [temp_counter2] @@ -1167,7 +1116,7 @@ layout_tableau: .fin: ret ; --- DATA & FONTS --- -title db 'Solitaire V1.5', 0 +title db 'Solitare V1.5.1', 0 score dd 0 game_won db 0 mouse_lock dd 0 @@ -1184,7 +1133,6 @@ active_stack rd 13 skin_h dd 0 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,10000000b,10000000b,10000000b,10000010b,01111100b,00000000b,00000000b,00000000b ; C 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 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 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,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 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 @@ -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 font_5x7: -; Definitions for A, 2-10, J, Q, K, and Suits 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