
Содержание
1. Начало модмейкерства
1.1. Каталоги
1.2. Дерево каталогов
1.3. Чем редактировать?
1.4. Файл настроек игры
1.5. ENGINE.EXE
2. Каталог PROGRAM
2.1. Файлы
2.2. Изменение настроек нашего героя
2.2.1. Меняем стартовую точку
2.2.2. Меняем модель
2.2.3. Меняем умения
2.2.4. Меняем ему корабль
2.2.5. Меняем название корабля
2.2.6. Меняем тип пушек у корабля
2.2.7. Меняем ранг, опыт, репутацию и деньги у героя
2.2.8. Меняем лицо героя
2.3. Создаем персонажа
2.4. Пишем диалог
2.4.1. Шаблон диалога
2.4.2. Немного о немногом
2.4.3. Простой диалог
2.4.4. Диалог продавца
2.4.5. Диалог работника верфи
2.4.6. Диалог с квестом
2.4.7. Функции диалогов
2.4.8. Экшены & Действия
2.5. Пишем новости
2.6. Globals.c
2.7. Создаем остров
2.7.1. Координаты
2.7.2. Остров
2.8. Секреты локаций
3. Каталог RESOURCE
3.1. Файлы
3.2. Использование TX конвертера
3.3. Создаем свою 3D-модель
3.3.1. Загружаем плагин
3.3.2. Скриншот редактора
3.3.3. Экспортируем в игру
4. Шейдеры
5. Дополнение
5.1. Погода
5.2. Заставки
5.3. Звуки
5.4. Музыка
5.5. Файлы настроек INI
5.6. Пишем 'О разработчиках'
5.7. Языки
6. FAQ
7. Автор

Начало модмейкерства
Вы прошли игру до конца? И, наверное, по нескольку раз? Хотите сделать свой мод?
Если да, то это для вас. С помощью Полезных мелочей вы сможете делать свои адд-оны. Затем
выкладывать их в Интернет. Здесь вы можете найти все, что вам пригодится при создании
своего мода от изменения настроек игры до создания своей 3D-модельки. Но помните,
перед тем, как редактировать тот или иной файл - делайте резервные копии!

Каталоги
Корневых каталогов игры не много, их всего три. Вот они:
MODULES - в этом каталоге хранятся все модули (.dll), нужные для игры.
PROGRAM - здесь хранятся скрипты игры.
RESOURCE - в этом каталоге находятся всякие настройки, текстуры,
анимации, звуки, модели и еще много другое, нужное для игры.
Самые полезные из них - 2. Это PROGRAM и RESOURCE. Мы разберем все.

Дерево каталогов
Этот раздел включает список всех каталогов игры Pirates of the Caribbean.
MODULES\ - все модули (.dll),
MODULES\TECHNIQUES - шейдеры,
PROGRAM\ - все скрипты игры,
PROGRAM\BATTLE_INTERFACE\ - скрипты боя с кораблями,
PROGRAM\CANNON\ - различные переменные пушек,
PROGRAM\CHARACTERS\ - скрипты персонажей,
PROGRAM\DIALOGS\ - скрипты диалогов,
PROGRAM\INIT\ - скрипты магазина, верфи, наций, кораблей и т.д.,
PROGRAM\INTERFACE\ - скрипты интерфейса,
PROGRAM\ISLANDS\ - скрипты островов,
PROGRAM\LOCATIONS\ - скрипты локаций,
PROGRAM\LOCATIONS\INIT\ - локации островов,
PROGRAM\SEA_AI\ - скрипты искусственного интелекта моря,
PROGRAM\SHIP\ - переменные кораблей,
PROGRAM\STORE\ - скрипты магазина,
PROGRAM\WORLDMAP\ - скрипты карты,
RESOURCE\ - все ресурсы игры,
RESOURCE\ANIMATION\ - анимация,
RESOURCE\INI\ - всякие настройки,
RESOURCE\INI\INTERFACES\ - настройки интерфейса,
RESOURCE\INI\POS\ - настройки "людей на палубе",
RESOURCE\LIGHTING\ - освещение,
RESOURCE\LIGHTING\DAY\ - освещение днем,
RESOURCE\LIGHTING\NIGHT\ - освещение ночью,
RESOURCE\MODELS\ - модели,
RESOURCE\SOUNDS\ - звуки,
RESOURCE\TEXTURES\ - текстуры,
RESOURCE\VIDEOS\ - видео.

Чем редактировать?
Программ, которыми мы будем пользоваться при создании своего мода немного:
Обычный текстовой редактор - скрипты и т.п.
ConvertorTX - для конвертирования текстур.
Maya - 3D-модели, анимация.
Хороший звуковой редактор - звуки, музыка.
PhotoShop - текстуры, картинки.

Файл настроек игры
В Pirates of the Caribbean такой же файл настроек, как и в первых Корсарах. Это - Engine.ini.
Вот как он выглядит:
modules path = modules\ - Путь к каталогу, где лежат библиотеки
full_screen = 1 - Если стоит 1, то игра будет запускаться в полном экране, иначе нет
screen_x = 1024 -| Разрешение
screen_y = 768 -| игры
lockable_back_buffer = 1 - ???
screen_bpp = D3DFMT_X8R8G8B8 - Цветовая палитра
texture_degradation = 0 - Если 1, то будет деградация текстур, иначе нет
controls = pc_controls - Управление
program_directory = PROGRAM - Путь к каталогу, где лежат скрипты игры
run = seadogs.c - Указывает, какой скрипт будет запускаться первым
startFontIniFile = resource\ini\fonts.ini - Путь к файлу настроек шрифтов
font = dialog0 - Главный шрифт
[script]
debuginfo = 1 - Если стоит 1, то отладочная информация будет выкладываться в файл
codefiles = 0 - ???
[sound]
sound path = resource\sounds\ - Путь к каталогу со звуками.
Кстати, есть два файла, содержащих отладочную информацию. Первый из них - compile.log,
где выкладывается информация о игре. Второй - system.log, где
выкладывается информация о состоянии движка Storm 2. И еще, отладочную информацию Storm 2 вы можете видеть
при загрузке игры, а точнее при загрузке движка.

ENGINE.EXE
В файле Engine.exe править нечего, кроме картинки, которая будет видна при
загрузке движка. Те люди, у которых есть какие-нибудь "хакерские" программы, тот может поменять эту
картинку. Картинка располагается от 00039070 по 000486B0.

Каталог PROGRAM
Этот каталог включает все скрипты и именно его мы будем больше всего редактировать, конечно, если вам
это нужно.

Каталог PROGRAM: Файлы
Самый главный скрипт этого каталога - seadogs.c. От него запускаются и остальные скрипты.
Редактировать его мы будем попозже. А сейчас я перечислю все файлы, находящиеся в этой папке:
animals.c - скрипты по созданию животных,
dialog.c - скрипты диалога,
globals.c - тоже один из главных скриптов, где хранятся значения переменных и т.п.,
InitInterface.c - скрипты интерфейса,
key_codes.h - назначение клавиш,
sounds.h - назначение переменных звуков,
messages.h - переменные движка,
particles.c - скрипты создания частиц,
reload.c - скрипты локаций,
start_interface.c - еще одни скрипты интерфейса.
Все скрипты редактируются с помощью обычного текстового редактора. Я например, правлю
в Far'е. Не ищите утилиты, не теряйте время зря. ;-)

Изменение настроек нашего героя
Изменять настройки главного героя легко. Для этого нужно всего лишь поредактировать один файл.
Он называется Characters_init.c и лежит в директории PROGRAM\Characters\ (такой файл нужен
для всех действий кроме изменения стартовой точки героя). Давайте приступим. Учтите, это все для Блейза! ;-)

