Wsparcie dla modów - paczki i skrypty instalacji

Kiedy to właśnie pliki konfiguracyjne są nierozszerzalne - bo konfigurują tylko to, co autor zaplanował. Znam to z H5 - łatwa edycja różnych ustawień, ale własnych rzeczy (jak choćby skryptów wywoływanych przy każdym uruchomieniu) dopisywać w ten sposób nie można. Inna sprawa, że do obsługi zdarzeń (kampania, elementy RPG, popularne modyfikacje parametrów jednostek) i tak trzeba będzie wykorzystać Pythona.

Gdzieniegdzie można dodać wskazania na funkcje (szablony funkcji lub bind), które będą wywoływane przy zaistnieniu określonego zdarzenia - na przykład każdy artefakt może wywołać swój unikalny skrypt po rozpoczęciu walki. W ten sposób można dodawać funkcjonalności inne, niż standardowe.

hmm chyba rozumiem
ale nie można by w tabeli dodać pola “binded script”?
poza tym ciągle rozwijający się “standard” to nie jest takie fajne zwłaszcza gdy nie ma zgodności wstecz

ale i tak można zrobić wsparcie dla OBU mechanik

PS: twój pomysł może jest i dobry dla dodawania nowych zasobów, ale będzie się średnio nadawał do edytowania istniejących

Niepojęty pozostaje dla mnie opór, z jakim dyskutujecie nieistotne w ostatecznym rozrachunku detale implementacyjne. Ich omawianie nie jest naturalnie niczym złym, ale w oderwaniu od nadrzędnych zagadnień jest po prostu… daremne. A kwestie prawdziwie ważkie, kluczowe wydają mi się kompletnie pominięte.

W angielskim wątku o skryptach wskazałem przykład takiej, nie spotkało się to z konkretnym odzewem, więc pozwoliłem dyskusji toczyć swoim torem - co chyba mogło być opacznie poczytane za moją aprobatę. Tutaj widzę to samo, ale język bliższy (nienawidzę mojej koślawej angielszczyzny) więc raz jeszcze się wtrącę.


Pierwszy pomysł Majaczka jako całość jest dla mnie trudny do ogarnięcia. Przeczytałem jeden post, potem jeszcze raz, potem myślałem, że kolejne rozjaśnią całość, ale nic z tego. “Im bardziej Puchatek zaglądał do środka, tym bardziej Prosiaczka tam nie było.” Mimo to zrozumiałem dostatecznie dużo, by mnie ciarki przeszły. Kolejne wersje różnią się detalami implementacyjnymi, ale ta straszliwa myśl, stojąca za nimi wszystkimi, trwa niezmieniona.

Po moim trupie! [albo twoim forku :stuck_out_tongue: ]
Ten pomysł jest tak aberracyjny, że nawet nie potrafię wymyślić porównania, które by to dobrze ukazało.

Dlaczego?
W skrócie - zawodne, obłędnie pracochłonne, mało możliwości, nierozwijalne.
W szczególe:

  1. Pliki konfiguracyjne reprezentujące identyczną logikę mogą mieć w H3 różną postać tekstową. (Wersje językowe dla przykładu)

  2. Długa i kręta droga by cokolwiek zrobić. Aby skrypter mógł zaimplementowac daną funkcjonalność, to:
    a) Implementuje ją w języku skryptowym. Aby to było możliwe, język skrytpowy musi udostępniać jakiś interfejs umożliwiający interakcję z mechaniką gry.
    b) Biblioteka skryptu tłumaczy to co modder napisał na odpowiadającą temu postać tekstową i odpowiednio modyfikuje pliki konfiguracyjne.
    c) VCMI parsuje plik konfiguracyjny, odczytując z niego informacje o logice gry.

