Базовое руководство по скриптам движка Storm

Корсары ГПК, Корсары КС

Скрипты на движке "Storm"
Аватара пользователя

kacatik
Сообщения: 9
Зарегистрирован: 24 янв 2017, 16:08
Благодарил (а): 5 раз

Базовое руководство по скриптам движка Storm

Сообщение kacatik » 08 фев 2018, 18:02

очень стрёмный вопрос! если в лом то прошу прочтений прошений! мучаю неделю!!!
кк нейтрализовать абордаж в ФОРТе!? if( isDEAD(pchar) ) ==?
у мене в модаддоне смерти нет и реинкорнации!
те -- при реинкорнации заблокированы F2, save + "продолжение"
в seadog.c & reaction_function.c игнорирует!
есть-ли кардинальный рецепт!? что реално фиксит форт-абордаж шоб нейтралазовать\отменить!?

Отправлено спустя 4 минуты 32 секунды:
те... при переходе в локу города всё в норме! == доступно=фурычит! == те... чо отвечает за разблокировку интерфеса!?

Отправлено спустя 2 минуты 46 секунд:
те -- при переходе по квесту абордаж!
а при переносе ГГ в другу локашн == блок интерфейса остаетса!

Отправлено спустя 1 минуту 44 секунды:
if( LAi_isDead(pchar) )

Отправлено спустя 13 минут 15 секунд:
F2 разблокироваетса == CreateAbordageEnvironment();
а кк == "save" & "продолжить" по "esc"!?
=== !? ;)))



Аватара пользователя

Rasteador
Сообщения: 30
Зарегистрирован: 13 ноя 2017, 21:28
Благодарил (а): 2 раза
Поблагодарили: 14 раз

Базовое руководство по скриптам движка Storm

Сообщение Rasteador » 08 фев 2018, 20:00

kacatik писал(а):
08 фев 2018, 18:24
кк нейтрализовать абордаж в ФОРТе!? if( isDEAD(pchar) ) ==?
у мене в модаддоне смерти нет и реинкорнации!
Что имеется в виду под "нейтрализовать"? В чем заключается проблема?

Отправлено спустя 2 минуты 35 секунд:
kacatik писал(а):
08 фев 2018, 18:24
у мене в модаддоне смерти нет и реинкорнации!
Насчет этого пункта подробнее, пожалуйста. Реинкарнации в игре и так нет.
Love and respect

Аватара пользователя

kacatik
Сообщения: 9
Зарегистрирован: 24 янв 2017, 16:08
Благодарил (а): 5 раз

Базовое руководство по скриптам движка Storm

Сообщение kacatik » 09 фев 2018, 00:28

звиняюс! у меня в модаддоне реинкорнашн Е! и если реинк (те LAi_isDead(pchar)) из форта/локашн то блок по ESC = save + "продолжить" ( блок F2 снимаю CreateAbordageEnvironment(); - пишу в seadogs.c ) >>> реинкорнашн в Get_My_Cabin() !!! (лока кораблей в необитайку) тож видимо стрёмный вариант)))
проблема! = снять блок по ESC ! == игнорирует если просто пишу соответну функшн типа b... = false; или = true;! те видимо при заходе в абордаж-форт гдето чото отсекает кардинально! не могу понять чтоб перехватить или откатить при незавершонном абордаже (при переходе битвы в город всё разблокироваетса)
понимаю - сложно! но Я (((ЯЯЯ))) даже не понимаю логику-технику процесса! чтоб кк-то обхитрить/обойти движок (если это не код, кторый не могу опознать)))
(((конечно это вопрос к AlexusB... но где он? и за такие вопросы меня сразу забанят на их сайтах! где Я и был давно забанен... конечно снова зарегитса под новым ником могу но тщетно видимо при их отношэнии к аддоншикам)))

Отправлено спустя 11 часов 17 минут 11 секунд:
изменил скипт для ПГГ - чтоб они реинкарнировались и снова жили в игре
не знаю рабочий-ли скрипт!? на первый взгляд как!?
проверить муторно ибо в игре сработает за кадром... и снова встреча возможна будет случайна...

сначала мой скрип

Код: Выделить всё

