Logika handlu w grze i jej implementacja w Godot 4

in polish •  21 days ago 

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.

Published using WordPress Blurt Publisher from https://godot.com.pl.

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE BLURT!