Page 1 of 1

Kłopot z "if then"

Posted: Fri Sep 10, 2010 4:55 pm
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?

Re: Kłopot z "if then"

Posted: Fri Sep 10, 2010 5:05 pm
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.

Re: Kłopot z "if then"

Posted: Fri Sep 10, 2010 5:27 pm
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

Re: Kłopot z "if then"

Posted: Fri Sep 10, 2010 5:34 pm
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...

Re: Kłopot z "if then"

Posted: Fri Sep 10, 2010 6:23 pm
by julaz1994
Mógłbyś to zobrazować, podać przykład, bo trochę się pogubiłem :P

Re: Kłopot z "if then"

Posted: Fri Sep 10, 2010 6:30 pm
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

Re: Kłopot z "if then"

Posted: Fri Sep 10, 2010 8:01 pm
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');

Re: Kłopot z "if then"

Posted: Sat Sep 11, 2010 10:41 am
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 ' ').

Re: Kłopot z "if then"

Posted: Sat Sep 11, 2010 11:05 am
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...

Re: Kłopot z "if then"

Posted: Sat Sep 11, 2010 11:20 am
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');

Re: Kłopot z "if then"

Posted: Sat Sep 11, 2010 11:26 am
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ąć.

Re: Kłopot z "if then"

Posted: Sat Sep 11, 2010 11:35 am
by Moonstrider
Absolutnie wszystko działa? To z Rand i Nearest też?

Re: Kłopot z "if then"

Posted: Sat Sep 11, 2010 12:54 pm
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.

Re: Kłopot z "if then"

Posted: Sat Sep 11, 2010 12:57 pm
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.

Re: Kłopot z "if then"

Posted: Sat Sep 11, 2010 4:44 pm
by julaz1994
Ok, teraz dzięki sposobowi Gwrhksha działa mi również Rand :) Serdecznie dziękuje obu za pomoc. Temat można zamknąć.