//выжил или нет - DA! ;)
    if (sti(chr.PGGAi.IsPGG)) // && rand(100) > 50)
    {
  PGG_DebugLog(chr.id + " ВЫЖИЛ :)))"); // уходит из игры
  chr.PGGAi.Rebirth = true;
  if (CheckAttribute(chr, "PGGAi.location.town.back"))
  {
   chr.PGGAi.location.town = chr.PGGAi.location.town.back;
  }
  if (chr.PGGAi.location.town == "None")
  {
   chr.PGGAi.location.town = PGG_FindRandomTownByNation(sti(chr.nation));
  }
  DeleteAttribute(chr, "PGGAi.Task");
  DeleteAttribute(chr, "PGGAi.LockService");
  return;
    }
    else
    {
  if (IsOfficer(chr) || IsCompanion(chr))
  {
   PGG_DebugLog(chr.id + " ушол но обешял вернутьса ;)"); // уходит из игры
   Log_Info(GetFullName(chr) + " ушол из жизни но обешял вернуться :)");
   chr.PGGAi.IsPGG = true;
   chr.RebirthPhantom = true;
   chr.PGGAi.location.town = PGG_FindRandomTownByNation(sti(chr.nation));
   chr.Dialog.FileName = "PGG_Dialog.c";
   chr.Dialog.CurrentNode = "Second Time";
   PGG_ChangeRelation2MainCharacter(chr, -20);
   LAi_SetCurHPMax(chr);
   if (CheckAttribute(chr, "Ship")) DeleteAttribute(chr, "Ship");
   chr.Ship.Type = SHIP_NOTUSED;    
   return; 
тепер оригинал

Код: Выделить всё

  //выжил или нет
    if (sti(chr.PGGAi.IsPGG) && rand(100) > 50)
    {
  PGG_DebugLog(chr.id + " уходит из игры :(");
    }
    else
    {
  if (IsOfficer(chr) || IsCompanion(chr))
  {
   PGG_DebugLog(chr.id + " уходит из игры :(((");
  }
  else
  {
   chr.PGGAi.Rebirth = true;
   PGG_DebugLog(chr.id + " выжил :)))");
   if (CheckAttribute(chr, "PGGAi.location.town.back"))
   {
    chr.PGGAi.location.town = chr.PGGAi.location.town.back;
   }
   if (chr.PGGAi.location.town == "None")
   {
    chr.PGGAi.location.town = PGG_FindRandomTownByNation(sti(chr.nation));
   }
   DeleteAttribute(chr, "PGGAi.Task");
   DeleteAttribute(chr, "PGGAi.LockService");
   return;
Последний раз редактировалось LEOPARD 09 фев 2018, 12:05, всего редактировалось 1 раз.
Причина: Подправил код скриптов

Аватара пользователя

Rasteador
Сообщения: 30
Зарегистрирован: 13 ноя 2017, 21:28
Благодарил (а): 2 раза
Поблагодарили: 14 раз

Базовое руководство по скриптам движка Storm

Сообщение Rasteador » 09 фев 2018, 12:00

kacatik писал(а):
09 фев 2018, 00:28
даже не понимаю логику-технику процесса!
После нажатия на кнопку F2 идет вызов функции void ProcessInterfaceKey(). Дальше в ней идут различные проверки (условия в if. если какое-либо условие "истинно", то срабатывает return; и прекращается дальнейшее выполнение скрипта) и, в конце, если все проверки успешно пройдены, то вызывается функция LaunchSelectMenu();, которая уже и открывает F2-интерфейс.

То что ты снимаешь блокировку функцией CreateAbordageEnvironment(); - это не очень хорошо. Она для этого не предназначена. В ProcessInterfaceKey() можно заметить, что есть проверка на bAbordageStarted - это значит, что когда bAbordageStarted == true (т.е. установлен флаг "Абордаж начат"), то идет return. Так что вместо CreateAbordageEnvironment(); достаточно просто прописать bAbordageStarted = false; и блокировка должна быть снята.

По такому же принципу можно проверить и остальные блокировки, посмотрев какие переменные используются в конкретный момент в игре.

Теперь, что насчет блокировки "Сохранения" в ESC. В этом случае, для проверки возможности сэйва, используется функция bool CheckSaveGameEnabled(). Как я описал выше, здесь также нужно посмотреть, какие в ней прописаны условия, которые могут блокировать, и уже отслеживать их.
Love and respect

Аватара пользователя

Rasteador
Сообщения: 30
Зарегистрирован: 13 ноя 2017, 21:28
Благодарил (а): 2 раза
Поблагодарили: 14 раз

Базовое руководство по скриптам движка Storm

Сообщение Rasteador » 09 фев 2018, 12:08

kacatik писал(а):
09 фев 2018, 11:52
изменил скипт для ПГГ - чтоб они реинкарнировались и снова жили в игре
не знаю рабочий-ли скрипт!? на первый взгляд как!?
проверить муторно ибо в игре сработает за кадром... и снова встреча возможна будет случайна...
Что ты изменил? Ты хочешь сделать, чтобы ПГГ реинкарнировались всегда?
Love and respect

Аватара пользователя

kacatik
Сообщения: 9
Зарегистрирован: 24 янв 2017, 16:08
Благодарил (а): 5 раз

Базовое руководство по скриптам движка Storm

Сообщение kacatik » 09 фев 2018, 12:21

буду пробовать все эти проверки b...=true (или=false, по ситуации))) во всех моих вызовах воскресений ГГ! в других ситуациях (смерт=воскресение) всё ОК! вот токо форт завис!
в ESC еще "продолжить игру" блокировано... ну, пойду опять "всё гениально перепишу"!))) доложу кк если получитса!

