Jak stworzyć modyfikację? » Poradnik modera - Kod źródłowy

Kompilowanie kodu źródłowego

wraz z przykładami jego edycji
Artykuł z serii Jak stworzyć modyfikację?

Dla JA2, JA2 UB oraz JA2 1.13



Spis Treści

Wprowadzenie

Część Pierwsza

Kompilowanie kodów źródłowych

    I. Skąd można wziąć kody źródłowe do serii gier JA2
    II. Potrzebne programy
    III. Kompilacja kodu źródłowego do Jagged Alliance 2
1. Prawidłowa ścieżka dostępu do kodu źródłowego
2. Wdrażanie kodu źródłowego w program Visual Studio 6.0 (1998)
3. Łączenie wszystkich plików w programie
4. Ustanawianie głównego pliku do wykonania
5. Uruchamianie kompilacji
6. Miejsce utworzonego nowego pliku EXE
    IV. Kompilacja kodu źródłowego do JA2 Unfinished Business
1. Prawidłowa ścieżka dostępu do kodu źródłowego
2. Wdrażanie kodu źródłowego w program Visula Studio .NET 2003
3. Ustanawianie głównego pliku do wykonania
4. Uruchamianie kompilacji
5. Miejsce utworzonego nowego pliku EXE
    V. Kompilacja kodu źródłowego do JA2 wersja 1.13 (v. 2085)
1. Prawidłowa ścieżka dostępu do kodu źródłowego
2. Wdrażanie kodu źródłowego w program Visual Studio 2005
3. Ustanawianie głównego pliku do wykonania
4. Uruchamianie kompilacji
5. Miejsce utworzonego nowego pliku EXE
    VI. Wyższe wersje Jagged Alliance 2 1.13

Część Druga

Przykłady edycji kodu źródłowego ze strony Jagged Alliance Zone

1. Długość czasu helikoptera w powietrzu
2. Miejsce tankowania helikoptera
3. Mnożnik obrażeń
4. Dodajemy nowe podziemia do gry
5. Dodajemy przeciwników do podziemnego sektora
6. Dodajemy przejścia między sektorami
7. Zmiana położenia menu głównego
8. Zmieniamy morale najemników, przeciwników, NPC, RPC
9. Nowy obrazek eksplozji
10. Początkowy czas gry
11. Małe twarze RPC
12. Zmiana pozycji kopalń
13. Dochód kopalń

Część Trzecia

Przykłady edycji kodu źródłowego ze strony Legion Zone

    1. Pozycje startowe
    2. Dodawanie grup – Część pierwsza
    3. Dodawanie grup – Część druga

A.) Dodanie grupy, która po zauważeniu naszych najemników będzie nas atakować
B.) Trochę informacji
C.) Dodanie grupy, która zaatakuje nas tylko w wyznaczonej godzinie

    4. Sklep Bobby Ray
    5. Dodawanie nowej akcji – Część pierwsza
    6. Dodawanie nowej akcji - Część druga

A.) Uruchamianie Tigger'a
B.) Odegranie dźwięku
C.) Eskortowanie postaci - Dodawanie postaci do drużyny i jej usuwanie z drużyny
D.) Wczytanie alternatywnego sektora
E.) Rozbudowana akcja
F.) Położenie klucza na ziemi

    7. Dodawanie nowego maila
    8. Funkcje stosowane w akcjach

A.) Przeniesienie postaci do sektora
B.) Usunięcie okna dialogowego
C.) Rekrutacja postaci
D.) Rekrutacja postaci do eskortowania
E.) Usuwanie postaci eskortowanej przez drużynę
F.) Uruchomienie wyznaczonego tigger'a
G.) Fakty

    9. Dodanie podziemnego sektora
    10. Blokowanie sektorów
    11. Dodawanie tygrysów
    12. Usunięcie listu Enrico
    13. Zwiększenie ilości slotów na zapis gry
    14. Detonacja ładunków wybuchowych

Część Czwarta

Przykłady edycji plików XML ze stron JA Zone oraz Jaggedpedii

1. AltSectors.xml
2. AmmoStrings.xml
3. AmmoTypes.xml
4. Armours.xml
5. ArmyComposition.xml
6. Cities.xml
7. CompatibleFaceItems.xml
8. EnemyAmmoDrops.xml
9. EnemyArmourDrops.xml
10. EnemyExplosivesDrops.xml
11. EnemyMiscDrops.xml
12. EnemyWeaponsDrops.xml
13. ExplosionData.xml
14. Explosives.xml
15. GarrisonGroups.xml
16. IMPItemChoice.xml
17. Items.xml
18. Launchables.xml
19. LoadBearingEquipment.xml
20. MercStartingGear.xml
21. Merges.xml
22. MovementCosts.xml
23. PatrolGroups.xml
24. PeterInventory.xml
25. Pockets.xml
26. SamSites.xml
27. SectorLoadScreens.xml
28. Weapons.xml
29. Klonowanie broni (dodawanie nowej broni)



Wprowadzenie

W tym poradniku pokażę wam jak skompilować kod źródłowy do wszystkich części gry Jagged Alliance 2. Również postaram się wdrożyć w ten poradnik wszystkie przykłady edycji tego kodu źródłowego jakie można znaleźć w Internecie po to aby wszystko można było znaleźć w jednym miejscu.

Poradnik ten będzie podzielony w następujący sposób. We wprowadzeniu będzie kilka słów wstępu. W pierwszej części będzie opisany krok po kroku instruktaż dotyczący kompilowania kodów źródłowych.

W drugiej części będą przykłady edycji kodu źródłowego ze strony:

W trzeciej części będą przykłady edycji kodu źródłowego ze strony:

Natomiast w ostatniej części będą przykłady edycji plików XML, które są integralną częścią gry Jagged Alliance 2 wersja 1.13 i przykłady te pochodzą z następujących stron:

Powrót do spisu treści





Część Pierwsza

Kompilowanie kodów źródłowych

I. Skąd można wziąć kody źródłowe do serii gier JA2

Wszystkie kody źródłowe (do każdej wersji JA2 z wyjątkiem JA2 Wildfire) można znaleźć w dziale Download serwisu

Natomiast linki do poszczególnych kodów źródłowych są następujące:

II. Potrzebne programy

    1. Jagged Alliance 2
Visual Studio 6.0 (1998)
    2. Jagged Alliance 2 Unfinished Business
Visual Studio .NET 2003
    3. Jagged Alliance 2 wersja 1.13 (v. 2085)
Visual Studio 2005
    3. Jagged Alliance 2 wersja 1.13 (v. 4452)
Visual Studio 2008 lub Visual Studio 2010

Powrót do spisu treści





III. Kompilacja kodu źródłowego do Jagged Alliance 2

    1. Prawidłowa ścieżka dostępu do kodu źródłowego.

W przypadku tego kodu bardzo ważne jest aby kod źródłowy znalazł się na odpowiednim dysku. Prawidłowy dysk dla tego kodu to dysk „C:”. Dlatego gdy już ściągneliśmy kod źródłowy to wypakujmy go. Po wypakowaniu cały kod źródłowy powinien być w folderze „Jagged Alliance 2 Source Code”. Z kolei w środku tego folderu będą następne foldery mianowicie:

ja2
Standard Gaming Platform

To właśnie te dwa powyższe foldery kopiujemy i wklejamy bezpośrednio na dysk „C:”

    2. Wdrażanie kodu źródłowego w program

Po wykonaniu czynności z punktu pierwszego przystępujemy do wdrożenia kodu źródłowego w program. W tym celu otwieramy program Visual Studio 6.0 (1998). Gdy nam się otworzy klikamy na zakładkę „File”, a zniej wybieramy opcję „Open Workspace”. Powinno otworzyć się nam okno, w którym za zadanie będziemy mieli znaleźć poniższy plik (zdjęcie Nr 01):

JA2.dsw

Jeśli wszystko do tej pory wykonaliśmy poprawnie to plik ten powinien być w następującej lokalizacji.

„C:/ja2/Build”

Gdy znajdziemy nasz plik w powyższym katalogu zaznaczamy go, a następnie klikamy na opcję otwórz (zdjęcie Nr 01). Gdy klikniemy na opcję „Otwórz” program będzie wdrażał wszystkie pliki, z którego składa się kod źródłowy. Gdy skończy powinniśmy mieć kod źródłowy wdrożony w progam (zdjęcie Nr 02).

    3. Łączenie wszystkich plików w programie.

Teraz naszym zadaniem będzie połączenie wszystkich plików, z których składa się nasz kod źródłowy. Wykonujemy to po to aby dla programu były one widoczne. W tym celu klikamy na zakładkę „Tools”, a zniej wybieramy opcję „Options…”. Otworzy nam się okno, w którym klikamy na zakładkę „Directories”. Teraz w tej zakładce w pod zakładce „Show directories for:” ustawiamy opcję „Include files”.

Następnie klikamy na kwadrat wykonany z kropek, który jest tuż pod podzakładką „Show directories for:”. Gdy to wykonamy stworzy się nowa wolna ścieżka dla konkretnego folderu. Teraz w tej nowej ścieżce klikamy na ikonkę trzykropka. Otworzy nam się teraz okno, w którym musimy znaleźć katalog „Build”. Gdy go znajdziemy zaznaczamy go i klikamy na opcję „Otwórz” (zdjęcie Nr 03).

Dzięki tej operacji katalog „Bulid” zostanie włączony do programu (zdjęcie Nr 04).

Teraz tę samą operację musimy wykonać dla wszystkich folderów, z których składa się nasz kod źródłowy. Czyli operację z punktu trzeciego wykonujemy również dla folderów znajdujących się w katalogu „Build” czyli:

Demo Bounds Checker
Editor
Laptop
Res
Strategic
Tactical
TacticalAI
TileEngine
Utils

Również operację z punktu trzeciego wykonujemy dla folderu „Standard Gaming Platform”, który jak wiemy znajduje się bezpośrednio na dysku „C:”. Z tym że folder Standard Gaming Platform musi się również znaleźć w opcji „Library files” w podzakładce „Show directories for:”. Na koniec klikamy na opcję „Ok” (zdjęcie Nr 05).

Ostatecznie w podzakładce Show directories for:” w opcji „Include files” powinniśmy mieć utworzonych 11 (jedenaście) nowych ścieżek (folderów) czyli: (co do kolejności nowych ścieżek to nie ma to znaczenia.)

Build
Standard Gaming Platform
Demo Bounds Checker
Editor
Laptop
Res
Strategic
Tactical
TacticalAI
TileEngine
Utils

Natomiast w podzakładce „Show directories for:” w opcji „Library files” powinniśmy mieć jedną nową ścieżkę (folder) czyli:

Standard Gaming Platform


    4. Ustanawianie głównego pliku do wykonania

Teraz musimy pokazać programowi co ma wykonać. W tym celu klikamy na zakładkę „Build”, a zniej wybieramy opcję „Set Active Configuration”. Otworzy nam się okno, w którym musimy znaleźć następujące sformułowanie „ja2 – Win32 Release”. Po zlokalizowaniu go klikamu na opcję „Ok.” (zdjęcie Nr 06).

    5. Uruchamianie kompilacji

Ostatnią rzeczą do wykonania przed kompilacją jest włączenie kompilacji. Wykonujemy to poprzez kliknięcie na zakładkę „Build”, a zniej wybieramy opcję „Build ja2.exe” (zdjęcie Nr 07). Po naciśnięciu tej opcji rozpocznie się proces kompilacji kodu źródłowego. Czas jaki trzeba poświęcić na kompilację zależy od mocy obliczeniowej danego komputera. Dwurdzeniowy procesor z dwoma gigabajtami pamięci na pokładzie powinien skompilować kod źródłowy do pięciu minut.

    6. Miejsce utworzonego nowego pliku EXE

Jeśłi proces kompilacji zakończy się sukcesem to zostanie podana informacja taka jak na zdjęciu Nr 08. Natomiast plik EXE będzie się znajdował w następującym katalogu:

„C:/ja2”

Powrót do spisu treści





IV. Kompilacja kodu źródłowego do Jagged Alliance 2 Unfinished Business

    1. Prawidłowa ścieżka dostępu do kodu źródłowego.

Również w przypadku tego kodu bardzo ważne jest aby kod źródłowy znalazł się na odpowiednim dysku. Prawidłowy dysk dla tego kodu to dysk „C:”. Dlatego gdy już ściągneliśmy kod źródłowy to wypakujmy go. Po wypakowaniu cały kod źródłowy powinien być w folderze „Jagged Alliance 2 UB Source”. Z kolei w środku tego folderu będzie następujący folder mianowicie:

ja25

To właśnie ten powyższy folder kopiujemy i wklejamy bezpośrednio na dysk „C:”

    2. Wdrażanie kodu źródłowego w program

Po wykonaniu czynności z punktu pierwszego przystępujemy do wdrożenia kodu źródłowego w program. W tym celu otwieramy program Visual Studio .NET 2003. Gdy nam się otworzy klikamy na zakładkę „File”, a zniej wybieramy opcję „Open”, a zniej z kolei wybieramy podopcję „Project…” (zdjęcie Nr 09).

Powinno otworzyć się nam okno, w którym za zadanie będziemy mieli znaleźć poniższy plik (zdjęcie Nr 10):

JA2.vcproj

Jeśli wszystko do tej pory wykonaliśmy poprawnie to plik ten powinien być w następującej lokalizacji.

„C:/ja25/Build”

Gdy go znajdziemy zaznaczamy go i klikamy na opcję „Open” (zdjęcie Nr 10).

    3. Ustanawianie głównego pliku do wykonania

Po wdrożeniu w program kodu źródłowego musimy pokazać programowi co chcemy dokładnie wykonać. W tym celu klikamy na zakładkę zaznaczoną na czerwono na zdjęciu Nr 11 i wybieramy z niej opcję „Release

    4. Uruchamianie kompilacji

Po ustawieniu opcji „Release” nasz kod jest już całkowicie gotowy do rozpoczęcia procesu kompilacji. Aby ją rozpocząć klikamy na zakładkę „Build”, a zniej wybieramy opcję „Build Solution” (zdjęcie Nr 12). Po wybraniu tej opcji nasz kod źródłowy zacznie się kompilować. Czas jaki trzeba poświęcić na kompilację zależy od mocy obliczeniowej danego komputera. Dwurdzeniowy procesor z dwoma gigabajtami pamięci na pokładzie powinien skompilować kod źródłowy do pięciu minut.

    5. Miejsce utworzonego nowego pliku EXE

Jeśli proces kompilacji zakończy się sukcesem to zostanie podana informacja taka jak na zdjęciu Nr 13. Natomiast plik EXE będzie się znajdował w następującym katalogu

„C:/ja25”

Powrót do spisu treści





V. Kompilacja kodu źródłowego do Jagged Alliance 2 wersja 1.13 (v. 2085)

    1. Prawidłowa ścieżka dostępu do kodu źródłowego.

W przypadku tego kodu nie ma to żadnego znaczenia na jakim dysku czy w jakim katalogu on się znajduje. Gdziekolwiek ten kod źródłowy wypakujemy z archiwum to z tego miejsca możemy od razu przejść do kompilacji kodu.

    2. Wdrażanie kodu źródłowego w program

Tą czynność wykonujemy tak samo jak to było pokazane w części pierwszej w punkcie IV.2 (str. 13). Z tym, że trzeba zwrócić uwagę na dwie bardzo ważne rzeczy. Pierwszą rzeczą jest program. Do kompilacji tego kodu potrzebujemy programu Visual Studio 2005. Natomiast drugą rzeczą jest plik, który uruchamiamy, mianowicie jest to:

ja2_2005Express.sln

Powinien on się znajdować w katalogu

„… / Build”
    3. Ustanawianie głównego pliku do wykonania

Tą czynność wykonujemy tak samo jak to było pokazane w części pierwszej w punkcie IV.3 (str. 14).

    4. Uruchamianie kompilacji

Tą czynność wykonujemy tak samo jak to było pokazane w części pierwszej w punkcie IV.4 (str. 15).

    5. Miejsce utworzonego nowego pliku EXE

Jeśłi proces kompilacji zakończy się sukcesem to zostanie podana informacja taka jak na zdjęciu Nr 12. Natomiast plik EXE będzie się znajdował w następującym katalogu

„C:/ games / jagged alliance 2”

Powrót do spisu treści





VI. Wyższe wersje Jagged Alliance 2 1.13

Wyższe wersje Jagged Alliance 2 1.13 kompiluje się tak samo jak to było pokazane na przykładzie JA2 1.13 (v. 2085). Różnica może występować w programie gdyż nowsze kody źródłowe mogły zostać przystosowane do Visual Studio 2008 lub nawet Visual Studio 2010. Również plik, przez który wdrażamy cały kod źródłowy do programu Visual studio też może mieć inną nazwę ale na pewno jego rozszerzenie to albo „SLN” lub „VCPROJ” i takich plików szukajmy w celu rozpoczęcia pracy przy kompilacji wyższych wersji kodów źródłowych do JA2 1.13.

Powrót do spisu treści





Część Druga

Przykłady edycji kodu źródłowego ze strony




1. Długość czasu helikoptera w powietrzu.

Otwieramy plik Map Screen Helicopter.cpp (strategic/Map Screen Helicopter.cpp) i szukamy takiego kodu:

// refuel delay
#define REFUEL_HELICOPTER_DELAY 30 // minutes

Opis

#define REFUEL_HELICOPTER_DELAY 30 // minutes - długość wiszenia helikoptera na niebie 30 minut następnie Skyrider musi zatankować.

Aby zmienić długoś np. do godziny należy zamiast

#define REFUEL_HELICOPTER_DELAY 30 // minutes

wpisać:

#define REFUEL_HELICOPTER_DELAY 60 // minutes

W tym momencie helikopter może wisieć w powietrzu godzinę.

Powrót do spisu treści





2. Miejsca tankowania helikoptera

Otwieramy plik Map Screen Helicopter.cpp (Strategic/Map Screen Helicopter.cpp) i szukamy taki kod:

// list of sector locations where SkyRider can be refueled
UINT8 ubRefuelList[ NUMBER_OF_REFUEL_SITES ][ 2 ] =
{
{ 13, 2 }, // Drassen airport
{ 6, 9 }, // Estoni
};
INT16 sRefuelStartGridNo[ NUMBER_OF_REFUEL_SITES ] ={
9001, // drassen
13068, // estoni
};
// whether or not helicopter can refuel at this site
BOOLEAN fRefuelingSiteAvailable[ NUMBER_OF_REFUEL_SITES ] = { FALSE, FALSE };

Opis

    UINT8 ubRefuelList[ NUMBER_OF_REFUEL_SITES ][ 2 ] = - ilość miejsc w których skirider może tankować,
    {
    { 13, 2 }, // Drassen airport - lewa kolumna X (13) sektora, prawa kolumna Y (2) sektora czyli Drassen lotnisko
    { 6, 9 }, // Estoni - lewa kolumna X (6) sektora, prawa kolumna Y (9) sektora czyli Estoni.
    };
    9001, // drassen - kordy grido Drassen wyciągamy je z edytora map,
    13068, // estoni - kordy grido Estoni wyciągamy z edytora map,
    BOOLEAN fRefuelingSiteAvailable[ NUMBER_OF_REFUEL_SITES ] = { FALSE, FALSE }; - czy lub nie helicopter może tankować w tym
    miejscu false oznacza że może,

Aby zmienić położenie sektora w którym helikopter może tankować należy:

    { 13, 2 }, // Drassen airport { 6, 9 }, // Estoni zamiast oryginalnych liczb wstawić własne (patrz pogróbione liczby) czli 13, 2 to jest drassen lotnisko a 6, 9 to jest Estoni.

Aby dodać nowe położenie tankowania należy:

    dodać nowe położenie w:
    UINT8 ubRefuelList[ NUMBER_OF_REFUEL_SITES ][ 2 ] = - oryginalnie jest 2 czyli Drassen i Estoni chcemy dodać jedno położenie:
    UINT8 ubRefuelList[ NUMBER_OF_REFUEL_SITES ][ 3 ]

Następnie trzeba dodać kordy XY np.

    { 13, 2 }, // Drassen airport
    { 6, 9 }, // Estoni
    { 9, 1 }, // Omerta

Teraz trzeba dodać kordy grido np. (kordy pobieramy z edytora map)

    9001, // drassen
    13068, // estoni
    xxxxx, //Omerta
    "xxxxx" - są to kordy które pobieramy z edytora map,

Ostatnią rzeczą jaką zrobimy będzie dodanie teksu "FALSE" lub "TRUE" do BOOLEAN fRefuelingSiteAvailable[ NUMBER_OF_REFUEL_SITES ] = { FALSE, FALSE };

    przykład: FALSE - oznacza że śmigłowiec będzie mógł tankować w sektorze
    TRUE - że nie będzie mógł tankować w sektorze np.
    BOOLEAN fRefuelingSiteAvailable[ NUMBER_OF_REFUEL_SITES ] = { FALSE, FALSE, FALSE };
    dodałem trzecie "FALSE" dlatego, iż dodałem nowe miejsce lądowania.

Teraz otwieramy plik Map Screen Helicopter.h (Strategic/Map Screen Helicopter.h) i szukamy takiego kodu:

// list of refueling site's sector locations
extern UINT8 ubRefuelList[ NUMBER_OF_REFUEL_SITES ][ 2 ];

Widzimy taki sam kod jak w Map Screen Helicopter.cpp gdyż dodaliśmy nowe miejsce należy zamiast 2 wpisać 3

extern UINT8 ubRefuelList[ NUMBER_OF_REFUEL_SITES ][ 3 ];

Powrót do spisu treści





3. Mnożnik obrażeń

Czasami denerwuje zmianianie obrażeń każdej broni aby uzyskać optymalne dla nas obrażenia, pokaże teraz jak to zrobić używając kodu źródłowego i nie ingerować w edycje plików z broniami.

Otwieramy plik: Weapons.cpp (Tactical/Weapons.cpp) i szukamy takiego kodu:

#define HEAD_DAMAGE_ADJUSTMENT( x ) ((x * 3) / 2)
#define LEGS_DAMAGE_ADJUSTMENT( x ) (x / 2)

Opis pliku

    #define HEAD_DAMAGE_ADJUSTMENT( x ) ((x * 3) / 2) - definicja obrażeń dla głowy,
    #define LEGS_DAMAGE_ADJUSTMENT( x ) (x / 2) - definicja obrażeń dla nóg,

Jak się to je. Obrażenia dla głowy definiujemy w tym miejscu: ((x * 3) / 2) czyli:

    x - obrażenia naszej broni np. 50
    *3 - mnożymy to przez 3
    / 2 - podzielić na 2

Czyli w najlepszych warunkach nasz pocisk zrani przeciwnika na 75 punktów.
Aby to zmienić należy zamiast liczbę mnożenia i dzielenia wstawić własną np.

    #define HEAD_DAMAGE_ADJUSTMENT( x ) ((x * 15) / 2) - to nasz pocisk zrani przeciwnika na 375 punktów.

W przypadku obrażeń dla nóg robimy w taki sam sposób. Obrażeń dla torsu się nie definuje bo on jest przypisany jako 1. Pamiętać trzeba także o innych czynnikach, przecież wiadomo że za każdym razem nie trafimy np. 375 punktów bo to zredukuje nam kamizelka, hełm, spodnie.

Powrót do spisu treści





4. Dodajemy nowe podziemia do gry

Otwieramy plik: Campaign Init.cpp (Strategic/Campaign Init.cpp) i szukamy takiego kodu:

void BuildUndergroundSectorInfoList()

