Logika handlu w grze i jej implementacja w Godot 4

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:

  1. Ekwipunek gracza:
    • Lista przedmiotów, którymi gracz może handlować.
    • Ilość posiadanych zasobów (np. złota).
  2. Ekwipunek sprzedawcy:
    • Lista przedmiotów dostępnych do zakupu.
    • Ilość posiadanych zasobów przez NPC.
  3. Reguły handlu:
    • Zasady, które określają, co można kupić/sprzedać i za jaką cenę.
  4. 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.

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

  1. Dodaj do ekwipunku gracza i sprzedawcy przykładowe przedmioty.
  2. Sprawdź, czy funkcje buy_item i sell_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.


Komentarze

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *