9const RARITY_WEIGHTS = {
"common":20,
"uncommon":10,
"rare":4,
"epic":1}
10const DEFAULT_EVENT_PACK_DIR =
"res://data/games/reflecting_pool/events"
11const DataCacheManager = preload(
"res://scripts/systems/dataCacheManager/data_cache_manager.gd")
14var events_by_pack = {}
16var data_cache_manager = DataCacheManager.new()
19func load_events(event_pack_dir:String = DEFAULT_EVENT_PACK_DIR) -> void:
20 load_event_packs(event_pack_dir)
22func load_event_packs(event_pack_dir:String = DEFAULT_EVENT_PACK_DIR) -> void:
24 events_by_pack.clear()
26 var dir = DirAccess.open(event_pack_dir)
29 var f = dir.get_next()
31 if f.ends_with(
".json"):
32 var pack_id = f.substr(0, f.length() - 5)
33 load_event_pack(pack_id, event_pack_dir +
"/" + f)
37func load_event_pack(pack_id:String, file_path:String) -> void:
38 load_event_pack_data(pack_id, data_cache_manager.load_root_array(file_path))
42func load_event_pack_data(pack_id:String, data:Array) -> void:
43 if not events_by_pack.has(pack_id):
44 events_by_pack[pack_id] = []
45 for raw_event
in data:
46 if not raw_event
is Dictionary:
48 var event = raw_event.duplicate(true)
49 if not event.has(
"pack"):
50 event[
"pack"] = pack_id
51 events_by_pack[pack_id].append(event)
52 all_events.append(event)
55func get_events(filters:Dictionary = {}) -> Array:
57 for event
in all_events:
58 if _event_matches_filters(event, filters):
62func get_pack_ids() -> Array:
63 return events_by_pack.keys()
65func get_events_in_pack(pack_id:String) -> Array:
66 return events_by_pack.get(pack_id, [])
68func _event_matches_filters(event:Dictionary, filters:Dictionary) -> bool:
69 if filters.has(
"pack")
and event.get(
"pack",
"") != filters[
"pack"]:
71 if filters.has(
"packs")
and not filters[
"packs"].has(event.get(
"pack",
"")):
73 if filters.has(
"rarity")
and event.get(
"rarity",
"common") != filters[
"rarity"]:
75 if filters.has(
"rarities")
and not filters[
"rarities"].has(event.get(
"rarity",
"common")):
77 if filters.has(
"repeatable")
and bool(event.get(
"repeatable", true)) !=
bool(filters[
"repeatable"]):
82func get_weighted_event(filters:Dictionary = {}) -> Dictionary:
83 var event_pool = get_events(filters)
84 if event_pool.is_empty():
88 total += RARITY_WEIGHTS.get(e.get(
"rarity",
"common"), 20)
91 var roll = randi_range(1, total)
94 running += RARITY_WEIGHTS.get(e.get(
"rarity",
"common"), 20)
100func next_event(filters:Dictionary = {}) -> Dictionary:
101 current_event = get_weighted_event(filters)
104func get_event_by_id(event_id:String) -> Dictionary:
105 for event
in all_events:
106 if str(event.get(
"id",
"")) == event_id:
111func set_current_event_by_id(event_id:String) -> bool:
112 var event = get_event_by_id(event_id)
115 current_event = event
119func draw_events(count:int, filters:Dictionary = {}, allow_duplicates:bool = false) -> Array:
120 var drawn_events = []
121 var event_pool = get_events(filters)
122 for i
in range(count):
123 if event_pool.is_empty():
125 var event = _get_weighted_event_from_pool(event_pool)
126 drawn_events.append(event)
127 if not allow_duplicates:
128 event_pool.erase(event)
131func _get_weighted_event_from_pool(event_pool:Array) -> Dictionary:
134 total += RARITY_WEIGHTS.get(e.get(
"rarity",
"common"), 20)
137 var roll = randi_range(1, total)
140 running += RARITY_WEIGHTS.get(e.get(
"rarity",
"common"), 20)
145func get_current_event() -> Dictionary:
148func get_current_event_id() -> String:
149 return str(current_event.get(
"id",
""))
151func get_current_title() -> String:
152 return current_event.get(
"title",
"Event")
154func get_current_description() -> String:
155 return current_event.get(
"description",
"")
157func get_current_choices() -> Array:
158 return current_event.get(
"choices", [])
160func get_choice_text(choice:Dictionary) -> String:
161 return choice.get(
"text",
"Choice")
163func get_choice_effects(choice:Dictionary) -> Array:
164 return choice.get(
"effects", [])
166func get_choice_outcome(choice:Dictionary) -> String:
167 return choice.get(
"outcome",
"")
170func get_cache_stats() -> Dictionary:
171 return data_cache_manager.get_cache_stats()