Każdy element logiki musi być tak naprawdę w czterech miejscach naniesiony: raz - wykonanie logiki przez sam silnik; dwa - dodanie logiki to formatu pliku konfiguracyjnego i parsowanie jej przez VCMI; trzy - odwrotne parsowanie (logika -> tekst) po stronie biblioteki skryptu; cztery - udostępnienie elementu i powiązanych struktur w interfejsie skryptowym dla moddera (i w końcu pięć - użycie tego wszystkiego przez moddera). Szaleńcze, jeśli za alternatywę weźmiemy udostępnienie pewnego interfejsu (zbioru funkcji i powiązanych z nimi struktur danych) bezpośrednio skryptom. (Raz - robimy funkcję realizującą logikę w VCMI; dwa - biblioteka skryptu udostępnia to modderowi).

  1. Ograniczona funkcjonalność. Można tylko modyfikować pliki konfiguracyjne. To może i pozwoli na dodawanie nowej treści wizualnej, ale niewiele więcej. Nie można na tym zrealizować interaktywnych skryptów, nie można pisać złożonej logiki. Wszystko jest wszak wykonywane przed rozpoczęciem rozgrywki, więc siłą rzeczy te skrypty będą statyczne.
    No chyba, że przez bogactwo możliwości rozumiemy, że będzie można napisać skrypt podający VCMI wszystkie pliki wspak albo pokemonizujący komunikaty w grze.

  2. Niemożliwe do rozwoju. Dodanie jakiegoś nowego elementu do pliku konfiguracyjnego spowodowałoby, że wszystkie dotychczasowe skrypty wykonujące operacje tekstowe na pliku (dokonując tym samym założeń odnośnie jego kształtu) pogubiłyby się. Dowolna zmiana czegokolwiek w formacie wymagałyby dużych zmian w parserze VCMI i parserach wszystkich bibliotek skryptowych. Wskaż mi dewelopera, który by to robił. Ja na pewno nie.

To tylko najbardziej cisnące się na usta (palce?) uwagi.

Nie czuj się proszę dotknięty tą krytyką - naprawdę podziwiam twój zapał i cieszę się, że przedstawiasz swoje pomysły - po prostu ta konkretna idea jest w moich oczach nietrafiona.

A kto zrobi? Na razie wciąż brak nam rąk do pracy, by odtworzyć funkcjonalności oryginalnego Heroesa…


To o czym pisze Warmonger jest generalnie słuszne. Niestety jest zbyt generalne, by coś wynikało. Udostępnienie językom skryptowym (Python, nie Python - to nieistotne) odpowiedniego zbioru funkcji umożliwiających modyfikację logiki i interakcje z nią jest oczywistym i najwidoczniej jedynym słusznym sposobem realizacji skryptów. Nic lepszego chyba nie wymyślono. [No, jeszcze jest uproszczony wariant pod tytułem handler skryptów bezpośrednio dziubie w silniku, ale tego nie chcemy.]

Trafna jest uwaga, że najpierw należny określić cele do osiągnięcia, a dopiero następnie dobierać odpowiednie “środki implementacyjne”. Natomiast zanim zaczniemy się bawić w jakiekolwiek skrypty, musimy mieć ideę całości ich systemu. Najpierw cele i wymogi względem ogólnej całości, potem dopiero można wypełniać ją jakąś szczegółową treścią. Dodawanie nowych potworów czy artefaktów jest tu właśnie szczegółem - jakimś małym wycinkiem całości, niespecjalnie fascynującym z jakiejkolwiek perspektywy. (Dzięki mojemu systemowi bonusów nie powinno tu być problemów :slight_smile: )

Podstawowy cel, jaki ma nasz projekt, to odtworzenie funkcjonalności Heroesa z WoG-iem. WoG ma swój język skryptów - ERM. Nasz system więc zasadniczo powinien oferować przynajmniej te możliwości, jakie ma ERM. To można sobie przyjąć za cel pierwszy - bo jest zgodne z założeniami projektu, oczekiwaniami fanów i dostatecznie komplikuje zagadnienia. Żeby było weselej, niech skrypty działają w trybie multiplayer należycie; muszą być przy tym bezpieczne (nie stwarzające możliwości oszustwa) lub reaktywne (nie robiące “lagów” w mechanice lub GUI). Piszę “lub” - bo jednego z drugim połączyć się nie da. Pamiętajcie, że gra VCMI to jeden serwer i do ośmiu klientów. Pamiętajcie, że ERM umożliwia reagowanie zarówno na koknretne zdarzenia w logice gry (bohater odwiedza pole, nowy dzień) jak i zdarzenia w GUI (gracz kliknął myszą).

