Page 1 of 1

SAIL - Poradnik tworzenia postaci i operacje na tablicach

Posted: Tue May 05, 2015 2:48 pm
by Serpent
O tworzeniu postaci było już setki postów jednak użytkownik Szulce prosił mnie żeby mu to wyjaśnij więc postanowiłem się tymi radami podzielić.

Przydatne linki:
Tworzenie postaci w SAIL'u (by NNPlaya)
Tworzenie ludzi (start.txt)
Tworzenie jednostek w edytorze (jest temu poświęcony rozdział) - format .docx


Tworzenie ludzi w SAIL'u:
Spoiler:

Code: Select all

Function Tworz_Czlowieka;
var un;
begin

  // korzystając z specjalnych funkcji wczytujemy do pamięci komputera parametry jednostki
     
     uc_side := 1; // uc_side to funkcja wczytująca stronę 
     uc_nation := 1; // uc_nation to funkcja wczytująca nację

  // w tym miejscu rozpoczynamy definiowanie za pomocą funkcji hc_
     hc_class := 1; // klasa postaci 
     hc_sex := sex_male; // płeć
     hc_name := 'Jan Kowalski'; // nazwisko postaci
     hc_gallery := 'us'; // galeria postaci
     hc_face_number := 2; // numer twarzy (podajemy tylko w przypadku gdy podaliśmy galerię)
     hc_basic_skills := [1, 0, 0, 0]; // poziom postaci podstawowy 
     hc_skills := [3, 2, 1, 0]; // poziom główny postaci
     hc_attr := [10, 11]; // szybkość i pancerz

     // Wszystkie dane znajdziesz w spisie Identify -> Constans.
    
     un := CreateHuman; // używamy funkcji CreateHuman i przypisujemy ident un jednostce
     PlaceUnitXY(un, 1, 1); // umieszczamy jednostkę na koordynatach

end;


Należy pamiętać że nie trzeba za każdym razem definiować cech postaci za pomocą hc_ ponieważ
gra korzysta z ostatnio użytych ustawień.

Przykład - Chcemy stworzyć 3 żołnierzy radzieckich w kolorze czerwonym:

Function Tworz_Czlowieka(area);
var un;
begin

  // korzystając z specjalnych funkcji wczytujemy do pamięci komputera parametry jednostki
     
     uc_side := 3; // kolor czerwony (3)
     uc_nation := 3; // nacja rosyjska (3)
  
     hc_class := 1; // klasa postaci 
     hc_sex := sex_male; // płeć
     hc_name := ''; // puste miejsce oznacza losowe nazwisko
     hc_gallery := ''; // puste miejsce oznacza losową twarz
     hc_basic_skills := [1, 0, 0, 0]; // poziom postaci podstawowy 
     hc_skills := [3, 2, 1, 0]; // poziom główny postaci
     hc_attr := [10, 11]; // szybkość i pancerz
    
     un := CreateHuman;
     PlaceUnitArea(un, area, false); // umieszczamy jednostę w arei 

end;

Teraz używamy funkcji:
Every 0$01 do
var i;
begin

     for i = 1 to 3 do
         Tworz_Czlowieka(Area01);

end;

Na mapie powinno pojawić się teraz 3 żołnierzy.
Spis funkcji hc_ można znaleźć w spisie funkcji wbudowanego w edytor lub w spisie funkcji by zoNE.
Tworzenie ludzi w start.txt:
Spoiler:
Tworzenie ludzi w ten sposób jest nieco bardziej skomplikowany. Pierwsze co musimy zrobić to wypakować plik start.txt z archiwum Data1.owp za pomocą programu PakViev.

Plik ten znajdziemy w Campaigns/NACJA (Am, Ar, Ru). Po wypakowaniu tego pliku wklejamy go pod tym adresem: Twoj_Mod/Campaigns/NACJA (Am, Ar, Ru).
Cała ścieżka powinna wyglądać tak:
.../Twoj_Mod/Campaigns/NACJA (Am, Ar, Ru)/start.txt

Następnie otwieramy ten plik za pomocą jakiegoś edytora tekstu (wystarczy zwykły notatnik).

Teraz możemy dodać własne jednostki wg. wzoru:

