Aktywacja bez wyzwalacza

Moderator: Inkwizytor

Awatar użytkownika
SaS TrooP
Posty: 1586
Rejestracja: 30 października 2008, 17:30
ID Steam:
ID gracza: 0
Lokalizacja: Wodzisław Śl.
Kontakt:

Aktywacja bez wyzwalacza

Post autor: SaS TrooP »

Utknąłem w mojej misji Evac Point :cry:

I to chyba na ździebko głupiej sprawie, bo nie wiem jak zmusić do aktywacji jakiś skrypt bez wyzwalacza, WP etc.

W misji będzie mnóstwo questów. Wyzwalacz dla każdego z nich zlaguje grę każdemu. Chcę, by możliwa akcja włączała się gdy main hero podejdzie do zleceniodawcy. Jak aktywować to inaczej niż wyzwalaczem i WP?
Awatar użytkownika
aszek
Posty: 133
Rejestracja: 11 lipca 2008, 06:17
ID Steam:
Numer GG: 8568774
ID gracza: 0

Re: Aktywacja bez wyzwalacza

Post autor: aszek »

Zrób jeden skrypt, który obsłuży wszystkie questy dzięki globalnym flagą jakie będziesz w locie ustwiać.

Np, w WP dasz:

Kod: Zaznacz cały

stageFlags = stageFlags + ["quest01Begin"]
W głownym skrypcie questów (zapętlonym) sprawdzasz:

Kod: Zaznacz cały

#process
? ("quest01Begin" in stageFlags) and not ("quest01Completed" in stageFlags)  and not ("quest01Active" in stageFlags) : [] exec "processQuest01.sqs";
~coś
goto "process"

w np, 'processQuest01.sqs'

Kod: Zaznacz cały

stageFlags = stageFlags + ["quest01Active"];

@blablabla... @poszłem, @znalazłem, @przyniosłem, @zastrzeliłem - ok!

stageFlags = stageFlags + ["quest01Completed"] - ["quest01Active"];

I zawsze zewszad wiesz czy quest się rozpoczoł, czy trwa i czy się już skończył.
"True glory consists in doing what deserves to be written, in writing what deserves to be read." - Pliny The Elder
Awatar użytkownika
SaS TrooP
Posty: 1586
Rejestracja: 30 października 2008, 17:30
ID Steam:
ID gracza: 0
Lokalizacja: Wodzisław Śl.
Kontakt:

Re: Aktywacja bez wyzwalacza

Post autor: SaS TrooP »

Hmm, średnio to rozumiem :mrgreen:

Ale flagę masz na myśli normalną flagę, tylko unoszącą się w powietrzu? I nie może być żadnego WP ani wyzwalacza.
Awatar użytkownika
aszek
Posty: 133
Rejestracja: 11 lipca 2008, 06:17
ID Steam:
Numer GG: 8568774
ID gracza: 0

Re: Aktywacja bez wyzwalacza

Post autor: aszek »

Flaga to zmienna, która może być 'true' lub 'false'. Nie chodzi o obiekt w edytorze, tylko o zmienną...

'moja_zmienna' = true <- zmienna ma wartość 'prawda'
'moja_zmienna' = false <- zmienna ma wartość 'fałsz'

np: 'moja_zmienna' = alive aP

'moja_zmienna' - > true -> aP żyje
'moja_zmienna' - > false -> aP nie żyje

Nic nie stoi na przeszkodzie mieć wiele takich zmiennych:

'aP_żyje' = alive aP
'coś_się_zdarzyło' = true
'coś_co_się_nie_powinno_zdarzyć' = false

Jeśli masz wiele zmiennych, to zamiast pamiętać jak się która zmienna nazywa, aby testować jakiś warunek, np:
warunek: ((aP distance ktoś) < 5) and (coś_się_zdarzyło) and not (coś_co_się_nie_powinno_zdarzyć)
aktywacja: "1" objStatus "DONE"

Możesz zrobić jedną zmianną, która będzie tablicą takich wartości:

moja_tablica_zdarzeń = ["coś_się_zdarzyło", "coś_co_się_nie_powinno_zdarzyć"]

zakładam, że każdy quest zechcesz sprawdzić:

czy quest się rozpoczoł ?
czy quest jest aktywny ?
czy quest już się zakończył ?

Było by głupio, gdyby po misji okazało się że podejdziesz do zleceniodawcy a on na to: 'zrób to' (ponownie).
Może będziesz nawet chciał osiągnąć pewną chronologię zdarzeń (fabuła):
np, tylko jeśli quest_pierwszy_się_zakończył to można_wziąść_następny