{
UNDERGROUND_SECTORINFO *curr;
SECTORINFO *pSector = NULL;

TrashUndergroundSectorInfo();

//********************
//* BASEMENT LEVEL 1 *
//********************

//Miguel's basement. Nothing here.
curr = NewUndergroundNode( 10, 1, 1 );

//O16
curr = NewUndergroundNode( 16, 15, 1 );

//Chitzena mine. Nothing here.
curr = NewUndergroundNode( 2, 2, 1 );

//San mona mine. Nothing here.
curr = NewUndergroundNode( 4, 4, 1 );
curr = NewUndergroundNode( 5, 4, 1 );

//J9
curr = NewUndergroundNode( 9, 10, 1 );
switch( gGameOptions.ubDifficultyLevel )
{
case DIF_LEVEL_EASY:
curr->ubNumTroops = 8;
break;
case DIF_LEVEL_MEDIUM:
curr->ubNumTroops = 11;
break;
case DIF_LEVEL_HARD:
curr->ubNumTroops = 15;
break;
case DIF_LEVEL_INSANE:
curr->ubNumTroops = 20;
break;

}
//J9 feeding zone
curr = NewUndergroundNode( 9, 10, 2 );
curr->ubNumCreatures = (UINT8)(2 + gGameOptions.ubDifficultyLevel*2 + Random( 2 ));

//K4
curr = NewUndergroundNode( 4, 11, 1 );
curr->ubNumTroops = (UINT8)(6 + gGameOptions.ubDifficultyLevel*2 + Random( 3 ));
curr->ubNumElites = (UINT8)(4 + gGameOptions.ubDifficultyLevel + Random( 2 ));

//O3
curr = NewUndergroundNode( 3, 15, 1 );
curr->ubNumTroops = (UINT8)(6 + gGameOptions.ubDifficultyLevel*2 + Random( 3 ));
curr->ubNumElites = (UINT8)(4 + gGameOptions.ubDifficultyLevel + Random( 2 ));
curr->ubAdjacentSectors |= SOUTH_ADJACENT_SECTOR;

//P3
curr = NewUndergroundNode( 3, 16, 1 );
switch( gGameOptions.ubDifficultyLevel )
{
case DIF_LEVEL_EASY:
curr->ubNumElites = (UINT8)(8 + Random( 3 ));
break;
case DIF_LEVEL_MEDIUM:
curr->ubNumElites = (UINT8)(10 + Random( 5 ));
break;
case DIF_LEVEL_HARD:
curr->ubNumElites = (UINT8)(14 + Random( 6 ));
break;
case DIF_LEVEL_INSANE:
curr->ubNumElites = 20;
break;

}
curr->ubAdjacentSectors |= NORTH_ADJACENT_SECTOR;

//Do all of the mandatory underground mine sectors

//Drassen's mine
//D13_B1
curr = NewUndergroundNode( 13, 4, 1 );
curr->ubAdjacentSectors |= SOUTH_ADJACENT_SECTOR;
//E13_B1
curr = NewUndergroundNode( 13, 5, 1 );
curr->ubAdjacentSectors |= NORTH_ADJACENT_SECTOR;
//E13_B2
curr = NewUndergroundNode( 13, 5, 2 );
curr->ubAdjacentSectors |= SOUTH_ADJACENT_SECTOR;
//F13_B2
curr = NewUndergroundNode( 13, 6, 2 );
curr->ubAdjacentSectors |= NORTH_ADJACENT_SECTOR | SOUTH_ADJACENT_SECTOR;
//G13_B2
curr = NewUndergroundNode( 13, 7, 2 );
curr->ubAdjacentSectors |= NORTH_ADJACENT_SECTOR; //G13_B3
curr = NewUndergroundNode( 13, 7, 3 ); curr->ubAdjacentSectors |= NORTH_ADJACENT_SECTOR;
//F13_B3
curr = NewUndergroundNode( 13, 6, 3 );
curr->ubAdjacentSectors |= SOUTH_ADJACENT_SECTOR;

//Cambria's mine
//H8_B1
curr = NewUndergroundNode( 8, 8, 1 );
curr->ubAdjacentSectors |= EAST_ADJACENT_SECTOR;
//H9_B1
curr = NewUndergroundNode( 9, 8, 1 );
curr->ubAdjacentSectors |= WEST_ADJACENT_SECTOR;
//H9_B2
curr = NewUndergroundNode( 9, 8, 2 );
curr->ubAdjacentSectors |= WEST_ADJACENT_SECTOR;
//H8_B2
curr = NewUndergroundNode( 8, 8, 2 );
curr->ubAdjacentSectors |= EAST_ADJACENT_SECTOR;
//H8_B3
curr = NewUndergroundNode( 8, 8, 3 );
curr->ubAdjacentSectors |= SOUTH_ADJACENT_SECTOR;
//I8_B3
curr = NewUndergroundNode( 8, 9, 3 );
curr->ubAdjacentSectors |= NORTH_ADJACENT_SECTOR | SOUTH_ADJACENT_SECTOR;
//J8_B3
curr = NewUndergroundNode( 8, 10, 3 );
curr->ubAdjacentSectors |= NORTH_ADJACENT_SECTOR;

//Alma's mine
//I14_B1
curr = NewUndergroundNode( 14, 9, 1 );
curr->ubAdjacentSectors |= SOUTH_ADJACENT_SECTOR;
//J14_B1
curr = NewUndergroundNode( 14, 10, 1 );
curr->ubAdjacentSectors |= NORTH_ADJACENT_SECTOR;
//J14_B2
curr = NewUndergroundNode( 14, 10, 2 );
curr->ubAdjacentSectors |= WEST_ADJACENT_SECTOR;
//J13_B2
curr = NewUndergroundNode( 13, 10, 2 );
curr->ubAdjacentSectors |= EAST_ADJACENT_SECTOR;
//J13_B3
curr = NewUndergroundNode( 13, 10, 3 );
curr->ubAdjacentSectors |= SOUTH_ADJACENT_SECTOR;
//K13_B3
curr = NewUndergroundNode( 13, 11, 3 );
curr->ubAdjacentSectors |= NORTH_ADJACENT_SECTOR;

//Grumm's mine
//H3_B1
curr = NewUndergroundNode( 3, 8, 1 );
curr->ubAdjacentSectors |= SOUTH_ADJACENT_SECTOR;
//I3_B1
curr = NewUndergroundNode( 3, 9, 1 );
curr->ubAdjacentSectors |= NORTH_ADJACENT_SECTOR;
//I3_B2
curr = NewUndergroundNode( 3, 9, 2 );
curr->ubAdjacentSectors |= NORTH_ADJACENT_SECTOR;
//H3_B2
curr = NewUndergroundNode( 3, 8, 2 );
curr->ubAdjacentSectors |= SOUTH_ADJACENT_SECTOR | EAST_ADJACENT_SECTOR;
//H4_B2
curr = NewUndergroundNode( 4, 8, 2 );
curr->ubAdjacentSectors |= WEST_ADJACENT_SECTOR;
curr->uiFlags |= SF_PENDING_ALTERNATE_MAP;
//H4_B3
curr = NewUndergroundNode( 4, 8, 3 );
curr->ubAdjacentSectors |= NORTH_ADJACENT_SECTOR;
//G4_B3
curr = NewUndergroundNode( 4, 7, 3 );
curr->ubAdjacentSectors |= SOUTH_ADJACENT_SECTOR;

Po dobrym wpatrzeniu się w kod można zauważyć, iż kod:

    curr = NewUndergroundNode( 10, 1, 1 );

odpowiada za przypisanie podziem odpowiednim sektorom, ten kod to jest akurat przypisanie podziemia piwnicy w Omercie (A10), krótki opis kodu:

    curr = NewUndergroundNode - tym rozpoczynamy przypisywanie podziem,
    (x, y, z) - np. (10, 1, 1) od lewej sektor w poziomie (10), sektor w pionie (1), poziom podziemia (1),

Zakres sektorów:

    X - 1-16
    Y - 1-16
    Z - 1-3

Aby dodać podziemia dopisujemy do kodu np. taką linijkę:

    curr = NewUndergroundNode( 16, 15, 1 );

W tym momencie mamy podziemie w sektorze O16.

Powrót do spisu treści





5. Dodajemy przeciwników do podziemnego sektora

Otwieramy Campaign Init.cpp (StrategicCampaign Init.cpp), jak czytałeś/czytałaś pierwszą cześć poradnika to wiesz o który kod chodzi.

    Więc np. Mamy zdefiniowane podziemie curr = NewUndergroundNode( 10, 1, 1 ); //Piwnica Miguela

Aby dodać przeciwników musimy się posłużyć takimi definicjami jak:

    ubNumTroops - oznacza ilosć zwykłych żołnierzy
    ubNumElites - oznacza ilość elitarnych jednostek
    ubNumCreatures - oznacza ilość potworów

Aby dodać musimy zrobić coś takiego:

curr = NewUndergroundNode( 10, 1, 1 ); //Piwnica Miguela
curr->ubNumTroops = 15;
curr->ubNumElites = 18;
curr->ubNumCreatures = 2;

Dodałem w tym momencie 15 żołnierzy, 18 elit i 2 potwory. Aby przeciwnicy się pojawili musimy ich dodać w edytorze map.

Powrót do spisu treści





6. Dodajemy przejścia między sektorami

Otwieramy plik Campaign Init.cpp (StrategicCampaign Init.cpp) szukamy kodu z podziemiami aby dodać przejście między sektorami musimy się posłużyć takimi funkcjami:

    WEST_ADJACENT_SECTOR,
    SOUTH_ADJACENT_SECTOR,
    NORTH_ADJACENT_SECTOR
    EAST_ADJACENT_SECTOR,

Aby dodać przejście stosujemy takie coś:

    curr = NewUndergroundNode( 10, 1, 1 ); //definicja sektora curr->ubAdjacentSectors |= EAST_ADJACENT_SECTOR; //strona od której możemy przejść dalej,

Aby dodać kilka przejść robimy następujące czynności:

    curr = NewUndergroundNode( 10, 1, 1 ); //definicja sektora curr->ubAdjacentSectors |= SOUTH_ADJACENT_SECTOR | EAST_ADJACENT_SECTOR; //strona od której możemy przejść dalej.

Powrót do spisu treści





7. Zmiana położenia menu głównego

Otwieramy plik MainMenuScreen.cpp (Główny katalog/MainMenuScreen.cpp) i szukamy takiego kodu:

    Linia 53 i 54

#define MAINMENU_Y iScreenHeightOffset + 277
#define MAINMENU_Y_SPACE 37

    Linia 591 i 599

iMenuButtons[ cnt ] = QuickCreateButton( iMenuImages[ cnt ], (INT16)((SCREEN_WIDTH / 2) - gusMainMenuButtonWidths[cnt]/2), (INT16)( 0 + ( cnt * 18 ) ),

iMenuButtons[ cnt ] = QuickCreateButton( iMenuImages[ cnt ], (INT16)((SCREEN_WIDTH / 2) - gusMainMenuButtonWidths[cnt]/2), (INT16)( MAINMENU_Y + ( cnt * MAINMENU_Y_SPACE ) ),

Opis

    #define MAINMENU_Y iScreenHeightOffset + 277 - tu zmieniamy położenie przycisków w pionie. Im wartość będzie większa tym nasze przyciski będą niżej. Zmieniamy liczbę 277

    #define MAINMENU_Y_SPACE 37 - zmiana odstępów między przyciskami. Im wartość będzie większa tym odstępy między przyciskami będą większe. Zmieniamy liczbę 37

    (INT16)((SCREEN_WIDTH / 2) - zmiana położenia w poziomie. Im wartość będzie zbliżona do 1 tym tekst będzie bliżej prawej strony, a im wyższa tym bliżej lewej, np. 2 to tekst na środku. Zmianiamy liczbę 2.

    gusMainMenuButtonWidths[cnt]/2) - justowanie przycisków. Im bardziej wartośćbędzie zbliżona do jedynki tym bardziej tekst będzie równany z prawej strony, a im wyższa tym bardziej z lewej, np. przy wartości 100 otrzymamy idealnie wyjustowane przyciski z lewej strony. Zmianiamy liczbę 2.

Powrót do spisu treści





8. Zmieniamy morale najemików, przeciwników, NPC, RPC

Otwieramy plik Morale.cpp (Tactical/Morale.cpp) i odnajdujemy taki kod:

MoraleEvent gbMoraleEvent[NUM_MORALE_EVENTS] =

{ TACTICAL = Short Term Effect, STRATEGIC = Long Term Effect { TACTICAL_MORALE_EVENT, +4}, //MORALE_KILLED_ENEMY
{ TACTICAL_MORALE_EVENT, -5}, //MORALE_SQUADMATE_DIED, //in same sector (not really squad)... IN ADDITION to strategic loss of morale
{ TACTICAL_MORALE_EVENT, -1}, //MORALE_SUPPRESSED, //up to 4 times per turn
{ TACTICAL_MORALE_EVENT, -2}, //MORALE_AIRSTRIKE,
{ TACTICAL_MORALE_EVENT, +2}, //MORALE_DID_LOTS_OF_DAMAGE,
{ TACTICAL_MORALE_EVENT, -3}, //MORALE_TOOK_LOTS_OF_DAMAGE,
{ STRATEGIC_MORALE_EVENT, -5}, //MORALE_KILLED_CIVILIAN,
{ STRATEGIC_MORALE_EVENT, +4}, //MORALE_BATTLE_WON,
{ STRATEGIC_MORALE_EVENT, -5}, //MORALE_RAN_AWAY,
{ STRATEGIC_MORALE_EVENT, +2}, //MORALE_HEARD_BATTLE_WON,
{ STRATEGIC_MORALE_EVENT, -2}, //MORALE_HEARD_BATTLE_LOST,
{ STRATEGIC_MORALE_EVENT, +5}, //MORALE_TOWN_LIBERATED,
{ STRATEGIC_MORALE_EVENT, -5}, //MORALE_TOWN_LOST,
{ STRATEGIC_MORALE_EVENT, +8}, //MORALE_MINE_LIBERATED,
{ STRATEGIC_MORALE_EVENT, -8}, //MORALE_MINE_LOST,
{ STRATEGIC_MORALE_EVENT, +3}, //MORALE_SAM_SITE_LIBERATED,
{ STRATEGIC_MORALE_EVENT, -3}, //MORALE_SAM_SITE_LOST,
{ STRATEGIC_MORALE_EVENT, -15}, //MORALE_BUDDY_DIED,
{ STRATEGIC_MORALE_EVENT, +5}, //MORALE_HATED_DIED,
{ STRATEGIC_MORALE_EVENT, -5}, //MORALE_TEAMMATE_DIED, //not in same sector
{ STRATEGIC_MORALE_EVENT, +5}, //MORALE_LOW_DEATHRATE,
{ STRATEGIC_MORALE_EVENT, -5}, //MORALE_HIGH_DEATHRATE,
{ STRATEGIC_MORALE_EVENT, +2}, //MORALE_GREAT_MORALE,
{ STRATEGIC_MORALE_EVENT, -2}, //MORALE_POOR_MORALE,
{ TACTICAL_MORALE_EVENT, -10}, //MORALE_DRUGS_CRASH
{ TACTICAL_MORALE_EVENT, -10}, //MORALE_ALCOHOL_CRASH
{ STRATEGIC_MORALE_EVENT, +15}, //MORALE_MONSTER_QUEEN_KILLED
{ STRATEGIC_MORALE_EVENT, +25}, //MORALE_DEIDRANNA_KILLED
{ TACTICAL_MORALE_EVENT, -1}, //MORALE_CLAUSTROPHOBE_UNDERGROUND,
{ TACTICAL_MORALE_EVENT, -5}, //MORALE_INSECT_PHOBIC_SEES_CREATURE,
{ TACTICAL_MORALE_EVENT, -1}, //MORALE_NERVOUS_ALONE,
{ STRATEGIC_MORALE_EVENT, -5}, //MORALE_MERC_CAPTURED,
{ STRATEGIC_MORALE_EVENT, -5}, //MORALE_MERC_MARRIED,
{ STRATEGIC_MORALE_EVENT, +8}, //MORALE_QUEEN_BATTLE_WON,
{ STRATEGIC_MORALE_EVENT, +5}, // MORALE_SEX,
};

Opisy co i jak

    MORALE_KILLED_ENEMY - Zabicie nieprzyjaciela
    MORALE_SQUADMATE_DIED - ktoś z oddziału zginął
    MORALE_SUPPRESSED - morale po wycofaniu sie z walki
    MORALE_AIRSTRIKE - morale po nalocie
    MORALE_DID_LOTS_OF_DAMAGE - gdy zrobiliśmy dużą szkodę wrogowi
    MORALE_TOOK_LOTS_OF_DAMAGE - jak nieprzyjaciel zrobił duża szkodę
    MORALE_KILLED_CIVILIAN - zabicie cywila
    MORALE_BATTLE_WON - wygrana walka
    MORALE_RAN_AWAY - gdy trzeba duzo biegać (zmeczenie)
    MORALE_HEARD_BATTLE_WON - wygrana odległa walka
    MORALE_HEARD_BATTLE_LOST - przegrana odległa walka
    MORALE_TOWN_LIBERATED - informacja o przegranej walce
    MORALE_TOWN_LOST - przejęcie miasta przez nieprzyjciela
    MORALE_MINE_LIBERATED - zdobyta kopalnia
    MORALE_MINE_LOST - stracona kopalnia
    MORALE_SAM_SITE_LIBERATED - zdobyte wyrzutnie sam
    MORALE_SAM_SITE_LOST - stracone wyrzutnie sam
    MORALE_BUDDY_DIED - gdy kolega zmarł
    MORALE_HATED_DIED - jak umiera nielubiany merc
    MORALE_TEAMMATE_DIED - gdy kolega z zespoły zmarł
    MORALE_LOW_DEATHRATE - lekko ranny
    MORALE_HIGH_DEATHRATE - ciężko ranny
    MORALE_GREAT_MORALE - świene morale
    MORALE_POOR_MORALE - słabe morale
    MORALE_DRUGS_CRASH - morale po spożyciu narkotyków
    MORALE_ALCOHOL_CRASH - morale po spożyciu alkoholu
    MORALE_MONSTER_QUEEN_KILLED - zabicie królowej potworów
    MORALE_DEIDRANNA_KILLED - zabicie dedrianny
    MORALE_CLAUSTROPHOBE_UNDERGROUND - klaustrofobia podziemią
    MORALE_INSECT_PHOBIC_SEES_CREATURE - wstręt do owadów, kręatur itp.
    MORALE_NERVOUS_ALONE - morale jak ktoś jest nerwowy i jest sam
    MORALE_MERC_CAPTURED - załapany najemnik
    MORALE_MERC_MARRIED - morale gdy w oddziale jest para małżeńska (np.Raven i Raider)
    MORALE_QUEEN_BATTLE_WON - wygrana walka na terenie królowej (najprawdopodobniej Meduna)
    MORALE_SEX - morale po stosunku

Aby zmienic morale ujemnie czy dodatnie to zamiast oryginalnych liczb wpisujemy własne.

Powrót do spisu treści





9. Nowy obrazek eksplozji

Otwieramy plik Explosion Control.cpp (Tile Engine/Explosion Control.cpp) i szukamy takiego kodu:

EXPLOSION_DATA gExpAniData[ NUM_EXP_TYPES ] = {
// Trans Damage Explosion Alternative Explosion Animation
// Key Key Sound Explosion Animation Speed
// Frame Frame ID SoundID Filename
{0, 0, EXPLOSION_1, EXPLOSION_ALT_BLAST_1, "", 0},
{17, 3, EXPLOSION_1, EXPLOSION_ALT_BLAST_1, "TILECACHEZGRAV_D.STI", 80},
{28, 5, EXPLOSION_BLAST_2, NO_ALT_SOUND, "TILECACHEZGRAV_C.STI", 80},
{24, 5, EXPLOSION_BLAST_2, NO_ALT_SOUND, "TILECACHEZGRAV_B.STI", 80},
{1, 5, EXPLOSION_1, EXPLOSION_ALT_BLAST_1, "TILECACHEshckwave.STI", 20},
{1, 18, AIR_ESCAPING_1, NO_ALT_SOUND, "TILECACHEWAT_EXP.STI", 80},
{1, 18, AIR_ESCAPING_1, NO_ALT_SOUND, "TILECACHETEAR_EXP.STI", 80},
{1, 18, AIR_ESCAPING_1, NO_ALT_SOUND, "TILECACHETEAR_EXP.STI", 80},
{1, 18, AIR_ESCAPING_1, NO_ALT_SOUND, "TILECACHEMUST_EXP.STI", 80}
};

Opis

    Trans Key Frame - nie wiem jeszcze
    Damage Key Frame - jaki zasięg kratek ma eksplozja,
    Explosion Sound ID - dźwięk eksplozji,
    Alternative Explosion SoundID - alternatywny dźwięk eksplozji,
    Explosion Animation Filename - ściężka dostępu do eksplozji (plik STI)
    Animation Speed - Szybkość animacji,

Aby dododać nową ekplozje należy dopisać ją: np. EXPLOSION_DATA gExpAniData[ NUM_EXP_TYPES ] =

{
// Trans Damage Explosion Alternative Explosion Animation
// Key Key Sound Explosion Animation Speed
// Frame Frame ID SoundID Filename
{0, 0, EXPLOSION_1, EXPLOSION_ALT_BLAST_1, "", 0},
{17, 3, EXPLOSION_1, EXPLOSION_ALT_BLAST_1, "TILECACHEZGRAV_D.STI", 80},
{28, 5, EXPLOSION_BLAST_2, NO_ALT_SOUND, "TILECACHEZGRAV_C.STI", 80},
{24, 5, EXPLOSION_BLAST_2, NO_ALT_SOUND, "TILECACHEZGRAV_B.STI", 80},
{1, 5, EXPLOSION_1, EXPLOSION_ALT_BLAST_1, "TILECACHEshckwave.STI", 20},
{1, 18, AIR_ESCAPING_1, NO_ALT_SOUND, "TILECACHEWAT_EXP.STI", 80},
{1, 18, AIR_ESCAPING_1, NO_ALT_SOUND, "TILECACHETEAR_EXP.STI", 80},
{1, 18, AIR_ESCAPING_1, NO_ALT_SOUND, "TILECACHETEAR_EXP.STI", 80},
{1, 18, AIR_ESCAPING_1, NO_ALT_SOUND, "TILECACHEMUST_EXP.STI", 80},
{1, 18, AIR_ESCAPING_4, NO_ALT_SOUND, "TILECACHEMusztardowy.STI", 80}
};

Powrót do spisu treści





10. Początkowy czas gry

Otwieramy plik Game Clock.h (Strategic/Game Clock.h) i szukamy taki kod:

//dereferenced with the above enumerations to provide the actual time compression rate.
extern INT32 giTimeCompressSpeeds[ NUM_TIME_COMPRESS_SPEEDS ];
#define STARTING_TIME ( ( 1 * NUM_SEC_IN_HOUR ) + ( 0 * NUM_SEC_IN_MIN ) + NUM_SEC_IN_DAY ) // 1am
#define FIRST_ARRIVAL_DELAY ( ( 6 * NUM_SEC_IN_HOUR ) + ( 0 * NUM_SEC_IN_MIN ) )// 7am ( 6hours later)
#define WORLDTIMESTR gswzWorldTimeStr

Opis

    #define STARTING_TIME ( ( 1 * NUM_SEC_IN_HOUR ) + ( 0 * NUM_SEC_IN_MIN ) + NUM_SEC_IN_DAY ) // 1am - określa początkowy start gry przed wylotem na misje.
    #define FIRST_ARRIVAL_DELAY ( ( 6 * NUM_SEC_IN_HOUR ) + ( 0 * NUM_SEC_IN_MIN ) )// 7am ( 6hours later) - określa czas pierwszej bitwy w Arulco (sześć godzin później)

Aby zmienić początkowy czas przed wylotem na misje należy zamiast:

    #define STARTING_TIME ( ( 1 * NUM_SEC_IN_HOUR ) + ( 0 * NUM_SEC_IN_MIN ) + NUM_SEC_IN_DAY )

wpisac np.

    #define STARTING_TIME ( ( 6 * NUM_SEC_IN_HOUR ) + ( 0 * NUM_SEC_IN_MIN ) + NUM_SEC_IN_DAY )

Czyli początkowy czas gry przed wylotem na misje to będzie w tedy 6 rano.

Aby zmienić czas pierwszej bitwy należy zamiast:

    #define FIRST_ARRIVAL_DELAY ( ( 6 * NUM_SEC_IN_HOUR ) + ( 0 * NUM_SEC_IN_MIN ) )

wpisać np.

    #define FIRST_ARRIVAL_DELAY ( ( 10 * NUM_SEC_IN_HOUR ) + ( 0 * NUM_SEC_IN_MIN ) )

Czas pierwszej bitwy rozpocznie się o godzinie 16.

Jak to wszystko działa:

Dodajemy czasy z #define STARTING_TIME i #define FIRST_ARRIVAL_DELAY czyli w oryginale w #define STARTING_TIME było 1 a w #define FIRST_ARRIVAL_DELAY było 6 czyli

sumując 1+6=7 i taki czas pierwszej bitwy jest w oryginale.

Powrót do spisu treści





11. Małe twarze RPC

Aby nadać kordy małym twarzą w v1.13 trzeba edytować kod źródłowy, niestey nie da się otworzyć exeka programem ProEdit - Addon więc pokaże jak zrobić bez w/w porgramu.

Otwieramy plik Faces.cpp (Tactical/Faces.cpp), Odnajdujemy taki kod:

RPC_SMALL_FACE_VALUES gRPCSmallFaceValues[ ] =
{
9, 8, 8, 24, // MIGUEL ( 57 )
8, 8, 7, 24, // CARLOS ( 58 )
10, 8, 8, 26, // IRA ( 59 )
7, 8, 7, 26, // DIMITRI ( 60 )
6, 7, 7, 23, // DEVIN ( 61 )
0, 0, 0, 0, // THE RAT ( 62 )
8, 7, 8, 23, // ( 63 )
8, 8, 8, 22, // SLAY ( 64 )
0, 0, 0, 0, // ( 65 )
9, 4, 7, 22, // DYNAMO ( 66 )
8, 8, 8, 25, // SHANK ( 67 )
4, 6, 5, 22, // IGGY ( 68 )
8, 9, 7, 25, // VINCE ( 69 )
4, 7, 5, 25, // CONRAD ( 70 )
9, 7, 8, 22, // CARL ( 71 )
9, 7, 9, 25, // MADDOG ( 72 )
0, 0, 0, 0, // ( 73 )
0, 0, 0, 0, // ( 74 )
9, 3, 8, 23, // MARIA ( 88 )
9, 3, 8, 25, // JOEY ( 90 )
11, 7, 9, 24, // SKYRIDER ( 97 )
9, 5, 7, 23, // Miner ( 106 )
6, 4, 6, 24, // JOHN ( 118 )
12, 4, 10, 24, // ( 119 )
8, 6, 8, 23, // Miner ( 148 )
6, 5, 6, 23, // Miner ( 156 )
13, 7, 11, 24, // Miner ( 157 )
9, 7, 8, 22, // Miner ( 158 )
};

Interesują nas tylko liczby z 1,2,3, i 4 kolumny po koleji oznaczone one są tak:

    pierwsza kolumna Oczy X
    druga kolumna: Oczy Y
    trzecia kolumna :Usta X
    czwarta kolumna :Usta Y

Po prawej stronie mamy opisane które kordy i do kogo należą, Żeby zmienić koordy należy zamiast aktualnych liczb wpisać własne, Kompilujemy plik Tactical.vcproj (folder Tactical).

Powrót do spisu treści





12. Zmiana pozycji kopalń

Otwieramy plik Strategic Mines.cpp (Strategic/Strategic Mines.cpp), i wyszukujemy taki kod:

// this table holds mine values that never change and don't need to be saved MINE_LOCATION_TYPE gMineLocation[MAX_NUMBER_OF_MINES] = { { 4, 4, SAN_MONA },
{ 13, 4, DRASSEN },
{ 14, 9, ALMA },
{ 8, 8, CAMBRIA },
{ 2, 2, CHITZENA },
{ 3, 8, GRUMM },
};

Kod ten wyznacza X i Y kopalń na mapie np. X=4 Y=4 jest to pozycja opuszczonej kopalni w San Monie.

Aby zmienić pozycje nalezy zamiast oryginalnych liczb wpisac własne np.

// this table holds mine values that never change and don't need to be saved MINE_LOCATION_TYPE gMineLocation[MAX_NUMBER_OF_MINES] = { { 1, 1, SAN_MONA },
{ 2, 1, DRASSEN },
{ 3, 1, ALMA },
{ 4, 1, CAMBRIA },
{ 5, 1, CHITZENA },
{ 6, 1, GRUMM },
};

Teraz kopalnia San Mony będzie w sektorze A1, Drassen A2, Alma A3, Cambria A4, Chitzena A5, Grumm A6.

Powrót do spisu treści





13. Dochód kopalń

Otwieramy plik Strategic Mines.cpp (Strategic/Strategic Mines.cpp) i wyszukujemy taki kod:

// These values also determine the most likely ratios of mine sizes after random production increases are done UINT32 guiMinimumMineProduction[]={
0, // SAN MONA
1000, // DRASSEN
1500, // ALMA
1500, // CAMBRIA
500, // CHITZENA
2000, // GRUMM
};

Liczby: 0, 1000, 1500, 1500, 500, 2000 oznaczają maksymalny dochód danej kopalni.

Aby zmienić dochód nalezy zamiast oryginalnych liczb wpisać własne.

Powrót do spisu treści





Część Trzecia

Przykłady edycji kodu źródłowego ze strony

Legion Zone




1. Pozycje startowe

A.) AI Viewer.cpp

1. Szukane:

if( ( gsSelSectorX == 0 ) || ( gsSelSectorY == 0 ) )
gsSelSectorX = 9, gsSelSectorY = 1;

1. Zmieniamy na:

if( ( gsSelSectorX == 0 ) || ( gsSelSectorY == 0 ) )
gsSelSectorX = gGameExternalOptions.SektorX, gsSelSectorY = gGameExternalOptions.SektorY;

B.) Campaign Init.cpp

2. Szukane:

SetSectorFlag( 9, 1, 0, SF_ALREADY_VISITED );

2. Zmieniamy na:

SetSectorFlag( gGameExternalOptions.SektorX5, gGameExternalOptions.SektorY5, 0, SF_ALREADY_VISITED );

C.) Game Init.cpp

3. Szukane:

ChangeSelectedMapSector( 9, 1, 0 ); //ZAZNACZENIE SEKTORA STARTOWEGO

3. Zmieniamy na:

ChangeSelectedMapSector( gGameExternalOptions.SektorX4, gGameExternalOptions.SektorY4, 0 );

D.) Map Screen Interface Map.cpp

4. Szukane:

UINT16 sSelMapX = 9;
UINT16 sSelMapY = 1;

4. Zmieniamy na:

UINT16 sSelMapX = gGameExternalOptions.SektorX3;
UINT16 sSelMapY = gGameExternalOptions.SektorY3;

E.) Map Screen Interface.cpp

5. Szukane:

if( gTacticalStatus.fDidGameJustStart == FALSE )
{
return( FALSE );
}
// select starting sector (A9 - Omerta)
ChangeSelectedMapSector( 9, 1, 0 );
// load starting sector
if ( !SetCurrentWorldSector( 9, 1, 0 ) )
{
return( FALSE );
}
//Setup variables in the PBI for this first battle. We need to support the
//non-persistant PBI in case the user goes to mapscreen.
gfBlitBattleSectorLocator = TRUE;
gubPBSectorX = 9;
gubPBSectorY = 1;
gubPBSectorZ = 0;
gubEnemyEncounterCode = ENTERING_ENEMY_SECTOR_CODE;
if( gTacticalStatus.fDidGameJustStart == FALSE )
{
return( FALSE );
}

5. Zmieniamy na:

// select starting sector (A9 - Omerta)
ChangeSelectedMapSector( gGameExternalOptions.SektorX2, gGameExternalOptions.SektorY2, 0 );
// load starting sector
if ( !SetCurrentWorldSector( gGameExternalOptions.SektorX2, gGameExternalOptions.SektorY2, 0 ) )
{
return( FALSE );
}
//Setup variables in the PBI for this first battle. We need to support the
//non-persistant PBI in case the user goes to mapscreen.
gfBlitBattleSectorLocator = TRUE;
gubPBSectorX = gGameExternalOptions.SektorX2;
gubPBSectorY = gGameExternalOptions.SektorY2;
gubPBSectorZ = 0;
gubEnemyEncounterCode = ENTERING_ENEMY_SECTOR_CODE;

F.) mapscreen.cpp

6. Szukane:

// if arrival sector is invalid, reset to A9
if ( ( gsMercArriveSectorX < 1 ) || ( gsMercArriveSectorY < 1 ) ||
( gsMercArriveSectorX > 16 ) || ( gsMercArriveSectorY > 16 ) )
{
gsMercArriveSectorX = 9;
gsMercArriveSectorY = 1;
}

6. Zmieniamy na:

// if arrival sector is invalid, reset to A9
if ( ( gsMercArriveSectorX < 1 ) || ( gsMercArriveSectorY < 1 ) ||
( gsMercArriveSectorX > 16 ) || ( gsMercArriveSectorY > 16 ) )
{
gsMercArriveSectorX = gGameExternalOptions.SektorX1;
gsMercArriveSectorY = gGameExternalOptions.SektorY1;
}

7. Szukane:

// change selected sector/level if necessary
// NOTE: Must come after border buttons are created, since it may toggle them!
if( AnyMercsHired( ) == FALSE )
{
// select starting sector (A9 - Omerta)
ChangeSelectedMapSector( 9, 1, 0 );
}
else if( ( gWorldSectorX > 0 ) && ( gWorldSectorY > 0 ) && ( gbWorldSectorZ != -1 ) )
{
// select currently loaded sector as the map sector
ChangeSelectedMapSector( gWorldSectorX, gWorldSectorY, gbWorldSectorZ );
}
else // no loaded sector
{
// only select A9 - Omerta IF there is no current selection, otherwise leave it as is
if ( ( sSelMapX == 0 ) || ( sSelMapY == 0 ) || ( iCurrentMapSectorZ == -1 ) )
{
ChangeSelectedMapSector( 9, 1, 0 );
}
}

7. Zmieniamy na:

// change selected sector/level if necessary
// NOTE: Must come after border buttons are created, since it may toggle them!
if( AnyMercsHired( ) == FALSE )
{
// select starting sector (A9 - Omerta)
ChangeSelectedMapSector( gGameExternalOptions.SektorX1, gGameExternalOptions.SektorY1, 0 );
}
else if( ( gWorldSectorX > 0 ) && ( gWorldSectorY > 0 ) && ( gbWorldSectorZ != -1 ) )
{
// select currently loaded sector as the map sector
ChangeSelectedMapSector( gWorldSectorX, gWorldSectorY, gbWorldSectorZ );
}
else // no loaded sector
{
// only select A9 - Omerta IF there is no current selection, otherwise leave it as is
if ( ( sSelMapX == 0 ) || ( sSelMapY == 0 ) || ( iCurrentMapSectorZ == -1 ) )
{
ChangeSelectedMapSector( gGameExternalOptions.SektorX1, gGameExternalOptions.SektorY1, 0 );
}

8. Szukane:

// handle display of inventory pop up
HandleDisplayOfItemPopUpForSector( 9, 1, 0 );

8. Zmieniamy na:

// handle display of inventory pop up
HandleDisplayOfItemPopUpForSector( gGameExternalOptions.SektorX1, gGameExternalOptions.SektorY1, 0 );

9. Szukane:

// set up the helicopter over Omerta (if it's not already set up)
SetUpHelicopterForPlayer( 9,1 );

9. Zmieniamy na:

// set up the helicopter over Omerta (if it's not already set up)
SetUpHelicopterForPlayer( gGameExternalOptions.SektorX1, gGameExternalOptions.SektorY1 );

G.) Strategic AI.cpp

10. Szukane:

if( GroupAtFinalDestination( pGroup ) )
{
//Wake up the queen now, if she hasn't woken up already. //ZWIAZANE Z ALARMEM DLA KRÓLOWEJ?
WakeUpQueen();
if( pGroup->ubSectorX == 9 && pGroup->ubSectorY == 1 ||
pGroup->ubSectorX == 3 && pGroup->ubSectorY == 16 )
{
SendGroupToPool( &pGroup );
if( !pGroup )
{ //Group was transferred to the pool
return TRUE;
}
}
}

10. Zmieniamy na:

if( GroupAtFinalDestination( pGroup ) )
{
//Wake up the queen now, if she hasn't woken up already.
WakeUpQueen();
if( pGroup->ubSectorX == gGameExternalOptions.SektorX && pGroup->ubSectorY == gGameExternalOptions.SektorY ||
pGroup->ubSectorX == 3 && pGroup->ubSectorY == 16 )
{
SendGroupToPool( &pGroup );
if( !pGroup )
{ //Group was transferred to the pool
return TRUE;
}
}
}
}

11. Szukane:

if( PlayerMercsInSector( 9, 1, 1 ) && !PlayerMercsInSector( 10, 1, 1 ) && !PlayerMercsInSector( 10, 1, 2 ) )
{ //send to A9 (if mercs in A9, but not in A10 or A10 basement)
ubSectorID = SEC_A9;
}
else
{ //send to A10
ubSectorID = SEC_A10;
}

11. Zmieniamy na:

if( PlayerMercsInSector( gGameExternalOptions.SektorX, gGameExternalOptions.SektorY, 1 ) &&
!PlayerMercsInSector( 10, 1, 1 ) && !PlayerMercsInSector( 10, 1, 2 ) )
{ //send to A9 (if mercs in A9, but not in A10 or A10 basement)
ubSectorID = gGameExternalOptions.SEKTOR_NAZWA;
}
else
{ //send to A10
ubSectorID = SEC_A10;
}

12. Szukane:

//Convert the garrison sitting in Omerta (if alive), and reassign them
pSector = &SectorInfo[ SEC_A9 ];
if( pSector->ubNumTroops )
{
pGroup = CreateNewEnemyGroupDepartingFromSector( SEC_A9, 0, pSector->ubNumTroops, 0 );
Assert( pGroup );
pSector->ubNumTroops = 0;
pGroup->pEnemyGroup->ubIntention = PATROL;
pGroup->ubMoveType = ONE_WAY;
ReassignAIGroup( &pGroup );
ValidateGroup( pGroup );
RecalculateSectorWeight( SEC_A9 );
}

12. Zmieniamy na:

pSector = &SectorInfo[ gGameExternalOptions.SEKTOR_NAZWA ];
if( pSector->ubNumTroops )
{
pGroup = CreateNewEnemyGroupDepartingFromSector( (UINT8)SECTOR( gGameExternalOptions.SektorX,
gGameExternalOptions.SektorY ), 0,pSector->ubNumTroops, 0 );
Assert( pGroup );
pSector->ubNumTroops = 0;
pGroup->pEnemyGroup->ubIntention = PATROL;
pGroup->ubMoveType = ONE_WAY;
ReassignAIGroup( &pGroup );
ValidateGroup( pGroup );
RecalculateSectorWeight( gGameExternalOptions.SEKTOR_NAZWA ); }

H.) strategicmap.cpp

13. Szukane:

// move the landing zone over to Omerta
gsMercArriveSectorX = 9;
gsMercArriveSectorY = 1;

13. Zmieniamy na:

// move the landing zone over to Omerta
gsMercArriveSectorX = gGameExternalOptions.SektorX;
gsMercArriveSectorY = gGameExternalOptions.SektorY;

14. Szukane:

// Are we in Omerta!
if ( sSectorX == gWorldSectorX && gWorldSectorX == 9 && sSectorY == gWorldSectorY && gWorldSectorY == 1 && bSectorZ == gbWorldSectorZ && gbWorldSectorZ == 0 )
{
// Try another location and walk into map
pSoldier->sInsertionGridNo = 4379; //GRIDO START
}
else
{
pSoldier->ubStrategicInsertionCode = INSERTION_CODE_NORTH;
pSoldier->sInsertionGridNo = gMapInformation.sNorthGridNo;
}

14. Zmieniamy na:

if ( sSectorX == gWorldSectorX && gWorldSectorX == gGameExternalOptions.SektorX && sSectorY == gWorldSectorY && gWorldSectorY == gGameExternalOptions.SektorY && bSectorZ == gbWorldSectorZ && gbWorldSectorZ == 0 )
{
// Try another location and walk into map
pSoldier->sInsertionGridNo = 4379;
}
else
{
pSoldier->ubStrategicInsertionCode = INSERTION_CODE_NORTH;
pSoldier->sInsertionGridNo = gMapInformation.sNorthGridNo;
}

15. Szukane:

// move the landing zone over to Omerta
gsMercArriveSectorX = 9;
gsMercArriveSectorY = 1;

15. Zmieniamy na:

// move the landing zone over to Omerta
gsMercArriveSectorX = gGameExternalOptions.SektorX;
gsMercArriveSectorY = gGameExternalOptions.SektorY;

I.) Merc Entering.cpp

16. Szukane:

for ( cnt = gbCurDrop; cnt < gbNumHeliSeatsOccupied; cnt++ )
{
// Add merc to sector //DODAJE MERC DO SEKTORA
MercPtrs[ gusHeliSeats[ cnt ] ]->ubStrategicInsertionCode = INSERTION_CODE_NORTH;
UpdateMercInSector( MercPtrs[ gusHeliSeats[ cnt ] ], 9, 1, 0 );
// Check for merc arrives quotes...
HandleMercArrivesQuotes( MercPtrs[ gusHeliSeats[ cnt ] ] );
ScreenMsg( FONT_MCOLOR_WHITE, MSG_INTERFACE, TacticalStr[ MERC_HAS_ARRIVED_STR ], MercPtrs[ gusHeliSeats[ cnt ] ]->name );
}

16. Zmieniamy na:

for ( cnt = gbCurDrop; cnt < gbNumHeliSeatsOccupied; cnt++ )
{
// Add merc to sector
MercPtrs[ gusHeliSeats[ cnt ] ]->ubStrategicInsertionCode = INSERTION_CODE_NORTH;
UpdateMercInSector( MercPtrs[ gusHeliSeats[ cnt ] ], gGameExternalOptions.SektorX, gGameExternalOptions.SektorY, 0 );
// Check for merc arrives quotes...
HandleMercArrivesQuotes( MercPtrs[ gusHeliSeats[ cnt ] ] );
ScreenMsg( FONT_MCOLOR_WHITE, MSG_INTERFACE, TacticalStr[ MERC_HAS_ARRIVED_STR ], MercPtrs[ gusHeliSeats[ cnt ] ]->name );
}

17. Szukane:

UpdateMercInSector( MercPtrs[ gusHeliSeats[ gbCurDrop ] ], 9, 1, 0 );

17. Zmieniamy na:

UpdateMercInSector( MercPtrs[ gusHeliSeats[ gbCurDrop ] ], gGameExternalOptions.SektorX,
gGameExternalOptions.SektorY, 0 );

J.) Merc Hiring.cpp

18. Szukane:

INT16 gsMercArriveSectorX = 9;
INT16 gsMercArriveSectorY = 1;

18. Zmieniamy na:

INT16 gsMercArriveSectorX = gGameExternalOptions.SektorX;
INT16 gsMercArriveSectorY = gGameExternalOptions.SektorY;

19. Szukane:

if( !DidGameJustStart() && gsMercArriveSectorX == 9 && gsMercArriveSectorY == 1 )
{ //Mercs arriving in A9. This sector has been deemed as the always safe sector.
//Seeing we don't support entry into a hostile sector (except for the beginning),
//we will nuke any enemies in this sector first.
if( gWorldSectorX != 9 || gWorldSectorY != 1 || gbWorldSectorZ )
{
EliminateAllEnemies( (UINT8)gsMercArriveSectorX, (UINT8)gsMercArriveSectorY );
}
}

19. Zmieniamy na:

if( !DidGameJustStart() && gsMercArriveSectorX == gGameExternalOptions.SektorX && gsMercArriveSectorY == gGameExternalOptions.SektorY )
{ //Mercs arriving in A9. This sector has been deemed as the always safe sector.
//Seeing we don't support entry into a hostile sector (except for the beginning),
//we will nuke any enemies in this sector first.
if( gWorldSectorX != gGameExternalOptions.SektorX || gWorldSectorY != gGameExternalOptions.SektorY || gbWorldSectorZ )
{
EliminateAllEnemies( (UINT8)gsMercArriveSectorX, (UINT8)gsMercArriveSectorY );
}
}

20. Szukane:

if ( pSoldier->ubStrategicInsertionCode != INSERTION_CODE_CHOPPER && pSoldier->sSectorX == 9 && pSoldier->sSectorY == 1 ) ...............

20. Zmieniamy na:

if ( pSoldier->ubStrategicInsertionCode != INSERTION_CODE_CHOPPER && pSoldier->sSectorX ==
gGameExternalOptions.SektorX && pSoldier->sSectorY == gGameExternalOptions.SektorY ) .............

K.) gamescreen.cpp

21. Szukane:

AirRaidDef.sSectorX = 9;
AirRaidDef.sSectorY = 1;

21. Zmieniamy na:

AirRaidDef.sSectorX = gGameExternalOptions.SektorX6;
AirRaidDef.sSectorY = gGameExternalOptions.SektorY6;

Dodano do plików

L.) GameSettings.cpp

gGameExternalOptions.SektorX = iniReader.ReadInteger("JA2 Start Game","X",9);
gGameExternalOptions.SektorX1 = iniReader.ReadInteger("JA2 Start Game","X",9);
gGameExternalOptions.SektorX2 = iniReader.ReadInteger("JA2 Start Game","X",9);
gGameExternalOptions.SektorX3 = iniReader.ReadInteger("JA2 Start Game","X",9);
gGameExternalOptions.SektorX4 = iniReader.ReadInteger("JA2 Start Game","X",9);
gGameExternalOptions.SektorX5 = iniReader.ReadInteger("JA2 Start Game","X",9);
gGameExternalOptions.SektorX6 = iniReader.ReadInteger("JA2 Start Game","X",9);

gGameExternalOptions.SektorY = iniReader.ReadInteger("JA2 Start Game","Y",1);
gGameExternalOptions.SektorY1 = iniReader.ReadInteger("JA2 Start Game","Y",1);
gGameExternalOptions.SektorY2 = iniReader.ReadInteger("JA2 Start Game","Y",1);
gGameExternalOptions.SektorY3 = iniReader.ReadInteger("JA2 Start Game","Y",1);
gGameExternalOptions.SektorY4 = iniReader.ReadInteger("JA2 Start Game","Y",1);
gGameExternalOptions.SektorY5 = iniReader.ReadInteger("JA2 Start Game","Y",1);
gGameExternalOptions.SektorY6 = iniReader.ReadInteger("JA2 Start Game","Y",1);

gGameExternalOptions.SEKTOR_NAZWA = iniReader.ReadInteger("JA2 Start Game","SECTOR",SEC_A9);

M.) GameSettings.h

INT8 SektorX;
INT16 SektorX1;
INT8 SektorX2;
INT16 SektorX3;
INT16 SektorX4;
INT16 SektorX5;
INT16 SektorX6;

INT8 SektorY;
INT16 SektorY1;
INT8 SektorY2;
INT16 SektorY3;
INT16 SektorY4;
INT16 SektorY5;
INT16 SektorY6;

INT8 SEKTOR_NAZWA;

Powrót do spisu treści





2. Dodawanie grup – Część pierwsza

Wymagane pliki do edycji:

    Editor/EditorMercs.cpp, Tactical/Overhead Types.h

A.) Plik Overhead Types.h

    Szukamy wpisu.

enum
{
NON_CIV_GROUP = 0,
REBEL_CIV_GROUP,
KINGPIN_CIV_GROUP,
SANMONA_ARMS_GROUP,
ANGELS_GROUP,
BEGGARS_CIV_GROUP,
TOURISTS_CIV_GROUP,
ALMA_MILITARY_CIV_GROUP,
DOCTORS_CIV_GROUP,
COUPLE1_CIV_GROUP,
HICKS_CIV_GROUP,
WARDEN_CIV_GROUP,
JUNKYARD_CIV_GROUP,
FACTORY_KIDS_GROUP,
QUEENS_CIV_GROUP,
UNNAMED_CIV_GROUP_15,
UNNAMED_CIV_GROUP_16,
UNNAMED_CIV_GROUP_17,
UNNAMED_CIV_GROUP_18,
UNNAMED_CIV_GROUP_19,
NUM_CIV_GROUPS
};

    Dodajemy naszą grupę na końcu:

enum
{
NON_CIV_GROUP = 0,
REBEL_CIV_GROUP,
KINGPIN_CIV_GROUP,
SANMONA_ARMS_GROUP,
ANGELS_GROUP,
BEGGARS_CIV_GROUP,
TOURISTS_CIV_GROUP,
ALMA_MILITARY_CIV_GROUP,
DOCTORS_CIV_GROUP,
COUPLE1_CIV_GROUP,
HICKS_CIV_GROUP,
WARDEN_CIV_GROUP,
JUNKYARD_CIV_GROUP,
FACTORY_KIDS_GROUP,
QUEENS_CIV_GROUP,
UNNAMED_CIV_GROUP_15,
UNNAMED_CIV_GROUP_16,
UNNAMED_CIV_GROUP_17,
UNNAMED_CIV_GROUP_18,
UNNAMED_CIV_GROUP_19,
NASZA_GRUPA,
NUM_CIV_GROUPS
};

B.) Plik EditorMercs.cpp

Teraz w tym pliku musimy nadać naszej nowej grupie nazwę jaka będzie pojawiać się w edytorze.

    Szukamy linijki :

UINT16 gszCivGroupNames[ NUM_CIV_GROUPS ][ 20 ] =
{
L"NONE",
L"REBEL",
L"KINGPIN",
L"SANMONA ARMS",
L"ANGELS",
L"BEGGARS",
L"TOURISTS",
L"ALMA MIL",
L"DOCTORS",
L"COUPLE1",
L"HICKS",
L"WARDEN",
L"JUNKYARD",
L"FACTORY KIDS",
L"QUEENS",
L"UNUSED15",
L"UNUSED16",
L"UNUSED17",
L"UNUSED18",
L"UNUSED19",
};

    Po modyfikacji będzie to wyglądało tak:

UINT16 gszCivGroupNames[ NUM_CIV_GROUPS ][ 20 ] =
{
L"NONE",
L"REBEL",
L"KINGPIN",
L"SANMONA ARMS",
L"ANGELS",
L"BEGGARS",
L"TOURISTS",
L"ALMA MIL",
L"DOCTORS",
L"COUPLE1",
L"HICKS",
L"WARDEN",
L"JUNKYARD",
L"FACTORY KIDS",
L"QUEENS",
L"UNUSED15",
L"UNUSED16",
L"UNUSED17",
L"UNUSED18",
L"UNUSED19",
L"NASZA GRUPA",
};

Powrót do spisu treści





3. Dodawanie grup – Część druga

A.) Dodanie grupy, która po zauważeniu naszych najemników
będzie nas atakować

Wymagane pliki do edycji:

    Tactical/opplist.cpp
    W pliku szukamy funkcji:

void ManSeesMan(SOLDIERTYPE *pSoldier, SOLDIERTYPE *pOpponent, INT16 sOppGridno, INT8 bOppLevel, UINT8 ubCaller, UINT8 ubCaller2)

    Jeśli mamy już znalezioną funkcje to szukamy w takiego wpisu:

else if ( pSoldier->ubCivilianGroup == HICKS_CIV_GROUP && CheckFact(FACT_HICKS_MARRIED_PLAYER_MERC, 0 ) == FALSE )
{
UINT32 uiTime;
INT16 sX, sY;
// if before 6:05 or after 22:00, make hostile and enter combat
uiTime = GetWorldMinutesInDay();
if ( uiTime < 365 || uiTime > 1320 )
{
// get off our farm!
MakeCivHostile( pSoldier, 2 );
if ( ! (gTacticalStatus.uiFlags & INCOMBAT) )
{
EnterCombatMode( pSoldier->bTeam );
LocateSoldier( pSoldier->ubID, TRUE );
GetSoldierScreenPos( pSoldier, &sX, &sY );
// begin quote
BeginCivQuote( pSoldier, CIV_QUOTE_HICKS_SEE_US_AT_NIGHT, 0, sX, sY );
}
}
}

    i po nim dopisujemy nasz wpis :

else if ( pSoldier->ubCivilianGroup == NASZA_GRUPA)
{
INT16 sX1, sY1;
MakeCivHostile( pSoldier, 1 );
if ( ! (gTacticalStatus.uiFlags & INCOMBAT) )
{
EnterCombatMode( pSoldier->bTeam );
LocateSoldier( pSoldier->ubID, TRUE );
GetSoldierScreenPos( pSoldier, &sX1, &sY1 );
BeginCivQuote( pSoldier, CIV_QUOTE_42, 0, sX1, sY1 );
}
}

B.) Trochę informacji

    if ( pSoldier→ubCivilianGroup == NASZA_GRUPA) - jeżeli postać z wyznaczoną grupą zauważyła nas MakeCivHostile( pSoldier, 1 ); - tworzy z postaci neutralnej wroga
    if ( ! (gTacticalStatus.uiFlags & INCOMBAT) ) - sprawdza czy czasami nie jest uruchomiony już system walki jeśli, nie to zostaje wywołany system walki EnterCombatMode( pSoldier→bTeam ) i pierwszy atakuje wróg.
    GetSoldierScreenPos( pSoldier, &sX1, &sY1 ); - pobiera pozycje postaci która nas zauważyła
    BeginCivQuote( pSoldier, NAZWA, NUMER_REKORDU, sX1, sY1 ); - wyświetla tekst wypowiadany przez wroga.
    Tam gdzie NAZWA możemy wpisać takie wartości:
civ00.edt - CIV_QUOTE_ADULTS_BEGGING
civ01.edt - CIV_QUOTE_KIDS_BEGGING
civ02.edt - CIV_QUOTE_ADULTS_RECENT_BUG_ATTACK
civ03.edt - CIV_QUOTE_KIDS_RECENT_BUG_ATTACK
civ04.edt - CIV_QUOTE_ADULTS_BUG_EXTERMINATED_X_TIME
civ05.edt - CIV_QUOTE_KIDS_BUG_EXTERMINATED_X_TIME
civ06.edt - CIV_QUOTE_ADULTS_EXTREMLY_LOW_LOYALTY
civ07.edt - CIV_QUOTE_KIDS_EXTREMLY_LOW_LOYALTY
civ08.edt - CIV_QUOTE_ADULTS_HIGH_LOYALTY
civ09.edt - CIV_QUOTE_KIDS_HIGH_LOYALTY
civ10.edt - CIV_QUOTE_ADULTS_ALL_PURPOSE
civ11.edt - CIV_QUOTE_KIDS_ALL_PURPOSE
civ12.edt - CIV_QUOTE_ADULTS_LIBREATED_FIRST_TIME
civ13.edt - CIV_QUOTE_KIDS_LIBREATED_FIRST_TIME
civ14.edt - CIV_QUOTE_ADULTS_TOWN_TAKEN_BACK
civ15.edt - CIV_QUOTE_KIDS_TOWN_TAKEN_BACK
civ16.edt - CIV_QUOTE_HICKS_FRIENDLY
civ17.edt - CIV_QUOTE_HICKS_ENEMIES
civ18.edt - CIV_QUOTE_GOONS_FRIENDLY
civ19.edt - CIV_QUOTE_GOONS_ENEMIES
civ20.edt - CIV_QUOTE_ADULTS_REBELS
civ21.edt - CIV_QUOTE_KIDS_REBELS
civ22.edt - CIV_QUOTE_GREEN_MILITIA
civ23.edt - CIV_QUOTE_MEDIUM_MILITIA
civ24.edt - CIV_QUOTE_ELITE_MILITIA
civ25.edt - CIV_QUOTE_SAN_MONA_BEGGERS
civ26.edt - CIV_QUOTE_ENEMY_HURT
civ27.edt - CIV_QUOTE_ENEMY_ADMIN
civ28.edt - CIV_QUOTE_ENEMY_THREAT
civ29.edt - CIV_QUOTE_ENEMY_ELITE
civ30.edt - CIV_QUOTE_ADULTS_COWER
civ31.edt - CIV_QUOTE_KIDS_COWER
civ32.edt - CIV_QUOTE_PC_MARRIED
civ33.edt - CIV_QUOTE_KID_SLAVES
civ34.edt - CIV_QUOTE_KID_SLAVES_FREE
civ35.edt - CIV_QUOTE_MINERS_NOT_FOR_PLAYER
civ36.edt - CIV_QUOTE_MINERS_FOR_PLAYER
civ37.edt - CIV_QUOTE_ENEMY_OFFER_SURRENDER
civ38.edt - CIV_QUOTE_HICKS_SEE_US_AT_NIGHT
civ39.edt - CIV_QUOTE_DEIDRANNA_DEAD
civ40.edt - CIV_QUOTE_40
civ41.edt - CIV_QUOTE_41
civ42.edt - CIV_QUOTE_42
civ43.edt - CIV_QUOTE_43
civ44.edt - CIV_QUOTE_44
civ45.edt - CIV_QUOTE_45
civ46.edt - CIV_QUOTE_46
civ47.edt - CIV_QUOTE_47
civ48.edt - CIV_QUOTE_48
civ49.edt - CIV_QUOTE_49

Jeśli wpiszemy CIV_QUOTE_40 to z pliku civ40.edt będą pobierane teksty.

NUMER_REKORDU - podajemy numer rekordu, który zostanie pobrany z pliku

sX1,sY1 - pozycja gdzie zostanie wyświetlony tekst

C.) Dodanie grupy, która zaatakuje nas tylko
w wyznaczonej godzinie

else if ( pSoldier->ubCivilianGroup == NASZA_GRUPA )
{
UINT32 uiTime;
INT16 sX, sY;
// if before 6:05 or after 22:00, make hostile and enter combat
uiTime = GetWorldMinutesInDay();
if ( uiTime < 365 || uiTime > 1320 )
{
// get off our farm!
MakeCivHostile( pSoldier, 2 );
if ( ! (gTacticalStatus.uiFlags & INCOMBAT) )
{
EnterCombatMode( pSoldier->bTeam );
LocateSoldier( pSoldier->ubID, TRUE );
GetSoldierScreenPos( pSoldier, &sX, &sY );
// begin quote
BeginCivQuote( pSoldier, CIV_QUOTE_40, 0, sX, sY );
}
}
}

Powrót do spisu treści





4. Sklep Bobby Ray

Wymagane pliki do edycji:

    Quests.h
    BobbyRMailOrder.cpp
    Starategic event handler.cpp

A.) Plik Quests.h

    Interesują nas wpisy:

#define BOBBYR_SHIPPING_DEST_SECTOR_X 13
#define BOBBYR_SHIPPING_DEST_SECTOR_Y 2
#define BOBBYR_SHIPPING_DEST_SECTOR_Z 0
#define BOBBYR_SHIPPING_DEST_GRIDNO 10112

    Są to pozycje sektora do którego będą wysyłane paczki.
    BOBBYR_SHIPPING_DEST_SECTOR_X - pozycja x (1-16)
    BOBBYR_SHIPPING_DEST_SECTOR_Y - pozycja y (1 -16) lub (MAP_ROW_A - MAP_ROW_P)
    BOBBYR_SHIPPING_DEST_SECTOR_Z - pozycja z ( max 0-3)
    BOBBYR_SHIPPING_DEST_GRIDNO - numer siatki grido. W tym miejscu będą pojawiać się przesyłki (numer pobieramy z edytora). Zalecane, aby w tym miejscu była postawiona skrzynia.

B.) Plik BobbyRMailOrder.cpp

    W pliku szukamy takiej linijki:

if( gbSelectedCity == BR_DRASSEN && !StrategicMap[ SECTOR_INFO_TO_STRATEGIC_INDEX( SEC_B13 ) ].fEnemyControlled )
{
//Quick hack to bypass the confirmation box
ConfirmBobbyRPurchaseMessageBoxCallBack( MSG_BOX_RETURN_YES );
}

    BR_DRASSEN - oznacza gdzie paczka pojawi się. Jeśli z listy w sklepie wybierzemy Drassen to paczka pojawi się w naszym sektorze, który został zdefiniowany w pliku Quest.h.

W miejsce SEC_B13 podajemy nasz sektor, który został zdefiniowany w pliku Quest.h. Dozwolone : SEC_A1 - SEC_P16.

C.) Plik Starategic event handler.cpp

    W pliku szukamy kodu:

if ( (gTownLoyalty[ DRASSEN ].ubRating < 20) || StrategicMap[ CALCULATE_STRATEGIC_INDEX( 13, MAP_ROW_B ) ].fEnemyControlled )
{
// loss of the whole shipment
gpNewBobbyrShipments[ ubOrderID ].fActive = FALSE;
SetFactTrue( FACT_AGENTS_PREVENTED_SHIPMENT );
return;
}

    CALCULATE_STRATEGIC_INDEX( 13, MAP_ROW_B ) - zmieniamy na nasz sektor : dozowolone 1 - 16 , MAP_ROW_A - MAP_ROW_P (lub liczby 1-16). Wartość sektora taka sam jak w plik Quest.h
    if ( (gTownLoyalty[ DRASSEN ].ubRating < 20) || StrategicMap[ CALCULATE_STRATEGIC_INDEX( 13, MAP_ROW_B ) ].fEnemyControlled ) - jest sprawdzane czy w mieście jest lojalność mniejsza od 20 jeśli tak to sklep jest nieaktywny lub czy sektor jest pod kontrolą wroga.

Powrót do spisu treści





5. Dodawanie nowej akcji – Część pierwsza

Wymagane pliki do edycji:

    TacticalInterface Dialogue.cpp TacticalInterface Dialogue.h

Wymagane programy:

    NPC editor v1.0.48

A.) Plik Interface Dialogue.h

    Szukamy kodu:

