Porównanie filtrowanych wyników // f_driving - zepsuty sail

Wszelkie pytania na temat SAIL'a i modowania OW.
User avatar
Night
Soldier level 4
Soldier level 4
Posts: 146
Joined: Sat Jun 26, 2010 10:06 am

Porównanie filtrowanych wyników // f_driving - zepsuty sail

Post by Night »

Kod został wzięty z tego tematu:
http://forum.original-war.net/viewtopic.php?f=18&t=1425

Podobnie jak tam, chodzi o to, aby przyznać medal gdy jedna wartość jest równa drugiej. Niestety nie działa i nie wiem kompletnie czemu.

Code: Select all

begin
         Am02pojazdy := FilterUnitsInArea(Am02Exit, [[f_side, 1],[f_engine, engine_solar], [f_ok]]);
         Am02AmGroup2 := FilterUnitsInArea(Am02Exit, [[f_side, 1],[f_type, unit_human], [f_ok]]);
         begin
                             if Am02pojazdy=Am02AmGroup2 then
                                begin
                                AddMedal('Am02Pojazdy', 1);
                                end
                             else
                                 begin
                                 AddMedal('Am02Pojazdy',-1);
                                 end;
               end;
end;
Mam drugi kawałek kodu używający

Code: Select all

FilterUnitsInArea(Am02Exit, [[f_side, 1],[f_type, unit_human], [f_ok]]);

Code: Select all

begin
                                 if FilterUnitsInArea(Am02Exit, [[f_side, 1],[f_type, unit_human]]) = 5 then
                                    begin
                                    AddMedal('Am02Zywi', 1);
                                    end
                                 else
                                     begin
                                     AddMedal('Am02Zywi', -1);
                                     end;
end;
I również nie działa, dopóki nie każe wysiąść kierowcom z pojazdów. Dopiero wtedy ich filtruje, ale pierwszy nadal nie działa.

Różnica z kodem żródłowym jest tylko w filtrowaniu all => area, więc teoretycznie powinno działać. Przy filtrowaniu arei nie filtruje w pojazdach/budynkach?
Last edited by Night on Tue May 14, 2013 10:54 pm, edited 2 times in total.
User avatar
Serpent
Soldier level 10
Soldier level 10
Estonia
Posts: 4166
Joined: Tue Jul 07, 2009 9:13 pm
Location: Polska - EuroStan ZSRE
Contact:

Re: Porównanie filtrowanych wyników.

Post by Serpent »

Filtry w twoim przypadku to dwa różne zbiory które nigdy nie będą sobie równe.

Na twoim miejscu zrobił bym nieco inaczej:

Code: Select all

// w kodzie
begin

  If FilterUnitsInArea(Am02Exit, [[f_side, 1],[f_type, unit_human], [f_ok]]) >= 5 then // przykładowo 
    begin
          AddMedal('Ludzie', 1); // dodaje medal za ludzi, możesz wywalić
  
      If FilterUnitsInArea(Am02Exit, [[[f_side, 1], [f_type, unit_vehicle], [f_engine, engine_solar], [f_ok]]]) >= 5 then
       begin
          AddMedal('PojazdyOk', 1);
          end
            else
               AddMedal('PojazdyOK', -1);
        end;
// kod na zakończenie misji blablabla
end;



Natomiast jeśli chodzi o:
I również nie działa, dopóki nie każe wysiąść kierowcom z pojazdów. Dopiero wtedy ich filtruje, ale pierwszy nadal nie działa.
Służy do tego takie cuś :arlol:

Code: Select all

[f_inside]
Wtedy program wie o które jednostki ci chodzi, bo jeśli tego nie masz to gra traktuje pojazd z ludzikiem w środku jako tylko i wyłącznie pojazd.
Epickie teksty:
Marek1906: jak zrobic aby sail był zielony?
Kvantovy: Wszystko normalne, wszystko w koło było dziwne
Kvantovy:: To jest fajne, że to nie jest takie głupie
Kvantovy:: remove sos from kanapeczka
Kvantovy:: zdarzają się rzezy które sie filozofom nie śniły
Cenwen: problemem jest gejostwo
"Taki z niego fizyk jak ze mnie baletnica" - Profesor Scholtze o Kvantovym.
JAKBYŁ BYM CZECHEM TO BYM ROZŁOŻYŁ NAMIOT ~Kvanciak
User avatar
Night
Soldier level 4
Soldier level 4
Posts: 146
Joined: Sat Jun 26, 2010 10:06 am

