Kłopot z "if then"

Wszelkie pytania na temat SAIL'a i modowania OW.
Cerrado
Benutzeravatar
julaz1994
Soldier level 3
Soldier level 3
Mensajes: 76
Registrado: Mi Aug 18, 2010 9:52 am
Contactar:

Kłopot z "if then"

Beitrag por julaz1994 »

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

Code: Alles auswählen

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 ;]
Benutzeravatar
Moonstrider
Soldier level 4
Soldier level 4
Mensajes: 110
Registrado: Fr Nov 09, 2007 11:10 pm
Contactar:

Re: Kłopot z "if then"

Beitrag por Moonstrider »

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

Code: Alles auswählen

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: Alles auswählen

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.
Benutzeravatar
julaz1994
Soldier level 3
Soldier level 3
Mensajes: 76
Registrado: Mi Aug 18, 2010 9:52 am
Contactar:

Re: Kłopot z "if then"

Beitrag por 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 ;]
Benutzeravatar
Moonstrider
Soldier level 4
Soldier level 4
Mensajes: 110
Registrado: Fr Nov 09, 2007 11:10 pm
Contactar:

Re: Kłopot z "if then"

Beitrag por Moonstrider »

Code: Alles auswählen

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.
Benutzeravatar
julaz1994
Soldier level 3
Soldier level 3
Mensajes: 76
Registrado: Mi Aug 18, 2010 9:52 am
Contactar:

Re: Kłopot z "if then"

Beitrag por 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 ;]
Benutzeravatar
Moonstrider
Soldier level 4
Soldier level 4
Mensajes: 110
Registrado: Fr Nov 09, 2007 11:10 pm
Contactar:

Re: Kłopot z "if then"

Beitrag por Moonstrider »

Code: Alles auswählen

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.
Benutzeravatar
julaz1994
Soldier level 3
Soldier level 3
Mensajes: 76
Registrado: Mi Aug 18, 2010 9:52 am
Contactar:

Re: Kłopot z "if then"

Beitrag por 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: Alles auswählen

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: Alles auswählen

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 ;]
Benutzeravatar
Moonstrider
Soldier level 4
Soldier level 4
Mensajes: 110
Registrado: Fr Nov 09, 2007 11:10 pm
Contactar:

Re: Kłopot z "if then"

Beitrag por 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: Alles auswählen

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 ' ').
Zuletzt geändert von Moonstrider am Sa Sep 11, 2010 11:23 am, insgesamt 3-mal geändert.
Seek your own truth. Always.
Benutzeravatar
julaz1994
Soldier level 3
Soldier level 3
Mensajes: 76
Registrado: Mi Aug 18, 2010 9:52 am
Contactar:

Re: Kłopot z "if then"

Beitrag por 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: Alles auswählen

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 ;]
Benutzeravatar
Moonstrider
Soldier level 4
Soldier level 4
Mensajes: 110
Registrado: Fr Nov 09, 2007 11:10 pm
Contactar:

Re: Kłopot z "if then"

Beitrag por Moonstrider »

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

Code: Alles auswählen

Say(ben,'ben16');
Say(NearestUnitToUnit(filterallunits([[f_side,2],[f_type,1]]) diff ben,ben),'ert4');
Say(ben,'ben17');
Seek your own truth. Always.
Benutzeravatar
julaz1994
Soldier level 3
Soldier level 3
Mensajes: 76
Registrado: Mi Aug 18, 2010 9:52 am
Contactar:

Re: Kłopot z "if then"

Beitrag por 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 ;]
Benutzeravatar
Moonstrider
Soldier level 4
Soldier level 4
Mensajes: 110
Registrado: Fr Nov 09, 2007 11:10 pm
Contactar:

Re: Kłopot z "if then"

Beitrag por Moonstrider »

Absolutnie wszystko działa? To z Rand i Nearest też?
Seek your own truth. Always.
Benutzeravatar
julaz1994
Soldier level 3
Soldier level 3
Mensajes: 76
Registrado: Mi Aug 18, 2010 9:52 am
Contactar:

Re: Kłopot z "if then"

Beitrag por 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 ;]
Benutzeravatar
Gwrhkhsh
Soldier level 6
Soldier level 6
Mensajes: 398
Registrado: Fr Mai 21, 2010 5:56 pm
Wohnort: Wrocław

Re: Kłopot z "if then"

Beitrag por Gwrhkhsh »

Code: Alles auswählen

case Rand(1, 3) of
     1: Say(#jednostka1, 'tekst'); 2: Say(#jednostka2, 'tekst'); 3: #jednostka3, 'tekst'); end;
Spróbuj tego.
Benutzeravatar
julaz1994
Soldier level 3
Soldier level 3
Mensajes: 76
Registrado: Mi Aug 18, 2010 9:52 am
Contactar:

Re: Kłopot z "if then"

Beitrag por 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 ;]
Cerrado