Code: Select all

  
   Bergkamp 1 // identyfikator postaci
    DEFINE
      NAME Bergkamp // identyfikator nazwiska używany w CharName
      HUMAN 1 1 2 // od lewej: płeć (1 - m, 2 - k), profesja, nacja
      ATTR 10 10 // siła (pancerz) i szybkość
      SKILLS 3 610330 2 308146 1 1534473 2 482759 // poziomy postaci i doświadczenie
      LAST_MISSION 14 // numer misji w której charakter występuje po raz ostatni
      CHAR @ 20 0 // podświetlenie postaci jeżeli pierwsza wartość >= 100
      RANDSEED 0 // nieznany parametr
      VOICE 3 GALLERY ru 43 // numer odgłosu postaci, galeria i numer twarzy w galerii
    END_OF_DEFINE

Notka ze strony OWS:
Punkty doświadczenia w start.txt = 30x punkty doświadczenia w kampanii lub 10x punkty doświadczenia w trybie wielu graczy.

Należy pamiętać że po dodaniu postaci w start.txt musimy zmienić tę wartość na samym początku pliku:
CHARACTERS 78 // obecnie w start.txt zdefiniowanych jest 78 postaci

Umieszczanie postaci zdefiniowanej za pomocą start.txt w edytorze:
Spoiler:

Code: Select all

Służy do tego funkcja NewCharacter('string');

Przykład zastosowania:
Export Jacek;

Export Function Przygotuj_Ludzi;
begin
uc_side := 1;
uc_nation := 2;

Jacek = NewCharacter('Jacek');
PlaceUnitXY(Jacek, 1, 1, false);
End;

Przemieszczanie jednostek (ludzie, pojazdy):
Spoiler:

Code: Select all

Służą do tego funkcje z rodziny ComMove_.

ComMoveXY(ident, x, y); // rozkazuje jednostce "ident" przerwać obecne czynności i iść na hex o koordynatach x,y
ComMoveToArea(ident, area); // rozkazuje jednostce "ident" przerwać obecne czynności i iść na hex znajdujący się na danym obszarze

Funkcje AddComMove_ działają na takiej samej zasadzie z tą różnicą że nie przerywają już wykonywanych czynności.

Operacje na tablicach:
Spoiler:

Code: Select all

Definiowanie tablicy:
Export tab; // zmienna globalna tab

Export Function Tablica;
begin
tab := []; // tablica pusta

tab := tab ^ 1; // dodanie do tablicy już istniejącą zawartość tablicy i 1
tab := tab ^ Jacek; // dodanie do tablicy już istniejącą zawartość tablicy i jednostkę Jacek (ident w postaci numeru)
tab := tab ^ FilterAllUnits([f_side, 1]); // dodanie do tablicy już istniejącą zawartość tablicy i wszystkich jednostek koloru niebieskiego
tab := FilterAllUnits([f_side, 7]); // usunięcie wszystkich elementów z tablicy i dodanie do tablicy wszystkich jednostek koloru zielonego

tab := Delete(tab, 1); // usunięcie pierwszego elementu z tablicy
tab := Delete(tab, tab); // usunięcie ostatniego elementu z tablicy

display_strings := tab; // wyświetla zawartość tablicy na ekranie
End;

Warunek a tablica:
Spoiler:

Code: Select all

Założenia:
- Zapisz do tablicy wszystkie jednostki z Area11 jeżeli jest w niej przynajmniej 10 jednostek.

Export tablica;

Every 0$01 trigger FilterUnitsInArea(Area11, [f_side, 1]) >= 10 do
begin
tablica := []; // tworzenie tablicy
tablica := FilterUnitsInArea(Area11, [f_side, 1]);
End;

Zbiory:
Spoiler:

Code: Select all

Operacje na zbiorach wykonuje się za pomocą operatorów arytmetycznych +,-,*,/.

Założenia:
- Wykonaj kod jeżeli oba zbiory będą równe.

Export zbiorA, zbiorB;
Every 0$01 do
begin
zbiorA = 0;
zbiorB = 100;
End;

// Zmiana wartości co sekundę:
Every 0$01 trigger zbiorA < zbiorB do // wykonuj kod jeżeli zbiorA mniejszy od zbiorB
begin
enable;

zbiorA = zbiorA + 1;
zbiorB = zbiorB - 1;
End;

// Blok finalny
Every 0$01 trigger zbiorA = zbiorB do
begin
// wykonaj kod
End;

Jeżeli chcecie aby omówić jakieś inne zagadnienie wystarczy napisać w tym temacie.

Re: SAIL - Poradnik tworzenia postaci i operacje na tablicac

Posted: Tue May 05, 2015 6:39 pm
by MasterKiller
Tak gwoli scislosci - uc_, hc_, itp. to zmienne, nie funkcje :D

Re: SAIL - Poradnik tworzenia postaci i operacje na tablicac

Posted: Tue May 05, 2015 8:33 pm
by Serpent
Cóż literówka ;p

Re: SAIL - Poradnik tworzenia postaci i operacje na tablicac

Posted: Wed May 06, 2015 5:59 am
by Szulce
Ze zbiorów w ogóle nic nie kumam, ale chyba tablica może być moim rozwiązaniem.

Re: SAIL - Poradnik tworzenia postaci i operacje na tablicac

Posted: Wed May 06, 2015 5:10 pm
by Serpent
Szulce wrote:Ze zbiorów w ogóle nic nie kumam, ale chyba tablica może być moim rozwiązaniem.
Zbiory czy też liczniki (nazewnictwo dowolne) przechowują dane liczbowe.

W tym przykładzie co sekundę do zbiorA będzie dodawana wartość o 1 większa, a w zbiorB o 1 mniejsza. Po 50 sekundach powinien zostać spełniony warunek A = B co spowoduje wykonanie kodu w bloku finalnym.

Re: SAIL - Poradnik tworzenia postaci i operacje na tablicac

Posted: Thu May 07, 2015 11:02 pm
by Markok
Trochę się męczyłem (trochę z plusem..) ale i = i + 1 nie hulało, więc proszę kogoś (wiadomo kogo bo nikogo innego tu niema..) o zaprezentowanie receptury na moje bóle głowy, czyli wzrost liczby atakujących z każdym atakiem o +1 na przykład, swoisty survival, ehh dzięki Serp :O

Re: SAIL - Poradnik tworzenia postaci i operacje na tablicac

Posted: Thu May 07, 2015 11:33 pm
by Serpent
Dajesz licznik jako zmienna globalna i zwiększasz tą wartość niezależnie.

Code: Select all

Export atakujacy;
Export Function Define;
begin
atakujacy = 10;
end;


Every 10$00 do // cokolwiek
begin
atakujacy = atakujacy + 1;
enable;
end;

Every 5$00 trigger atakujcie_wroga do
begin

for i = 1 to atakujacy do
...
end;

Re: SAIL - Poradnik tworzenia postaci i operacje na tablicac

Posted: Fri May 08, 2015 1:09 pm
by Markok
Przy tym export function define spawnowało najpierw jedną jednostkę chociaż było jak byk = 5, jak dałem przy startingu atakujacy = 5; to wtedy 5 zaczęło dopiero spawnować od początku

Re: SAIL - Poradnik tworzenia postaci i operacje na tablicac

Posted: Fri May 08, 2015 1:20 pm
by Serpent
To zależy kiedy funkcja DEFINE została użyta. Ja preferuje robić sobie taką funkcję ze zmiennymi globalnymi i używać ją od razu w bloku Starting.

Re: SAIL - Poradnik tworzenia postaci i operacje na tablicac

Posted: Sun May 10, 2015 5:57 am
by Szulce
Serpent wrote:
Szulce wrote:Ze zbiorów w ogóle nic nie kumam, ale chyba tablica może być moim rozwiązaniem.
Zbiory czy też liczniki (nazewnictwo dowolne) przechowują dane liczbowe.

W tym przykładzie co sekundę do zbiorA będzie dodawana wartość o 1 większa, a w zbiorB o 1 mniejsza. Po 50 sekundach powinien zostać spełniony warunek A = B co spowoduje wykonanie kodu w bloku finalnym.
Czyli, jeżeli dobrze kombinuję, używając tablicy, w której mam zawarte wszystkie postacie do zrzutu i modyfikacji kodu na stworzenie jednostki, będę miał tą zdefiniowaną w start.txt?

Re: SAIL - Poradnik tworzenia postaci i operacje na tablicac

Posted: Wed Jul 08, 2015 1:47 am
by Serpent
Aby twarze ani nazwiska postaci nie powtarzały się wystarczy użyć tej funkcji zanim stworzymy losowe jednostki.

Code: Select all

Export Function RandFacesAndNames();
begin
hc_gallery := '';
hc_name := '';
hc_importance := 0;

result := true;
End;

Code: Select all

PrepareHuman(false, 1, 2);

RandFacesAndNames(); // użycie
//...