solitaire-c64/cardgame.c65

152 lines
3.4 KiB
Text

#INCLUDE <c64start.c65>
#INCLUDE <c64defs.c65>
//#DEFINE MOUSE_NO_SMOOTHING 1
// Enable test game setups (comment out for release build)
//#DEFINE TEST_GAMES 1
GOTO start
ASM
*=$3000
ENDASM
#INCLUDE "utils.c65"
#INCLUDE "cardconsts.c65"
#INCLUDE "piles.c65"
#INCLUDE "random.c65"
#INCLUDE "carddeck.c65"
#INCLUDE "cardrender.c65"
//#INCLUDE "cardtests.c65"
#INCLUDE "joystick.c65"
#INCLUDE "mouse.c65"
#INCLUDE "pointer.c65"
//#INCLUDE "joysticktests.c65"
#IFDEF TEST_GAMES
#INCLUDE "testgames.c65"
#IFEND
#INCLUDE "gameloop.c65"
FUNC main
ASM
sei
ENDASM
// Initialize game state
#IFNDEF TEST_GAMES
// Normal game: random shuffle and deal
// Seed RNG with multiple entropy sources for better randomness
WORD timer_seed @ $fa
BYTE raster @ $d012
BYTE extra_entropy
BYTE warmup
// Combine CIA timer with raster position
timer_seed = PEEKW $DC04
extra_entropy = raster
timer_seed = timer_seed ^ extra_entropy
rand_seed(timer_seed)
// Warm up RNG by advancing it based on timer low byte
extra_entropy = PEEK $DC04
FOR warmup = 0 TO extra_entropy
rand(extra_entropy)
NEXT
stock_init()
stock_shuffle()
deal_tableaus()
#IFEND
BYTE validation_result
validate_deck(validation_result)
IF validation_result
POKE $d020 , color_red
ENDIF
set_vic_bank(0) // $0000 - $3fff
set_vic_screenmem(1) // $400
set_vic_charmem(4) // $2000
set_vic_ecm()
WORD charset_ptr
WORD charset_end_ptr
POINTER charset_ptr -> card_charset
POINTER charset_end_ptr -> card_charset_end
mem_copy(charset_ptr, charset_end_ptr, $2000)
//mem_copy_range(charset_ptr, $2000, 512)
fill_mem($d800, $d800+999, color_white) // Fill color mem
POKE $d020 , color_white //color_grey
POKE $d021 , color_black
POKE $d022 , color_red
POKE $d023 , color_light_grey
POKE $d024 , color_dark_grey
//show_charset()
fill_mem($0400, $0400+999, 0)
//render_card($0400, $30, 0) // Ace of Hearts
//render_card($0400, $35, 27) // 2 of Spades
//render_card($0400, $3a, 15) // 3 of Diamonds
//render_all_cards_test()
//render_facedown_test()
//render_faceup_stack_test()
//render_tableaus_test()
//render_midgame_test()
//render_card_back($0400, 35) // Test card back at column 35
//render_empty_pile($0400, 8*40+35) // Test empty pile below card back
//render_foundation_test()
//render_waste_test()
//render_all_piles_test()
// Move tests - runs multiple tests, press key between each
//test_stock_to_waste_draw1() // Draw 1 card x3 from stock
//wait_key()
//fill_mem($0400, $0400+999, 0)
//test_waste_to_tab_valid() // Move card from waste to tableau
//wait_key()
//fill_mem($0400, $0400+999, 0)
//test_tab_to_found() // Tableau to foundation + auto-flip
//wait_key()
//fill_mem($0400, $0400+999, 0)
//test_tab_to_tab_stack() // Move stack of 3 cards + auto-flip
// Joystick tests
//test_joystick_read() // Test joystick input reading - suit symbols
//fill_mem($0400, $0400+999, 0)
//test_pointer_sprite() // Test sprite pointer with joystick
//fill_mem($0400, $0400+999, 0)
//test_pointer_manual() // Test sprite pointer manual movement
// Mouse test
//test_pointer_mouse() // Test sprite pointer with 1351 mouse
// Start the game!
game_init()
game_loop() // Never returns
FEND
LABEL start
main()
LABEL card_charset
ASM
!binary "charpad_cards/charpad_cards7.bin"
ENDASM
LABEL card_charset_end