2 kody związane z budynkami

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

2 kody związane z budynkami

Post by Night »

Prośba o pomoc - nie mogę rozryźć dwóch rzeczy:

1) Gdy skończenie budowy ma być warunkiem do rozpoczecia jakiegoś działania. Znalazłem tylko na

Code: Select all

on BuildingComplete(X, Y)
, a potrzeba mi coś, co będę mógł wstawić obok TRIGGERA, podobnie jak z :

Code: Select all

every 0$1 TRIGGER Researched(X, Y) do
2) W trakcie misji, po wydarzeniu, chcę dać możliwość zbudowania budynku, który dotychczas nie był w ogóle dostępny.

Próbowałem rozkminić z takim kodem:

Code: Select all

GetBuildingTechReq(X, Y)
Ale nie działa. Zdaje się, że tą komendą tego zrobić się nie da, bo resztę kodu w bloku wykonuje dobrze.

Code: Select all

every 0$1 trigger GetLives(pojazd2)<250 MARKED 02 do
begin
Say(jey1,'G107');
Say(alice1,'F111');
Say(jey1,'G108');
Say(chris1,'E116');
Say(jey1,'G109');
Say(chris1,'E117');
ChangeMissionObjectives('09a');
ChangeMissionObjectives('12');
GetBuildingTechReq(b_workshop, 1)
end;
User avatar
Gothuk
Site Administrator
Site Administrator
Poland
Posts: 985
Joined: Tue Sep 04, 2007 6:10 pm
Location: Poland, Warsaw
Contact:

Re: 2 kody związane z budynkami

Post by Gothuk »

1. Co jest złego z eventem? Przecież on jest równie dobry co every. Tylko trzeba go użyc z głową.

Code: Select all

BuildingComplete ( build : integer )
czyli

Code: Select all

on BuildingComplete ( b ) 
   if { tu dajesz na jaki budynek czekasz, uzywasz funkcji z get, np GetBType ( un : integer ), GetSide ( un : integer ), itp }
     then
     begin
         // tu kod co ma sie stac
     end;
2.

Code: Select all

SetRestrict ( btype : integer, side : integer, state : boolean )
Dostępne state:

Code: Select all

state_disabled = 0 
state_enabled = 1 
state_researched = 2
---
Możesz się wspierać listą funkcji / eventów / stałych i zmiennych zrobioną kiedyś przeze mnie, ale z braku czasu jeszcze nie dokończoną:
http://original-war.net/sailbase.php
User avatar
Night
Soldier level 4
Soldier level 4
Posts: 146
Joined: Sat Jun 26, 2010 10:06 am

Re: 2 kody związane z budynkami

Post by Night »

1. Co jest złego z eventem? Przecież on jest równie dobry co every. Tylko trzeba go użyc z głową.
Być może tak, ale nie jestem, aż tak zaawansowany i wydaje mi się, że krócej i szybciej będzie przez every gdy mam dwa warunki w ten sposób:
every 0$1 TRIGGER Researched(1, tech_Tech1) and <coś>(1, b_armoury) do
User avatar
Gothuk
Site Administrator
Site Administrator
Poland
Posts: 985
Joined: Tue Sep 04, 2007 6:10 pm
Location: Poland, Warsaw
Contact:

Re: 2 kody związane z budynkami

Post by Gothuk »

1. Tyle że w twoim przypadku chcesz operować na budynkach.
Z technologiami jest o tyle dobrze, że jest ich skończona liczba i każda technologia ma swoje id.
Z budynkami jest gorzej (tak jak z pojazdami), bo co prawda prawdopodobnie każdy budynek w grze ma jakiś odnośnik w kodzie źródłowym, jednak przez SAIL'a jeżeli nie nadasz mu sam identyfikatora, to nie będziesz się mógł łatwo odwoływać (oprócz filtra).

Dlatego jest funkcja Researched ( side : integer, tech : integer ), a nie ma np. Builded.
User avatar
Night
Soldier level 4
Soldier level 4
Posts: 146
Joined: Sat Jun 26, 2010 10:06 am

Re: 2 kody związane z budynkami

Post by Night »

Wciąż mam z tym problem. Zrobiłem według podanego przykładu z eventem i działa, ale nie tak jakbym chciał.

Wpierw kod wyglądał tak jak w przykładzie tj.

Code: Select all

on BuildingComplete (b) 
if GetBType (b_armoury) and GetSide (1) and Researched(1, tech_Tech1) then
begin
//kod
end;
(musiałem tylko zamiast przeciwnka dać "and", bo nie kompilowało, ale i działało bez "GetSide(1)").
Jednak wykonywał się po zbudowaniu czegokolwiek. Kombinowałem, sprawdzając różne przykłady z forum i obecnie kod ma taką postać:

Code: Select all

on BuildingComplete (b) do
begin
if (b)=zbrojownia and Researched(1, tech_Tech1) then
//kod
end;
plus wyżej w kodzie zdefiniowane:

Code: Select all

zbrojownia=b_armoury;
i w dodane w Exporcie zbrojownia.

Ale nadal wykonuje kod dla każdego zbudowanego budynku. Nie mogę zrozumieć dlaczego.
I druga rzecz, że przy poprzedniej postaci kodu wykonywało go tylko wtedy gdy zbrojownia była zbudowana po opracowaniu technologii. Jeśli odwrotnie - nic się nie działo. Przy obecnej formie nie uwzględnia warunku technologii w ogóle. Wystarczy coś zbudować.
User avatar
Gothuk
Site Administrator
Site Administrator
Poland
Posts: 985
Joined: Tue Sep 04, 2007 6:10 pm
Location: Poland, Warsaw
Contact:

Re: 2 kody związane z budynkami

Post by Gothuk »

Źle to robisz.

Code: Select all

export my_side;
var armoury_builded;
var tech1_researched;

Starting
begin
   my_side = 1; // amerykanie - niebiescy
   armoury_builded = false;
   tech1_researched = false;
end;

On BuildingComplete (b) do
   if GetBType(b) = b_armoury and GetSide(b) = my_side then
      armoury_builded = true;

On ResearchComplete(tech, lab) do
   if tech = tech_Tech1 and GetSide(lab) = my_side then
      tech1_researched = true;

Every 0$1 trigger armoury_builded and  tech1_researched do
begin
   // do sth.
end;
Tak z grubsza. Powinno zadziałać.
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: 2 kody związane z budynkami

Post by Serpent »

Dajesz zmienną lokalną jak zmienną globalną? :D

Już lepiej dać to w export.
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
Gothuk
Site Administrator
Site Administrator
Poland
Posts: 985
Joined: Tue Sep 04, 2007 6:10 pm
Location: Poland, Warsaw
Contact:

Re: 2 kody związane z budynkami

Post by Gothuk »

my_side może być użyta w innym module dlatego globalna. Zmienne armoury_builded i tech1_researched nie są potrzebne w innych modułach więc są lokalne, ale tylko co do jednego modułu.
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: 2 kody związane z budynkami

Post by Serpent »

Gothuk wrote:Zmienne armoury_builded i tech1_researched nie są potrzebne w innych modułach więc są lokalne, ale tylko co do jednego modułu.

Skąd wiesz że nie są? :P

Zresztą, nie ważne.

Night, dobrze by było gdybyś lepiej zapoznał się z eventami bo to bardziej efektywne niż klepanie samych every.
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
Gothuk
Site Administrator
Site Administrator
Poland
Posts: 985
Joined: Tue Sep 04, 2007 6:10 pm
Location: Poland, Warsaw
Contact:

Re: 2 kody związane z budynkami

Post by Gothuk »

Nie tylko efektywne, ale też sporo bardziej wydajne.

Every z triggerem co sekundę wywołuje funkcje która sprawdza czy jest już true, czy nie. Wywołanie takiej funkcji kosztuje.
Eventy działają trochę inaczej. Funkcja podana w konstrukcji on ... do jest swoistym delegatem którego podpinamy do zdarzenia. Działa to tak, że funkcja macierzysta po danej czynności sama wywołuje podpięte do niej funkcje. Dzięki temu jest to bardziej wydajne aniżeli Every z analogiczną funkcją.

W naszym przypadku delegat BuildingComplete zostanie wywołany po wybudowaniu każdego budynku (funkcja macierzysta wysyła jako parametr jaki budynek został wybudowany), dlatego musimy sprawdzić co to za budynek, czy on nam pasuje. Jeżeli to ten którego chcemy to ustawiamy sobie zmienną boolowską na prawdę. To samo z badaniem.
Teraz porówanie dwóch zmiennych boolowskich jest sporo bardziej wydajne niż wywołanie odrębnej funkcji, która musi sprawdzić jeszcze sporo innych rzecz.
Serpent wrote:Skąd wiesz że nie są? :P
Bo tak ;).
User avatar
Night
Soldier level 4
Soldier level 4
Posts: 146
Joined: Sat Jun 26, 2010 10:06 am

Re: 2 kody związane z budynkami

Post by Night »

Zaczynam właśnie rozumieć na jakiej zasadzie działają eventy i staram się z nich korzystać. Nie mniej jednak every staram się markedować, żeby nie sprawdzały bez potrzeby cała misję.

do my_side rzeczywiście podpiąłem jeszcze jeden budynek, który dałem już do innego modułu, więc globalnie będzie szybciej, niż potem robić jeszcze raz podobny manewr.

Jednak

Code: Select all

On ResearchComplete(tech, lab) do
, wciąż mi sprawia problemy. Wywala błą przy kompilacji na "lab". Zajrzałem do podobnych przykładów na forum i było coś w tym stylu:

Code: Select all

