Kłopot z "if then"

Wszelkie pytania na temat SAIL'a i modowania OW.
Locked
User avatar
julaz1994
Soldier level 3
Soldier level 3
Posts: 76
Joined: Wed Aug 18, 2010 9:52 am
Contact:

Kłopot z "if then"

Post by julaz1994 »

Witam, mam problem z tą linijką kodu (Ostatnio zacząłem bawić się w te całe if then) :

Code: Select all

every 0$01 trigger IsDead(art1) do
begin

if IsOK(alb) then
DialogueOn;
enable(01);
Say(alb,'alb9');
SetAreaMapShow(exet,1);
SetAreaMapShow(trees,1);
CenterNowOnXY(65,9);
Say(alb,'alb10');
DialogueOff;

if IsDead(alb) then
DialogueOn;
enable(02);
Say(ben,'ben16');
Say(ert1,'ert4');
Say(ben,'ben17');
DialogueOff;
case query('dialog1') of
1: begin
SetAreaMapShow(trees,1);
SetAreaMapShow(exet,1);

end;
end;
end;
Po aktywowaniu every, oba "if" mi się aktywują (najpierw pierwsza, a potem druga) niezależnie od tego, czy postać o idencie alb żyje czy nie żyje. Jakieś sugestie, gdzie tym razem popełniłem błąd?
Pozdrowienia dla Mateusza- oby drewno, które codziennie rąbiesz nigdy Ci się nie skończyło ;]
User avatar
Moonstrider
Soldier level 4
Soldier level 4
Posts: 110
Joined: Fri Nov 09, 2007 11:10 pm
Contact:

Re: Kłopot z "if then"

Post by Moonstrider »

Jeśli chcesz, żeby if zawierało więcej niż jedną instrukcję, to te instrukcje zamykasz w

Code: Select all

Begin
instrukcje;
end;
Inaczej domyślnie if będzie zawierało tylko jedną strukcję następująą bezpośrednio po nim.

Pozatym te 2 ify możesz połączyć w 1:

Code: Select all

if IsOK(alb) then
Begin
DialogueOn;
enable(01);
Say(alb,'alb9');
SetAreaMapShow(exet,1);
SetAreaMapShow(trees,1);
CenterNowOnXY(65,9);
Say(alb,'alb10');
DialogueOff;
end //jak chcesz sprawdzić inne możliwości (dalsdzeif lub else) to nie dajesz jeszcze średnika
else
//if IsDead(alb) then - jak zostawisz samo else, to ten fragment wykona się w każdym przypadku innym niż wcześniejsze warunki ( = not IsOK(alb) ), czasami konieczne jest wstawienie tego drugiego warunku ( w tej właśnie postaci przed myślnikiem
Begin
DialogueOn;
enable(02);
Say(ben,'ben16');
Say(ert1,'ert4');
Say(ben,'ben17');
DialogueOff;
case query('dialog1') of
1: begin
SetAreaMapShow(trees,1);
SetAreaMapShow(exet,1);
end; //ten end zamyka begin przy case 1
end; // a ten blok if(bo ma średnik)
A na przyszłość: stosowanie w odpowiednich miejscach wcięć, spacji i wielkich liter znacznie zwiększa czytelność kodu, co, kiedy będziesz tworzył bardziej zaawansowane skrypty, okaże się niezbędne do jego zrozumienia.
Seek your own truth. Always.
User avatar
julaz1994
Soldier level 3
Soldier level 3
Posts: 76
Joined: Wed Aug 18, 2010 9:52 am
Contact:

Re: Kłopot z "if then"

Post by julaz1994 »

Wielkie dzięki, działa elegancko. BTW. może będziesz wiedział jak wprowadzić coś takiego jak losowy dialog (w sensie, że losowo z zakresu 5-6 osób ktoś wypowiada dany dialog)? Będę bardzo wdzięczny :D
Pozdrowienia dla Mateusza- oby drewno, które codziennie rąbiesz nigdy Ci się nie skończyło ;]
User avatar
Moonstrider
Soldier level 4
Soldier level 4
Posts: 110
Joined: Fri Nov 09, 2007 11:10 pm
Contact:

Re: Kłopot z "if then"

Post by Moonstrider »

Code: Select all

