Poprzedni temat «» Następny temat
[TUTORIAL] O WeiDU słów kilka
Autor Wiadomość
Tuldor88 
Uczeń Gonda
Dziki kurczak zagłady


Wiek: 29
Posty: 1748
Podziękowania: 128/135
Wysłany: 2014-04-27, 05:02   [TUTORIAL] O WeiDU słów kilka

Za mało tego na prawdziwy tutorial, niemniej wolę zamieścić kilka wzmianek i potem je sukcesywnie rozwijać, by w przyszłości nie zapomnieć, poza tym nigdzie na forum odnośnie samego WeiDU nic (bądź prawie nic) nie napisano.

Na początek kilka podstaw:
1) Jak mam to właściwie odpalić?
2) Traifikacja
3) Detraifikacja
4) Uwag kilka odnośnie komend *.TP2


---

1) Uruchamianie WeiDU
WeiDU to niezwykle pomocny program i wiele jego funkcji da się wykorzystać zawierając odpowiednie komendy w zestawie instrukcji do instalacji modu, czyli pliku *.TP2. Niemniej jednak niektóre funkcje wymagają odpalenia programu, co początkującym może sprawić problemy. Jeśli klikniemy na aplikację WeiDU, jedyne co będziemy mogli zrobić, to przejrzenie dostępnych w nim komend, dlatego trzeba zrobić to nieco inaczej:
otwieramy MENU START, następnie wybieramy URUCHOM i wpisujemy w polu cmd.exe (możemy też wybrać 'Wiersz polecenia' w folderze 'Akcesoria' w Menu Start - dop. L`f) - otworzy się linia komend, teraz musimy w niej dostać się do folderu, w jakim mamy aplikację WeiDU (załóżmy, że jest to folder: C:\WeiDU\weidu.exe)
na początku wpisujemy C: [czyli literę dysku na jakim mamy wypakowany program] i zatwierdzamy enterem.
kolejne kroki wymagają wchodzenia po kolei do kolejnych folderów, by to zrobić wpisujemy cd [nazwa folderu] czyli w tym wypadku cd WeiDU
Gratulacje, jesteśmy na miejscu! Teraz możemy korzystać z aplikacji.

2) Traifikacja
Możemy teraz zrobić coś co bywa niezwykle pomocne podczas udostępniania modu do tłumaczenia - straifikować go. Co to oznacza? Mniej więcej tyle, iż rozdzielamy pliki modu na dwie części - posiadające tekst oraz te jakie zawierają same komendy.
Po co nam to? Pozwoli to nam np udostępnić inne wersje językowe bez konieczności przekopiowania po raz drugi całej zawartości skryptowej.

Jak zaś to zrobić? Otworzyliśmy już wiersz poleceń w jakim mamy namierzony folder C:\WeiDU, musimy w takim razie wpisać odpowiednią komendę by program 'znalazł' pliki modu, które chcemy traifikować (załóżmy że jest to folder C:\Mod w jakim znajduje się plik zawierający rozmowy NPCa "NPC.D" a chcemy by gotowe pliki trafiły do folderu C:\PoprawionyMod).
wpisujemy komendę:
Cytat:
weidu --traify X --out Y

X - ścieżka do pliku jaki traifikujemy (wraz z jego rozszerzeniem)
Y - ścieżka do miejsca w jakim chcemy umieścić pliki straifikowane (bez rozszerzenia)
działając na powyższym przykładzie komenda będzie wyglądać tak:
Cytat:
weidu --traify C:\Mod\NPC.D --out C:\PoprawionyMod\NPC

Po krótkiej chwili traifikacja się zakończy a my w folderze "PoprawionyMod" na dysku C znajdziemy dwa pliki:
NPC.D - teraz zawiera on tylko samą warstwę skryptową
NPC.TRA - on z kolei posiada w sobie cały mówiony/pisany tekst jaki był w pierwotnym pliku

3) Detraifikacja
Tak właściwie po co nam detraifikacja? Po co cofać to, co zrobiliśmy krok wcześniej? Cóż, jest to przydatne jeśli mamy dużo tekstu, spory plik ze skomplikowanymi drzewkami rozmów a musimy wprowadzić korekty. Jeśli posiadamy tekst oddzielony od warstwy technicznej da się to zrobić, ale wprowadzanie poprawek na pliku niestraifikowanym bywa o niebo łatwiejsze.

Sposób jest podobny do poprzedniego - po wejściu w wiersz poleceń i folder zawierający WeiDU [punkt 1] wpisujemy komendę:
Cytat:
weidu --untraify-d X --untraify-tra Y --out Z

X - ścieżka do straifikowanego pliku *.D (z rozszerzeniem)
Y - ścieżka do odpowiadającego mu pliku *.TRA (z rozszerzeniem)
Z - ścieżka do odtraifikowanego pliku *.D (bez rozszerzenia)

Jeśli chcemy by pliki 'połączyły się' i trafiły tam gdzie były wcześniej komenda będzie następująca:
Cytat:
weidu --untraify-d C:\PoprawionyMod\NPC.D --untraify-tra C:\PoprawionyMod\NPC.TRA --out C:\Mod\NPC

po chwili w folderze "Mod" znajdziemy plik NPC.D zawierający tak tekst jak i warstwę techniczną. Po poprawieniu błędów można go oczywiście straifikować ponownie [punkt2].

4) Uwag kilka odnośnie komend *.TP2
Plik *.TP2 to podstawowy plik każdego modu WeiDU, bo zawiera on 'instrukcje' dla WeiDU, jak ma zainstalować mod w folderze gry, niezależnie od tego czy dodajemy NPC, sklep, czy pojedynczy dialog - *.TP2 musi istnieć by zmiany pojawiły się w modzie.

a) Death Variable NPC dodanych z poziomu WEIDU
Jeśli tworzymy własnego NPC w ten sposób, gra kopiuje któregoś z już istniejących, a następnie - zgodnie z wytycznymi - nanosi na niego zmiany. Tworząc NPC powinniśmy pamiętać o tym, by nadać mu indywidualne Death Variable (ScriptName), czyli identyfikator po jakim gra będzie poznawać, iż dana komenda ma dotyczyć konkretnej postaci. Robimy to następująco:
Cytat:
COPY_EXISTING ~Nazwa_pliku_NPC_występującego_w_grze.cre~ ~override/Nazwa_nowego_pliku_stwora.cre~
SAY NAME1 ~Imię_istoty~
SAY NAME2 ~Skrócone_imię~
WRITE_ASCII DIALOG ~Nazwa_pliku_dialogowego~
WRITE_ASCII 0x280 ~Nowe_DV~
Przykładowo, jeśli tworzymy kogoś na bazie 'grubego kupca' możemy wpisać to następująco:
Cytat:
COPY_EXISTING ~SHOP7.cre~ ~override/GHE.cre~
SAY NAME1 ~Gruby Henio~
SAY NAME2 ~Gruby Henio~
WRITE_ASCII DIALOG ~GRUHENIO~
WRITE_ASCII 0x280 ~GRUHENIO~

Dzięki temu uzyskaliśmy postać o imieniu "Gruby Henio", która wygląda jak kupiec, ma soundset kupca i jego wyposażenie (ale nie sklep), poza tym ma własny plik dialogowy "GRUHENIO" i Death Variable o tej samej nazwie, a w grze figuruje jako "GHE.cre"

Dlaczego jednak nie wpisaliśmy zamiast GRUHENIO np GH albo tego samego co w nazwie *.cre czyli GHE? Z tej przyczyny iż komenda WRITE_ASCII nie wymazuje starej zawartości pola DIALOG czy DV a zastępuje je litera po literze... oznacza to tyle, że jeśli wpiszemy tam krótsze DV niż oryginalny NPC miał w grze to gra nadpisze tylko początek nazwy a resztę pozostawi niezmienioną (sam miałem z tym sporo problemów).

Jak można się przed tym uchronić? Zasadniczo są dwie metody:
- można zawsze wpisywać nowe DV mające 8 znaków, co sprawi iż na pewno zastąpimy wszystko co było kiedyś w starym polu
- można po komendzie WRITE_ASCII 0x280 ~GHE~ wpisać liczbę bajtów jaką zajmuje dana nazwa "Use WRITE_ASCII for things like script name, dialogues, scripts, etc. Note, that if you’re WRITE_ASCIIing to say, the script name, and the previous script-name entry is longer than the one you’re writing, then you’ll have spillover after WRITE_ASCII. To avoid this, specify a required size that equals the length of the script-name field. So, if I have
WRITE_ASCII 0x280 ~Guy~ I would actually want to write this

WRITE_ASCII 0x280 ~Guy~ #32
These are by no means "hard and fast" rules, but generally they ring true." w tym wypadku będzie to:
Cytat:
WRITE_ASCII 0x280 ~GHE~ #32

osobiście wolę pierwszą metodę, acz jeśli chcecie możecie wybrać drugą :wink:

/CDN/

Podziękowania dla L'f za pomoc przy komendach, podczas babrania się z plikami gry. Tutorial dotyczy WeiDU w wersji 235 i może nie zawierać informacji odnośnie zmian w wersjach późniejszych.

Kolory w postach są dla moderacji, akwamaryna akurat dla Valsharess (taka uwaga na przyszłość). :>

Przy okazji przeprowadziłem drobną korektę tutorialu i przykleiłem temat. - L`f
_________________
Heinrich Heine napisał/a:
Sen jest dobrą rzeczą, śmierć jeszcze lepszą, ale najlepiej byłoby wcale się nie narodzić.
Alvarez o modowaniu napisał/a:
Może przytoczę twierdzenie Liberty'ego, które jakoś tak idzie: planujesz jakiś projekt, wyznacz sobie termin, pomnóż potrzebny czas przez 2 a i tak nie zdążysz.

Wybrane fragmenty banterów:
Edwin napisał/a:
-Phi! Porównywać mnie do jakiegoś podrzędnego nekromanty! (Stanowczo na zbyt wiele sobie pozwala, muszę pokazać mu gdzie jego miejsce.) Prawdopodobnie przemawia przez ciebie zwykła zazdrość. Wy, maluczcy macie tendencje do zawiści wobec tych, którzy was przerastają. Ja zaś czynię to nie tylko talentem ale i wzrostem, karzełku.
-*Posłał Edwinowi szeroki uśmiech przemawiając serdecznym tonem* Jeszcze raz nazwiesz mnie „karzełkiem” a utnę ci na dole coś niezwykle małego, co może jednak mimo wszystko być ci drogie. Gdy zaś chodzi o te dyrdymały o talencie... znów przypominasz mojego żałosnego, byłego towarzysza...
Minsc napisał/a:
-Niebywałe, że ten chomik jeszcze oddycha. Znajdując się nieco bliżej ciebie wielkoludzie na pewno zaniechałbym tej czynności, powiedz, uważasz że pranie onuc urąga twej męskości, czy po prostu lubisz informować wrogów zapaszkiem o tym, iż się do nich zbliżasz?
-Boo być może jest niewielki Montaronie, ale jest też o wiele silniejszy niż się zdaje. A to, co czujesz to zapach prawdziwego mężczyzny, który przykryje każdy odór zła, na jaki trafi, co nie, Boo?.
Viconia napisał/a:
-Mmm... wciąż robisz wrażenie Viconio, moja ty hebanoskóra kusicielko. Zdajesz sobie sprawę jak działasz na otoczenie, prawda?
-Oczywiście samcze, dzięki temu jalukul, mężczyźni tacy jak ty – myślący kroczem zamiast głową – stają się łatwiejsi w kontrolowaniu

-cała prawda o Imoen :P
Ostatnio zmieniony przez L`f 2014-04-27, 19:07, w całości zmieniany 4 razy  
Podziękuj autorowi tego posta
 
 
 
Więcej szczegółów
Za tę wypowiedź podziękowali:
greegarak, L`f
dradiel 
Przyjaciel Klanu
Jeździec Shaundakula

Posty: 1453
Podziękowania: 612/83
Wysłany: 2014-04-27, 08:25   Re: TUTORIAL:O weidu słów kilka

Tuldor88 napisał/a:

a) DeathVariable NPC dodanych z poziomu WEIDU
Jeśli tworzymy własnego NPC w ten sposób gra kopiuje któregoś z już istniejących, a następnie - zgodnie z wytycznymi - nanosi na niego zmiany. Tworząc NPC powinniśmy pamiętać o tym, by nadać mu indywidualne DeathVariable (ScriptName), czyli identyfikator po jakim gra będzie poznawać, iż dana komenda ma dotyczyc konkretnej postaci. Robimy to następująco:
Cytat:
COPY_EXISTING ~Nazwa_pliku_NPC_występującego_w_grze.cre~ ~override/Nazwa_nowego_pliku_stwora.cre~
SAY NAME1 ~Imię_istoty~
SAY NAME2 ~Skrócone_imię~
WRITE_ASCII DIALOG ~Nazwa_pliku_dialogowego~
WRITE_ASCII 0x280 ~Nowe_DV~
Przykładowo, jeśli tworzymy kogoś na bazie 'grubego kupca' możemy wpisać to następująco:
Cytat:
COPY_EXISTING ~SHOP7.cre~ ~override/GHE.cre~
SAY NAME1 ~Gruby Henio~
SAY NAME2 ~Gruby Henio~
WRITE_ASCII DIALOG ~GRUHENIO~
WRITE_ASCII 0x280 ~GRUHENIO~