Изменение настроек нашего героя: Меняем стартовую точку
Вот это не очень легко. Для этого мы должны открыть два файла. Сначала откроем
seadogs.c (лежит в корне каталога PROGRAM).
Теперь откроем второй файл. Он лежит в директории PROGRAM\Locations\Init\. Там несколько файлов.
Если вы хотите отправить его в место на Редмонде, то открывайте файл Redmond.c, если на Фале Де Флер, то открывайте FalaiseDeFleur.c.
И так, до нужного вам острова. ;-) Пусть у нас главный герой попадет на Редмонд, в таверну.
Значит, мы откроем еще и файл Redmond.c. В seadogs.c ищем вроде этого:
void NewGame()
{
DelEventHandler("frame","NewGame");
InitGame();
LoadMainCharacterInFirstLocation("Falaise_de_fleur_location_02", "", "Falaise_de_fleur_location_01");
InterfaceStates.Buttons.Resume.enable = true;
CreateClass("dummy");
}
Нашли? Так вот, видите строчку LoadMainCharacterInFirstLocation("Falaise_de_fleur_location_02", "", "Falaise_de_fleur_location_01"); ?
Видите? Хорошо. Этой функцией мы загружаем нашего героя в наш виртуальный мир. Так давайте ее рассмотрим. Falaise_de_fleur_location_02 - это место, где будет стоять
главный герой, а Falaise_de_fleur_location_01 - это место, где появится корабль. Видите, между ними стоят кавычки,
а в них ничего нет? Это - Emerge Location. Falaise_de_fleur_location_02 - это место около ворот (вход в город). Вот там
мы появимся, если у нас в Emerge Location ничего нет и локация главного персонажа равна Falaise_de_fleur_location_02.
Если же в Emerge Location написать sea и поместить нашего героя на локацию
Falaise_de_fleur_location_01, то мы будем стоять на пирсе. Почему так? Falaise_de_fleur_location_01 -
это место около ворот при выходе из города, где находится пирс. Без Emerge Location мы бы не стояли на пирсе, а
стояли около ворот. Если мы, например, стоим на улице города, где находятся таверна, верфь, магазин и т.п., то станут возможными
Emerge Location = tavern, store, shipyard и т.д. Если же мы стоим на улице, где нет
верфи, магазина, таверны, а есть резиденция губернатора, то Emerge Location = residence. Но жаль, что не работают Emerge Location = residence, store, shipyard,
tavern. Так бы было легче записывать. Ну хоть работают другие, более длинные Emerge Location. Их можно посмотреть в локации какого-нибудь
острова. Например, мы стоим на улице, где есть резиденция губернатора (я буду говорить о Фале Де Флер). Эта улица - Falaise_de_fleur_location_03.
Там есть линк на локацию Falaise_de_fleur_townhall. Это находится вот здесь:
Locations[n].reload.l3.name = "Falaise_de_fleur_townhall";
Locations[n].reload.l3.go = "residence";
Locations[n].reload.l3.emerge = "locator1";
Не надо писать Emerge Location = locator1. Работать не будет. Если же написать Emerge Location =
Falaise_de_Fleur_townhall, то все будет нормально. Надеюсь,
вы поняли. Идем дальше. Мы же хотим изменить локацию героя. Так вот, смотрим в
Redmond.c. Как я говорил выше я помещу его в таверну. Смотрим и находим вот это:
Locations[n].id = "City_Redmond_largetavern";
Ага, нашли. Теперь нам осталось написать в seadogs.c локацию - City_Redmond_largetavern.
Только смотрите, не напутайте, нужно вписать это в локацию для персонажа, а не для корабля. Ну вот что у нас получилось:
void NewGame()
{
DelEventHandler("frame","NewGame");
InitGame();
//LoadMainCharacterInFirstLocation("Falaise_de_fleur_location_02", "", "Falaise_de_fleur_location_01");
LoadMainCharacterInFirstLocation("City_Redmond_largetavern", "", "Falaise_de_fleur_location_01");
InterfaceStates.Buttons.Resume.enable = true;
CreateClass("dummy");
}
Смотрим в игре, корабля нет. Он с нами не поплыл. В Фале Де Флер остался. Давайте исправим вот эту строчку:
LoadMainCharacterInFirstLocation("City_Redmond_largetavern", "", "REDMOND_PORT");
Ура, все получилось!

Изменение настроек нашего героя: Меняем модель
Теперь идет самое легкое. Меняем модель? Так значит, заходим в Characters_init.c.
Видите вот это:
ch.model = "blaze";
ch.model.entity = "Player";
Первая строчка - модель героя (без расширения). Посмотреть модельки можно в директории
RESOURCE\MODELS\. Я изменю модель Блейза на модель бродяги. Эта модель
называется - brodyaga.gm. Вторая строчка - тип персонажа. Изменять ее не надо!
Мы же не хотим сделать из персонажа простого NPC. За кого тогда играть будем? ;-)
Вот что у меня получилось:
ch.model = "brodyaga";
ch.model.entity = "Player";
Все!

Изменение настроек нашего героя: Меняем умения
Заходим в Characters_init.c.
Видим вроде этого:
ch.skill.Leadership = "0";
ch.skill.Fencing = "0";
ch.skill.Sailing = "0";
ch.skill.Accuracy = "0";
ch.skill.Cannons = "0";
ch.skill.Grappling = "0";
ch.skill.Repair = "0";
ch.skill.Defence = "0";
ch.skill.Commerce = "0";
ch.skill.Sneak = "0";
Расставлю все по полочкам.
1 строка - скилл лидерство (Leadership)
2 строка - скилл фехтование (Fencing)
3 строка - скилл навигация (Sailing)
4 строка - скилл меткость (Accuracy)
5 строка - скилл пушки (Cannons)
6 строка - скилл абордаж (Grappling)
7 строка - скилл починка (Repair)
8 строка - скилл защита (Defence)
9 строка - скилл коммерция (Commerce)
10 строка - скилл шпион (Sneak)
Надеюсь, как редактировать вы поняли. Если нет, то привожу пример, как установить скиллы
абордажа, меткости и починки в 3-2-4. Вот:
ch.skill.Leadership = "0";
ch.skill.Fencing = "3";
ch.skill.Sailing = "0";
ch.skill.Accuracy = "2";
ch.skill.Cannons = "0";
ch.skill.Grappling = "0";
ch.skill.Repair = "4";
ch.skill.Defence = "0";
ch.skill.Commerce = "0";
ch.skill.Sneak = "0";
Пока все легко!

Изменение настроек нашего героя: Меняем ему корабль
Зайдем в Characters_init.c. Видите что-то вроде этого:
ch.Ship.Type = SHIP_CORVETTE;
Здесь приводится пример корвета, мы изменим его на бэттлшип. Вот список всех кораблей игры:
Tartane - тартана
Yacht - яхта
Schooner - шхуна
Barque - барка
Brig - бриг
Lugger - люгер
Xebec - ксебека
Frigate - фрегат
Corvette - корвет
Caravel - каравелла
Fleut - флеут
Galeon - галеон
Battleship - военный корабль (бэттлшип)
Чтобы изменять корабль, надо оставить SHIP_ и прибавить к этому тип корабля (galeon, fleut и т.д.).
Я изменю корвет на бэттлшип:
ch.Ship.Type = SHIP_BATTLESHIP;
Все еще легко!

Изменение настроек нашего героя: Меняем название корабля
Редактируем Characters_init.c.
Вот вроде этого видите:
ch.Ship.Name = "Arabella";
Как изменять, наверное, догадались, если нет, то привожу пример. Я изменю название Arabella на SeaWolf:
ch.Ship.Name = "SeaWolf";
Вот и все! Ничего трудного!

Изменение настроек нашего героя: Меняем тип пушек у корабля
Редактируем опять же Characters_init.c. Вроде этого видите:
ch.Ship.Cannon.Type = CANNON_TYPE_CANNON_LBS16;
Для того чтобы изменять, нам нужно оставить CANNON_TYPE_CANNON_LBS и добавить к этому
наш тип пушек. Всего их три:
12
16
24
Привожу вам пример. Я изменю тип пушек на 24:
ch.Ship.Cannon.Type = CANNON_TYPE_CANNON_LBS24;
Ну и все!

Изменение настроек нашего героя: Меняем ранг, опыт, репутацию и деньги у героя
Опять же редактируем Characters_init.c. Ищите вот вроде этого:
ch.rank = 1;
ch.reputation = "8";
ch.experience = "0";
...
ch.money = "1000";
Первая строчка - это ранг, вторая - репутация, третья - опыт, четвертая (кроме точек конечно ;-) - деньги.
Повторяю, rank - ранг, reputation - репутация, experience - опыт, money - деньги. Рассмотрим репутацию:
Минимальное значение - 0
Максимальное значение - 89
Пояснять как редактировать я уже не буду, т.к. вы читали как это сделать выше.

