Upload files to "programs/games/solitare"
FIX adding score
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
; Solitare V1.5.1 - KOSfuncs Edition
|
; Solitare V1.5.2
|
||||||
; Platform: KolibriOS / MenuetOS
|
; 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'
|
format binary as 'run'
|
||||||
use32
|
use32
|
||||||
@@ -30,8 +31,8 @@ COL_SLOT equ 0x185018
|
|||||||
CARD_STRUCT_SIZE equ 12
|
CARD_STRUCT_SIZE equ 12
|
||||||
CARD_VALUE equ 0
|
CARD_VALUE equ 0
|
||||||
CARD_SUIT equ 1
|
CARD_SUIT equ 1
|
||||||
CARD_STATE equ 2
|
CARD_STATE equ 2 ; Bit 0: Face-up, Bit 7: Already Scored
|
||||||
CARD_LOC equ 3
|
CARD_LOC equ 3 ; 0-6: Tableau, 7: Stock, 8: Foundation, 9: Waste
|
||||||
CARD_X equ 4
|
CARD_X equ 4
|
||||||
CARD_Y equ 6
|
CARD_Y equ 6
|
||||||
CARD_OLD_X equ 8
|
CARD_OLD_X equ 8
|
||||||
@@ -55,7 +56,7 @@ dd 0, 0
|
|||||||
start:
|
start:
|
||||||
mov esp, stacktop
|
mov esp, stacktop
|
||||||
|
|
||||||
; Get skin height using KOSfuncs constant
|
; Get system skin height
|
||||||
mcall SF_STYLE_SETTINGS, SSF_GET_SKIN_HEIGHT
|
mcall SF_STYLE_SETTINGS, SSF_GET_SKIN_HEIGHT
|
||||||
mov [skin_h], eax
|
mov [skin_h], eax
|
||||||
|
|
||||||
@@ -67,16 +68,16 @@ start:
|
|||||||
|
|
||||||
event_loop:
|
event_loop:
|
||||||
mcall SF_CHECK_EVENT
|
mcall SF_CHECK_EVENT
|
||||||
cmp eax, 1 ; Redraw
|
cmp eax, 1 ; Redraw event
|
||||||
je on_redraw
|
je on_redraw
|
||||||
cmp eax, 2 ; Key
|
cmp eax, 2 ; Key event
|
||||||
je on_key
|
je on_key
|
||||||
cmp eax, 3 ; Button
|
cmp eax, 3 ; Button event
|
||||||
je on_button
|
je on_button
|
||||||
|
|
||||||
call handle_mouse
|
call handle_mouse
|
||||||
|
|
||||||
; Logic for active card movement or forced update
|
; Update display if dragging or forced
|
||||||
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
|
||||||
@@ -92,25 +93,18 @@ on_key:
|
|||||||
on_button:
|
on_button:
|
||||||
mcall SF_GET_BUTTON
|
mcall SF_GET_BUTTON
|
||||||
shr eax, 8
|
shr eax, 8
|
||||||
cmp eax, 1 ; Close button ID
|
cmp eax, 1 ; Window close button
|
||||||
jne event_loop
|
jne event_loop
|
||||||
mcall SF_TERMINATE_PROCESS
|
mcall SF_TERMINATE_PROCESS
|
||||||
|
|
||||||
on_redraw:
|
on_redraw:
|
||||||
mcall SF_REDRAW, SSF_BEGIN_DRAW
|
mcall SF_REDRAW, SSF_BEGIN_DRAW
|
||||||
|
|
||||||
; EBX: Window position and width
|
|
||||||
mov ebx, 100 shl 16 + (WIN_W + 9)
|
mov ebx, 100 shl 16 + (WIN_W + 9)
|
||||||
|
|
||||||
; 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
|
|
||||||
mcall SF_CREATE_WINDOW, , , 0x14000000 or COL_TABLE, , title
|
mcall SF_CREATE_WINDOW, , , 0x14000000 or COL_TABLE, , title
|
||||||
|
|
||||||
mcall SF_REDRAW, SSF_END_DRAW
|
mcall SF_REDRAW, SSF_END_DRAW
|
||||||
mov byte [force_redraw], 1
|
mov byte [force_redraw], 1
|
||||||
jmp update_screen_only
|
jmp update_screen_only
|
||||||
@@ -118,11 +112,8 @@ on_redraw:
|
|||||||
update_screen_only:
|
update_screen_only:
|
||||||
mov byte [force_redraw], 0
|
mov byte [force_redraw], 0
|
||||||
call prepare_buffer
|
call prepare_buffer
|
||||||
|
|
||||||
; 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 SF_PUT_IMAGE, 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
|
||||||
|
|
||||||
@@ -133,14 +124,14 @@ handle_mouse:
|
|||||||
mcall SF_MOUSE_GET, SSF_WINDOW_POSITION
|
mcall SF_MOUSE_GET, SSF_WINDOW_POSITION
|
||||||
mov ebp, eax
|
mov ebp, eax
|
||||||
shr ebp, 16
|
shr ebp, 16
|
||||||
sub ebp, 5 ; X correction
|
sub ebp, 5 ; Mouse X correction
|
||||||
|
|
||||||
and eax, 0xFFFF
|
and eax, 0xFFFF
|
||||||
sub eax, [skin_h]
|
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
|
mcall SF_MOUSE_GET, SSF_BUTTON
|
||||||
test eax, 1 ; Check Left Button
|
test eax, 1 ; Left click?
|
||||||
jnz .dragging_state
|
jnz .dragging_state
|
||||||
|
|
||||||
cmp dword [mouse_lock], 1
|
cmp dword [mouse_lock], 1
|
||||||
@@ -160,7 +151,7 @@ handle_mouse:
|
|||||||
cmp dword [mouse_lock], 1
|
cmp dword [mouse_lock], 1
|
||||||
je .no_deal_click
|
je .no_deal_click
|
||||||
|
|
||||||
; Stock pile click detection
|
; Stock pile interaction
|
||||||
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
|
||||||
@@ -195,8 +186,8 @@ handle_mouse:
|
|||||||
cmp edi, ecx
|
cmp edi, ecx
|
||||||
jae .next_s
|
jae .next_s
|
||||||
|
|
||||||
cmp byte [edx+CARD_STATE], 1
|
test byte [edx+CARD_STATE], 1 ; Is card face up?
|
||||||
jne .next_s
|
jz .next_s
|
||||||
|
|
||||||
mov dword [mouse_lock], 1
|
mov dword [mouse_lock], 1
|
||||||
mov [active_stack], ebx
|
mov [active_stack], ebx
|
||||||
@@ -317,8 +308,8 @@ draw_card_to_buffer:
|
|||||||
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
|
test byte [esi+CARD_STATE], 1
|
||||||
je .face_up
|
jnz .face_up
|
||||||
add ebx, 4
|
add ebx, 4
|
||||||
add ecx, 4
|
add ecx, 4
|
||||||
mov edx, COL_REVERSE
|
mov edx, COL_REVERSE
|
||||||
@@ -781,7 +772,12 @@ check_stack_move:
|
|||||||
popad
|
popad
|
||||||
ret
|
ret
|
||||||
.found_match:
|
.found_match:
|
||||||
|
; FIXED SCORING: Check Bit 7 of STATE (Scored flag)
|
||||||
|
test byte [esi+CARD_STATE], 0x80
|
||||||
|
jnz .already_scored
|
||||||
add dword [score], 10
|
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_X], bx
|
||||||
mov word [esi+CARD_Y], FOUND_Y
|
mov word [esi+CARD_Y], FOUND_Y
|
||||||
mov byte [esi+CARD_LOC], 8
|
mov byte [esi+CARD_LOC], 8
|
||||||
@@ -953,7 +949,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
|
or byte [esi+CARD_STATE], 1 ; Reveal face up
|
||||||
.next_col:
|
.next_col:
|
||||||
add ebx, 100
|
add ebx, 100
|
||||||
cmp ebx, 740
|
cmp ebx, 740
|
||||||
@@ -995,15 +991,10 @@ deal_from_stock:
|
|||||||
add esi, deck_data
|
add esi, deck_data
|
||||||
cmp byte [esi+CARD_LOC], 7
|
cmp byte [esi+CARD_LOC], 7
|
||||||
jne .n
|
jne .n
|
||||||
cmp byte [esi+CARD_STATE], 0
|
test byte [esi+CARD_STATE], 1 ; Already visible?
|
||||||
je .o
|
jnz .n
|
||||||
.n: dec ecx
|
|
||||||
jns .f
|
|
||||||
call reset_stock
|
|
||||||
popad
|
|
||||||
ret
|
|
||||||
.o:
|
.o:
|
||||||
mov byte [esi+CARD_STATE], 1
|
or byte [esi+CARD_STATE], 1
|
||||||
mov byte [esi+CARD_LOC], 9
|
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
|
||||||
@@ -1011,6 +1002,11 @@ deal_from_stock:
|
|||||||
call move_single_to_top
|
call move_single_to_top
|
||||||
popad
|
popad
|
||||||
ret
|
ret
|
||||||
|
.n: dec ecx
|
||||||
|
jns .f
|
||||||
|
call reset_stock
|
||||||
|
popad
|
||||||
|
ret
|
||||||
|
|
||||||
reset_stock:
|
reset_stock:
|
||||||
sub dword [score], 20
|
sub dword [score], 20
|
||||||
@@ -1020,7 +1016,7 @@ reset_stock:
|
|||||||
add esi, deck_data
|
add esi, deck_data
|
||||||
cmp byte [esi+CARD_LOC], 9
|
cmp byte [esi+CARD_LOC], 9
|
||||||
jne .s
|
jne .s
|
||||||
mov byte [esi+CARD_STATE], 0
|
and byte [esi+CARD_STATE], 0xFE ; Set face down
|
||||||
mov byte [esi+CARD_LOC], 7
|
mov byte [esi+CARD_LOC], 7
|
||||||
mov word [esi+CARD_X], STOCK_X
|
mov word [esi+CARD_X], STOCK_X
|
||||||
mov word [esi+CARD_Y], FOUND_Y
|
mov word [esi+CARD_Y], FOUND_Y
|
||||||
@@ -1036,7 +1032,7 @@ init_deck:
|
|||||||
.r: inc ebx
|
.r: inc ebx
|
||||||
mov byte [edi+CARD_VALUE], bl
|
mov byte [edi+CARD_VALUE], bl
|
||||||
mov byte [edi+CARD_SUIT], al
|
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
|
mov byte [edi+CARD_LOC], 7
|
||||||
add edi, CARD_STRUCT_SIZE
|
add edi, CARD_STRUCT_SIZE
|
||||||
cmp ebx, 13
|
cmp ebx, 13
|
||||||
@@ -1087,10 +1083,10 @@ layout_tableau:
|
|||||||
mov byte [edi+CARD_LOC], dl
|
mov byte [edi+CARD_LOC], dl
|
||||||
dec ebp
|
dec ebp
|
||||||
jnz .h
|
jnz .h
|
||||||
mov byte [edi+CARD_STATE], 1
|
or byte [edi+CARD_STATE], 1 ; Top card face up
|
||||||
jmp .nx
|
jmp .nx
|
||||||
.h:
|
.h:
|
||||||
mov byte [edi+CARD_STATE], 0
|
and byte [edi+CARD_STATE], 0xFE ; Other cards face down
|
||||||
.nx:
|
.nx:
|
||||||
add edi, CARD_STRUCT_SIZE
|
add edi, CARD_STRUCT_SIZE
|
||||||
add ecx, STACK_OFFSET
|
add ecx, STACK_OFFSET
|
||||||
@@ -1110,13 +1106,13 @@ layout_tableau:
|
|||||||
mov word [edi+CARD_X], STOCK_X
|
mov word [edi+CARD_X], STOCK_X
|
||||||
mov word [edi+CARD_Y], FOUND_Y
|
mov word [edi+CARD_Y], FOUND_Y
|
||||||
mov byte [edi+CARD_LOC], 7
|
mov byte [edi+CARD_LOC], 7
|
||||||
mov byte [edi+CARD_STATE], 0
|
and byte [edi+CARD_STATE], 0xFE
|
||||||
add edi, CARD_STRUCT_SIZE
|
add edi, CARD_STRUCT_SIZE
|
||||||
jmp .sf
|
jmp .sf
|
||||||
.fin: ret
|
.fin: ret
|
||||||
|
|
||||||
; --- DATA & FONTS ---
|
; --- DATA & FONTS ---
|
||||||
title db 'Solitare V1.5.1', 0
|
title db 'Solitare V1.5.2', 0
|
||||||
score dd 0
|
score dd 0
|
||||||
game_won db 0
|
game_won db 0
|
||||||
mouse_lock dd 0
|
mouse_lock dd 0
|
||||||
@@ -1133,6 +1129,7 @@ active_stack rd 13
|
|||||||
skin_h dd 0
|
skin_h dd 0
|
||||||
|
|
||||||
font_8x12:
|
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,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
|
||||||
@@ -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
|
db 01111100b,10000010b,10000010b,10000010b,10000010b,01111110b,00000010b,10000010b,01111100b,00000000b,00000000b,00000000b ; 9
|
||||||
|
|
||||||
font_5x7:
|
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 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