Dzięki temu uzyskaliśmy postać o imieniu "Gruby Henio", która wygląda jak kupiec, ma soundset kupca i jego wyposażenie (ale nie sklep), poza tym ma własny plik dialogowy "GRUHENIO" i DeathVariable o tej samej nazwie, a w grze figuruje jako "GHE.cre"

Dlaczego jednak nie wpisaliśmy zamiast GRUHENIO np GH albo tego samego co w nazwie *.cre czyli GHE? Z tej przyczyny iż komenda WRITE_ASCII nie wymazuje starej zawartości pola dialog czy DV a zastępuje je litera po literze... oznacza to tyle, że jeśli wpiszemy tam krótsze DV niż oryginalny NPC miał w grze to gra nadpisze tylko początek nazwy a resztę pozostawi niezmienioną (sam miałem z tym sporo problemów).

Jak można się przed tym uchronić? Zasadniczo są dwie metody:
- można zawsze wpisywać nowe DV mające 8 znaków, co sprawi iż na pewno zastąpimy wszystko co było kiedyś w starym polu
- można po komendzie WRITE_ASCII 0x280 ~GHE~ wpisać liczbę bajtów jaką zajmuje dana nazwa "Use WRITE_ASCII for things like script name, dialogues, scripts, etc. Note, that if you’re WRITE_ASCIIing to say, the script name, and the previous script-name entry is longer than the one you’re writing, then you’ll have spillover after WRITE_ASCII. To avoid this, specify a required size that equals the length of the script-name field. So, if I have
WRITE_ASCII 0x280 ~Guy~ I would actually want to write this

