Kompilowanie kodu źródłowego
wraz z przykładami jego edycji
Artykuł z serii Jak stworzyć modyfikację?
Artykuł z serii Jak stworzyć modyfikację?
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
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
- IV. Kompilacja kodu źródłowego do JA2 Unfinished Business
- V. Kompilacja kodu źródłowego do JA2 wersja 1.13 (v. 2085)
- 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
Przykłady edycji kodu źródłowego ze strony Legion Zone
- 1. Pozycje startowe
2. Dodawanie grup – Część pierwsza
3. Dodawanie grup – Część druga
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
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
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
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
- 2. Jagged Alliance 2 Unfinished Business
- 3. Jagged Alliance 2 wersja 1.13 (v. 2085)
- 3. Jagged Alliance 2 wersja 1.13 (v. 4452)
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:
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):
Jeśli wszystko do tej pory wykonaliśmy poprawnie to plik ten powinien być w następującej lokalizacji.
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:
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.)
Natomiast w podzakładce „Show directories for:” w opcji „Library files” powinniśmy mieć jedną nową ścieżkę (folder) czyli:
- 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:
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:
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):
Jeśli wszystko do tej pory wykonaliśmy poprawnie to plik ten powinien być w następującej lokalizacji.
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
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:
Powinien on się znajdować w katalogu
- 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
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:
#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
wpisać:
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:
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
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 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:
UNDERGROUND_SECTORINFO *curr;
SECTORINFO *pSector = NULL;
//* BASEMENT LEVEL 1 *
//********************
curr = NewUndergroundNode( 10, 1, 1 );
curr = NewUndergroundNode( 16, 15, 1 );
curr = NewUndergroundNode( 2, 2, 1 );
curr = NewUndergroundNode( 4, 4, 1 );
curr = NewUndergroundNode( 5, 4, 1 );
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 ));
curr = NewUndergroundNode( 4, 11, 1 );
curr->ubNumTroops = (UINT8)(6 + gGameOptions.ubDifficultyLevel*2 + Random( 3 ));
curr->ubNumElites = (UINT8)(4 + gGameOptions.ubDifficultyLevel + Random( 2 ));
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;
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;
//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;
//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;
//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;
//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->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_SPACE 37
- Linia 591 i 599
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:
{ 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:
// 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:
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:
{
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:
{ 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.
{ 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:
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:
gsSelSectorX = 9, gsSelSectorY = 1;
1. Zmieniamy na:
gsSelSectorX = gGameExternalOptions.SektorX, gsSelSectorY = gGameExternalOptions.SektorY;
B.) Campaign Init.cpp
2. Szukane:
2. Zmieniamy na:
C.) Game Init.cpp
3. Szukane:
3. Zmieniamy na:
D.) Map Screen Interface Map.cpp
4. Szukane:
UINT16 sSelMapY = 1;
4. Zmieniamy na:
UINT16 sSelMapY = gGameExternalOptions.SektorY3;
E.) Map Screen Interface.cpp
5. Szukane:
{
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:
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 ( ( gsMercArriveSectorX < 1 ) || ( gsMercArriveSectorY < 1 ) ||
( gsMercArriveSectorX > 16 ) || ( gsMercArriveSectorY > 16 ) )
{
gsMercArriveSectorX = 9;
gsMercArriveSectorY = 1;
}
6. Zmieniamy na:
if ( ( gsMercArriveSectorX < 1 ) || ( gsMercArriveSectorY < 1 ) ||
( gsMercArriveSectorX > 16 ) || ( gsMercArriveSectorY > 16 ) )
{
gsMercArriveSectorX = gGameExternalOptions.SektorX1;
gsMercArriveSectorY = gGameExternalOptions.SektorY1;
}
7. Szukane:
// 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:
// 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:
HandleDisplayOfItemPopUpForSector( 9, 1, 0 );
8. Zmieniamy na:
HandleDisplayOfItemPopUpForSector( gGameExternalOptions.SektorX1, gGameExternalOptions.SektorY1, 0 );
9. Szukane:
SetUpHelicopterForPlayer( 9,1 );
9. Zmieniamy na:
SetUpHelicopterForPlayer( gGameExternalOptions.SektorX1, gGameExternalOptions.SektorY1 );
G.) Strategic AI.cpp
10. Szukane:
{
//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:
{
//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:
{ //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:
!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:
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:
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:
gsMercArriveSectorX = 9;
gsMercArriveSectorY = 1;
13. Zmieniamy na:
gsMercArriveSectorX = gGameExternalOptions.SektorX;
gsMercArriveSectorY = gGameExternalOptions.SektorY;
14. Szukane:
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:
{
// Try another location and walk into map
pSoldier->sInsertionGridNo = 4379;
}
else
{
pSoldier->ubStrategicInsertionCode = INSERTION_CODE_NORTH;
pSoldier->sInsertionGridNo = gMapInformation.sNorthGridNo;
}
15. Szukane:
gsMercArriveSectorX = 9;
gsMercArriveSectorY = 1;
15. Zmieniamy na:
gsMercArriveSectorX = gGameExternalOptions.SektorX;
gsMercArriveSectorY = gGameExternalOptions.SektorY;
I.) Merc Entering.cpp
16. Szukane:
{
// 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:
{
// 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:
17. Zmieniamy na:
gGameExternalOptions.SektorY, 0 );
J.) Merc Hiring.cpp
18. Szukane:
INT16 gsMercArriveSectorY = 1;
18. Zmieniamy na:
INT16 gsMercArriveSectorY = gGameExternalOptions.SektorY;
19. Szukane:
{ //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:
{ //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:
20. Zmieniamy na:
gGameExternalOptions.SektorX && pSoldier->sSectorY == gGameExternalOptions.SektorY ) .............
K.) gamescreen.cpp
21. Szukane:
AirRaidDef.sSectorY = 1;
21. Zmieniamy na:
AirRaidDef.sSectorY = gGameExternalOptions.SektorY6;
Dodano do plików
L.) GameSettings.cpp
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.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);
M.) GameSettings.h
INT16 SektorX1;
INT8 SektorX2;
INT16 SektorX3;
INT16 SektorX4;
INT16 SektorX5;
INT16 SektorX6;
INT16 SektorY1;
INT8 SektorY2;
INT16 SektorY3;
INT16 SektorY4;
INT16 SektorY5;
INT16 SektorY6;
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.
{
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:
{
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 :
{
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:
{
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:
- Jeśli mamy już znalezioną funkcje to szukamy w takiego wpisu:
{
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 :
{
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:
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 tekstC.) Dodanie grupy, która zaatakuje nas tylko
w wyznaczonej godzinie
{
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_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:
{
//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:
{
// 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:
{
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:.
{
.
.
.
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:
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:
//-------------------
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:
//-------------------
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
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.
NAZWA_NPC - podajemy numer postaci npc lub jej nazwę
- Dozwolone wartości :
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
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
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).
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).
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.
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
{
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 :
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):
Funkcja odpowiada za przeczytane maile:
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:
Pobierze rekordy zaczynając od 225 do 228.
- ubSender - podajemy tu wartość
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:
Laptop/ email.h
C.) Plik email.h
- Szukamy kodu:
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ę.
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:
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ę.
{
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_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_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
Funkcja przenosi wybraną postać z aktualnego sektora do sektora ustawionego w tej funkcji.
- ubNpcId (wielkość liter jest ważna):
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
C.) Rekrutacja postaci
- ubCharNum (wielkość liter jest ważna):
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
- ubCharNum (wielkość liter jest ważna):
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ę
- ubCharNum (wielkość liter jest ważna):
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
- ubTriggerNPC (wielkość liter jest ważna):
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
- Ustawia fakt na True (prawda)
- usFact - wszystkie fakty jakie możemy zastosować są zapisane w pliku Strategic Quest.h
- Ustawia fakt na False (fałsz)
- usFact - wszystkie fakty jakie możemy zastosować są zapisane w pliku Strategic Quest.h
- 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)
- 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):
{
....
}
- Aby dodać podziemny sektor musimy dopisać taki kod:
- gdzie:
ubSectorX - 1-16
ubSectorZ - 1-3
B.) Przykład dodania podziemia A1
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).
ubNumElites - ilość elitarnych żołnierzy
ubNumCreatures - ilość kreatur (obcy)
- Przykłady
curr->ubNumTroops = 6;
curr->ubNumElites = 6;
curr->ubNumCreatures = 6;
Można też ustawić jak podróżować między sektorami dodając kod:
- Przykłady
curr->ubAdjacentSectors |= SOUTH_ADJACENT_SECTOR;
curr->ubAdjacentSectors |= SOUTH_ADJACENT_SECTOR;
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 )
{
..
}
Aby zablokować sektor musimy wstawić taki kod:
- gdzie:
Y - 1-16
- Przykłady
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:
{
..
}
- Aby dodać dzikie koty stosujemy wpis:
SECTOR - wartości SEC_Axx do SEC_Pxx,
ilość - podajemy ilość tygrysów
- Przykład
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:
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:
Aktualnie na zapisanie gry mamy 10 slotów i 1 na szybki zapis.
- Żeby zwiększyć np. do 15 musimy wpisać wartość 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:
{
gpTempSoldier = pSoldier;
gsTempGridno = sGridNo;
....
....
}
A.) Detonacja pierwsza
- Użycie detonatora na planszy przez naszą postać.
{
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:
B.) Detonacja druga
- Użycie detonatora na planszy przez postać tylko wybranym pomieszczeniu.
{
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:
- 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 ( 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:
- (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
{
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
{
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
{
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
- /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
- /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
- /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
- 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
- /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
Powrót do spisu treści
6. Cities.xml
Plik służy do ustawiania miast.
Przykładowy rekord
- CITY
- /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.
Przykładowy rekord w takim pliku
- CITY
- /CITY
Powrót do spisu treści
7. CompatibleFaceItems.xml
Przykładowy rekord
- COMPATIBLEFACEITEM
- /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
- COMPATIBLEFACEITEM
- /COMPATIBLEFACEITEM
Taki wpis daje nam możliwość używania w pierwszym slocie Extended Ear, a w drugim NVG I.
Przykład B
- COMPATIBLEFACEITEM
- /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
- /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:
Powrót do spisu treści
9. EnemyArmourDrops.xml
Przykładowy rekord
- DROPITEM
- /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:
- 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
- /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)
- 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
- /DROPITEM
Opis parametrów
- 1.
- 2.
- 3.
- 4.
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
- /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.
- 3.
- 4.
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
- /EXPDATA
Opis parametrów
- 1. TransKeyFrame /TransKeyFrame
- 2. DamageKeyFrame /DamageKeyFrame
- 3. ExplosionSoundID /ExplosionSoundID
- 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
Powrót do spisu treści
14. Explosives.xml
Przykładowy rekord
- EXPLOSIVE
- /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
- 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
- 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
- /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
- 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
- /IMPITEMCHOICES
Oznacza to kolejno:
- ID/numer sekcji - tutaj '0' czyli ekwipunek domyślny
- 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:
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:
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:
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:
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
- /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ć:
- 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:
- 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.
- 11. ubGraphicType /ubGraphicType
Typ grafiki wykorzystanej przy przedmiotach. Grafika jest zapisana w plikach sti : MDGUNS.sti, P1ITEMS.sti, P2ITEMS.sti.
- Wartość:
- Dla nowych przedmiotów używaj tylko:
- 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
- /ITEM
Powrót do spisu treści
18. Launchables.xml
Przykładowy rekord
- LAUNCHABLE
- /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
- /LAUNCHABLE
- LAUNCHABLE
- /LAUNCHABLE
- LAUNCHABLE
- /LAUNCHABLE
Przykład B
Grupa połączona launchableIndex 140 - dobrze.
- LAUNCHABLE
- /LAUNCHABLE
- LAUNCHABLE
- /LAUNCHABLE
- LAUNCHABLE
- /LAUNCHABLE
Powrót do spisu treści
19. LoadBearingEquipment.xml
Przykładowy rekord
- LOADBEARINGEQUIPMENT
- /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
- /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)
- 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"
- /Sector
Opis parametrów
- 1. Sector y ="YYY" x ="XXX"
- 2. TravelRating /TravelRating
Podróż jest określona przez wzór:
- Gdzie BaseTravelTime:
- 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:
- 7. Here /Here
Określa aktualny sektor w którym znajdują się najemnicy.
- Dozwolone wartości dla Here:
Są to grafiki wyświetlane podczas wczytywania mapy.
Powrót do spisu treści
23. PatrolGroups.xml
Przykładowy rekord
- PATROL
- /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
- /INVENTORYLIST
- (kolejno piwo, wino, alkohol)
Dodałem kawałek Kodu:
- INVENTORY
- /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
- /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 .
Powrót do spisu treści
26. SamSites.xml
Przykładowy rekord
- SAM
- /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
- /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
- /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
- /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.
- 4. ubWeaponType
- Typ broni
- 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.