11# @author Daniel McCoy Stephenson
22# @since August 6th, 2022
33
4+ import json
5+ import os
6+ import pygame
47
58# @author Daniel McCoy Stephenson
69# @since August 6th, 2022
@@ -15,16 +18,105 @@ def __init__(self):
1518 self .green = (0 , 255 , 0 )
1619 self .red = (255 , 0 , 0 )
1720 self .yellow = (255 , 255 , 0 )
21+ self .blue = (0 , 0 , 255 )
22+ self .gray = (128 , 128 , 128 )
1823 self .text_size = 50
1924
25+ # audio settings
26+ self .master_volume = 0.7
27+ self .music_volume = 0.5
28+ self .sfx_volume = 0.8
29+
2030 # grid size
2131 self .initial_grid_size = 5
2232
2333 # tick speed
2434 self .limit_tick_speed = True
2535 self .tick_speed = 0.1
2636
37+ # difficulty settings
38+ self .difficulty = "Normal" # Easy, Normal, Hard
39+
40+ # key bindings
41+ self .key_bindings = {
42+ 'move_up' : pygame .K_w ,
43+ 'move_down' : pygame .K_s ,
44+ 'move_left' : pygame .K_a ,
45+ 'move_right' : pygame .K_d ,
46+ 'fullscreen' : pygame .K_F11 ,
47+ 'restart' : pygame .K_r ,
48+ 'quit' : pygame .K_q
49+ }
50+
2751 # misc
2852 self .debug = False
2953 self .restart_upon_collision = True
3054 self .level_progress_percentage_required = 0.25
55+
56+ # Load saved settings
57+ self .load_settings ()
58+
59+ def get_available_resolutions (self ):
60+ """Get available display resolutions"""
61+ return [
62+ (500 , 500 ),
63+ (800 , 600 ),
64+ (1024 , 768 ),
65+ (1280 , 720 ),
66+ (1920 , 1080 )
67+ ]
68+
69+ def get_difficulty_levels (self ):
70+ """Get available difficulty levels"""
71+ return ["Easy" , "Normal" , "Hard" ]
72+
73+ def save_settings (self ):
74+ """Save current settings to file"""
75+ settings = {
76+ 'display_width' : self .display_width ,
77+ 'display_height' : self .display_height ,
78+ 'fullscreen' : self .fullscreen ,
79+ 'master_volume' : self .master_volume ,
80+ 'music_volume' : self .music_volume ,
81+ 'sfx_volume' : self .sfx_volume ,
82+ 'limit_tick_speed' : self .limit_tick_speed ,
83+ 'tick_speed' : self .tick_speed ,
84+ 'difficulty' : self .difficulty ,
85+ 'initial_grid_size' : self .initial_grid_size ,
86+ 'level_progress_percentage_required' : self .level_progress_percentage_required ,
87+ 'key_bindings' : self .key_bindings
88+ }
89+
90+ try :
91+ os .makedirs ('config' , exist_ok = True )
92+ with open ('config/settings.json' , 'w' ) as f :
93+ json .dump (settings , f , indent = 2 )
94+ except Exception as e :
95+ print (f"Warning: Could not save settings: { e } " )
96+
97+ def load_settings (self ):
98+ """Load settings from file"""
99+ try :
100+ with open ('config/settings.json' , 'r' ) as f :
101+ settings = json .load (f )
102+
103+ self .display_width = settings .get ('display_width' , self .display_width )
104+ self .display_height = settings .get ('display_height' , self .display_height )
105+ self .fullscreen = settings .get ('fullscreen' , self .fullscreen )
106+ self .master_volume = settings .get ('master_volume' , self .master_volume )
107+ self .music_volume = settings .get ('music_volume' , self .music_volume )
108+ self .sfx_volume = settings .get ('sfx_volume' , self .sfx_volume )
109+ self .limit_tick_speed = settings .get ('limit_tick_speed' , self .limit_tick_speed )
110+ self .tick_speed = settings .get ('tick_speed' , self .tick_speed )
111+ self .difficulty = settings .get ('difficulty' , self .difficulty )
112+ self .initial_grid_size = settings .get ('initial_grid_size' , self .initial_grid_size )
113+ self .level_progress_percentage_required = settings .get ('level_progress_percentage_required' , self .level_progress_percentage_required )
114+
115+ # Load key bindings, ensuring they are valid pygame key constants
116+ saved_bindings = settings .get ('key_bindings' , {})
117+ for key , value in saved_bindings .items ():
118+ if key in self .key_bindings and isinstance (value , int ):
119+ self .key_bindings [key ] = value
120+ except (FileNotFoundError , json .JSONDecodeError ):
121+ # File doesn't exist or is invalid, use defaults
122+ pass
0 commit comments