WRITE_ASCII 0x280 ~Guy~ #32
These are by no means "hard and fast" rules, but generally they ring true." w tym wypadku będzie to:
Cytat:
WRITE_ASCII 0x280 ~GHE~ #32

osobiście wolę pierwszą metodę, acz jeśli chcecie możecie wybrać drugą :wink:


Znowu moje przemyślenia i parę wykonanych testów. Moim zdaniem...

Powinno zawsze się wybierać metodę 2. Używanie pierwszej może doprowadzić do błędów w grze, chociaż nie musi i w zasadzie szansa jest na to niewielka, ale strzeżonego...

Script Name ma przewidziane zaczynając od offsetu 0x280 32 bajty w pliku .cre, czyli teoretycznie nazwa może składać się z 32 znaków. Co prawda nie przypominam sobie moda, który by używał więcej niż 8 znaków na DV w pliku .cre, ale wszystkich modów nie znam i nie zwracam jakoś szczególnej uwagi, ile kto tam tych znaków daje. Ja osobiście stosuję zasadę do 8 i parametr #32.
W grze jednak można natknąć się wielokrotnie na DV dłuższe niż 8 znaków, których definiowanie w pliku .are jest już nagminne. Lepiej więc z zasady stosować polecenie wymiany wszystkich 32 znaków, niż naciąć się przypadkiem, że jednak ktoś ich użył więcej.