enum
{
NPC_ACTION_NONE = 0,
NPC_ACTION_DONT_ACCEPT_ITEM,
NPC_ACTION_FACE_CLOSEST_PLAYER,
NPC_ACTION_OPEN_CLOSEST_DOOR,
NPC_ACTION_RECRUIT,
NPC_ACTION_THREATENINGLY_RAISE_GUN,
NPC_ACTION_LOWER_GUN,
NPC_ACTION_READY_GUN,
NPC_ACTION_START_RUNNING,
NPC_ACTION_STOP_RUNNING,
NPC_ACTION_BOOST_TOWN_LOYALTY, // 10
NPC_ACTION_PENALIZE_TOWN_LOYALTY,
NPC_ACTION_STOP_PLAYER_GIVING_FIRST_AID,
NPC_ACTION_FACE_NORTH,
NPC_ACTION_FACE_NORTH_EAST,
NPC_ACTION_FACE_EAST,
NPC_ACTION_FACE_SOUTH_EAST,
NPC_ACTION_FACE_SOUTH,
NPC_ACTION_FACE_SOUTH_WEST,
NPC_ACTION_FACE_WEST,
NPC_ACTION_FACE_NORTH_WEST, // 20
NPC_ACTION_TRIGGER_FRIEND_WITH_HOSTILE_QUOTE,
NPC_ACTION_BECOME_ENEMY,
NPC_ACTION_RECRUIT_WITH_SALARY,
NPC_ACTION_CLOSE_DIALOGUE_PANEL,
NPC_ACTION_ENTER_COMBAT, // 25
NPC_ACTION_TERRORIST_REVEALS_SELF,
NPC_ACTION_OPEN_CLOSEST_CABINET,
NPC_ACTION_SLAP,
NPC_ACTION_TRIGGER_QUEEN_BY_CITIES_CONTROLLED,
NPC_ACTION_SEND_SOLDIERS_TO_DRASSEN, // 30
NPC_ACTION_SEND_SOLDIERS_TO_BATTLE_LOCATION,
NPC_ACTION_TRIGGER_QUEEN_BY_SAM_SITES_CONTROLLED,
NPC_ACTION_PUNCH_PC_SLOT_0,
NPC_ACTION_PUNCH_PC_SLOT_1,
NPC_ACTION_PUNCH_PC_SLOT_2, // 35
NPC_ACTION_FRUSTRATED_SLAP,
NPC_ACTION_PUNCH_FIRST_LIVING_PC,
NPC_ACTION_SHOOT_ELLIOT,
NPC_ACTION_PLAYER_SAYS_NICE_LATER,
NPC_ACTION_GET_ITEMS_FROM_CLOSEST_CABINET, // 40
NPC_ACTION_INITIATE_SHOPKEEPER_INTERFACE,
NPC_ACTION_GET_OUT_OF_WHEELCHAIR,
NPC_ACTION_GET_OUT_OF_WHEELCHAIR_AND_BECOME_HOSTILE,
NPC_ACTION_PLAYER_SAYS_NASTY_LATER, // 44
NPC_ACTION_GRANT_EXPERIENCE_1 = 50,
NPC_ACTION_GRANT_EXPERIENCE_2,
NPC_ACTION_GRANT_EXPERIENCE_3,
NPC_ACTION_GRANT_EXPERIENCE_4,
NPC_ACTION_GRANT_EXPERIENCE_5,
NPC_ACTION_GOTO_HIDEOUT = 100,
NPC_ACTION_FATIMA_GIVE_LETTER,
NPC_ACTION_LEAVE_HIDEOUT,
NPC_ACTION_TRAVERSE_MAP_EAST,
NPC_ACTION_TRAVERSE_MAP_SOUTH,
NPC_ACTION_TRAVERSE_MAP_WEST,
NPC_ACTION_TRAVERSE_MAP_NORTH,
NPC_ACTION_REPORT_SHIPMENT_SIZE,
NPC_ACTION_RETURN_STOLEN_SHIPMENT_ITEMS,
NPC_ACTION_SET_PABLO_BRIBE_DELAY,
NPC_ACTION_ASK_ABOUT_ESCORTING_EPC, // 110
NPC_ACTION_DRINK_DRINK_DRINK,
NPC_ACTION_TRIGGER_END_OF_FOOD_QUEST,
NPC_ACTION_SEND_PACOS_INTO_HIDING,
NPC_ACTION_HAVE_PACOS_FOLLOW,
NPC_ACTION_SET_DELAYED_PACKAGE_TIMER, // 115
NPC_ACTION_SET_RANDOM_PACKAGE_DAMAGE_TIMER,
NPC_ACTION_FREE_KIDS,
NPC_ACTION_CHOOSE_DOCTOR,
NPC_ACTION_REPORT_BALANCE,
NPC_ACTION_ASK_ABOUT_PAYING_RPC,
NPC_ACTION_DELAYED_MAKE_BRENDA_LEAVE,
NPC_ACTION_SEX,
NPC_ACTION_KYLE_GETS_MONEY,
NPC_ACTION_LAYLA_GIVEN_WRONG_AMOUNT_OF_CASH, // 124
NPC_ACTION_SET_GIRLS_AVAILABLE,
NPC_ACTION_SET_DELAY_TILL_GIRLS_AVAILABLE,
NPC_ACTION_SET_WAITED_FOR_GIRL_FALSE,
NPC_ACTION_TRIGGER_LAYLA_13_14_OR_15,
NPC_ACTION_OPEN_CARLAS_DOOR,
NPC_ACTION_OPEN_CINDYS_DOOR, // 130
NPC_ACTION_OPEN_BAMBIS_DOOR,
NPC_ACTION_OPEN_MARIAS_DOOR,
NPC_ACTION_POSSIBLY_ADVERTISE_CINDY,
NPC_ACTION_POSSIBLY_ADVERTISE_BAMBI,
NPC_ACTION_DARREN_REQUESTOR, // 135
NPC_ACTION_ADD_JOEY_TO_WORLD,
NPC_ACTION_MARK_KINGPIN_QUOTE_0_USED,
NPC_ACTION_START_BOXING_MATCH,
NPC_ACTION_ENABLE_CAMBRIA_DOCTOR_BONUS,// OBSOLETE, NO LONGER DELAYED
NPC_ACTION_MARTHA_DIES, // 140
NPC_ACTION_DARREN_GIVEN_CASH,
NPC_ACTION_ANGEL_GIVEN_CASH,
NPC_ACTION_TRIGGER_ANGEL_17_OR_18,
NPC_ACTION_BUY_LEATHER_KEVLAR_VEST,
NPC_ACTION_TRIGGER_MARIA, // 145
NPC_ACTION_TRIGGER_ANGEL_16_OR_19,
NPC_ACTION_ANGEL_LEAVES_DEED,
NPC_ACTION_TRIGGER_ANGEL_21_OR_22,
NPC_ACTION_UN_RECRUIT_EPC,
NPC_ACTION_TELEPORT_NPC, // 150
NPC_ACTION_REMOVE_DOREEN,
NPC_ACTION_RESET_SHIPMENT_ARRIVAL_STUFF,
// 153 Fix helicopter by next morning?
NPC_ACTION_DECIDE_ACTIVE_TERRORISTS = 154,
NPC_ACTION_TRIGGER_FATHER_18_20_OR_15,
NPC_ACTION_CHECK_LAST_TERRORIST_HEAD,
NPC_ACTION_CARMEN_LEAVES_FOR_C13,
NPC_ACTION_CARMEN_LEAVES_FOR_GOOD,
NPC_ACTION_CARMEN_LEAVES_ON_NEXT_SECTOR_LOAD,
NPC_ACTION_TRIGGER_VINCE_BY_LOYALTY, // 160
NPC_ACTION_MEDICAL_REQUESTOR,
NPC_ACTION_MEDICAL_REQUESTOR_2,
NPC_ACTION_CHECK_DOCTORING_MONEY_GIVEN, // handled in NPC.c
NPC_ACTION_START_DOCTORING,
NPC_ACTION_VINCE_UNRECRUITABLE, // 165
NPC_ACTION_END_COMBAT,
NPC_ACTION_BECOME_FRIENDLY_END_COMBAT,
NPC_ACTION_SET_EPC_TO_NPC,
NPC_ACTION_BUY_VEHICLE_REQUESTOR,
NPC_ACTION_END_MEANWHILE,// 170
NPC_ACTION_START_BLOODCAT_QUEST,
NPC_ACTION_START_MINE,
NPC_ACTION_STOP_MINE,
NPC_ACTION_RESET_MINE_CAPTURED,
NPC_ACTION_SET_OSWALD_RECORD_13_USED, // 175
NPC_ACTION_SET_CALVIN_RECORD_13_USED,
NPC_ACTION_SET_CARL_RECORD_13_USED,
NPC_ACTION_SET_FRED_RECORD_13_USED,
NPC_ACTION_SET_MATT_RECORD_13_USED,
NPC_ACTION_TRIGGER_MATT, // 180
NPC_ACTION_REDUCE_CONRAD_SALARY_CONDITIONS,
NPC_ACTION_REMOVE_CONRAD,
NPC_ACTION_KROTT_REQUESTOR,
NPC_ACTION_KROTT_ALIVE_LOYALTY_BOOST, /* Delayed loyalty effects elimininated. Sep.12/98. ARM */
NPC_ACTION_TRIGGER_YANNI, // 185
NPC_ACTION_TRIGGER_MARY_OR_JOHN_RECORD_9,
NPC_ACTION_TRIGGER_MARY_OR_JOHN_RECORD_10,
NPC_ACTION_ADD_JOHNS_GUN_SHIPMENT,
// 189 ??
NPC_ACTION_TRIGGER_KROTT_11_OR_12 = 190, // 190 Trigger record 11 or 12 for Krott
NPC_ACTION_MADLAB_GIVEN_GUN = 191,
NPC_ACTION_MADLAB_GIVEN_CAMERA,
NPC_ACTION_MADLAB_ATTACHES_GOOD_CAMERA,
NPC_ACTION_READY_ROBOT,
NPC_ACTION_WALTER_GIVEN_MONEY_INITIALLY,
NPC_ACTION_WALTER_GIVEN_MONEY,
NPC_ACTION_MAKE_NPC_FIRST_BARTENDER = 197,
NPC_ACTION_MAKE_NPC_SECOND_BARTENDER,
NPC_ACTION_MAKE_NPC_THIRD_BARTENDER,
NPC_ACTION_MAKE_NPC_FOURTH_BARTENDER,//200
NPC_ACTION_GERARD_GIVEN_CASH,
NPC_ACTION_FILL_UP_CAR, // obsolete?
NPC_ACTION_JOE_GIVEN_CASH,
NPC_ACTION_TRIGGER_ELLIOT_9_OR_10 = 204, // obsolete?
NPC_ACTION_HANDLE_END_OF_FIGHT,// 205
NPC_ACTION_DARREN_PAYS_PLAYER,
NPC_ACTION_FIGHT_AGAIN_REQUESTOR,
NPC_ACTION_TRIGGER_SPIKE_OR_DARREN,
// 209 is blank
NPC_ACTION_CHANGE_MANNY_POSITION = 210,
NPC_ACTION_TIMER_FOR_VEHICLE, // 211
NPC_ACTION_ASK_ABOUT_PAYING_RPC_WITH_DAILY_SALARY,//212
NPC_ACTION_TRIGGER_MICKY_BY_SCI_FI, // 213
// 214 is blank
NPC_ACTION_TRIGGER_ELLIOT_BY_BATTLE_RESULT = 215,
NPC_ACTION_TRIGGER_ELLIOT_BY_SAM_DISABLED,
NPC_ACTION_LAYLAS_NEXT_LINE_AFTER_CARLA,
NPC_ACTION_LAYLAS_NEXT_LINE_AFTER_CINDY,
NPC_ACTION_LAYLAS_NEXT_LINE_AFTER_BAMBI,
NPC_ACTION_LAYLAS_NEXT_LINE_AFTER_MARIA,
NPC_ACTION_PROMPT_PLAYER_TO_LIE, // 221
NPC_ACTION_REMOVE_JOE_QUEEN, // 222
NPC_ACTION_REMOVE_ELLIOT_END_MEANWHILE, // 223
NPC_ACTION_NO_SCI_FI_END_MEANWHILE, //224
// 225 is obsolete
NPC_ACTION_TRIGGER_MARRY_DARYL_PROMPT = 226,
NPC_ACTION_HAVE_MARRIED_NPC_LEAVE_TEAM,
NPC_ACTION_KINGPIN_GIVEN_MONEY, // actually handled in item-acceptance code, NPC.c
NPC_ACTION_KINGPIN_TRIGGER_25_OR_14,
NPC_ACTION_SEND_ENRICO_MIGUEL_EMAIL,
NPC_ACTION_END_DEMO,// 231,
NPC_ACTION_INVOKE_CONVERSATION_MODE, // 232
// 233 is obsolete
NPC_ACTION_START_TIMER_ON_KEITH_GOING_OUT_OF_BUSINESS = 234,
NPC_ACTION_KEITH_GOING_BACK_IN_BUSINESS,
NPC_ACTION_MAKE_RAT_DISAPPEAR,
NPC_ACTION_DOCTOR_ESCORT_PATIENTS,
NPC_ACTION_ELLIOT_DECIDE_WHICH_QUOTE_FOR_PLAYER_ATTACK,
NPC_ACTION_QUEEN_DECIDE_WHICH_QUOTE_FOR_PLAYER_ATTACK,
NPC_ACTION_CANCEL_WAYPOINTS, // 240
// 241 currently obsolete, CJC Oct 14
NPC_ACTION_SHOW_TIXA = 242,
NPC_ACTION_SHOW_ORTA,
NPC_ACTION_DRINK_WINE,
NPC_ACTION_DRINK_BOOZE,
NPC_ACTION_TRIGGER_ANGEL_22_OR_24,
NPC_ACTION_SET_FACT_105_FALSE, // 247
NPC_ACTION_MAKE_BRENDA_STATIONARY, // 248
NPC_ACTION_TRIGGER_DARREN_OR_KINGPIN_IMPRESSED = 249,
NPC_ACTION_TRIGGER_KINGPIN_IMPRESSED, // 250
NPC_ACTION_ADD_RAT,
NPC_ACTION_ENDGAME_STATE_1 = 253,
NPC_ACTION_ENDGAME_STATE_2,
NPC_ACTION_MAKE_MIGUEL_STATIONARY,
NPC_ACTION_MAKE_ESTONI_A_FUEL_SITE, // 256
NPC_ACTION_24_HOURS_SINCE_JOEY_RESCUED,// 257
NPC_ACTION_24_HOURS_SINCE_DOCTORS_TALKED_TO,// 258
NPC_ACTION_SEND_SOLDIERS_TO_OMERTA,// 259
NPC_ACTION_ADD_MORE_ELITES,// 260
NPC_ACTION_GIVE_KNOWLEDGE_OF_ALL_MERCS,// 261
NPC_ACTION_REMOVE_MERC_FOR_MARRIAGE,
NPC_ACTION_TRIGGER_JOE_32_OR_33,
NPC_ACTION_REMOVE_NPC,
NPC_ACTION_HISTORY_GOT_ROCKET_RIFLES,
NPC_ACTION_HISTORY_DEIDRANNA_DEAD_BODIES,
NPC_ACTION_HISTORY_BOXING_MATCHES,
NPC_ACTION_HISTORY_SOMETHING_IN_MINES,
NPC_ACTION_HISTORY_DEVIN,
NPC_ACTION_HISTORY_MIKE,// 270
NPC_ACTION_HISTORY_TONY,
NPC_ACTION_HISTORY_KROTT,
NPC_ACTION_HISTORY_KYLE,
NPC_ACTION_HISTORY_MADLAB,
NPC_ACTION_HISTORY_GABBY,
NPC_ACTION_HISTORY_KEITH_OUT_OF_BUSINESS,
NPC_ACTION_HISTORY_HOWARD_CYANIDE,
NPC_ACTION_HISTORY_KEITH,
NPC_ACTION_HISTORY_HOWARD,
NPC_ACTION_HISTORY_PERKO,// 280
NPC_ACTION_HISTORY_SAM,
NPC_ACTION_HISTORY_FRANZ,
NPC_ACTION_HISTORY_ARNOLD,
NPC_ACTION_HISTORY_FREDO,
NPC_ACTION_HISTORY_RICHGUY_BALIME,// 285
NPC_ACTION_HISTORY_JAKE,
NPC_ACTION_HISTORY_BUM_KEYCARD,
NPC_ACTION_HISTORY_WALTER,
NPC_ACTION_HISTORY_DAVE,
NPC_ACTION_HISTORY_PABLO,// 290
NPC_ACTION_HISTORY_KINGPIN_MONEY,
NPC_ACTION_SEND_TROOPS_TO_SAM,
NPC_ACTION_PUT_PACOS_IN_BASEMENT,
NPC_ACTION_HISTORY_ASSASSIN,
NPC_ACTION_TRIGGER_HANS_BY_ROOM, // 295
NPC_ACTION_TRIGGER_MADLAB_31, NPC_ACTION_TRIGGER_MADLAB_32,
NPC_ACTION_TRIGGER_BREWSTER_BY_WARDEN_PROXIMITY, // 298
NPC_ACTION_TURN_TO_FACE_NEAREST_MERC = 500,
NPC_ACTION_TURN_TO_FACE_PROFILE_ID_0,
NPC_ACTION_LAST_TURN_TO_FACE_PROFILE = 650,
}

    i na końcu dopisujemy naszą akcje:.

enum
{
.
.
.
NPC_ACTION_LAST_TURN_TO_FACE_PROFILE = 650,
NPC_ACTION_MOJA_AKCJA = 300,
}

Zalecane jest aby przypisywać odpowiedni numer (tylko trzeba uważać by się nie powtarzał).

B.) Plik Interface Dialogue.cpp

W pliku „Interface Dialogue.cpp” szukamy funkcji void HandleNPCDoAction( UINT8 ubTargetNPC, UINT16 usActionCode, UINT8 ubQuoteNum ).

    Przechodzimy na sam koniec funkcji do wpisu:

.
.
.
case NPC_ACTION_WALTER_GIVEN_MONEY:
if ( gMercProfiles[ WALTER ].iBalance >= WALTER_BRIBE_AMOUNT )
{
TriggerNPCRecord( WALTER, 16 );
}
else
{
TriggerNPCRecord( WALTER, 15 );
}
break;
default:
ScreenMsg( FONT_MCOLOR_RED, MSG_TESTVERSION, L"No code support for NPC action %d", usActionCode );
break;

    i dopisujem naszą akcje:

case NPC_ACTION_WALTER_GIVEN_MONEY:
if ( gMercProfiles[ WALTER ].iBalance >= WALTER_BRIBE_AMOUNT )
{
TriggerNPCRecord( WALTER, 16 );
}
else
{
TriggerNPCRecord( WALTER, 15 );
}
break;
case NPC_ACTION_MOJA_AKCJA:
break;
default:
ScreenMsg( FONT_MCOLOR_RED, MSG_TESTVERSION, L"No code support for NPC action %d", usActionCode );
break;

Dodaliśmy naszą akcje, ale na razie ona nic nie wykonuje.Teraz musimy przejść do programu NPC editor v1.0.48. Program NPC editor v1.0.48

Teraz musimy przejść do programu NPC editor v1.0.48 gdzie będziemy musieli dopisać naszą akcje do pliku Strings.txt. Otwieramy plik Strings.txt i szukamy w nim wpisu:

[Action]
//-------------------
1;NPC rejects an item given by merc
4;NPC joins the Squad
22;NPC turns hostile
23;NPC joins the squad
24;NPC stops conversation

    Dopisujemy naszą akcje:

[Action]
//-------------------
1;NPC rejects an item given by merc
4;NPC joins the Squad
22;NPC turns hostile
23;NPC joins the squad
24;NPC stops conversation
300;MOJA AKCJA

    Tu musimy podać numer jaki przypisaliśmy naszej akcji oraz wpisać nazwę (zdjęcie Nr 14).

Powrót do spisu treści





6. Dodawanie nowej akcji – Część druga

A.) Uruchamianie Tigger'a

case NPC_ACTION_MOJA_AKCJA:
TriggerNPCRecord( NAZWA_NPC, NUMER_REKORDU );
break;

TriggerNPCRecord( NAZWA_NPC, NUMER_REKORDU ) - funkcja odpowiada za uruchomienie wyznaczonego tigger'a danej postaci.

    Wszystkie wartości są pobierane z pliku *.NPC.
NUMER_REKORDU - numer rekordu jest pobierany z pliku *.npc
NAZWA_NPC - podajemy numer postaci npc lub jej nazwę
    Dozwolone wartości :

40 - BIFF
41 - HAYWIRE
42 - GASKET
43 - RAZOR
44 - FLO
45 - GUMPY
46 - LARRY_NORMAL
47 - LARRY_DRUNK
48 - COUGAR
49 - NUMB
50 - BUBBA
57 - MIGUEL
58 - CARLOS
59 - IRA
60 - DIMITRI
61 - DEVIN
62 - ROBOT
63 - HAMOUS
64 - SLAY
65 - RPC65
66 - DYNAMO
67 - SHANK
68 - IGGY
69 - VINCE
70 - CONRAD
71 - RPC71
72 - MADDOG
73 - DARREL
74 - PERKO
75 - QUEEN
76 - AUNTIE
77 - ENRICO
78 - CARMEN
79 - JOE
80 - STEVE
81 - RAT
82 - ANNIE
83 - CHRIS
84 - BOB
85 - BRENDA
86 - KINGPIN
87 - DARREN
88 - MARIA
89 - ANGEL
90 - JOEY
91 - TONY
92 - FRANK
93 - SPIKE
94 - DAMON
95 - KYLE
96 - MICKY
97 - SKYRIDER
98 - PABLO
99 - SAL
100 - FATHER
101 - FATIMA
102 - WARDEN
103 - GORDON
104 - GABBY
105 - ERNEST
106 - FRED
107 - MADAME
108 - YANNI
109 - MARTHA
110 - TIFFANY
111 - T_REX
112 - DRUGGIST
113 - JAKE
114 - PACOS
115 - GERARD
116 - SKIPPER
117 - HANS
118 - JOHN
119 - MARY
120 - GENERAL
121 - SERGEANT
122 - ARMAND
123 - LORA
124 - FRANZ
125 - HOWARD
126 - SAM
127 - ELDIN
128 - ARNIE
129 - TINA
130 - FREDO
131 - WALTER
132 - JENNY
133 - BILLY
134 - BREWSTER
135 - ELLIOT
136 - DEREK
137 - OLIVER
138 - WALDO
139 - DOREEN
140 - JIM
141 - JACK
142 - OLAF
143 - RAY
144 - OLGA
145 - TYRONE
146 - MADLAB
147 - KEITH
148 - MATT
149 - MIKE
150 - DARYL
151 - HERVE
152 - PETER
153 - ALBERTO
154 - CARLO
155 - MANNY
156 - OSWALD
157 - CALVIN
158 - CARL
159 - SPECK
165 - GASTON
166 - STOGIE
167 - TEX
168 - BIGGENS

Przykład

    TriggerNPCRecord( TONY, 5 ); - zostanie uruchomiony piąty rekord z pliku 091.npc

B.) Odegranie dźwięku

case NPC_ACTION_MOJA_AKCJA:
PlayJA2StreamingSampleFromFile( "Sounds//dzwiek.wav", RATE_11025, HIGHVOLUME, 1, MIDDLEPAN, NULL );
break;
PlayJA2StreamingSampleFromFile( PARAMETR1, PARAMETR2, PARAMETR3, PARAMETR4, PARAMETR5, NULL );
PARAMETR1 podajemy nasz dźwięk w formacie wav lub ogg. np : „Sounds/nasz_dzwiek.wav”
PARAMETR2 - dozwolone wartości :
LOWVOLUME
BTNVOLUME
MIDVOLUME
HIGHVOLUME
PARAMETR3 - możemy zastosować tylko RATE_11025
PARAMETR4 - dozwolone wartości:
FARLEFT
LEFTSIDE
MIDDLE
MIDDLEPAN
RIGHTSIDE
FARRIGHT
PARAMETR5 - Podajemy liczbę. Oznacza ile razy dźwięk ma być odegrany

C.) Eskortowanie postaci
Dodawanie postaci do drużyny i jej usuwanie z drużyny

case NPC_ACTION_MOJA_AKCJA:
RecruitEPC( NAZWA_NPC );
break;

    RecruitEPC( NAZWA_NPC ) - ta funkcja odpowiada za przyłączenie do naszej grupy postaci do eskortowania. * NAZWA_NPC - podajemy nazwę postaci lub jej numer (patrz przykład 1).

case NPC_ACTION_MOJA_AKCJA:
UnRecruitEPC( NAZWA_NPC );
break;

    UnRecruitEPC( NAZWA_NPC ) - ta funkcja odpowiada za usunięcie z naszej grupy postaci eskortowanej.* NAZWA_NPC - podajemy nazwę postaci lub jej numer (patrz przykład 1).

D.) Wczytanie alternatywnego sektora.

Przykład ten pokazuje nam jak po rozmowie z postacią NPC zostanie uruchomiony alternatywny sektor (K6).

case NPC_ACTION_MOJA_AKCJA:
SectorInfo[ SECTOR( 6, MAP_ROW_K ) ].uiFlags |= SF_USE_ALTERNATE_MAP;
break;

SECTOR( X, Y ) - X - podajemy numer od 1-16,a Y - MAP_ROW_A do MAP_ROW_P lub 1-16

E.) Rozbudowana akcja

Jest to rozbudowana akcja która wykona tigger'a, odegra dźwięk i przyłączy postać do eskortowania.

case NPC_ACTION_MOJA_AKCJA:
TriggerNPCRecord( NAZWA_NPC, NUMER_REKORDU );
PlayJA2StreamingSampleFromFile( "Sounds//dzwiek.wav", RATE_11025, HIGHVOLUME, 1, MIDDLEPAN, NULL );
RecruitEPC( NAZWA_NPC );
break;

F.) Położenie klucza na ziemi

case NPC_ACTION_MOJA_AKCJA:
{
OBJECTTYPE Key;
INT16 sGridNo = 7587;
INT32 iWorldItem;
pSoldier = FindSoldierByProfileID( ubTargetNPC, FALSE );
if (pSoldier)
{
CreateKeyObject( &Key, 1, 16 );
AddItemToPoolAndGetIndex( sGridNo, &Key, -1, pSoldier->bLevel, 0, 0, &iWorldItem );
SoldierPickupItem( pSoldier, iWorldItem, sGridNo, ITEM_IGNORE_Z_LEVEL );
}
}
break;

    Krótki opis :
sGridNo - podajemy numer siatki grido
CreateKeyObject( OBJECTTYPE - pObj , UINT8 ubNumberOfKeys, UINT8 ubKeyIdValue );
OBJECTTYPE - obiekt w tym przykładzie &key
ubNumberOfKeys - ilość kluczy
ubKeyIdValue - id klucza 1 do 32

Powrót do spisu treści





7. Dodawanie nowego maila

Wymagane pliki do edycji:

Funkcja odpowiada za maile, które nie są jeszcze przeczytane (pogrubiona czcionka wyświetlana w skrzynce pocztowej JA):

void AddEmail(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 iDate, INT32 iCurrentIMPPosition);

Funkcja odpowiada za przeczytane maile:

void AddPreReadEmail(INT32 iMessageOffset, INT32 iMessageLength, UINT8 ubSender, INT32 iDate);

A.) Opis poszczególnych parametrów:

    iMessageOffset - podajemy tu wartość. Wartość pobieramy z pliku BinaryData email.dat. Plik otwieramy w programie JA2EDT lub EDTEditor. Oznacza od którego rekordu będą pobierane informacje o mailu.
    iMessageLength - podajemy tu wartość. Wartość pobieramy z pliku BinaryData email.dat. Plik otwieramy w programie JA2EDT lub EDTEditor. Oznacza ile rekordów będzie pobranych.

Przykład:

AddEmail(225, 3, KING_PIN, GetWorldTotalMin( ), -1 );
Pobierze rekordy zaczynając od 225 do 228.
    ubSender - podajemy tu wartość

MAIL_ENRICO - 1
CHAR_PROFILE_SITE - 2
GAME_HELP - 3
IMP_PROFILE_RESULTS - 4
SPECK_FROM_MERC - 5
RIS_EMAIL - 6
BARRY_MAIL - 7
MELTDOWN_MAIL = BARRY_MAIL+ 39
INSURANCE_COMPANY - 46
BOBBY_R - 47
KING_PIN - 48
JOHN_KULBA - 49
AIM_SITE - 50

    iDate - GetWorldTotalMin() - (jest to funkcja pobierająca aktualny czas gry) iCurrentIMPPosition: -1
    Przykład:
    AddEmail(225, 3, KING_PIN, GetWorldTotalMin( ), -1 );
    Nadawca Kingpin, aktualny czas gry oraz pobrane rekordy od 225 do 228.
    W tym przykładzie rekord 225 musi być tytułem naszego maila. Rekordy 226,227,228 są już wiadomością jaką zawiera mail.

B.) Dodanie nowych nadawców

    Wymagane pliki:
Utils/ _PolishText.cpp (lub inny zależy od wersji językowej)
Laptop/ email.h

C.) Plik email.h

    Szukamy kodu:

enum {
MAIL_ENRICO=0,
CHAR_PROFILE_SITE,
GAME_HELP,
IMP_PROFILE_RESULTS,
SPECK_FROM_MERC,
RIS_EMAIL,
BARRY_MAIL,
MELTDOWN_MAIL = BARRY_MAIL+ 39,
INSURANCE_COMPANY,
BOBBY_R,
KING_PIN,
JOHN_KULBA,
AIM_SITE,
};

    I na końcu dopisujemy naszego nadawcę.

enum {
MAIL_ENRICO=0,
CHAR_PROFILE_SITE,
GAME_HELP,
IMP_PROFILE_RESULTS,
SPECK_FROM_MERC,
RIS_EMAIL,
BARRY_MAIL,
MELTDOWN_MAIL = BARRY_MAIL+ 39,
INSURANCE_COMPANY,
BOBBY_R,
KING_PIN,
JOHN_KULBA,
AIM_SITE,
MAIL_JAZZ,
};

D.) Plik _PolishText.cpp.

    Szukamy kodu:

STR16 pSenderNameList[] = {
L"Enrico",
L"Psych Pro Inc",
L"Pomoc",
L"Psych Pro Inc",
L"Speck",
L"R.I.S.",
L"Barry",
L"Blood",
L"Lynx",
L"Grizzly",
L"Vicki",
L"Trevor",
L"Grunty",
L"Ivan",
L"Steroid",
L"Igor",
L"Shadow",
L"Red",
L"Reaper",
L"Fidel",
L"Fox",
L"Sidney",
L"Gus",
L"Buns",
L"Ice",
L"Spider",
L"Cliff",
L"Bull",
L"Hitman",
L"Buzz",
L"Raider",
L"Raven",
L"Static",
L"Len",
L"Danny",
L"Magic",
L"Stephan",
L"Scully",
L"Malice",
L"Dr.Q",
L"Nails",
L"Thor",
L"Scope",
L"Wolf",
L"MD",
L"Meltdown",
//----------
L"M.I.S. Ubezpieczenia",
L"Bobby Ray",
L"Kingpin",
L"John Kulba",
L"A.I.M.",
};

    I na końcu dopisujemy nowego nadawcę.

STR16 pSenderNameList[] =
{
L"Enrico",
L"Psych Pro Inc",
L"Pomoc",
L"Psych Pro Inc",
L"Speck",
L"R.I.S.",
L"Barry",
L"Blood",
L"Lynx",
L"Grizzly",
L"Vicki",
L"Trevor",
L"Grunty",
L"Ivan",
L"Steroid",
L"Igor",
L"Shadow",
L"Red",
L"Reaper",
L"Fidel",
L"Fox",
L"Sidney",
L"Gus",
L"Buns",
L"Ice",
L"Spider",
L"Cliff",
L"Bull",
L"Hitman",
L"Buzz",
L"Raider",
L"Raven",
L"Static",
L"Len",
L"Danny",
L"Magic",
L"Stephan",
L"Scully",
L"Malice",
L"Dr.Q",
L"Nails",
L"Thor",
L"Scope",
L"Wolf",
L"MD",
L"Meltdown",
//----------
L"M.I.S. Ubezpieczenia",
L"Bobby Ray",
L"Kingpin",
L"John Kulba",
L"A.I.M.",
L"Jazz",
};

Możemy też dodać nasz mail tak aby na samym początku gry pojawił się w skrzynce.

    Wymagane pliki:

E.) Strategic/ Game Init.cpp

    Szukamy kodu :

AddPreReadEmail(OLD_ENRICO_1,OLD_ENRICO_1_LENGTH,MAIL_ENRICO, GetWorldTotalMin() );
AddPreReadEmail(OLD_ENRICO_2,OLD_ENRICO_2_LENGTH,MAIL_ENRICO, GetWorldTotalMin() );
AddPreReadEmail(RIS_REPORT,RIS_REPORT_LENGTH,RIS_EMAIL, GetWorldTotalMin() );
AddPreReadEmail(OLD_ENRICO_3,OLD_ENRICO_3_LENGTH,MAIL_ENRICO, GetWorldTotalMin() );
AddEmail(IMP_EMAIL_INTRO,IMP_EMAIL_INTRO_LENGTH,CHAR_PROFILE_SITE, GetWorldTotalMin(), -1);

    i dopisujemy

AddPreReadEmail(OLD_ENRICO_1,OLD_ENRICO_1_LENGTH,MAIL_ENRICO, GetWorldTotalMin() );
AddPreReadEmail(OLD_ENRICO_2,OLD_ENRICO_2_LENGTH,MAIL_ENRICO, GetWorldTotalMin() );
AddPreReadEmail(RIS_REPORT,RIS_REPORT_LENGTH,RIS_EMAIL, GetWorldTotalMin() );
AddPreReadEmail(OLD_ENRICO_3,OLD_ENRICO_3_LENGTH,MAIL_ENRICO, GetWorldTotalMin() );
AddEmail(IMP_EMAIL_INTRO,IMP_EMAIL_INTRO_LENGTH,CHAR_PROFILE_SITE, GetWorldTotalMin(), -1);
AddEmail(225, 3, MAIL_JAZZ, GetWorldTotalMin( ), -1 );

Powrót do spisu treści





8. Funkcje stosowane w akcjach

A.) Przeniesienie postaci do sektora

ChangeNpcToDifferentSector( UINT8 ubNpcId, INT16 sSectorX, INT16 sSectorY, INT8 bSectorZ );

Funkcja przenosi wybraną postać z aktualnego sektora do sektora ustawionego w tej funkcji.

    ubNpcId (wielkość liter jest ważna):

