RapidGameFramework
Reusable Godot managers for data-driven small games
Loading...
Searching...
No Matches
shop_manager.gd
Go to the documentation of this file.
1extends RefCounted
2
3
7
8const SINGLE_MARKUP := 1.15
9
10
11
12func get_marked_up_price(base_price:int, markup:float = SINGLE_MARKUP) -> int:
13 return int(ceil(float(base_price) * markup))
14
15
16
17func buy_item(item_id:String, unit_price:int, quantity:int, economy_manager, inventory_manager, markup:float = 1.0) -> bool:
18 var total_price = get_marked_up_price(unit_price * quantity, markup)
19 if quantity <= 0 or not economy_manager.spend(total_price):
20 return false
21 inventory_manager.add_item(item_id, quantity)
22 return true
23
24
25
26func sell_item(item_id:String, unit_value:int, quantity:int, economy_manager, inventory_manager) -> bool:
27 if quantity <= 0 or not inventory_manager.remove_item(item_id, quantity):
28 return false
29 economy_manager.add_money(unit_value * quantity)
30 return true
31
32
33
34func generate_singles(card_manager, count:int = 4) -> Array:
35 var singles = []
36 for i in range(count):
37 var card = card_manager.get_random_card()
38 if not card.is_empty():
39 singles.append(card)
40 return singles
41
42
43
45func buy_pack(pack:Dictionary, economy_manager, pack_manager, card_manager, inventory_manager, modifier_manager = null) -> Array:
46 var cost = int(pack.get("cost", 0))
47 if not economy_manager.spend(cost):
48 return []
49 var cards = pack_manager.open_pack(str(pack.get("id", "")), card_manager)
50 var purchased = []
51 for card in cards:
52 if modifier_manager != null:
53 var instance = modifier_manager.roll_card_instance(card)
54 var record = modifier_manager.get_instance_record(instance)
55 record["locked"] = false
56 inventory_manager.add_card_instance(record)
57 instance["locked"] = bool(record["locked"])
58 purchased.append(instance)
59 else:
60 inventory_manager.add_card(card.get("id", ""))
61 purchased.append(card)
62 return purchased
63
64
65
66func get_single_price(card:Dictionary) -> int:
67 return get_marked_up_price(int(card.get("value", 0)), SINGLE_MARKUP)
68
69
70
72func buy_single(card:Dictionary, economy_manager, inventory_manager, modifier_manager = null) -> Dictionary:
73 var cost = get_single_price(card)
74 if card.is_empty() or not economy_manager.spend(cost):
75 return {}
76 if modifier_manager != null:
77 var instance = modifier_manager.roll_card_instance(card)
78 var record = modifier_manager.get_instance_record(instance)
79 record["locked"] = false
80 inventory_manager.add_card_instance(record)
81 instance["locked"] = bool(record["locked"])
82 return instance
83 inventory_manager.add_card(card.get("id", ""))
84 return card
85
86
87
88func sell_card(card_id_or_uid, card_manager, inventory_manager, economy_manager, modifier_manager = null) -> bool:
89 var instance = inventory_manager.get_instance(str(card_id_or_uid))
90 var base_id = str(instance.get("base_id", card_id_or_uid))
91 var card = card_manager.get_card(base_id)
92 if card.is_empty() or not inventory_manager.remove_card(card_id_or_uid):
93 return false
94 if modifier_manager != null and not instance.is_empty():
95 card = modifier_manager.apply_instance(card, instance)
96 economy_manager.add_money(int(card.get("value", 0)))
97 return true
int
Generate a random singles market from the card library.
float
Return a rounded price with a reusable markup.