Dla każdego questu potrzebujesz takiej flagi:
'quest_się_rozpoczoł'

Kiedy warunki pozwalają (aP jeszcze nie podjoł się questu, aP nie jest w trakcie jego realizacji, aP questu nie zakończył) to:
na gorąco tworzysz nową zmienna:

'quest_się_rozpoczoł' = 'jakaś wartość' (boolean/string/float/array), np:
'quest_się_rozpoczoł' = ["moje parametry dla exec", "godzina", "coś tam", 15645]
to co przypiszesz do 'quest_się_rozpoczoł' nie ma zanczenia, ważne aby dodać tą zmianną do tablicy.

więc dodajesz do tablicy:
moja_tablica_zdarzeń = moja_tablica_zdarzeń + [quest_się_rozpoczoł]

w skrypcie rozpoznasz, że zminna znalazła się w tablicy:
(quest_się_rozpoczoł in moja_tablica_zdarzeń)
i wykonasz jakiś kod:
[quest_się_rozpoczoł] exec "quest_się_rozpoczoł.sqs"

operator 'in' testuje czy "coś" jest w "czymś"

w kodzie który obsluguje quest, kontrolujesz jego przebieg, np:

jakieś warunki potrzebne do jego zakończenia
czekasz na coś
gadasz z kimś przez radio
i cokolwiek chcesz

kiedy warunki potrzebne do zakończenia questu masz spełnione, to usuwasz z tablicy zmienną, która go (szczegółowo) opisuje:

moja_tablica_zdarzeń = moja_tablica_zdarzeń - [quest_się_rozpoczoł]

jednocześnie, żeby nie dopuścić do absurdalnych sytuacji dodajesz flagę:

moja_tablica_zdarzeń = moja_tablica_zdarzeń + [quest_się_zakończył]

W skrypcie, w warunkach który pozwala na odpalenie skryptu dodatkowo testujesz:
jeśli NIE (quest_się_zakończył in moja_tablica_zdarzeń) to wykonaj kod,

czyli biorąc pod uwagę warunek poprzedni:
not (quest_się_zakończył in moja_tablica_zdarzeń) and (quest_się_rozpoczoł in moja_tablica_zdarzeń) : to wykonaj kod,

exec tworzy wątek, więc ze skryptu do zakończenia questu wychodzić nie musisz.
"True glory consists in doing what deserves to be written, in writing what deserves to be read." - Pliny The Elder
Awatar użytkownika
SaS TrooP
Posty: 1586
Rejestracja: 30 października 2008, 17:30
ID Steam:
ID gracza: 0
Lokalizacja: Wodzisław Śl.
Kontakt:

Re: Aktywacja bez wyzwalacza

Post autor: SaS TrooP »

Dobra, zaczaiłem tworzenie zmiennych, ale nadal nie rozumiem jednej rzeczy: jeśli flaga to zmienna, to jak aktywować jakiś skrypt questy czy tablicę zmiennych bez WP/triggera? Skrypt, z tego co wiem, nie może sam siebie uruchomić, tak z zewnątrz. Możliwe, że tutaj to pisałeś, ale umyka mi to :|

Aha, tylko jeszcze chyba trzeba wziąć pod uwagę fakt, że jest używana zmienna, która odpowiada za kasę. Tutaj masz przykład questu testowego, który zrobiłem by sprawdzić, czy skrypt działa.

Kod: Zaznacz cały

_moneyernt=500

titlecut [" ","BLACK OUT",1]
TitleText["QUEST COMPLETE: ELIMINATE TARGET", "PLAIN"]
~1
titlecut [" ","BLACK IN",1]
playercounter=playercounter+_moneyernt
hint Format["You got him! Cash is yours!", playercounter]
exit
Osobny skrypt i, o zgrozo, wyzwalacz odpowiada za informację o skrypcie, ten skrypt jest i zakończeniem, i aktywacją zarazem.
Awatar użytkownika
Trance
Posty: 1090
Rejestracja: 20 maja 2007, 19:06
ID Steam:
ID gracza: 0

Re: Aktywacja bez wyzwalacza

Post autor: Trance »

Nie wiem po co w przedostatniej linijce wstawiasz zmienna, skoro i tak z niej nie korzystasz.
Obrazek
Awatar użytkownika
SaS TrooP
Posty: 1586
Rejestracja: 30 października 2008, 17:30
ID Steam:
ID gracza: 0
Lokalizacja: Wodzisław Śl.
Kontakt:

Re: Aktywacja bez wyzwalacza

Post autor: SaS TrooP »

Mówisz o playercounter? To jest stan pieniędzy gracza. W tym wypadku jego stan + stan zarobiony na tym queście.