A, jeszcze fajnie by było, gdyby funkcjonalności dodane przez skrypty mogły być wspierane przez AI.

W ogóle zagadnienia modów i skryptów to trochę co innego. Dużo łatwiej zmodyfikować ( / sparametryzować) istniejącą logikę w silniku, niż dodać ją gdzieś “poza”.

W skrócie:

  • bezpieczeństwo skryptów (co zrobić, żeby mogły być używane w rozgrywkach MP bez obawy oszustw)
  • niezawodność i reaktywnośc skryptów (żeby mogły by ć używane w MP i nie prowadziły do lagów lub błędów desynchronizacji)
  • skrypty a AI

W ogóle, to zanim poważnie będziemy dyskutować o dodaniu skryptów, VCMI musi mieć działający tryb multiplayer w dwóch wariantach (reaktywny, bezpieczny). To ciągle długa perspektywa. Traktujcie mój post jako wrzucenie problemu do niezobowiązującej dyskusji - która jednak jak najbardziej może wpłynąć na kształtowanie się mojej końcowej idei systemu skryptów / modów.
Szeroko rozumiane modyfikacje gry muszą być ostatnią dużą funkcjonalnością, jaką zaimplementujemy. (No, może poza AI, które do niczego nie jest konieczne, a może być od nich zależne.)

hmm troche zostaem niezrozumiany
chodzilo mi o to zeby przed zaserwowaniem silnikowi konfiguracji byla dostarczona jako tekst skryptowi i jako tekst wracala do puli i to samo przez kilka iteracji

argument o nierozszerzalnosci wydaje sie sensowny ale tylko wydaje
jest wiele formatow tekstowych latwo rozszerzalnych - chocby te oparte na xml

w moim pomysle bylo by pliki konfiguracyjne mial jakis standard opracowany przez team vcmi (najlepiej rozszerzalny) i by mozna bylo z trescia zrobic cokolwiek na co jezyk skryptowy pozwala (nawet po obsluge zewnetrznych baz danych, zaleznosc od czasu ostatniego czegos czy uzycie biblioteki pseudolosujacej zewnetrznej)

w przypadku bazy danych, tabeli i niektorych formatow opartych na xml polem moze byc rowniez nazwa skryptu ktory zadziala w juz w pelni uruchomionej wersji silnika

oczywiscie team vcmi moze opracowac “biblioteczke standardowa” do edycji takich plikow konfiguracyjnych


A co mnie sklonilo do dania modderom takiej kontroli nad zawartoscia?
doswiadczenie z produktem o pieknym wsparciu modow, ale niedopracowanym
mowie o tes3-morrowind i tes4-oblivion
producent dostarczyl edytor plikow modow w ktorym mozna zmienic prawie wszystko ALE
ale jest jedno ALE:
gromadzenie informacji przez silnik bylo mocno ograniczone
w praktyce zeby 2 mody korzystajace z tego samego zestawu opcji podstawowych nie mogly zgodnie dzialac (np 1 opcje dialogowa w tej samej bazie dialogow) bez latki zgodnosci
zeby sensownie dalo sie grac w wiecej niz jeden mod powstal program BASH utworzony przez moddera- parsowal on binarne pliki modu szukal pewnych rzeczy i od zera budowal latke na podstawie tego
problem w tym ze nie dosc ze bylo to binarne to jeszcze standard byl niejasny, a edytor producenta pozostawial w plikach modow kawalki blednych danych ktore gra pomijala a byly trudne do parsowania zewnatrz
slowem koszmar teoretycznie cukierkowy ale tylko teoretycznie
dlatego zamierzam zeby przetwarzanie wstepne modow bylo w ogole nie ograniczone przez silnik… oczywiscie pewne rzeczy lepiej zrobic po zaladowaniu calego silnika ale pewnych rzeczy tak sie nie da zaleznie od silnika
a formaty tekstowe sa bardzo proste do parsacji zwlaszcza gdy sa porzadnie zbudowane