var losowy;  // deklarujesz lokalną zmienną pod jakimś every lub funkcją, ale przed beginem tego bloku
//gdzieś pod Begin tego bloku:
losowy=[ludzik1,ludzik2,...,ludzik6][Rand(1,6)]; //lita z identami wybranych do gadania ludzi, nie zapomnij zrandomizować (RandomizeAll; pod starting) wszystkie liczby w grze i SAILu
Możesz też np.: wybrać jednostkę najbliższą do innej jednostki lub jakiegoś punktu, o konkretnych umiejętnościach, etc...
Seek your own truth. Always.
User avatar
julaz1994
Soldier level 3
Soldier level 3
Posts: 76
Joined: Wed Aug 18, 2010 9:52 am
Contact:

Re: Kłopot z "if then"

Post by julaz1994 »

Mógłbyś to zobrazować, podać przykład, bo trochę się pogubiłem :P
Pozdrowienia dla Mateusza- oby drewno, które codziennie rąbiesz nigdy Ci się nie skończyło ;]
User avatar
Moonstrider
Soldier level 4
Soldier level 4
Posts: 110
Joined: Fri Nov 09, 2007 11:10 pm
Contact:

Re: Kłopot z "if then"

Post by Moonstrider »

Code: Select all

every 0$1 do
var losowy;
Begin
losowy=[lista ludzików][Rand(1,6)];
Say(losowy,'dialog');

Say(NearestUnitToUnit([lista dostępnych osób(np.: filter dla danej strony, nei zapomnij dodać że unit type to 1, czyli człowiek)],unit(do którego odległość sprawdzamy)),'dialog');
// z XY podobnie, zamiast porównywać odległość do unita, dajemy x,y
// różne ciekawe funkcje ( a właściwie wszystkie) można znaleźć w spisie funkcji SAILa, dstępnym również po polsku i z przykładami w wersji autorstwa zoNEa
Seek your own truth. Always.
User avatar
julaz1994
Soldier level 3
Soldier level 3
Posts: 76
Joined: Wed Aug 18, 2010 9:52 am
Contact:

Re: Kłopot z "if then"

Post by julaz1994 »

Naprawdę wielkie dzięki za pomoc, nawet nie wiesz, jak mi pomogłeś :P

// edit

przepraszam za offtopa, ale znowu coś nie pasi w tym SAILu.

pierwszy sposób Moonstiera (i pana Radzia) teraz w ogóle nie zaskakuje (sprawdzałem wri na wszelki wypadek). Oto kod

Code: Select all

every 3 do
var losowy;
begin
losowy=[trev, ert1, eng, woj1, woj2, wer][Rand(1,6)];
Say(losowy,'elo');
end;
z kolei drugi (nearest) wywala błąd do'nt match. Kod:

Code: Select all

Say(NearestUnitToUnit(filterallunits([[f_side,2],[f_type,1]])),ben,'eloelo');
Pozdrowienia dla Mateusza- oby drewno, które codziennie rąbiesz nigdy Ci się nie skończyło ;]
User avatar
Moonstrider
Soldier level 4
Soldier level 4
Posts: 110
Joined: Fri Nov 09, 2007 11:10 pm
Contact:

Re: Kłopot z "if then"

Post by Moonstrider »

W every dajesz czas jako <minuty>$<sekundy>; edit: nie wiem dlaczego, ale to nie działa. Jaką wersję patcha masz zainstalowaną?; edit2: Zapewne masz 1.11beta, więc należy winić Stu, że zmienił lokalizację pliku tekstowego - jest w katalogu z danym mapy, Texts.txt w formacie unicode. edit 3: muszę od nowa zainstalować ow, bo na 1.11 to się niewyobrżalne cuda dzieją, 2 razy mi zadziłało w powyższy sposób z kodem

Code: Select all

Starting
Begin
end;

every 0$3 do
Begin
Say([lu1,lu2,lu3,lu4,lu5,lu6][Rand(1,6)],'elo');
Wait(2);
Say(NearestUnitToUnit(filterallunits([[f_side,2],[f_type,1]]),ben),'elo');
Wait(5);
Say(ben,'lol');
end
, a teraz już nie chce...

