![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
Dogeva |
![]()
Сообщение
#1
|
Расплетающая Сновидения ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: форумчанин Сообщений: 852 Регистрация: 10-February 06 Пользователь №: 2,632 ![]() |
предлагаю всем добрым и умным человекам
![]() ![]() ![]() для примера приведу пост, найденный в "Готовых интерфейсах": ФАК по созданию собственного интерфейса в ВМЛ. Введение. Для того чтобы создать интерфейс в ВМЛ, разработчикам пришлось придерживаться нескольких правил: 1-е правило из которых было создать мультиплатформенную систему интерфейса (для ПК и консоли Xbox), что означает приминение не только указателя мыши, но и кнопок джойстика. Для удобства управления джойстиком ессесно нужно чтобы иконки, кнопки и другие элементы управления находились в четырех (максимум для крестика геймпада) сторонах. В то же время, мышью по ним тоже можно тыкать, но это уже не интересно для ПК-шников. Поэтому команда аддонтима переделывала интерфейс под привычную компьютерную мышь. Для этого им пришлось полностью перевернуть кверх дном каталог "игра\RESOURCE\INI\INTERFACES", где на языке С-подобном приписаны координаты элементов управления интерфейсом (кнопки, иконки, фоны и др.), цветовая гамма, анимация фона и др. полезные вещи. Естесственно в этих *.ini файлах прописаны названия текстур этих самых элементов. Вот о них-то нам и нужно знать... Начнем. Каждый для себя может делать свой интерфейс и в *.ini файлах, но эти файлы еще в стадии разработки и, поэтому, их редактировать смысла мало - все-равно с каждым обновлением они меняются (ну, почти с каждым). Мы будем переделывать файлы текстур для ПКМ и ВМЛ. Чтобы их переделать, нужно иметь под рукой Фотошоп, tx_convertor, запущенную игру ВМЛ в оконном! режиме, мозги, руки и... кофе. - Почти каждая текстура имеет альфа-канал, нужно уметь с ним работать - ПРАВКА!!! - Для того, чтобы правильно отредактировать альфа-канал в текстуре см. самый конец ФАК'а - раздел HELP. - Почти каждая текстура разделена на несколько более мелких, не накладывайте одну на другую, старайтесь не менять положения иконок - Все текстуры сохранены в формате *.tga.tx - т.е. они открываются в tx_converter, конвертируются в формат *.tga, ред-ся в Фотошопе, а потом конв-ся в *.tga.tx. - Если возникают вопросы, спрашивайте на форуме, не надо почты!!! на форуме много народа, которые знают тоже, что и я... - ПРАВКА!!!: вверху при конвертировании из tx и обратно, вверху и внизу ставим на A8R8G8B8... справа "none", внизу всего: (*)minimum mip size, и слайдер влево до упора (1 pix) Каталоги, которые нам необходимы (я бы на вашем месте перед работой сделал бы их копию): 1. Resource\Textures\Interfaces - бОльшая часть всех элементов интерфейса 2. Resource\Textures\DIALOG - меню диалогов 3. Resource\Textures\BATTLE_INTERFACE - иконки действий в море, на суше 4. Resource\Textures\Fonts - в ней шрифты 5. Resource\Textures\Loading - *опционально, фоны при загрузках. 6. Resource\Textures\TextureSequence - фоны кнопок управления+анимация фона в главном меню * - этого я не редактировал, мне нравятся оригинальные. =====================================================Итак, начнем с 1-го: _"Resource\Textures\Interfaces" файлы, нам интересные, там есть много чего, но это по вашему желанию, я привел тока самое необходимое blank_ship.tga.tx - кораблика нет (иконка) buy_sell.tga.tx buySellFlags.tga.tx cannons.tga.tx - пушки (иконки) CorruptSave.tga.tx - редкость, но нада - иконка плохого сохранения Cursor32.tga.tx - курсор, меня устроил базовый DisketaEmpty.tga.tx | DisketaSave.tga.tx | текстуры из меню сохр\загр EmptyFace.tga.tx | EmptyBorder.tga.tx - пустая рамка (жел-но схожая из icons.tga.tx) ExchangeButtons.tga.tx - кнопки меню обмен FortPris.tga.tx - заставка при захвате форта glowbutton.tga.tx - подсветка кнопок (мона закрасить черной альфа, она исчезнет) goods.tga.tx - иконки товаров Hold.tga.tx - изображение трюма в меню покупок icons.tga.tx - самое большое сборище всех основных элементов (не забудьте про альфа-канал!!!) icons_spec.tga.tx - дополнительные элементы управления (в том числе крестик закрытия окна) items1-11.tga.tx - иконки вещей, самый настоящий гемор переделки:) old_map.tga.tx - на фоне главного меню игры есть старая карта, перемещающаяся по экрану в разные стороны, это она и есть (я переделал в дым: Photoshop->фильтр dClouds) perkuse.tga.tx - галка применяемого перка scroll.tga.tx - фон для меню журнала, статистики, цен на товары... ship_status.tga.tx - иконки состояния: Корпус\Паруса\Пушки\Команда из меню корабля Slider_line\line_base\pointes.tga.tx - слайдеры из меню настроек яркости, звука... small_islands.tga.tx - острова из меню торговли (импорт\экспорт\контрабанда, там они вверху прокручиваются) Store.tga.tx - (из темы Hold.tga.tx) - изображение склада магазина в меню торговли swapItem.tga.tx - (из темы ExchangeButtons.tga.tx) кнопка обмена вещами usedflag.tga.tx - тоже самое в perkuse.tga.tx только для чего-то другого z_salay.tga.tx - заставка выдачи зарплаты ...Продолжаем... _"Resource\Textures\Interfaces\Circle" circle1.tga.tx | круги из главного меню ПКМ, да и в ВМЛ circle2.tga.tx | они тоже есть circle3.tga.tx - в игре не нашел... _"Resource\Textures\Interfaces\MainBack" - фоны в меню mb1.tga.tx mb2.tga.tx mb3.tga.tx - фон в главном меню ship copy.tga.tx _"Resource\Textures\Interfaces\Perks" - *опционально, по желанию _"Resource\Textures\Interfaces\Portraits" - *опционально, по желанию \128 - 128x128, 16bpp цвет \64 - 64x64, 16bpp цвет \64Disable - 64x64, 16bpp черн\бел =====================================================Следующий - 2й _"Resource\Textures\DIALOG" dialog.tga.tx - Здесь интерфес общения со всеми npc, да, и только здесь (был где-то еще, но он для ПКМ) =====================================================Следующий - 3й _"Resource\Textures\BATTLE_INTERFACE" Здесь расписывать не буду, там все по идее надо менять (что я и сделал), но скажу лишь про некоторые непонятные файлы: Panel.tga.tx - фон, где отображается все, что видно в подзорную трубу compass.tga.tx - Компасс - гемор, альфа канал и текстура, постоянно глючат. Кому надо пример переделки ко мне на почту (sonik-a@narod.ru) ir_buttons - не нужна ваще (для Xbox) =====================================================Следующий - 4й _"Resource\Textures\Fonts" Здесь шрифты, сами разберетесь. Лично я менял тока цветовую гамму (под желтовато-коричневый, симпатишно:) =====================================================Следующий - 5й _"Resource\Textures\Loading" Описанию тож не поддается, все фоны загрузок, добро пожаловать:) progress.tga.tx - всеми любимый крутящийся череп, разложенный на кадры (чтобы заменить разложите любую анимацию на кадры в редакторе каком-нить специальном и вставьте) =====================================================Следующий - 6й _"Resource\Textures\TextureSequence" Фоны кнопок, волны морские. Я скопировал из К3 и добавил (уменьшив по вертикали в два раза) в текстуру ПКМ, чуть затемнил - получилось неплохо. ===???===HELP===???=== ===АЛЬФА-КАНАЛ В ТЕКСТУРАХ=== 1. ПРО Альфа-канал. Альфа-канал - используется в текстурах для разных вещей, например для прозрачности, формы... В ПКМ альфа-канал используется на всех текстурах. На некоторых есть какой-то черный вырез на белом фоне, на других полностью белый фон. Давайте представим флаг развивающийся на рее корабля в игре. Текстура, кроме как прямоугольной быть не может, а флаг надо заострить двумя треугольниками. Так как же это сделать? Очень просто - добавим новый канал к трем основным (красный, зеленый, голубой), который из этих трех основных будет показывать только ту часть, которую мы зарисуем, т.е. прямоугольник, в котором вырезан мааааленький треугольник. В альфа-канале (так его назвали) на черном фоне (ноль, цветная картинка не берется в изображение) рисуем флаг белого цвета (этот белый цвет есть единица, которая отображает цветную картинку там, где ее нарисовали), потом возвращаемся в rgb режим (выбирается там же) и добавляем уже что-то свое (иначе флаг будет цвета начального фона), например герб Франции. Так вот из этой запутаной басни уясним, что белый цвет в альфа-канале показывает, что под ним прячется (т.е. цветную картинку), а черный, наоборот - не показывает (т.е. обрезает ее в этом месте), серый (процент от 99% черного до 1%) задает степень прозрачности текстуры (цветной картинки). 2. КАК это делается. - Открываем в фотошопе, скажем icons.tga (уже конвертированную tx_converter'ом). - Лезем в меню окно (где "файл\редактирование\изображение..."), там выбираем строку "каналы", щелкаем по ней. - На экране появилось окно с черно-белом изображением, в котором показались контуры элементов текстуры icons.tga. - Далее заливаем все 50% серым в альфа канале (щелкаем по нему один раз в том окне, которое только открывали), сохраняем, конвертируем в ВМЛ, запукаем игру - смотрите-ка, все кнопки и другие элементы прозрачные. Уже немного яснее что енто. - Далее, не выходя из игры, сворачиваем ее (для этого нужно в настройках снять галку "полноэкранный режим"), откатываем одно действие назад в Фотошопе, опять контуры. - Теперь, изменим кнопку с черепами по бокам. В альфа канале в середине этой кнопки черный прямоугольник, что значит в этом месте она прозрачна. Если нужно сделать свой фон в этой кнопке, то переходим через окно "каналы" в полноцветный режим (вверху окна), заливаем серединку кнопки чем-нито своим и, зайдя в альфа-канал обратно, заливаем сей черный прямоугольник белым цветом (терь он будет нашего фона цветом) - Так можно каждую текстуру редактировать. Можно нарисовать, например свой perkuse.tga.tx, для этого открываем, конвертируем, открываем в Фотошопе, стираем старую галку, рисуем, создав новый слой, например перо, выделяем прозрачность слоя (для этого надо также как окно "каналы" открыть и окно "слои", зажать CTRL и выбрать наш новый слой с пером), далее лезем в "Выделение" (вверху Фотошоповского окна)->Сохранить выделение. Там откроется окно, просто жмем ОК. Появится новый альфа-канал. Старый удаляем (Правой кнопкой по старому каналу в окне "каналы"->УДАЛИТЬ). Теперь остается свести все слои (CTRL+E на англ. раскладке) и сохранить, заменив старую текстуру. - Теперь конвертируем в ВМЛ и разворачиваем игру. Играем с новой галкой в меню перков. Если не работает, то выйдите из игры и войдите снова. (Не забывайте про настройку tx_converter'а: A8R8G8B8 вверху и внизу) Позже дополню описание *.INI-файлов. Если чего забыл, поправьте меня!!! |
![]() ![]() |
Sonik |
![]()
Сообщение
#2
|
2D/3D Artist ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Seaward.Ru Team Сообщений: 711 Регистрация: 2-January 06 Из: Нижний Новгород Пользователь №: 2,093 ![]() |
Пользуясь случаем, хочу поблагодарить Догеву за предоставленный топик, давно хотел тему создать, да чего-то и позабыл. Постараюсь поддержать тему. ИТАК: далее Q (question) - вопрос, A (answer) - ответ...
Q: А вот спросить хотел: кто знает как прописать код (ИНИ) чтобы деталь в маин меню двигалась с лева на право? Кто знает скажите плиз! A: Очень просто, например, в INI\Interfaces\mainmenu.ini есть круги [circle1],2],3]. В 0124 это штурвал бледно синего цвета за кнопками управления главного меню. Так вот эти самые круги (circles) имеют технику крутиться, названная rotate: [CIRCLE1] - название элемента, он прописан в самом начале. Можно любое имя, тока в начале нужно не забыть прописать его порядок слоя. position = 80,10,560,490 - позиция, т.е. размещение на экране. techniqueName = iRotate - имя техники. Текстура крутиться и ее грани будут разглаживаться по краям экрана. Короче пробуй с ней и без нее, потом поймешь textureName = interfaces\circle\circle1.tga - ну это и дураку понятно, размещение тга-шной текстуры в формате *.tga.tx textureRect = 0,0,1.0,1.0 - это короче параметр количества прямоугольников на экране, его часть и т.д. Тоже нужно самому пробовать разные значения, тогда только поймешь color = 100,128,128,128 - прозрачность (0-255), красный, зеленый, голубой (если текстура, то этим значением определяется ее гамма по сумме трех параметров) ;rotate = 0.02,0.005 - это значение отменено символом ";" в начале строки rotate = -0.05,0.005 - если написано два ротэйта подряд, и оба без ";", то использоваться будет тот, что выше. Параметр rotate отвечает за скорость поворота текстуры влево (значение отрицательно) и вправо (значение положительно), второй параметр отвечает за ускорение поворота. Я в нем до конца и не разобрался. speed = 6000,0.0,0.0 - если отменить все rotate, и установить здесь второе и третье значение дробным или целым числом, то текстура будет двигаться по горизонтали (второе значение) или по вертикали (третье значение), если установлены оба - по диагонали. Точно так же как и в rotate значения могут быть как положительными, так и отрицательными (тоже влево\вправо, вверх\вниз) На счет первого значения я ничего не знаю. Любое число здесь ничего не меняет. Так вот чтобы картинка двигалась влево, то просто убери rotate и поставь значения speed = 6000,-1.0,0.0 - скорость прокрутки: 6000, горизонтально влево:1, вертикально: 0 а вправо speed = 6000,1.0,0.0 - скорость прокрутки: 6000, горизонтально вправо:1, вертикально: 0 //// единственная трабла в создании полноценной анимации в ВМЛ - каждые 30 секунд включается видео-заставка, которую невозможно отключить в связи с закрытым кодом, и после которой анимация начинается заново (даже после ручного сброса) |
Jaoquin De Masse |
![]() ![]()
Сообщение
#3
|
боцман ![]() ![]() ![]() ![]() Группа: форумчанин Сообщений: 131 Регистрация: 11-April 06 Из: Краснодарский к-р. Пользователь №: 3,072 ![]() |
Диалоги это главное
![]() ЗЫ: Собрал инфу по диалогам какая у меня была, короче вот… Цитата Диалоги - главные в игре. С помощью них можно не только разговаривать с 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. Если в квадратных скобках стоит буква Г, то эта переменная должна иметь значение true или false. Если в квадратных скобках стоит буква S, то переменная может содержать буквы. ch.Money; Деньги ch.Experience; Опыт ch.Rank; Ранг ch.Model; [S] Модель ch.Model.Animation; [S] Анимация ch.Model.Entity; [S] Тип модели ch.Dead; [Г] Мертвый или живой (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; [Г] Видимое название острова или нет (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). |
Jaoquin De Masse |
![]()
Сообщение
#4
|
боцман ![]() ![]() ![]() ![]() Группа: форумчанин Сообщений: 131 Регистрация: 11-April 06 Из: Краснодарский к-р. Пользователь №: 3,072 ![]() |
Создание островов, пользуйтесь на здоровие, все проверенно на 100%, если все сделали правильно то глюков не будет!
Я только начинал острова ковырять 2 недели мучался, теперь сделал 6 новых островов. Сейчас мучаюсь с перегоном острова из к3 в пкм. Откроем файл PROGRAM\WorldMap\worldmap_init.c Меняем значения на время работы на false: worldMap.debug = "false"; worldMap.evwin = "false"; worldMap.noenc = "true"; - Отвечает за генерацию энкоунтеров на карте(корабли, штормы)(true-вкл. false - выкл) Собственнно приступим к особенностям создания островов Я взял за основу Ямайка. Рассмотрим основные части: worldMap.islands. Jamaica.name = "Jamaica"; - ID острова worldMap.islands. Jamaica.position.x = -245.0; - Положение центра острова по оси x (запад-восток) worldMap.islands. Jamaica.position.y = 30.0; - Высота центра острова worldMap.islands. Jamaica.position.z = 370.0; - Позиция острова по оси z (север-юг) worldMap.islands. Jamaica.position.rx = -235.7; worldMap.islands. Jamaica.position.rz = 381.1; worldMap.islands. Jamaica.radius = 120.0; - Радиус острова worldMap.islands. Jamaica.kradius = 0.75; worldMap.islands. Jamaica.label.text = "Jamaica"; - Название острова, будет отображаться на карте worldMap.islands. Jamaica.label.icon = -1; - Флаг ОСТРОВА, ставим везде -1 worldMap.islands. Jamaica.label.visible = "true"; - Возможность показа названия (true-вкл. false-ыкл.), если выключено - то название появится после того, как Вы первый раз посетите остров. //ОБРАЗЕЦ ГОРОДА worldMap.islands. Jamaica.locations.city.name = "Jamaica"; - ID города worldMap.islands. Jamaica.locations.city.move = "false"; worldMap.islands. Jamaica.locations.city.position.x = -225.0; - Позиция города на карте по оси x (запад-восток) worldMap.islands. Jamaica.locations.city.position.y = 8.0; - Высота расположения города worldMap.islands. Jamaica.locations.city.position.z = 380.0; - Позиция города по оси z (север-юг) worldMap.islands. Jamaica.locations.city.position.ay = 0.0; worldMap.islands. Jamaica.locations.city.modelName = "town"; - 3D модель города worldMap.islands. Jamaica.locations.city.visible = "false"; - Возможность показа названия (true-вкл. false-выкл.), если выключено - то название появится после того, как Вы первый раз посетите город. worldMap.islands. Jamaica.locations.city.label.text = "Ямайка"; - Название города, будет отображаться на карте worldMap.islands. Jamaica.locations.city.label.icon = FRANCE; - Национальная принадлежность города (ENGLAND-Англия, FRANCE-Франция, SPAIN-Испания, PORTUGAL-Португалия, HOLLAND-Голандия, PIRATE-Пираты) worldMap.islands. Jamaica.locations.city.label.visible = "true"; - Показывание герба объекта (false-герба нет, true - есть) //ОБРАЗЕЦ БУХТЫ worldMap.islands. Jamaica.locations.city1.name = "FShore 1"; - ID бухты worldMap.islands. Jamaica.locations.city1.move = "false"; worldMap.islands. Jamaica.locations.city1.position.x = -210.300018; - Позиция бухты на карте по оси x (запад-восток) worldMap.islands. Jamaica.locations.city1.position.y = 2.905003; - Высота расположения бухты worldMap.islands. Jamaica.locations.city1.position.z = 411.800110; - Позиция бухты по оси z (север-юг) worldMap.islands. Jamaica.locations.city1.position.ay = 0.0; worldMap.islands. Jamaica.locations.city1.modelName = "leaf"; - 3D модель бухты worldMap.islands. Jamaica.locations.city1.visible = "false"; - Возможность показа названия (true-вкл. false-выкл.), если выключено - то название появится после того, как Вы первый раз посетите бухту. worldMap.islands. Jamaica.locations.city1.label.text = "Octopus Bay"; - Название бухты, будет отображаться на карте worldMap.islands. Jamaica.locations.city1.label.icon = -1; - Национальная принадлежность бухты, ставим -1 worldMap.islands. Jamaica.locations.city1.label.visible = "false"; - Показывание герба объекта (false-герба нет, true - есть) Вместо Jamaica пишете имя вашего острова, желательно без пробелов и, разумеется, на латинице. Города и бухты пишутся в порядке, который вы, наверное, уже заметили: т.е. сначала city, потом city1, city2 и т.д. независимо от того, город это или бухта. Координаты на карте отсчитываются от её центра, т.е. точка с координатами {x,y,z}={0,0,0} находится в середине карты. Модельки городов и бухт находятся в папке RESOURCE\MODELS\WorldMap Теперь спускаемся в самый низ файла и видим это: worldMap.playerShipX = 176.27; - Изначальная позиция корабля по оси x (запад-восток) worldMap.playerShipZ = 35.34; - Изначальная позиция корабля по оси z (север-юг) Ставим значения так, чтобы ваш корабль не оказался "внутри" острова, т.е. мог свободно плыть. Изменить обязательно. Идём в PROGRAM\globals.c Ищём #define MAX_ISLANDS, меняем 8 на кол-во прибавленных островов, т.е. если добавили 1 - пишете 9, еслии 2- 10 и т.п. Но и это еще не все в папке пкм\Program\Characters\init\ создаем файл с названием города и указываем в нем персов и локации в которых они будут находится. Затем в пкм\Program\Locations\init\ делаем на нашем острове дома, церкви, таверны и т.д. Все, остров готов. Теперь проверяйте в игре |
Jaoquin De Masse |
![]()
Сообщение
#5
|
боцман ![]() ![]() ![]() ![]() Группа: форумчанин Сообщений: 131 Регистрация: 11-April 06 Из: Краснодарский к-р. Пользователь №: 3,072 ![]() |
Многими хотелось сделать свои товары, чтобы помимо старых в магазинах продавались и ваши новые. Для этого сделайте все по этой инструкции. Я себе сделал 4 новых товара: рабы, сигареты, наркота
![]() Итак начнем! Для начала, откроем файл RESOURCE\INI\INTERFACES\pictures.ini Ищем секцию: [GOODS] sTextureName = goods.tga - имя файла с изображениями товаров в директории RESOURCE\Textures\INTERFACES (без расширения .tx) wTextureWidth = 1024 - ширина файла с изображениями товаров (в пикселях) wTextureHeight = 512 - высота файла с изображениями товаров (в пикселях) Далее идут значения местоположения отдельных картинок для каждого товара: picture = Balls,128,256,256,384 и т.д. Общий шаблон выглядит следующим образом: picture = 'name','1','2','3','4' 'name' - ID товара, '1' - граница картинки товара слева, '2' - сверху, '3' - справа, '4' - снизу. (значения пишутся через запятую, без пробелов и ' '). В этом файле таблица значений '1','2','3','4' для каждой картинки. Размер общего рисунка - 1024 x 1024 пикселя. Таблица в формате *htm. После того, как прописали картинку, открываем файл PROGRAM\STORE\initGoods.c Существует дватипа товаров: сами товары и боеприпасы. Значения полей для боеприпасов: Goods[GOOD_BALLS].Name = "Balls"; - ID товара(тот, который вы написали в предыдущем фалйле) (ID обязательно должен быть заключён в " ". Goods[GOOD_BALLS].Cost = 2; - стоимость единицы товара. Goods[GOOD_BALLS].Weight = 3; - масса единицы товара в центнерах. Goods[GOOD_BALLS].Units = 20; - ? Goods[GOOD_BALLS].SpeedV0 = 1.0; - начальная скорость снаряда. Goods[GOOD_BALLS].DamageHull = 10.0; - урон, наносимый снарядом корпусу корабля. Goods[GOOD_BALLS].DamageRig = 5.0; - урон, наносимый снарядом парусам. Goods[GOOD_BALLS].DamageCrew = 0.25; - урон, наносимый снарядом команде корабля. Значения полей для товаров: Goods[GOOD_SAILCLOTH].Name = "Sailcloth"; - ID товара(тот, который вы написали в предыдущем фалйле) (ID обязательно должен быть заключён в " ". Goods[GOOD_SAILCLOTH].Weight = 3; - масса единицы товара в центнерах. Goods[GOOD_SAILCLOTH].Cost = 3; - стоимость единицы товара. Goods[GOOD_SAILCLOTH].Units = 1; - ? Goods[GOOD_SAILCLOTH].Swim.Model = "roll_of_materials"; - модель плавающего товара, находится в папке RESOURCE\MODELS\SwimGoods Goods[GOOD_SAILCLOTH].Swim.Time = 10; - время плавания товара до его потопления. Если персонаж его не подобрал в течении этого времени, товар тонет. Шаблон для товара: Goods[GOOD_'NAME']... Вместо 'NAME' пишете ID товара большими буквами. После того, как прописали характеристики товара, открываем файл PROGRAM\STORE\goods.h Находим #define GOOD_OIL 26 Ниже описываем свой товар по такому шаблону: #define GOOD_'ID' 'n+1' , где вместо 'ID' пишем ID своего товара большими буквами. 'n' - наибольшее числовое значение в секции идентифицирования товаров (начиная с #define GOOD_BALLS 0). К этому наибольшему значению добавляем 1 и записываем полученное число вместо 'n + 1'. Между 'ID' и 'n+1' долженбыть пробел! После того, как товар в секции идентифицирования, открываем файл RESOURCE\INI\TEXTS\RUSSIAN\GoodsDescribe.txt Спускаемся внизфайла и описываем свой товар по следующему шаблону: 'ID' {'RusID'} 'ID'_descr { 'txt' } Где 'ID' - ID вашего товара, 'RusID' - русское название, 'txt' - описание. В описании боеприпасов возможно использование переменных: #dDamageHull# - показывает урон, наносимый корпусу #dDamageRig# - парусам #f.2DamageCrew# - команде Как альтернатива - просто написать эти значения обыкновеным текстом. И это ещё не всё ![]() Открываем в этой же папке файл common.ini Находим секцию ; goods name strings, идём вниз этой секции. Описываем товар по шаблону: string = ID,"RusId" где ID - ID вашего товара, RusID - название на русском языке. RusId пишется с кавычками и отделяется от IDа не пробелом, а запятой Далее в этой же папке открываем файл ShipEatGood.txt Идём вниз и пишем по шаблону: seg_'ID' {'RusIDR'} Дамаю, что такое 'ID', объяснять уже не надо, а вот 'RusIDR' - название товара в родительном падеже. В файле SeaSection.txt, находящемся в этой же папки делаем то же, что и в предыдущем файле, только товар описываем выше строчки sea_exp_add {+%1 опыта}. Удачи в создании новых товаров! ![]() Прикрепленные файлы ![]() |
Jaoquin De Masse |
![]()
Сообщение
#6
|
боцман ![]() ![]() ![]() ![]() Группа: форумчанин Сообщений: 131 Регистрация: 11-April 06 Из: Краснодарский к-р. Пользователь №: 3,072 ![]() |
Для начала я хотел поблагодарить некоторых участников форума за письма которые они мне написали (Спасибо ребята!
![]() Нашел я у себя настройки гг, так что вот они ![]() Настройки нашего гг находятся в файле: PROGRAM\Characters\characters_init.c Итак, приступим… //ch.perks.list.InstantBoarding = true; ch.name = “Nathaniel”; //Имя главного персонажа ch.lastname = “Hawk”;//Фамилия главного персонажа ch.id = “Blaze”;//Уникальный id гланвого перса – не менй его. Мой совет не меняйте его игре импользуеться именно этот! ch.nation = ENGLAND;//Нация ch.model = “blaze”;//Модель игрока. Модели можно посмотреть здесь: RESOURCE/models/characters. И помни что имя модели должно быть без расширения .gm! ch.activity_begin = “0”; ch.activity_end = “24”; ch.sex = “man”;//Определяем пол для анимации. Возможны значение: woman, monkey, skeleton ch.luck = 4;//Удача ch.spyglass.itemID = COMMON_SPYGLASS;//тип подзорной трубы ch.gun.itemID = GUN_COMMON;//тип орудий ch.gun = “gun”;//тип пистолета ch.blade = “saber”;//тип сабли ch.blade.itemID = BLADE_SABER; ch.blade.time = 0.1; ch.blade.colorstart = argb(128, 22, 46, 190); ch.blade.colorend = argb(0, 20, 60, 100);*/ ch.location = ; ch.location.group = ; ch.location.locator = ""; ch.Dialog.Filename = «blaze_dialog.c»; ch.rank = 1; ch.reputation = “50”;//Репутация ch.experience = 0;//Опыт. Высчитывается по формул ExperienceFromRank(sti(ch.rank)) //секция умений и навыков 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.skill.freeskill = 1;//Количество свободных скилов ch.perks.freepoints = 1;//количество свободных очков для уменй ch.money = “1000”;//Начальный капитал ch.Ship.Name = “Титаник”;//Имя корабля ![]() //ch.Ship.Type = SHIP_FRIGATE_ENGLAND; //ch.Ship.Type = SHIP_CORVETTE_ENGLAND; ch.Ship.Type = SHIP_LUGGER_ENGLAND;//Тип корабля(тип и нация) //ch.Ship.Type = SHIP_MANOWAR2_FRANCE; ch.Ship.Stopped = true; //ch.Ship.Cannons.Type = CANNON_TYPE_TEST; ch.FaceId = 31; ch.ShipSlot1.Type=SHIP_NOTUSED; ch.ShipSlot1.Name="No Name"; ch.ShipSlot2.Type=SHIP_NOTUSED; ch.ShipSlot2.Name="No Name"; ch.ShipSlot3.Type=SHIP_NOTUSED; ch.ShipSlot3.Name="No Name"; Все, мы изменили параметры нашего гг... ![]() И еще для того что бы бегать без SHIFT необходимо сделать следующие: Лезем в паку Program\Characters\characters.c Находим функцию SetDefaultNormWalk() и заменяем код на: void SetDefaultNormWalk(ref character) { // boal --> if (GetMainCharacter() == character) { character.actions.walk = "run"; character.actions.backwalk = "back walk"; character.actions.run = "walk"; character.actions.backrun = "back run"; } else { // boal <-- character.actions.walk = "walk"; character.actions.backwalk = "back walk"; character.actions.run = "run"; character.actions.backrun = "back run"; } // boal |
Jaoquin De Masse |
![]()
Сообщение
#7
|
боцман ![]() ![]() ![]() ![]() Группа: форумчанин Сообщений: 131 Регистрация: 11-April 06 Из: Краснодарский к-р. Пользователь №: 3,072 ![]() |
Инструкция по созданию нового корабля
![]() Откроем файл Programs/ships/ships_init.c. Найдите корабль, который наиболее похож на ваш новый корабль(по характеристикам) и скопируйте код в конец описания кораблей. ДО описания фортов! //------------------------------------------------------------------------- //NEW!<-------- названия корабля, не играет никакой роли, может быть любым. //------------------------------------------------------------------------- makeref(refShip,Ships Types[SHIP_NEW_FRANCE]); <– SHIP_названия корабля_нация refShip.Name = «Xebec 1»; <-Может быть любой из существующих кораблей или ваше собственное имя. refShip.Class = 1; <– Класс корабля. Может принимать значения от 1 до 7. refShip.Cannon = CANNON_TYPE_CANNON_LBS32; <-тип установленных орудий. refShip.MaxCaliber = 32; <-максимальный калибр refShip.Weight = Tonnes2CWT(2200);<-масса корабля refShip.Capacity = 3500;<-грузоподъемность refShip.CannonsQuantity = 44;<-количество орудий refShip.MaxCrew = 600;<-максимальная команда refShip.MinCrew = 150;<-минимальная команда refShip.SpeedRate = 17.2;<-скорость refShip.TurnRate = 26;<-маневренность refShip.Price = 50000;<-цена(средняя) refShip.HP = 15000;<-жизни refShip.SP = 100;<-жизни парусов refShip.AbordageLocation = «BOARDING_XEBEC»; <– Локация абордажа. Можно плавать на тартане и поставить локацию абордажа от мановара.. ![]() refShip.EmblemedSails.normalTex = «ships\sail_Pirates.tga»;<-Текстура парусов, формат текстуры пишите просто *.тга без .тх на конце (иначе работать не будет!!!) refship.WaterLine = 0.0; <– Секция описаний для реалистичного режима плавания. refship.SpeedDependWeight = 0.3; refship.SubSeaDependWeight = 0.9; refship.TurnDependWeight = 0.8; refShip.CanEncounter = false; <– Это делает корабль уникальным. Т.е. в море его встретить нельзя. refship.InertiaAccelerationX = 3.0; refship.InertiaBrakingX = 2.0; refship.InertiaAccelerationY = 14; refship.InertiaBrakingY = 5; refship.InertiaAccelerationZ = 5.0; refship.InertiaBrakingZ = 3.0; refShip.Height.Bombs.Y = 1.0; refShip.Height.Bombs.DY = 0.5; refShip.Height.Grapes.Y = 2.0; refShip.Height.Grapes.DY = 1.0; refShip.Height.Knippels.Y = 10.0; refShip.Height.Knippels.DY = 8.0; refShip.Height.Balls.Y = 1.0; refShip.Height.Balls.DY = 0.5; теперь у нас есть корабль, далее откройте файл ship.h в этой же директории. В первой строке замените #define SHIP_TYPES_QUANTITY 166 На #define SHIP_TYPES_QUANTITY 167 Теперь прокрутите ниже, до описания последнего корабля: #define SHIP_FEARLESS 165 И допишите строку: #define SHIP_VON 165, где SHIP_VON – SHIP_+название вашего корабля Теперь наш корабль доступен как SHIP_имя_нация. Если хотите поставить новый корабль гг надо: //ch.Ship.Type = SHIP_FRIGATE_ENGLAND; //ch.Ship.Type = SHIP_CORVETTE_ENGLAND; ch.Ship.Type = SHIP_LUGGER_ENGLAND; -- Вписать его название сюда в 3-ю строчку. //ch.Ship.Type = SHIP_MANOWAR2_FRANCE; |
Scatimon |
![]()
Сообщение
#8
|
...Welcome To Scatlend... ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: форумчанин Сообщений: 707 Регистрация: 14-April 05 Из: Москва Пользователь №: 662 ![]() |
Значит, я могу помочь по созданию новых предметов. Я буду объяснять, как сделать новую саблю, подзорную трубу. Начнём с сабли, закончим трубой .
Итак открываем PROGRAM\Items\initItems.с та ищем раздел //WEAPONS makeref(itm,Items[n]); - оставить неизменным itm.id = "blade26"; - ID сабли, я пишу Blade*, где * номер сабли, т.е, если из 25 то писать 26 itm.groupID = BLADE_ITEM_TYPE; - ID, т.е. что это, сабля карта, пистолет itm.name = "itmname_blade26"; - Имя сабли, обычно пишут itmname_blade* где * 26 itm.describe = "itmdescr_blade26"; - это для описания, типа сабля турецкая… itm.model = "blade26"; - модель, вернее её имя, лучше blade*, где * 26 itm.folder = "items"; - папка с моделькой itm.picIndex = 1; - номер квадрата в котором рисунок сабли itm.picTexture = "ITEMS_10"; - имя текстуры рисунка в описании itm.dmg_min = 5.0; - минимальное повреждение наносимое саблей itm.dmg_max = 10.0; - максимальное повреждение наносимое саблей itm.piercing = 0; - защита itm.minlevel = 0; - минимальный уровень itm.rare = 0.1; - редкость появление itm.block = 10; - блокировка itm.param.time = 0.05; - короче все эти параметры(что ниже) оставить так itm.param.colorstart = argb(64, 64, 64, 64); itm.param.colorend = argb(0, 32, 32, 32); n++; - в конце ставить всегда примечание: если будете вставлять как шаблон то перед каждой репликой включая «-» ставить знак //, в противном случае работать не будет. Далее открываем PROGRAM\Items\items.h , та ищем строку #define ITEMS_QUANTITY, добавляем, т.е если было 180 то будет 181. Затем открываем RESOURCE\INI\INTERFACES\pictures.ini Там ищем примерно это [ITEMS_10] –ищем последнюю цифру и ниже добавляем(путём копирования) sTextureName = items10.tga – вместо десяти следующая цифра, если последняя 11 то 12 и т.д…*** wTextureWidth = 512 wTextureHeight = 512 picture = itm1,0,0,128,128 picture = itm2,128,0,256,128 picture = itm3,256,0,384,128 picture = itm4,384,0,512,128 picture = itm5,0,128,128,256 picture = itm6,128,128,256,256 picture = itm7,256,128,384,256 picture = itm8,384,128,512,256 picture = itm9,0,256,128,384 picture = itm10,128,256,256,384 picture = itm11,256,256,384,384 picture = itm12,384,256,512,384 picture = itm13,0,384,128,512 picture = itm14,128,384,256,512 picture = itm15,256,384,384,512 picture = itm16,384,384,512,512 Теперь копируем в текстурах файл = items10.tga и вставляем с вашим номером = items*.tga – имя должно соответствовать 2 строчке выше(там значки «***»). Это мы сделали картинку, квадрат описания, их там 16. Соответственно ставите номер квадрата, в котором ваша сабля, счёт с лева на право. КВ( 1 )КВ( 2 )КВ( 3 )КВ( 4 ) - КВ - квадрат КВ( 5 )КВ( 6 )КВ( 7 )КВ( 8 ) КВ( 9 )КВ(10)КВ(11)КВ(12) - схема items*.tga КВ(13)КВ(14)КВ(15)КВ(16) Всё! Идём дальше открываем: RESOURCE\INI\TEXTS\RUSSIAN\ItemsDescribe.txt В нём описание сабли: itmname_blade* {Имя сабли} // - itmdescr_blade* - помним да! itmdescr_blade* { Непосредственно само описание. } Можно как шаблон это брать. Теперь самая плюха, открываем PROGRAM\QUESTS\quests_reaction.с Там прописывается добавка предмета на прилавки. В нём ищем void GiveItemToTrader(aref ch) Затем добавляем строки if (makeint(pchar.rank) >=*) //ставим какой хотим уровень, т.е поставили 5 то //как только уровень будет больше 5 то сабля будет на прилавке. { irand = rand(*); //- по порядку смотрим в файле выше и ниже if (irand == 1) { TakeNItems(ch,"blade*", Rand(1)+1);} } Если всё ОК то игра запустится, сначала лучше if (makeint(pchar.rank) >=*) Поставить на «1» и проверить…далее буду объяснить, как подзорку добавить, там тоже есть свои нюансы. |
Jaoquin De Masse |
![]()
Сообщение
#9
|
боцман ![]() ![]() ![]() ![]() Группа: форумчанин Сообщений: 131 Регистрация: 11-April 06 Из: Краснодарский к-р. Пользователь №: 3,072 ![]() |
Значит такс, создадим перса в городе
![]() ![]() /* VisibleLocatorsGroup("reload", 1.0, 15.0, 255, 0, 255, 0); VisibleLocatorsGroup("Merchant", 1.0, 15.0, 105, 0, 255, 125); ... VisibleLocatorsGroup("sit", 1.0, 15.0, 255, 255, 0, 0); VisibleLocatorsGroup("item", 1.0, 15.0, 255, 255, 0, 255); //*/ И удалите символы /* и */? После чего допишите следующие строки: VisibleLocatorsGroup("rld", 1.0, 15.0, 255, 0, 255, 0); VisibleLocatorsGroup("box", 1.0, 15.0, 255, 255, 0, 0); VisibleLocatorsGroup("randitem", 1.0, 15.0, 255, 255, 0, 255); Сохраняем, загружаем игру – ![]() ![]() ![]() Все персонажи создаются в файлах, хранящихся в паках program\character\init\ Вот самый общий код для создания перса: //секция описание перса makeref(ch,Characters[n]); //эта функция создаёт перса ch.name = “”; //Определяем фамилию... ch.lastname = ""; //...и имя ch.id = “Redmond prison commendant”; //необходимо для каждого преса придумать УНИКАЛЬНЫЙ id. Обычно составляется из имя + фамилия. ch.model = «offic_eng»; //Модель игрока (посмотреть модели можно в папке RESOURCES\MODELS\CHARACTERS\). Обратите внимание, что модель пишется БЕЗ расширения .gm ch.sound_type = “soldier”; //тип звука который мы слышим при разговоре с персом. ch.sex = “man”; //Анимация скелета - принимает значения man - мужская модель, woman - женская модель, monkey - обезьяна, skeleton - скелет. LAi_CharacterReincarnation(ch, true, true); //Необязательный параметр, указывает может ли перс перерождаться. //секция инвентаря GiveItem2Character(ch, «Blade1»); //Даёт персу оружие blade1, список оружия можно посмотреть здесь: program\ITEMS\initItems.c ch.equip.blade = «Blade1»; //Заставляем перса использовать оружие которое дали ему. //секция локаций ch.location = «Redmond_prison»; //Это название локации, список названий можно посмотретьв файле: PROGRAM\LOCATIONS\INIT\Имя города.c ch.location.group = “sit”; //Группа локаторов ch.location.locator = «sit1"; //Стартовая точка //секция диалога ch.Dialog.Filename = «Redmond commendant_dialog.c»; //Файл диалога перса. Должен лежать в папке PROGRAM\DIALOGS\ //секция умений и т.п. ch.rank = 1;//ранг ch.reputation = “None”;//репутация ch.experience = “0”;//опыт ch.skill.Leadership = “1”;//лидер ch.skill.Fencing = “4”;//фехтование 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 = “10”; //деньги //секция корабля, необязательная ch.Ship.Name = “Fast death”;//имя корабля ch.Ship.Type = SHIP_CORVETTE_PORTUGAL;//Тип корабля. Подробнее смотри program\Ships\Ships_init.c ch.Ship.Cannons.Type = CANNON_TYPE_CANNON_LBS16;//Тип установленных орудий. 12,16, 24, и 32 //Анимация. Необходимо выбрать один из вариантов LAi_SetPoorType(ch); //Сидит(бродяга) LAi_SetCitizenType(ch); //Ходит LAi_SetMerchantType(ch); //Ходит за главным персом LAi_SetPatrolType(ch); //Патруль LAi_SetGuardianType(ch); //Патруль у дверей LAi_SetPriestType(ch); //Священник LAi_SetSitType(ch); //Сидит на стуле и т.п. LAi_SetWaitressType(ch); //Оффициантка LAi_SetBarmanType(ch); //Бармен //Другие параметры, связаные с анимацией. LAi_SetLoginTime(ch, 0.0, 24.0); LAi_SetHP(ch, 80.0, 80.0);//Устанавливаем жизни LAi_SetStayHuberPointWindow(ch, “goto”, «goto10"); //Описываем путь перса. LAi_SetStayHuberPointMap(ch, “goto”, «goto9"); //И на последок… LAi_group_MoveCharacter(ch, «ENGLAND_SOLDIERS»); //Переместить перса в группу. LAi_NoRebirthEnable(ch);//Запретить перерождение. ch.greeting = «Gr_Redmond Commendant»; //Тип приветствия. Подробнее здесь: RESOURCE\INI\ALIASES\Greetings_alias.ini n = n + 1; Вот готовый пример: makeref(ch,Characters[n]); //Пират Хреновый Глаз ch.name = " Хреновый"; ch.lastname = "Глаз"; ch.id = "HG"; ch.model = "corsair3"; ch.sound_type = "soldier"; LAi_CharacterReincarnation(ch, true, true); ch.sex = "man"; GiveItem2Character(ch, BLADE_SABER); ch.equip.blade = BLADE_SABER; ch.location = "Oxbay_port"; ch.location.group = "goto"; ch.location.locator = "goto23"; ch.Dialog.Filename = "Oxbay Soldier_dialog.c"; ch.rank = 1; ch.nation = ENGLAND; ch.reputation = "None"; ch.experience = "0"; ch.skill.Leadership = "1"; ch.skill.Fencing = "5"; 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 = "10"; ch.money = "10"; LAi_SetCitizenType(ch); LAi_group_MoveCharacter(ch, "ENGLAND_CITIZENS"); n = n + 1; Поздравляю вы создали новый персонаж в городе ![]() |
Jaoquin De Masse |
![]()
Сообщение
#10
|
боцман ![]() ![]() ![]() ![]() Группа: форумчанин Сообщений: 131 Регистрация: 11-April 06 Из: Краснодарский к-р. Пользователь №: 3,072 ![]() |
Меняем стартовую точку
![]() Вот это не очень легко. Для этого мы должны открыть два файла. Сначала откроем 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"); Ура, все получилось! ---------------------------------------------------------------------------------------------------------------------------------------------------------- Итак, задача не из лёгких – добавить новую локацию. А поэтому без лишних слов приступим к делу ![]() Для примера откроем любой файл из папки PROGRAM\Locations\init\ Locations[n].filespath.models = "locations\town_Douwesen\port";<--Это указатель на модель, используемую для внутренней части. Locations[n].image = "loading\Douwesen_Port.tga";<--Это картинка загрузки в локацию, распологаютсья в папке \RESOURCE\Textures\Loading\ locations[n].worldmap = "Douwesen"; Locations[n].id = "Douwesen_port";<--Это ID особых локаций locations[n].id.label = "Douwesen port";<--Метка Locations[n].townsack = "Douwesen"; locations[n].type = "port";<-- locations[n].fastreload = "Douwesen"; Locations[n].models.always.locators = "DouPort_l";<--Перегружаем локаторы Locations[n].models.always.seabed = "DouPort_sb";<--Загружаем карту морского дня Locations[n].models.always.seabed.foam = "1";<-- разрешаем пену Locations[n].models.always.l1 = "DouPort"; Locations[n].models.always.l1.foam = "1"; Locations[n].models.always.grasspatch = "DouPort_g"; Locations[n].models.day.rinok = "DouPort_e01"; Locations[n].models.day.charactersPatch = "DouPort_pd"; Locations[n].models.day.fonar = "DouPort_fd"; Locations[n].models.night.fonar = "DouPort_fn"; Locations[n].models.night.charactersPatch = "DouPort_pn"; Locations[n].environment.weather = "true";<--Разрешаем или запрещаем действие погоды в локации Locations[n].environment.sea = "true";<--Разрешаем или запрещаем море в данной локации Locations[n].reload.l1.name = "reload3";<--Локатор перехода в следующую локацию Locations[n].reload.l1.go = "Douwesen_town";<--ID следующей локации Locations[n].reload.l1.emerge = "reload9";<--Имя локатора где появимся Locations[n].reload.l1.autoreload = "0"; Locations[n].reload.l1.label = "Douwesen.";<--Этот текст показывается когда вы смотрите на дверь. Locations[n].reload.l2.name = "reload2"; Locations[n].reload.l2.go = "Douwesen"; Locations[n].reload.l2.emerge = "reload_1"; Locations[n].reload.l2.autoreload = "0"; Locations[n].locators_radius.reload.reload2 = 3; Locations[n].reload.l2.label = "Sea."; Locations[n].reload.l3.name = "reload1_back"; Locations[n].reload.l3.go = "Douwesen"; Locations[n].reload.l3.emerge = "reload_1"; Locations[n].reload.l3.autoreload = "0"; Locations[n].reload.l3.label = "Sea."; Locations[n].locators_radius.reload.reload1_back = 3; Locations[n].reload.l4.name = "reload2_back"; Locations[n].reload.l4.go = "Douwesen"; Locations[n].reload.l4.emerge = "reload_1"; Locations[n].reload.l4.autoreload = "0"; Locations[n].locators_radius.reload.reload2_back = 3; Locations[n].reload.l4.label = "Sea."; Locations[n].reload.l5.name = "reload1"; Locations[n].reload.l5.go = "Douwesen"; Locations[n].reload.l5.emerge = "reload_1"; Locations[n].reload.l5.autoreload = "0"; Locations[n].reload.l5.label = "Sea."; Locations[n].locators_radius.reload.reload1 = 3; n = n + 1; А теперь найдите дом который хотели изменить, смените ID, после чего замените в городе, где хотите свой дом ID перехода. |
navy |
![]()
Сообщение
#11
|
Hagane no Renkinjutsushi ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Seaward.Ru Team Сообщений: 5,970 Регистрация: 15-March 05 Из: Волгоград Пользователь №: 578 ![]() |
Цитата Меняем стартовую точку Если просто сделать так как ты описал работать не будет... при попытке начать новую игру, будут жуткие тормоза и локация не загрузиться.... Т.к. на Первые Две локации в ПКМ висят квестовые прерывания, которые инициализируют мир... следовательно... нужно их перевешивать.... иначе фигня получится. |
Jaoquin De Masse |
![]()
Сообщение
#12
|
боцман ![]() ![]() ![]() ![]() Группа: форумчанин Сообщений: 131 Регистрация: 11-April 06 Из: Краснодарский к-р. Пользователь №: 3,072 ![]() |
Если просто сделать так как ты описал работать не будет... при попытке начать новую игру, будут жуткие тормоза и локация не загрузиться.... Т.к. на Первые Две локации в ПКМ висят квестовые прерывания, которые инициализируют мир... следовательно... нужно их перевешивать.... иначе фигня получится. Я еще квест редактировал, теперь у меня игра начинается в форте оа оксбэе, типа побег из тюрьмы... ![]() |
navy |
![]()
Сообщение
#13
|
Hagane no Renkinjutsushi ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Seaward.Ru Team Сообщений: 5,970 Регистрация: 15-March 05 Из: Волгоград Пользователь №: 578 ![]() |
Цитата Я еще квест редактировал, теперь у меня игра начинается в форте оа оксбэе, типа побег из тюрьмы... Но не написал об этом ![]() |
Jaoquin De Masse |
![]() ![]()
Сообщение
#14
|
боцман ![]() ![]() ![]() ![]() Группа: форумчанин Сообщений: 131 Регистрация: 11-April 06 Из: Краснодарский к-р. Пользователь №: 3,072 ![]() |
Значит так! Сейчас мы добавим в игру новый калибр пушек.
Для этого открываем Пираты Карибского Моря\Program\CANNONS\Cannons.c Находим там: case 32: return CANNON_TYPE_CANNON_LBS32; break; И после пишем: case 48: return CANNON_TYPE_CANNON_LBS48; break; Далее идем в Пираты Карибского Моря\Program\CANNONS\Cannons.h В самом верху файла находим: #define CANNON_TYPES_QUANTITY 7 и меняем на: #define CANNON_TYPES_QUANTITY 8 Затем находим строчку: #define CANNON_TYPE_CANNON_LBS32 6 И после нее пишем: #define CANNON_TYPE_CANNON_LBS48 7 Идем в самый низ файла и находим там: case CANNON_TYPE_CANNON_LBS32: return 32; break; и после нее дописываем: case CANNON_TYPE_CANNON_LBS48: return 48; break; Затем открываем Пираты Карибского Моря\Program\CANNONS\ Cannons_init.c И в самом низу после пушек 32 калибра пишем вот это: makeref(rCannon,Cannon[CANNON_TYPE_CANNON_LBS48]); - Описание rCannon.type = CANNON_NAME_CANNON; - Название rCannon.caliber = 48; - Калибр rCannon.ReloadTime = 1; - Время перезарядки rCannon.Cost = 3500; - Стоимость rCannon.Weight = 72; - Вес rCannon.FireAngMax = 0.60; rCannon.FireAngMin = -0.35; rCannon.DamageMultiply = 4.0; InitBaseCannons_CalcSpeedV0(&rCannon,750.0); - Дальность стрельбы Теперь идем в Пираты Карибского Моря\RESOURCE\INI\INTERFACES\pictures.ini Открываем, и находим там строчку: picture = cannon32,768,0,896,128 и после нее, пишем: picture = cannon48,768,0,896,128 Затем находим Пираты Карибского Моря\RESOURCE\INI\TEXTS\common.ini Там находим строчку: string = caliber32,"32фунт." и после нее вписываем: string = caliber48,"48фунт." Включаем игру и проверяем! Будут вопросы, пишите! ![]() ![]() |
![]()
Сообщение
#15
|
|
Группа: Сообщений: 0 Регистрация: -- Пользователь №: 0 Предупреждения: (0%) ![]() ![]() |
дополните пожалуйта описание *.INI-файлов
![]() ![]() |
Dogeva |
![]()
Сообщение
#16
|
Расплетающая Сновидения ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: форумчанин Сообщений: 852 Регистрация: 10-February 06 Пользователь №: 2,632 ![]() |
|
![]()
Сообщение
#17
|
|
Группа: Сообщений: 0 Регистрация: -- Пользователь №: 0 Предупреждения: (0%) ![]() ![]() |
Теперь остается свести все слои (CTRL+E на англ. раскладке) и сохранить, заменив старую текстуру.
- Теперь конвертируем в ВМЛ и разворачиваем игру. Играем с новой галкой в меню перков. Если не работает, то выйдите из игры и войдите снова. (Не забывайте про настройку tx_converter'а: A8R8G8B8 вверху и внизу) Позже дополню описание *.INI-файлов. Если чего забыл, поправьте меня! и когда он дополнит? ![]() |
Dogeva |
![]()
Сообщение
#18
|
Расплетающая Сновидения ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: форумчанин Сообщений: 852 Регистрация: 10-February 06 Пользователь №: 2,632 ![]() |
с такими вопросами - автору в личку
![]() устное предупреждение |
Райп |
![]()
Сообщение
#19
|
юнга ![]() ![]() Группа: форумчанин Сообщений: 20 Регистрация: 14-August 06 Из: Из Тортуги Пользователь №: 3,924 ![]() |
... ну и зачем было цитировать все ?? ![]() ![]() ![]() Райп получает "+" за оверквотинг в особо крупных размерах и оффтоп... Сообщение отредактировал TAHAT - Aug 27 2006, 15:33 |
ALexusB |
![]()
Сообщение
#20
|
Разработчик ВМЛ-КВЛ ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Admin Сообщений: 16,241 Регистрация: 2-November 04 Пользователь №: 3 ![]() |
Ставить мой мод_в4, в котором код открыт и все на русском.
Официально за три года существования игры не выходило патчей, открывающих код, как это было с к3, т.е. ПКМ-моддинг "нот суппортет" - либо признано достаточным неофициальные патчи - так что велкам. |
![]() ![]() |
Текстовая версия | Сейчас: 26th April 2024 - 17:02 |