Kłopot z "if then"

Wszelkie pytania na temat SAIL'a i modowania OW.
Закрыто
Аватара пользователя
julaz1994
Soldier level 3
Soldier level 3
Сообщения: 76
Зарегистрирован: Ср авг 18, 2010 9:52 am
Контактная информация:

Kłopot z "if then"

Сообщение julaz1994 »

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

Код: Выделить всё

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 ;]
Аватара пользователя
Moonstrider
Soldier level 4
Soldier level 4
Сообщения: 110
Зарегистрирован: Пт ноя 09, 2007 11:10 pm
Контактная информация:

Re: Kłopot z "if then"

Сообщение Moonstrider »

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

Код: Выделить всё

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:

Код: Выделить всё

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.
Аватара пользователя
julaz1994
Soldier level 3
Soldier level 3
Сообщения: 76
Зарегистрирован: Ср авг 18, 2010 9:52 am
Контактная информация:

Re: Kłopot z "if then"

Сообщение 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 ;]
Аватара пользователя
Moonstrider
Soldier level 4
Soldier level 4
Сообщения: 110
Зарегистрирован: Пт ноя 09, 2007 11:10 pm
Контактная информация:

Re: Kłopot z "if then"

Сообщение Moonstrider »

Код: Выделить всё

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.
Аватара пользователя
julaz1994
Soldier level 3
Soldier level 3
Сообщения: 76
Зарегистрирован: Ср авг 18, 2010 9:52 am
Контактная информация:

Re: Kłopot z "if then"

Сообщение 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 ;]
Аватара пользователя
Moonstrider
Soldier level 4
Soldier level 4
Сообщения: 110
Зарегистрирован: Пт ноя 09, 2007 11:10 pm
Контактная информация:

Re: Kłopot z "if then"

Сообщение Moonstrider »

Код: Выделить всё

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.
Аватара пользователя
julaz1994
Soldier level 3
Soldier level 3
Сообщения: 76
Зарегистрирован: Ср авг 18, 2010 9:52 am
Контактная информация:

Re: Kłopot z "if then"

Сообщение 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

Код: Выделить всё

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:

Код: Выделить всё

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 ;]
Аватара пользователя
Moonstrider
Soldier level 4
Soldier level 4
Сообщения: 110
Зарегистрирован: Пт ноя 09, 2007 11:10 pm
Контактная информация:

Re: Kłopot z "if then"

Сообщение 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

Код: Выделить всё

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 ' ').
Последний раз редактировалось Moonstrider Сб сен 11, 2010 11:23 am, всего редактировалось 3 раза.
Seek your own truth. Always.
Аватара пользователя
julaz1994
Soldier level 3
Soldier level 3
Сообщения: 76
Зарегистрирован: Ср авг 18, 2010 9:52 am
Контактная информация:

Re: Kłopot z "if then"

Сообщение 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

Код: Выделить всё

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 ;]
Аватара пользователя
Moonstrider
Soldier level 4
Soldier level 4
Сообщения: 110
Зарегистрирован: Пт ноя 09, 2007 11:10 pm
Контактная информация:

Re: Kłopot z "if then"

Сообщение Moonstrider »

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

Код: Выделить всё

Say(ben,'ben16');
Say(NearestUnitToUnit(filterallunits([[f_side,2],[f_type,1]]) diff ben,ben),'ert4');
Say(ben,'ben17');
Seek your own truth. Always.
Аватара пользователя
julaz1994
Soldier level 3
Soldier level 3
Сообщения: 76
Зарегистрирован: Ср авг 18, 2010 9:52 am
Контактная информация:

Re: Kłopot z "if then"

Сообщение 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 ;]
Аватара пользователя
Moonstrider
Soldier level 4
Soldier level 4
Сообщения: 110
Зарегистрирован: Пт ноя 09, 2007 11:10 pm
Контактная информация:

Re: Kłopot z "if then"

Сообщение Moonstrider »

Absolutnie wszystko działa? To z Rand i Nearest też?
Seek your own truth. Always.
Аватара пользователя
julaz1994
Soldier level 3
Soldier level 3
Сообщения: 76
Зарегистрирован: Ср авг 18, 2010 9:52 am
Контактная информация:

Re: Kłopot z "if then"

Сообщение 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 ;]
Аватара пользователя
Gwrhkhsh
Soldier level 6
Soldier level 6
Сообщения: 398
Зарегистрирован: Пт май 21, 2010 5:56 pm
Откуда: Wrocław

Re: Kłopot z "if then"

Сообщение Gwrhkhsh »

Код: Выделить всё

case Rand(1, 3) of
     1: Say(#jednostka1, 'tekst'); 2: Say(#jednostka2, 'tekst'); 3: #jednostka3, 'tekst'); end;
Spróbuj tego.
Аватара пользователя
julaz1994
Soldier level 3
Soldier level 3
Сообщения: 76
Зарегистрирован: Ср авг 18, 2010 9:52 am
Контактная информация:

Re: Kłopot z "if then"

Сообщение 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 ;]
Закрыто