Изменение настроек нашего героя: Меняем лицо героя
Снова берем в руки Characters_init.c.
Ищите теперь вроде этого:
ch.FaceId = 1;
Изменим его на лицо пирата (см. в авторах). Имя файла текстуры этого пирата - face_20.tga.tx.
Вот что у меня получилось:
ch.FaceId = 19;
Хотя имя текстуры содержит число 20, у меня в скрипте 19, все идет нормально. Надо уменьшать число на 1 и все
пойдет правильно. Например, вы хотите взять 11, вычитаете 1, получается 10 и т.д.

Создаем персонажа
Создать персонажа легче, чем писать для него диалог. Ну ладно, начнем! Здесь я опишу только
создание самого персонажа, но не диалога. Для этого нам потребуется файл
Characters_init.c. Давайте придумаем ему имя и фамилию. Пусть это будет Чарльз Кентер. Отсюда
по-английски - Charles Kanter. Пусть ID будет 86. Для этого редактируем файл
Characters_init.c. Ползем в самый конец. В конце стоит вот такая фигурная скобка }.
Перед этой скобкой мы и начнем создавать своего персонажа. Во-первых, я опишу что все значит. Возьмем,
например, губернатора Редмонда - Robert Christopher Silehard.
makeref(ch,Characters[46]); //Robert Christopher Silehard
ch.name = "Robert";
ch.middlename = "Christopher";
ch.lastname = "Silehard";
ch.id = "Robert Christopher Silehard";
ch.model = "huber_portugal";
ch.location = "city_redmond_residence";
ch.location.group = "characters";
ch.location.locator = "locator5";
ch.Dialog.Filename = "Robert Christopher Silehard_dialog.c";
ch.rank = 1;
ch.reputation = "None";
ch.experience = "0";
ch.skill.Leadership = "1";
ch.skill.Fencing = "1";
ch.skill.Sailing = "1";
ch.skill.Accuracy = "1";
ch.skill.Cannons = "1";
ch.skill.Grappling = "1";
ch.skill.Repair = "1";
ch.skill.Defence = "1";
ch.skill.Commerce = "1";
ch.skill.Sneak = "1";
ch.money = "100000";
___________________________
Сейчас я объясню что все значит.
makeref(ch, Characters[46]); - присваиваем ID персонажу. Сам ID стоит в квадратных
скобках,
ch.name = "Robert"; - имя персонажа,
ch.middlename = "Robert"; - "среднее" имя. Дополнение к имени,
ch.lastname = "Silehard"; - фамилия персонажа,
ch.id = "Robert Christopher Silehard"; - полное имя персонажа,
ch.model = "huber_portugal"; - модель персонажа (без расширения .gm),
ch.location = "city_redmond_residence"; - локация персонажа,
ch.location.group = "characters"; - тип локации персонажа,
ch.location.locator = "locator5"; - место в локации,
ch.Dialog.Filename = "Robert Christopher Silehard_dialog.c"; - диалог,
ch.rank = 1; - ранг персонажа,
ch.reputation = "None"; - репутация,
ch.experience = "0"; - опыт,
ch.skill.Leadership = "1"; - скилл: Лидерство,
ch.skill.Fencing = "1"; - скилл: Фехтование,
ch.skill.Sailing = "1"; - скилл: Навигация,
ch.skill.Accuracy = "1"; - скилл: Меткость,
ch.skill.Cannons = "1"; - скилл: Пушки,
ch.skill.Repair = "1"; - скилл: Починка,
ch.skill.Defence = "1"; - скилл: Защита,
ch.skill.Commerce = "1"; - скилл: Коммерция,
ch.skill.Sneak = "1"; - скилл: Шпион,
ch.money = "100000"; - деньги.
Чтобы правильно написать имя файла диалога, а также полное имя персонажа, я написал
вот это:
Имя файла диалога = Имя + Среднее имя + Фамилия + "_dialog.c"
Имя файла диалога = Name + Middlename + Lastname + "_dialog.c"
Полное имя = Имя + Среднее имя + Фамилия
Полное имя = Name + Middlename + Lastname
Примечание: Если у персонажа нет среднего имени (Middlename), то
его писать и не нужно.
___________________________
Модели .gm можно поглядеть в директории \RESOURCE\MODELS\. Локацию, тип локации и место в локации (локатор)
можно поглядеть в директории \PROGRAM\Locations\Init\. Диалоги лежат в директории
\PROGRAM\DIALOGS\. Рассмотрим репутацию. Если ее нет, то пишется None,
иначе число. Ну, а дальше сами поймете. Теперь перейдем к созданию персонажа.
Я создаю персонажа Charles Kanter. Создаем... Присваиваем ID персонажу:
makeref(ch, Characters[86]);
Назначаем имя, фамилию и полное имя:
ch.name = "Charles";
ch.lastname = "Kanter";
ch.id = "Charles Kanter";
Назначаем модель. Ну пусть это будет нищий:
ch.model = "brodyaga";
Назначаем локацию и т.п. Пусть он сидит в таверне Фале Де Флера:
ch.location = "Falaise_de_fleur_tavern";
ch.location.group = "characters";
ch.location.locator = "locator2";
Диалог Чальза:
ch.Dialog.Filename = "Charles Kanter_dialog.c";
Ранг, репутация, опыт и деньги. Пусть денег будет 1000, опыта - 0,
репутации нет и ранг - 1:
ch.rank = 1;
ch.reputation = "None";
ch.experience = "0";
ch.money = "1000";
Теперь скиллы. Все поставим по 2:
ch.skill.Leadership = "2";
ch.skill.Fencing = "2";
ch.skill.Sailing = "2";
ch.skill.Accuracy = "2";
ch.skill.Cannons = "2";
ch.skill.Repair = "2";
ch.skill.Defence = "2";
ch.skill.Commerce = "2";
ch.skill.Sneak = "2";
Все, мы кончили создание персонажа!

Пишем диалог
Диалоги - главные в игре. С помощью них можно не только разговаривать с NPC, но и
прибавлять репутацию, деньги, опыт, задать местонахождение NPC, прибавлять и уменьшать
навыки, менять модели, менять корабли, сменить персонажа, получить предмет и т.д. В
отличие от первых Корсаров в Pirates of the Caribbean действия (экшены) теперь находятся
в диалогах.

Пишем диалог: Шаблон диалога
void ProcessDialogEvent()
{
ref NPChar, PChar, d;
PChar = GetMainCharacter();
aref Link, NextDiag;
DeleteAttribute(&Dialog,"Links");
makeref(NPChar,CharacterRef);
makearef(Link, Dialog.Links);
makeref(d, Dialog);
makearef(NextDiag, NPChar.Dialog);
switch(Dialog.CurrentNode)
{
case "First Time":
d.Text = "";
Link.l1 = "";
Link.l1.go = "";
Link.l2 = "";
Link.l2.go = "";
Link.l3 = "";
Link.l3.go = "";
NextDiag.TempNode = "First Time";
break;
case "exit":
NextDiag.CurrentNode = NextDiag.TempNode;
DialogExit();
break;
case "menu":
NextDiag.CurrentNode = NextDiag.TempNode;
LaunchMainMenu();
DialogExit();
break;
case "cannons":
NextDiag.CurrentNode = NextDiag.TempNode;
LaunchCannons();
DialogExit();
break;
case "character":
NextDiag.CurrentNode = NextDiag.TempNode;
LaunchCharacter(GetMainCharacter());
DialogExit();
break;
case "hirecrew":
NextDiag.CurrentNode = NextDiag.TempNode;
LaunchHireCrew();
DialogExit();
break;
case "store":
NextDiag.CurrentNode = NextDiag.TempNode;
LaunchStore(STORE_ONE);
DialogExit();
break;
case "shipyard":
NextDiag.CurrentNode = NextDiag.TempNode;
LaunchShipyard();
DialogExit();
break;
case "shiphold":
NextDiag.CurrentNode = NextDiag.TempNode;
LaunchShipHold();
DialogExit();
break;
}
}
В этом шаблоне я также включил функции магазина, верфи, таверны и даже меню и информации
о персонаже. Если вам они не нужны, то смело можете их удалить.
menu - показ меню,
cannons - смена пушек,
character - информация о персонаже,
hirecrew - найм людей в команду,
store - покупка/продажа товаров,
shipyard - покупка/продажа/ремонт корабля,
shiphold - показ трюма корабля.