32 znaki to niby maksymalna ilość dla Script Name i w większości sytuacji gra poprawnie tak długi ciąg rozpozna. Z wyjątkiem, że postać zginęła, co powoduje, że jeśli będziemy sprawdzać w skryptach czy postać zginęła np. Dead('xxx'), to nie możemy użyć więcej niż 18 znaków. Najlepiej przyjąć ogólną zasadę max. 18 aby się nie zakręcić.
Dlaczego 18? Tu w grę wchodzi kolejna kwestia silnika gry, czyli najzwyklejsza zmienna globalna, na którą oczywiście też przewidziano 32 bajty. A jak silnik rozpoznaje, że ktoś "wyciągnął kopyta"? Ano tworzy zmienną globalną o nazwie SPRITE_IS_DEADXXX i nadaje jej wartość 1. Te 3 iksy to nasze DV postaci. Skoro zmienna globalna ma maksymalnie 32 znaki, a jej częścią składową jest zawsze SPRITE_IS_DEAD, złożone z 14 znaków, to na DV tak naprawdę zostaje tylko 18 znaków. Oczywiście zmienna SPRITE_IS_DEAD nie musi mieć koniecznie wartości tylko 0 lub 1, również wyższe, co pozwala np. zliczać śmierci.

Edit:
W zasadzie to powinienem był napisać, że podnosi wartość o 1, a nie nadaje 1 i to właśnie pozwala na zliczanie.
Podziękuj autorowi tego posta
 
 
Więcej szczegółów
Za tę wypowiedź podziękowali:
Tuldor88
Tuldor88 
Uczeń Gonda
Dziki kurczak zagłady


Wiek: 29
Posty: 1748
Podziękowania: 128/135
Wysłany: 2015-01-25, 15:43   

4) Uwag kilka odnośnie komend *.TP2 cd:

b) edycja plików 2DA