wiec zastosowanie tej czesci mechanizmu obslugi modow mialo by dzialanie analogiczne do tego jakie maja dyrektywy preprocesora w kompilacji albo analogiczne do kompilacji jakiegos silnika obiektowego jeszcze przed uruchomieniem przetwarzania w-czasie-wykonania


a sprawdzanie zgodnosci jest wazne ale wystarczy zalozyc ze klient i serwermusza miec te same mody a jak nie to serwer podaje to co klient nie ma
i nie wykluczam tu takich spraw jak kod w modzie zalezny od tego na ktorym kompie byl uruchomiony (np od ip, od nazwy uzytkownika itp) - jesli moder zawarl takie tresci jego sprawa jak chce moze zrobic mod ktory bedzie dzialal na jego korzysc :stuck_out_tongue:

Nie prościej od razu napisać silnik pozbawiony tego błędu?

O tym pisałem.

O tym też, choć sam się w ERM babrać nie zamierzam. Za to już dwie osoby zaoferowały swoją pomoc w tym zakresie :slight_smile:

Ogólnie widzę, że treści merytoryczne zaginęły w tej i innych dyskusjach. Pokrótce więc opiszę istotne etapy wdrażania systemu skryptów:

-Dodanie interpretera poleceń do silnika. Dobrze byłoby podpiąć go pod konsolę w celach testowych.
-Komunikacja musi się odbywać w dwie strony, mianowicie VCMI potrafi operować na skryptach i jednocześnie skrypty mogą wpływać na stan gry.
-Serializacja struktur skryptowych
-Obsługa skryptów w sieci - wysyłanie paczek i synchronizacja połączenia
-Zabezpieczenie przed niepowołanym wywołaniem skryptów.
-Możliwość istotnego wpływanie poprzez skrypty na zawartość gry - np. modyfikacja własności i dodawanie obiektów.
-Synchronizacja skryptów na zasadzie klient-serwer.
-Wsparcie dla modów - skryptów wykonywanych automatycznie przy starcie gry i w trakcie jej trwania, po zajściu pewnych określonych zdarzeń. Dobrze zdefiniowana postać modu.
-Możliwość opisania własności skryptów dla AI - dodawania i modyfikacja własności sieci neuronowej (która ponoć gdzieś tam powstaje) na zasadzie asocjacyjnej.
-Stworzenie rozszerzalnego zbioru predefiniowanych funkcji dostępnych dla ogółu społeczności.
-Przetłumaczenie (mapowanie?) funkcji ERM na tenże zbiór. Wydzielenie osobnej struktury danych na zmienne, które oryginalnie są przechowywane w dość dziwnej postaci.
-Edytor i format mapy umożliwiający przechowywanie skryptów.

No, masz swoje konkrety.
Do każdego punkty można oczywiście dopisać tony detali i rozważyć każdy możliwy problem, ale lepiej byłoby to od razu zacząć przekładać na kod. Zaczynam w czwartek :wink:

jesli chodzi o ograniczenia wynikajace z silnika to zawsze beda
dlatego podalem radykalna wypowiedz

te skrypty o ktorych mowisz to mechanizm runtime gry - jako taki potrzebny - jednak sa zupelnie czym innym od skryptow INSTALACJI

SKRYPTY INSTALACJI/INICJALIZACJI to te ktore opracowuja dane dla silnika zanim ten przejdzie pelny rozruch - wykonane zostaja tylko przy rozruchu i na tym sie koncza - SLUZA DO INICJALIZACJI SILNIKA a wiec sa wykonywane jeszcze zanim rozgrywka sie rozpocznie
SKRYPTY RUNTIME o ktorych mowisz to te ktore sa uruchamiane po kazdym spelnieniu warunkow (zdarzenie/poczatek rozgrywki/sprawdzanie warunkow w petli) - SLUZA DO ZMIANY STANU SILNIKA W CZASIE

oba rodzajeskryptow moga wystepowac niezaleznie od drugich i ich porownywanie nie ma sensu bo wychodzipoza dziedzine (to tak samo jakby sie zastanawiac czy 5>5+3i czy moze 5<5+3i bo rowne nie sa, i - podstawa zespolona)