Пишем диалог: Немного о немногом
Здесь я буду рассказывать о том, что вы видели в шаблоне. Ну, начнем!
Функцией ProcessDialogEvent() вызывается сам диалог.
Чтобы диалог работал нормально надо назначить переменные: главного героя, NPC,
диалога, линков и т.п. Первым делом мы создаем переменные - главного героя, NPC
и диалога. Затем нам нужно присвоить переменной PChar (главный
герой) значение главного персонажа. После этого опять создаем переменные - Link
и NextDiag. Link - это линки,
а NextDiag - переменная диалога (для перехода к ноду). Кроме этого мы должны присвоить переменной NPChar
значение NPC. После этого начинаем "говорить" линкам, что они линки. ;-) Далее
идет присвоение переменной d значение диалога. Затем
приписываем переменной NextDiag значение диалога NPC. После
всего этого включаем диалог на текущий нод. Дальше идет собственно сам диалог.
Кейсом (case) назначаем название диалога, например, First Time, а также в кейс
включается и текст диалога NPC и диалога главного героя, а также линки. После
этого всегда надо писать break. Чтобы выйти из диалога
надо сделать дополнительный case. Пусть он зовется как exit. Там мы переключаем
текущий нод на временный (TempNode), ну и конечно выполняем функцию DialogExit().
И опять же break. Еще хочу сказать, что можно создавать
свои переменные и применять к ним соответственные значения. Например, вместо
переменной d можно сделать Dialog и т.д.
Ну вот и все.

Пишем диалог: Простой диалог
Для легкого (ну, конечно, не совсем легкого) создания диалога создан специальный шаблон диалога.
Берите его в руки и создавайте свой диалог. Шаблон я написал выше. Первый диалог
называется First Time, второй - Second Time и т.д.
Но можно называть кейсы и своим именем. Например, вместо First Time мы можем
написать common, как в первых Корсарах.
На диалог NPC можно сделать 4 линка. На каждый линк существует свой переход. Для
ответа, в котором герой заканчивает диалог существует переход на кейс (case)
exit. Этот кейс не надо изменять! Если хотите сделать поменьше линков, то удалите их, а
точнее вот это (где n - номер линка):
Link.ln = "";
Link.ln.go = "";
Чтобы сделать другой кейс достаточно скопировать эти строчки:
case "First Time":
NextDiag.TempNode = "First Time";
d.Text = "";
Link.l1 = "";
Link.l1.go = "";
Link.l2 = "";
Link.l2.go = "";
Link.l3 = "";
Link.l3.go = "";
break;
Изменить название кейса, вписать текст диалога NPC, записать ответы, переходы. Конечно, если вам не нужно столько
линков можете некоторые удалить, сделать TempNode на следующий кейс.
Ну вообщем, это не трудно. Вот здесь я привожу пример маленького диалога с двумя кейсами:
void ProcessDialogEvent()
{
ref NPChar, PChar, d;
PChar = GetMainCharacter();
aref Link, NextDiag;
DeleteAttribute(&Dialog,"Links");
makeref(NPChar,CharacterRef);
makearef(Link, Dialog.Links);
makeref(d, Dialog);
makearef(NextDiag, NPChar.Dialog);
switch(Dialog.CurrentNode)
{
case "First Time":
d.Text = "Здравствуйте! Меня зовут " + NPChar.Name + ". Могу ли я знать как вас зовут?";
Link.l1 = "Меня зовут " + PChar.Name + ". Я капитан корабля " + PChar.Ship.Name + ".";
Link.l1.go = "next";
Link.l2 = "Это не твое дело, " + NPChar.Name + "! Пока!";
Link.l2.go = "exit";
NextDiag.TempNode = "First Time";
break;
case "next":
d.Text = "Что вы от меня хотели?";
Link.l1 = "Да нет, ничего! До свидания!";
Link.l1.go = "exit";
NextDiag.TempNode = "First Time";
break;
case "exit":
NextDiag.CurrentNode = NextDiag.TempNode;
DialogExit();
break;
}
}
Этот пример простенького диалога написан для того, чтобы дать вам понять, как нужно
строить кейс. Теперь давайте рассмотрим другие диалоги. В них я не буду писать весь код диалога, а
только кейс.

Пишем диалог: Диалог продавца
Диалог продавца должен включать функцию LaunchStore с определенным
типом, а точнее - STORE_ONE или STORE_TWO. Для этого я написал три кейса:
case "First Time":
d.Text = "Здравствуйте! Меня зовут " + NPChar.Name + ". ? Я владелец этого магазина.";
Link.l1 = "Меня зовут " + PChar.Name + " " + PChar.Lastname + ". Я бы хотел приобрести кое-что!";
Link.l1.go = "store";
Link.l2 = "Меня зовут " + PChar.Name + ", но сейчас мне надо идти! До свидания!";
Link.l2.go = "exit";
NextDiag.TempNode = "First Time";
break;
case "exit":
NextDiag.CurrentNode = NextDiag.TempNode;
DialogExit();
break;
case "store":
LaunchStore(STORE_ONE);
NextDiag.CurrentNode = NextDiag.TempNode;
DialogExit();
break;
Вот это пример диалога продавца. Теперь давайте рассмотрим диалог работника верфи!

Пишем диалог: Диалог работника верфи
Представьте себе верфь. Что там можно сделать? Во-первых, покупать и продавать корабли;
во-вторых, ставить себе пушки, ну и в-третьих, можно смотреть трюм корабля. Отсюда следует,
нам придется писать кейсы с двумя (хотя можно и с тремя, если считать трюм) функциями - LaunchShipyard и LaunchCannons.
Вот эти кейсы:
case "First Time":
d.Text = "Здравствуйте! Меня зовут " + NPChar.Name + ". ? Эта самая лучшая верфь в архипелаге. Может вам нужен хороший корабль?";
Link.l1 = "Да, вы угадали! Я хочу купить себе корабль!";
Link.l1.go = "shipyard";
Link.l2 = "Нет, я лишь хочу поставить на корабль пушки!";
Link.l2.go = "cannons";
Link.l3 = "Нет, мне сейчас ничего не нужно. До свидания!";
Link.l3.go = "exit";
NextDiag.TempNode = "First Time";
break;
case "exit":
NextDiag.CurrentNode = NextDiag.TempNode;
DialogExit();
break;
case "shipyard":
LaunchShipyard();
NextDiag.CurrentNode = NextDiag.TempNode;
DialogExit();
break;
case "cannons":
LaunchCannons();
NextDiag.CurrentNode = NextDiag.TempNode;
DialogExit();
break;
Ну, а теперь предстоит самое сложное - диалог с квестом.

Пишем диалог: Диалог с квестом
Сначала давайте подумаем, какой квест мы хотим сделать. Будет ли этот квест
на доставку чего-либо? Или на потопление кого-либо? Или же цель квеста - убить
какого-нибудь персонажа? Или же спасти какого-нибудь персонажа? А может цель -
найти кого-нибудь? Или разгромить форт? Будем считать, что вы уже придумали цель
своего квеста. Затем нужно создать персонажей, которые будут учавствовать
в этом квесте, после этого надо создать переменные квеста, диалоги персонажей.
Если будут корабли, то и создать их нужно. Ведь мы же не хотим создать квест на
потопление корабля, какого нет? Все, переходим от теории к практике. ;-)
ЭТОТ
РАЗДЕЛ
ПОЛЕЗНЫХ
МЕЛОЧЕЙ
БУДЕТ
НАПИСАН
ПРИ
ВЫХОДЕ
ИГРЫ