40 - BIFF
41 - HAYWIRE
42 - GASKET
43 - RAZOR
44 - FLO
45 - GUMPY
46 - LARRY_NORMAL
47 - LARRY_DRUNK
48 - COUGAR
49 - NUMB
50 - BUBBA
57 - MIGUEL
58 - CARLOS
59 - IRA
60 - DIMITRI
61 - DEVIN
62 - ROBOT
63 - HAMOUS
64 - SLAY
65 - RPC65
66 - DYNAMO
67 - SHANK
68 - IGGY
69 - VINCE
70 - CONRAD
71 - RPC71
72 - MADDOG
73 - DARREL
74 - PERKO
75 - QUEEN
76 - AUNTIE
77 - ENRICO
78 - CARMEN
79 - JOE
80 - STEVE
81 - RAT
82 - ANNIE
83 - CHRIS
84 - BOB
85 - BRENDA
86 - KINGPIN
87 - DARREN
88 - MARIA
89 - ANGEL
90 - JOEY
91 - TONY
92 - FRANK
93 - SPIKE
94 - DAMON
95 - KYLE
96 - MICKY
97 - SKYRIDER
98 - PABLO
99 - SAL
100 - FATHER
101 - FATIMA
102 - WARDEN
103 - GORDON
104 - GABBY
105 - ERNEST
106 - FRED
107 - MADAME
108 - YANNI
109 - MARTHA
110 - TIFFANY
111 - T_REX
112 - DRUGGIST
113 - JAKE
114 - PACOS
115 - GERARD
116 - SKIPPER
117 - HANS
118 - JOHN
119 - MARY
120 - GENERAL
121 - SERGEANT
122 - ARMAND
123 - LORA
124 - FRANZ
125 - HOWARD
126 - SAM
127 - ELDIN
128 - ARNIE
129 - TINA
130 - FREDO
131 - WALTER
132 - JENNY
133 - BILLY
134 - BREWSTER
135 - ELLIOT
136 - DEREK
137 - OLIVER
138 - WALDO
139 - DOREEN
140 - JIM
141 - JACK
142 - OLAF
143 - RAY
144 - OLGA
145 - TYRONE
146 - MADLAB
147 - KEITH
148 - MATT
149 - MIKE
150 - DARYL
151 - HERVE
152 - PETER
153 - ALBERTO
154 - CARLO
155 - MANNY
156 - OSWALD
157 - CALVIN
158 - CARL
159 - SPECK
165 - GASTON
166 - STOGIE
167 - TEX
168 - BIGGENS

    sSectorX - 1 do 16
    sSectorY - 1 do 16
    bSectorZ - 0 -3

B.) Usunięcie okna dialogowego

DeleteTalkingMenu( );
Usuwa okno dialogowe o ile jest wyświetlone.

C.) Rekrutacja postaci

RecruitRPC( UINT8 ubCharNum );
    ubCharNum (wielkość liter jest ważna):

40 - BIFF
41 - HAYWIRE
42 - GASKET
43 - RAZOR
44 - FLO
45 - GUMPY
46 - LARRY_NORMAL
47 - LARRY_DRUNK
48 - COUGAR
49 - NUMB
50 - BUBBA
57 - MIGUEL
58 - CARLOS
59 - IRA
60 - DIMITRI
61 - DEVIN
62 - ROBOT
63 - HAMOUS
64 - SLAY
65 - RPC65
66 - DYNAMO
67 - SHANK
68 - IGGY
69 - VINCE
70 - CONRAD
71 - RPC71
72 - MADDOG
73 - DARREL
74 - PERKO
75 - QUEEN
76 - AUNTIE
77 - ENRICO
78 - CARMEN
79 - JOE
80 - STEVE
81 - RAT
82 - ANNIE
83 - CHRIS
84 - BOB
85 - BRENDA
86 - KINGPIN
87 - DARREN
88 - MARIA
89 - ANGEL
90 - JOEY
91 - TONY
92 - FRANK
93 - SPIKE
94 - DAMON
95 - KYLE
96 - MICKY
97 - SKYRIDER
98 - PABLO
99 - SAL
100 - FATHER
101 - FATIMA
102 - WARDEN
103 - GORDON
104 - GABBY
105 - ERNEST
106 - FRED
107 - MADAME
108 - YANNI
109 - MARTHA
110 - TIFFANY
111 - T_REX
112 - DRUGGIST
113 - JAKE
114 - PACOS
115 - GERARD
116 - SKIPPER
117 - HANS
118 - JOHN
119 - MARY
120 - GENERAL
121 - SERGEANT
122 - ARMAND
123 - LORA
124 - FRANZ
125 - HOWARD
126 - SAM
127 - ELDIN
128 - ARNIE
129 - TINA
130 - FREDO
131 - WALTER
132 - JENNY
133 - BILLY
134 - BREWSTER
135 - ELLIOT
136 - DEREK
137 - OLIVER
138 - WALDO
139 - DOREEN
140 - JIM
141 - JACK
142 - OLAF
143 - RAY
144 - OLGA
145 - TYRONE
146 - MADLAB
147 - KEITH
148 - MATT
149 - MIKE
150 - DARYL
151 - HERVE
152 - PETER
153 - ALBERTO
154 - CARLO
155 - MANNY
156 - OSWALD
157 - CALVIN
158 - CARL
159 - SPECK
165 - GASTON
166 - STOGIE
167 - TEX
168 - BIGGENS

D.) Rekrutacja postaci do eskortowania

RecruitEPC( UINT8 ubCharNum );
    ubCharNum (wielkość liter jest ważna):

40 - BIFF
41 - HAYWIRE
42 - GASKET
43 - RAZOR
44 - FLO
45 - GUMPY
46 - LARRY_NORMAL
47 - LARRY_DRUNK
48 - COUGAR
49 - NUMB
50 - BUBBA
57 - MIGUEL
58 - CARLOS
59 - IRA
60 - DIMITRI
61 - DEVIN
62 - ROBOT
63 - HAMOUS
64 - SLAY
65 - RPC65
66 - DYNAMO
67 - SHANK
68 - IGGY
69 - VINCE
70 - CONRAD
71 - RPC71
72 - MADDOG
73 - DARREL
74 - PERKO
75 - QUEEN
76 - AUNTIE
77 - ENRICO
78 - CARMEN
79 - JOE
80 - STEVE
81 - RAT
82 - ANNIE
83 - CHRIS
84 - BOB
85 - BRENDA
86 - KINGPIN
87 - DARREN
88 - MARIA
89 - ANGEL
90 - JOEY
91 - TONY
92 - FRANK
93 - SPIKE
94 - DAMON
95 - KYLE
96 - MICKY
97 - SKYRIDER
98 - PABLO
99 - SAL
100 - FATHER
101 - FATIMA
102 - WARDEN
103 - GORDON
104 - GABBY
105 - ERNEST
106 - FRED
107 - MADAME
108 - YANNI
109 - MARTHA
110 - TIFFANY
111 - T_REX
112 - DRUGGIST
113 - JAKE
114 - PACOS
115 - GERARD
116 - SKIPPER
117 - HANS
118 - JOHN
119 - MARY
120 - GENERAL
121 - SERGEANT
122 - ARMAND
123 - LORA
124 - FRANZ
125 - HOWARD
126 - SAM
127 - ELDIN
128 - ARNIE
129 - TINA
130 - FREDO
131 - WALTER
132 - JENNY
133 - BILLY
134 - BREWSTER
135 - ELLIOT
136 - DEREK
137 - OLIVER
138 - WALDO
139 - DOREEN
140 - JIM
141 - JACK
142 - OLAF
143 - RAY
144 - OLGA
145 - TYRONE
146 - MADLAB
147 - KEITH
148 - MATT
149 - MIKE
150 - DARYL
151 - HERVE
152 - PETER
153 - ALBERTO
154 - CARLO
155 - MANNY
156 - OSWALD
157 - CALVIN
158 - CARL
159 - SPECK
165 - GASTON
166 - STOGIE
167 - TEX
168 - BIGGENS

E.) Usuwanie postaci eskortowanej przez drużynę

UnRecruitEPC( UINT8 ubCharNum );
    ubCharNum (wielkość liter jest ważna):

40 - BIFF
41 - HAYWIRE
42 - GASKET
43 - RAZOR
44 - FLO
45 - GUMPY
46 - LARRY_NORMAL
47 - LARRY_DRUNK
48 - COUGAR
49 - NUMB
50 - BUBBA
57 - MIGUEL
58 - CARLOS
59 - IRA
60 - DIMITRI
61 - DEVIN
62 - ROBOT
63 - HAMOUS
64 - SLAY
65 - RPC65
66 - DYNAMO
67 - SHANK
68 - IGGY
69 - VINCE
70 - CONRAD
71 - RPC71
72 - MADDOG
73 - DARREL
74 - PERKO
75 - QUEEN
76 - AUNTIE
77 - ENRICO
78 - CARMEN
79 - JOE
80 - STEVE
81 - RAT
82 - ANNIE
83 - CHRIS
84 - BOB
85 - BRENDA
86 - KINGPIN
87 - DARREN
88 - MARIA
89 - ANGEL
90 - JOEY
91 - TONY
92 - FRANK
93 - SPIKE
94 - DAMON
95 - KYLE
96 - MICKY
97 - SKYRIDER
98 - PABLO
99 - SAL
100 - FATHER
101 - FATIMA
102 - WARDEN
103 - GORDON
104 - GABBY
105 - ERNEST
106 - FRED
107 - MADAME
108 - YANNI
109 - MARTHA
110 - TIFFANY
111 - T_REX
112 - DRUGGIST
113 - JAKE
114 - PACOS
115 - GERARD
116 - SKIPPER
117 - HANS
118 - JOHN
119 - MARY
120 - GENERAL
121 - SERGEANT
122 - ARMAND
123 - LORA
124 - FRANZ
125 - HOWARD
126 - SAM
127 - ELDIN
128 - ARNIE
129 - TINA
130 - FREDO
131 - WALTER
132 - JENNY
133 - BILLY
134 - BREWSTER
135 - ELLIOT
136 - DEREK
137 - OLIVER
138 - WALDO
139 - DOREEN
140 - JIM
141 - JACK
142 - OLAF
143 - RAY
144 - OLGA
145 - TYRONE
146 - MADLAB
147 - KEITH
148 - MATT
149 - MIKE
150 - DARYL
151 - HERVE
152 - PETER
153 - ALBERTO
154 - CARLO
155 - MANNY
156 - OSWALD
157 - CALVIN
158 - CARL
159 - SPECK
165 - GASTON
166 - STOGIE
167 - TEX
168 - BIGGENS

F.) Uruchomienie wyznaczonego tigger'a

TriggerNPCRecord( UINT8 ubTriggerNPC, UINT8 ubTriggerNPCRec );
Funkcja odpowiada za uruchomienie wyznaczonego tigger'a danej postaci . Wszystkie wartości są pobierane z pliku *.NPC.
    ubTriggerNPC (wielkość liter jest ważna):

40 - BIFF
41 - HAYWIRE
42 - GASKET
43 - RAZOR
44 - FLO
45 - GUMPY
46 - LARRY_NORMAL
47 - LARRY_DRUNK
48 - COUGAR
49 - NUMB
50 - BUBBA
57 - MIGUEL
58 - CARLOS
59 - IRA
60 - DIMITRI
61 - DEVIN
62 - ROBOT
63 - HAMOUS
64 - SLAY
65 - RPC65
66 - DYNAMO
67 - SHANK
68 - IGGY
69 - VINCE
70 - CONRAD
71 - RPC71
72 - MADDOG
73 - DARREL
74 - PERKO
75 - QUEEN
76 - AUNTIE
77 - ENRICO
78 - CARMEN
79 - JOE
80 - STEVE
81 - RAT
82 - ANNIE
83 - CHRIS
84 - BOB
85 - BRENDA
86 - KINGPIN
87 - DARREN
88 - MARIA
89 - ANGEL
90 - JOEY
91 - TONY
92 - FRANK
93 - SPIKE
94 - DAMON
95 - KYLE
96 - MICKY
97 - SKYRIDER
98 - PABLO
99 - SAL
100 - FATHER
101 - FATIMA
102 - WARDEN
103 - GORDON
104 - GABBY
105 - ERNEST
106 - FRED
107 - MADAME
108 - YANNI
109 - MARTHA
110 - TIFFANY
111 - T_REX
112 - DRUGGIST
113 - JAKE
114 - PACOS
115 - GERARD
116 - SKIPPER
117 - HANS
118 - JOHN
119 - MARY
120 - GENERAL
121 - SERGEANT
122 - ARMAND
123 - LORA
124 - FRANZ
125 - HOWARD
126 - SAM
127 - ELDIN
128 - ARNIE
129 - TINA
130 - FREDO
131 - WALTER
132 - JENNY
133 - BILLY
134 - BREWSTER
135 - ELLIOT
136 - DEREK
137 - OLIVER
138 - WALDO
139 - DOREEN
140 - JIM
141 - JACK
142 - OLAF
143 - RAY
144 - OLGA
145 - TYRONE
146 - MADLAB
147 - KEITH
148 - MATT
149 - MIKE
150 - DARYL
151 - HERVE
152 - PETER
153 - ALBERTO
154 - CARLO
155 - MANNY
156 - OSWALD
157 - CALVIN
158 - CARL
159 - SPECK
165 - GASTON
166 - STOGIE
167 - TEX
168 - BIGGENS

    ubTriggerNPCRec - numer rekordu

G.) Fakty

a.) SetFactTrue( UINT16 usFact );

    Ustawia fakt na True (prawda)
    usFact - wszystkie fakty jakie możemy zastosować są zapisane w pliku Strategic Quest.h

b.) SetFactFalse( UINT16 usFact );

    Ustawia fakt na False (fałsz)
    usFact - wszystkie fakty jakie możemy zastosować są zapisane w pliku Strategic Quest.h

StartQuest( UINT8 ubQuest, INT16 sSectorX, INT16 sSectorY );

    c.) Rozpoczęcie quest'a

    ubQuest - wszystkie questy jakie możemy zastosować są zapisane w pliku Strategic Quest.h

    sSectorX - zalecane wpisać gWorldSectorX (wielkość liter jest ważna)
    sSectorY - zalecane wpisać gWorldSectorY (wielkość liter jest ważna)

EndQuest( UINT8 ubQuest, INT16 sSectorX, INT16 sSectorY );

    d.) Zakończenie quest'a

    ubQuest - wszystkie questy jakie możemy zastosować są zapisane w pliku Strategic Quest.h

    sSectorX - zalecane wpisać gWorldSectorX (wielkość liter jest ważna)
    sSectorY - zalecane wpisać gWorldSectorY (wielkość liter jest ważna)

Powrót do spisu treści





9. Dodanie podziemnego sektora

A.) StrategicCampaign Init.cpp

    W pliku szuakmy kodu ze zdefiniowanymi podziemnymi sektorami):

void BuildUndergroundSectorInfoList()
{
....
}

    Aby dodać podziemny sektor musimy dopisać taki kod:

curr = NewUndergroundNode( UINT8 ubSectorX, UINT8 ubSectorY, UINT8 ubSectorZ );

    gdzie:
ubSectorY - 1-16 lub MAP_ROW_A - MAP_ROW_P
ubSectorX - 1-16
ubSectorZ - 1-3

B.) Przykład dodania podziemia A1

curr = NewUndergroundNode( 1, 1, 1 );

Możemy też do podziemnego sektora dodać wrogów lub kreatury, ale najpierw muszą one znajdować się faktycznie na mapie podziemia (ustawione w edytorze gry).

ubNumTroops - ilość żołnierzy
ubNumElites - ilość elitarnych żołnierzy
ubNumCreatures - ilość kreatur (obcy)
    Przykłady

curr = NewUndergroundNode( 1, 1, 1 );
curr->ubNumTroops = 6;
curr->ubNumElites = 6;

curr = NewUndergroundNode( 1, 1, 2 );
curr->ubNumCreatures = 6;

Można też ustawić jak podróżować między sektorami dodając kod:

ubAdjacentSectors - dozwolone wartości : SOUTH_ADJACENT_SECTOR, NORTH_ADJACENT_SECTOR, EAST_ADJACENT_SECTOR, WEST_ADJACENT_SECTOR

    Przykłady

curr = NewUndergroundNode( 1, 1, 1 );
curr->ubAdjacentSectors |= SOUTH_ADJACENT_SECTOR;

curr = NewUndergroundNode( 1, MAP_ROW_A, 1 );
curr->ubAdjacentSectors |= SOUTH_ADJACENT_SECTOR;

curr = NewUndergroundNode( 13, 6, 2 );
curr->ubAdjacentSectors |= NORTH_ADJACENT_SECTOR | SOUTH_ADJACENT_SECTOR;

Powrót do spisu treści





10. Blokowanie sektorów

Wymagane pliki:

    StrategicMap Screen Interface Map.cpp

Szukamy kodu : void SetUpBadSectorsList( void )

void SetUpBadSectorsList( void )
{
..
}

Aby zablokować sektor musimy wstawić taki kod:

sBadSectorsList[ X ][ Y ] = TRUE;

    gdzie:
X - 1-16
Y - 1-16
    Przykłady

sBadSectorsList[ 16 ][ 1 ] = TRUE; - zablokowany sektor A16
sBadSectorsList[ 5 ][ 3 ] = TRUE; - zablokowany sektor C5
sBadSectorsList[ 5 ][ 3 ] = FALSE; - odblokowany sektor C5

Powrót do spisu treści





11. Dodawanie tygrysów

Wymagane pliki:

    StrategicGame Init.cpp

Szukamy kodu:

void InitBloodCatSectors()
{
..
}

    Aby dodać dzikie koty stosujemy wpis:
SectorInfo[ SECTOR ].bBloodCatPlacements = ilość;
SECTOR - wartości SEC_Axx do SEC_Pxx,
ilość - podajemy ilość tygrysów
    Przykład

SectorInfo[ SEC_F3 ].bBloodCatPlacements = 5;

Ilość tygrysów musi odpowiadać faktycznemu stanowi tygrysów na mapie. Tyle ile postawiliśmy w edytorze.

Powrót do spisu treści





12. Usunięcie listu Enrico

Aby usunąć list od Enrico musimy zmodyfikować wpis w pliku Merc Hiring.cpp. Jest to list, który na początku gry pojawia się w inwentarzu u jednego z najemników.

Wymagane pliki:

    Tactical/Merc Hiring.cpp

Szukamy wpisu:

// OK, CHECK FOR FIRST GUY, GIVE HIM SPECIAL ITEM!
if ( iNewIndex == 0 )
{
// OK, give this item to our merc!
// make an objecttype
CreateItem(LETTER, 100, &gTempObject);
// Give it
fReturn = AutoPlaceObject( MercPtrs[iNewIndex], &gTempObject, FALSE );
// CHRISL: This condition should resolve the issue of the letter not being issued to the first merc
if(!fReturn && (UsingNewInventorySystem() == true))
{
(MercPtrs[iNewIndex]->inv[NUM_INV_SLOTS-1]) = gTempObject;
fReturn=TRUE;
}
Assert( fReturn );
}

    i zmieniamy (lub usuwamy):

/*
// OK, CHECK FOR FIRST GUY, GIVE HIM SPECIAL ITEM!
if ( iNewIndex == 0 )
{
// OK, give this item to our merc!
// make an objecttype
CreateItem(LETTER, 100, &gTempObject);
// Give it
fReturn = AutoPlaceObject( MercPtrs[iNewIndex], &gTempObject, FALSE );
// CHRISL: This condition should resolve the issue of the letter not being issued to the first merc
if(!fReturn && (UsingNewInventorySystem() == true))
{
(MercPtrs[iNewIndex]->inv[NUM_INV_SLOTS-1]) = gTempObject;
fReturn=TRUE;
}
Assert( fReturn );
}
*/

Możemy też zamiast LETTER wpisać numer ID innego przedmiotu.

Powrót do spisu treści





13. Zwiększenie ilości slotów na zapis gry

Wymagane pliki:

    SaveLoadScreen.cpp

Szukamy kodu:

NUM_SAVE_GAMES 11;

Aktualnie na zapisanie gry mamy 10 slotów i 1 na szybki zapis.

    Żeby zwiększyć np. do 15 musimy wpisać wartość 16.

NUM_SAVE_GAMES 16;

    Od teraz będziemy mieli 15 slotów 1 na szybki zapis.

Powrót do spisu treści





14. Detonacje ładunków wybuchowych

W tym krótkim artykule opisze jak wykonać radiową detonacje ukrytych ładunków wybuchowych na mapie.

Pierwszym krokiem jest otwarcie pliku Handle Items.cpp z katalogu Tactical.

    Kolejny krok to odszukanie procedury:

void StartBombMessageBox( SOLDIERTYPE * pSoldier, INT16 sGridNo )
{
gpTempSoldier = pSoldier;
gsTempGridno = sGridNo;
....
....
}

A.) Detonacja pierwsza

    Użycie detonatora na planszy przez naszą postać.

if (pSoldier->inv[HANDPOS].usItem == REMOTETRIGGER)
{
if ( gWorldSectorX == 9 && gWorldSectorY == MAP_ROW_I && gbWorldSectorZ == 1 )
{
SetOffBombsByFrequency( pSoldier->ubID, FIRST_MAP_PLACED_FREQUENCY + 1 );
}
}

Opis poszczególnych wartości:

    WorldSectorX - wartość od 1 do 16
    gWorldSectorY - wartość od MAP_ROW_A do MAP_ROW_P, lub od 1 do 16
    gbWorldSectorZ - wartość od 0 do 3
    FIRST_MAP_PLACED_FREQUENCY + 1 - podajemy numer tiggera np:

FIRST_MAP_PLACED_FREQUENCY + 2, FIRST_MAP_PLACED_FREQUENCY + 3 itp.

B.) Detonacja druga

    Użycie detonatora na planszy przez postać tylko wybranym pomieszczeniu.

if (pSoldier->inv[HANDPOS].usItem == REMOTETRIGGER)
{
if ( gWorldSectorX == 12 && gWorldSectorY == MAP_ROW_G && gbWorldSectorZ == 0 )
{
if ( InARoom( pSoldier->sGridNo, &ubRoom ) && ubRoom == 9 )
{
SetOffBombsByFrequency( pSoldier->ubID, FIRST_MAP_PLACED_FREQUENCY + 1 );
}
}
}

Opis poszczególnych wartości:

    WorldSectorX - wartość od 1 do 16
    gWorldSectorY - wartość od MAP_ROW_A do MAP_ROW_P, lub od 1 do 16
    gbWorldSectorZ - wartość od 0 do 3
    FIRST_MAP_PLACED_FREQUENCY + 1 - podajemy numer tiggera np:

FIRST_MAP_PLACED_FREQUENCY + 2, FIRST_MAP_PLACED_FREQUENCY + 3 itp.

    ubRoom - podajemy numer pomieszczenia. W tym przypadku to pomieszczenie numer 9

C.) Detonacja trzecia

    Użycie detonatora na planszy przez postać w pewnej odległości.

if (pSoldier->inv[HANDPOS].usItem == REMOTETRIGGER)
{
if ( gWorldSectorX == 12 && gWorldSectorY == MAP_ROW_G && gbWorldSectorZ == 0 )
{
if (PythSpacesAway( pSoldier->sGridNo, 10827 ) < 5)
{
SetOffBombsByFrequency( pSoldier->ubID, FIRST_MAP_PLACED_FREQUENCY + 1 );
}
}
}

Opis poszczególnych wartości:

    gWorldSectorX - wartość od 1 do 16
    gWorldSectorY - wartość od MAP_ROW_A do MAP_ROW_P, lub od 1 do 16
    gbWorldSectorZ - wartość od 0 do 3
    FIRST_MAP_PLACED_FREQUENCY + 1 - podajemy numer tiggera np:

FIRST_MAP_PLACED_FREQUENCY + 2, FIRST_MAP_PLACED_FREQUENCY + 3 itp.

    (PythSpacesAway( pSoldier→sGridNo, 10827 ) < 5) - sprawdzane czy postać znajduje się w obrębie siatki (grido) o numerze 10827 w odległości co do 5 płytek

D.) Przykłady

a.) Przykład 1

void StartBombMessageBox( SOLDIERTYPE * pSoldier, INT16 sGridNo )
{
gpTempSoldier = pSoldier;
gsTempGridno = sGridNo;
if (pSoldier->inv[HANDPOS].usItem == REMOTETRIGGER)
{
if ( gWorldSectorX == 9 && gWorldSectorY == MAP_ROW_I && gbWorldSectorZ == 1 )
{
SetOffBombsByFrequency( pSoldier->ubID, FIRST_MAP_PLACED_FREQUENCY + 1 );
}
}
....
....
}

b.) Przykład 2

void StartBombMessageBox( SOLDIERTYPE * pSoldier, INT16 sGridNo )
{
gpTempSoldier = pSoldier;
gsTempGridno = sGridNo;
UINT8 ubRoom;
if (pSoldier->inv[HANDPOS].usItem == REMOTETRIGGER)
{
if ( gWorldSectorX == 12 && gWorldSectorY == MAP_ROW_G && gbWorldSectorZ == 0 )
{
if ( InARoom( pSoldier->sGridNo, &ubRoom ) && ubRoom == 9 )
{
SetOffBombsByFrequency( pSoldier->ubID, FIRST_MAP_PLACED_FREQUENCY + 1 );
}
}
}
....
....
}

c.) Przykład 3

void StartBombMessageBox( SOLDIERTYPE * pSoldier, INT16 sGridNo )
{
gpTempSoldier = pSoldier;
gsTempGridno = sGridNo;
if (pSoldier->inv[HANDPOS].usItem == REMOTETRIGGER)
{
if ( gWorldSectorX == 12 && gWorldSectorY == MAP_ROW_G && gbWorldSectorZ == 0 )
{
if (PythSpacesAway( pSoldier->sGridNo, 10827 ) < 5)
{
SetOffBombsByFrequency( pSoldier->ubID, FIRST_MAP_PLACED_FREQUENCY + 1 );
}
}
}
....
....
}

Powrót do spisu treści





Część Czwarta

Przykłady edycji plików XML ze stron

oraz




1. AltSectors.xml

Plik odpowiada za losowe (alternatywne) sektory w grze. Aby uaktywnić losowy sektor w tabeli musimy odszukać przez nas odpowiednie miejsce i wpisać 1. Jeśli nie chcemy alternatywnego sektora to wpisujemy 0. Alternatywny sektor musi nosić końcówkę "_A" np. E6_A.DAT. W tedy gra będzie mogła wylosować sektor E6.DAT lub alternatywny E6_A.DAT. Szanse na wylosowania są 50/50.

Jeśli coś zostało zmienione w sekcji ALT_SECTORS_LIST jest wymagane rozpoczęcie gry od nowa.

    ALT_SECTORS_LIST
/ROW y="A" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 /ROW
/ROW y="B" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 /ROW
/ROW y="C" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 /ROW
/ ROW y="D" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 /ROW
/ROW y="E" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 /ROW
/ROW y="F" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 /ROW
/ROW y="G" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 /ROW
/ ROW y="H" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 /ROW
/ ROW y="I" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 /ROW
/ ROW y="J" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 /ROW
/ROW y="K" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 /ROW
/ROW y="L" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 /ROW
/ ROW y="M" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 /ROW
/ROW y="N" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 /ROW
/ROW y="O" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 /ROW
/ ROW y="P" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 /ROW
    /ALT_SECTORS_LIST

Oryginalne alternatywne sektory w grze:

    Skyrider - B15, E14, D12, C16
    Magazyny broni - E11, H5, H10, J12, M9
    Madlab - H7, H16, I11, E4
    Gabby - I4 nie umożliwia losowania tego sektora ?

Powrót do spisu treści





2. AmmoStrings.xml

    AmmoCaliber - kaliber w opisie przedmiotu,
    BRCaliber - kaliber w opisie u BobbyRay'a.

Sekcje te odpowiadają wartości ubCalibre w pliku Magazines.xml. Numer tam podany odnosi się do kolejności w tym pliku. (czyli ubCalibre 1 oznacza.38 Special, pierwsza pozycja w AmmoStrings.xml jest uznawana za zerową).

Powrót do spisu treści





3. AmmoTypes.xml

Plik ten zawiera zdefiniowane typy amunicji.

    AMMOTYPE
uiIndex 0 /uiIndex
name Ball /name
fontColour 136 /fontColour
grayed 4 /grayed
offNormal 1 /offNormal
onNormal 3 /onNormal
structureImpactReductionMultiplier 1 /structureImpactReductionMultiplier
structureImpactReductionDivisor 1 /structureImpactReductionDivisor
armourImpactReductionMultiplier 1 /armourImpactReductionMultiplier
armourImpactReductionDivisor 1 /armourImpactReductionDivisor
beforeArmourDamageMultiplier 1 /beforeArmourDamageMultiplier
beforeArmourDamageDivisor 1 /beforeArmourDamageDivisor
afterArmourDamageMultiplier 1 /afterArmourDamageMultiplier
afterArmourDamageDivisor 1 /afterArmourDamageDivisor
zeroMinimumDamage 0 /zeroMinimumDamage
canGoThrough 1 /canGoThrough
standardIssue 1 /standardIssus
numberOfBullets 1 /numberOfBullets
multipleBulletDamageMultiplier 1 /multipleBulletDamageMultiplier
multipleBulletDamageDivisor 1 /multipleBulletDamageDivisor
highExplosive 0 /highExplosive
explosionSize 0 /explosionSize
antiTank 0 /antiTank
dart 0 /dart
knife 0 /knife
monsterSpit 0 /monsterSpit
acidic 0 /acidic
ignoreArmour 0 /ignoreArmour
lockBustingPower 0 /lockBustingPower
tracerEffect 0 /tracerEffect
    /AMMOTYPE

