Logika handlu w grach polega na definiowaniu zasad i mechanizmów wymiany przedmiotów, zasobów lub waluty między graczami a NPC. Oto jak krok po kroku zaimplementować ją w Godot 4.
1. Definiowanie struktury logiki handlu
Podstawowe elementy logiki handlu:
- Ekwipunek gracza:
- Lista przedmiotów, którymi gracz może handlować.
- Ilość posiadanych zasobów (np. złota).
- Ekwipunek sprzedawcy:
- Lista przedmiotów dostępnych do zakupu.
- Ilość posiadanych zasobów przez NPC.
- Reguły handlu:
- Zasady, które określają, co można kupić/sprzedać i za jaką cenę.
- Transakcje:
- Mechanizmy dodawania/usuwania przedmiotów i aktualizacji zasobów.
2. Tworzenie podstawowych skryptów
a) Skrypt dla ekwipunku
Stwórz skrypt Inventory.gd
, który obsługuje przedmioty i zasoby:
extends Node
class_name Inventory
var items: Array = [] # Lista przedmiotów w ekwipunku
var gold: int = 100 # Posiadane złoto
# Dodaj przedmiot do ekwipunku
func add_item(item):
items.append(item)
# Usuń przedmiot z ekwipunku
func remove_item(item):
if item in items:
items.erase(item)
# Sprawdź, czy ekwipunek zawiera przedmiot
func has_item(item):
return item in items
b) Klasa przedmiotów
Stwórz skrypt Item.gd
, który definiuje właściwości przedmiotów:
extends Resource
class_name Item
@export var name: String = "Unknown Item"
@export var price: int = 10
@export var icon: Texture
- Przykładowe przedmioty:
- Utwórz zasoby
Item
w edytorze i przypisz im nazwy, ceny oraz ikony.
- Utwórz zasoby
3. Skrypt logiki handlu
Stwórz skrypt TradeSystem.gd
, który obsługuje transakcje handlowe:
extends Node
@onready var player_inventory = $PlayerInventory # Odwołanie do ekwipunku gracza
@onready var vendor_inventory = $VendorInventory # Odwołanie do ekwipunku sprzedawcy
# Funkcja zakupu przedmiotu
func buy_item(item):
if player_inventory.gold >= item.price and vendor_inventory.has_item(item):
player_inventory.gold -= item.price
vendor_inventory.gold += item.price
vendor_inventory.remove_item(item)
player_inventory.add_item(item)
print("Kupiono: ", item.name)
else:
print("Nie stać Cię na ten przedmiot lub jest niedostępny!")
# Funkcja sprzedaży przedmiotu
func sell_item(item):
if vendor_inventory.gold >= item.price and player_inventory.has_item(item):
player_inventory.gold += item.price
vendor_inventory.gold -= item.price
player_inventory.remove_item(item)
vendor_inventory.add_item(item)
print("Sprzedano: ", item.name)
else:
print("NPC nie ma wystarczająco złota lub nie masz tego przedmiotu!")
4. Integracja z GUI
a) Aktualizacja interfejsu
Po każdej transakcji aktualizuj widok GUI, aby odzwierciedlał zmiany:
func update_ui():
$TradeUI.update_items()
$TradeUI.update_gold()
b) Obsługa akcji w GUI
Połącz przyciski akcji („Kup” i „Sprzedaj”) z logiką handlu:
func _on_BuyButton_pressed():
var selected_item = $TradeUI.get_selected_item()
if selected_item:
buy_item(selected_item)
update_ui()
func _on_SellButton_pressed():
var selected_item = $TradeUI.get_selected_item()
if selected_item:
sell_item(selected_item)
update_ui()
5. Rozbudowa logiki handlu
a) Dynamiczne ceny
Wprowadź zmienne ceny przedmiotów, np. w zależności od podaży i popytu:
func calculate_price(item, is_buying):
var base_price = item.price
if is_buying:
return int(base_price * 1.2) # Cena kupna z marżą
else:
return int(base_price * 0.8) # Cena sprzedaży z rabatem
b) Ograniczenia handlu
Wprowadź warunki, które ograniczają możliwość zakupu lub sprzedaży:
func can_trade(item, is_buying):
if is_buying:
return player_inventory.gold >= calculate_price(item, true)
else:
return vendor_inventory.gold >= calculate_price(item, false)
c) Rabaty i bonusy
Dodaj system rabatów (np. dla lojalnych graczy) lub premię za hurtowe zakupy:
func apply_discount(item, percentage):
item.price -= int(item.price * (percentage / 100))
6. Testowanie logiki handlu
a) Przykładowy scenariusz handlu
- Dodaj do ekwipunku gracza i sprzedawcy przykładowe przedmioty.
- Sprawdź, czy funkcje
buy_item
isell_item
działają poprawnie w różnych warunkach (np. brak złota, brak przedmiotów).
b) Debugowanie
- Wykorzystaj
print()
do wyświetlania stanów przed i po transakcjach. - Przetestuj różne kombinacje przedmiotów i cen.
7. Rozszerzenia
a) System reputacji
Dodaj system, w którym ceny zależą od reputacji gracza u danego sprzedawcy:
var reputation: int = 50 # Wartość początkowa
func calculate_price_with_reputation(item, is_buying):
var reputation_factor = 1 - (reputation / 100.0)
if is_buying:
return int(item.price * (1 + reputation_factor))
else:
return int(item.price * (1 - reputation_factor))
b) Unikalne oferty
Sprzedawca może mieć specjalne oferty, np. obniżoną cenę na wybrane przedmioty:
func get_discounted_items():
return [item for item in vendor_inventory.items if item.name in ["Specjalny miecz", "Mocna tarcza"]]
Podsumowanie
Logika handlu w grze wymaga starannego zaprojektowania, aby zapewnić balans i przyjemność z rozgrywki. Podstawowe funkcje, takie jak buy_item
i sell_item
, są kluczowe, ale warto rozbudować system o dynamiczne ceny, rabaty i reputację, aby uczynić handel bardziej angażującym. Dzięki elastyczności Godot 4, taki system można łatwo dostosować do różnych typów gier.