Пишем диалог: Функции диалога
Функций диалога не так уж и много. Вот они:
RandPhrase("phrase1", "phrase2", "phrase3");
Выбор диалога NPC из 3 вариатов.
RandSwear();
Прибавить к диалогу выражения типа "Якорь мне в корму" и т.п.
GoodEpithet();
Прибавить к диалогу NPC "хорошие" эпитеты.
BadEpithet();
Прибавить к диалогу NPC "плохие" эпитеты.
PCharPhrase("phrase1", "phrase2");
Выбор диалога главного героя из 2 вариантов (в зависимости от главного героя).
TimeGreeting();
Прибавить к диалогу этикетные междометия.
SelectRumour();
Выбрать случайный слух.
GetNPCInformation(ID);
Получить информацию о персонаже с ID.
RandSum("Amount");
Сгенерировать случайное число (Sum) с определенным Amount. Вот что может быть записано в Amount:
Few - в пределах 400
Some - в пределах 2000
Medium - в пределах 4000
Large - в пределах 6000
Huge - в пределах 10000
Address_Form.NATION
Прибавить к диалогу обращение. Вместо NATION надо писать:
Spa - Испания (сеньор)
Fra - Франция (мсье)
Eng - Англия (сэр)
Por - Португалия (синьор)
Hol - Голландия (mijnheer)

Пишем диалог: Экшены & Действия
Вот список экшенов:
Эти команды можно использовать как на NPC так и на главного героя. Так что переменная
персонажа - ch.
Если в квадратных скобках стоит буква
B, то эта переменная должна иметь значение true
или false.
Если в квадратных скобках стоит буква S,
то переменная может содержать буквы.
ch.Money;
Деньги
ch.Experience;
Опыт
ch.Rank;
Ранг
ch.Model; [S]
Модель
ch.Model.Animation; [S]
Анимация
ch.Model.Entity; [S]
Тип модели
ch.Dead; [B]
Мертвый или живой (true - мертвый, false - живой)
ch.FaceId;
Лицо (при виде [F1] - только для главного героя)
сh.Location; [S]
Локация
ch.Location.group; [S]
Тип локации
ch.Location.locator; [S]
Место локации
ch.Dialog.Filename; [S]
Файл диалога
ch.Reputation; [S]
Репутация
ch.Name; [S]
Имя персонажа
ch.Lastname; [S]
Фамилия персонажа
ch.skill.Leadership;
Навык: Лидерство
ch.skill.Fencing;
Навык: Фехтование
ch.skill.Sailing;
Навык: Навигация
ch.skill.Accuracy;
Навык: Меткость
ch.skill.Cannons;
Навык: Пушки
ch.skill.Grappling;
Навык: Абордаж
ch.skill.Repair;
Навык: Починка
ch.skill.Defence;
Навык: Защита
ch.skill.Commerce;
Навык: Коммерция
ch.skill.Sneak;
Навык: Шпион
ch.Ship.Name; [S]
Название корабля
ch.Ship.Type; [S]
Тип корабля
ch.Ship.Cannon.Type; [S]
Тип пушек
ch.Nation; [S]
Нация
worldmap.islands.ОСТРОВ.label.text; [S]
Название острова
worldmap.islands.ОСТРОВ.label.icon;
Флаг острова (0 - Англия, 1 - Голландия, 2 - Франция, 3 - Португалия, 4 - Испания, 5 - ???Пираты???)
worldmap.islands.ОСТРОВ.label.visible; [B]
Видимое название острова или нет (true - видимое, false - невидимое)
worldmap.islands.ОСТРОВ.position.x;
Позиция острова по оси X
worldmap.islands.ОСТРОВ.position.y;
Позиция острова по оси Y
worldmap.islands.ОСТРОВ.position.z;
Позиция острова по оси Z
Environment.time;
Время
Rumour[0].state;
Состояние слуха 1
Rumour[1].state;
Состояние слуха 2
Rumour[2].state;
Состояние слуха 3
Rumour[3].state;
Состояние слуха 4
Rumour[4].state;
Состояние слуха 5
Rumour[5].state;
Состояние слуха 6
Rumour[6].state;
Состояние слуха 7
Rumour[0].text;
Текст слуха 1
Rumour[1].text;
Текст слуха 2
Rumour[2].text;
Текст слуха 3
Rumour[3].text;
Текст слуха 4
Rumour[4].text;
Текст слуха 5
Rumour[5].text;
Текст слуха 6
Rumour[6].text;
Текст слуха 7
Есть еще очень-очень много экшенов. Экшены можно придумывать и самим. ;-))
Примеры:
1) Мы хотим прибавить нам 3000 золотых. В диалоге пишем:
ch.money = ch.money + 3000;
2) Мы хотим, чтобы у нас было 7000 золотых. В диалоге пишем:
ch.money = 7000;
3) Мы хотим сменить диалог у персонажа Ronald Tirberg. ID этого персонажа пусть будет
равен 91. В диалоге пишем:
Characters[91].Dialog.Filename = "Ronald Tirberg_sample.c";
Конечно, в Pirates of the Caribbean все диалоги можно поместить в один файл. Так что
этот экшен может не понадобиться.
4) Мы хотим сменить лицо нашему герою (например, Блейзу) на пирата (смотрите в авторах ;-).
Имя файла этого пирата - face_20.tga.tx. ID Блейза - 0. В диалоге пишем:
Characters[0].FaceId = "19";
Вы думаете я ошибся? Нет! Когда вы хотите применить, например, 18 лицо, то
уменьшайте ее, пишите 17, когда 15, пишите 14 и т.д. Вот так!
5) Например, квест разгромить остров Redmond. Короче выполняем квест. И остров теперь
никому не принадлежит (название на карте нет, а сам остров виден). Так надо прописать:
worldmap.islands.redmond.label.text = "";
worldmap.islands.redmond.label.visible = "false";
Хотя можно и не писать первую строчку ;-).
6) Выкинем персонажа Peter Bolt из игрового пространства. Его ID - 77. Пишем в диалоге:
Characters[77].location = "none";
Characters[77].group = "characters";
Characters[77].locator = "none";
Первая строчка удаляет локацию персонажа, вторая - это тип (он так и остается),
третья - удаляет место локации.
Но я думаю, что использование ch.money = ch.money + 3000 не совсем хорошее. Я
обычно использую: ch.money = makeint(ch.money) + 3000
Конечно такая запись экшена чуть-чуть подлиннее, но зато лучше, потому что деньги
и т.п. - это string (т.е. в записи могут содержаться и буквы и цифры), а мы прибавляем integer (т.е. могут содержаться только цифры) в первом случае.
Действия:
LaunchHireCrew();
Нанять людей в команду
LaunchShipyard();
Верфь
LaunchStore(ТИП);
Магазин. Вместо ТИП надо писать STORE_ONE или STORE_TWO
LaunchCannons();
Установка пушек на корабль
LaunchCharacter(GetMainCharacter());
Показать информацию о главном герое
LaunchShipHold();
Показать трюм корабля
LaunchMainMenu();
Показать меню игры
Я так же хочу рассказать о переключателе (switch). Привожу
пример. В процессе игры мы сменяем главного героя с Блейза на нищего. Подойдя
к одному персонажу, у которого в диалоге "живут" переключатели, до смены Блейза на
нищего, он отвечает: "О, это ты Блейз...". После смены: "Я не подаю нищим. Иди отсюда...".
Вот, что можно делать с помощью переключателей. Переключатели используются и в функциях, например,
старая функция (когда еще не говорили, что Даниэлы не будет):
string PCharPhrase (string Var1, string Var2)
{
ref PlayerCharacter = GetMainCharacter();
switch(PlayerCharacter.id)
{
case "Blaze":
return Var1;
break;
case "Danielle":
return Var2;
break;
}
return "___Player Character is not defined - can't select character phrase___";
}
Эта функция использовалась при выборе диалога NPC при определенном главном герое.
Если это был Блейз, то один вариант, а если Даниэла, то другой.