Opis parametrów

    1. uiIndex /uiIndex Numer indeksu. Numerować według kolejności.
    2. fontColour /fontColour Kolor czcionki amunicji. Wartości stosowane to 0-255.
    3. grayed /grayed
    4. offNormal /offNormal Ikona przedstawiająca kolor amunicji (wyłączona). Dozwolone wartości - 1, 5, 9,13,17,21,25.
    5. onNormal /onNormal To samo co offNormal tylko włączona. Wartości - 3,7,11,15,19,23,27
    6. structureImpactReductionMultiplier /structureImpactReductionMultiplier
    7. armourImpactReductionMultiplier /armourImpactReductionMultiplier
    8. beforeArmourDamageMultiplier /beforeArmourDamageMultiplier
    9. afterArmourDamageMultiplier /afterArmourDamageMultiplier zeroMinimumDamage /zeroMinimumDamage Wartość 0 lub 1.
    10. canGoThrough /canGoThrough Pocisk jest w stanie spenetrować wielokrotnie cel zadając większe straty (0 lub 1).
    11. standardIssue /standardIssue Wartość 0 lub 1.
    12. numberOfBullets /numberOfBullets Ilość kul wystrzeliwanych w pojedynczym strzale (śrutówki). Wartość 1 - 9.
    13. multipleBulletDamageMultiplier/multipleBulletDamageMultiplier
    14. highExplosive /highExplosive Amunicja wybuchowa (0 lub 1).
    15. explosionSize /explosionSize Wielkość eksplozji dla amunicji wybuchowej (highExplosive). Wartości : 0 = żadna, 1 = mała, 2 = średnia, 3 = duża.
    16. antiTank /antiTank Amunicja przeciwczołgowa (0 lub 1).
    17. dart/dart Rzutka paraliżująca (0 lub 1).
    18. knife/knife Nóż (0 lub 1).
    19. monsterSpit /monsterSpit Ślina potwora. Tworzy efekt gazu, oślepienia itd.. Wartość 0 lub 1.
    20. acidic /acidic Parametr powoduje poważne uszkodzenia zbroi (jak ślina potwora). Wartość 0 lub 1.
    21. ignoreArmour /ignoreArmour Ignoruje kamizelki i spodnie osłaniające najemnika. Stosuje się przy nożach, ślinie potwora itp.. Wartość 0 lub 1.
    22. lockBustingPower /lockBustingPower Jeśli jest większy od zera to ten typ amunicji niszczy zamki w drzwiach.

Powrót do spisu treści





4. Armours.xml

Przykładowy rekord

    ARMOUR
uiIndex 1 /uiIndex
ubArmourClass 1 /ubArmourClass
ubProtection22 /ubProtection
ubCoverage75 /ubCoverage
ubDegradePercent20 /ubDegradePercent
    /ARMOUR

Opis parametrów

    1. uiIndex /uiIndex Podajemy tu uiIndex przedmiotu, który został ustawiony jako pancerz w pliku Items.xml. Numer uiIndex pobieramy właśnie z tego pliku.
    2. ubArmourClass /ubArmourClass Typ pancerza
0 - ARMOURCLASS_HELMET (hełm)
1 - ARMOURCLASS_VEST (kamizelka)
2 - ARMOURCLASS_LEGGINGS (spodnie)
3 - ARMOURCLASS_PLATE (wkładki ochronne)
4 - ARMOURCLASS_MONST (obcy)
5 - ARMOURCLASS_VEHICLE (pojazdy)
    3. ubProtection /ubProtection Ochrona jaką oferuje nam pancerz.
    4. ubDegradePercent /ubDegradePercent Jak szybko pancerz się zużywa.

Powrót do spisu treści





5. ArmyComposition.xml

W pliku ArmyComposition.xml zdefiniowane są ustawienia armii królowej Deidranny.

Przykładowy rekord

    COMPOSITION
Index 27 /Index
Priority 100 /Priority
ElitePercentage 50 /ElitePercentage
TroopPercentage 50 /TroopPercentage
AdminPercentage 0 /AdminPercentage
DesiredPopulation 32 /DesiredPopulation
StartPopulation 32 /StartPopulation
    /COMPOSITION

Opis parametrów

    1. Index /Index Unikalny numer grupy.
    2. Priority /Priority> Parametr ten określa priorytet danej grupy. Grupy o wyższym priorytecie mają większe szanse na otrzymanie uzupełnień.
    3. ElitePercentage /ElitePercentage Procent określający ilość wojsk elitarnych w danej grupie (0-100).
    4. TroopPercentage /TroopPercentage Procent określający ilość zwykłych żołnierzy w danej grupie (0-100).
    5. AdminPercentage /AdminPercentage Procent określający ilość cywili (podwładnych królowej) w danej grupie (0-100). NumAdmins = AdminPercentage * StartPopulation / 100.
    6. DesiredPopulation /DesiredPopulation Parametr ten określa maksymalną liczbę żołnierzy w grupie.
    7. StartPopulation /StartPopulation Parametr ten określa ilość żołnierzy w grupie na początku nowej kampanii (gry).

Grupy występujące w podstawowym Jagged Alliance 2

    Index Nazwa Opis
0 QUEEN_DEFENCE pałac królowej w Medunie
1 MEDUNA_DEFENCE miasto Meduna
2 MEDUNA_SAMSITE wyrzutnie rakiet w Medunie (o wyższym priorytecie)
3 LEVEL1_DEFENCE sektory przyległe do Meduny
4 LEVEL2_DEFENCE j/w
5 LEVEL3_DEFENCE j/w
6 ORTA_DEFENCE tajny ośrodek badawczy Orta
7 EAST_GRUMM_DEFENCE wschodnie Grumm, najlepiej uprzemysłowione miasto w Arulco
8 WEST_GRUMM_DEFENCE zachodnie Grumm, j/w
9 GRUMM_MINE kopalnia w Grumm
10 OMERTA_WELCOME_WAGON "komitet powitalny" w Omercie
11 BALIME_DEFENCE miasto Balime
12 TIXA_PRISON więzienie Tixa
13 TIXA_SAMSITE wyrzutnie rakiet w pobliżu Tixa
14 ALMA_DEFENCE miasto Alma
15 ALMA_MINE kopalnia w Almie
16 CAMBRIA_DEFENCE szpital w Cambrii
17 CAMBRIA_MINE kopalnia w Cambrii
18 CHITZENA_DEFENCE miasto Chitzena
19 CHITZENA_MINE kopalnia w Chitzenie
20 CHITZENA_SAMSITE wyrzutnia rakiet w pobliżu Chitzeny
21 DRASSEN_AIRPORT lotnisko w Drassen
22 DRASSEN_DEFENCE miasto Drassen
23 DRASSEN_MINE kopalnia w Drassen
24 DRASSEN_SAMSITE wyrzutnia rakiet w pobliżu Drassen
25 ROADBLOCK
26 SANMONA_SMALL miasto San Mona

Powrót do spisu treści





6. Cities.xml

Plik służy do ustawiania miast.

Przykładowy rekord

    CITY
uiIndex 1 /uiIndex
townNameOmerta /townName
townUsesLoyalty 1 /townUsesLoyalty
townRebelSentiment 90 /townRebelSentiment
townMilitiaAllowed 0 /townMilitiaAllowed
baseSector x 9 /x
y 1 /y
baseSector
townPoint
x 90 /x
y 10 /y
townPoint
    /CITY

Opis parametrów

    1.uiIndex /uiIndex Numer miasta.
    2.SzName /SzName Nazwa miasta. Maksymalna ilość znaków to 31.
    3.townUsesLoyalty /townUsesLoyalty Parametr pokazuje na mapie czy miasto utrzymuje lojalność. Dozwolone wartości to 0 – nie i 1 – tak.
    4.townRebelSentiment /townRebelSentiment Parametr jest miarą jak dane miasto nienawidzi królowej i jest skłonne by jej przeciwstawić się. Dozwolone wartości to 1-100.
    5.townMilitiaAllowed /townMilitiaAllowed Parametr definiuje czy w mieście można szkolić samoobronę. Możliwe wartości: 0 - nie, 1 - tak
    6.baseSector /baseSector X /X Y /Y
    7. townPoint/townPoint X /X Y /Y

Położenie nazwy miasta na mapie

Interesuje nas to co znajduje się w części oznaczonej czerwonym kwadratem.

Zmiany w pliku wymagają rozpoczęcie gry od nowa.

    Nazwy miast
    Nazwy miast mogą być przechowywane w osobny pliku xml dla każdej wersji językowej.
Polish.Cities.xml
Russian.Cities.xml
German.Cities.xml

Przykładowy rekord w takim pliku

    CITY
uiIndex 1 /uiIndex
townNameOmerta /townName
    /CITY

Powrót do spisu treści





7. CompatibleFaceItems.xml

Przykładowy rekord

    COMPATIBLEFACEITEM
compatiblefaceitemIndex 210 /compatiblefaceitemIndex
itemIndex 211 /itemIndex
    /COMPATIBLEFACEITEM

Opis parametrów

    1. itemIndex /itemIndex> Numer przedmiotu. Podajemy w tym miejscu uiIndex wybranego przedmiotu, który jest zaklasyfikowany jako przedmiot nakładany na twarz. Możemy też pisać w to miejsce 0 co będzie oznaczało, że możemy używać tylko jednego przedmiotu. Numer uiIndex pobieramy z pliku Items.xml.
    2. compatiblefaceitemIndex /compatiblefaceitemIndex> Numer przedmiotu. Podajemy w tym miejscu uiIndex wybranego przedmiotu, który jest zaklasyfikowany jako przedmiot nakładany na twarz. Oznacza to, że będziemy mogli używać jednocześnie pierwszego i drugiego przedmiotu nakładanego na twarz. Numer uiIndex pobieramy z pliku Items.xml.

Przykład A

Pierwszy slot twarzy: 210 - Extended Ear
Drugi slot twarzy: 211 - NVG I
    COMPATIBLEFACEITEM
compatiblefaceitemIndex 210 /compatiblefaceitemIndex
itemIndex 211 /itemIndex
    /COMPATIBLEFACEITEM

Taki wpis daje nam możliwość używania w pierwszym slocie Extended Ear, a w drugim NVG I.

Przykład B

Pierwszy slot twarzy : 211 - NVG I
Drugi slot twarzy : 210 - Extended Ear
    COMPATIBLEFACEITEM
compatiblefaceitemIndex 211 /compatiblefaceitemIndex
itemIndex 210 /itemIndex
    /COMPATIBLEFACEITEM

Taki wpis daje nam możliwość używania w pierwszym slocie NVG I, a w drugim Extended Ear.

Uwagi

Jeśli dodamy tylko jeden wpis ten z przykładu A to będziemy mieli tylko jedną możliwość, że w pierwszym slocie Extended Ear, a w drugim NVG I.

Powrót do spisu treści





8. EnemyAmmoDrops.xml

Przykładowy rekord

    DROPITEM
uiIndex 1 /uiIndex
uiType 1 /uiType
ubEnemyDropRate 50 /ubEnemyDropRate
ubMilitiaDropRate 5 /ubMilitiaDropRate
    /DROPITEM

Opis parametrów

    1. uiIndex /uiIndex Numer indeks. Numerować należy po kolei, zaczynając od 0 aż do 199 (co stanowi maksymalną ilość).
    2. uiType /uiType Numer uiIndex przedmiotu upuszczanego przez wroga. Numery uiIndex znajdują się w pliku AmmoTypes.xml.
    3. ubEnemyDropRate /ubEnemyDropRate Szansa upuszczenia przedmiotu, jeżeli znajduje się on w posiadaniu wroga. Wyrażona jest w procentach (0-100), przy czym 0 oznacza, że przedmiot nigdy nie zostanie upuszczony, a 100, że wróg zawsze upuści przedmiot będąc w jego posiadaniu.
    4. ubMilitiaDropRate /ubMilitiaDropRate Zasady są takie same jak w przypadku ubEnemyDropRate, ale ten punkt dotyczy samoobrony.

Uwagi

Aby gra korzystała z informacji zapisanych w tym pliku należy wykonać następujące czynności:

1. w pliku Ja2_Options.ini ustawić parametr ENEMIES_ITEM_DROP = 1;
2. przed rozpoczęciem gry, w opcjach należy wyłączyć opcję "Enemies drop all items".

Powrót do spisu treści





9. EnemyArmourDrops.xml

Przykładowy rekord

    DROPITEM
uiIndex 0 /uiIndex
ubArmourClass 0 /ubArmourClass
ubEnemyDropRate 15 /ubEnemyDropRate
ubMilitiaDropRate 2 /ubMilitiaDropRate
    /DROPITEM

Opis parametrów

    1. uiIndex /uiIndex Numer indeks. Numerować należy po kolei, zaczynając od 0 aż do 199 (co stanowi maksymalną ilość).
    2. ubArmourClass /ubArmourClass Typ przedmiotu upuszczanego przez wroga. Typy przemiotów znajdują się w pliku Armours.xml.
    3. Typy przemiotów:
0 - ARMOURCLASS_HELMET (hełm)
1 - ARMOURCLASS_VEST (kamizelka)
2 - ARMOURCLASS_LEGGINGS (spodnie)
3 - ARMOURCLASS_PLATE (wkładki)
4 - ARMOURCLASS_MONST (potwory)
5 - ARMOURCLASS_VEHICLE (pojazdy)
    4. ubEnemyDropRate /ubEnemyDropRate Szansa upuszczenia przedmiotu, jeżeli znajduje się on w posiadaniu wroga. Wyrażona jest w procentach (0-100), przy czym 0 oznacza, że przedmiot nigdy nie zostanie upuszczony, a 100, że wróg zawsze upuści przedmiot będąc w jego posiadaniu.
    5. ubMilitiaDropRate /ubMilitiaDropRate Zasady są takie same jak w przypadku ubEnemyDropRate, ale ten punkt dotyczy samoobrony.

Uwagi

Aby gra korzystała z informacji zapisanych w tym pliku należy wykonać następujące czynności:

    1. w pliku Ja2_Options.ini ustawić parametr ENEMIES_ITEM_DROP = 1;
    2. przed rozpoczęciem gry, w opcjach należy wyłączyć opcję "Enemies drop all items".

Powrót do spisu treści





10. EnemyExplosiveDrops.xml

Przykładowy rekord

    DROPITEM
uiIndex 1 /uiIndex
ubType 1 /ubType
ubEnemyDropRate 25 /ubEnemyDropRate
ubMilitiaDropRate 3 /ubMilitiaDropRate
    /DROPITEM

Opis parametrów

    1. uiIndex /uiIndex W tym miejscu podajemy numer indeks. Numerować według kolejności zaczynając od 0 do 199 (jest to maksymalna ilość).
    2. uiType /uiType Podajemy tu numer ubType przedmiotu jaki będzie opuszczany. Numer ubType pobieramy z pliku Explosives.xml.
    3. ubEnemyDropRate /ubEnemyDropRate Jeżeli wróg posiada dany przedmiot to szansa opuszczenia go wyrażona jest w procentach (0-100)
0 - przedmiot nigdy niezostanie opuszczony
100 - przedmiot zawsze zostanie opuszczony, jeżeli wróg będzie go posiadał w inwentarzu
    4. ubMilitiaDropRate /ubMilitiaDropRate to samo co ubEnemyDropRate tylko dla samoobrony

Uwagi

Jeżeli chcesz aby gra używała informacji zapisanych w tym pliku to musisz wykonać następujące czynności:

    1 - W pliku Ja2_Options.ini ustawić parametr ENEMIES_ITEM_DROP = 1
    2 - Podczas rozpoczęcia gry w opcjach wyłączyć opcję "Enemies drop all items".

Powrót do spisu treści





11. EnemyMiscDrops.xml

Przykładowy rekord

    DROPITEM
uiIndex 0 /uiIndex
usItemClass 4 /usItemClass
ubEnemyDropRate 15 /ubEnemyDropRate
ubMilitiaDropRate 2 /ubMilitiaDropRate
    /DROPITEM

Opis parametrów

    1. W tym miejscu podajemy numer indeks. Numerować według kolejności zaczynając od 0 do 199 (jest to maksymalna ilość).
    2. Podajemy tu typ przedmiotu jaki będzie opuszczany. Typ pochodzi z pliku Items.xml
1 - nic
2 - broń
4 - noże
8 - noże do rzucania
10 - granaty, RPG
32 - Queen Tentacles
64 - rzucanie (kamienie)
128 - Punching
256 - rakiety RPG
512 – bomby
1024 - amunicja
2048 - pancerz
4096 - apteczki
8192 - Other kits (inne narzędzia)
32768 - przedmioty nakładane na twarz (maska, gogle itp. )
65536 – klucze
268435456 - Misc.
536870912 – pieniądze
    3. Jeżeli wróg ma dany przedmiot to szansa opuszczenia go wyrażona jest w procentach (0-100).
0 - przedmiot nigdy niezostanie opuszczony. 100 - przedmiot zawsze zostanie opuszczony. Jeżeli wróg będzie go posiadał w inwentarzu.
    4. To samo co ubEnemyDropRate tylko dla samoobrony

Uwagi

Jeżeli chcesz aby gra używała informacji zapisanych w tym pliku to musisz wykonać następujące czynności:

    1 - W pliku Ja2_Options.ini ustawić parametr ENEMIES_ITEM_DROP = 1
    2 - Podczas rozpoczęcia gry w opcjach wyłączyć opcję "Enemies drop all items".

Powrót do spisu treści





12. EnemyWeaponDrops.xml

Przykładowy rekord

    DROPITEM
uiIndex 0 /uiIndex
ubWeaponType 0 /ubWeaponType
ubEnemyDropRate 15 /ubEnemyDropRate
ubMilitiaDropRate 2 /ubMilitiaDropRate
    /DROPITEM

Opis parametrów

    1. uiIndex /uiIndex W tym miejscu podajemy numer indeks. Numerować według kolejności zaczynając od 0 do 199 (jest to maksymalna ilość).
    2. uiType /uiType Podajemy tu typ broni jaki będzie opuszczany. Typ pochodzi z pliku Weapons.xml.
0 - NOT_GUN
1 - GUN_PISTOL (Pistolet)
2 – GUN_M_PISTOL
3 - GUN_SMG
4 - GUN_RIFLE (karabin)
5 - GUN_SN_RIFLE (karabin snajperski)
6 - GUN_AS_RIFLE (karabin szturmowy)
7 - GUN_LMG
8 - GUN_SHOTGUN (strzelba)
    3. Jeżeli wróg ma dany przedmiot to szansa opuszczenia go wyrażona jest w procentach (0-100).
0 - przedmiot nigdy niezostanie opuszczony.
100 - przedmiot zawsze zostanie opuszczony. Jeżeli wróg będzie go posiadał w inwentarzu.
    4. To samo co ubEnemyDropRate tylko dla samoobrony

Uwagi

Jeżeli chcesz aby gra używała informacji zapisanych w tym pliku to musisz wykonać następujące czynności:

    1 - W pliku Ja2_Options.ini ustawić parametr ENEMIES_ITEM_DROP = 1
    2 - Podczas rozpoczęcia gry w opcjach wyłączyć opcję "Enemies drop all items".

Powrót do spisu treści





13. ExplosionData.xml

Przykładowy rekord

    EXPDATA
uiIndex 1 /uiIndex
name Standard /name
TransKeyFrame 17 /TransKeyFrame
DamageKeyFrame 3 /DamageKeyFrame
ExplosionSoundID 61 /ExplosionSoundID
AltExplosionSoundID 285 /AltExplosionSoundID
BlastFilename TILECACHEZGRAV_D.STI /BlastFilename
BlastSpeed 80 /BlastSpeed
    /EXPDATA

Opis parametrów

    1. TransKeyFrame /TransKeyFrame
    2. DamageKeyFrame /DamageKeyFrame
    3. ExplosionSoundID /ExplosionSoundID
Numer dźwięku eksplozji.
    4. AltExplosionSoundID /AltExplosionSoundID Numer alternatywnego dźwięku eksplozji. Jeśli nie chcemy używać alternatywnego dźwięku to wpisujemy -1.
    5. BlastFilename /BlastFilename Animacja wybuchu.
    6. BlastSpeed /BlastSpeed
    7. Dźwięki
61 - SMALL EXPLOSION 01.WAV
285 - explosion10.wav
286 - explosion12.wav
248 - airescaping.WAV
8325 – Smolotov2.WAV
465 – GREN-FLSHBANG.ogg

Powrót do spisu treści





14. Explosives.xml

Przykładowy rekord

    EXPLOSIVE
uiIndex 0 /uiIndex
ubType 1 /ubType
ubDamage 1 /ubDamage
ubStunDamage 140 /ubStunDamage
ubRadius 4 /ubRadius
ubVolume 0 /ubVolume
ubVolatility 0 /ubVolatility
ubAnimationID 4 /ubAnimationID
ubDuration 0 /ubDuration
ubStartRadius 0 /ubStartRadius
    /EXPLOSIVE

Opis parametrów

    1. uiIndex /uiIndex Numer indeks. Numer przedmiotu, który jest zakwalifikowany jako przedmiot wybuchowy pobieramy z pliku Items.xml.
    2. UbType /UbType

Typ eksplozji

0 – EXPLOSV_NORMAL (normalna eksplozja)
1 – EXPLOSV_STUN (granat)
2 – EXPLOSV_TEARGAS (granat oszałamiający)
3 – EXPLOSV_MUSTGAS (gaz musztardowy)
4 – EXPLOSV_FLARE (flara)
5 - EXPLOSV_NOISE
6 – EXPLOSV_SMOKE (gaz dymny)
7– EXPLOSV_CREATUREGAS (gaz wyrzucany przez obcych )
8 -EXPLOSV_BURNABLEGAS
    3. ubDamage /ubDamage Jakie szkody może wyrządzić wybuch na zdrowiu.
    4. ubStunDamage /ubStunDamage Jakie szkody może wyrządzić wybuch na energii.
    5. ubRadius /ubRadius Wielkość eksplozji.
    6. ubVolume /ubVolume Jak głośna jest eksplozja.
    7. ubVolatility /ubVolatility
    8. ubAnimationID /ubAnimationID Animacja użyta do przedstawienia wybuchu

Typ animacji

0 - NO_BLAST
1 - BLAST_1
2 - BLAST_2
3 - BLAST_3
4 - STUN_BLAST
5 - WATER_BLAST
6 - TARGAS_EXP
7 - SMOKE_EXP
8 - MUSTARD_EXP
9 - BURN_EXP
    9. ubDuration /ubDuration Jak długo ma unosić się dym po wybuchu.
    10. ubStartRadius /ubStartRadius Jaki duży efekt dymu jest podczas wybuchu.

Powrót do spisu treści





15. GarrisonGroups.xml

Przykładowy rekord

    GARRISON
Sector F13 /Sector
Composition 27 /Composition
    /GARRISON

Opis parametrów

    1. Sector /Sector Oznacza w jakim sektorze znajduje się garnizon.
    2. Composition /Composition Wartość ta definiuje ilość i jakość sił wroga. Podajemy tu numer Index, który jest zdefiniowany w pliku ArmyComposition.xml.

Uwagi

Uwagi
    Maksymalna ilość garnizonów jaka może zostać użyta w grze to 100.
    Zmiany w tym pliku wymagają rozpoczęcia gry od nowa.

Powrót do spisu treści





16. IMPItemChoices.xml

Plik ten jest niejako podzielony na 26 sekcji, każda odpowiada za dodanie ekwipunku dla IMPa w określonych warunkach. Tak jak przedmioty, również sekcje są ponumerowane poprzez tagi. Kolejne sekcje odpowiadają za:

    0 = Domyślne przedmioty - zawsze dodawane
    1 = Losowe domyślne przedmioty - zawsze dodawane - ale wybierane zupełnie losowo
    2 = przedmioty bazujące na Inteligencji - przyznawane zależnie od wartości cechy
    3 = przedmioty bazujące na Zręczności - przyznawane zależnie od wartości cechy
    4 = przedmioty bazujące na Zwinności - przyznawane zależnie od wartości cechy
    5 = przedmioty bazujące na Sile - przyznawane zależnie od wartości cechy
    6 = przedmioty bazujące na Zdrowiu - przyznawane zależnie od wartości cechy
    7 = przedmioty bazujące na Dowodzeniu - przyznawane zależnie od wartości cechy
    8 = przedmioty bazujące na Celności - przyznawane zależnie od wartości cechy
    9 = przedmioty bazujące na Zn. Mat. Wybuchowych - przyznawane zależnie od wartości cechy
    10 = przedmioty bazujące na Mechanice - przyznawane zależnie od wartości cechy
    11= przedmioty bazujące na Wiedzy Medycznej- przyznawane zależnie od wartości cechy
    12= przedmioty dla zdolności Walka wręcz - przyznawane losowo
    13= przedmioty dla zdolności Sztuki walki - przyznawane losowo
    14= przedmioty dla zdolności Nocne operacje - przyznawane losowo
    15= przedmioty dla zdolności Skradanie - przyznawane losowo
    16= przedmioty dla zdolności Snajper - przyznawane losowo
    17= przedmioty dla zdolności Otwieranie zamków - przyznawane losowo
    18= przedmioty dla zdolności Elektronika - przyznawane losowo
    19= przedmioty dla zdolności Rzucanie - przyznawane losowo
    20= przedmioty dla zdolności Broń biała - przyznawane losowo
    21= przedmioty dla zdolności Broń ciężka - przyznawane losowo
    22= przedmioty dla zdolności Broń automatyczna - przyznawane losowo
    23= przedmioty dla zdolności Oburęczność - przyznawane losowo
    24= przedmioty dla zdolności Kamuflaż - przyznawane losowo
    25= przedmioty dla zdolności Szkolenie - przyznawane losowo
    26= przedmioty dla zdolności Złodziej - przyznawane losowo - nie w użytku

Sposób postępowania różni się trochę pomiędzy nimi, jednak wszystkie mają te same elementy określające sekcję, ilość rzeczy w sekcji które będą brane pod uwagę przez program (począwszy od pierwszej lecąc w dół, maksymalnie do 50 – to oznacza 50 możliwości wyboru ale nie ilość przedmiotów jakie otrzyma najemnik), oraz ilość przedmiotów rozdanych poprzez tą sekcję. Dla "0" (czyli dla domyślnych przedmiotów zawsze dodawanych dla najemnika) mamy na początku przypisane dwa obiekty pod tagami i wygląda to mniej więcej tak:

Kod:

    IMPITEMCHOICES
uiIndex 0 /uiIndex
ubChoices 2 /ubChoice
ubNumItems 2 /ubNumItems
bItemNo1 161 /bItemNo1
bItemNo2 214 /bItemNo2
bItemNo3 0 /bItemNo3
...
bItemNo50 0 /bItemNo50
    /IMPITEMCHOICES

Oznacza to kolejno:

    ID/numer sekcji - tutaj '0' czyli ekwipunek domyślny
ilość opcji - dwie
ilość przedmiotów dodanych dla najemnika spośród opcji - tutaj dwa.
    ID przedmiotu pierwszego - w tym wypadku 161 - kamizelka
    ID przedmiotu drugiego - w tym wypadku 214 - manierka
    ID przedmiotu trzeciego - zero oznacza brak.

W przypadku tej sekcji 'ubChoices' oraz 'ubNumItems' powinny być sobie równe. Jeżeli chcemy jakiegoś ekwipunku więcej to wpisujemy pod kilkoma slotami np.:

    bItemNo1 214 /bItemNo1
    bItemNo2 214 /bItemNo2

Jeżeli mowa o sekcjach z przedmiotami przyznawanymi losowo, może wyglądać to tak:

    Kod:
uiIndex 24 /uiIndex
ubChoices 2 /ubChoices
ubNumItems 1 /ubNumItems
bItemNo1 207 /bItemNo1
bItemNo2 210 /bItemNo2
bItemNo3 0 /bItemNo3

24 – więc jeżeli najemnik otrzyma zdolność Kamuflaż będzie miał losowany jeden ekwipunek (ubNumItems) spośród dwóch (ubChoices), a są nimi 207 - NVG2, oraz 210 - Extended ear (zdaje się że oryginalny plik zakładał 3 opcje z czego ostatnią był Woodland Camo Kit więc go wykasowałem i przestawiłem ubChoices na 2, bo dla takiego najemnika nie potrzebny jest zestaw do kamuflażu).

    Jeżeli ubNumItems jest większe od 1 wówczas otrzymujemy kilka kopii wylosowanego ekwipunku.
    Jeżeli jest to sekcja z ekwipunkiem zależnym od wartości cechy, wygląda to inaczej, np.:
    Kod:
uiIndex 8 /uiIndex
ubChoices 10 /ubChoices
ubNumItems 1 /ubNumItems
bItemNo1 3 /bItemNo1
bItemNo2 3 /bItemNo2
bItemNo3 3 /bItemNo3
bItemNo4 3 /bItemNo4
bItemNo5 4 /bItemNo5
bItemNo6 4 /bItemNo6
bItemNo7 2 /bItemNo7
bItemNo8 2 /bItemNo8
bItemNo9 9 /bItemNo9
bItemNo10 9 /bItemNo10

W tym wypadku cecha Celności jest dzielona przez ilość opcji i w ten sposób w zależności ile przyznamy najemnikowi punktów na tą cechę, taki ekwipunek otrzyma.

    W tym wypadku są to:
01-40: Beretta 92F
41-60: Beretta 93R
61-80: Glock 18
81-100: MP5KA4

Można również pierwsze sloty oznaczyć jako '0' co sprawi że przy niskiej ilości punktów w tej cesze, nie otrzyma się nic. Jako że jest aż 50 slotów można zróznicować otrzymywane przedmioty co 2 pkt danej cechy.

    Chociażby w Mechanice rozwiązano to tak:
    Kod:
uiIndex 10 /uiIndex
ubChoices 2 /ubChoices
ubNumItems 1 /ubNumItems
bItemNo1 0 /bItemNo1
bItemNo2 203 /bItemNo2

Co oznacza że dopiero powyżej 50 pkt przyznanych na tą cechę można coś otrzymać (w tym wypadku skrzynkę narzędzi). Jeżeli w takiej sekcji ubNumItemsjest większe od 1 wówczas otrzymujemy nie kilka kopii przedmiotu, ale najwyższy na jaki pozwala ilość punktów w cesze, oraz jeden o niższym numerze. W przykładzie z Celnością, gdyby zmienić ubNumItems na 3 oraz dać najemnikowi79 celności, otrzymałby 2 Glock'i i Berettę 93R.