Re: Porównanie filtrowanych wyników.

Post by Night »

Problem w tym, że medal ma być wtedy, jeśli liczba pojazdów jest równa liczbie ocalałych. Czyli, jeśli przeżyje 2, to wystarczają 2 pojazdy do zdobycia medalu. W tym przypadku, medal będzie zawsze, gdy dostarcze min 5 pojazdów do arei końcowej.

Dlaczego nigdy nie będą równe?
User avatar
Serpent
Soldier level 10
Soldier level 10
Estonia
Posts: 4166
Joined: Tue Jul 07, 2009 9:13 pm
Location: Polska - EuroStan ZSRE
Contact:

Re: Porównanie filtrowanych wyników.

Post by Serpent »

Jeżeli robisz te pojazdy w fabryce to możesz wykorzystać event gdzie podliczysz te jednostki, potem w evencie na zniszczenie będziesz odejmował te jednostki.

Code: Select all

Export SolarList;
Every 0$02 do
SolarList = 0;

On VehicleConstructed(veh, fac) do
begin

      If veh in FilterAllUnits([f_engine, engine_solar]) then
         begin
         SolarList = SolarList + 1;
         end;

end;

On UnitDestroyed(un) do
begin
     If un in FilterAllUnits([f_engine, engine_solar]) then
         begin
         SolarList = SolarList - 1;
         end;

end;

// kod końcowy
 If FilterUnitsInArea(Am02Exit, [[f_side, 1],[f_inside]]) = SolarList then 
Do do tego że filtry nie będą równe, cóż kiedyś porównywałem filtry do siebie i wiem że to możliwe tylko nie w sposób jaki ty to zrobiłeś. Jak sobie przypomnę to ci napisze.
Epickie teksty:
Marek1906: jak zrobic aby sail był zielony?
Kvantovy: Wszystko normalne, wszystko w koło było dziwne
Kvantovy:: To jest fajne, że to nie jest takie głupie
Kvantovy:: remove sos from kanapeczka
Kvantovy:: zdarzają się rzezy które sie filozofom nie śniły
Cenwen: problemem jest gejostwo
"Taki z niego fizyk jak ze mnie baletnica" - Profesor Scholtze o Kvantovym.
JAKBYŁ BYM CZECHEM TO BYM ROZŁOŻYŁ NAMIOT ~Kvanciak
User avatar
Night
Soldier level 4
Soldier level 4
Posts: 146
Joined: Sat Jun 26, 2010 10:06 am

Re: Porównanie filtrowanych wyników.

Post by Night »

Rozwiązałem ten problem:

Code: Select all

begin
if FilterUnitsInArea(Am02Exit, [[f_side, 1], [f_type, unit_human], [f_ok]]) =5 and FilterUnitsInArea(Am02Exit, [[f_side, 1],[f_engine, engine_solar], [f_ok]]) >=5 then
Am02Medal2x1
else
if FilterUnitsInArea(Am02Exit, [[f_side, 1], [f_type, unit_human], [f_ok]]) =4 and FilterUnitsInArea(Am02Exit, [[f_side, 1],[f_engine, engine_solar], [f_ok]]) >=4 then
Am02Medal2x1
else
if FilterUnitsInArea(Am02Exit, [[f_side, 1], [f_type, unit_human], [f_ok]]) =3 and FilterUnitsInArea(Am02Exit, [[f_side, 1],[f_engine, engine_solar], [f_ok]]) >=3 then
Am02Medal2x1
else
if FilterUnitsInArea(Am02Exit, [[f_side, 1], [f_type, unit_human], [f_ok]]) =2 and FilterUnitsInArea(Am02Exit, [[f_side, 1],[f_engine, engine_solar], [f_ok]]) >=2 then
Am02Medal2x1
else
if FilterUnitsInArea(Am02Exit, [[f_side, 1], [f_type, unit_human], [f_ok]]) =1 and FilterUnitsInArea(Am02Exit, [[f_side, 1],[f_engine, engine_solar], [f_ok]]) >=1 then
Am02Medal2x1
else
Am02Medal2x2;
end;