EDIT: Mam pomysł. Aszek, pomógłbyś mi napisać jeden skrypt oparty na jednym wyzwalaczu, który aktywuje inne skrypty przez samego siebie?
Awatar użytkownika
aszek
Posty: 133
Rejestracja: 11 lipca 2008, 06:17
ID Steam:
Numer GG: 8568774
ID gracza: 0

Re: Aktywacja bez wyzwalacza

Post autor: aszek »

Nigdy nie powiedziałem, że skryptu nie musisz odpalić.

Ale zamiast mieć 100 wyzwalaczy (100 wątków i 100x większy lag) i mnóstwo synchronizacji i trudne do ogarnięcia warunki w WP - tworzysz jeden skrypt, który odpalasz RAZ (początek misji). Ten skrypt jest czymś w rodzaju 'rozdzielacza', który działa CIĄGLE. Wykrywa warunki i przekierowywuje dalsze przetwarzanie w konkretne miejsce (taki super-zaawansowany wyzwalacz). Możesz mieć jeden duży skrypt, króry będzie 'rozdzielaczem' i gdzieś tam (goto "tu", goto "tam") będzie kontrolował questy, albo dla każdego questu utwórz nowy (mały) skrypcik, króry skrypt główny we właściwym momencie odpali.

Na początek narysuj sobie diagram swojej fabuły. Jak zadarzenia i jakie postacie, co się z czym łączy, jakie są warunki, itd. Dla każdego questu utwórz kawałek kodu, który rozpozna to o czym wcześniej pisałem (start/koniec questu). Te tittletext to najmniejsze zmartwienie ;)

Gdzieś w skrypcie możesz sprawdzać czy warunki pozwalająca na rozpoczęcie questu są spełnione (substutut WP/wyzwalacza), i dodać odpowiednią flagę. Pętla skryptu to wykryje i pokieruje rozwojem wydarzeń zgodnie z Twoją fabułą.

Sorki, że tłumacze tak abstrakcyjnie. Narazie bawię się kontrolkami, ale w wolnej chwili mogę Ci napisać i wrzucić przykład takiego mechanizmu. Tylko podrzuć pomysł na krótką fabułe (ze dwa nieliniowe questy.
"True glory consists in doing what deserves to be written, in writing what deserves to be read." - Pliny The Elder
Awatar użytkownika
Trance
Posty: 1090
Rejestracja: 20 maja 2007, 19:06
ID Steam:
ID gracza: 0

Re: Aktywacja bez wyzwalacza

Post autor: Trance »

Mówisz o playercounter? To jest stan pieniędzy gracza. W tym wypadku jego stan + stan zarobiony na tym queście.
Ja wiem co to oznacza, chodzi mi jedynie o to, ze wywołujesz funkcje hint, i podajesz dodatkowo tą zmienną, ale w tym hincie nigdzie z niej nie korzystasz
Obrazek
Awatar użytkownika
SaS TrooP
Posty: 1586
Rejestracja: 30 października 2008, 17:30
ID Steam:
ID gracza: 0
Lokalizacja: Wodzisław Śl.
Kontakt:

Re: Aktywacja bez wyzwalacza

Post autor: SaS TrooP »

Hmm, myślałem o czymś w ten deseń. UWAGA: To ma być tylko pokaz o co mi chodzi, piszę z pamięci i wykorzystam nieużywane wcześniej przeze mnie wartości, będzie kupa błędów ;)

Kod: Zaznacz cały

główny_quest_skrypt.sqs

Story_quest_1 = ["player distance guide < 5","Story_quest_1_Complete = false"] :then player addaction ["Save Leon from bandits","Story_quest_1.sqs"];

Story_quest_2 = ["Player distance guide < 5","Story_quest_1_Complete = true"] :then player addaction ["Check the farm","Story_quest_2.sqs"];

Czy dobrze myślę?
Awatar użytkownika
aszek
Posty: 133
Rejestracja: 11 lipca 2008, 06:17
ID Steam:
Numer GG: 8568774
ID gracza: 0

Re: Aktywacja bez wyzwalacza

Post autor: aszek »

Tak, kierunek jest dobry, brawo !

W którymś momencie jeszcze stwierdzisz, że zmienne w jednej tablicy są bardziej skalowalną architekturą ;)... Używanie warunków co trochę Ci się w końcu znudzi... albo zamęczy.
"True glory consists in doing what deserves to be written, in writing what deserves to be read." - Pliny The Elder
ODPOWIEDZ

Wróć do „Edytor - tworzenie misji, skrypty oraz programowanie”