RapidGameFramework
Reusable Godot managers for data-driven small games
Loading...
Searching...
No Matches
resource_manager.gd
Go to the documentation of this file.
8
9const DataCacheManager = preload("res://scripts/systems/dataCacheManager/data_cache_manager.gd")
10
11var resources = {}
12var resource_definitions = {}
13var resource_order = []
14var data_cache = DataCacheManager.new()
15
16var hud = preload("res://scripts/systems/resourceManager/resource_hud.gd").new()
17
18func _init(resource_hud):
19 hud.resource_hud = resource_hud
20
21
22
23func set_sprite_manager(sprite_manager) -> void:
24 hud.sprite_manager = sprite_manager
25
26
27func check_game_over():
28 for id in resource_order:
29 if int(resources.get(id, 0)) <= 0:
30 return true
31 return false
32
33func get_symbol(id:String) -> String:
34 var def: Dictionary = resource_definitions.get(id.to_lower(), {})
35
36 return def.get("icon", id.capitalize())
37
38func get_icon_path(id:String) -> String:
39 var def: Dictionary = resource_definitions.get(id.to_lower(), {})
40 return str(def.get("icon_path", ""))
41
42func get_sprite_id(id:String) -> String:
43 var def: Dictionary = resource_definitions.get(id.to_lower(), {})
44 return str(def.get("sprite_id", ""))
45
46
47func get_value(id:String, default_value:int = 100) -> int:
48 return int(resources.get(id, default_value))
49
50func get_min_value(id:String) -> int:
51 var def: Dictionary = resource_definitions.get(id, {})
52 return int(def.get("min_value", 0))
53
54func get_max_value(id:String) -> int:
55 var def: Dictionary = resource_definitions.get(id, {})
56 return int(def.get("max_value", 100))
57
58func get_impact_marks(amount:int) -> String:
59 var count = 1
60 var absolute_amount = abs(amount)
61 if absolute_amount >= 15:
62 count = 3
63 elif absolute_amount >= 8:
64 count = 2
65 var mark = "+" if amount > 0 else "-"
66 return mark.repeat(count)
67
68func format_choice_effects(choice:Dictionary) -> String:
69 var parts = []
70 for effect in choice.get("effects", []):
71 var id = str(effect.get("resource", ""))
72 var amount = int(effect.get("amount", 0))
73 if id == "" or amount == 0:
74 continue
75 parts.append(get_symbol(id) + " " + get_impact_marks(amount))
76 if parts.is_empty():
77 return ""
78 return "\n" + " ".join(parts)
79
80func get_resource_order() -> Array:
81 return resource_order.duplicate()
82
83
84func get_effect_indicators(effects:Array, ordered:bool = true) -> Array:
85 var indicators = []
86 var sorted_effects = _sort_effects_by_resource_order(effects) if ordered else effects
87 for effect in sorted_effects:
88 var id = str(effect.get("resource", ""))
89 var amount = int(effect.get("amount", 0))
90 if id == "" or amount == 0:
91 continue
92 indicators.append({
93 "resource": id,
94 "amount": amount,
95 "icon": get_symbol(id),
96 "sprite_id": get_sprite_id(id),
97 "icon_path": get_icon_path(id),
98 "marks": get_impact_marks(amount)
99 })
100 return indicators
101
102func _sort_effects_by_resource_order(effects:Array) -> Array:
103 var sorted_effects = []
104 for resource_id in resource_order:
105 for effect in effects:
106 if str(effect.get("resource", "")) == resource_id:
107 sorted_effects.append(effect)
108 for effect in effects:
109 var id = str(effect.get("resource", ""))
110 if id != "" and not resource_order.has(id):
111 sorted_effects.append(effect)
112 return sorted_effects
113
114
115func apply_effects(effects:Array) -> void:
116 for effect in effects:
117 var id = str(effect.get("resource", ""))
118 if resources.has(id):
119 resources[id] = clampi(resources[id] + int(effect.get("amount", 0)), get_min_value(id), get_max_value(id))
120
121
122func can_apply_effects(effects:Array) -> bool:
123 for effect in effects:
124 var id = str(effect.get("resource", ""))
125 var amount = int(effect.get("amount", 0))
126 if resources.has(id) and get_value(id) + amount < get_min_value(id):
127 return false
128 return true
129
130func set_value(id:String, value:int) -> void:
131 if resources.has(id):
132 resources[id] = clampi(value, get_min_value(id), get_max_value(id))
133
134
135func get_state() -> Dictionary:
136 return resources.duplicate(true)
137
138
139func apply_state(saved_resources:Dictionary) -> void:
140 for id in saved_resources.keys():
141 set_value(str(id), int(saved_resources[id]))
142
143
144func load(resource_file_path:String = "res://data/games/reflecting_pool/resources.json"):
145 load_resource_data(data_cache.load_json(resource_file_path))
146
147
148
149func load_resource_data(data:Dictionary) -> void:
150 reset()
151 for r in data.get("resources", []):
152 var id = str(r.get("id", ""))
153 if id == "":
154 continue
155 resource_order.append(id)
156 resource_definitions[id] = r
157 resources[id] = clampi(int(r.get("starting_value", 100)), get_min_value(id), get_max_value(id))
158
159func refresh_hud(resource_hud):
160 hud.refresh_hud(resources, resource_hud, resource_order, resource_definitions)
161
162func apply_hud_text_style(resource_hud) -> void:
163 hud.apply_compact_text_style(resource_hud)
164
165func clear_hud_selection(resource_hud) -> void:
166 hud.clear_selection(resources, resource_hud, resource_order, resource_definitions)
167
168func reset():
169 resources.clear()
170 resource_definitions.clear()
171 resource_order.clear()
172
173
174func get_cache_stats() -> Dictionary:
175 return data_cache.get_cache_stats()
int
Return the current value for one resource.