Code: Select all

Export function Am02Medal2x1;

begin
AddMedal('Am02Pojazdy', 1);
end;
Export function Am02Medal2x2;
begin
AddMedal('Am02Pojazdy',-1);
end;
Co prawda może trochę dużo, ale ważne, że działa.

Natomiast to
Służy do tego takie cuś

Code: Select all

[f_inside]
Nie wiem, czemu, ale niechce u mnie działać. Np.

Code: Select all

RewardPeople(FilterUnitsInArea(Am02Exit, [[f_side, 1], [f_inside], [f_type, unit_human], [f_ok]]));
Próbowałem z [f_driving], ale nie działało. Spróbowałem, też zupełnie z z samym inside i driving i też nic.

Code: Select all

RewardPeople(FilterUnitsInArea(Am02Exit, [f_inside]));
RewardPeople(FilterUnitsInArea(Am02Exit, [f_driving]));
Kompletnie nie wiem jak tego uzyć.
User avatar
pomek
Soldier level 7
Soldier level 7
Poland
Posts: 656
Joined: Mon May 03, 2010 9:05 pm

Re: Porównanie filtrowanych wyników.

Post by pomek »

Filtry w twoim przypadku to dwa różne zbiory które nigdy nie będą sobie równe.
Gowno prawda. Z matematycznego punktu widzenia latwo udowodnic, ze 2 zbiory sa rowne wtedy i tylko wtedy, jesli ilosc ich elementow sie zgadza. Natomiast identyczne, jesli obydwa maja takie same elementy.

Jesli filtr generuje zbior elementow X i Y, to one moga byc rowne i jednoczesnie moga byc identyczne, ale nie musza.

Programowanie to nie funkcje, a logika, wiec nie wprowadzaj ludzi w blad.
User avatar
Night
Soldier level 4
Soldier level 4
Posts: 146
Joined: Sat Jun 26, 2010 10:06 am

Re: Porównanie filtrowanych wyników.

Post by Night »

Powrót do problemu f_inside, f_driving. Jakby ktoś miał kiedy w przyszłości.

Zrobiłem specjalnie tylko dla sprawdzenia tego osobną mapkę. Wstawiłem dwa pojazdy, aree i napisałem kod:

Code: Select all

Export Am1, Am2, Am3;

Starting

Begin
uc_side=1;
uc_nation=nation_american;

Am1=CreateHuman;
Am2=CreateHuman;
Am3=CreateHuman;

PlaceUnitXY(Am1, 42, 44, false);
PlaceUnitXY(Am2, 40, 42, false);
SetAreaMapShow(1, Am)
end;



Every 0$1 TRIGGER FilterUnitsInArea(Am, [[f_side, 1], [f_driving]]) >= 1 do

begin
wait(0$1);
PlaceUnitArea(Am3, Am, true);
end;
Jeśli pozostawie samo f_side, 1 - działa. Gdy dopisuje f_driving, albo f_inside. Kaplica.
Póżniej postawiłem jeszcze budynek i spróbowałem z f_inside. Poszedłem ludkiem do arei i wszedłem. Nic.

W końcu zmieniłem kod na:

Code: Select all

Every 0$1 TRIGGER FilterAllUnits([[f_side, 1], [f_driving]]) >= 1 do
I działa. Czemu nie działą więc z areą?

Poszedłem dalej, zmieniłem na

Code: Select all

Every 0$1 TRIGGER FilterAllUnits([[f_side, 1], [f_driving]]) >= 1  and IsInArea(Am1, Am) do
Generalnie, wychodzi na to samo, tylko trzeba pamiętać, że do IsInArea nie stosuje się tablicy, więc trzeba to rozpisywać na każdego ludka.
User avatar
Jeanks
Soldier level 6
Soldier level 6
Posts: 305
Joined: Fri Feb 16, 2007 1:34 pm
Location: Grudziądz

Re: Porównanie filtrowanych wyników.

Post by Jeanks »

