|
Re: Уроки скриптологии
Тема четвертая: Мир Готики.
Весь Готический мир (кроме предметов - папка ..\Items) уместился в папке ..\Story
1. Инициализация мира. Данную функцию выполняет файл Startup.d
Подробно его рассматривать не будем, каждая его часть несет один и тот же смысл, такие большие файлы как этот будем рассматривать конспектно.
================================================== ======
Весь файл Startup.d состоит из блоков, каждый блок - из двух секций. Первая секция - STARTUP_<LevelName>, в этой секции выполняется расстановка НПС и предметов на карте конкретной локации. Вторая секция - INIT_<LevelName>, в этой секции выполняется инициализация отношений между монстрами, НПС и гильдиями; производится инициализация глобальных НПС, доступных в любой части скриптов; задается принадлежность помещений гильдиям и конкретным НПС. <LevelName> в именах секций (кроме секции GLOBAL) является именем части мира Готики, на которую есть *.zen файл с именем LevelName и которая загружается при переходе из одной части мира в другую. Функция STARTUP_ определенной части мира вызывается экзешником только один раз - при начале игры или при первом посещении этой части мира. Функция INIT_ определенной части мира вызывается экзешником каждый раз при входе в эту часть мира.
Примечание: Самой распространенной ошибкой начинающих модмейкеров при вставке в мир своего НПС является не начинать игру заново, а загружать старый сейв, в таком случае новый НПС будет отсутствовать в мире. Если Вы создаете свою карту мира, то необходимо в этом файле или любом другом (можно новом) создать для своего мира эти две секции.
// ************** // GLOBAL секция // ************** // Вызывается только один раз при начале новой игры (инициализация глобальных внутренних переменных)
func void STARTUP_GLOBAL() { * *Game_InitGerman(); };
func void INIT_GLOBAL() { * *Game_InitGerman(); };
// ***************** // Testlevel секция // ***************** // Тестовый уровень (Моё примечание: остался в этом файле от тестового уровня (Testlevel.zen), эта секция может быть удалена).
func void STARTUP_Testlevel() { };
func void INIT_SUB_Testlevel() { };
func void INIT_Testlevel() { * *B_InitMonsterAttitudes(); * *B_InitGuildAttitudes(); * *B_InitNpcGlobals(); * *INIT_SUB_Testlevel(); };
// Далее в файле Statup.d пойдут локации частей мира, они хотя и имеют свой *.zen файл, но вызываются не экзешником, а скриптами из секции части мира. // Я надеюсь, что все поняли разницу между частью мира и локацией части мира, а так же понятие блока и секции. // Если со STARTUP_ секцией всё понятно, то скажу дополнительно несколько слов по INIT_ секции. // Для каждой INIT_ секции в файле есть INIT_SUB_ функция, вот эти то функции для локаций и вызываются из INIT_ секции части мира, следовательно, INIT_ секции локаций ниоткуда не вызываются и могут быть удалены. // Всё вышесказанное закрепим на следующих функциях этого файла, внутреннее содержание функций я приводить не буду, если оно не представляет какой-либо дополнительный интерес, а является только вставкой НПС или предметов, пропущенные строки внутри функций буду помечать таким образом //!!!!!!
//----------------------------------------------- // Часть мира - Яркендар, локация - Храм Аданоса //-----------------------------------------------
// STARTUP_ секция - расстановка НПС в локации (будет вызвана из секции STARTUP_ части мира Яркендар) func void STARTUP_ADDON_PART_ADANOSTEMPLE_01() { * *//!!!!!! };
// INIT_SUB_ функция - инициализация локации (неважно что пуста, именно она вызовется из секции INIT_ части мира Яркендар) func void INIT_SUB_ADDON_PART_ADANOSTEMPLE_01() { };
// INIT_ секция - инициализация локации (не будет ниоткуда вызвана, можно удалить) func void INIT_ADDON_PART_ADANOSTEMPLE_01() { * *//!!!!!! };
//------------------------------------------------ // Часть мира - Яркендар, локация - Золотая шахта //------------------------------------------------ // аналогично предыдущему блоку
func void STARTUP_ADDON_PART_GOLDMINE_01() { * *//!!!!!! };
func void INIT_SUB_ADDON_PART_GOLDMINE_01() { };
func void INIT_ADDON_PART_GOLDMINE_01() { * *//!!!!!! };
//--------------------------------------------- // Часть мира - Яркендар, локация - Каньон //--------------------------------------------- // аналогично предыдущему блоку
func void STARTUP_ADDON_PART_CANYON_01() { * *//!!!!!! };
func void INIT_SUB_ADDON_PART_CANYON_01() { };
func void INIT_ADDON_PART_CANYON_01() { * *//!!!!!! };
//-------------------------------------------------- // Часть мира - Яркендар, локация - Вход в Яркендар //-------------------------------------------------- // аналогично предыдущему блоку
func void STARTUP_ADDON_PART_ENTRANCE_01() { * *//!!!!!! };
func void INIT_SUB_ADDON_PART_ENTRANCE_01() { };
func void INIT_ADDON_PART_ENTRANCE_01() { * *//!!!!!! };
//-------------------------------------------------- // Часть мира - Яркендар, локация - Лагерь Бандитов //-------------------------------------------------- // аналогично предыдущему блоку
func void STARTUP_ADDON_PART_BANDITSCAMP_01() { * *//!!!!!! };
// INIT_SUB_ функции с инициализацией помещений на принадлежность гильдиям func void INIT_SUB_ADDON_PART_BANDITSCAMP_01() { * * *Wld_AssignRoomToGuild("tavern01" *,GIL_NONE); * *Wld_AssignRoomToGuild("beds01" * *,GIL_PUBLIC); * *Wld_AssignRoomToGuild("merchant01",GIL_PUBLIC); * *Wld_AssignRoomToGuild("schmied01" ,GIL_NONE); * *Wld_AssignRoomToGuild("zoll01" * *,GIL_NONE); * *Wld_AssignRoomToGuild("raven01" * ,GIL_PUBLIC); };
func void INIT_ADDON_PART_BANDITSCAMP_01() { * *//!!!!!! };
//-------------------------------------------------- // Часть мира - Яркендар, локация - Лагерь Пиратов //-------------------------------------------------- // аналогично предыдущему блоку
func void STARTUP_ADDON_PART_PIRATESCAMP_01() { * *//!!!!!! };
func void INIT_SUB_ADDON_PART_PIRATESCAMP_01() { };
func void INIT_ADDON_PART_PIRATESCAMP_01() { * *//!!!!!! };
//-------------------------------------------------- // Часть мира - Яркендар, локация - Долина //-------------------------------------------------- // аналогично предыдущему блоку
func void STARTUP_ADDON_PART_VALLEY_01() { * *//!!!!!! };
func void INIT_SUB_ADDON_PART_VALLEY_01() { };
func void INIT_ADDON_PART_VALLEY_01() { * *//!!!!!! };
//*********************************** // Часть мира - Яркендар //*********************************** // Вот этот блок и будет вызван экзешником при входе в Яркендар
func void STARTUP_AddonWorld() { * * *// вызов STARTUP_ секций локаций Яркендара * *STARTUP_ADDON_PART_BANDITSCAMP_01(); * *STARTUP_ADDON_PART_PIRATESCAMP_01(); * *STARTUP_ADDON_PART_ENTRANCE_01(); * *STARTUP_ADDON_PART_GOLDMINE_01(); * *STARTUP_ADDON_PART_CANYON_01(); * *STARTUP_ADDON_PART_VALLEY_01(); * *STARTUP_ADDON_PART_ADANOSTEMPLE_01(); * *// установить флаг входа в Яркендар * *ENTERED_ADDONWORLD = TRUE; * *// установить текущий уровень на Яркендар * *CurrentLevel = ADDONWORLD_ZEN; * *// Маги воды уже ведут раскопки два дня * *Wld_SetTime(60,00); };
func void INIT_AddonWorld() { * *// вызов INIT_SUB_ функций локаций Яркендара * *INIT_SUB_ADDON_PART_BANDITSCAMP_01(); * *INIT_SUB_ADDON_PART_PIRATESCAMP_01(); * *INIT_SUB_ADDON_PART_ENTRANCE_01(); * *INIT_SUB_ADDON_PART_GOLDMINE_01(); * *INIT_SUB_ADDON_PART_CANYON_01(); * *INIT_SUB_ADDON_PART_VALLEY_01(); * *INIT_SUB_ADDON_PART_ADANOSTEMPLE_01(); * *// инициализация отношений монстров к другим НПС * *B_InitMonsterAttitudes(); * *// инициализация отношений между гильдиями людей * *B_InitGuildAttitudes(); * *// инициализация глобальных НПС * *B_InitNpcGlobals(); * *// вход в Яркендар * *B_ENTER_ADDONWORLD(); };
//-------------------------------------------------------- // Часть мира - Миненталь, локация - Бывший Старый лагерь //--------------------------------------------------------
func void STARTUP_OLDCAMP() { * *//!!!!!! };
func void INIT_SUB_OLDCAMP() { * *//!!!!!! };
func void INIT_OLDCAMP() { * *//!!!!!! };
//------------------------------------------------------------------------- // Часть мира - Миненталь, локация - Башня демонов (Старая башня Ксардаса) //------------------------------------------------------------------------- // аналогично предыдущему блоку
func void STARTUP_DEMONTOWER() { * *//!!!!!! };
func void INIT_SUB_DEMONTOWER() { };
func void INIT_DEMONTOWER() { * *INIT_SUB_DEMONTOWER(); };
//------------------------------------------------ // Часть мира - Миненталь, локация - Окрестности //------------------------------------------------ // аналогично предыдущему блоку
func void STARTUP_SURFACE() { * *//!!!!!! };
func void INIT_SUB_SURFACE() { * *// Башня демонов занята Черными магами * *Wld_AssignRoomToGuild("DT1",GIL_DMT); * *Wld_AssignRoomToGuild("DT2",GIL_DMT); * *// вход в Миненталь * *B_ENTER_OLDWORLD(); };
func void INIT_SURFACE() { * *//!!!!!! };
//*********************************** // Часть мира - Миненталь //*********************************** // Этот блок будет вызван экзешником при входе в Миненталь
func void STARTUP_OLDWORLD() { * *// вызов STARTUP_ секций локаций Миненталя * *Startup_Oldcamp(); * *Startup_Demontower(); * *Startup_Surface(); * *// установка времени * *Wld_SetTime(00,00); };
func void INIT_OLDWORLD() { * *// вызов INIT_SUB_ функций локаций Миненталя * *INIT_SUB_Oldcamp(); * *INIT_SUB_Demontower(); * *INIT_SUB_Surface(); * *// инициализация отношений монстров к другим НПС * *B_InitMonsterAttitudes(); * *// инициализация отношений между гильдиями людей * *B_InitGuildAttitudes(); * *// инициализация глобальных НПС * *B_InitNpcGlobals(); * *// вход в Миненталь * *B_ENTER_OLDWORLD(); * *// если ГГ готов к переходу в 4 главу и он не в 4 главе * *if(MIS_ReadyForChapter4 == TRUE) && (B_Chapter4_OneTime == FALSE) * *{ * * * *// инициализация 4 главы * * * *B_Kapitelwechsel(4,OLDWORLD_ZEN); * * * *// установка флага входа в 4 главу * * * *B_Chapter4_OneTime = TRUE; * *}; };
//------------------------------------------------ // Часть мира - Новый мир, локация - Хоринис //------------------------------------------------
func void STARTUP_NewWorld_Part_City_01() { * *//!!!!!! };
func void INIT_SUB_NewWorld_Part_City_01() { * *// управление зажиганием фонарей * *Wld_SetMobRoutine(00,00,"FIREPLACE",1); * *Wld_SetMobRoutine(20,00,"FIREPLACE",1); * *Wld_SetMobRoutine(05,00,"FIREPLACE",0); * *// принадлежность помещений портового квартала * *Wld_AssignRoomToGuild("hafen01",GIL_VLK); * *Wld_AssignRoomToGuild("hafen02",GIL_VLK); * *Wld_AssignRoomToGuild("hafen03",GIL_VLK); * *Wld_AssignRoomToGuild("hafen04",GIL_PUBLIC); * *Wld_AssignRoomToGuild("hafen05",GIL_VLK); * *Wld_AssignRoomToGuild("hafen06",GIL_VLK); * *Wld_AssignRoomToGuild("hafen07",GIL_VLK); * *// если был диалог с Эддой * *if(Edda_Schlafplatz == TRUE) * *{ * * * *// можно спать в её доме * * * *Wld_AssignRoomToGuild("hafen08",GIL_NONE); * *} * *else * *{ * * * *// нельзя * * * *Wld_AssignRoomToGuild("hafen08",GIL_VLK); * *}; * *Wld_AssignRoomToGuild("hafen09", * *GIL_PUBLIC); // Игназ * *Wld_AssignRoomToGuild("hafen10", * *GIL_VLK); * *Wld_AssignRoomToGuild("hafen11", * *GIL_VLK); * *Wld_AssignRoomToGuild("fellan", * * GIL_VLK); * *Wld_AssignRoomToGuild("fisch", * * *GIL_VLK); * *Wld_AssignRoomToGuild("lagerhaus", *GIL_NONE); * *Wld_AssignRoomToGuild("karten", * * GIL_PUBLIC); * *Wld_AssignRoomToGuild("hafenkneipe",GIL_NONE); * *Wld_AssignRoomToGuild("puff", * * * GIL_NONE); * *// Ремесленники * *Wld_AssignRoomToGuild("bogner", * * GIL_PUBLIC); // Торбен и Гретта * *Wld_AssignRoomToGuild("matteo", * * GIL_PUBLIC); * *Wld_AssignRoomToGuild("hotel", * * *GIL_NONE); * *Wld_AssignRoomToGuild("stadtkneipe",GIL_NONE); * *Wld_AssignRoomToGuild("zuris", * * *GIL_VLK); * *// если ГГ ученик Константино * *if(Player_IsApprentice == APP_Constantino) * *{ * * * *Wld_AssignRoomToGuild("alchemist",GIL_NONE); * *} * *else * *{ * * * *Wld_AssignRoomToGuild("alchemist",GIL_PUBLIC); * *}; * *// если ГГ ученик Боспера * *if(Player_IsApprentice == APP_Bosper) * *{ * * * *Wld_AssignRoomToGuild("gritta",GIL_NONE); * *} * *else * *{ * * * *Wld_AssignRoomToGuild("gritta",GIL_PUBLIC); * *}; * *// если ГГ ученик Харада * *if(Player_IsApprentice == APP_Harad) * *{ * * * *Wld_AssignRoomToGuild("schmied",GIL_NONE); * *} * *else * *{ * * * *Wld_AssignRoomToGuild("schmied",GIL_VLK); * *}; * *// тюрьма * *Wld_AssignRoomToGuild("turmsued01", GIL_MIL); * *Wld_AssignRoomToGuild("turmsued02", GIL_MIL); * *Wld_AssignRoomToGuild("turmost01", *GIL_MIL); * *Wld_AssignRoomToGuild("turmost02", *GIL_MIL); * *Wld_AssignRoomToGuild("turmschmied",GIL_MIL); * *Wld_AssignRoomToGuild("turmbogner", GIL_MIL); * *// казармы * *Wld_AssignRoomToGuild("andre", * * * GIL_PUBLIC); * *Wld_AssignRoomToGuild("waffenkammer",GIL_PUBLIC); * *Wld_AssignRoomToGuild("barracke", * *GIL_MIL); * *// верхний квартал * *Wld_AssignRoomToGuild("nwcityrich01",GIL_MIL); * *Wld_AssignRoomToGuild("rathaus",GIL_PUBLIC); * *Wld_AssignRoomToGuild("reich01",GIL_VLK); * *Wld_AssignRoomToGuild("reich02",GIL_VLK); * *Wld_AssignRoomToGuild("reich03",GIL_VLK); * *Wld_AssignRoomToGuild("reich04",GIL_VLK); * *Wld_AssignRoomToGuild("reich05",GIL_VLK); * *Wld_AssignRoomToGuild("reich06",GIL_PUBLIC); * *Wld_AssignRoomToGuild("richter",GIL_PUBLIC); * *Wld_AssignRoomToGuild("leomar", GIL_VLK); };
func void INIT_NewWorld_Part_City_01() { * *//!!!!!! };
//------------------------------------------------ // Часть мира - Новый мир, локация - ферма Лобарта //------------------------------------------------
func void STARTUP_NewWorld_Part_Farm_01() { * *//!!!!!! };
func void INIT_SUB_NewWorld_Part_Farm_01() { * *Wld_AssignRoomToGuild("farm01",GIL_PUBLIC); * *Wld_AssignRoomToGuild("farm02",GIL_PUBLIC); * *// если ГГ заработал одежду у Лобарта * *if(Lobart_Kleidung_Verkauft == TRUE) * *{ * * * *Wld_AssignRoomToGuild("farm03",GIL_NONE); * *} * *else * *{ * * * * * * *Wld_AssignRoomToGuild("farm03",GIL_PUBLIC); * *}; }; * * func void INIT_NewWorld_Part_Farm_01() { * *//!!!!!! };
//-------------------------------------------------- // Часть мира - Новый мир, локация - Башня Ксардаса //--------------------------------------------------
func void STARTUP_NewWorld_Part_Xardas_01() { * *//!!!!!! };
func void INIT_SUB_NewWorld_Part_Xardas_01() { };
func void INIT_NewWorld_Part_Xardas_01() { * *//!!!!!! };
//-------------------------------------------------- // Часть мира - Новый мир, локация - Монастырь //--------------------------------------------------
func void STARTUP_NewWorld_Part_Monastery_01() { * *//!!!!!! };
func void INIT_SUB_NewWorld_Part_Monastery_01() { * *//!!!!!! };
func void INIT_NewWorld_Part_Monastery_01() { * *//!!!!!! };
//----------------------------------------------------------------- // Часть мира - Новый мир, локация - усадьба Онара с окрестностями //-----------------------------------------------------------------
func void STARTUP_NewWorld_Part_GreatPeasant_01() { * *//!!!!!! };
func void INIT_SUB_NewWorld_Part_GreatPeasant_01() { * *// если ГГ помог Еролу найти каменную плитку * *if(MIS_Addon_Erol_BanditStuff == LOG_SUCCESS) * *{ * * * *Wld_AssignRoomToGuild("grpwaldhuette01",GIL_PUBLI C); * *} * *else * *{ * * * *Wld_AssignRoomToGuild("grpwaldhuette01",GIL_SLD); * *}; * * * * *// двор Онара * *Wld_AssignRoomToGuild("grphaupthaus01", GIL_PUBLIC); * *Wld_AssignRoomToGuild("grpschmiede01", *GIL_PUBLIC); * *Wld_AssignRoomToGuild("grpscheune01", * GIL_PUBLIC); * *Wld_AssignRoomToGuild("grpkapelle01", * GIL_NONE); * *// склеп * *Wld_AssignRoomToGuild("cementary01", * *GIL_NONE); * *// ферма Секоба * *// если Ксардас еще не послал ГГ за Древней книгой на усадьбу Секоба * *if(Sekob_RoomFree == FALSE) * *{ * * * *Wld_AssignRoomToGuild("grpbauer01",GIL_PUBLIC); * *} * *else * *{ * * * *Wld_AssignRoomToGuild("grpbauer01",GIL_NONE); * *}; * *Wld_AssignRoomToGuild("grpbauerscheune01", *GIL_PUBLIC); * *// ферма Бенгара * *Wld_AssignRoomToGuild("grpbauer02", * * * * GIL_PUBLIC); * *Wld_AssignRoomToGuild("grpbauerscheune02", *GIL_PUBLIC); * *Wld_AssignRoomToGuild("grpturm02", * * *GIL_PUBLIC); * *Wld_AssignRoomToGuild("grpturm01", * * *GIL_PUBLIC); * *Wld_AssignRoomToGuild("grpwaldhuette02",GIL_PUBLI C); };
func void INIT_NewWorld_Part_GreatPeasant_01() { * *//!!!!!! };
//------------------------------------------------------- // Часть мира - Новый мир, локация - проход в Миненталь //-------------------------------------------------------
func void STARTUP_NewWorld_Part_Pass_To_OW_01() { * *//!!!!!! };
func void INIT_SUB_NewWorld_Part_Pass_To_OW_01() { };
func void INIT_NewWorld_Part_Pass_To_OW_01 () { * *//!!!!!! };
//------------------------------------------------------- // Часть мира - Новый мир, локация - средний лес //-------------------------------------------------------
func void STARTUP_NewWorld_Part_Forest_01 () { * *//!!!!!! };
func void INIT_SUB_NewWorld_Part_Forest_01() { };
func void INIT_NewWorld_Part_Forest_01 () { * *//!!!!!! }; * * //---------------------------------------------------------- // Часть мира - Новый мир, локация - область Черного тролля //----------------------------------------------------------
func void STARTUP_NewWorld_Part_TrollArea_01() { * *//!!!!!! };
func void INIT_SUB_NewWorld_Part_TrollArea_01() { };
func void INIT_NewWorld_Part_TrollArea_01 () { * *//!!!!!! };
//*********************************** // Часть мира - Новый мир //*********************************** // Этот блок будет вызван экзешником при старте игры (Башня Ксардаса)
func void STARTUP_NewWorld() { * * *// вызов STARTUP_ секций локаций Нового мира * *STARTUP_NewWorld_Part_City_01(); * *STARTUP_NewWorld_Part_Farm_01(); * *STARTUP_NewWorld_Part_Xardas_01(); * *STARTUP_NewWorld_Part_Monastery_01(); * *STARTUP_NewWorld_Part_GreatPeasant_01(); * *STARTUP_NewWorld_Part_TrollArea_01(); * *STARTUP_NewWorld_Part_Forest_01(); * *STARTUP_NewWorld_Part_Pass_To_OW_01(); * *// начала главы 1 * *Kapitel = 1; * *// мультики * *PlayVideo("INTRO.BIK"); * *PlayVideo("Addon_Title.BIK"); * *// начальное умение ГГ добывать золото * *Hero_HackChance = 10; };
func void INIT_NewWorld() { * *// инициализация отношений монстров к другим НПС * *B_InitMonsterAttitudes(); * *// инициализация отношений между гильдиями людей * *B_InitGuildAttitudes(); * *// инициализация глобальных НПС * *B_InitNpcGlobals(); * *// вход в Новый мир * *B_ENTER_NEWWORLD(); * *// если ГГ расправился с Гильдией воров и Андре об этом не знает * *if(Diebesgilde_Verraten) && (Andre_Diebesgilde_aufgeraeumt != TRUE) * *{ * * * *// если Кассия, Джаспер или Рамирез живы * * * *if(!Npc_IsDead(Cassia)) ¦¦ (!Npc_IsDead(Jesper)) ¦¦ (!Npc_IsDead(Ramirez)) * * * *{ * * * * * *// убить Гильдию воров * * * * * *B_KillNpc(VLK_447_Cassia); * * * * * *B_KillNpc(VLK_446_Jesper); * * * * * *B_KillNpc(VLK_445_Ramirez); * * * * * *// установить флаг выполнения задания * * * * * *Andre_Diebesgilde_aufgeraeumt = TRUE; * * * *}; * *}; * *// вызов INIT_SUB_ функций локаций Миненталя * *INIT_SUB_NewWorld_Part_City_01(); * *INIT_SUB_NewWorld_Part_Farm_01(); * *INIT_SUB_NewWorld_Part_Xardas_01(); * *INIT_SUB_NewWorld_Part_Monastery_01(); * *INIT_SUB_NewWorld_Part_GreatPeasant_01(); * *INIT_SUB_NewWorld_Part_TrollArea_01(); * *INIT_SUB_NewWorld_Part_Forest_01(); * *INIT_SUB_NewWorld_Part_Pass_To_OW_01(); * *// если ГГ готов к переходу в 3 главу и он не в 3 главе * *if(MIS_ReadyForChapter3 *== TRUE) && (B_Chapter3_OneTime == FALSE) * *{ * * * *// инициализация 3 главы * * * *B_Kapitelwechsel(3,NEWWORLD_ZEN); * * * *// установка флага входа в 3 главу * * * *B_Chapter3_OneTime = TRUE; * *}; * *// если все драконы убиты и ГГ не в 5 главе * *if(MIS_AllDragonsDead *== TRUE) && (B_Chapter5_OneTime == FALSE) * *{ * * * *// инициализация 5 главы * * * *B_Kapitelwechsel(5,NEWWORLD_ZEN); * * * *// установка флага входа в 5 главу * * * *B_Chapter5_OneTime = TRUE; * *}; };
|