Dokumentacja Moddingu
Kompletny przewodnik do tworzenia modów Operacji Dostawa
Witamy w dokumentacji moddingu! Ten przewodnik pomoże Ci stworzyć własną zawartość i rozszerzyć grę o nowe produkty, dekoracje, a nawet mechaniki.
🚀 Szybki Start
Rozpocznij swoją przygodę z moddingiem w 3 prostych krokach!
Utwórz folder mods
W głównym katalogu gry (gdzie znajduje się main.lua) utwórz folder mods
Operacja Dostawa/
├── main.lua
├── core/
├── assets/
└── mods/ ← Tutaj!
Skopiuj szablon
Z folderu modcreator skopiuj plik examplemod.lua do mods
Zmień nazwę i edytuj
Zmień nazwę na moj_mod.lua i zacznij kodować!
🧭 Jak działa ładowanie modów?
- Start gry:
main.luaładuje moduły, a na końcu wywołujeGame.loadMods(). - Skany folderu:
mods/jest iterowany; każdy plik.luajestrequire(). - Error handler: Błąd w modzie pokaże ekran z opcją restartu bez tego moda (zapisywany w
disabled_mods.txt). - Środowisko: W momencie ładowania mody mają dostęp do
Game,Decorations,Tablet,CustomerManageritd.
📦 Podstawy Moddingu
Dodawanie Nowego Produktu
Dodaj nowy produkt do sprzedaży w sklepie:
if Game and Game.productTypes then
Game.productTypes['super_cola'] = {
price = 10,
asset = 'super_cola'
}
print("Dodano Super Colę!")
end
super_cola.png do folderu assets!
Dodawanie Nowej Dekoracji
Stwórz nową dekorację do kupienia w tablecie:
if Decorations and Decorations.list then
table.insert(Decorations.list, {
id = "golden_statue",
name = "Złota Statua",
price = 5000,
asset = "deco_golden_statue",
purchased = false,
x = 100, y = 250,
type = "cosmetic",
scale = 0.7
})
print("Dodano Złotą Statuę!")
end
Modyfikowanie Istniejącego Produktu
Zmień cenę lub właściwości istniejącego produktu:
if Game and Game.productTypes and Game.productTypes.milk then
Game.productTypes.milk.price = 1
print("Mleko teraz kosztuje 1 zł!")
end
⚡ Zaawansowane Techniki
Odkryj potężne możliwości systemu modów!
Hooking - Wpinanie się w Pętlę Gry
Rozszerz główne funkcje gry o własną logikę:
-- Zapisz oryginalną funkcję
local original_love_update = love.update
love.update = function(dt)
original_love_update(dt) -- ZAWSZE wywołuj oryginał!
-- Twoja logika - pasywny dochód
if Game then
Game.money = Game.money + (1 * dt)
end
end
Dodawanie Własnych Dźwięków
Wczytaj i odtwarzaj własne efekty dźwiękowe:
-- 1. Umieść 'moj_dzwiek.mp3' w folderze /assets
local mojDzwiek = love.audio.newSource('assets/moj_dzwiek.mp3', 'static')
-- 2. Hook do odtwarzania
local original_mousepressed = love.mousepressed
love.mousepressed = function(x, y, button)
if original_mousepressed then
original_mousepressed(x, y, button)
end
mojDzwiek:play()
end
Rysowanie Własnych Elementów
Dodaj własne elementy graficzne do gry:
local original_love_draw = love.draw
love.draw = function()
if original_love_draw then original_love_draw() end
-- Rysuj własne elementy
love.graphics.setColor(1, 1, 0)
love.graphics.circle('fill', 100, 100, 50)
love.graphics.setColor(1, 1, 1)
end
🧱 Ważne struktury danych
Produkt na półce
{ type, price, x, y, scale, room }
Paczka
{ x, y, scale, isBeingDragged, contents = { {type, quantity}, ... } }
Timer dostawy
{ time, package }wTablet.deliveryTimers
🔧 API Reference
Główne obiekty i funkcje dostępne w modach:
Game
Główny obiekt gry
Game.money- Pieniądze graczaGame.productTypes- Typy produktówGame.productsOnShelves- Produkty na półkachGame.packages- PaczkiGame.shop_expanded- Czy sklep rozbudowanyGame.current_room- Aktualny pokój (1 lub 2)
Decorations
System dekoracji
Decorations.list- Lista dekoracjiDecorations.buy(id)- Kup dekoracjęDecorations.getDecoration(id)- Pobierz dekorację
CustomerManager
Zarządzanie klientami
CustomerManager.customers- Lista klientówCustomerManager.spawnCustomer()- Spawn klientaCustomerManager.spawnInterval- Interwał spawnu
Tablet
System tabletu
Tablet.isOpen- Czy tablet otwartyTablet.toggle()- Przełącz tabletTablet.deliveryTimers- Timery dostaw
🧪 Checklist przed publikacją moda
- Brak błędów startu (konsola czysta, ekran error handlera się nie pojawia).
- Nowe zasoby dodane do
assets/(nazwy zgodne z tym, co w kodzie). - Hooki wywołują oryginalne funkcje (
original_...zawsze odpalony). - Brak globalnych konfliktów (prefiks nazw,
localdla zmiennych pomocniczych). - Komendy konsoli (jeśli dodane) mają walidację argumentów.
- Zapisywanie/wczytywanie – dane nie psują save’ów (unikać binarnych userdata).
❓ FAQ
Dostawa nie dochodzi
Sprawdź Tablet.deliveryTimers – czy time schodzi do 0 i czy pakiet ma x/y ustawione w placeOrder().
Grafika się nie wyświetla
Plik musi być w assets/, nazwa bez rozszerzenia zgodna z asset w produkcie/dekoracji, format PNG.
Hook zawiesza grę
Upewnij się, że wywołujesz oryginalną funkcję i otaczasz własny kod pcall gdy to ryzykowne.
🐛 Debugowanie
Używaj print()
Twój najlepszy przyjaciel! Dodawaj print("Mój mod działa!") aby śledzić wykonanie kodu.
Sprawdzaj istnienie obiektów
Zawsze używaj if Game and Game.productTypes then przed modyfikacją.
Czytaj błędy
Konsola pokaże dokładną linię, w której wystąpił błąd. Zainstaluj mod Console dla lepszego debugowania!
Używaj Konsoli Deweloperskiej
Zainstaluj mod Console (Shift + C) aby testować komendy i śledzić logi w czasie rzeczywistym.
✨ Dobre Praktyki
Unikalne Nazwy
Używaj prefiksów dla zmiennych: MojMod_Zmienna zamiast zmienna
Lokalne Zmienne
Używaj local dla zmiennych, które nie muszą być globalne
Komentarze
Dokumentuj swój kod komentarzami dla przyszłych siebie i innych
Testuj Często
Testuj mod po każdej większej zmianie, aby szybko wykryć błędy
Zachowuj Oryginały
Zawsze zapisuj oryginalne funkcje przed ich modyfikacją
README
Dodaj plik README.txt z opisem moda i instrukcją instalacji