Page 1 of 1
Grupa śmierci
Posted: Fri Feb 26, 2010 9:10 pm
by Pablo Abruzzi
Mam problem, zrobiłem taki posterunek i 6 wrogów. Kiedy gracz by ich zabił, wtedy puszczam dialogi i nowy cel misji, więc spróbowałem tak:
Code: Select all
export grupa;
every 0$1 trigger IsDead(grupa) do
begin
grupa=([am1,am2,am3,am4,am5,am6]);
Say(p1,'MojDialog5');
Say(ser,'MojDialog6');
SayRadio(ser,'MojDialog7');
SayRadio(orzel,'MojDialog8');
SayRadio(ser,'MojDialog9');
SayRadio(orzel,'MojDialog10');
SayRadio(ser,'MojDialog11');
SayRadio(orzel,'MojDialog12');
Wait(0$2);
ChangeMissionObjectives('M2');
end;
Nie działa. Znaczy kompiluje się, ale mija 1 sekunda i bez względu na to co zrobię zostają odtworzone dialogi itd. W czym tu jest problem??
Próbowałem też bez tych () nawiasów same kwadratowe = to samo.
Próbowałem zdefiniować grupę w poprzednim zdarzeniu = to samo.
Ps. am1,am2....to identy tych sześciu.
Proszę o pomoc.
Re: Grupa śmierci
Posted: Fri Feb 26, 2010 9:49 pm
by Radzio
1) IsDead działa tylko z pojedynczymi jednostkami.
2) Zmienna ma wartość 0 zanim ją określisz, tak więc 0 zawsze jest martwe.
Re: Grupa śmierci
Posted: Fri Feb 26, 2010 10:11 pm
by Pablo Abruzzi
To co, da się coś zrobić??
Skoro to działa tylko na pojedyncze jednostki to można zastosować "and" w warunku, tylko aż 6 razy trzeba będzie

Re: Grupa śmierci
Posted: Fri Feb 26, 2010 10:25 pm
by Gothuk
Pablo Abruzzi wrote:To co, da się coś zrobić??
Skoro to działa tylko na pojedyncze jednostki to można zastosować "and" w warunku, tylko aż 6 razy trzeba będzie

a nie mozna sobie napisac funkcji ;o?
Code: Select all
function AreDead(units);
var un;
begin
result := true;
for un in units do
if not IsDead(un) then begin
result := false;
exit;
end;
end;
chyba powinno dzialac.
Re: Grupa śmierci
Posted: Fri Feb 26, 2010 10:30 pm
by Radzio
Code: Select all
function NieZyja(l_grupa);
var un;
begin
result := true;
for un in l_grupa do
if not IsDead(un) then
begin
result := false;
exit;
end;
end;
I IsDead zamieniamy na NieZyja (tylko nie dawaj pustej listy

).
EDIT: Goth mnie wyprzedził

EDIT2: Ale on ma błąd

EDIT3: Noż lol, ja mam

ale już poprawione
Re: Grupa śmierci
Posted: Fri Feb 26, 2010 10:35 pm
by Gothuk
Radzio, funkcja powinna zwrocic false, jezeli jednostki zyja, czyli if not dead.
Czyli nie widze bledu u siebie xD.
Re: Grupa śmierci
Posted: Fri Feb 26, 2010 10:44 pm
by Pablo Abruzzi
Dalej nie działa, ale to najprawdopodobniej mój błąd. Spójrzcie, zapewne źle zapisałem kod, bo powiem szczerze, że nie zbyt rozumiem budowę tej funkcji. Możecie ją opisać bardzo proszę.
A oto ten mój "zły" kod:
Code: Select all
..........
l_grupa=[am1,am2,am3,am4,am5,am6];
end;
export l_grupa;
function NieZyja(l_grupa);
var un;
begin
result := true;
for un in l_grupa do
if IsDead(un) then
begin
result := false;
exit;
end;
end;
export grupa;
every 0$1 trigger NieZyja(l_grupa) do
begin
Say(p1,'MojDialog5');
Say(ser,'MojDialog6');
SayRadio(ser,'MojDialog7');
SayRadio(orzel,'MojDialog8');
SayRadio(ser,'MojDialog9');
SayRadio(orzel,'MojDialog10');
SayRadio(ser,'MojDialog11');
SayRadio(orzel,'MojDialog12');
Wait(0$1);
ChangeMissionObjectives('M2');
ChangeMissionObjectives('M3');
end;
Tylko proszę się ze mnie nie śmiać

Re: Grupa śmierci
Posted: Fri Feb 26, 2010 10:50 pm
by Gothuk
Pablo Abruzzi wrote:Dalej nie działa, ale to najprawdopodobniej mój błąd. Spójrzcie, zapewne źle zapisałem kod, bo powiem szczerze, że nie zbyt rozumiem budowę tej funkcji. Możecie ją opisać bardzo proszę.
A oto ten mój "zły" kod:
// kod
Tylko proszę się ze mnie nie śmiać