Nawiasem mówiąc tak rozwiązano otrzymywanie przez najemnika TNT oraz Detonatora gdy jego cecha jest wystarczająca. Zasadniczo nie trzeba dodawać amunicji w tych slotach, każda broń automatycznie otrzymuje 1-3 magazynki, ale jeśli ktoś chce większy zapas, lub amunicję specjalną (HP/AET itp.) to bez problemu może to zrobić. Mam nadzieję że to zrozumiale opisałem i że się komuś przyda

Powrót do spisu treści





17. Items.xml

Przykładowy rekord

    ITEM
uiIndex 1 /uiIndex
szItemName Glock 17 /szItemName
szLongItemName Glock 17 /szLongItemName
szItemDesc Favored by most military officers, this Austrian semi-automatic pistol is considered the defacto standard side-arm worldwide. /szItemDesc
szBRName Glock 17 /szBRName
szBRDesc Even though most of this Austrian pistol's parts are plastic, it will get detected by airport x-ray machines. The simple design of this recoil operated self-loader contains only 32 components, and is a common army issue worldwide. /szBRDesc
usItemClass 2 /usItemClass
ubClassIndex 1 /ubClassIndex
ubCursor 3 /ubCursor
ubGraphicNum 1 /ubGraphicNum
ubWeight 6 /ubWeight>
ubPerPocket 1 /ubPerPocket
ItemSize 1 /ItemSize
usPrice 850 /usPrice
ubCoolness 2 /ubCoolness
bReliability 4 /bReliability
bRepairEase 3 /bRepairEase
Damageable 1 /Damageable
Repairable 1 /Repairable
WaterDamages 1 /WaterDamages
Metal 1 /Metal
Sinks 1 /Sinks
ShowStatus 1 /ShowStatus
BR_NewInventory 5 /BR_NewInventory
BR_UsedInventory 1 /BR_UsedInventory
BR_ROF 36 /BR_ROF
    /ITEM

Opis parametrów

    1. uiIndex /uiIndex Unikalny numer id. Maksymalna ilość 5000 przedmiotów. Nie używaj przedmiotów z numerami #0 i #70. Nowe przedmioty numeruj według kolejności i nie opuszczaj numerów. Nie używaj tego samego numeru dla dwóch różnych przedmiotów.
    2. szItemName /szItemName Krótka nazwa przedmiotu.
    3. szLongItemName /szLongItemName Długa nazwa pokazywana przy opisie przedmiotu.
    4. szItemDesc /szItemDesc Opis przedmiotu.
    5. szBRName Nothing /szBRName Nazwa przedmiotu w sklepie Bobby Ray (zwykle ta sama jak w szLongItemName)
    6. szBRDesc /szBRDesc Opis przedmiotu w sklepie Bobby Ray
    7. usItemClass /usItemClass Typ przedmiotu (pistolet, bomba itp.). Ta wartość nigdy nie powinna być zerem. Jeśli ta wartość będzie zerem to kod gry będzie myślał, że lista przedmiotów się skończyła.
    Wartości jakie można zastosować:
1 - nic
2 - broń
4 - noże
8 - noże do rzucania
16 - granaty, RPG
32 - Queen Tentacles
64 - rzucanie (kamienie)
128 - Punching
256 - rakiety RPG
512 - bomby
1024 - amunicja
2048 - pancerz
4096 - apteczki
8192 - inne narzędzia
32768 - przedmioty nakładane na twarz (maska, gogle itp. )
65536 - klucze
131072 - Load Bearing Equipment
268435456 - Misc.
536870912 – pieniądze
    8. ubClassIndex /ubClassIndex Indeks przedmiotów w innych plikach (bronie, materiały wybuchowe, amunicja itp.). Bronie w weapons.xml muszą mieć ten sam indeks (uiIndex) co w pliku Items.xml. np : Items.xml : 647 i Weapons.xml 647
    9. ubCursor /ubCursor Kursor przedmiotu kiedy jest używany. Podajemy jego numer.
    Lista kursorów:
Invalid - 0
Quest - 1
Punch - 2
Target - 3
Knife – 4
Aid - 5
Toss - 6
Mine - 8
Lockpick - 9
Metal Detector - 10
Crowbar – 11
Surveillance Camera - 12
Camera - 13
Key - 14
Saw - 15
Wirecutter - 16
Remote - 17
Bomb - 18
Repair - 19
Trajectory - 20
Jar - 21
Tin can - 22
Refuel – 23
    10. bSoundType /bSoundType Ten parametr obecnie za nic nie odpowiada ubGraphicType - typ pliku graficznego wykorzystanego przy tym przedmiocie, dla nowych przedmiotów używaj tylko: 0 dla broni i 1 dla innych przedmiotów, inaczej mogą się niepoprawnie wyświetlać w grze.
0 -MDGUNS.sti
1 -P1ITEMS.sti
2 -P2ITEMS.sti.
    11. ubGraphicType /ubGraphicType Typ grafiki wykorzystanej przy przedmiotach. Grafika jest zapisana w plikach sti : MDGUNS.sti, P1ITEMS.sti, P2ITEMS.sti.
    Wartość:
0 -MDGUNS.sti
1 -P1ITEMS.sti
2 -P2ITEMS.sti.
    Dla nowych przedmiotów używaj tylko:
0 – broń
1 – dla innych przedmiotów.
    Inaczej będą nie poprawnie wyświetlać się w grze.
    12. ubGraphicNum /ubGraphicNum Numer graficzny dla przedmiotu jaki został umieszczony w indeksie w pliku sti. Jest on powiązany z parametrem ubGraphicType.
    13. ubWeight /ubWeight Waga przedmiotu np : 77 - 7.7 kg
    14. ubPerPocket /ubPerPocket Oznacza czy przedmiot możesz nosić w dużej i małej kieszeni. Wartość 0 tylko duża kieszeń, 1 duża i mała kieszeń. Jeśli przedmiotem jest broń (typu snajperka, karabin itp.) to zalecana wartość 0.
    15. ItemSize /ItemSize
    16. ItemSizeBonus /ItemSizeBonus
    17. usPrice /usPrice wartość/cena przedmiotu w dolarach.
    18. ubCoolness /ubCoolness (od 0 do 10) definiuje jak długo w grze będziemy widzieć ten przedmiot. Zero oznacza że w ogóle nie jest fajny więc nigdzie go nie kupimy.
    19. bReliability /bReliability Jak szybko przedmiot się psuje. Dodatnie wartości zmniejszają podatność na psucie (np. 2), a ujemne zwiększają (np. -2).
    20. bRepairEase /bRepairEase Jak szybko przedmiot można naprawić. Dodatnie wartości (np. 2) zwiększają szansę szybkiej naprawy, a ujemne zmniejszają (np. -2).
    21. Damageable /Damageable Przedmiot podatny na częste uszkodzenia (1 lub 0)
    22. Repairable /Repairable Przedmiot łatwy do naprawy (1 lub 0)
    23. WaterDamages /WaterDamages Jest przedmiotem uszkodzonym kiedy jest zanurzony w wodzie (1 lub 0)
    24. Metal /Metal Jest przedmiotem metalowym. Używane przy wykrywaczu metali oraz do redukowania uszkodzeń przy przedmiotach (1 lub 0).
    25. Sinks /Sinks czy przedmiot zatonie (zostanie utracony na zawsze) jeśli upuścimy go na wodzie (1 tak, 0 nie)
    26. ShowStatus /ShowStatus czy status przedmiotu jest wyświetlany (1 tak, 0 nie) (nie wiem dokładnie o co chodzi - bronie mają to włączone, a załączniki/dodatki nie).
    27. HiddenAddon /HiddenAddon> przedmiot jest ukrytym załącznikiem/dodatkiem (1 tak, 0 nie)
    28. TwoHanded /TwoHanded Wymaga dwóch wolnych rąk do użyća przedmiotu (np. duża apteczka, karabiny itp.). Wartość 1 - tak ,0 -nie.
    29. NotBuyable /NotBuyable Przedmiot nie na sprzedasz ( nie do kupienia ). Wartość 0 - można kupić, 1 - nie
    30. Attachment /Attachment Czy przedmiot jest załącznikiem (np. granatnik, tłumik, luneta snajperska itp.). Załączniki definiuje się w pliku attachments.xml. Wartości 1 - tak , 0 -nie.
    31. HiddenAttachment /HiddenAttachment
    32. BigGunList /BigGunList parametr już nie jest w użytku w v.1.13
    33. SciFi /SciFi
    34. NotInEditor /NotInEditor parametr już nie jest w użytku w v.1.13
    35. DefaultUndroppable /DefaultUndroppable przedmiot nie będzie upuszczany przez wrogów (opcja "Enemies drop all items" ignoruje te ustawienie) (1 nie będzie, 0 będzie)
    36. Unaerodynamic /Unaerodynamic (0/1) przy ustawieniu na 1 przedmiot będzie można rzucić najdalej na 1-2 kratki.
    37. Electronic /Electronic Jest przedmiotem elektronicznym. Wartości 1 - tak , 0 -nie.
    38. Inseparable /Inseparable czy przedmiot jest permanentnym dodatkiem (nie można go odłączyć od przedmiotu do którego został przyczepiony) (1 tak, 0 nie)
    39. BR_NewInventory /BR_NewInventory (wartość od zera wzwyż) dostępność przedmiotu u Bobby Ray'a. Dokładna ilość będzie definiowana przez opcję gry jaką wybierzemy.
    40. BR_UsedInventory /BR_UsedInventory czy Bobby będzie oferował ten przedmiot również w kategorii używanych.
    41. BR_ROF /BR_ROF Szybkostrzelność broni. Wartość ta jest wyświetlana w sklepie Bobby'ego Ray'a . Wartość ta nie ma wpływu na faktyczną szybkostrzelność broni.
    42. PercentNoiseReduction /PercentNoiseReduction Redukcja hałasu. Parametr używany w tłumikach. Im większa wartość tym większa redukcja hałasu. Wartość podana w procentach (0-100).
    43. HideMuzzleFlash /HideMuzzleFlash Pokaż błysk wystrzału z broni. Wartość : 1 - tak, 0 - nie.
    44. Bipod /Bipod bonus do strzału z pozycji leżącej (1-10) – dwójnóg daje 10.
    45. RangeBonus /RangeBonus bonus do zasięgu broni podany w metrach – 10 oznacza jedną kratkę.
    46. ToHitBonus /ToHitBonus bonus do strzału bezpośredniego (celowniki laserowe), dodaje tą wartość do celności każdego strzału niezależnie od celowania, odległości, czy trybu prowadzenia ognia.
    47. BestLaserRange /BestLaserRange zasięg w jakim laser dodaje bonus (ToHitBonus) powyżej tej odległości przestaje mieć wpływ.
    48. AimBonus /AimBonus bonus do przycelowanego strzału (celownik optyczny/snajperski) dodaje bonus do szansy na trafienie za każdy punkt akcji przycelowania.
    49. MinRangeForAimBonus /MinRangeForAimBonus minimalny zasięg w jakim bonus do celowania może zostać dodany ( w przypadku dodania wielu załączników/dodatków z tą wartością zostanie wybrana ta najniższa)
    50. MagSizeBonus /MagSizeBonus bonus do pojemności magazynka (ubMagSize) broni. Należy zwrócić uwagę czy nowa wartość ma pokrycie w dostępnych magazynkach np.: MP-5N (30 naboi) + C-Mag adapter (bonus 70 naboi) = 100 = 100 nabojowy 9mm C-Mag (wszystko OK). Glock 18 (15 naboi) + C-Mag adapter (70 naboi) = 85 naboi... nie ma takiego magazynka (bardzo niedobrze)
    51. RateOfFireBonus /RateOfFireBonus działanie niepewne - prawdopodobnie zmodyfikuje tylko wartość szybkostrzelności podawanej u Bobby Raya.
    52. BulletSpeedBonus /BulletSpeedBonus bonus do prędkości z jaką kula opuszcza lufę – czystko kosmetyczne, nie wpływa za grywalność.
    53. BurstSizeBonus /BurstSizeBonus bonus do ilości kul wystrzelonych podczas krótkiej serii (burst)
    54. BurstToHitBonus /BurstToHitBonus zwiększa lub zmniejsza wartość ubBurstPenalty broni (karny bonus do celności przy strzale krótką serią)
    55. AutoFireToHitBonus /AutoFireToHitBonus zwiększa lub zmniejsza wartość bAutofireShotsPerFiveAP (ilość kul przy ogniu ciągłym na każde 5 PA)
    56. APBonus /APBonus
    57. PercentBurstFireAPReduction /PercentBurstFireAPReduction jak poniżej ale dla krótkiej serii (burst)
    58. PercentAutofireAPReduction /PercentAutofireAPReduction procentowa redukcja kosztu punktowego strzelania ogniem ciągłym
    59. PercentReadyTimeAPReduction /PercentReadyTimeAPReduction procentowa redukcja punktów akcji wymaganych do przygotowania broni do strzału
    60. PercentReloadTimeAPReduction /PercentReloadTimeAPReduction procentowa redukcja czasu potrzebnego do przeładowania broni
    61. PercentAPReduction /PercentAPReduction procentowa redukcja punktów akcji wymaganych do strzału z broni (modyfikuje ShotsPer4Turns)
    62. PercentStatusDrainReduction /PercentStatusDrainReduction wpływa na szybkość z jaką ekwipunek się zużywa pod wpływem używania (dotyczy zarówno broni jak i np. apteczek
    63. DamageBonus /DamageBonus bonus do obrażeń zadawanych przez broń.
    64. MeleeDamageBonus /MeleeDamageBonus bonus do obrażeń w walce wręcz - dotyczy kastetów i noży.
    65. GrenadeLauncher /GrenadeLauncher czy jest granatnikiem (1 tak, 0 nie) może zostać przydzielone dla broni, wyrzutni oraz załączników/dodatków
    66. Duckbill /Duckbill czy działa jak 'kaczy dziób' (1 tak, 0 nie)
    67. GLGrenade /GLGrenade czy może być wystrzeliwane przez granatnik (1 tak, 0 nie) (jeśli tak to musi być również przypisane w launchables.xml do danego granatnika)
    68. Mine /Mine Jest miną. Wartość 1 - tak, 0 - nie.
    69. Mortar /Mortar Przedmiot jest moździerzem. Wartość 1 - tak, 0 - nie.
    70. RocketLauncher /RocketLauncher jest wyrzutnią rakiet (1 tak, 0 nie) np. LAW lub RPG-7
    71. SingleShotRocketLauncher /SingleShotRocketLauncher jest jednorazową wyrzutnią (1 tak, 0 nie) np. LAW
    72. DiscardedLauncherItem /DiscardedLauncherItem miejsce na uiIndex zużytej wyrzutni- musi być zdefiniowane jeśli opcja powyżej miała parametr '1'.
    73. RocketRifle /RocketRifle czy ta broń wystrzeliwuje mini rakiety (1 tak, 0 nie)
    74. Cannon /Cannon czy przedmiot jest działem czołgowym (1 tak, 0 nie)
    75. DefaultAttachment /DefaultAttachment
    76. BrassKnuckles /BrassKnuckles czy przedmiot służy do zadawania ciosów pięścią (1 tak, 0 nie)
    77. Crowbar /Crowbar czy można wyłamywać tym zamki i używać w walce (1 tak, 0 nie)
    78. BloodiedItem /BloodiedItem numer przedmiotu zakrwawionego - po trafieniu zostanie zamieniony w zakrwawiony. Jeśli wstawimy '0' to przedmiot nigdy nie będzie zakrwawiony.
    79. Rock /Rock Jest kamieniem. Wartość 1 - tak, 0 - nie.
    80. CamoBonus /CamoBonus procentowy bonus do kamuflażu gdy przedmiot jest noszony (lub dołączony do noszonego przedmiotu)
    81. UrbanCamoBonus /UrbanCamoBonus
    82. DesertCamoBonus /DesertCamoBonus
    83. SnowCamoBonus /SnowCamoBonus
    84. StealthBonus /StealthBonus
    85. FlakJacket /FlakJacket Stosuje się przy kamizelkach kuloodpornych. Zmniejsza szkody wyrządzone przez eksplozje. Wartość 1 - tak, 0 - nie.
    86. LeatherJacket /LeatherJacket czy jest skórzaną kurtką (1 tak, 0 nie) (jeśli tak, wrogowie nie będą tego nosić, ale Nailsowi powinno odpowiadać)
    87. Detonator /Detonator czy jest detonatorem dla ładunków wybuchowych (1 tak, 0 nie)
    88. RemoteDetonator /RemoteDetonator czy jest zdalnym detonatorem (1 tak, 0 nie)
    89. RemoteTrigger /RemoteTrigger czy jest zdalnym wyzwalaczem dla bomb (1 tak, 0 nie)
    90. LockBomb /LockBomb czy jest ładunkiem do rozbijania zamków (1 tak, 0 nie)
    91. Flare /Flare czy jest flarą (1 tak, 0 nie)
    92. RobotRemoteControl /RobotRemoteControl kontroler robota (1 tak, 0 nie)
    93. Walkman /Walkman efekt walkmana (zwiększa morale, ale blokuje wszelkie dźwięki) (1 tak, 0 nie)
    94. HearingRangeBonus /HearingRangeBonus bonus do czułości słuchu
    95. VisionRangeBonus /VisionRangeBonus bonus do zasięgu wzroku (zawsze)
    96. NightVisionRangeBonus /NightVisionRangeBonus bonus do zasięgu wzroku w nocy
    97. DayVisionRangeBonus /DayVisionRangeBonus bonus do zasięgu wzroku w dzień
    98. CaveVisionRangeBonus /CaveVisionRangeBonus bonus do zasięgu wzroku pod ziemią
    99. BrightLightVisionRangeBonus /BrightLightVisionRangeBonus bonus do widoczności w bardzo jasnym miejscu (przy większej jasności niż dzienne światło), kumulatywne z DayVisionRangeBonus (noktowizory mają tu duże minusy)
    100. PercentTunnelVision /PercentTunnelVision (0-100%) procentowa utrata kąta widzenia, im większa wartość tym węższe pole widzenia.
    101. ThermalOptics /ThermalOptics termowizja (widzenie przez ściany) (1 tak, 0 nie)
    102. GasMask /GasMask Ochrona przed gazem. Stosowane np. w maskach. Wartość 1 - tak, 0 -nie
    103. Alcohol /Alcohol piwo, wino itp. (1 tak, 0 nie) będzie powodować efekt upojenia alkoholowego po użyciu.
    104. Hardware /Hardware narzędzia itp. - oznaczenie dla sprzedawców
    105. Medical /Medical apteczki itp. - oznaczenie dla sprzedawców
    106. CamouflageKit /CamouflageKit Używane przy przedmiotach typu kamuflaż. Wartość - 1 -tak, 0 - nie.
    107. LocksmithKit /LocksmithKit służy do otwierania zamków (1 tak, 0 nie) np. narzędzia ślusarskie
    108. Toolkit /Toolkit służy do naprawy przedmiotów (1 tak, 0 nie), np. skrzynka na narzędzia
    109. FirstAidKit /FirstAidKit ` Używane przy apteczkach. Oznacza, że przedmiotem możesz leczyć. Wartość - 1 -tak , 0 - nie.
    110. MedicalKit /MedicalKit jak powyżej, ale również można przydzielić posiadaczowi zadanie Lekarz (1 tak, 0 nie)
    111. WireCutters /WireCutters służy do przecinania ogrodzeń (1 tak, 0 nie)
    112. Canteen /Canteen służy do odzyskiwania energii (1 tak, 0 nie)
    113. GasCan /GasCan służy do tankowania pojazdów (1 tak, 0 nie)
    114. Marbles /Marbles przeciwnicy mogą się na tym pośliznąć (1 tak, 0 nie) np. szklane kulki
    115. CanAndString /CanAndString może zostać użyte na drzwiach jako alarm dźwiękowy (1 tak, 0 nie)
    116. Jar /Jar może służyć do przechowywania płynów (1 tak, 0 nie)
    117. XRay /XRay rentgen (1 tak, 0 nie)
    118. Batteries /Batteries baterie (1 tak, 0 nie)
    119. NeedsBatteries /NeedsBatteries wymaga baterii do działania (1 tak, 0 nie)
    120. ContainsLiquid /ContainsLiquid zawiera płyny (dla słoików które zawierają płyny...)
    121. MetalDetector /MetalDetector potrafi wykrywać miny (1 tak, 0 nie)
    122. FingerPrintID /FingerPrintID wymaga identyfikacji odcisków palców do użycia (1 tak, 0 nie)
    123. NewInv /NewInv
    124. AmmoCrate /AmmoCrate

Nazwy i opisy przedmiotów

Nazwy i opisy przedmiotów mogą być przechowywane w oddzielnym pliku dla każdej wersji językowej.

    Polish.Items.xml
    Russian.Items.xml
    German.Items.xml

Przykładowy rekord w takim pliku

    ITEM
uiIndex 1 /uiIndex
szItemName Glock 17 /szItemName
szLongItemName Glock 17 /szLongItemName
szItemDesc Diese österreichische, halbautomatische Pistole wird weltweit von vielen Sicherheitskräften und Offizieren bevorzugt und gilt daher als Standardseitenwaffe. /szItemDesc
szBRName Glock 17 /szBRName
szBRDesc Die Glock 17 ist die weltweit meistbenutzte Behördenpistole. Wegen ihrer unübertroffenen Zuverlässigkeit, hohen Magazinkapazität sowie ihrem geringen Gewicht vertrauen ihr Beamte auf der ganzen Welt im täglichen
Dienst. /szBRDesc
    /ITEM

Powrót do spisu treści





18. Launchables.xml

Przykładowy rekord

    LAUNCHABLE
launchableIndex 140 /launchableIndex
itemIndex 41 /itemIndex
    /LAUNCHABLE

Opis parametrów

    1. launchableIndex /launchableIndex Numer indeks wystrzeliwanego przedmiotu. Numer uiIndex pobieramy z pliku Items.xml
    2. itemIndex /itemIndex Numer indeks przedmiotu, który będzie wystrzeliwał przedmiot podany w launchableIndex. Numer uiIndex pobieramy z pliku Items.xml

Uwagi

Ważne aby wszystkie launchableIndex, które mają taką samą wartość były pogrupowane razem. Jeżeli rozdzielisz jakąś grupę tych samych launchableIndex, to gra będzie brała pod uwagę tylko pierwszą grupę ,a pozostałe będzie ignorować.

Przykład A

Grupa rozdzielona launchableIndex 140 - źle.

    LAUNCHABLE
launchableIndex 140 /launchableIndex
itemIndex 41 /itemIndex
    /LAUNCHABLE

    LAUNCHABLE
launchableIndex 147 /launchableIndex
itemIndex 40 /itemIndex
    /LAUNCHABLE

    LAUNCHABLE
launchableIndex 140 /launchableIndex
itemIndex 901 /itemIndex
    /LAUNCHABLE

Przykład B

Grupa połączona launchableIndex 140 - dobrze.

    LAUNCHABLE
launchableIndex 140 /launchableIndex
itemIndex 41 /itemIndex
    /LAUNCHABLE

    LAUNCHABLE
launchableIndex 140 /launchableIndex
itemIndex 901 /itemIndex
    /LAUNCHABLE

    LAUNCHABLE
launchableIndex 147 /launchableIndex
itemIndex 40 /itemIndex
    /LAUNCHABLE

Powrót do spisu treści





19. LoadBearingEquipment.xml

Przykładowy rekord

    LOADBEARINGEQUIPMENT
lbeIndex 1 /lbeIndex
lbeClass 2 /lbeClass
lbeCombo 0 /lbeCombo
lbeFilledSize 0 /lbeFilledSize
lbePocketIndex1 16 /lbePocketIndex1
lbePocketIndex2 16 /lbePocketIndex2
lbePocketIndex3 0 /lbePocketIndex3
lbePocketIndex4 0 /lbePocketIndex4
lbePocketIndex5 0 /lbePocketIndex5
lbePocketIndex6 0 /lbePocketIndex6
lbePocketIndex7 0 /lbePocketIndex7
lbePocketIndex8 0 /lbePocketIndex8
lbePocketIndex9 0 /lbePocketIndex9
lbePocketIndex10 0 /lbePocketIndex10
lbePocketIndex11 0 /lbePocketIndex11
lbePocketIndex12 0 /lbePocketIndex12
    /LOADBEARINGEQUIPMENT

Opis parametrów

    1. lbeIndex /lbeIndex
    2. lbeClass /lbeClass
    3. lbeCombo /lbeCombo
    4. lbeFilledSize /lbeFilledSize
    5. lbePocketIndex1 /lbePocketIndex1
    6. lbePocketIndex2 /lbePocketIndex2
    7. lbePocketIndex3 /lbePocketIndex3
    8. lbePocketIndex4 /lbePocketIndex4
    9. lbePocketIndex5 /lbePocketIndex5
    10. lbePocketIndex6 /lbePocketIndex6
    11. lbePocketIndex7 /lbePocketIndex7
    12. lbePocketIndex8 /lbePocketIndex8
    13. lbePocketIndex9 /lbePocketIndex9
    14. lbePocketIndex10 /lbePocketIndex10
    15. lbePocketIndex11 /lbePocketIndex11
    16. lbePocketIndex12 /lbePocketIndex12

Powrót do spisu treści





20. MercStartingGear.xml

Przykładowy rekord

    MERCGEAR
mIndex 1 /mIndex
mName Blood /mName
mHelmet 0 /mHelmet
mHelmetStatus 0 /mHelmetStatus
mHelmetDrop>0 mVest 161 /mVest
mVestDrop 0 /mVestDrop
mVestStatus 100 /mVestStatus
mLeg 0 /mLeg
mLegDrop 0 /mLegDrop
mLegStatus 0 /mLegStatus
mWeapon 336 /mWeapon
mWeaponDrop 0 /mWeaponDrop
mWeaponStatus 100 /mWeaponStatus
mBig0 37 /mBig0
mBig0Status 100 /mBig0Status
mBig0Quantity 1 /mBig0Quantity
mBig0Drop 0 /mBig0Drop
mBig1 38 /mBig1
mBig1Status 100 /mBig1Status
mBig1Quantity 1 /mBig1Quantity
mBig1Drop 0 /mBig1Drop
mBig2 71 /mBig2
mBig2Status 100 /mBig2Status
mBig2Quantity 3 /mBig2Quantity
mBig2Drop>0 /mBig2Drop
mBig3>201 /mBig3
mBig3Status 100 /mBig3Status
mBig3Quantity 1 /mBig3Quantity
mBig3Drop 0 /mBig3Drop
mSmall0 0 /mSmall0
mSmall0Status 0 /mSmall0Status
mSmall0Quantity 0 /mSmall0Quantity
mSmall1 0 /mSmall1
mSmall1Status 0 /mSmall1Status
mSmall1Quantity 0 /mSmall1Quantity
mSmall2 0 /mSmall2
mSmall2Status 0 /mSmall2Status
mSmall2Quantity 0 /mSmall2Quantity
mSmall3 0 /mSmall3
mSmall3Status>0 mSmall3Quantity 0 /mSmall3Quantity
mSmall4 0 /mSmall4
mSmall4Status 0 /mSmall4Status
mSmall4Quantity 0 /mSmall4Quantity
mSmall5 0 /mSmall5
mSmall5Status 0 /mSmall5Status
mSmall5Quantity 0 /mSmall5Quantity
mSmall6 0 /mSmall6
mSmall6Status 0 /mSmall6Status
mSmall6Quantity 0 /mSmall6Quantity
mSmall7 0 /mSmall7
mSmall7Status>0 mSmall7Quantity 0 /mSmall7Quantity
lVest 1090 /lVest
lVestStatus 100 /lVestStatus
lLeftThigh 0 /lLeftThigh
lLeftThighStatus 0 /lLeftThighStatus
lRightThigh 1092 /lRightThigh
lRightThighStatus 100 /lRightThighStatus
lCPack 0 /lCPack
lCPackStatus 0 /lCPackStatus
lBPack 0 /lBPack
lBPackStatus 0 /lBPackStatus
    /MERCGEAR

Opis parametrów

    1. mIndex /mIndex W tym miejscu podajemy numer indeks.
    2. mName /mName Imię najemnika
    3. mHelmet /mHelmet Podajemy numer przedmioty w tym przypadku hełm. Numer pochodzi z pliku Items.xml
    4. mHelmetStatus /mHelmetStatus Status zużycia 1-100
    5. mHelmetDrop /mHelmetDrop Czy można upuścić, 0 lub 1.
    6. mVest /mVest Podajemy numer przedmioty w tym przypadku kamizelka. Numer pochodzi z pliku Items.xml
    7. mVestDrop /mVestDrop Czy można upuścić, 0 lub 1.
    8. mVestStatus /mVestStatus Status zużycia 1-100
    9. mLeg /mLeg Podajemy numer przedmioty w tym przypadku spodnie. Numer pochodzi z pliku Items.xml
    10. mLegDrop /mLegDrop Czy można upuścić, 0 lub 1.
    11. mLegStatus /mLegStatus Status zużycia 1-100
    12. mWeapon /mWeapon Podajemy numer przedmioty w tym przypadku broń. Numer pochodzi z pliku Items.xml
    13. mWeaponDrop /mWeaponDrop Czy można upuścić, 0 lub 1.
    14. mWeaponStatus /mWeaponStatus Status zużycia 1-100
    15. mBig0 /mBig0 Podajemy numer przedmioty w dużym slocie. Numer pochodzi z pliku Items.xml
    16. mBig0Status /mBig0Status Status zużycia 1-100
    17. mBig0Quantity /mBig0Quantity
    18. mBig0Drop /mBig0Drop Czy można upuścić, 0 lub 1.
    19. mBig1 /mBig1 Podajemy numer przedmioty w dużym slocie. Numer pochodzi z pliku Items.xml
    20. mBig1Status /mBig1Status Status zużycia 1-100
    21. mBig1Quantity /mBig1Quantity
    22. mBig1Drop /mBig1Drop Czy można upuścić, 0 lub 1.
    23. mBig2 /mBig2 Podajemy numer przedmioty w dużym slocie. Numer pochodzi z pliku Items.xml
    24. mBig2Status /mBig2Status Status zużycia 1-100
    25. mBig2Quantity /mBig2Quantity
    26. mBig2Drop /mBig2Drop Czy można upuścić, 0 lub 1.
    27. mBig3 /mBig3 Podajemy numer przedmioty w dużym slocie. Numer pochodzi z pliku Items.xml
    28. mBig3Status /mBig3Status Status zużycia 1-100
    29. mBig3Quantity /mBig3Quantity
    30. mBig3Drop /mBig3Drop Czy można upuścić, 0 lub 1.
    31. mSmall0 /mSmall0 Podajemy numer przedmioty w małym slocie. Numer pochodzi z pliku Items.xml
    32. mSmall0Status /mSmall0Status Status zużycia 1-100
    33. mSmall0Quantity /mSmall0Quantity
    34. mSmall1 /mSmall1 Podajemy numer przedmioty w małym slocie. Numer pochodzi z pliku Items.xml
    35. mSmall1Status /mSmall1Status Status zużycia 1-100
    36. mSmall1Quantity /mSmall1Quantity
    37. mSmall2 /mSmall2 Podajemy numer przedmioty w małym slocie. Numer pochodzi z pliku Items.xml
    38. mSmall2Status /mSmall2Status Status zużycia 1-100
    39. mSmall2Quantity /mSmall2Quantity
    40. mSmall3 /mSmall3 Podajemy numer przedmioty w małym slocie. Numer pochodzi z pliku Items.xml
    41. mSmall3Status /mSmall3Status Status zużycia 1-100
    42. mSmall3Quantity /mSmall3Quantity
    43. mSmall4 /mSmall4 Podajemy numer przedmioty w małym slocie. Numer pochodzi z pliku Items.xml
    44. mSmall4Status /mSmall4Status Status zużycia 1-100
    45. mSmall4Quantity /mSmall4Quantity
    46. mSmall5 /mSmall5 Podajemy numer przedmioty w małym slocie. Numer pochodzi z pliku Items.xml
    47. mSmall5Status /mSmall5Status Status zużycia 1-100
    48. mSmall5Quantity /mSmall5Quantity
    49. mSmall6 /mSmall6 Podajemy numer przedmioty w małym slocie. Numer pochodzi z pliku Items.xml
    50. mSmall6Status /mSmall6Status Status zużycia 1-100
    51. mSmall6Quantity /mSmall6Quantity
    52. mSmall7 w małym slocie. Numer pochodzi z pliku Items.xml
    53. mSmall7Status /mSmall7Status Status zużycia 1-100
    54. mSmall7Quantity /mSmall7Quantity
    55. lVest /lVest
    56. lVestStatus /lVestStatus
    57. lLeftThigh /lLeftThigh
    58. lLeftThighStatus /lLeftThighStatus
    59. lRightThigh /lRightThigh
    60. lRightThighStatus /lRightThighStatus
    61. lCPack /lCPack
    62. lCPackStatus /lCPackStatus
    63. lBPack /lBPack
    64. lBPackStatus /lBPackStatus

Powrót do spisu treści





21. Merges.xml

    1. FirstItemIndex- indeks oryginalnego przedmiotu
    2. SecondItemIndex - indeks przedmiotu do scalenia
    3. FirstResultingItemIndex - indeks powstałego przedmiotu
    4. SecondResultingItemIndex - indeks drugiego powstałego przedmiotu (działa tylko przy standardowych łączeniach)
    5. MergeType - typ scalania (patrz poniżej)
    6. APCost - liczba punktów akcji wymaganych do wykonania scalenia.


Typy łączenia:

    0 = DESTRUCTION (zniszczenie - tutaj ResultingItemIndex będzie wynosił zero - stosowane np. przy pokrywaniu C-18 pancerzy już pokrytych galaretką)
    1 = COMBINE_POINTS (łączenie wartości - np. uzupełnianie jednej apteczki drugą)
    2 = TREAT_ARMOUR (wzmacnianie pancerzy - np. C-18 użyte na Spectra Vest, daje Treated Spectra Vest)
    3 = EXPLOSIVE (ładunki wybuchowe - np. łączenie kryształów RDX z TNT daje HMX)
    4 = EASY_MERGE (łatwe scalanie - np. doczepienie sznurka do puszki)
    5 = ELECTRONIC_MERGE (scalanie elektroniki - wyświetlacz plus rentgen)
    6 = USE_ITEM (użycie - obecnie nie ma przedmiotów stosujących to scalanie; ignoruje parametr secondResultingItemIndex, odpowiada za użycie jednego przedmiotu na drugim, np. noża na koszulce by ją przeciąć - zachowuje niezmieniony oryginalny przedmiot czyli firstItemIndex)
    7 = USE_ITEM_HARD (tak jak powyżej, ale wykonuje test zdolności mechanicznych by sprawdzić czy się udało)
secondResultingItemIndex zamieni firstItemIndex w nowy przedmiot, a więc:
    Oryginalny przedmiot (firstItemIndex) + drugi przedmiot(secondItemIndex) = nowy przedmiot (firstResultingItemIndex) + zmieniony oryginalny przedmiot (secondResultingItemIndex)

Gdy dodajesz nowe łączenia/scalenia, pamiętaj że nie możesz ich ot tak po prostu wrzucić na koniec pliku - muszą być one posortowane w pliku wg uiIndex pierwszego przedmiotu w łączeniu, następnie według uiIndex drugiego przedmiotu.

Warto również pamiętać że umiejscowienie przedmiotu jakofirstItemIndex lub secondItemIndex to spora różnica. Jeżeli scalanie jest standardowe, to warto umieścić dwie wersje - z zamienionymi miejscami indeksami (tak by nie miało znaczenia czy próbujemy sprężynę wcisnąć w pręt, czy pręt w sprężynę). Jednak czasem warto zostawić tylko jedną (np.Compound 18 tylko jako firstItemIndex bo zależy nam by używano go na pancerzu, a nie pancerzy na nim).

Powrót do spisu treści





22. MovementCosts.xml

Przykładowy rekord

    Sector y="A" x="1"
TravelRating 0 /TravelRating
North EDGEOFWORLD /North
East EDGEOFWORLD /East
South EDGEOFWORLD /South
West EDGEOFWORLD /West
Here EDGEOFWORLD /Here
    /Sector

Opis parametrów

    1. Sector y ="YYY" x ="XXX"
YYY - podajemy litery od A do P.
XXX - podajemy liczbę z przedziału od 1 do 16.
    2. TravelRating /TravelRating Podróż jest określona przez wzór:
TravelTime = BaseTravelTime * 100 / Rating,
    Gdzie BaseTravelTime:
89 min - najemnicy podróżują pieszo,
30 min - najemnicy podróżują samochodem
10 min - najemnicy podróżują helikopterem
    3. North /North Parametr określa jak najemnicy będą podróżować na północ z sektora w którym aktualnie się znajdują
    4. South /South Parametr określa jak najemnicy będą podróżować napołudnie z sektora w którym aktualnie się znajdują
    5. East /East Parametr określa jak najemnicy będą podróżować nawschód z sektora w którym aktualnie się znajdują
    6. West /West Parametr określa jak najemnicy będą podróżować nazachód z sektora w którym aktualnie się znajdują
    Dozwolone wartości dla North, South, East i West:
TOWN - podróż trwa chwilę (5 min)
ROAD - zwiększa prędkość o 100%
PLAINS - prędkość 90%
SAND - prędkość 70%
SPARSE - prędkość 70%
DENSE - prędkość 50%
SWAMP - prędkość 20%
WATER - prędkość 15%
HILLS - prędkość 50%
GROUNDBARRIER - podróż tylko lotnicza
NS_RIVER - rzeka od północ na południe 25%
EW_RIVER - rzeka od wschodu do zachodu 25%
EDGEOFWORLD - nie można podróżować
    7. Here /Here Określa aktualny sektor w którym znajdują się najemnicy.
    Dozwolone wartości dla Here:
8. TOWN
9. ROAD
10. PLAINS
11. SAND
12. SPARSE
13. DENSE
14. SWAMP
15. WATER
16. HILLS
17. GROUNDBARRIER
18. NS_RIVER
19. EW_RIVER
20. EDGEOFWORLD
21. TROPICS
22. FARMLAND
23. PLAINS_ROAD
24. SPARSE_ROAD
25. FARMLAND_ROAD
26. TROPICS_ROAD
27. DENSE_ROAD
28. COASTAL
29. HILLS_ROAD
30. COASTAL_ROAD
31. SAND_ROAD
32. SWAMP_ROAD

Są to grafiki wyświetlane podczas wczytywania mapy.

Powrót do spisu treści





23. PatrolGroups.xml

Przykładowy rekord

    PATROL
Size 8 /Size
Priority 40 /Priority
Waypoints
Sector1 B1 /Sector1
Sector2 C1 /Sector2
Sector3 C3 /Sector3
Sector4 A3 /Sector4
/Waypoints
    /PATROL

Opis parametrów

    1. Size /Size Ilość żołnierzy którzy wchodzą w skład patrolu (faktyczny stan).
    2. Priority /Priority Jak bardzo ważna jest ta grupa żołnierzy dla Królowej i czy mogą dostać wsparcie (zakres 0-100).
    3. Waypoints /Waypoints Ten parametr definiuje trasę patrolowania. Maksymalna ilość punktów patrolowania to 4 (minimum 2). Dozwolone ruchy są tylko poziomie i pionowe (po przekątnej zabronione).
    4. SectorX /SectorX W te miejsca wpisujemy nazwy sektorów, po których poruszał się będzie patrol. Jeśli nie chcemy wykorzystać wszystkich pól to możemy wpisać 0;

Uwagi

    1. W grze można użyć maksymalnie 50 patroli.
    2. Zmiany w tym pliku wymagają rozpoczęcie gry od nowa.

Powrót do spisu treści





24. PeterInventory.xml

    Barmani nie są zbyt przydatni więc edytowałem ich zasób towarów. Każdy braciszek ma oddzielny plik xml (PeterInventory.xml, AlbertoInventory.xml etc.), ale w każdym pliku jest to samo:

Kod:

    INVENTORYLIST

INVENTORY
uiIndex 0 /uiIndex
sItemIndex 256 /sItemIndex
ubOptimalNumber 12 /ubOptimalNumber
/INVENTORY


INVENTORY
uiIndex 1 sItemIndex 255 ubOptimalNumber 6
/INVENTORY


INVENTORY
uiIndex 2 sItemIndex 245 ubOptimalNumber 9
/INVENTORY

    /INVENTORYLIST
    (kolejno piwo, wino, alkohol)

Dodałem kawałek Kodu:

    INVENTORY
uiIndex 3 /uiIndex
sItemIndex 1022 /sItemIndex
ubOptimalNumber 3 /ubOptimalNumber
    /INVENTORY

Teraz sprzedają również w ograniczonej ilości szmaty (1022 odpowiada za 'Rag'zaś ubOptimalNumber to przeciętna ilość danego towaru u sprzedawcy – w praktyce oznacza to że barman będzie miał około trzech... czasem więcej, a czasem wcale. Jeżeli ustawimy na zero to nie będzie sprzedawał, a tylko kupował dany towar).

Teraz można bez większego problemu zaopatrywać się w mołotowy - bodaj najtańszy granat w grze. Co prawda nie jest to bardzo realistyczne, ale co kto lubi ... zresztą co jak co, ale jakieś szmaty w barze powinny być.

Wypadało by jeszcze w Items.xml podnieść cenę alkoholu z 30 do ~45 bo Mołotow ma wartość 50.

Można w ten sposób dodać do asortymentu również broń, amunicję, cygara i co tam sobie chcecie (zdaje się że ktoś na BPF proponował 'od czasu do czasu obrzyna spod lady'.

Na tej samej zasadzie można edytować zasób Jake'a, Tonego itp.

BobbyRay'a nie edytuje się w ten sposób – on bierze wszystko z pliku Items.xml, za wyjątkiem rzeczy które mają tam zaznaczone że nie da się kupić.

Powrót do spisu treści





25. Pockets.xml

Przykładowy rekord

    POCKET
pIndex 1 /pIndex
pName Gun Sling /pName
pSilhouette 5 /pSilhouette
pType 0 /pType
pRestriction 0 /pRestriction
ItemCapacityPerSize0 0 /ItemCapacityPerSize0
ItemCapacityPerSize1 0 /ItemCapacityPerSize1
ItemCapacityPerSize2 0 /ItemCapacityPerSize2
ItemCapacityPerSize3 0 /ItemCapacityPerSize3
ItemCapacityPerSize4 1 /ItemCapacityPerSize4
ItemCapacityPerSize5 1 /ItemCapacityPerSize5
ItemCapacityPerSize6 1 /ItemCapacityPerSize6
ItemCapacityPerSize7 1 /ItemCapacityPerSize7
ItemCapacityPerSize8 1 /ItemCapacityPerSize8
ItemCapacityPerSize9 1 /ItemCapacityPerSize9
ItemCapacityPerSize10 0 /ItemCapacityPerSize10
ItemCapacityPerSize11 0 /ItemCapacityPerSize11
ItemCapacityPerSize12 0 /ItemCapacityPerSize12
ItemCapacityPerSize13 0 /ItemCapacityPerSize13
ItemCapacityPerSize14 0 /ItemCapacityPerSize14
ItemCapacityPerSize15 0 /ItemCapacityPerSize15
ItemCapacityPerSize16 0 /ItemCapacityPerSize16
ItemCapacityPerSize17 0 /ItemCapacityPerSize17
ItemCapacityPerSize18 0 /ItemCapacityPerSize18
ItemCapacityPerSize19 0 /ItemCapacityPerSize19
ItemCapacityPerSize20 0 /ItemCapacityPerSize20
ItemCapacityPerSize21 0 /ItemCapacityPerSize21
ItemCapacityPerSize22 0 /ItemCapacityPerSize22
ItemCapacityPerSize23 0 /ItemCapacityPerSize23
ItemCapacityPerSize24 0 /ItemCapacityPerSize24
ItemCapacityPerSize25 0 /ItemCapacityPerSize25
ItemCapacityPerSize26 0 /ItemCapacityPerSize26
ItemCapacityPerSize27 0 /ItemCapacityPerSize27
ItemCapacityPerSize28 0 /ItemCapacityPerSize28
ItemCapacityPerSize29 0 /ItemCapacityPerSize29
ItemCapacityPerSize30 0 /ItemCapacityPerSize30
ItemCapacityPerSize31 0 /ItemCapacityPerSize31
ItemCapacityPerSize32 0 /ItemCapacityPerSize32
ItemCapacityPerSize33 0 /ItemCapacityPerSize33
ItemCapacityPerSize34 0 /ItemCapacityPerSize34
    /POCKET

Opis parametrów

    1. pIndex /pIndex
    2. pName /pName
    3. pSilhouette /pSilhouette
    4. pType /pType
    5. pRestriction /pRestriction
    6. ItemCapacityPerSize0 /ItemCapacityPerSize0
    7. ItemCapacityPerSize1 /ItemCapacityPerSize1
    8. ItemCapacityPerSize2 /ItemCapacityPerSize2
    9. ItemCapacityPerSize3 /ItemCapacityPerSize3
    10. ItemCapacityPerSize4 /ItemCapacityPerSize4
    11. ItemCapacityPerSize5 /ItemCapacityPerSize5
    12. ItemCapacityPerSize6 /ItemCapacityPerSize6
    13. ItemCapacityPerSize7 /ItemCapacityPerSize7
    14. ItemCapacityPerSize8 /ItemCapacityPerSize8
    15. ItemCapacityPerSize9 /ItemCapacityPerSize9
    16. ItemCapacityPerSize10 /ItemCapacityPerSize10
    17. ItemCapacityPerSize11 /ItemCapacityPerSize11
    18. ItemCapacityPerSize12 /ItemCapacityPerSize12
    19. ItemCapacityPerSize13 /ItemCapacityPerSize13
    20. ItemCapacityPerSize14 /ItemCapacityPerSize14
    21. ItemCapacityPerSize15 /ItemCapacityPerSize15
    22. ItemCapacityPerSize16 /ItemCapacityPerSize16
    23. ItemCapacityPerSize17 /ItemCapacityPerSize17
    24. ItemCapacityPerSize18 /ItemCapacityPerSize18
    25. ItemCapacityPerSize19 /ItemCapacityPerSize19
    26. ItemCapacityPerSize20 /ItemCapacityPerSize20
    27. ItemCapacityPerSize21 /ItemCapacityPerSize21
    28. ItemCapacityPerSize22 /ItemCapacityPerSize22
    29. ItemCapacityPerSize23 /ItemCapacityPerSize23
    30. ItemCapacityPerSize24 /ItemCapacityPerSize24
    31. ItemCapacityPerSize25 /ItemCapacityPerSize25
    32. ItemCapacityPerSize26 /ItemCapacityPerSize26
    33. ItemCapacityPerSize27 /ItemCapacityPerSize27
    34. ItemCapacityPerSize28 /ItemCapacityPerSize28
    35. ItemCapacityPerSize29 /ItemCapacityPerSize29
    36. ItemCapacityPerSize30 /ItemCapacityPerSize30
    37. ItemCapacityPerSize31 /ItemCapacityPerSize31
    38. ItemCapacityPerSize32 /ItemCapacityPerSize32
    39. ItemCapacityPerSize33 /ItemCapacityPerSize33
    40. ItemCapacityPerSize34 /ItemCapacityPerSize34
    Każda wersja językowa może posiadać własny plik .
German.Pockets.xml
Russian.Pockets.xml
Polish.Pockets.xml

Powrót do spisu treści





26. SamSites.xml

Przykładowy rekord

    SAM
samIndex 1 /samIndex
samSector>
x 2 /x
y 4 /y
/samSector
samHidden 1 /samHidden>
samOrientation 4 /samOrientation
samGridNoA 10196 /samGridNoA
samGridNoB 10195 /samGridNoB
    /SAM

Opis parametrów

    1. samIndex /samIndex Unikalny numer wyrzutni.
    2. samSector /samSector Współrzędne sektora w którym znajduje się wyrzutnia rakiet.
    3. samHidden /samHidden Parametr definiuje czy wyrzutnia rakiet jest widoczna na mapie i gracz wie gdzie ona się znajduje lub czy jest ukryta i pojawi się dopiero jeśli zostanie odkryta przez gracza. Możliwe wartości : 0 - miejsce jest znane na mapie i jest pokazane na niej, 1 - wyrzutnia jest ukryta na mapie.
    4. samOrientation /samOrientation 3 lub 4 (dokładnie nie wiadomo czy jest do czegoś potrzebna ta wartość)
    5. samGridNoA /samGridNoA Podajemy numer siatki. Numer pobieramy z edytora (tam gdzie znajduje się kursor myszki).
    6. samGridNoA /samGridNoB Podajemy numer siatki. Numer pobieramy z edytora (tam gdzie znajduje się kursor myszki).
    Na rysunku zaznaczono gdzie znajduje się grido samGridNoA i samGridNoB

Terminal jest potrzebny do kontroli wyrzutni. Po zniszczeniu terminala wyrzutnie są bez użyteczne, ale elitarne jednostki wroga mogą naprawić terminal jeśli przejmą sektor. Terminal zajmuje dwa pola i można go umieścić w dwóch kierunkach.

W sekcji SAM_CONTROLLED_SECTORS wpisujemy numery wyrzutni. To oznacza, która wyrzutnia ma kontrolę nad sektorem. Kiedy wstawimy 0 będzie oznaczało, że żadna wyrzutnia nie posiada kontroli nad danym sektorem.

    SAM_CONTROLLED_SECTORS
MAP_ROW row="00" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 /MAP_ROW
MAP_ROW row="01" 0 1 1 1 1 1 1 1 1 0 0 2 2 2 2 2 2 0 /MAP_ROW
MAP_ROW row="02" 0 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 0 /MAP_ROW
MAP_ROW row="03" 0 1 1 1 1 1 1 1 3 2 2 2 2 2 2 2 2 0 /MAP_ROW
MAP_ROW row="04" 0 1 1 1 1 1 1 1 3 3 2 2 2 2 2 2 2 0 /MAP_ROW
MAP_ROW row="05" 0 1 1 1 1 1 1 3 3 3 3 2 2 2 2 2 2 0 /MAP_ROW
MAP_ROW row="06" 0 1 1 1 1 1 3 3 3 3 3 3 2 2 2 2 2 0 /MAP_ROW
MAP_ROW row="07" 0 1 1 1 1 3 3 3 3 3 3 3 3 2 2 2 2 0 /MAP_ROW
MAP_ROW row="08" 0 1 1 1 3 3 3 3 3 3 3 3 3 3 2 2 2 0 /MAP_ROW
MAP_ROW row="09" 0 1 1 3 3 3 3 3 3 3 3 3 3 3 2 2 2 0 /MAP_ROW
MAP_ROW row="10" 0 1 4 4 4 3 3 3 3 3 3 3 3 3 2 2 2 0 /MAP_ROW
MAP_ROW row="11" 0 4 4 4 4 4 3 3 3 3 3 3 3 3 2 2 2 0 /MAP_ROW
MAP_ROW row="12" 0 4 4 4 4 4 4 3 3 3 3 3 3 3 2 2 2 0 /MAP_ROW
MAP_ROW row="13" 0 4 4 4 4 4 4 4 3 3 3 3 3 3 2 2 2 0 /MAP_ROW
MAP_ROW row="14" 0 4 4 4 4 4 4 4 4 4 4 4 4 4 2 2 2 0 /MAP_ROW
MAP_ROW row="15" 0 4 4 4 4 4 4 4 4 4 4 4 4 4 4 2 2 0 /MAP_ROW
MAP_ROW row="16" 0 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 2 0 /MAP_ROW
MAP_ROW row="17" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 /MAP_ROW
    /SAM_CONTROLLED_SECTORS
    Zmiana parametrów samHidden lub samSector wymaga rozpoczęcie gry od nowa.

Powrót do spisu treści





27. SectorLoadscreens.xml

Przykładowy rekord

    SECTOR
uiIndex 1 /uiIndex
szLocation A1 /szLocation
RandomAltSector 0 /RandomAltSector
szImageFormat STI /szImageFormat
szDay LoadscreensLS_DayTropical /szDay
szNight LoadscreensLS_NightTropical /szNight
szDayAlt /szDayAlt
szNightAlt /szNightAlt
    /SECTOR

Opis parametrów

    1. uiIndex /uiIndex Numer indeks loadscreena. Numer zerowy jest loadscreenem początkowym rozpoczynającym grę . Zakres loadscreenów mamy od 0 do 256 .
    2. szLocation /szLocation Zawiera nazwę sektora A1..A2..itd.
    3. RandomAltSector /RandomAltSector Ustaw 1 jeśli chcesz używać alternatywnego loadscreena . Szanse na wylosowanie 50/50.
    4. szImageFormat /szImageFormat Używany format obrazka. Tylko STI.
    5. szDay /szDay Ścieżka do obrazka przedstawiającego dzień.
    6. szNigh /szNigh Ścieżka do obrazka przedstawiającego noc.
    7. szDayAlt /szDayAlt Ścieżka do alternatywnego obrazka przedstawiającego dzień.
    8. szNighAlt /szNighAlt Ścieżka do alternatywnego obrazka przedstawiającego noc.

Powrót do spisu treści





28. Weapons.xml

Przykładowy rekord

    WEAPON
uiIndex 1 /uiIndex
szWeaponName Glock 17 /szWeaponName
ubWeaponClass 1 /ubWeaponClass
ubWeaponType 1 /ubWeaponType
ubCalibre 2 /ubCalibre
ubShotsPer4Turns 18 /ubShotsPer4Turns
ubBulletSpeed 21 /ubBulletSpeed
ubImpact 23 /ubImpact
ubDeadliness 16 /ubDeadliness
ubMagSize 15 /ubMagSize
usRange 110 /usRange
usReloadDelay 200 /usReloadDelay
BurstAniDelay 100 /BurstAniDelay
ubAttackVolume 50 /ubAttackVolume
ubHitVolume 3 /ubHitVolume
sSound 371 /sSound
sBurstSound 1 /sBurstSound
sSilencedBurstSound 62 /sSilencedBurstSound
sReloadSound 100 /sReloadSound
sLocknLoadSound 106 /sLocknLoadSound
SilencedSound 156 /SilencedSound
bBurstAP 5 /bBurstAP
APsToReload 2 /APsToReload
SwapClips 1 /SwapClips
MaxDistForMessyDeath 7 /MaxDistForMessyDeath
ManualReloadSound 476 /ManualReloadSound
    /WEAPON

Opis parametrów

    1. uiIndex Indeks broni (1-5000). Numer ten musi być taki sam jaki został zdefiniowany w items.xml (ubClassIndex).
    2. szWeaponName Nazwa broni maksymalna długość 20 znaków.
    3. ubWeaponClass
    Klasa broni.
0 - NOGUNCLASS
1 - HANDGUNCLASS
2 - SMGCLASS
3 - RIFLECLASS
4 - MGCLASS
5 - SHOTGUNCLASS
6 - KNIFECLASS
7 - MONSTERCLASS (klasa : tygrysy, obcy .itp.)
    4. ubWeaponType
    Typ broni
0 - NOT_GUN
1 - GUN_PISTOL (Pistolet)
2 - GUN_M_PISTOL (pistolet maszynowy)
3 - GUN_SMG
4 - GUN_RIFLE (karabin)
5 - GUN_SN_RIFLE (karabin snajperski)
6 - GUN_AS_RIFLE (karabin szturmowy)
7 - GUN_LMG
8 - GUN_SHOTGUN (strzelba)
    5. ubCalibre Używany kaliber amunicji.
    6. ubReadyTime Punkty akcji potrzebne do gotowości broni by z niej wystrzelić.
    7. ubShotsPer4Turns Szybkostrzelność broni (pojedynczy strzał).
    8. ubShotsPerBurst Ilość pocisków wystrzelonych serią.
    9. ubBurstPenalty
    10. ubBulletSpeed Prędkość pocisku wystrzelonego z broni.
    11. ubDeadliness
    12. bAccuracy Premia do celności z broni.
    13. ubMagSize Ilość pocisków, którymi możesz załadować broń.
    14. usRange Maksymalny zasięg broni.
    15. usReloadDelay Prędkość przeładowania.
    16. ubAttackVolume Głośność broni.
    17. ubHitVolume Głośność uderzenia pocisku.
    18. sSound Dźwięk pojedynczego strzału.
    19. sBurstSound Dźwięk serii.
    20. sReloadSound Dźwięk przeładowywania broni.
    21. sLocknLoadSound Dźwięk przy AutoResolve.
    22. sBurstAP Koszt punktów przy użyciu serii.
    23. bAutofireShotsPerFiveAP Ilość pocisków przy serii na 5 AP.
    24. APsToReload Koszt punktów akcji na przeładowanie broni.
    25. SwapClips Dotyczy wymiany magazynka. 1 - normalna wymiana 0 - wymiana tak jak np. w strzelbach.
    26. MaxDistForMessyDeath Maksymalna odległość na której strzał z broni może wywołać animację uderzenie (upadek, strzał w głowę itp.).
    27. AutoPenalty Koszt punktów karnych dla każdego strzału z broni serią.
    28. NoSemiAuto Broń z trybem automatycznym.
    29. APsToReloadManually Punkty akcji potrzebne to ręcznego przeładowania broni (tylko wtedy kiedy jest większe od 0).
    30. ManualReloadSound Dźwięk dla ręcznego przeładowania broni.

Powrót do spisu treści





29. Klonowanie broni

    W tym przykładzie opisze jak tylko sklonować broń. Tutaj nie będziemy dodawać nowej grafiki. Zrobimy tylko klon broni np. Glock 17.

1. Otwieramy plik items.xml. Szukamy Glocka 17 (jest on na samym początku pliku). Kopiujemy wszystko od Item do /Item:

    ITEM
...
...
...
    /ITEM

2. Przechodzimy na sam koniec pliku i sprawdzamy jaki ostatni przedmiot ma numeruiIndex. Przykładowo ostatni przedmiot ma numer 1028 , więc nasz który dodamy będzie miał 1029.

3. Następnie otwieramy plik weapons.xml i patrzymy jaka ostatnia broń ma numer uiIndex. Przykładowo 918.

4. Teraz dopisujemy na koniec pliku items.xml naszą broń:

5. W miejsce uiIndex wpisujemy 1029 , a w miejsce ubClassIndex wpisujemy 919.

6. Zmieniamy jeszcze nazwę w szItemName, szLongItemName, szBRNamenakolejno np. SGlock 17 , Super Glock 17, SGlock 17.

7. Wszystko zapisujemy jako items.xml

8. Następnie przechodzimy do pliku Weapons.xml.

9. Otwieramy go i szukamy Glocka 17 (jest na samym początku). Kopiujemy wszystko od WEAPON do /WEAPON.

    WEAPON
...
...
...
    /WEAPON

10. Zmieniamy numer na uiIndex wpisując 919 (dlatego że ostatnia broń ma 918) oraz zmieniamy nazwę w szWeaponName na SGlock 17.

11. Dodatkowo w pliku weapons.xml możemy też zmodyfikować parametry naszej broni.

Powrót do spisu treści




Autor: Starchris, 2 komentarze · 16252 czytań
Komentarze (2)
  • Avatar użytkownikaHanzea

    https://jagged-alliance.pl/artykul379/p ... odlowy/#35

    "{ STRATEGIC_MORALE_EVENT, +5}, // MORALE_SEX,
    };

    Opisy co i jak
    MORALE...
    ....
    MORALE_SEX - morale po stosunku"

    To w JA2 są możliwe "stosunki"? Niby jak do nich doprowadzić? Przydałyby się między Buzz a Lynxem.

  • Avatar użytkownikaStarchris

    We wczesnych angielskich wersjach JA2 nie było cenzury i jeśli najemnikiem wszedłeś do pokoju w burdelu Madam Layly w San Monie, gdzie była jedna z prostytutek, to nagle cały ekran robił się czarny, pojawiała się duża żółta emotikonka uśmiechu i odgrywany był krótki dźwięk stosunku seksualnego. No i wiadomo, po czymś takim, morale takiej postaci szło od razu do góry.

    W aktualnych najnowszych wersjach ocenzurowano to i wchodząc do takiego pokoju nic się nie dzieje. Możesz popróbować ze starymi plikami EXE w zakładce Patche i Dema / Jagged Alliance 2 w dziale Download.




Nick: