Każdy kto kiedykolwiek zajmował się dodawaniem nowego soundtracku do tej gry wie jaka jest to katorga. Dzięki inspiracji skryptami z Czasu Zapłaty opracowałem sposób na dodanie soundtracku bez większego kombinowania. System opatentowany jest na bibliotece BASS oraz Ikarusie / AST ("Union"). Tutorial będzie podzielony na wiele części. Kolejne będą ukazywać się z czasem. Pierwsza część będzie oparta na Ikarusie, druga zaś na AST / Union.
(Jutro dojdą screeny w celu jaśniejszego przekazu 29-09-2018)
Uwaga!
Zastrzegam sobie tutorial i nie zezwalam na kopiowanie go bez zgody na inne fora. Dodatkowo, jeżeli użyjesz tego pakietu warto wspomnieć kto jest jego autorem.Po pobraniu plików inicjujemy Ikarusa, oraz wrzucamy biblioteki do folderu "SYSTEM" gry. Teraz zaczynamy pracę. W folderze "...\_work\Data\Scripts\Content\" tworzymy sobie folder o nazwie "Music". W podanym folderze tworzymy trzy pliki:
"Music_Core.d"
"Music_Zones.d"
"Music.src"
Otwieramy plik "Music.src" i definiujemy pliki które parser ma sprawdzać w następującej kolejności:
Music_Zones.d
Music_Core.d
Po wykonaniu operacji w pliku .src, otwieramy plik Gothic.src w celu dopisania pliku "Music.src", aby parser mógł go odczytać. Ma to wyglądać mniej więcej tak:
_Intern\Ikarus.d
[...]
Music\Music.src
Story\Startup.d
[...]
Czas rozpocząć pisanie kodu. Otwórzmy plik Music_Core.d Zdefiniujmy w nim pięć zmiennych:
var int CMusic_Lib; //Pointer do biblioteki
var int CMusic_PlayMusic; //Pointer do funkcji biblioteki, która odtwarza soundtrack
var int CMusic_SetVolume; //Pointer do funkcji biblioteki, która ustawia głośność muzyki
var int CMusic_Tidy; //Pointer do funkcji biblioteki, która odpowiada za poprawne działanie biblioteki
var int CMusic_SetFolder; //Pointer do funkcji biblioteki, która ustawia folder w którym znajduje się muzyka.
Nie jest, to łatwe dla ludzi którzy nie rozumieją Ikarusa i wstrzykiwania bibliotek. Jednak, jest to wymagane. Kolejne kroki dla zielonych będą po prostu czarną magią. Definiujemy funkcję odpowiedzialną za inicjowanie biblioteki.
func void CMusic_InitLibrary()
{
CMusic_Lib = LoadLibrary("CMusic.dll"); // Załadowanie danych biblioteki do zmiennych
//Jeżeli biblioteka nie zostanie załadowana, to skrypt zostanie zatrzymany!
if(!CMusic_Lib) {
MEM_Error("CMusic:: Library was not loaded!");
return;
};
//Biblioteka została załadowana poprawnie więc teraz
//zapisujemy wskaźniki funkcji z biblioteki do zmiennych (WinApi)
//Typ funkcji razem z argumentami zostały podane w komentarzach obok
CMusic_PlayMusic = GetProcAddress(CMusic_Lib, "PlayMusic"); //void (char*, float, int)
CMusic_SetVolume = GetProcAddress(CMusic_Lib, "SetVolume"); //void (float)
CMusic_Tidy = GetProcAddress(CMusic_Lib, "Tidy"); //void ()
CMusic_SetFolder = GetProcAddress(CMusic_Lib, "SetFolder"); //void (char*)
//Nazwy funkcji są pobrane z biblioteki, można je odczytać z kodu źródłowego, lub za pomocą programu IDA.
};
Posiadamy naszą funkcję, teraz wywołajmy ją, aby dostać dane do zmiennych. Otwieramy plik Startup.d i w funkcji Init_Global (W Gothic 1 musimy takową stworzyć, zaawansowany modder będzie wiedział jak, jeżeli jesteś nierozgarniętym modderem - załóż temat jak stworzyć takową funkcję), inicjujemy Ikarusa i system muzyczny:
func void Init_Global()
{
[...]
MEM_InitAll(); // Inicjowanie Ikarusa
CMusic_InitLibrary(); // Inicjowanie systemu muzycznego.
[...]
};
Tak więc teraz mamy zainicjowaną bibliotekę odtwarzania dźwięku. Możemy teraz przejść do kolejnego kroku - "Wywołanie funkcji z biblioteki"