Żeby f_driving działał musisz Filtrować jakiś pojazd w kodzie a żeby działał f_inside musisz filtrować jakiś budynek lub ludzika w kodzie. Tyle w temacie patrz z oryginalnych kampanii ;]

Np.

Code: Select all

FilterAllUnits([[f_side, 1], [f_driving],[f_type,unit_vehicle],[f_chassis,medium_wheeled]]) 
Coś takiego nie pamiętam dokładnie nie jestem pewny czy nie musi być zamiast f_chassis typ broni. f_type to wynika z logiki i chyba nawet nie jest koniecznie ale wiesz o co mi chodzi więc możesz to sprawdzić definiując dokładnie pojazd.

Code: Select all

FilterAllUnits([[[f_side, 1], [f_not, [f_hastask]], [f_not, [f_inside]], [f_type, unit_human]]]);
Jak zdefiniujesz, że chodzi o ludka to nawet budynku być nie musi
Jeanks zgarnia wszystko ot co xD
User avatar
Night
Soldier level 4
Soldier level 4
Posts: 146
Joined: Sat Jun 26, 2010 10:06 am

Re: Porównanie filtrowanych wyników.

Post by Night »

Ech, przeczytaj jeszcze raz mój post. Nie trzeba nic więcej dodawać - działa i dałem przykład. Po prostu dodając kolejne zmienne filtra zawężasz wynik filtrowania.

Problemem jest to, że działa tylko dla podanej także przez Ciebie filtra "FilterAllUnits", a nie działa dla "FilterUnitsInArea".

I chociaż tu problem rozwiązany, to dla innej mapy już tego zastosować nie mogę i kombinuje aktualnie jak to jeszcze obejść.
User avatar
Jeanks
Soldier level 6
Soldier level 6
Posts: 305
Joined: Fri Feb 16, 2007 1:34 pm
Location: Grudziądz

Re: Porównanie filtrowanych wyników.

Post by Jeanks »

Night wrote:Ech, przeczytaj jeszcze raz mój post. Nie trzeba nic więcej dodawać - działa i dałem przykład. Po prostu dodając kolejne zmienne filtra zawężasz wynik filtrowania.

Problemem jest to, że działa tylko dla podanej także przez Ciebie filtra "FilterAllUnits", a nie działa dla "FilterUnitsInArea".

I chociaż tu problem rozwiązany, to dla innej mapy już tego zastosować nie mogę i kombinuje aktualnie jak to jeszcze obejść.

Przeczytałem ehh. Napisałeś, że nie działa Ci w RewardPeople f_driving i f_inside napisałem Ci co może być przyczyną i jak to działało u mnie bądź w kampanii. Obie te f_ potzebują czegoś jeszcze same bez niczego nie zadziałają tak jak f_side np.
Jeanks zgarnia wszystko ot co xD
User avatar
Night
Soldier level 4
Soldier level 4
Posts: 146
Joined: Sat Jun 26, 2010 10:06 am

Re: Porównanie filtrowanych wyników.

Post by Night »

Wyjaśnij mi więc jak zadziałało w zamieszczonym powyżej przykładzie bez dodawania czegoś jeszcze?

Obie są samodzielne. W kampanii to działało, ponieważ, po prostu był DODATKOWY warunek filtrowania, bo musiały być np. silniki słoneczne. Tak żeby nie dodawało do wyniku filtrowania przejętych pojazdów z silnikiem spalinowym (zgaduje, że coś takiego było w 3 AM).

W reward także była area:
"RewardPeople(FilterUnitsInArea"
User avatar
Night
Soldier level 4
Soldier level 4
Posts: 146
Joined: Sat Jun 26, 2010 10:06 am

Re: Porównanie filtrowanych wyników.

Post by Night »

Posiedziałem, pokminiłem, a w końcu gdy już zawiodło wszystko co zdrowo rozsądkowe, stwierdziłem, że to czas na głupie próby. I odkryłem. Co się okazało? Ktoś się jebnął jak definiował saila.

Standardowo jest:

Code: Select all

FilterUnitsInArea(area:integer filter:plist)
i działa dla wszystkich warunków, prócz wspomnianych dwóch. Otóż, aby ich uzyć trzeba dać:

Code: Select all

FilterUnitsInArea(filter:plist area:integer)
Tak więc działa:

Code: Select all

Every 0$1 trigger FilterUnitsInArea([f_driving], am) = X do
Problem tylko w tym, że nie da się dołączyć do tego innych zmiennych. Jeśli np. dam:

Code: Select all

Every 0$1 trigger FilterUnitsInArea([[f_driving], [f_side, 1], am) = X do
To filtr będzie czytało jak "FilterAllUnits", pominie wskazanie arei i wykona kod, gdy dwóch ludzi z side 1, będzie kierowało pojazdami.


Tymczasem ja potrzebuje coś takiego:

Code: Select all

Every 0$1 trigger FilterUnitsInArea([[f_side, 1], [f_driving]], am) and FilterUnitsInArea(am, [[f_side, 1], [f_type, unit_human]]) = FilterAllUnits([[f_side, 1], [f_type, unit_human]]) do
I kompletnie nie wiem jak obejść ten problem.

(tzn. wiem... po prostu zrobię wszystko, aby nikt inny się nie pojawił w arerze w momencie fltrowania, więc wystarczy [f_driving], ale nie o takie obejście mi chodziło).


--------------
EDIT
COFAM. Nie sprawdziłem do końca, jednak ignoruje całkowicie, czy w tą stronę czy w tą.
Czyli powrót do punktu wyjścia. Te dwie zmienne nie działają z FilterUnitsInArea
Last edited by Night on Wed May 15, 2013 3:34 pm, edited 1 time in total.
User avatar
Serpent
Soldier level 10
Soldier level 10
Estonia
Posts: 4166
Joined: Tue Jul 07, 2009 9:13 pm
Location: Polska - EuroStan ZSRE
Contact:

Re: Porównanie filtrowanych wyników // f_driving - zepsuty s

Post by Serpent »

Napisz co chcesz osiągnąć bo:

Code: Select all

FilterUnitsInArea([[f_side, 1], [f_driving]], am) // i co to niby ma być za warunek? 
and 
FilterUnitsInArea(am, [[f_side, 1], [f_type, unit_human]]) 
= FilterAllUnits([[f_side, 1], [f_type, unit_human]])
Epickie teksty:
Marek1906: jak zrobic aby sail był zielony?
Kvantovy: Wszystko normalne, wszystko w koło było dziwne
Kvantovy:: To jest fajne, że to nie jest takie głupie
Kvantovy:: remove sos from kanapeczka
Kvantovy:: zdarzają się rzezy które sie filozofom nie śniły
Cenwen: problemem jest gejostwo
"Taki z niego fizyk jak ze mnie baletnica" - Profesor Scholtze o Kvantovym.
JAKBYŁ BYM CZECHEM TO BYM ROZŁOŻYŁ NAMIOT ~Kvanciak
User avatar
Jeanks
Soldier level 6
Soldier level 6
Posts: 305
Joined: Fri Feb 16, 2007 1:34 pm
Location: Grudziądz

Re: Porównanie filtrowanych wyników // f_driving - zepsuty s

Post by Jeanks »

Kurde właśnie chciałem napisać, że trzeba inaczej klamry wstawić i Serp mnie uprzedził. Jak tam mój modzik Serp ;p ?
Jeanks zgarnia wszystko ot co xD
User avatar
Night
Soldier level 4
Soldier level 4
Posts: 146
Joined: Sat Jun 26, 2010 10:06 am

Re: Porównanie filtrowanych wyników // f_driving - zepsuty s

Post by Night »

To było na szybko i coś mniej więcej co potrzebuje - zapomniałem i tak spiąć dwa pierwsze filtry "(filter and filter) = filter". Czyli kierowcy strony 1 + ludzie strony 1 = wszyscy ludzie strony 1.


Koniec - wykonanie kodu ma nastapić w momencie gdy wszyscy ludzie zywi znajdą się w arerze końcowej. Z tym, że część może siedzieć w pojazdach w tym czasie, więc trzeba to uwzględnić.

Na innej mapie, obszedłem ten problem tym, że po prostu kazałem wysiąść wszystkim z wozu, gdy główny był w arerze i gracz kliknął potwierdzenie, ze chce już zakończyć, ale tym razem nie mogę tego zastosować.
Post Reply