SAIL - Poradnik tworzenia postaci i operacje na tablicach

Gotowe kody SAIL'a, informacje na temat moddingu, itd.

Moderator: zoNE

Post Reply
User avatar
zoNE
The Great Uniter & Site Administrator
The Great Uniter & Site Administrator
Posts: 2061
Joined: Fri Feb 17, 2006 3:44 pm
Location: Poland
Contact:

SAIL - Poradnik tworzenia postaci i operacje na tablicach

Post by zoNE »

Serpent wrote: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.
Author: Serpent
Topic: viewtopic.php?f=42&t=4325
Post Reply