Bo czĹowiek gĹupi jest tak bez przyczyny
Czy ktoś się spotkał z czymś takim ?
Mam ochote zbudować dosc duży mod w większej części pokryty lasem, więc lokacje będą dość podobne i chciałem sobie ułatwić pracę zapisując informacje o poszczególnuch lokacjach w bazie i generując lokacje w momencie kiedy gracz by "wchodził" na nią.
I teraz się zastanawiam, czy jest to wykonalne.
Ja zrobiłem coś podobnego dla NWN1, ale póki co nie rozgryzłem jeszcze formatu zapisu obszarów w nwn2
Z tym że zaznaczam ze nie możliwe jest tworzenie obszarów (plików *.are) w czasie rzeczywistym.
Konkretnie napisałem programik generujący dowolnie wiele obszarów lochów.
Efektem jego działania był erf z obszarami gotowymi do zaimportowania do modułu.
Wlasnie do NWN1 mnie interesuje i idelaem bylo by gdyby sie dalo modyfikowac/tworzyc obszary .are "w locie"
To co daloby pewne w porzo rezulataty to kilka zróżnicowanych map bez placeabli, i skrypt losujący miejsce pojawienia sie postaci, spawnujący placeable, spotkania, pułapki w losowych (ale z góry okreslonych) miejscach. Tyle ze taki system bardziej sprawdzilby sie w nwn2, gdzie mamy ograniczony bardzo ostrony rozmiar modulu, a w nwn1 lepiej po prostu robic kopie gotowych lokacji i losowe przejscia.
Problem w tym, ze tereny "generowane" powinny byc 3 typow:
- las
- sztuczny las ( wies + drzewa)
- wies
natomiast w bazie byly by informacje szczegolowe, czyli gdzie sie co znajduje, gdzie sa obiekty, pulapki, przejscia itp.
Jakos nie specjalnie ki sie usmiecha robic tych ponad 400 obszarow ze wzgledu na wielkosc moda.
A co tam wielkosc moda, w nwn1 mod z 600lokacjami ma kolo 60mb, spakowany kolo 4mb. Co się martwisz wielkoscią moda no?
Co się martwię ??
Mod to wyspa o nie regularnym kształcie, ale z grubsza ma ona postać elipsy, gdzie dłuższa oś liczy 640 "jednostek" a mniejsza około 500.
Przy czym "jednostka" to pojedynczy kwadracik np w tilesecie "wieś" (zewnętrzne) - więc policz sobie ile to jest.
A większość wyspy to są lasy (jakieś 50%), pola i równiny (25%), góry i wzgórza (15%), plaże i pustynie (10%).
Zbadane jest trochę lasów jakieś (25-30%), większość pól i równin (70%) i odrobinę gór i wzgórz (5%)
I teraz zastanów się ile pracy potrzeba na stworzenie np. całego pasa plaż okalającego wyspę ?
Moim zamierzeniem było, aby dało się obejść wyspę samą tylko plażą ( z niewielkimi wyjątkami).
W takim razie losowe rozmieszczenie placeabli na podstawie locations gdzies wczesniej zapisanych daloby tu najlepsze efekty. Nie mozna wprowadzac zmian do uruchomionego modulu, więc innego wyjscia nie widze.
Zrób 10-20 ustawien placeabli, zapisuj ich współrzedne x,y,z i zrób sobie w skryptach bilbioteke ustawien, gdzie korzystając z funkcji vector i location z tych wartosci po wejsciu na obszar obiekty beda sie spawnowac w losowym ustawieniu. Zrób tez 3,4 warianty obszarów a 60 róznych kombinacji + ew. system spawnujace losowe spotkania(nie tylko mobki, ale np. karawana czy cuś) niezaleznie od ustawien placeabli w pelni wystarczy by gracz sie nie nudzil.
czyli tak czy inaczej czeka mnie meczace reczne budowanie linii brzegowej dla calej wyspy .... masakra
Chyba dałoby się częściowo obejść ów problem. Ale tylko częściowo.
Można stworzyć plik 2da z zapisanym planem wyspy - gdzie umieszczone byłyby resrefy obszarów które mają się wgrywać. Owe plaże mogą np. mieć resref beachxxx - potrzebnych jest kilka/kilkanaście takich obszarów które można jednak dość szybko stworzyć metodą Ctrl + C/V.
W chwili gdy gracz wchodzi na taki obszar, system "wrzuca" go na jeden z kategorii takich obszarów, blokując ów obszar dla danego położenia na mapie, jednocześnie wczytując dane dotyczące szczegółów, typu placeable. W chwili opuszczeniu przez gracza obszaru, obszar ten jest zwalniany, zaś placeable czyszczone.
Podobnie możemy zrobić z łąkami, lasami i tym podobnymi powtarzalnymi obszarami.
Pozostaje jeszcze tylko kwestia jak zapisać owe placeable? Tu też nie ma niestety prostej metody, ale jest to wykonalne. Zależnie od typu wykorzystywanej bazy danych - baza SQL/NWN można zrobić następująco:
- Dla każdego obszaru stworzyć własną tabelę(SQL)/bazę danych(NWN) o nazwie zawierającej współrzędne obszaru.
- Stworzyć mini-moduł do tworzenia takich lokacji, zawierający po jednej lokacji określonego typu, z możliwością wczytania/zapisania poszczególnych baz, na podstawie wpisów do 2da.
- Z poziomu MG ustawiać odpowiednie Placeable, po zakończeniu zapisać obszar.
W ten sposób można tworzyć różne obszary we względnie prosty sposób. Wadą
tego rozwiązania jest, że przy każdym wejściu na kolejny obszar trzeba wczytywać informacje z bazy danych, chociaż na różne sposoby można to zapewne zminimalizować. Jest to również dość pracochłonne, niestety - jeśli ma się wykonać kilkaset/kilka tysięcy wpisów.
Można dla ułatwienia sobie pracy stworzyć prosty skrypt rozstawiający losowe placeable - z listy - w losowych miejscach. Problemem jest fakt, iż stworzenie zostanie automatycznie ustawione w miejscu "legalnym", podczas gdy placeable zostanie umieszczony gdzie popadnie. Rozwiązaniem może być najpierw ustawienie stworzenia w losowym miejscu, "pobranie" jego legalnego położenia, potem zlikwidowanie stworzenia i postawienie w jego miejscu placeable'a.
Uff... mam nadzieję, że to nie jest zbyt ogólne i zbyt skomplikowanie napisane?
Darmowy hosting zapewnia PRV.PL