Описания языка программирования ПКМ, от авторов ВМЛ |
Здравствуйте, гость ( Вход | Регистрация )
Описания языка программирования ПКМ, от авторов ВМЛ |
ALexusB |
Nov 18 2005, 11:06
Сообщение
#1
|
Разработчик ВМЛ-КВЛ Группа: Admin Сообщений: 16,430 Регистрация: 2-November 04 Пользователь №: 3 |
Во!
нарыл в закромах родины. Начинаем мастер класс! Порядок следования поменял, одно я где-то уже публиковал, второе новое (из аддона, соовт дейстивтельности ПКМ не гарантирую) Код Описание скриптов в адд-оне ALexusB 22.04.05 Дерево каталогов Program\BATTLE_INTERFACE\ - скрипты интерфейсов на суще и море + быстрые переходы, Program\CANNON\ - инициация и методы пушек, Program\CHARACTERS\ - инициация персонажей и модули управления ими + форты + генератор фантомов, Program\CONTROLS\ - настройки клавиш Program\DIALOGS\ - скрипты диалогов по городам и генераторы + квесты, Program\Encounters\ события на карте Program\INTERFACE\ - скрипты интерфейса, Program\ISLANDS\ - инициация островов и городов (товары для контрабанды и тп) Program\ITEMS\ - инициация предметов Program\LandEncounters\ - наземные энкаутеры (офицеры, райдеры, девки) Program\Loc_ai\ - все АИ на суше, включая боевки и абордаж Program\LOCATIONS\ - инициация локаций и модуль управления загрузгой НПС в них, Program\NATIONS\ - инициация и модули наций (отношения, матрицы отношений) Program\QUESTS\ - обработчики квестовых событий и модули управления событиями Program\SEA_AI\ - АИ на море (все, что с кораблями) + переход в каюту, трюм, палубу Program\SHIP\ - инициация типов кораблей, Program\STORE\ - модуль управления магазинами (цены, товары), Program\Weather\ - инициация погоды и смена погоды Program\WORLDMAP\ - глобальная карта (коорд на ней, загрузка, события) Program\ - общий код, модуль начала игры RESOURCE\ - все ресурсы игры, RESOURCE\INI\INTERFACES\ - дизайны интерфейса (расположение кнопок, иконки и тд) Чем редактировать? Я пользую TotalCommander + SynPlus 2.6 Подсветка синтексиса С++, сравнение файлов, Shift+Tab сдвигает выделение на таб влево, TAB - в право. Таб должен быть установлен ровно 4 пробела!!! Весь код идет по ГОСТу и только по нему. ====================== Особенности типов ПКМ ====================== На равне с базовыми типами С++ в игре есть свои собственные object - древовидная текстовая структура произвольной структуры (необходимо помнить, что все значения - строки) все в игре объекты (точнее структуры) например, ГГ - это первый элемент массива объектов всех НПС далее ref - ссылка на объект aref - ссылка на атрибут объекта (или ссылки на объект) примеры object Items[ITEMS_QUANTITY]; ref itm; aref arItm; makeref(itm,Items[n]); itm.id = "patent_eng"; itm.type.arm = true; makearef(arItm,itm.type); if (sti(arItm.arm) == true) { ... } ============= Как писать диалоги ============ для примера берем простейший файл-заглушку Miner_dialog.c - говорят шахтеры Комментарии по ходу void ProcessDialogEvent() - название метода обработки прерывания "разговор" { ref NPChar; - сам говорун aref Link, NextDiag; - ссылки на атрибуты DeleteAttribute(&Dialog,"Links"); - трем все варианты ответов с того раза makeref(NPChar,CharacterRef); - альяс глобальной переменной в локальную makearef(Link, Dialog.Links); - ссылка на атрибут ( NPChar.Dialog.Links) makearef(NextDiag, NPChar.Dialog); - ссылка на атрибут (просто удобно в коде, на деле это все часть NPChar) ref PChar; PChar = GetMainCharacter(); - наш ГГ switch(Dialog.CurrentNode) - текущая ветка диалога (можно задать заранее до начала разговора по квесту, по умолчанию для всех "First time") { case "First time": Dialog.defAni = "dialog_stay1"; - настройки анимации головы и звуков (остатки роскоши от к2, работает частично можно не писать вообще, просто не будет мимики у бошки) Dialog.defCam = "1"; Dialog.defSnd = "dialogs\0\017"; Dialog.defLinkAni = "dialog_1"; Dialog.defLinkCam = "1"; Dialog.defLinkSnd = "dialogs\woman\024"; Dialog.ani = "dialog_stay2"; Dialog.cam = "1"; Dialog.snd = "voice\MIDI\MIDI001"; switch (rand(1)) { case 0: dialog.text = "Поменьше болтай и побольше работай, друг. Стражники следят за нами, ты же не хочешь получить лишний удар плетью?"; link.l1 = "Ты прав, нужно беречь силы."; link.l1.go = "exit"; break; case 1: dialog.text = "Эх... как давно я не видел Солнце!!!"; - что говорит НПС link.l1 = "Зато добываемое золото блестит не хуже?"; - вариант ответа ГГ link.l1.go = "exit"; - куда переходим далее break; } NextDiag.TempNode = "first time"; - след ветка, если отработает link.l1.go = "exit"; break; case "Exit": DialogExit(); - выход их диалога NextDiag.CurrentNode = NextDiag.TempNode; - запомним след ветвь break; } } ==== Инфа Что есть if в игре и почему так ПКМ не поддерживает И и ИЛИ в одном выражении т.е. if (a && b && (d || c)) - вызовет ошибку компилятора Причем это вообще не подреживается в любых bool значениях (while и переменных) Что делать Вариант 1 if (a && b) if(d || c) Вариант 2 bool ok; ok = (d) || (c); if (a && b && ok) //////////////////////////////////////////////// Описание скриптов в ПКМ ALexusB 01.09.03 "Весь мир театр, а люди в нем актеры"(С) По ходу игры главный герой сталкивается различными персонажами. Добавить в игру новых персонажей или изменить реакции существующих - наша задача. Все НПС (актеры или статисты) хранятся в Characters[] Попадают они туда при инициализации игры различными путями: (здесь и далее я буду приводить описание методов и переменных исходя из того, что Вы знаете где их искать, иначе используйте поиск по папке программ) CreateCharacters() - инициализация всего массива и главного героя CreateOtherCharacters(); - все остальные служедные НПС (в ПКМ это лодка на берегу) Они заполняются в файлах офицеры, другие, квестовые персонажи и во всех файлов островов (C:\gama\seadog2\PROGRAM\Characters\init) При этом счетчик n увеличивается. Всего в игру заложена возможность инициализации 1000 персонажей (но это изменяемо) makeref(ch,Characters[n]); //Даниэль ch.name = "Даниель"; - имя в игре ch.lastname = "Грин"; - фамилия ch.id = "Danielle"; - ИД перса для обращения к нему в коде ch.nation = ENGLAND; - нация (ни на что не влияет) ch.model = "Danielle"; - модель, можно менять динамически ch.activity_begin = "0"; ch.activity_end = "24"; ch.sex = "woman"; - пол :) (для модели нужно задать тип анимации model.animation = "woman";) ch.luck = 4; GiveItem2Character(ch, "blade6"); - заполняем карман TakeNItems(ch,"potion1", Rand(4)+1); ch.equip.blade = "blade6"; - что в руках GiveItem2Character(ch, GUN_COMMON); ch.equip.gun = GUN_COMMON; - что в руках, вообще есть спец метод екипировки, в инициализации рудимент ch.location = ""; - где болтается (можно менять по сюжету) ch.location.group = ""; к какой группе принадлежит локатор ch.location.locator = ""; локатор, где конкретно болтается в локации, если пусто, то нигде нет, ждет своего часа ch.Dialog.Filename = "Danielle_dialog.c"; диалог, который сработает при обращении к персу ch.greeting = "Gr_danielle"; - альяс для звуков (список файлов, из которых перс вякает при диалоге) ch.rank = 4; - ранг ch.reputation = "50"; - репутация ch.experience = CalculateExperienceFromRank(4)+ (CalculateExperienceFromRank(4)/10 + rand(4000)); - текущий опыт (для адона рудимент) ch.skill.Leadership = "2"; - скилы ch.skill.Fencing = "4"; ch.skill.Sailing = "2"; ch.skill.Accuracy = "3"; ch.skill.Cannons = "2"; ch.skill.Grappling = "1"; ch.skill.Repair = "1"; ch.skill.Defence = "1"; ch.skill.Commerce = "1"; ch.skill.Sneak = "1"; - это удача, а не скрытность как написано :) ch.money = "0"; - деньги в кармане(т.е считай, что предмет) ch.perks.list.LongRangeShoot = true; - перки ch.Ship.Name = "Vertigo"; - имя корабля (может не быть корабля вообще. Для того чтою отобразить корабль в игре нужно спец функции вызвать) ch.Ship.Type = SHIP_SCHOONER2_ENGLAND; ch.Ship.Cannons.Type = CANNON_TYPE_CANNON_LBS16; ch.ship.cargo.goods.bombs = 1000; - задавать так товары ИЗВРАТ (методы есть), но в инициализации бывает - рудимент. ch.FaceId = 30; - морда лица при диалоге (перекрывается дальше и тут не на что не влияет и не соответствует правде) - рудимент типа switch (rCharacter.model) { case "black_corsair": rCharacter.FaceId = 0; break; case "bocman1": rCharacter.FaceId = 1; break; case "bocman3": rCharacter.FaceId = 2; break; case "bocman4": rCharacter.FaceId = 3; break; Зависит исключительно от модели Внимание! Добавление новой модели требует добавление морды!!! Динамическая смена модели морду не меняет Продолжение следует….. ============================== Итак, у нас в игре все актеры и статисты обозначены.. Это не значит, что герой их сразу увидит. Многие должны сами появляться, а не сидеть сиднями.. Да, кстати, чтоб НПС именно сидел (в таверне) используется специальный локатор, например ch.location.group = "sit"; ch.location.locator = "sit1"; Система квестов в игре основана на событиях Ch.quest.Story_LeavingOxbay.win_condition.l1 = "location"; - тип события (появится в локации) Ch.quest.Story_LeavingOxbay.win_condition.l1.character = "Blaze"; (кто появляется) Ch.quest.Story_LeavingOxbay.win_condition.l1.location = "Oxbay"; (где) Ch.quest.Story_LeavingOxbay.win_condition = "Story_leavingOxbay"; (состояние квеста при совпадении) Ch.quest.Story_LeavingOxbay.fail_condition = "Story_leavingOxbay"; (при не совпадении, но вопрос??? Не ясно когда оно сработает и что будет.. возможно не сработает вовсе) Введем терминологию Состояние квеста - СК Итак, СК обрабатывается в диалогах и, главное, в quests_reaction.c QuestComplete(); И другими файлами из папки квест. Нужно учесть, что СК это строка и никаких ошибок при ошибке в ней не будет вовсе (эта беда игры - не перечислимый тип и бич тестеров. Не удивительно, что игру тестили целый год :) Поэтому, нужно быть очень внимательным!!!! Продолжение следует….. |
ALexusB |
Nov 18 2005, 11:20
Сообщение
#2
|
Разработчик ВМЛ-КВЛ Группа: Admin Сообщений: 16,430 Регистрация: 2-November 04 Пользователь №: 3 |
свежачок
================== 18.11.05 ============ Почему нужно начинать игру заново после каждой правки? Ну, не каждой Но нужно! Почему же так? Во всем виноваты массивы и глобальные переменные. Да они! Они гады пишутся в сайв и после этого новые переменные и элементы массивов в этот сайв уже не лезут. А что делает добропорядочная игра при просьбе ее сделать то, что она не умеет? Правильно! Она вылетает в винду. Есть еще засада с непреинициализацией переменных и массивов. Например, меняем местами люггер и фрегат в описании кораблей. В старом сайве этот массив будет помнить еще старые значения, что приведет, если не к вылетам, то дисбалансу точно. Хотя это еще и можно обойти спец кнопкой "совместить старый сайв с новым кодом" (только ее еще нет и нужно делать, но проблема №1 все равно обессмысливает сей труд) |
navy |
Jan 23 2006, 13:45
Сообщение
#3
|
Hagane no Renkinjutsushi Группа: Seaward.Ru Team Сообщений: 5,972 Регистрация: 15-March 05 Из: Волгоград Пользователь №: 578 |
Как заставить персонажа общаться с Главным героем...
Добавляем новое квестовое прерываение например заходим в порт Консейсао... Код /* * pchar.quest.Case1.win_condition.l1 = "location"; * pchar.quest.Case1.win_condition.l1.location = "Conceicao_port"; * pchar.quest.Case1.win_condition = "Case1"; */ Ставим там (или берем готового) NPC.. в quest_reaction.c добавляем следующие кейсы... Код /* *case "Case1": * //задаем тип поведения Актер ГГ, чтобы не дергался и не свалил куда-нибудь * LAi_SetActorType(PChar); * * //задаем тип поведения Актер NPC, где NPC_ID соответственно ID непися. * LAi_SetActorType(characterFromID("NPC_ID")); * * //тут ставим необходимую ноду диалога непися, может быть любая ВАМ необходимая... * //в данном случаее Первая встреча * Characters[GetCharacterIndex("NPC_ID")].Dialog.CurrentNode = "First time"; * * //указываем второму персонажу <characterFromID("NPC_ID")> следовать к первому pchar * //по истечении времени 1.0 вызовется квест... тут его нет "" * LAi_ActorFollow(pchar, characterFromID("NPC_ID"), "", 1.0); * * //указываем персонажу (первый параметр) ждать диалога с другим персонажем (второй параметр)... * LAi_ActorWaitDialog(Pchar, characterFromID("NPC_ID")); * * //даем команду начать диалог первого со вторым, начнется в любом случае, после истечения * //5.0 сек. По окончании вызывается квест "Case2" * LAi_ActorDialog(characterFromID("NPC_ID"), Pchar, "Case2", 5.0, 0); *break; * *case "Case2": * //возвращаем тип Плэйер ГГ * LAi_SetPlayerType(Pchar); * * //Возвращаем исходный тип NPC тут указан тип охранника... * LAi_SetGuardianType(characterFromID("NPC_ID")); *break; */ Подробное описание всех этих функций можно найти в скриптах |
ALexusB |
Aug 6 2007, 22:40
Сообщение
#4
|
Разработчик ВМЛ-КВЛ Группа: Admin Сообщений: 16,430 Регистрация: 2-November 04 Пользователь №: 3 |
Статья по рекомендациям как писать правильный код (всего 6 основных советов на примере простой игры) от IBM
Читать всем кодерам, кто хочет чего-то достичь - еще и следовать этому |
De-Luxis |
Jan 24 2008, 15:51
Сообщение
#5
|
юнга Группа: Members Сообщений: 15 Регистрация: 13-January 08 Пользователь №: 14,473 |
Реально ли реализовать свой квест для ГПК, или для этого обязательно должна быть доступна папка Program.
|
Scatimon |
Jan 24 2008, 16:09
Сообщение
#6
|
...Welcome To Scatlend... Группа: форумчанин Сообщений: 707 Регистрация: 14-April 05 Из: Москва Пользователь №: 662 |
Нет, в програм все "повеливания" персами. Так что никак. Даже СЖ не добавить без програм.
|
A_De |
Jan 24 2008, 16:11
Сообщение
#7
|
боцман Группа: форумчанин Сообщений: 189 Регистрация: 5-October 07 Из: а то вы не знаете! Пользователь №: 12,159 |
Это не реально даже с диалогами - тк теже бордели заточены на мужика и многие квесты... а жениться на Изабелле девкой тоже песня. Ну не совсем так, ИМХО. Просто если играть девкой, то квест Изабеллы можно сделать недоступным или же целью квеста будет что-то типа убить Сальватора и на этом все, ну и в борделях ветки диалогов убрать/поменять. А вообще, править все диалоги это долгая и нудная работа... Реально ли реализовать свой квест для ГПК, или для этого обязательно должна быть доступна папка Program. Program должна быть доступна и скрипты должны быть открыты Но можно потренироваться на других кодах - ПКМ и К3. |
DinGrey |
Jan 31 2008, 17:50
Сообщение
#8
|
юнга Группа: форумчанин Сообщений: 39 Регистрация: 1-March 07 Из: Москва Пользователь №: 5,612 |
Хотел вот спросить... В к3 существует такая система, что товары по архипелагу распределяются случайным образом и могло получиться так, что к, примеру, на одном острове продавали сандал по дешёвке, а на соседнем покупали как дефицит подороже. Т.е. не торговля, а так, развлечение на час. Появилась идея, как то зафиксировать товары за каждым отдельным островом, чтобы, скажем купить дешевле на Кюрасао, а продать подороже надо плыть, скажем на Ямайку. Начал что-то эксперементировать... И главное, получилось! Помню, что показатели контрабанда - не контробанда менял в описании товаров (показатели 0 - не контра, 1 - контра), и по разделению товаров по островам в папке colonies, а конкретнее в подразделе которые я перевёл как "правила торговли для одного острова" я прописал, что вот для такой колонии = три товара импорт такой, три товара = экспорт такой. Почему именно в этой папке? Ну там с помощью патча сделали так (сорри не знаю авторов), что Петит-Гоав, Ла-Вега и Санто-Доминго имели общую торговую политику. Вот как-то на этом примере я и изменил показатели в скриптах. Да вот как конкретно - не помню. Все работало. Сразу оговорюсь, опыта нет - делал всё наобум, может просто повезло. К несчастью, слелтела система и пример для меня безвозвратно потерян. А бился над ним очень долго, перебирал варианты. Вот точно помню, что указывал название колонии и показатель товара импорт и экспорт для неё такой-то... А вот не работает! Есть какая-то ошибка, в первый раз наверное повезло её не сделать, а сейчас, блин... Так вот просьба, можно привести конкретный пример скрипта из к3, где код открыт, как сделать так, чтобы товары были не рендомно раскиданы, а всё четко распределено согласно воли программиста. Очень меня это дело теперь раздражает, спать не могу. Спасибо если поможете. И если не поможете тоже спасибо.
Я думаю наверное пишу в "правильную" тут, я так понял, что-то вроде мастер-класса. |
qzer56 |
Jun 12 2008, 12:02
Сообщение
#9
|
новичок Группа: Members Сообщений: 8 Регистрация: 10-June 08 Пользователь №: 16,913 |
А можна если у каво есть выложить описание функций ПКМ
например: GetMainCharacter(), GetSailPercent(), GetHulllPercent().... |
Scatimon |
Jun 12 2008, 16:01
Сообщение
#10
|
...Welcome To Scatlend... Группа: форумчанин Сообщений: 707 Регистрация: 14-April 05 Из: Москва Пользователь №: 662 |
Что тут описывать?
GetMainCharacter() - возвращает значение типа "ref", элемент массива тобеш, элемент этот - есть ГГ (Characters[1]). GetSailPercent() - возвращает значени типа "float", а именно % целостности парусов. GetHulllPercent() - то же самое что и выше, только % целостности корпуса вазвращает. |
navy |
Jun 16 2008, 09:51
Сообщение
#11
|
Hagane no Renkinjutsushi Группа: Seaward.Ru Team Сообщений: 5,972 Регистрация: 15-March 05 Из: Волгоград Пользователь №: 578 |
Цитата А можна если у каво есть выложить описание функций ПКМ Нет такого описания.. все что есть, писалось с нуля для себя и в основном по новым функция. Ищешь в коде код этой функции и смотришь что она делает. Вот и все. |
qzer56 |
Nov 5 2008, 18:16
Сообщение
#12
|
новичок Группа: Members Сообщений: 8 Регистрация: 10-June 08 Пользователь №: 16,913 |
Новая безумная идея: в общем из К3 в ПКМ перенес XINTERFACE.dll, в program\interface\utilites.c прописал функции . Вопрос: почему вылетает игра при запуске, даже в error.log ниче не пишет ???
Пока не прописал функции в program\interface\utilites.c то в error.log писало ошибки. |
ALexusB |
Aug 4 2009, 17:04
Сообщение
#13
|
Разработчик ВМЛ-КВЛ Группа: Admin Сообщений: 16,430 Регистрация: 2-November 04 Пользователь №: 3 |
Вот собранные по крупицам знания, что-то лежало в ПКМ изначально, что-то писал сам во время аддона ВМЛ. Файл атрибуты НПС.txt единственный поддерживался в актуальном состянии для КВЛ-ГПК
Эта папка есть в скриптах, когда их отроют. Прикрепленные файлы script_info.rar ( 37.73 килобайт ) Кол-во скачиваний: 1519 |
Mr.proper |
May 9 2010, 18:10
Сообщение
#14
|
Старый пират Группа: форумчанин Сообщений: 463 Регистрация: 4-March 09 Из: Нефтекамска Пользователь №: 19,489 |
Можете описать квест,т.е что за че отвечает и что это,можно примером 1 квест из к2?
|
dolphin_sv |
May 10 2010, 00:50
Сообщение
#15
|
матрос Группа: форумчанин Сообщений: 88 Регистрация: 23-May 05 Из: Донецк Пользователь №: 771 |
Вопрос некорреткный... Все заивит от того, что надо делать в квесте и т.п.
ЗЫ Лучший мануал - логика |
Mr.proper |
May 10 2010, 13:58
Сообщение
#16
|
Старый пират Группа: форумчанин Сообщений: 463 Регистрация: 4-March 09 Из: Нефтекамска Пользователь №: 19,489 |
вот например добавил новый корабль,где писать чтобы он в верфи продавался?
|
dolphin_sv |
May 10 2010, 14:16
Сообщение
#17
|
матрос Группа: форумчанин Сообщений: 88 Регистрация: 23-May 05 Из: Донецк Пользователь №: 771 |
А при чем тут квесты?!!
Корабль надо добавить тут PROGRAM\scripts\ShipsUtilites.c void SetShipyardStore(ref NPChar) ЗЫ С такими вопросами лучше сюда: |
jqeen |
Sep 18 2013, 19:02
Сообщение
#18
|
новичок Группа: Members Сообщений: 2 Регистрация: 28-August 13 Пользователь №: 34,356 |
Доброго времени суток!
Не могли бы мне помочь с диалогами? Что нужно мне изменить в кейсе, что бы не было раздвоение НПС при добавлении его в команду ГГ в качестве компаньена? (А то получается добавляется компаньен и его точная копия офицер) Цитата case "JQ_03": AddMoneyToCharacter(pchar, -300000); dialog.text = "Я буду служить вам верой и честью!"; link.l1 = "Я верю вам Джеймс Баллантре."; link.l1.go = "exit_hire"; NPChar.Dialog.FileName = "Enc_Officer_dialog.c"; NPChar.Money = 0; SetCharacterShipLocation("heroJQ_02", "santacatalina_town"); SetCompanionIndex(pchar, -1, GetCharacterIndex("heroJQ_02")); break; case "exit_hire": Pchar.questTemp.HiringOfficerIDX = GetCharacterIndex(Npchar.id); AddDialogExitQuestFunction("LandEnc_OfficerHired"); NextDiag.CurrentNode = NextDiag.TempNode; NPChar.quest.meeting = true; DialogExit(); break; |
NickKolok |
Jan 9 2015, 18:04
Сообщение
#19
|
новичок Группа: Members Сообщений: 2 Регистрация: 9-January 15 Пользователь №: 35,132 |
Доброго времени суток, товарищи!
Пишу к AlexusB, ибо в личку не могу (наверное, оттого, что только зарегистрировался на форуме). Я немного программист. Обнаружил, что в игре теоретически возможен крафт вещей с уникальными характеристиками (оружия и ювелирки - точно, кораблей - не уверен, нужно изучать), причём в ряде случаев даже при сохранении совместимости сейвов. Теоретически возможен - значит, можно создать соответствующие скрипты. Прошу поделиться данными о попытках добавления крафта, целесообразности оного и т. д. P. S. Где-то в гугле видел модельки девушек-офицеров от КВЛ и ГПК. Есть ли способ импортировать их в классические ПКМ? |
CorsairMan |
Jan 9 2015, 18:20
Сообщение
#20
|
боцман Группа: форумчанин Сообщений: 100 Регистрация: 8-November 13 Пользователь №: 34,643 |
Да. Возможно.
|
Текстовая версия | Сейчас: 1st November 2024 - 03:15 |