if tech = tech_Tech1 and GetSide(lab)
zamiast
if tech = tech_Tech1 and GetSide(b)
Ale to też mi nie podziałało. Nie bardzo rozumiem do czego odnosi się to "lab". Próbowałem zdefiniować wcześniej "lab" jako konkretny budynek ale nie kompilowało mi tego. Później próbowałem dodać do var (tylko z true w my_side) i dalej tego "lab" niechce przemielić.
User avatar
Gothuk
Site Administrator
Site Administrator
Poland
Posts: 985
Joined: Tue Sep 04, 2007 6:10 pm
Location: Poland, Warsaw
Contact:

Re: 2 kody związane z budynkami

Post by Gothuk »

Night wrote:Wywala błą przy kompilacji na "lab"
Ehh, kiedy ludzie nauczą się wreszcie, że jak mają jakiś błąd to warto wkleić jego treść? W treści błędu zawsze jest co kompilatorowi nie pasuje.

Otóż owy lab to identifikator budynku, w którym badanie zostało zakończone i jest on przekazywany jako drugi parametr ResearchComplete. Więc możesz sobie to zapisać jak chcesz:

on ResearchComplete(p1, p2)
on ResearchComplete(tech, lab)
on ResearchComplete(t, b)

TO wszystko to samo, to są tylko nazwy parametrów do których się potem odnosisz.
Night wrote:. Później próbowałem dodać do var (tylko z true w my_side) i dalej tego "lab" niechce przemielić.
Co ma my_side do zmiennej lab w wywołaniu zdarzenia?
Poza tym to powinien być integer (liczba całkowita) a nie boolean ( true/false );
GetSide zwraca integera, dlatego porównujesz go z integerem.
( Tak jeżeli wpisałeś true to mogło to również zadziałać bo zostało wykonane rzutowanie z boola na inta w ten sposób, że: true = 1, false = 0 - jednak logicznie jest to nie poprawnie);
User avatar
Night
Soldier level 4
Soldier level 4
Posts: 146
Joined: Sat Jun 26, 2010 10:06 am

Re: 2 kody związane z budynkami

Post by Night »

W sensie wskazuje na "lab" jako problem.
'identifier' expected but 'lab' found'
Znalazlem jeszcze, że powinno być w tym side

Code: Select all

on researchcomplete(tech, side) do
Ale za nic nie chciało działać, gdy wpisywałem "1". Jednak gdy dałem americans (działa też na american), przeszło i kod działa.
Co ma my_side do zmiennej lab w wywołaniu zdarzenia?
Próbowałem zdefiniować labolatorium na różne sposoby, w tym przez zapisanie go w my_side.
User avatar
Gothuk
Site Administrator
Site Administrator
Poland
Posts: 985
Joined: Tue Sep 04, 2007 6:10 pm
Location: Poland, Warsaw
Contact:

Re: 2 kody związane z budynkami

Post by Gothuk »

Czyli tak jak myślałem, zmienna lab masz już zajętą przez coś (np. jakiś budynek o takim id).

Zamień tą część na

Code: Select all

On ResearchComplete(tech, b) do
   if tech = tech_Tech1 and GetSide(b) = my_side then
      tech1_researched = true;
Znalazlem jeszcze, że powinno być w tym side
Nie powinno. Tak wiem, że na forum był taki kod, ale jest on niepoprawny.
Ale za nic nie chciało działać, gdy wpisywałem "1". Jednak gdy dałem americans (działa też na american), przeszło i kod działa.
Nadal nie rozumiesz tej idei. Tu masz definicje funkcji, a nie jej wywołanie. To sama gra wywołuje tą funkcję.

W skrócie:

Code: Select all

function funkcja(a,b,c) 
begin
   ...
end
To definicja zwykłej funkcji, a jej wywołanie wygląda tak:

Code: Select all

 funkcja( cos1, cos2, cos3);
Zaś:

Code: Select all

on funkcja2(x, y, z) do
begin 
   ...
end;
to definicja funkcji która jest delegatem do funkcji zaszytej wewnątrz gry (delegata można pojmować jako wskaźnik na funkcję).
I z reguły sam nie wywołujesz takich funkcji, to gra sama ją wywołuje. (Co nie znaczy że jest to niemożliwe: np. RaiseSailEvent
User avatar
Night
Soldier level 4
Soldier level 4
Posts: 146
Joined: Sat Jun 26, 2010 10:06 am

Re: 2 kody związane z budynkami

Post by Night »

Czyli tak jak myślałem, zmienna lab masz już zajętą przez coś (np. jakiś budynek o takim id).
Zamień tą część na

Code: Select all

Kod:
On ResearchComplete(tech, b) do
   if tech = tech_Tech1 and GetSide(b) = my_side then
      tech1_researched = true;
Znalazłem i uwolniłem id "lab". Przeszło. Z "b" próbowałem wcześniej i póki "lab" było zablokowane nie działało. Gdy uwolniłem i zadziałało z "lab" z ciekawości sprobówałem jeszcze raz z "b" i też przeszło. Zostało już jednak z "lab".

Dzięki.
Post Reply