Grupa śmierci

Wszystko o modach, patchach i błędach w OW oraz ogólnym programowaniu.
Post Reply
User avatar
Pablo Abruzzi
Soldier level 5
Soldier level 5
Posts: 269
Joined: Mon Jul 28, 2008 3:09 pm
Location: Polska
Contact:

Grupa śmierci

Post 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.
Si vis pacem, para bellum jeśli chcesz pokoju, gotuj się do wojny.

THE HEROES COMPANY MOD
[progress]100%[/progress]
DONE
http://forum.original-war.net/viewtopic ... 6&start=90
Radzio
Site Administrator
Site Administrator
Poland
Posts: 2898
Joined: Fri Jul 28, 2006 10:58 am
Location: Bialystok, Poland

Re: Grupa śmierci

Post 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.
User avatar
Pablo Abruzzi
Soldier level 5
Soldier level 5
Posts: 269
Joined: Mon Jul 28, 2008 3:09 pm
Location: Polska
Contact:

Re: Grupa śmierci

Post 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 :(
Si vis pacem, para bellum jeśli chcesz pokoju, gotuj się do wojny.

THE HEROES COMPANY MOD
[progress]100%[/progress]
DONE
http://forum.original-war.net/viewtopic ... 6&start=90
User avatar
Gothuk
Site Administrator
Site Administrator
Poland
Posts: 985
Joined: Tue Sep 04, 2007 6:10 pm
Location: Poland, Warsaw
Contact:

Re: Grupa śmierci

Post 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.
Radzio
Site Administrator
Site Administrator
Poland
Posts: 2898
Joined: Fri Jul 28, 2006 10:58 am
Location: Bialystok, Poland

Re: Grupa śmierci

Post 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 :P).

EDIT: Goth mnie wyprzedził :P
EDIT2: Ale on ma błąd :P
EDIT3: Noż lol, ja mam :P ale już poprawione
User avatar
Gothuk
Site Administrator
Site Administrator
Poland
Posts: 985
Joined: Tue Sep 04, 2007 6:10 pm
Location: Poland, Warsaw
Contact:

Re: Grupa śmierci

Post by Gothuk »

Radzio, funkcja powinna zwrocic false, jezeli jednostki zyja, czyli if not dead.
Czyli nie widze bledu u siebie xD.
User avatar
Pablo Abruzzi
Soldier level 5
Soldier level 5
Posts: 269
Joined: Mon Jul 28, 2008 3:09 pm
Location: Polska
Contact:

Re: Grupa śmierci

Post 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ć :P
Si vis pacem, para bellum jeśli chcesz pokoju, gotuj się do wojny.

THE HEROES COMPANY MOD
[progress]100%[/progress]
DONE
http://forum.original-war.net/viewtopic ... 6&start=90
User avatar
Gothuk
Site Administrator
Site Administrator
Poland
Posts: 985
Joined: Tue Sep 04, 2007 6:10 pm
Location: Poland, Warsaw
Contact:

Re: Grupa śmierci

Post 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ć :P
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;
User avatar
Pablo Abruzzi
Soldier level 5
Soldier level 5
Posts: 269
Joined: Mon Jul 28, 2008 3:09 pm
Location: Polska
Contact:

Re: Grupa śmierci

Post 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?
Si vis pacem, para bellum jeśli chcesz pokoju, gotuj się do wojny.

THE HEROES COMPANY MOD
[progress]100%[/progress]
DONE
http://forum.original-war.net/viewtopic ... 6&start=90
User avatar
Gothuk
Site Administrator
Site Administrator
Poland
Posts: 985
Joined: Tue Sep 04, 2007 6:10 pm
Location: Poland, Warsaw
Contact:

Re: Grupa śmierci

Post 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.
User avatar
Pablo Abruzzi
Soldier level 5
Soldier level 5
Posts: 269
Joined: Mon Jul 28, 2008 3:09 pm
Location: Polska
Contact:

Re: Grupa śmierci

Post by Pablo Abruzzi »

OK. Na razie wszytko jasne. Dzięki :D

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??
Si vis pacem, para bellum jeśli chcesz pokoju, gotuj się do wojny.

THE HEROES COMPANY MOD
[progress]100%[/progress]
DONE
http://forum.original-war.net/viewtopic ... 6&start=90
User avatar
Gothuk
Site Administrator
Site Administrator
Poland
Posts: 985
Joined: Tue Sep 04, 2007 6:10 pm
Location: Poland, Warsaw
Contact:

Re: Grupa śmierci

Post 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?
Radzio
Site Administrator
Site Administrator
Poland
Posts: 2898
Joined: Fri Jul 28, 2006 10:58 am
Location: Bialystok, Poland

Re: Grupa śmierci

Post by Radzio »

Tam ma być te "not". Czasem możesz zaufać sobie. Człowiek po 10PM bredzi :P
Post Reply