nie definiujesz l_grupa, to tylko zmienna lokalna funkcji.
Code: Select all
export grupa;
function NieZyja(l_grupa); // tworzymy funkcje
var un; // definiujemy zmienna lokalna: un
begin
result := true; // ustawiamy wynik funkcji jako prawda
for un in l_grupa do // petla - dla kazdej jednostki (un) w l_grupa rob:
if IsDead(un) then // jesli jednostka nie zyje
begin
result := false; // ustaw wynik funkcji na falsz
exit; // przerwij petle
end;
end;
// jednak sadze ze powinno byc if no isdead(un), zeby zwrocic falsz.
starting
begin
disable(001);
// troche kodu
// tworzenie postaci
grupa := [am1,am2,am3,am4,am5,am6];
enable(001);
end;
every 0$1 trigger NieZyja(grupa) marked 001 do
begin
Say(p1,'MojDialog5');
Say(ser,'MojDialog6');
SayRadio(ser,'MojDialog7');
SayRadio(orzel,'MojDialog8');
SayRadio(ser,'MojDialog9');
SayRadio(orzel,'MojDialog10');
SayRadio(ser,'MojDialog11');
SayRadio(orzel,'MojDialog12');
Wait(0$1);
ChangeMissionObjectives('M2');
ChangeMissionObjectives('M3');
end;
Re: Grupa śmierci
Posted: Fri Feb 26, 2010 11:01 pm
by Pablo Abruzzi
Dzięki za ten opis, bardzo mi pomógł.
Tylko takie pytanie:
Gothuk wrote:starting
begin
disable(001);
// troche kodu
// tworzenie postaci
grupa := [am1,am2,am3,am4,am5,am6];
enable(001);
end;
A po co tutaj użyłeś disable(001); i enable(001);??
To konieczne, jakbym na przykład użył tej funkcji do kilku warunków?
Re: Grupa śmierci
Posted: Fri Feb 26, 2010 11:05 pm
by Gothuk
every ma sie wykonac 1 min po spelnieniu warunku, tak jak Radzio napisal zaexportowana zamienna ma automatycznie wartosc 0.
Jesli nie zmienisz wartosci zmiennej odpowiadajacej za grupe, to po minucie every sie wykona gdyz warunek jest spelniony, dlatego uzylem markeda.
Re: Grupa śmierci
Posted: Fri Feb 26, 2010 11:12 pm
by Pablo Abruzzi
OK. Na razie wszytko jasne. Dzięki
Your welcome. - Gothuk
EDIT: Mały problem. Nie da się tego ustawić inaczej, bo to samo jest, dopiero teraz to przetestowałem. Kod:
Code: Select all
export l_grupa;
function NieZyja(l_grupa);
var un;
begin
result := true;
for un in l_grupa do
if IsDead(un) then
begin
result := false;
exit;
end;
end;
export hg1,hg2,hg3,hg4,hg5;
every 10$20 trigger IsInArea(ser,area_3) do
begin
disable(001);
uc_side=1;
uc_nation=1;
vc_chassis=us_heavy_tracked;
vc_engine=engine_combustion;
vc_control=control_computer;
vc_weapon=us_heavy_gun;
hg1=CreateVehicle;
hg2=CreateVehicle;
hg3=CreateVehicle;
vc_chassis=us_heavy_tracked;
vc_engine=engine_combustion;
vc_control=control_computer;
vc_weapon=us_double_gun;
hg4=CreateVehicle;
hg5=CreateVehicle;
PlaceUnitArea(hg1,area_4,false);
PlaceUnitArea(hg2,area_4,false);
PlaceUnitArea(hg3,area_4,false);
PlaceUnitArea(hg4,area_4,false);
PlaceUnitArea(hg5,area_4,false);
ComMoveXY([hg1,hg2,hg3,hg4,hg5], 78, 91);
Wait(0$10);
ComAgressiveMove([hg1,hg2,hg3,hg4,hg5], 92, 93);
enable;
l_grupa=[am1,am2,am3,am4,am5,am6];
enable(001);
end;
every 0$1 trigger NieZyja(l_grupa) marked 001 do
begin
Say(p1,'MojDialog5');
Say(ser,'MojDialog6');
SayRadio(ser,'MojDialog7');
SayRadio(orzel,'MojDialog8');
SayRadio(ser,'MojDialog9');
SayRadio(orzel,'MojDialog10');
SayRadio(ser,'MojDialog11');
SayRadio(orzel,'MojDialog12');
Wait(0$1);
ChangeMissionObjectives('M2');
ChangeMissionObjectives('M3');
end;
To cały kod, dalej to samo. Nie da się dać podobnego warunku, bez takich problemów??
Re: Grupa śmierci
Posted: Sat Feb 27, 2010 1:54 pm
by Gothuk
Pablo Abruzzi wrote:
EDIT: Mały problem. Nie da się tego ustawić inaczej, bo to samo jest, dopiero teraz to przetestowałem.
ale co jest to samo?
dialogi wystapuja po 1 min, czy wcale?
poza tym gdzie masz blok starting?
i czy dales na pewno caly kod?
Re: Grupa śmierci
Posted: Sat Feb 27, 2010 2:32 pm
by Radzio
Tam ma być te "not". Czasem możesz zaufać sobie. Człowiek po 10PM bredzi