Пишем новости
В отличие от первых Корсаров новости располагаются не в файле диалога, а в отдельном файле.
Слухи можно включать и выключать. Например, два персонажа могут рассказать одинаковые новости.
При последующем разговоре с этими NPC они могут рассказывать разные слухи. Вот так! Ну теперь
начнем "делать" свои новости. ;-) Для этого нам потребуется файл Rumour_data.c, лежащий в
директории PROGRAM\Dialogs\. Открываем его и мы видим что-то типа:
#define MAX_RUMOURS 7
#define MAX_NPC_INFO 600
object Rumour[MAX_RUMOURS];
string NPC_information[MAX_NPC_INFO];
void SetRumourDefaults()
{
Rumour[0].text = "Последнее время ничего интересного не говорят. Жизнь течет спокойно и мирно. Просто диву даешься!";
Rumour[0].state = "active";
Rumour[1].text = "Говорят, что на рудниках Фале де Флер откопали какие-то остатки туземных захоронений. Всякие глиняные таблички, кости, копья и посуду. И ни грана золота!";
Rumour[1].state = "active";
Rumour[2].text = "Я слышал, что губернатор Редмонда как-то приказал посадить купца в тюрьму за небольшую драку в таверне только потому, что ему захотелось наложить лапу на груз, привезенный тем купцом.";
Rumour[2].state = "active";
Rumour[3].text = "Я слышал, что губернатор Редмонда как-то приказал посадить купца в тюрьму за небольшую драку в таверне только потому, что ему захотелось наложить лапу на груз, привезенный тем купцом.";
Rumour[3].state = "active";
Rumour[4].text = "Я слышал, что губернатор Редмонда как-то приказал посадить купца в тюрьму за небольшую драку в таверне только потому, что ему захотелось наложить лапу на груз, привезенный тем купцом.";
Rumour[4].state = "active";
Rumour[5].text = "Я слышал, что губернатор Редмонда как-то приказал посадить купца в тюрьму за небольшую драку в таверне только потому, что ему захотелось наложить лапу на груз, привезенный тем купцом.";
Rumour[5].state = "active";
Rumour[6].text = "Я слышал, что губернатор Редмонда как-то приказал посадить купца в тюрьму за небольшую драку в таверне только потому, что ему захотелось наложить лапу на груз, привезенный тем купцом.";
Rumour[6].state = "active";
}
Всего установлено 7 слухов. Чтобы сделать побольше надо изменить число 7 в строке
#define MAX_RUMOURS 7. Я поменял на 8. Если вы заметили active, passive,
и не знаете что это такое, так вот active - слух активен (может появиться в диалоге), а passive -
слух неактивен (не может появиться в диалоге). Чтобы добавить новый слух надо установить значение MAX_RUMOURS на нужное
вам, затем добавить две строчки (на один слух). Выглядят они примерно так:
Rumours[8].text = "Здесь надо вписать текст слуха";
Если слух активен, то тогда вот еще строчка:
Rumours[8].state = "active";
Иначе вот:
Rumours[8].state = "passive";
Вместо числа 7 надо вписать ID слуха. Например, если в игре всего 20 слухов (0..19), и
вы хотите добавить 21-ый слух, то надо вписать ID слуха = 20. И т.д. (Ежели кто не понял, почему 20, то объясняю - всего то 20 + 1 = 21. Почему у меня 21, да потому что нумерация идет
от 0 до 20).

Globals.c
В этом скриптовом файле расположены некоторые функции и всякие переменные. Я думаю,
что редактировать функции не нужно, а вот изменять значение переменных надо. Например,
если в игре 600 персонажей и если мы захотим сделать еще хоть одного, то он не появится.
Игра вылетит. Для того чтобы увеличить максимальное значение персонажей и т.д., надо немного
поизменять этот файлик. Там переменные поделены на секции (math, bool, nation, characters, sound).
В секции Math расположены переменные PI, PI * 2 и PI / 2. Я думаю их редактировать ненадо.
Дальше идет секция Bool, где располагаются переменные true и false и их значение. Их
редактировать тоже незачем. Затем идет секция Nation. Если вы каким-то образом хотите создать
новую нацию, то увеличьте значение MAX_NATIONS на 1. Идем дальше. Секция Characters. В ней
расположены много переменных. Максимальное значение персонажей в игре установлено как 600. Это
значение можно изменить, если хотим добавить новых персонажей (MAX_CHARACTERS). Фантомных
персонажей (это те, у которых нет локации) установлено как 550 (FANTOM_CHARACTERS). Почему-то
в эту секцию попадают переменные островов и локаций. Ну ладно. Максимальное число локаций
установлено как 128 (MAX_LOCATIONS). Если хотите - можете изменить. Максимальное число островов
установлено как 8 (MAX_ISLANDS). Тоже можете изменить. Ну а рассматривать секцию Sound не будем.

Секреты локаций
Если вы внимательно изучали каталог MODELS, который расположен в папке
RESOURCE, то вы, наверное, видели файлы моделей островов. Вот все
файлы-модельки острова Redmond:
City_Redmond_4_patch.gm
City_Redmond_1.gm
City_Redmond_1_fonarD.gm
City_Redmond_1_fonarN.gm
City_Redmond_1_locators.gm
City_Redmond_2.gm
City_Redmond_2_dno.gm
City_Redmond_2_fonarD.gm
City_Redmond_2_fonarN.gm
City_Redmond_2_fontain_bottom.gm
City_Redmond_2_fontain_reflection.gm
City_Redmond_2_fontain_water.gm
City_Redmond_2_locators.gm
City_Redmond_2_patch.gm
City_Redmond_2_river.gm
City_Redmond_2_under_river.gm
City_Redmond_3.gm
City_Redmond_3_fonarD.gm
City_Redmond_3_fonarN.gm
City_Redmond_3_locators.gm
City_Redmond_3_patch.gm
City_Redmond_4.gm
City_Redmond_4_dno.gm
City_Redmond_4_fonarD.gm
City_Redmond_4_fonarN.gm
City_Redmond_4_locators.gm
City_Redmond_4_patch.gm
City_Redmond_4_patch_D.gm
City_Redmond_4_patch_N.gm
City_Redmond_4_rinok.gm
City_Redmond_4_river.gm
City_Redmond_4_under_river.gm
Видите файлы City_Redmond_n_locators.gm,
где n - номер определенной локации. Вы, наверное, не поняли, например, на улице Редмонда
мы заходим в таверну. Но почему в таверну? Почему ли не в магазин (на месте таверны)? Если вы смотрели
локации острова, то могли видеть лишь имена локаций, но не видели координат локаций. Почему так происходит?
Я сначала тоже не понимал, но потом...додумался. Поглядев, что это за файлы с _locators.gm на конце,
можно увидеть всякие имена локаций. Додумались? Например, у нас есть моделька таверны. все
двери там обозначены своими именами, причем такими же именами как и в файле локаций. В игре, подходя
к какой-нибудь двери мы переходим к следующей локации и к следующей модели. Имя той двери было
указано в файле локации, а также был указан переход к следующей локации и модели. Это делается
довольно легче, чем в первых Корсаров.

Каталог RESOURCE
Этот каталог содержит всякие текстуры, модели, звуки, музыку и т.п.

Каталог RESOURCE: Файлы
Здесь я не буду описывать файлы, так как в корне этого каталога их нет. Но я опишу чем редактируются
эти файлы. Вот список расширений файлов этого каталога:
*.gm - модели (Maya - только экспорт!)
*.tx - текстуры (TX Converter)
*.ani - анимация (Maya - только экспорт!)
*.cam - анимация камеры (Maya - только экспорт!)
*.ini - настройки чего-либо (текстовой редактор)
*.col - освещение (внутренний редактор)
*.wav - звуки (звуковой редактор)
*.mp3 - музыка (хороший звуковой редактор)
*.tpd - патч геометрии (Maya - только экспорт!)
Ну вот и все расширения ;-).

Использование TX конвертера
TX Converter - доработанная версия TF Converter'а для первых Корсаров. Вы не сможете
открыть tx-файл TF конвертером. В TX конвертере изменения:
1) возможность сжатия файлов по DXT компрессии
2) теперь не нужно делать настройки файла для конвертации в TGA
3) совсем другой формат ;-)
Ну ладно начнем со скриншота!