дада! ПГГ бессмертны тож должны быть если ГГ бессмертен)))

Отправлено спустя 2 минуты 37 секунд:
вопшэм в моей игре смерти нет! ну не должно быть! Е смертельно ранение)))

Отправлено спустя 3 минуты 45 секунд:
в детстве понравилась логика в расказе Шэкли - вот это и внедряю)))

Отправлено спустя 8 минут 52 секунды:
возможно надо было написать установку при новой игре ГГ=minHP... и квесты по ситуации а я через GamOver() воскресаю...

Аватара пользователя

kacatik
Сообщения: 9
Зарегистрирован: 24 янв 2017, 16:08
Благодарил (а): 5 раз

Базовое руководство по скриптам движка Storm

Сообщение kacatik » 11 фев 2018, 17:19

для воскресений в форте 3 files:
LAi_events.c
void LAi_Character_Dead_Process(aref chr)
if(locType != BRDLT_FORT) PostEvent("LAi_event_GameOver", 5000, "s", "boarding");
else PostEvent("LAi_event_GameOver", 5000, "s", "fortshturm"); ///R
seadogs.c
case "fortshturm":
if(CheckAttribute(mc, "IsMushketer")) SetMainCharacterToMushketer("", false);
RemoveAllCharacterItems(mc, 0); //Удалить все обычные предметы из инвентаря
sTemp1 = GetCityNameByIsland(GetCharacterCurrentIslandId(mc));
if (CheckAttribute(mc, "GenQuestFort.StartAttack" )) DeleteAttribute(mc, "GenQuestFort.StartAttack");
Go2LocationAfterAbordage()
IsFort = false;
LAi_boarding_process = false;
break;
reaction_functions.c
void Survive_In_Fort_Go2Sea() //////=9
{
int iDay;
ref ch;
string sTemp, sTemp1, sTemp2;
DelEventHandler(EVENT_END_VIDEO,"Survive_In_Sea_Go2Land");
PChar.nation = GetBaseHeroNation(); //? sti(pchar.nation);
//получим пещеру
pchar.curIslandId = worldMap.island; // fix
sTemp = worldMap.island;
sTemp2 = SelectQuestShoreLocationFromSea(sTemp);
setCharacterShipLocation(pchar, sTemp2);
if(sTemp != "Mein")
{
sTemp = GetArealByCityName(GetCityNameByIsland(sTemp));
if (sTemp == "Cuba2") sTemp = "Cuba1";
if (sTemp == "Hispaniola2") sTemp = "Hispaniola1";
aref aPlace, aPlace_2;
makearef(aPlace, NullCharacter.TravelMap.Islands.(sTemp).Treasure);
int iQty = GetAttributesNum(aPlace)-1;
aPlace_2 = GetAttributeN(aPlace, rand(iQty));
pchar.locationId = GetAttributeName(aPlace_2); //Id целевой пещеры
}
else
{///////
sTemp = GetArealByCityName(sTemp1); //rCity);
sTemp = IslandGetLocationFromType(sTemp, "cave"); //(string _island, string _type)
pchar.locationId = GetAttributeName(sTemp); //Id целевой пещеры
}
ch = &locations[FindLocation(pchar.locationId)];
pchar.label = GetConvertStr(ch.id.label, "LocLables.txt"); //тип подземелья для диалогов
switch (pchar.label)
{
case "пещера": sTemp = "пещера!"; break;
case "грот": sTemp = "грот!"; break;
case "подземелье": sTemp = "подземелье!"; break;
}
pchar.location = pchar.locationId;
SetCrewQuantity(pchar, GetMinCrewQuantity(pchar));
if (GetCompanionQuantity(PChar) > 1)
{ //noka tak a nozzibem ybiqim
for(i = 0; i < COMPANION_MAX; i++)
{
int iTemp = GetCompanionIndex(PChar, i);
if(iTemp > 0)
{
sld = GetCharacter(iTemp);
SetCrewQuantity(sld, GetMinCrewQuantity(sld));
}
}//установили признак наличия кораблей в эскадре.
}
Survive_Continue();
iDay = 5+rand(17);
bQuestCheckProcessFreeze = true;
WaitDate("",0,0,iDay, rand(10), 1); // прошло время
bQuestCheckProcessFreeze = false;
AddSimpleRumourTip("Эх, капитан"+ GetSexPhrase("","...ша") +", угораздило же Тебя! И ведь не знаешь, печалиться или радоваться - жив"+ GetSexPhrase(" остался","а осталась") +"... А не лезь на рожон! Хе-хе.", 60, 4, "habitue", "");
SetLaunchFrameFormParam("Прошло " + iDay + " дней." + NewStr() +
"" + sTemp + "" + NewStr() +
"корабл стоит в " + GetConvertStr(sTemp2, "LocLables.txt") + "." + NewStr() +
". . . . . . ." + NewStr() +
"НУ ВОТ И ВОСКРЕСЕНИЕ" + NewStr() +
"О чудо! жив"+ GetSexPhrase("","а") +"!" + NewStr() +
"смерти нет! живём вечно!" + NewStr() +
"!но краток наш век! не ВЕК!","Reload_To_Location", 0.1, 7.0);
if (pchar.location == "Guadeloupe_Cave") SetLaunchFrameReloadLocationParam(pchar.location, "goto", "goto"+(rand(11)+8), "");
else SetLaunchFrameReloadLocationParam(pchar.location, "goto", "goto"+(rand(3)+1), "");
LaunchFrameForm();
RefreshLandTime(); //?
Statistic_AddValue(pchar, "SurviveOgane", 1);
PlaySound("MUSIC\011.ogg"); //203.mp3");
}
Но прёт реальна проблема!
после смерти=воскресеньа(уМене) в Town после захвата isFort и после WaitDate(многодней) локашн(town) пуста и губер ждет смешеньа!
те смерт=воскресенье(уМене) в town после isfort в LAi_event.c/seadogs.c определяетса кк "town"! НО с заначками "штурм форта"! те надо добавить case"townfort" в seadogs.c (?мне) и чото разблокировать...
= кк записать "локашн после форта" те "Town"! те другой вариант смерти в городе для LAi_events.c / if (loadedLocation.type == "town") ???

Аватара пользователя

Rasteador
Сообщения: 30
Зарегистрирован: 13 ноя 2017, 21:28
Благодарил (а): 2 раза
Поблагодарили: 14 раз

Базовое руководство по скриптам движка Storm

Сообщение Rasteador » 11 фев 2018, 17:33

kacatik, используй переменные, устанавливай атрибуты персонажу. Например, когда начинается осада города, ставь pchar.questTemp.citySiege = "1";. При гибели в городе, делай проверку на этот атрибут через if(CheckAttribute(pchar, "questTemp.citySiege")), чтобы вызывался именно "осадный" городской процесс. Когда осада закончена, удаляй этот атрибут: DeleteAttribute(pchar, "questTemp.citySiege");, чтобы при последующих гибелях в городе вызывался обычный скрипт, а не осадный.
Love and respect

Аватара пользователя

Rasteador
Сообщения: 30
Зарегистрирован: 13 ноя 2017, 21:28
Благодарил (а): 2 раза
Поблагодарили: 14 раз

Базовое руководство по скриптам движка Storm

Сообщение Rasteador » 11 фев 2018, 18:42

 ! Сообщение от: Rasteador
Почистил тему от оффтопа
Love and respect

Яндекс.Метрика