RapidGameFramework
Reusable Godot managers for data-driven small games
Loading...
Searching...
No Matches
pack_manager.gd
Go to the documentation of this file.
1extends RefCounted
2
3
11
12const DataCacheManager = preload("res://scripts/systems/dataCacheManager/data_cache_manager.gd")
13
14var packs := {}
15var pack_order := []
16var data_cache_manager = DataCacheManager.new()
17
18
19
20func load_packs(file_path:String) -> void:
21 reset()
22 load_pack_data(data_cache_manager.load_json(file_path))
23
24
25
26func get_cache_stats() -> Dictionary:
27 return data_cache_manager.get_cache_stats()
28
29
30
31func load_pack_data(data) -> void:
32 reset()
33 if not data is Dictionary:
34 return
35 for raw_pack in data.get("packs", []):
36 if not raw_pack is Dictionary:
37 continue
38 var pack = raw_pack.duplicate(true)
39 var id = str(pack.get("id", pack.get("name", "")))
40 if id == "":
41 continue
42 pack["id"] = id
43 packs[id] = pack
44 pack_order.append(id)
45
46
47
48func get_pack(id:String) -> Dictionary:
49 return packs.get(id, {})
50
51
52
53func get_packs() -> Array:
54 var list = []
55 for id in pack_order:
56 list.append(packs[id])
57 return list
58
59
60
61func open_pack(pack_id:String, card_manager) -> Array:
62 var pack = get_pack(pack_id)
63 if pack.is_empty():
64 return []
65 var opened = []
66 for i in range(int(pack.get("cards", 5))):
67 var rarity = _roll_rarity(pack.get("weights", {}))
68 var card = card_manager.get_random_card_by_rarity(rarity)
69 if card.is_empty():
70 card = card_manager.get_random_card()
71 if not card.is_empty():
72 opened.append(card)
73 return opened
74
75
76func _roll_rarity(weights:Dictionary) -> String:
77 var total = 0
78 for rarity in weights.keys():
79 total += int(weights[rarity])
80 if total <= 0:
81 return "Common"
82 var roll = randi_range(1, total)
83 var running = 0
84 for rarity in weights.keys():
85 running += int(weights[rarity])
86 if roll <= running:
87 return str(rarity)
88 return str(weights.keys()[0])
89
90
91func reset() -> void:
92 packs.clear()
93 pack_order.clear()