W grze sporo rzeczy zapisane jest w plikach 2DA - tabelkach odpowiadających np za to ile reputacji stracimy mając jej x i zabijajac niewinnego, albo jaką kwotę musimy ofiarować w świątyni by podnieść reputację.
Pełny spis standardowo mozemy sprawdzić na iesdp. Pytanie jak mozna owe tabelki nadpisać by wprowadzić zmiany? Zasadniczo mamy dwie opcje:
- tworzymy własną tabelkę, wsadzamy ją w pliki moda i wrzucamy potem do gry co jest mało eleganckie
- nadpisujemy wybrane komórki w tabelce jaka już w grze istnieje co zmniejsza szansę na niekompatybilność z innymi modami i jest o wiele lepszym rozwiazaniem.

By przeprowadzić to drugie używamy następującej komendy:
Cytat:
COPY_EXISTING
~nazwa_pliku.2DA~ ~override/nazwa_pliku.2DA~
SET_2DA_ENTRY numer_wiersza numer_kolumny ilość_kolumn_w tabelki ~nowa_wartość~
(...)
BUT_ONLY_IF_IT_CHANGES
standardowo numerowanie w pozycjach numer_wiersza i numer_kolumny zaczynamy od 0.

Na przykład: repstart.2da to tabelka odpowiadajaca za początkową reputację w zależności od tego jaki mamy charakter postaci: http://gemrb.org/iesdp/fi...ob/repstart.htm
wyglada następujaco:
Cytat:

________ kolumna_nr0 kolumna_nr1
wiersz_nr0 VALUE
wiersz_nr1 L_G ______ 12
wiersz_nr2 N_G ______ 11
wiersz_nr3 C_G ______ 11
wiersz_nr4 L_N ______ 10
wiersz_nr5 N_N ______ 10
wiersz_nr6 C_N ______ 10
wiersz_nr7 L_E _______ 9
wiersz_nr8 N_E _______ 9
wiersz_nr9 C_E _______ 8
jeśli w naszym pliku *.TP2 wstawimy takie coś:
Cytat:
COPY_EXISTING
~REPSTART.2DA~ ~override/REPSTART.2DA~
SET_2DA_ENTRY 1 1 2 ~11~
SET_2DA_ENTRY 9 1 2 ~9~
BUT_ONLY_IF_IT_CHANGES
to zmienimy dwie wartości w pliku REPSTART.2DA i będzie on wyglądać tak:
Cytat:

VALUE
L_G ______ 11
N_G ______ 11
C_G ______ 11
L_N ______ 10
N_N ______ 10
C_N ______ 10
L_E _______ 9
N_E _______ 9
C_E _______ 9
Dlaczego? Bo zmieniliśmy wartość wiersza nr1 w kolumnie nr1 na 11, a wiersza nr9 w kolumnie nr1 na 9. Mamy dwie kolumny (nr0 i nr1) dlatego w komendzie występuje 2.
_________________
Heinrich Heine napisał/a:
Sen jest dobrą rzeczą, śmierć jeszcze lepszą, ale najlepiej byłoby wcale się nie narodzić.
Alvarez o modowaniu napisał/a:
Może przytoczę twierdzenie Liberty'ego, które jakoś tak idzie: planujesz jakiś projekt, wyznacz sobie termin, pomnóż potrzebny czas przez 2 a i tak nie zdążysz.

Wybrane fragmenty banterów:
Edwin napisał/a:
-Phi! Porównywać mnie do jakiegoś podrzędnego nekromanty! (Stanowczo na zbyt wiele sobie pozwala, muszę pokazać mu gdzie jego miejsce.) Prawdopodobnie przemawia przez ciebie zwykła zazdrość. Wy, maluczcy macie tendencje do zawiści wobec tych, którzy was przerastają. Ja zaś czynię to nie tylko talentem ale i wzrostem, karzełku.
-*Posłał Edwinowi szeroki uśmiech przemawiając serdecznym tonem* Jeszcze raz nazwiesz mnie „karzełkiem” a utnę ci na dole coś niezwykle małego, co może jednak mimo wszystko być ci drogie. Gdy zaś chodzi o te dyrdymały o talencie... znów przypominasz mojego żałosnego, byłego towarzysza...
Minsc napisał/a:
-Niebywałe, że ten chomik jeszcze oddycha. Znajdując się nieco bliżej ciebie wielkoludzie na pewno zaniechałbym tej czynności, powiedz, uważasz że pranie onuc urąga twej męskości, czy po prostu lubisz informować wrogów zapaszkiem o tym, iż się do nich zbliżasz?
-Boo być może jest niewielki Montaronie, ale jest też o wiele silniejszy niż się zdaje. A to, co czujesz to zapach prawdziwego mężczyzny, który przykryje każdy odór zła, na jaki trafi, co nie, Boo?.
Viconia napisał/a:
-Mmm... wciąż robisz wrażenie Viconio, moja ty hebanoskóra kusicielko. Zdajesz sobie sprawę jak działasz na otoczenie, prawda?
-Oczywiście samcze, dzięki temu jalukul, mężczyźni tacy jak ty – myślący kroczem zamiast głową – stają się łatwiejsi w kontrolowaniu