Hmm… ciekawe, ile jeszcze pomysłów na skrypty pojawi się do czasu ich zaimplementowania. Mam nadzieję, że przynajmniej kilka z nich coś wniesie i ulepszy VCMI ponad to, co ja i Tow jesteśmy w stanie wymyśleć. Póki co, z tego co pamiętam, tak się niestety nie stało. Ale próbować zawsze warto.

Może nie powinienem wciać się w twoją dyskusję z Towem, ale korci mnie, żeby go poprzeć. Z własnego doświadczenia wiem, że metoda “zacznijmy to pisać, jakoś się ułoży” jest najprostszą drogą do zagmatwanego, nieczytelnego, niedebugowalnego, nierozwijalnego i ogólnie nieutrzymywalnego kodu, który potem trzeba kilka razy przepisywać. Pierwszy system GUI był tak robiony i aby doprowadzić go do obecnego stanu Tow potrzebował przepisać go dwa razy, a ja ciągle uważam, że w wielu miejscach jest koszmarny. Na drugim krańcu mamy CGameInterface i CCallback, które bezproblemowo rozwijają się od momentu powstania. Z nowszych rzeczy mógłbym wymienić system bonusów, obmyślany i omawiany całymi godzinami.
W kwestii poprawiania, kod obsługi skryptów jest o tle krytyczny, że od momentu ogloszenia, że działa, ludzie zaczną pisać skrypty, i oczekiwać, że jak w jednej wersji zadziała, to zadziała też w kolejnej bez poważnych przeróbek. Jeśli porywasz się na taką odpowiedzialność, uważasz się za dużo lepszego programistę ode mnie i Towa. My uważamy, że nie jest to obecnie wykonalne w sensowny sposób.

A, że tak zapytam, co takiego dają skrypty instalacji, czego nie mogą dać skrypty runtime? Przecież skrypty uruchamiane przy starcie gry mogłyby zrobić dokładnie to samo, i to lepiej.

Ja bynajmniej nie zamierzam niczego ogłaszać. Rozmiar tego zadania jest ogromny i opisanie wszystkich możliwych detali ad hoc nie jest wykonalne. Tym niemniej od czegoś trzeba zacząć, a punkt pierwszy z listy jest praktycznie zawieszony w próżni i nie wpływa ani nie zależy od tej czy innej architektury silnika - prawdę mówiąc, na razie sprawdzam, jakie są w ogóle możliwości w tym zakresie. Gdy pojawią się konkretne propozycje i konkretne problemy, będzie można dyskutować o konkretnych rozwiązaniach.

To akurat zrozumiałem - ten pomysł jest chybiony. Wprowadza kompletnie zbędną konieczność tłumaczenia logiki przez skrypty na format plików konfiguracyjnych, które potem mają być z powrotem parsowane przez VCMI. Pod każdym względem bezpośrednie udostępnienie skryptom mechaniki przez prosty interfejs jest lepsze.

Tekstowe formaty są po prostu zbędne. Zarówno gra operuje na pewnej logice, jak i modder chce umieścić / zmodyfikować pewną logikę. Tak więc im bliższa reprezentacja tej logiki w skryptach będzie reprezentacji w silniku, tym lepiej. (Prostsza konwersja.)
I dużo, dużo większa elastyczność.

Aj, wybacz - musiało mi to umknąć. Mógłbyś podlinkować?
Całościowego, satysfakcjonującego rozwiązania do tej pory nie wymyśliłem, choć mam pewne pomysły na ograniczenie problemu.

A AI, to już chyba dziesięć osób obiecało mi napisać…
Ale sam ERM jest nieistotny - jak się zrobi porządny interfejs dla języków skryptowych, to będzie można ich podpiąć wiele i w dowolnej kolejności.

Tam nie ma konkretów. To tak jak kandydat na prezydenta obiecujący naprawę służby zdrowia, obniżkę podatków, przyspieszenie rozwoju gospodarczego i załatanie dziury budżetowej. Nie sposób oprotestować jakiegokolwiek z postulatów - haseł, a mimo nikt nie nazwie tego dobrym, konkretnym programem.

