Nouvel autoload PlayerProgress qui gagne de l'XP sur: - cassage de blocs (gain variable selon le type: perle, épave, coral > sand) - collecte de perles (+25) - crafting (+10) - paliers de profondeur atteints (+20 à 10/25/50/75/100m) HUD: barre XP + label niveau en bas centre, bannière "NIVEAU X" au level-up (son bulle + fade). Popup 3D "+N XP" spawn au point d'action. Boucle court-terme dopamine: chaque action = feedback visuel immédiat. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
64 lines
1.8 KiB
GDScript
64 lines
1.8 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 pp: Node = Engine.get_main_loop().root.get_node_or_null("/root/PlayerProgress")
|
|
if pp == null:
|
|
return
|
|
pp.award(pp.XP_CRAFT, "craft %s" % str(recipe.get("name", "")), Vector3.ZERO)
|