-cała prawda o Imoen :P
  
Podziękuj autorowi tego posta
 
 
 
Tuldor88 
Uczeń Gonda
Dziki kurczak zagłady


Wiek: 29
Posty: 1748
Podziękowania: 128/135
Wysłany: 2015-08-21, 14:38   

c) Edycja skryptów już w grze istniejących

W przypadku plików .bcs (skryptów lokacji, potworów itp) można dokonywać nadpisania już istniejących bloków w celu zmiany ich działania. Często jest to wygodniejsze i bardziej eleganckie niż proste dorzucenie nowego bloku - nie zmusza to też gry do tego by kilkukrotnie sprawdzać dane parametry wiec wpływa na optymalizację moda.... graczowi zaś zaoszczędza głupich sytuacji gdy musiałby się drapać po głowie i myśleć "o co tu u diabła chodzi?".

Zmiany dokonuje się prosta komendą przy pomocy REPLACE TEXTUALLY:
Cytat:
COPY_EXISTING ~nazwa_pliku.BCS~ ~override/nazwa_pliku.BCS~
DECOMPILE_BCS_TO_BAF
REPLACE_TEXTUALLY ~stara_wartosć~ ~nowa_wartość~
COMPILE_BAF_TO_BCS
BUT_ONLY_IF_IT_CHANGES
I tak przykłady:

- W grze (BG1) spotykamy tak zwane "pułapki reputacji" wyzwalacze jakie powodują, iż po wejściu na nie sprawdzana jest reputacja drużyny, jeśli jest ona niska zostanie stworzony oddział plomiennej pieści albo łowca nagród. By pozbyć się tego w evil modzie mogłem albo usunąć całe wyzwalacze (mniej eleganckie i potencjalnie powodujące konflikty z innymi modami) albo nadpisać istniejacy plik .bcs jaki do wyzwalaczy był przypisany - te pliki to ACTBOUN.BCS (generuje łowców nagród w Nashkel) i ACTFLAM.BCS (generuje patrol płomiennej pieści w Beregoście, Wrotach itd). Dzięki dodaniu do moda w TP2 dwóch komend:
Cytat:
COPY_EXISTING ~ACTBOUN.BCS~ ~override/ACTBOUN.BCS~
DECOMPILE_BCS_TO_BAF
REPLACE_TEXTUALLY ~OR(6)[%LNL%%MNL%%TAB% ]*ReputationLT(Player1,4)[%LNL%%MNL%%TAB% ]*ReputationLT(Player2,4)[%LNL%%MNL%%TAB% ]*ReputationLT(Player3,4)[%LNL%%MNL%%TAB% ]*ReputationLT(Player4,4)[%LNL%%MNL%%TAB% ]*ReputationLT(Player5,4)[%LNL%%MNL%%TAB% ]*ReputationLT(Player6,4)[%LNL%%MNL%%TAB% ]*!StateCheck(LastTrigger,STATE_INVISIBLE)[%LNL%%MNL%%TAB% ]*!StateCheck(LastTrigger,STATE_IMPROVEDINVISIBILITY)~ ~False()~
COMPILE_BAF_TO_BCS
BUT_ONLY_IF_IT_CHANGES

COPY_EXISTING ~ACTFLAM.BCS~ ~override/ACTFLAM.BCS~
DECOMPILE_BCS_TO_BAF
REPLACE_TEXTUALLY ~OR(6)[%LNL%%MNL%%TAB% ]*ReputationLT(Player1,3)[%LNL%%MNL%%TAB% ]*ReputationLT(Player2,3)[%LNL%%MNL%%TAB% ]*ReputationLT(Player3,3)[%LNL%%MNL%%TAB% ]*ReputationLT(Player4,3)[%LNL%%MNL%%TAB% ]*ReputationLT(Player5,3)[%LNL%%MNL%%TAB% ]*ReputationLT(Player6,3)[%LNL%%MNL%%TAB% ]*!StateCheck(LastTrigger,STATE_INVISIBLE)[%LNL%%MNL%%TAB% ]*!StateCheck(LastTrigger,STATE_IMPROVEDINVISIBILITY)~ ~False()~
COMPILE_BAF_TO_BCS
BUT_ONLY_IF_IT_CHANGES
Skrypty dalej istnieją ale w każdym z nich bloki zawierajace wymagania do odpalenia spotkania zostały zastąpione przez tiggerem "False()" więc nigdy się nie uaktywnią. Gdyby jakiś mod dopisywał do ww skryptów nowe bloki zawierajace inne warunki nie zostanie to zmienione więc kompatybilność będzie zachowana, prawda ze wygodne?