Natomiast w 2. fragmencie masz '),ben' - prznosisz ten nawias z począku na koniec sekwencji, ponieważ dopiero wtedy będzie to argument funkcji NearestUnitToUnit, a teraz jest funkcji Say, która powinna mieć 2 arg - ludzik i sentencja, a z tym ma 3 i zamiast drugiego ma coś, co we wri nie istnieje( w dodatku bez ' ').
Last edited by Moonstrider on Sat Sep 11, 2010 11:23 am, edited 3 times in total.
Seek your own truth. Always.
User avatar
julaz1994
Soldier level 3
Soldier level 3
Posts: 76
Joined: Wed Aug 18, 2010 9:52 am
Contact:

Re: Kłopot z "if then"

Post by julaz1994 »

Ok, dzięki, ale zeby to jakoś wyglądało potrzebuję jeszcze kodu na coś takiego jak rozróżnianie, ponieważ chciałbym aby filterallunits było różne powiedzmy od identu arab, czyli do filterallunits zaliczamy wszystko oprócz jednej osoby bo mam coś takiego

Code: Select all

Say(ben,'ben16');
Say(NearestUnitToUnit(filterallunits([[f_side,2],[f_type,1]]diff ben),ben),'ert4');
Say(ben,'ben17');
ident ben wypowiada wszystkie trzy kwestie, a nie najbliższa jednostka...
Pozdrowienia dla Mateusza- oby drewno, które codziennie rąbiesz nigdy Ci się nie skończyło ;]
User avatar
Moonstrider
Soldier level 4
Soldier level 4
Posts: 110
Joined: Fri Nov 09, 2007 11:10 pm
Contact:

Re: Kłopot z "if then"

Post by Moonstrider »

Powinno to chyba wyglądać następująco:

Code: Select all

Say(ben,'ben16');
Say(NearestUnitToUnit(filterallunits([[f_side,2],[f_type,1]]) diff ben,ben),'ert4');
Say(ben,'ben17');
Seek your own truth. Always.
User avatar
julaz1994
Soldier level 3
Soldier level 3
Posts: 76
Joined: Wed Aug 18, 2010 9:52 am
Contact:

Re: Kłopot z "if then"

Post by julaz1994 »

No! Nareszcie wszystko elegancko działa. Stokrotne dzięki Moonstrider, nie wiem co bym zrobił gdyby nie ty :P Pozdrawiam

Można zamknąć.
Pozdrowienia dla Mateusza- oby drewno, które codziennie rąbiesz nigdy Ci się nie skończyło ;]
User avatar
Moonstrider
Soldier level 4
Soldier level 4
Posts: 110
Joined: Fri Nov 09, 2007 11:10 pm
Contact:

Re: Kłopot z "if then"

Post by Moonstrider »

Absolutnie wszystko działa? To z Rand i Nearest też?
Seek your own truth. Always.
User avatar
julaz1994
Soldier level 3
Soldier level 3
Posts: 76
Joined: Wed Aug 18, 2010 9:52 am
Contact:

Re: Kłopot z "if then"

Post by julaz1994 »

to znaczy, ten Rand nie działa w ogóle niezależnie od tego jaki dam every, ale jak powiedziałeś, zapewne problem leży w patchu.
Pozdrowienia dla Mateusza- oby drewno, które codziennie rąbiesz nigdy Ci się nie skończyło ;]
User avatar
Gwrhkhsh
Soldier level 6
Soldier level 6
Posts: 398
Joined: Fri May 21, 2010 5:56 pm
Location: Wrocław

Re: Kłopot z "if then"

Post by Gwrhkhsh »

Code: Select all

case Rand(1, 3) of
     1: Say(#jednostka1, 'tekst'); 2: Say(#jednostka2, 'tekst'); 3: #jednostka3, 'tekst'); end;
Spróbuj tego.
User avatar
julaz1994
Soldier level 3
Soldier level 3
Posts: 76
Joined: Wed Aug 18, 2010 9:52 am
Contact:

Re: Kłopot z "if then"

Post by julaz1994 »

Ok, teraz dzięki sposobowi Gwrhksha działa mi również Rand :) Serdecznie dziękuje obu za pomoc. Temat można zamknąć.
Pozdrowienia dla Mateusza- oby drewno, które codziennie rąbiesz nigdy Ci się nie skończyło ;]
Locked