Начнем разбираться. Предположим, вы уже создали текстуру в формате TGA. Обзовем
ее как mytexture.tga. Запускаем конвертер. У нас в глаза
сразу бросаются три окна. Левое и правое окна - директории, в которой располагаются
текстуры, а среднее окно - сама картинка текстуры и различные параметры. Пусть левое окно - где наша текстура,
правое окно - каталог TEXTURES игры. В левом окне нажимаем на файл нашей текстуры mytexture.tga.
В среднем окне появилось изображение нашей текстуры. За ползунок мы можем увеличивать/уменьшать
размеры текстуры. Напротив ползунка написано, что-то вроде 1.0 : 1.0 . Это если мы не
двигали ползунок. Первая цифра - размер текстуры после движения ползунка вправо, вторая - размер
текстуры после движения ползунка влево. Максимальное значение - 4.0 : 1.0 или 1.0 : 4.0 .
Ниже надпись - путь к текстуре. Еще ниже - размер текстуры, Битность, Альфа-канал,
мипы и другие настройки текстуры. За этой строкой - размер текстуры после движения ползунка,
опять битность и альфа-битность. ;-)) Также хочу сказать, что рядом с надписью
имя файла (в левом и правом окошках) написан размер текстуры и ее битность.
Теперь рассмотрим меню. Оно состоит из пункта Convert и пункта Exit. Convert -
конвертация, Exit - выход из конвертера. При нажатии на пункт Convert появится
окошко, где нужно выбрать настройки текстуры (если вы конвертируете из tga->tx). Если
вы конвертируете из tx->tga, то у вас спросят, точно ли собираетесь вы конвертировать. ;-)
Ну ладно перейдем к окошку Convert. Там можно поменять мипы, copy lines (не знаю что это!),
параметры текстуры (битность, компрессию и т.п.). Ну и все!

Создаем свою 3D-модель
Создать свою красивую 3D-модель нелегко. Для это нам потребуются:
3D-редактор (Maya 3.0 или 4.0, т.к. Акелла работает в нем)
Плагин для экспорта модели в Pirates of the Caribbean (для Maya)
У меня стоят два 3D-редактора - Maya 4.0 и 3D Studio Max 4.2. Плагин у меня есть,
но вот в чем проблема, у вас его то нет. Не знаю, как вы его найдете, но все же.

Создаем свою 3D-модель: Загружаем плагин
Предисловие. Раньше я работал в Maya, затем перешел на 3D Studio Max. Я создаю 3D-модель в
3D Studio Max. Затем с помощью плагина Max To Obj я экспортирую созданную
мною модель в формат OBJ, который понимает Maya. Затем я загружаю Maya и
экспортирую мою модельку (теперь уже obj-формата) в формат игры Pirates of the Caribbean.
На практике: Предположим, что у вас есть Maya, вы владеете основными навыками
моделирования и у вас уже есть моделька. Подключите плагин. Для этого щелкните
мышкой на меню Window -> Settings/Preferences -> Plug-in Manager. Откроется
окно с выбором плагинов. Можно подключить все плагины для игры Pirates of the Caribbean.
Напротив SD2GeoExport.mll поставьте галочку с надписью loaded, так же можно
поставить галочку с надписью auto load (в этом случае плагин будет запускаться,
когда вы будете запускать редактор). Проделайте все это и с остальными плагинами
(SD2AniExport, S2DCamExport). Примечание: Если у вас в Plug-in Manager
нет этих плагинов, то надо поместить плагины в папку bin\plug-ins каталога Maya.
Но при этом надо перезапустить программу. Так же можно и нажать на кнопку Browse
и выбирать все эти плагины (SD2GeoExport.mll, SD2AniExport, S2DCamExport.mll).
И еще одно примечание: Если при загрузке плагинов Maya выдает ошибку, то значит
надо подключать плагины SD2AniMaya3.mll, SD2GeoMaya3.mll. Это значит, что у вас
3-я версия Maya. Заметьте, что на остальные версии Акелла плагинов не сделала.

Создаем свою 3D-модель: Скриншот редактора
Вот скриншот 3D-редактора Maya 4.0.


Создаем свою 3D-модель: Экспортируем в игру
Загружаем созданную нами модельку. Если вы сейчас будете
экспортировать модельку в игру, то у вас ничего не получиться. ;-)) Создайте
Locator (Create -> Locator) и присоедините к нему вашу модельку (можно с помощью
Outliner'а). Затем выберите созданный Locator. С помощью меню File -> Export All
экспортируем в игру нашу модель. В типе файла следует указать SD2GeoExport.
(если у вас Maya 3, то тогда - SD2GeoMaya3). Напишите имя файла (без расширения)
и пока не нажимайте кнопку Export. Вам нужно выбрать настройки файла с помощью
кнопки Options. File Type - SD2GeoExport (Maya 3 - SD2GeoMaya3). Поставьте
галочку Default File Extensions. В свитке File Type Specific Options можно
(и даже нужно) поставить галочку 0.01 Scale (cm->m). Учтите, что скалировать
модельку надо много. Ну а дальше с настройками вы сами разберетесь методом тыка.
;-) Не забудьте нажать на кнопку Export All. ;-) Все готово! Поздравляем!

Шейдеры
Редактировать шейдеры - вещь, довольно не легкая. Итак, заходим в нам ранее неизвестную
директорию MODULES\TECHNIQUES\. Там храняться все шейдеры.
Их не так уж и мало. Я не смогу описать все-все шейдеры, так как редактировать их я почти не умею,
так слегка. Этот раздел я написал как FAQ, то есть вопрос - ответ.
1. Как сделать прозрачный фон диалога?
Название шейдера - dialog.sha и лежит он в каталоге Render.
За прозрачность фона отвечает AlphaTestEnable. Меняем значение этой
переменной на true.
2. Как сделать непрозрачный фон диалога?
Название шейдера - dialog.sha, лежит в каталоге Render.
За полупрозрачность фона диалога отвечает AlphaBlendEnable. Нам нужно сделать
непрозрачный, значит заменим значение этой переменной на false
3. Как сделать непрозрачный фон диалога?
Название шейдера - dialog.sha, лежит в каталоге Render.
За полупрозрачность фона диалога отвечает AlphaBlendEnable. Нам нужно сделать
непрозрачный, значит заменим значение этой переменной на false

Дополнение
В этот раздел входят документации из новых версиях Полезных Мелочей.