Zapewne zastanowiło was co oznacza w linijkach zwrot " [%LNL%%MNL%%TAB% ]* " prawda? To nic innego jak "enter" który dla różnych wersji systemu moze być inaczej zapisany... powyższa komenda 'nie czyta' tego co jest wewnątrz nawiasów kwadratowych dlatego trzeba zwrócic na to szczególną uwagę jak wskazuje przykład nr 2:

W Życzeniu jakie rozgrywa sie na terenie Targowa (lokacja AR2000, skrypt lokacji AR2000.BCS) dodano cutscenkę. Niestety jej akcja rozgrywa się w miejscu w którym spawnuje się złodziejka (trthf01.cre) ostrzegajaca nas przed rakszasą Iltafer. Załóżmy, że nie chcemy przenosić cutscenki bo zajmuje ona więcej miejsca niż samotna złodziejka. Moglibyśmy dodać do skryptu lokacji blok jaki by złodziejkę przenosił po zespawnowaniu z punktu A do B ale byłoby to mało eleganckie.. baa, jeśli gracz miałby jakimś cudem widok na danym miejscu to Itona zespawnowałaby się (oryginalny blok skryptu) a potem w ułamku sekundy znikła i pojawiła sie gdzie indziej (nowy blok), głupota prawda? W takim razie po prostu ją przeniesiemy...

Oryginalny blok w skrypcie lokacji AR2000.bcs spawnujący złodziejkę to
Cytat:
IF
Global("zahraajob","GLOBAL",1)
Global("didthis2","AR2000",0)
THEN
RESPONSE #100
SetGlobal("didthis2","AR2000",1)
CreateCreature("trthf01",[3771.75],0)
wiec moglibyśmy po prostu zmienić ostatnią linijkę... no to wpisujemy...
Cytat:
COPY_EXISTING ~AR2000.BCS~ ~override/AR2000.BCS~
DECOMPILE_BCS_TO_BAF
REPLACE_TEXTUALLY ~CreateCreature("trthf01",[3771.75],0)~ ~CreateCreature("trthf01",[4000.215],0)~
COMPILE_BAF_TO_BCS
BUT_ONLY_IF_IT_CHANGES
Odpalamy Infinity explorer i... skrypt nie uległ zmianie! Dlaczego? Tak jak pisałem weidu w przypadku gdy damy mu całą komendę pominie nawiasy kwadratowe a tylko jego komenda zmieniała, peszek prawda? Znaczy nie ma możliwosci zmiany pozycji do spawnu? Ależ jest, musimy tylko zapisać to tak by nie mieć u siebie nawiasu kwadratowego... np tak:
Cytat:
COPY_EXISTING ~AR2000.BCS~ ~override/AR2000.BCS~
DECOMPILE_BCS_TO_BAF
REPLACE_TEXTUALLY ~3771.75~ ~4000.215~
COMPILE_BAF_TO_BCS
BUT_ONLY_IF_IT_CHANGES
Jeśli dodamy taki wpis w TP2 zmiana zostanie wprowadzona i wszystko zadziała jak trzeba. Niemniej doradzam używać takiego zapisu tylko wtedy gdy musimy - po upewnieniu się, że inne bloki nie zawierają takich samych współrzędnych bo inaczej też by uległy zmianie... chociaż z drugiej strony kto by spawnował innego NPC drugiemu 'na głowie":D ?
_________________
Heinrich Heine napisał/a:
Sen jest dobrą rzeczą, śmierć jeszcze lepszą, ale najlepiej byłoby wcale się nie narodzić.
Alvarez o modowaniu napisał/a:
Może przytoczę twierdzenie Liberty'ego, które jakoś tak idzie: planujesz jakiś projekt, wyznacz sobie termin, pomnóż potrzebny czas przez 2 a i tak nie zdążysz.

