12 KiB
12 KiB
🛠️ Crafting System Guide
Kompletni vodič za dodajanje in ustvarjanje crafting receptov v KRVAVA ŽETEV igri.
📖 Pregled
Igra ima crafting sistem ki omogoča igralcu izdelovanje:
- Orodja (sekira, kramp, motika)
- Orožje (meč, lok)
- Zgradbe (ograja, chest, furnace)
- Materiale (palica, bakla)
📂 Lokacija Datotek
c:\novafarma\src\data\CraftingRecipes.js ← Vsi recepti
c:\novafarma\src\systems\CraftingTiersSystem.js ← Tier sistem
🎯 DVA FORMATA RECEPTOV
Format 1: Obstoječi (Podroben) ✅ PRIPOROČENO
const CRAFTING_RECIPES = {
'lesena_ograda': {
id: 'lesena_ograda',
name: 'Lesena Ograda',
ingredients: [
{ item: 'wood', amount: 2 }
],
result: { item: 'lesena_ograda', amount: 5 },
category: 'buildings',
description: 'Lesena ograja za zaščito farme.'
},
'sekira_osnovna': {
id: 'sekira_osnovna',
name: 'Osnovna Sekira',
ingredients: [
{ item: 'wood', amount: 3 },
{ item: 'stone', amount: 2 }
],
result: { item: 'sekira_osnovna', amount: 1 },
category: 'tools',
description: 'Osnovno orodje za sekanje dreves.'
}
};
Prednosti:
- ✅ Podpira kategorije (tools, weapons, buildings...)
- ✅ Podpira opise
- ✅ Združljivo z obstoječim sistemom
- ✅ Enostavno razširljivo
Format 2: Enostaven/Kompakten
const craftingRecipes = {
'lesena_ograda': {
requires: { 'wood': 2 },
yields: 5
},
'sekira_osnovna': {
requires: {
'wood': 3,
'stone': 2
},
yields: 1
}
};
Prednosti:
- ✅ Krajši
- ✅ Hitrejši za pisanje
Slabosti:
- ❌ Ni kategorij
- ❌ Ni opisov
- ❌ Potreben converter
🔧 Converter Funkcija
Če želiš uporabljati enostavni format, uporabi converter:
/**
* Pretvori enostavni format v obstoječi format
* @param {Object} simpleRecipes - Enostavni format receptov
* @returns {Object} - Obstoječi format receptov
*/
function convertToStandardFormat(simpleRecipes) {
const standardRecipes = {};
for (const [id, recipe] of Object.entries(simpleRecipes)) {
// Pretvori requires v ingredients array
const ingredients = [];
for (const [item, amount] of Object.entries(recipe.requires)) {
ingredients.push({ item, amount });
}
// Ustvari standardni format
standardRecipes[id] = {
id: id,
name: id.replace(/_/g, ' ').replace(/\b\w/g, l => l.toUpperCase()),
ingredients: ingredients,
result: { item: id, amount: recipe.yields },
category: 'custom',
description: `Crafted item: ${id}`
};
}
return standardRecipes;
}
// UPORABA:
const enostavniRecepti = {
'lesena_ograda': {
requires: { 'wood': 2 },
yields: 5
}
};
const standardRecepti = convertToStandardFormat(enostavniRecepti);
// Rezultat:
// {
// 'lesena_ograda': {
// id: 'lesena_ograda',
// name: 'Lesena Ograda',
// ingredients: [{ item: 'wood', amount: 2 }],
// result: { item: 'lesena_ograda', amount: 5 },
// category: 'custom',
// description: 'Crafted item: lesena_ograda'
// }
// }
✨ Kako Dodati Nov Recept
Korak 1: Odpri CraftingRecipes.js
c:\novafarma\src\data\CraftingRecipes.js
Korak 2: Dodaj Nov Recept
Najdi ustrezno kategorijo in dodaj:
const CRAFTING_RECIPES = {
// ... obstoječi recepti ...
// ==================================
// CUSTOM RECIPES (Novi!)
// ==================================
'lesena_ograda': {
id: 'lesena_ograda',
name: 'Lesena Ograda',
ingredients: [
{ item: 'wood', amount: 2 }
],
result: { item: 'lesena_ograda', amount: 5 },
category: 'buildings',
description: 'Lesena ograja za zaščito farme.'
},
'sekira_osnovna': {
id: 'sekira_osnovna',
name: 'Osnovna Sekira',
ingredients: [
{ item: 'wood', amount: 3 },
{ item: 'stone', amount: 2 }
],
result: { item: 'sekira_osnovna', amount: 1 },
category: 'tools',
description: 'Osnovno orodje za sekanje dreves.'
}
};
Korak 3: Shrani in Osveži
- Shrani datoteko
- Osveži igro (Ctrl+R)
- Odpri crafting menu (C tipka)
📋 Kategorije Receptov
| Kategorija | Opis | Primeri |
|---|---|---|
tools |
Orodja | Sekira, kramp, motika |
weapons |
Orožje | Meč, lok, kopje |
buildings |
Zgradbe | Ograja, chest, furnace |
materials |
Materiali | Palica, deska, bakla |
storage |
Shranjevanje | Chest, barrel |
workstation |
Delavnice | Furnace, anvil |
lighting |
Svetloba | Bakla, svetilka |
custom |
Po meri | Tvoji recepti |
🎮 Helper Funkcije
getCraftingRecipe(id)
const recipe = getCraftingRecipe('lesena_ograda');
console.log(recipe.name); // "Lesena Ograda"
console.log(recipe.ingredients); // [{ item: 'wood', amount: 2 }]
canCraft(id, inventory)
const canMake = canCraft('lesena_ograda', playerInventory);
if (canMake) {
console.log('✅ Lahko narediš ograjo!');
} else {
console.log('❌ Manjka material!');
}
craftItem(id, inventory)
const success = craftItem('lesena_ograda', playerInventory);
if (success) {
console.log('🔨 Izdelano!');
// Inventory: wood -= 2, lesena_ograda += 5
}
💡 Praktični Primeri
Primer 1: Enostavna Palica
'stick': {
id: 'stick',
name: 'Palica',
ingredients: [
{ item: 'wood', amount: 1 }
],
result: { item: 'stick', amount: 4 },
category: 'materials',
description: 'Osnoven material za crafting.'
}
Primer 2: Sekira (Več Ingredientov)
'stone_axe': {
id: 'stone_axe',
name: 'Kamnita Sekira',
ingredients: [
{ item: 'stone', amount: 3 },
{ item: 'stick', amount: 2 }
],
result: { item: 'stone_axe', amount: 1 },
category: 'tools',
description: 'Izboljšana sekira za hitrejše sekanje.'
}
Primer 3: Furnace (Kompleksno)
'furnace': {
id: 'furnace',
name: 'Peč',
ingredients: [
{ item: 'stone', amount: 8 },
{ item: 'coal', amount: 4 }
],
result: { item: 'furnace', amount: 1 },
category: 'workstation',
description: 'Topi rude v ingote.'
}
🔄 Crafting Funkcija Primerjava
Obstoječa Funkcija (Podroben Format)
/**
* Helper function to craft item (consumes ingredients)
*/
function craftItem(recipeId, playerInventory) {
if (!canCraft(recipeId, playerInventory)) {
console.warn('⚠️ Cannot craft - missing ingredients!');
return false;
}
const recipe = getCraftingRecipe(recipeId);
// Consume ingredients
for (const ingredient of recipe.ingredients) {
playerInventory.removeItem(ingredient.item, ingredient.amount);
}
// Add result
playerInventory.addItem(recipe.result.item, recipe.result.amount);
console.log(`✅ Crafted ${recipe.result.amount}x ${recipe.name}`);
return true;
}
// UPORABA:
craftItem('lesena_ograda', playerInventory);
// Rezultat: wood -= 2, lesena_ograda += 5
Enostavna Funkcija (Enostaven Format)
/**
* Poskuša izdelati določen predmet (Enostaven Format).
* @param {string} recipeKey - Ime recepta (npr. 'lesena_ograda').
*/
function craftItem(recipeKey) {
const recipe = craftingRecipes[recipeKey];
if (!recipe) {
console.error(`Recept '${recipeKey}' ne obstaja.`);
return false;
}
// Preverimo, ali imamo dovolj vseh sestavin
for (const requiredItem in recipe.requires) {
const requiredAmount = recipe.requires[requiredItem];
// Če je predmeta manj v inventarju, ne moremo craftati!
if (inventory[requiredItem] === undefined || inventory[requiredItem] < requiredAmount) {
console.warn(`Ni dovolj ${requiredItem} za izdelavo ${recipeKey}. Potrebno: ${requiredAmount}, Imate: ${inventory[requiredItem] || 0}`);
return false;
}
}
// Če pridemo sem, imamo dovolj sestavin:
// 1. Odstranimo porabljene sestavine iz inventarja
for (const requiredItem in recipe.requires) {
const requiredAmount = recipe.requires[requiredItem];
inventory[requiredItem] -= requiredAmount;
}
// 2. Dodamo izdelan predmet v inventar
addItemToInventory(recipeKey, recipe.yields);
console.log(`${recipeKey} uspešno izdelan!`);
return true;
}
// UPORABA:
craftItem('lesena_ograda');
// Rezultat: inventory.wood -= 2, inventory.lesena_ograda += 5
Primerjava Funkcij
| Lastnost | Obstoječa | Enostavna |
|---|---|---|
| Format receptov | ingredients: [{item, amount}] |
requires: {item: amount} |
| Inventory sistem | Uporablja playerInventory objekt |
Uporablja globalni inventory objekt |
| Preverjanje | canCraft() helper funkcija |
Direktno v funkciji |
| Fleksibilnost | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
| Enostavnost | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
Kdy Uporabiti Katero?
Uporabi OBSTOJEČO funkcijo če:
- ✅ Uporabljaš InventorySystem class
- ✅ Rabiš kategorije in opise
- ✅ Delaš kompleksnejšo igro
- ✅ Rabiš helper funkcije (
canCraft,getCraftingRecipe)
Uporabi ENOSTAVNO funkcijo če:
- ✅ Imaš preprost inventory (object)
- ✅ Delaš prototip/testiranje
- ✅ Rabiš hitro implementacijo
- ✅ Ne rabiš kategorij
🔍 Debugging
Problem: Recept ne deluje
// Preveri če recept obstaja
const recipe = getCraftingRecipe('moj_recept');
if (!recipe) {
console.error('❌ Recept ne obstaja!');
}
// Preveri ingrediente
const canMake = canCraft('moj_recept', playerInventory);
console.log('Can craft:', canMake);
// Preveri inventory
console.log('Player wood:', playerInventory.getItemCount('wood'));
Problem: Material se ne porabi
// Poglej craftItem funkcijo v CraftingRecipes.js
// Preveri če removeItem() deluje:
playerInventory.removeItem('wood', 2);
console.log('Wood after:', playerInventory.getItemCount('wood'));
🎨 Best Practices
✅ DO:
- Uporabi smiselne ID-je (
stone_axe, neitem_123) - Dodaj opise za vse recepte
- Uporabi ustrezne kategorije
- Testiraj recepte pred objavo
❌ DON'T:
- Ne uporabljaj presledkov v ID-jih (
stone axe❌) - Ne pozabi
yields/result.amount - Ne uporabljaj item-ov ki ne obstajajo
📊 Obstoječi Recepti
Trenutno v igri:
| Recept | Kategorija | Ingredienti |
|---|---|---|
| Bone Pickaxe | tools | bone (3), wood (2) |
| Bone Axe | tools | bone (3), wood (2) |
| Bone Hoe | tools | bone (2), wood (2) |
| Bone Sword | weapons | bone (2), wood (1) |
| Wooden Pickaxe | tools | wood (3), stick (2) |
| Stone Pickaxe | tools | stone (3), stick (2) |
| Stick | materials | wood (1) → 4x |
| Torch | lighting | stick (1), coal (1) → 4x |
| Chest | storage | wood (8) |
| Furnace | workstation | stone (8), coal (4) |
🚀 Naslednji Koraki
- Odpri
c:\novafarma\src\data\CraftingRecipes.js - Dodaj svoje recepte v ustrezno kategorijo
- Shrani datoteko
- Osveži igro (Ctrl+R)
- Testiraj v crafting meniju (C tipka)
Zadnja posodobitev: 14.12.2025
Avtor: KRVAVA ŽETEV Team
Status: ✅ Ready to use
Lokacija: c:\novafarma\src\data\CraftingRecipes.js