Дополнение: Языки
Вы можете создать свои языки, но, для того чтобы полностью создать свой язык в игре, надо
переделать диалоги, персонажей и т.д. В этом разделе описывается только изменения всяких надписей в игре, но не диалогов.
Если вы все-таки решились, то сначала установите свой язык вместо старого. Для этого
откройте файл language.ini, лежащий в RESOURCE\INI\INTERFACES\.
В разделе LANGUAGE этого файла можно найти переменную sLanguage.
Старые языки можно закомментировать, используя символ ; .
Итак, вот как его правильно оформить:
sLanguage = ЯЗЫК, ФАЙЛ ЯЗЫКА В СОКРАЩЕНИИ_str.ini
ЯЗЫК - это полное название языка по-английски (пример: Russian, English, Swedish).
ФАЙЛ ЯЗЫКА В СОКРАЩЕНИИ - это сокращенное название языка по-английски (пример: rus, eng, swe).
Пример:
;sLanguage = English, eng_str.ini
sLanguage = Russian, rus_str.ini
Естественно, файл должен называться также (пример: eng_str.ini, rus_str.ini, swe_str.ini).
Теперь рассмотрим сам файл языка. В кавычках замените русские слова на слова вашего языка. Еще
замените первую строчку (пример: ; ini file for swedish stringes).
; ini file for russian stringes
; titles
string = titleCannons,"ПУШКИ"
string = titleShip,"КОРАБЛИ"
string = titleCharacter,"ПЕРСОНАЖ"
string = titleControls,"УПРАВЛЕНИЕ"
string = titleStore,"МАГАЗИН"
string = titleHelp,"ПОМОЩЬ"
string = titleShipyard,"ВЕРФЬ"
string = titleShipHold,"ТРЮМ КОРАБЛЯ"
string = titleHireCrew,"НАБОР КОМАНДЫ"
; Cannon names and types
string = Cannon,"Пушка"
string = Culverine,"Кулверина"
string = caliber12,"12 Калибр"
string = caliber16,"16 Калибр"
string = caliber24,"24 Калибр"
string = caliber32,"32 Калибр"
; Cannon parameters
string = Fire range,"Дальность стрельбы"
string = Reload time,"Время перезарядки"
; Sell/Buy stringes
string = Cost,"Стоимость"
string = Install,"Установить"
; Ships
string = Tartane,"Тартана"
string = Yacht,"Яхта"
string = Schooner,"Шхуна"
string = Barque,"Барка"
string = Brig,"Бриг"
string = Caravel,"Каравелла"
string = Corvette,"Корвет"
string = Frigate,"Фрегат"
string = Fleut,"Флейт"
string = Lugger,"Люгер"
string = Galeon,"Галлеон"
string = Battleship,"Бэттлшип"
string = Xebec,"Ксебека"
; Ships parameters
string = Hull,"Корпус"
string = Sails,"Паруса"
string = Crew,"Команда"
string = Cannons,"Пушки"
string = Speed,"Скорость"
string = Maneuver,"Маневренность"
string = Max.Caliber,"Макс. Калибр"
string = Max.Crew,"Макс. Команда"
string = Min.Crew,"Мин. Команда"
string = Capacity,"Вместимость"
; Character skills
string = Leadership,"Лидерство"
string = Fencing,"Фехтование"
string = Sailing,"Навигация"
string = Accuracy,"Меткость"
string = Grappling,"Абордаж"
string = Repair,"Починка"
string = Defence,"Защита"
string = Commerce,"Коммерция"
string = Sneak,"Шпион"
string = Free Skill Points,"Нераспределенных очков умений"
; interface button names
string = BUY,"КУПИТЬ"
string = SELL,"ПРОДАТЬ"
string = OK,"ДА"
string = CANCEL,"ОТКАЗАТЬ"
string = Quantity,"Количество"
string = Free,"Свободно"
string = Ship,"Корабль"
string = Store,"Магазин"
; interface menu
string = New Game,"Новая игра"
string = Load,"Загрузка"
string = Save,"Сохранить"
string = Options,"Опции"
string = Credits,"О разработчиках"
string = Quit,"Выход"
; controls interface stringes
string = First Person View,"Вид от первого лица"
string = Cicle Demo Locations,"Cicle Demo Locations"
string = Fire cannons,"Fire cannons"
string = Move camera,"Перемещение камеры"
string = Memory card,"Карта памяти"
string = Empty slot,"Пустой слот"
string = Move ship,"Перемещать корабль"
string = Back,"Назад"
string = Start,"Старт"
string = Not Used,"Не используется"
string = Quantity:,"Количество:"
string = Free:,"Свободно:"
string = Fix All!,"Полностью!"
string = Sell Ship,"Продать корабль"
string = ship sell confirm,"Вы хотите продать корабль"
string = shipyard confirm 2,"для "
string = ship buy confirm,"Вы хотите купить корабль"
; reputations
string = Horror of High Seas,"Гроза морей"
string = Bloody Bastard,"Кровавый ублюдок"
string = Cynic Swindler,"Циничный мерзавец"
string = Quirky Rascal,"Беспринципный негодяй"
string = Neutral,"Нейтральная"
string = Plain Fellow,"Приятный человек"
string = Good Matey,"Отличный парень"
string = Very Good,"Очень хорошая"
string = Hero,"Герой"
; morales
string = Treacherous,"Ужасная"
string = Awful,"Отвратительная"
string = Low,"Плохая"
string = Poor,"Низкая"
string = Normal,"Средняя"
string = Elated,"Приподнятая"
string = Good,"Хорошая"
string = High,"Высокая"
string = Excellent,"Отличная"
string = Heroic,"Героическая"
; main menu stringes
string = New Game,"Новая игра"
string = Load,"Загрузить"
string = Save,"Сохранить"
string = Options,"Опции"
string = Credits,"О разработчиках"
string = Quit,"Выход"
; ship hold buttons
string = Discard,"Отмена"
string = All,"Все"
string = Ok,"Ок"
; context help stringes
string = chelp_common#1,"Нажите 'B' для возврата"
string = chelp_common#2,"Выбор корабля клавишей 'A'"
string = chelp_common#3,"Влево\вправо - изменять значение"
string = chelp_cannons#1,"Нажмите 'A' для замены пушек"
string = chelp_cannons#2,"Влево\вправо - выбор орудия"
string = chelp_cannons#10,"Слишком большой калибр для корабля"
string = chelp_cannons#11,"У Вас уже установлено это орудие"
string = chelp_cannons#12,"У Вас не хватает денег на поккупку"
string = chelp_cannons#13,"Вы установили орудие на корабль"
string = chelp_store#1,"Влево\вправо - выбор товара"
string = chelp_store#2,"Нажмите 'A' для покупки товара"
string = chelp_store#3,"Нажмите 'A' для продажи товара"
string = chelp_store#4,"Нажмите 'A' для подтверждения"
string = chelp_store#5,"Нажмите 'A' для отмены"
string = chelp_shiphold#1,"Влево\вправо - выбор товара"
string = chelp_shiphold#2,"нажмите 'A' для сбрасывания товара"
string = chelp_shiphold#3,"Нажмите 'A' для отмены сбрасывания"
string = chelp_shipyard#1,"Влево\вправо - смена корабля"
string = chelp_shipyard#10,"У Вас нет корабля для продажи"
string = chelp_shipyard#11,"У Вас нет денег на покупку корабля"
string = chelp_shipyard#12,"У Вас нет такого корабля"
string = chelp_shipyard#13,"У Вас нет капитана на корабль"
string = chelp_shipyard#14,"Вы не можете продать свой корабль"
string = chelp_hirecrew#1,"Нажмите 'A' для набора команды"
string = chelp_hirecrew#2,"Нажмите 'A' для увольнения команды"
string = chelp_hirecrew#10,"Нет денег для найма"
string = chelp_hirecrew#11,"Нет больше людей"
; hire crew strings
string = Hire,"Набрать"
string = Fire,"Уволить"
string = Available for hire:,"Свободно людей:"
string = Cost:,"Стоимость:"
string = Morale:,"Мораль:"
string = Cancel,"Отмена"
; goods name strings
string = Balls,"Ядра"
string = Grapes,"Картечь"
string = Knippels,"Книпеля"
string = Bombs,"Бомбы"
string = Sailcloth,"Парусина"
string = Planks,"Доски"
string = Slaves,"Рабы"
string = Wheat,"Пшеница"
string = Ebony,"Черное дерево"
string = Chocolate,"Шоколад"
string = Sugar,"Сахар"
string = Wine,"Вино"
string = Linen,"Лен"
string = Rum,"Ром"
string = Tobacco,"Табак"
string = Coffee,"Кофе"
string = Mahogany,"Красное дерево"
string = Cinnamon,"Корица"
string = Copra,"Копра"
string = Paprika,"Перец"
string = Fruits,"Фрукты"
string = Ale,"Эль"
string = Silk,"Шелк"
string = Clothes,"Одежда"
string = Cotton,"Хлопок"
string = Sandal,"Сандалия"
string = Leather,"Кожа"
string = Oil,"Масло"
После редактирования некоторые надписи будут изменены. Дальше можно попробовать поредактировать
текстуры, некоторые скрипты.

FAQ
1. Вы можете выслать мне плагин для Maya (to .GM), пожалуйста?
Извини, не могу!
2. А где взять плагин Max to Obj и обратно (3dsmax)?
www.maxplugins.de
3. Можно ли создавать свои модули (*.dll)?
Да! Он загрузится только если в заголовке присутствует DMA Interface!
4. Я создал персонажа, а игра вылетает. В логе пишет:
ERROR - file: characters\characters_init.c; line: 320
Incorrect index. Что делать?
Это происходит, наверное, потому что количество персонажей в игре превысило
допустимое значение. Проверьте файл globals.c. Проверьте переменную MAX_CHARACTERS.
Затем проверьте файл Characters_init.c. Если последний персонаж имеет ID > MAX_CHARACTERS,
то увеличьте значение MAX_CHARACTERS или уберите нескольких персонажей.
5. Что это вообще такое ID?
ID - идентификация (номер). В characters_init.c ID назначается makeref(ch,Characters[ID]);
6. У меня Windows 98. Я устанавливаю Maya, но он говорит что-то об NT. Что это такое?
Для Maya 4.0 нужен Windows NT или Windows 2000. На других ОС установка не запустится (или Maya не загрузится ;-).
7. Я создал диалог, а в нем не помещается пол текста. Что делать?
Нужно ставить \n. Пробелы между \n не ставятся!
8. Где можно найти TX Converter?
Нигде! В Интернете его нет!
9. Как вставить комментарий?
// Комментарий
/* Это тоже комментарий,
только с переходом на другую строку */
Автор

Полезные мелочи написал - Кулаев Алексей aka Lesha
Полезные мелочи были написаны с применением демки игры Корсары 2 и с
последующим ребуилдом на Pirates of the Caribbean!
E-mail: dino11@yandex.ru
Сайт: http://seaaddon.fatal.ru
Огромное спасибо Акелле! ;-))