Wybrane fragmenty banterów:
Edwin napisał/a:
-Phi! Porównywać mnie do jakiegoś podrzędnego nekromanty! (Stanowczo na zbyt wiele sobie pozwala, muszę pokazać mu gdzie jego miejsce.) Prawdopodobnie przemawia przez ciebie zwykła zazdrość. Wy, maluczcy macie tendencje do zawiści wobec tych, którzy was przerastają. Ja zaś czynię to nie tylko talentem ale i wzrostem, karzełku.
-*Posłał Edwinowi szeroki uśmiech przemawiając serdecznym tonem* Jeszcze raz nazwiesz mnie „karzełkiem” a utnę ci na dole coś niezwykle małego, co może jednak mimo wszystko być ci drogie. Gdy zaś chodzi o te dyrdymały o talencie... znów przypominasz mojego żałosnego, byłego towarzysza...
Minsc napisał/a:
-Niebywałe, że ten chomik jeszcze oddycha. Znajdując się nieco bliżej ciebie wielkoludzie na pewno zaniechałbym tej czynności, powiedz, uważasz że pranie onuc urąga twej męskości, czy po prostu lubisz informować wrogów zapaszkiem o tym, iż się do nich zbliżasz?
-Boo być może jest niewielki Montaronie, ale jest też o wiele silniejszy niż się zdaje. A to, co czujesz to zapach prawdziwego mężczyzny, który przykryje każdy odór zła, na jaki trafi, co nie, Boo?.
Viconia napisał/a:
-Mmm... wciąż robisz wrażenie Viconio, moja ty hebanoskóra kusicielko. Zdajesz sobie sprawę jak działasz na otoczenie, prawda?
-Oczywiście samcze, dzięki temu jalukul, mężczyźni tacy jak ty – myślący kroczem zamiast głową – stają się łatwiejsi w kontrolowaniu

-cała prawda o Imoen :P
Podziękuj autorowi tego posta
 
 
 
Więcej szczegółów
Za tę wypowiedź podziękowali:
K4thos, L`f
K4thos 
Uczeń Gonda


Wiek: 30
Posty: 334
Podziękowania: 53/30
Wysłany: 2015-08-21, 15:12   

Cytat:
Odpalamy Infinity explorer i... skrypt nie uległ zmianie! Dlaczego? Tak jak pisałem weidu w przypadku gdy damy mu całą komendę pominie nawiasy kwadratowe a tylko jego komenda zmieniała, peszek prawda? Znaczy nie ma możliwosci zmiany pozycji do spawnu? Ależ jest, musimy tylko zapisać to tak by nie mieć u siebie nawiasu kwadratowego... np tak:

Nawias kwadratowy to znak specjalny regexp. Dlatego weidu go nie rozpoznał. Nawias okrągły to też znak specjalny ale nie trzeba go tak oznaczać, bo weidu przyjęło konwencję traktowania go normalnie - odwrotnie niż w regexp żeby użyć znaku specjalnego nawias okrągły (zapamiętywanie znaków w nim zamkniętych) w kodzie musiałbyś dać \( \). Poprawny kod z przykładu powinien wyglądać tak:
Kod:
REPLACE_TEXTUALLY ~CreateCreature("trthf01",\[3771.75\],0)~ ~CreateCreature("trthf01",[4000.215],0)~


tam gdzie używasz:
Kod:
DECOMPILE_BCS_TO_BAF
//kod
COMPILE_BAF_TO_BCS


lepiej to zastąpić przez:
Kod:
DECOMPILE_AND_PATCH BEGIN
//kod
END

bo mniej pisania, działa też z plikami DLG, a i pierwsza opcja jest w readme weidu oflagowana jako DEPRECATED (choć działa prawidłowo)

Reszta w porządku (choć jak widzę BUT_ONLY_IF_IT_CHANGES to zastanawia mnie co Weimar brał tworząc zasady Weidu. Na szczęście z czasem powstał skrót BUT_ONLY)

edyta: dla czytelności kodu warto ten enter dać do osobnej zmiennej:
Kod:
OUTER_SPRINT ~newline~ ~%WNL%%LNL%%MNL%%TAB% ~

wtedy już w całym pliku tp2 możesz jej używać tak:
Kod:
[%newline%]*

powyższe znajdzie dowolna liczbę enterów, spacji, tabulacji pomiędzy tym co dasz przed nim i po nim. Gwiazdka na końcu oznacza dopasuj zero lub więcej razy. Jeśli chcesz dopasować co najmniej raz to zmień * na +. A jeśli dokładnie raz to nie wstawiaj żadnego znaku po nawiasie.

eduta2: poradnik wyrażeń regularnych (tylko pierwszy punkt): http://jbetiuk.kis.p.lodz.pl/download/lab_B.pdf
_________________
"Podwładny winien przed obliczem przełożonego mieć wygląd lichy i durnowaty tak, aby swoim pojmowaniem istoty rzeczy przełożonego nie peszyć"
Ukaz Cara Rosji Piotra I z 9 grudnia 1708 roku.
  
Podziękuj autorowi tego posta
 
 
Więcej szczegółów
Za tę wypowiedź podziękowali:
Tuldor88, L`f
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  
Powered by phpBB modified by Przemo © 2003 phpBB Group