Nouvel autoload AchievementManager avec 12 succès (Premier éclat, Mineur confirmé, Chasseur de perles, Fouilleur d'épaves, Abysses, Légende des océans, etc.). Chaque déblocage donne un bonus XP et joue un son. HUD: toasts dorés avec icône + titre + desc + fade-in/out, empilés en haut centre. Son bulle au déblocage. Long-terme: cible des milestones cumulatifs qui donnent un sentiment de progression durable. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
70 lines
2.0 KiB
GDScript
70 lines
2.0 KiB
GDScript
class_name CraftingRecipes
|
|
extends RefCounted
|
|
|
|
static var RECIPES: Array = [
|
|
{
|
|
"name": "Lampe bioluminescente",
|
|
"inputs": [{"item_id": 5, "count": 2}, {"item_id": 6, "count": 1}],
|
|
"output": {"item_id": 100, "count": 1}
|
|
},
|
|
{
|
|
"name": "Harpon",
|
|
"inputs": [{"item_id": 3, "count": 2}, {"item_id": 7, "count": 2}],
|
|
"output": {"item_id": 101, "count": 1}
|
|
},
|
|
{
|
|
"name": "Bulle d'air",
|
|
"inputs": [{"item_id": 6, "count": 3}, {"item_id": 8, "count": 1}],
|
|
"output": {"item_id": 102, "count": 1}
|
|
},
|
|
{
|
|
"name": "Algue cuisinee",
|
|
"inputs": [{"item_id": 6, "count": 2}],
|
|
"output": {"item_id": 103, "count": 2}
|
|
},
|
|
{
|
|
"name": "Armure ecailles",
|
|
"inputs": [{"item_id": 4, "count": 4}, {"item_id": 7, "count": 2}],
|
|
"output": {"item_id": 104, "count": 1}
|
|
},
|
|
{
|
|
"name": "Amulette de soin",
|
|
"inputs": [{"item_id": 105, "count": 2}, {"item_id": 4, "count": 1}],
|
|
"output": {"item_id": 106, "count": 1}
|
|
},
|
|
]
|
|
|
|
|
|
static func find_available_recipes(inventory: Inventory) -> Array:
|
|
var available: Array = []
|
|
for i: int in range(RECIPES.size()):
|
|
if inventory.has_items(RECIPES[i]["inputs"]):
|
|
available.append(i)
|
|
return available
|
|
|
|
|
|
static func craft(inventory: Inventory, recipe_index: int) -> bool:
|
|
if recipe_index < 0 or recipe_index >= RECIPES.size():
|
|
return false
|
|
var recipe: Dictionary = RECIPES[recipe_index]
|
|
if not inventory.consume_items(recipe["inputs"]):
|
|
return false
|
|
var leftover: int = inventory.add_item(recipe["output"]["item_id"], recipe["output"]["count"])
|
|
if leftover > 0:
|
|
push_warning("CraftingRecipes: craft overflow — %d items lost" % leftover)
|
|
_award_craft_xp(recipe)
|
|
return true
|
|
|
|
|
|
static func _award_craft_xp(recipe: Dictionary) -> void:
|
|
var root: Node = Engine.get_main_loop().root
|
|
var pp: Node = root.get_node_or_null("/root/PlayerProgress")
|
|
if pp != null:
|
|
pp.award(pp.XP_CRAFT, "craft %s" % str(recipe.get("name", "")), Vector3.ZERO)
|
|
var qm: Node = root.get_node_or_null("/root/QuestManager")
|
|
if qm != null:
|
|
qm.note_craft()
|
|
var ach: Node = root.get_node_or_null("/root/AchievementManager")
|
|
if ach != null:
|
|
ach.note_craft()
|