Tyle że tutaj, to nawet nie rozumiem większości pojęć.

Przez silnik rozumiesz tu klienta czy serwera?

Co to znaczy “VCMI potrafi operować na skryptach”? Jakie operacje ma na nich wykonywać?

Struktury skryptowe to struktury w samych skryptach czy też struktury w VCMI odpowiadające za obsługę skryptów czy też jedno złączone z drugim?

Nie rozumiem.
Kto wysyła paczki do kogo? I z jakich powodów? Co to jest “synchronizacja połączenia”?

Czy to ma być ekwiwalent punktu “nie stwarzające [nowych] możliwości oszustwa”?
Gdzie jest to zabezpieczenie? Kto by miał wywoływać te skrypty? Kto weryfikuje, czy skrypt został wywołany w sposób niepowołany czy nie?

Jasne.

Jasne.

W jaki sposób będą te własności opisane?
" dodawania i modyfikacja własności sieci neuronowej (która ponoć gdzieś tam powstaje) na zasadzie asocjacyjnej." - nie rozumiem.
Skrypt nie powinien czynić założeń odnośnie postaci AI. Opis powinien być uniwersalny.

Przez predefiniowane funkcje rozumiesz funkcje wpisane w kod VCMI i udostępnione skryptom? Jeśli tak - naturalnie słuszny postulat.
Czy to jest równoważne jakiejś postaci rozbudowanego interfejsu - callbacka dla skryptów?

Generalnie jasne.

Pomiędzy szczegółem implementacyjnym a pustym sloganem jest całkiem szerokie pole. Nie chodzi o opisanie wszystkich detali systemu. Chodzi przede wszystkim o rozwiązanie kilku bardzo realnych problemów koncepcyjnych. Jeżeli nie potrafisz ich rozstrzygnąć w formie pisemnej, to tym bardziej nie uda Ci się w implementacji.

Szkoda czasu na pisanie takich wprawek. Zanim dopuszczę skrypty do VCMI, projekt musi być w miarę feature-complete, a ich idea przedyskutowana i czysta. Inaczej nie uda się tego należycie zrobić. A skrypty to ten jeden element projektu, którego nam nie wolno zepsuć.

Implementowanie skryptów w chwili, gdy nie mamy wielu istotnych funkcjonalności oryginalnego Heroesa oraz założonego minimum jest bezcelowe. Najpierw trzeba założyć skarpetki, potem buty.

Jeśli chcesz pomóc, to naprawdę dużo lepiej się przysłużysz, jeśli pomożesz w implementacji np. specjalności bohaterów.

Co do ostatniego punktu - ok, czas najwyższy się z tym rozprawić.

Co do innych niejasności - na większość tych pytań mam dobre odpowiedzi, ale widzę, że w chwili obecnej nie dojdziemy do sensownych wniosków. Zostawiam tą dyskusję na inną okazję.

Czyli zamiast pomagać w rozwoju projektu chcesz się pobawić w podpinanie interpretera do silnika i masz nadzieję, że kiedyś na coś się to przyda… no cóż, nie widzę żadnego powodu, dla którego takie eksperymenty miałyby się znaleźć w trunku, ale jeśli chciałbyś forkować projekt, to nikt ci tego zabronić nie może…

Chociaz niewiele z tego co tu jest napisane kumam to wyczuwam pewnego rodzaju napiecie w tej dyskusji. Ja osobiscie tez uwazam, ze zajmowanie sie na tym etapie modami jest lekkim przegieciem, gdyz do poprawnego dzialania VCMI jako zamiennika H3 jest jeszcze bardzo daleko. IMO, skoro projekt jest “otwarty” to po skonczeniu “podstawki” i tak zacznie zyc wlasnym zyciem.
Ale z drugiej strony jezeli rozkminianie tego czy innego tematu powoduje zwiekszenie motywacji do pracy nad ukonczeniem projektu to nie mam nic przeciwko.
PS>
Tak sie tylko wtracilem, zeby troche rozladowac atmosfere :stuck_out_tongue: