Готовый код (scripts)

Кодинг, хаки, полезные изменения в скриптах

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

Автор темы
LEOPARD
Сообщения: 1422
Зарегистрирован: 18 сен 2016, 19:48
Благодарил (а): 145 раз
Поблагодарили: 372 раза

Готовый код (scripts)

Сообщение LEOPARD » 06 ноя 2017, 17:18

В этой теме будет находиться готовый код различных фич и новых функций.
Все вопросы по скриптам писать в специальную тему - Базовое руководство по скриптам движка Storm
:mu_zyk:
Корсары: ГПК 1.3.2 ATR
Делаем так, чтобы все корабли плавали под своей нацией
Автор скриптов - Rasteador
1
Файл PROGRAM\sea_ai\sea.c
Находим строки:

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

int iNumWarShips = 0; 
int iNumMerchantShips = 0;
Под ними добавить:

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

int iNation = PIRATE;
Находим строки:

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

if(CheckAttribute(rEncounter, "NumMerchantShips")) 
{ 
iNumMerchantShips = sti(rEncounter.NumMerchantShips); 
}
Под ними добавляем:

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

if(CheckAttribute(rEncounter, "Nation")) 
{ 
iNation = sti(rEncounter.Nation); 
}
Находим строку:

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

int iNumFantomShips = Fantom_GenerateEncounterExt(sGName, &oResult, iEncounterType, iNumWarShips, iNumMerchantShips);
Заменяем её на:

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

int iNumFantomShips = Fantom_GenerateEncounterExt(sGName, &oResult, iEncounterType, iNumWarShips, iNumMerchantShips, iNation);
Сохраняем файл
2
Файл PROGRAM\sea_ai\AIFantom.c
Находим строку:

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

int Fantom_GenerateEncounterExt(string sGroupName, object oResult, int iEType, int iNumWarShips, int iNumMerchantShips)
Заменяем её на:

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

int Fantom_GenerateEncounterExt(string sGroupName, object oResult, int iEType, int iNumWarShips, int iNumMerchantShips, int iNation)
Находим строку:

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

iShipType = Fantom_GetShipTypeExt(iMerchantClassMin, iMerchantClassMax, "Merchant", sGroupName, "Trade", iEType );
Заменяем её на:

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

iShipType = Fantom_GetShipTypeExt(iMerchantClassMin, iMerchantClassMax, "Merchant", sGroupName, "Trade", iEType, iNation );
Находим строку:

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

iShipType = Fantom_GetShipTypeExt(iWarClassMin, iWarClassMax, "War", sGroupName, "War", iEType);
Заменяем её на:

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

iShipType = Fantom_GetShipTypeExt(iWarClassMin, iWarClassMax, "War", sGroupName, "War", iEType, iNation);
Находим строку:

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

int Fantom_GetShipTypeExt(int iClassMin, int iClassMax, string sShipType, string sGroupName, string sFantomType, int iEncounterType)
Заменяем её на:

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

int Fantom_GetShipTypeExt(int iClassMin, int iClassMax, string sShipType, string sGroupName, string sFantomType, int iEncounterType, int iNation)
Под строкой:

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

iShipsNum = 0;
Добавляем:

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

aref aNation; 
string sAttr; 
bool bOk;
Под строку:

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

if (sti(rShip.Type.(sShipType)) != true) { continue; }
Добавить это:

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

bOk = false; 
if(CheckAttribute(rShip, "nation")) 
{ 
makearef(aNation, rShip.nation); 
int q = GetAttributesNum(aNation); 
for(int j = 0; j < q; j++) 
{ 
sAttr = GetAttributeName(GetAttributeN(aNation, j)); 
if(GetNationTypeByName(sAttr) == iNation && rShip.nation.(sAttr) == true ) bOk = true; 
} 
} 
if(!bOk) { continue; }
Готово!
3
Теперь прописываем всем кораблям сами флаги
Файл PROGRAM\ships\ships_init.c
В конце каждого корабля есть такие строки:

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

	refship.Track2.ZStart	= -0.15;
	refship.Track2.LifeTime = 7;
	refship.Track2.Width	= "1.2, 2.0";
	refship.Track2.Speed	= "0.15, 0.25";
После них добавляем каждому кораблю:

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

	 //Nation
    	refship.nation.england	= true;
	refship.nation.france	= false;
	refship.nation.holland	= true;
	refship.nation.pirate	= false;
	refship.nation.spain	= true;
true - плавает под этой нацией
false - не плавает под этой нацией
Делаем всем захваченным, абордажем, кораблям признак ворованности
Автор скриптов - Rasteador
Файл PROGRAM\interface\transfer_main.c
Находим функцию:

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

void InitInterface_RS(string iniName, ref _chr, string _type)
В самом её конце после bSwap = false; вставляем:

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

if(!bTransferMode) 
{ 
int stolenShip = sti(xi_refCharacter.Ship.Type); 
RealShips[stolenShip].Stolen = true; 
}
Продажа кораблей на верфи по-ворованности меняется в файле PROGRAM\scripts\ships_utilite.c
Находим: price = makeint(price/
Цифра после price - это делитель стоимости продажи корабля.
Т.е. если поставить 9, то все захваченные корабли будут продаваться за 10% от его стоимости.
Добавляем генератор "отбермуженных" характеристик для кораблей (update_22.01.2018)
Автор сего скрипта
1
Качаем файл ShipsTuning
Распаковываем его в PROGRAM\scripts
2
Открываем файл PROGRAM\scripts\utils.c
В самом верху добавляем строку:

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

#include "scripts\ShipsTuning.c"
3
Открываем файл PROGRAM\characters\charactersUtilite.c
Находим функцию:

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

void SetBaseShipData(ref refCharacter)
В самом её конце после

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

refCharacter.ship.crew.disease = 0;
дописываем с новой строки:

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

SetTuningShipStates(refCharacter);
Готово!
Теперь у Вас есть шанс захватить какой-нибудь корабль с отбермуженными ТТХ (рандомно)
Меняем размер матрицы для иконок кораблей (НЕ РАБОТАЕТ, ЗАШИТО В ДВИЖКЕ)
Rasteador
Файл PROGRAM\battle_interface\BattleInterface.c
Находим:

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

	BattleInterface.CommandTextures.list.t1.name = "battle_interface\ship_icons1.tga";
	BattleInterface.CommandTextures.list.t1.xsize = 8;
	BattleInterface.CommandTextures.list.t1.ysize = 8;
xsize = 8 и ysize = 8 - 512х512
Если нужна текстура больше, скажем, как в ККС, то меняем 8 на 16 = 1024х1024
Увеличиваем свой флот до 8 кораблей
Файл PROGRAM\characters\characters.h
Находим:

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

#define COMPANION_MAX	5
Меняем на:

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

#define COMPANION_MAX	8
Файл PROGRAM\Battle_Interface\BattleInterface.c
Находим строки:

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

	BattleInterface.ShipIcon.iconoffset1 = "70,70";
	BattleInterface.ShipIcon.iconoffset2 = "70,198";
	BattleInterface.ShipIcon.iconoffset3 = "70,326";
	BattleInterface.ShipIcon.iconoffset4 = "70,454";
	BattleInterface.ShipIcon.iconoffset5 = "70,582";
Сразу после них добавляем:

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

	BattleInterface.ShipIcon.iconoffset6 = "70,710";
	BattleInterface.ShipIcon.iconoffset7 = "70,838";
	BattleInterface.ShipIcon.iconoffset8 = "70,966";
Файл PROGRAM\Battle_Interface\WmInterface.c
Находим строки:

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

	BattleInterface.wm_sign.iconoffset1 = "70,70";
	BattleInterface.wm_sign.iconoffset2 = "70,198";
	BattleInterface.wm_sign.iconoffset3 = "70,326";
	BattleInterface.wm_sign.iconoffset4 = "70,454";
	BattleInterface.wm_sign.iconoffset5 = "70,582";
Сразу после них добавляем:

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

	BattleInterface.wm_sign.iconoffset6 = "70,710";
	BattleInterface.wm_sign.iconoffset7 = "70,838";
	BattleInterface.wm_sign.iconoffset8 = "70,966";
Файл PROGRAM\interface\ship.c
Находим строку:

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

GameInterface.SHIPS_SCROLL.NotUsed = 5 - m + 1;
Заменяем её на:

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

GameInterface.SHIPS_SCROLL.NotUsed = COMPANION_MAX - m + 1;

Во всех остальных файлах нужно проделать одну и туже процедуру:
Файл PROGRAM\interface\cannons.c
Файл PROGRAM\interface\ColonyCapture.c
Файл PROGRAM\interface\hirecrew.c
Файл PROGRAM\interface\store.c
Найти:

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

FillScrollImageWithCompanionShips("SHIPS_SCROLL", 5);
Заменить на:

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

FillScrollImageWithCompanionShips("SHIPS_SCROLL", COMPANION_MAX);
В итоге мы имеем армаду для развлечений, а может быть и для каких либо целей
Изображение
Решаем проблемы с камерой в море на широкоформатных мониторах
Файл PROGRAM\sea_ai\AICameras.c
Находим значение:

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

SeaFreeCamera.Perspective = 1.285;
Меняем его на:

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

SeaFreeCamera.Perspective = 2.085;
Находим значение:

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

SeaShipCamera.MaxDistance = 90.0;
Меняем его на:

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

SeaShipCamera.MaxDistance = 1500.0;
Это должно помочь с проблемой камеры на некоторых кораблях.
Делаем быстрое сохранение продвинутым
Это изменение позволит делать быстрое сохранение на новый слот, вместо перетирания старого. Т.е. так, если бы мы сохранялись через меню по Esc
Файл PROGRAM\interface\interface.c
Находим строку:

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

string curSave = PlayerProfile.name + " QuickSave";
Полностью заменяем её на:

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

// espkk # quick save/load # 28/Jan/2017 -->
	//string curSave = PlayerProfile.name + " QuickSave";
	GameInterface.SavePath = "SAVE\" + PlayerProfile.name;
	string saveName;
	int nSaveSize;
	SendMessage(&GameInterface,"llee",MSG_INTERFACE_SAVE_FILE_FIND,0,&saveName,&nSaveSize);
	string curSave = saveName;
// espkk # quick save/load # 28/Jan/2017 <--
Находим строки:

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

	string curSave = PlayerProfile.name + " QuickSave";
	SendMessage(&GameInterface,"ls",MSG_INTERFACE_DELETE_SAVE_FILE,curSave);
	string sSaveDescriber = GetSaveDataString(GetCurLocationName());
Полностью заменяем их на:

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

// espkk # quick save/load # 28/Jan/2017 -->
	//string curSave = PlayerProfile.name + " QuickSave";
	//SendMessage(&GameInterface,"ls",MSG_INTERFACE_DELETE_SAVE_FILE,curSave);
	//string sSaveDescriber = GetSaveDataString(GetCurLocationName());
	GameInterface.SavePath = "SAVE\" + PlayerProfile.name;
	string curLocName = GetCurLocationName();
	
	// espkk. unnamed location fix. 19/Apr/2017
	if (curLocName == "") 
		curLocName = "Unknown location";
	
	string curSave = curLocName;
	int idx = 1;
	while(SendMessage(&GameInterface,"ls", MSG_INTERFACE_NEW_SAVE_FILE_NAME, curSave) == 1)
	{
		curSave = curLocName + " " + idx;
		idx++;
	}
	string sSaveDescriber = GetSaveDataString(curSave);
// espkk # quick save/load # 28/Jan/2017 <--
Quick Save/Load из ККС
Очень полезное изменение для сейв/лоад. Быстрый сейв занимает 3 слота. Каждый новый перезаписывает самый старый. Быстрая загрузка загружает самый последний сейв.
Файл PROGRAM\interface\interface.c

Находим 3 функции:

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

void MakeQuickLoad()
{
	// boal лишнее if( InterfaceStates.Launched != 0 ) {return;}
	if( bPlayVideoNow ) {return;}
	string curSave = PlayerProfile.name + " QuickSave";
	SetEventHandler("evntLoad","LoadGame",0);
	PostEvent("evntLoad",0,"s", "SAVE\"+PlayerProfile.name+"\"+curSave);
}

void MakeQuickSave()
{
	if( IsNetActive() ) {return;}
	if( bPlayVideoNow ) {return;}

	aref arTmp;
	if( FindClass(arTmp,"fader") ) {return;}

	if (!CheckSaveGameEnabled()) {return;}

	if( InterfaceStates.Launched != 0 ) {return;}

	// boal 09.07.06 -->
	if (!QuickSaveGameEnabledHardcore())
	{
        Log_Info("Сохранение в данной игре возможно только в церквях.");
		return;
	}
	
	if(iPayForSaveLoad() == 0)	// Warship. Платный S/L
	{
		Log_Info("Не хватает денег, чтобы сделать быстрое сохранение");
		return;
	}
	
	SetTimeScale(1.0);
	TimeScaleCounter = 0;
	DelPerkFromActiveList("TimeSpeed");
	DeleteAttribute(pchar, "pause");
	
	// boal 09.07.06 <--
	aref arScrShoter;
	if( !FindClass(&arScrShoter,"scrshoter") ) {
		SetEventHandler("makescrshot","QuickSaveContinue",0);
		CreateScreenShoter();
		PostEvent("makescrshot",1);
	} else { return; }
}

void QuickSaveContinue()
{
	DelEventHandler("makescrshot","QuickSaveContinue");

	LaunchQuickSaveMenu();
	string curSave = PlayerProfile.name + " QuickSave";
	SendMessage(&GameInterface,"ls",MSG_INTERFACE_DELETE_SAVE_FILE,curSave);
	string sSaveDescriber = GetSaveDataString(GetCurLocationName());

	SetEventHandler("evntSave","SaveGame",1);
	PostEvent("evntSave",0,"ss", "SAVE\"+PlayerProfile.name+"\"+curSave, sSaveDescriber);
}

void MakeAutoSave()
{
	if( InterfaceStates.Launched != 0 ) {return;}

	aref arScrShoter;
	if( !FindClass(&arScrShoter,"scrshoter") ) {
		SetEventHandler("makescrshot","AutoSaveContinue",0);
		CreateScreenShoter();
		PostEvent("makescrshot",1);
	} else { return; }
}
Полностью заменяем их на:

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

void MakeQuickLoad()
{
	// boal лишнее if( InterfaceStates.Launched != 0 ) {return;}
	if( bPlayVideoNow ) {return;}
	// ugeen 2017 -->
	int QuickSaveIndex = 1;
	if( CheckAttribute(&PlayerProfile,"QuickSaveIndex") ) {
		QuickSaveIndex = sti(PlayerProfile.QuickSaveIndex);
	}	
	string curSave = PlayerProfile.name + " QuickSave " + QuickSaveIndex;
	// <-- ugeen 2017
	SetEventHandler("evntLoad","LoadGame",0);
	PostEvent("evntLoad",0,"s", "SAVE\"+PlayerProfile.name+"\"+curSave);
}

void MakeQuickSave()
{
	if( IsNetActive() ) {return;}
	if( bPlayVideoNow ) {return;}

	aref arTmp;
	if( FindClass(arTmp,"fader") ) {return;}

	if (!CheckSaveGameEnabled()) {return;}

	if( InterfaceStates.Launched != 0 ) {return;}

	// boal 09.07.06 -->
	if (!QuickSaveGameEnabledHardcore())
	{
        Log_Info("Сохранение в данной игре возможно только в церквях.");
		return;
	}
	
	SetTimeScale(1.0);
	TimeScaleCounter = 0;
	DelPerkFromActiveList("TimeSpeed");
	DeleteAttribute(pchar, "pause");
	
	// boal 09.07.06 <--
	aref arScrShoter;
	if( !FindClass(&arScrShoter,"scrshoter") ) {
		SetEventHandler("makescrshot","QuickSaveContinue",0);
		CreateScreenShoter();
		PostEvent("makescrshot",1);
	} else { return; }
}

void QuickSaveContinue()
{
	DelEventHandler("makescrshot","QuickSaveContinue");

	LaunchQuickSaveMenu();
	//ugeen 2017 -->
	int QuickSaveIndex = 1;
	if( CheckAttribute(&PlayerProfile,"QuickSaveIndex") ) {
		QuickSaveIndex = sti(PlayerProfile.QuickSaveIndex);
		if(QuickSaveIndex == 3) {
			QuickSaveIndex = 1;
		}	
		else {
			QuickSaveIndex++;
		}	
	}
	PlayerProfile.QuickSaveIndex = QuickSaveIndex;
	
	string curSave = PlayerProfile.name + " QuickSave " + QuickSaveIndex;
	// <-- ugeen 2017
	SendMessage(&GameInterface,"ls",MSG_INTERFACE_DELETE_SAVE_FILE,curSave);
	string sSaveDescriber = GetSaveDataString(GetCurLocationName());

	SetEventHandler("evntSave","SaveGame",1);
	PostEvent("evntSave",0,"ss", "SAVE\"+PlayerProfile.name+"\"+curSave, sSaveDescriber);
}
Меняем протяженность дня на глобальной карте
Файл PROGRAM\worldmap\worldmap_init.c
Находим значение:

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

worldMap.date.hourPerSec = 1.5;
Чем оно ниже, тем медленней идет день
Увеличиваем микроскопические иконки кораблей в море
Для тех, кому надоело присматриваться на мизерные иконки кораблей посвящается!

Файл PROGRAM\battle_interface\BattleInterface.c
Находим строки:

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

	BattleInterface.CommandList.CommandIconWidth = RecalculateHIcon(48);
	BattleInterface.CommandList.CommandIconHeight = RecalculateVIcon(48);
48 - это пикселы (можно увеличить до 90, чтобы без проблем рассмотреть корабль)
Было-Стало
Изображение
Изображение
Подгоняем интерфейс под форматы 16:9
Файл PROGRAM\interface\Interface.c
Находим:

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

showWindow.aspectRatio = (h*4.0)/(w*3.0);
Меняем на:

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

showWindow.aspectRatio = 1.0;
Смотрим разницу
ИзображениеИзображение
Переработка мушкетного залпа (теперь он действительно убивает 1/4 команды на корабле)
Файл PROGRAM\Loc_ai\LAi_boarding.c
Найти:

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

	// MusketsShoot --> 
	float tmpDefence;
    if (CheckOfficersPerk(mchr, "MusketsShoot") && IsFort == false)
    {
        tmpDefence   = MakeFloat(GetSummonSkillFromName(echr, SKILL_DEFENCE)) / SKILL_MAX;
        ecrewBak = makeint(ecrew * 0.25);
		if (ecrewBak > mcrew) ecrewBak = mcrew;
		ecrewBak = makeint(ecrewBak * (2.1 - tmpDefence) / 2.0);
        ecrew = ecrew - ecrewBak;
        Log_SetStringToLog("Мушкетным залпом убито " + ecrewBak + " человек команды противника.");
        PlaySound("INTERFACE\_musketshot.wav");
    }
	if (CheckCharacterPerk(echr, "MusketsShoot") && IsFort == false)
    {
        tmpDefence   = MakeFloat(GetSummonSkillFromName(mchr, SKILL_DEFENCE)) / SKILL_MAX;
        ecrewBak = makeint(mcrew * 0.25);
		if (ecrewBak > ecrew) ecrewBak = ecrew;
		ecrewBak = makeint(ecrewBak * (2.1 - tmpDefence) / 2.0);
        mcrew = mcrew - ecrewBak;
        Log_SetStringToLog("Мушкетным залпом убито " + ecrewBak + " человек нашей команды.");
        Statistic_AddValue(mchr, "DeadCrewBoard", ecrewBak);
		Statistic_AddValue(mchr, "Sailors_dead", ecrewBak);
        PlaySound("INTERFACE\_musketshot.wav");
    }
    // MusketsShoot <--
Заменить на:

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

	// MusketsShoot --> 
	float tmpDefence; 
	if (CheckOfficersPerk(mchr, "MusketsShoot") && IsFort == false) 
	{ 
		tmpDefence  = MakeFloat(GetSummonSkillFromName(echr, SKILL_DEFENCE)) / SKILL_MAX; 
		//aw013 ecrewBak = makeint(ecrew * 0.25); 
		ecrewBak = makeint(mcrew * 0.25);//aw013 
		//aw013	if (ecrewBak > mcrew) ecrewBak = mcrew; 
		ecrewBak = makeint(ecrewBak * (2.1 - tmpDefence) / 2.0); 
		if (ecrewBak > ecrew) ecrewBak = ecrew;//aw013 
		PlaySound("INTERFACE\_musketshot.wav"); 
		ecrew = ecrew - ecrewBak; 
		Log_SetStringToLog("Мушкетным залпом убито " + ecrewBak + " человек команды противника."); 
	} 
	if (CheckOfficersPerk(echr, "MusketsShoot") && IsFort == false) 
	{ 
		tmpDefence  = MakeFloat(GetSummonSkillFromName(mchr, SKILL_DEFENCE)) / SKILL_MAX; 
		//aw013 ecrewBak = makeint(mcrew * 0.25); 
		ecrewBak = makeint(ecrew * 0.25);//aw013 
		//aw013	if (ecrewBak > ecrew) ecrewBak = ecrew; 
		ecrewBak = makeint(ecrewBak * (2.1 - tmpDefence) / 2.0); 
		if (ecrewBak > mcrew) ecrewBak = mcrew;//aw013 
		PlaySound("INTERFACE\_musketshot.wav"); 
		mcrew = mcrew - ecrewBak; 
		Log_SetStringToLog("Мушкетным залпом убито " + ecrewBak + " человек нашей команды."); 
		Statistic_AddValue(mchr, "DeadCrewBoard", ecrewBak); 
	} 
	// MusketsShoot <--
Добавляем дополнительную информацию для предметов
Спасибо, Rasteador, за помощь в правке кода!
Файл PROGRAM\interface\utilite.c
Найти:

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

string GetItemDescribe(int iGoodIndex)
{
	string GoodName = Items[iGoodIndex].name;
	ref    arItm = &Items[iGoodIndex];
	int    lngFileID = LanguageOpenFile("ItemsDescribe.txt");
    string describeStr = "";

	if (CheckAttribute(arItm, "groupID"))
	{
		if(arItm.groupID == GUN_ITEM_TYPE)
		{
			describeStr += GetAssembledString(
				LanguageConvertString(lngFileID,"weapon gun parameters"),
				arItm) + newStr();
		}
		if(arItm.groupID==BLADE_ITEM_TYPE)
		{
			describeStr += GetAssembledString(
				LanguageConvertString(lngFileID,"weapon blade parameters"),
				arItm) + newStr();
			if (CheckAttribute(arItm, "FencingType"))
			{
    			arItm.FencingTypeName = XI_ConvertString(arItm.FencingType);
    			describeStr += GetAssembledString( LanguageConvertString(lngFileID,"weapon blade type"), arItm) + newStr();
			}
			else
			{
                describeStr += "ERROR" + newStr();
			}
		}
	}

	describeStr = describeStr + GetAssembledString(LanguageConvertString(lngFileID, Items[iGoodIndex].describe), &Items[iGoodIndex]);
	if (CheckAttribute(arItm, "potion"))
	{
		if (CheckAttribute(arItm, "potion.health"))
		{
			describeStr += NewStr() + LanguageConvertString(lngFileID, "Potion parameters")+":";
			describeStr += " "+LanguageConvertString(lngFileID, "health value");
			if (stf(arItm.potion.health) >= 0)
			{	
				describeStr += "+" + sti(arItm.potion.health);
			} 
			else
			{	
				describeStr += "" + sti(arItm.potion.health);
			}
		}
	}
    describeStr += newStr() + XI_ConvertString("weight") + " " + FloatToString(stf(arItm.weight), 1);
    
	LanguageCloseFile(lngFileID);
	
	return describeStr;
}
Заменить на:

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

string GetItemDescribe(int iGoodIndex)
{
	string GoodName = Items[iGoodIndex].name;
	ref    arItm = &Items[iGoodIndex];
	int    lngFileID = LanguageOpenFile("ItemsDescribe.txt");
    string describeStr = "";
	
	//aw013 --> 
	float fItmPrice = stf(arItm.price) / stf(arItm.Weight);
	describeStr += "Цена " + FloatToString(stf(arItm.price), 1) + " Вес " + FloatToString(stf(arItm.weight), 2) + " Цена/Вес " + FloatToString(fItmPrice, 1) + " зол./фунт" + newStr(); 
	//aw013 <-- 

	if (CheckAttribute(arItm, "groupID"))
	{
		//aw013 -->
		if(arItm.groupID == CIRASS_ITEM_TYPE) 
		{ 
			float fItmShield = stf(arItm.CirassLevel) * 100.0;
			describeStr += "Защита " + FloatToString(fItmShield, 2) + " проц." + newStr();
		} 
		//aw013 <--
		
		if(arItm.groupID == GUN_ITEM_TYPE)
		{
			describeStr += GetAssembledString(
				LanguageConvertString(lngFileID,"weapon gun parameters"),
				arItm) + newStr();
		}
		if(arItm.groupID==BLADE_ITEM_TYPE)
		{
			describeStr += GetAssembledString(
				LanguageConvertString(lngFileID,"weapon blade parameters"),
				arItm) + newStr();
			if (CheckAttribute(arItm, "FencingType"))
			{
    			arItm.FencingTypeName = XI_ConvertString(arItm.FencingType);
    			describeStr += GetAssembledString( LanguageConvertString(lngFileID,"weapon blade type"), arItm) + newStr();
			}
			else
			{
                describeStr += "ERROR" + newStr();
			}
		}
	}

	describeStr = describeStr + GetAssembledString(LanguageConvertString(lngFileID, Items[iGoodIndex].describe), &Items[iGoodIndex]);
	if (CheckAttribute(arItm, "potion"))
	{
		if (CheckAttribute(arItm, "potion.health"))
		{
			describeStr += NewStr() + LanguageConvertString(lngFileID, "Potion parameters")+":";
			describeStr += " "+LanguageConvertString(lngFileID, "health value");
			if (stf(arItm.potion.health) >= 0)
			{	
				describeStr += "+" + sti(arItm.potion.health);
			} 
			else
			{	
				describeStr += "" + sti(arItm.potion.health);
			}
		}
	}
//aw013    describeStr += newStr() + XI_ConvertString("weight") + " " + FloatToString(stf(arItm.weight), 1);
    
	LanguageCloseFile(lngFileID);
	
	return describeStr;
}
Добавляем возможность для офицеров - "найм на постоянку" (по контракту, офицеры не будут увольняться, чем бы Вы не занимались)
Файл PROGRAM\scripts\Crew.c
Найти:

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

int GetMoneyForOfficer(ref Npchar)
{
    if (CheckAttribute(Npchar, "Payment") && makeint(Npchar.Payment) == true)
    {
	    int i, sum;
	    sum = 0;
	    for (i=1; i<15; i++)
	    {
	        sum += GetSkillValue(Npchar, SKILL_TYPE, GetSkillNameByIdx(i));
	    }
	    return MOD_SKILL_ENEMY_RATE*4*sum;
    }

    return 0;
}
Заменить на:

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

int GetMoneyForOfficer(ref Npchar)
{
    if (CheckAttribute(Npchar, "Payment") && makeint(Npchar.Payment) == true)
    {
	    int i, sum;
	    sum = 0;
	    for (i=1; i<15; i++)
	    {
			sum += GetSkillValue(Npchar, SKILL_TYPE, GetSkillNameByIdx(i));
	    }
		if (!CheckAttribute(Npchar, "OfficerWantToGo.DontGo"))// aw013 за постоянство надо платить 
		{ 
		return MOD_SKILL_ENEMY_RATE*4*sum;
		} 
		else 
		{ 
		return MOD_SKILL_ENEMY_RATE*8*sum; 
		}	
    }

    return 0;
}
Файл PROGRAM\dialogs\russian\Enc_Officer_dialog.c
Найти:

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

if (isOfficer(Npchar)) // проверка для кампуса, где слотовые офы
			{
				Link.l2 = "Слушай мой приказ!";
				Link.l2.go = "stay_follow";
			}
Сразу после найденного вставляем:

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

//aw013 --> Найм на постоянку 
			if (!CheckAttribute(NPChar, "OfficerWantToGo.DontGo")) 
			{ 
				Link.l3 = "У меня к тебе предложение."; 
				Link.l3.go = "contract"; 
			} 
			//aw013 <-- Найм на постоянку
Найти:

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

		case "exit_fire":
			//navy -->
			if (CheckAttribute(NPChar, "PGGAi"))
			{
				pchar.questTemp.FiringOfficerIDX = NPChar.index;
				AddDialogExitQuestFunction("PGG_FireOfficer");
				DialogExit();			
				break;
			}
			//navy <--
			Diag.TempNode = "Fired";
			Pchar.questTemp.FiringOfficerIDX = GetCharacterIndex(Npchar.id);
			AddDialogExitQuestFunction("LandEnc_OfficerFired");

			Diag.CurrentNode = Diag.TempNode;
			NPChar.quest.meeting = true;

			DialogExit();			
		break;
Сразу после найденного вставляем:

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

//aw013 --> Найм на постоянку 
		case "contract": 
			dialog.text = "Слушаю вас внимательно, капитан."; 
			Link.l1 = "Ты хороший офицер и полностью мне подходишь. Хочу предложить тебе пойти ко мне на службу по контракту."; 
			Link.l1.go = "contract2"; 
		break; 

		case "contract2": 
			dialog.text = "Спасибо за добрые слова, капитан. А какие условия по контракту?"; 
			Link.l1 = "Оплата вдвое от обычного. Экипировка получше, сам понимаешь. Срок контракта 2 года. Уволится можешь по истечению срока, а если все будет устраивать нас обоих, продлеваем дальше."; 
			Link.l1.go = "contract3"; 
		break; 

		case "contract3": 
			dialog.text = "Заманчивое предложение, ничего не скажешь. На спокойную старость заработать немного. А как насчет небольших подьемных для постоянного состава?"; 
			if (sti(Pchar.money) >= sti(NPChar.rank)*500) 
			{ 
				Link.l1 = "Ничего против не имею, "+sti(NPChar.rank)*500+" золотых прямо сейчас на руки тебя устроит?"; 
				Link.l1.go = "contract4"; 
			} 
			Link.l2 = "Ничего против не имею, но давай вернемся к этому разговору позже."; 
			Link.l2.go = "Exit"; 
		break; 

		case "contract4": 
			dialog.text = "Вполне, капитан. Я согласен."; 
			AddMoneyToCharacter(Pchar, -(makeint(sti(NPChar.rank)*500))); 
			SetCharacterPerk(NPChar, "EnergyPlus"); 
			SetCharacterPerk(NPChar, "HPPlus"); 
			NPChar.OfficerWantToGo.DontGo = true; 
			NPChar.loyality = MAX_LOYALITY; 
			NPChar.Reputation = 50; 
			DeleteAttribute(NPChar, "alignment"); 
			Link.l1 = "Вот и отлично! Договорились"; 
			Link.l1.go = "Exit"; 
		break; 
		//aw013 <-- Найм на постоянку
Делаем так, чтобы при парковке корабля в ПУ оставалась команда на корабле
Говорим спасибо, Rasteador, автору мода Корсары: New Abilities 0.4.0.

Файл PROGRAM\dialogs\russian\Common_Portman.c
Находим строку и закомментируем её двойным слешем "//":

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

chref.Ship.Crew.Quantity  = 0;

Файл PROGRAM\dialogs\russian\Common_Portman.c
Находим сроку:

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

int price = makeint( sti(RealShips[sti(chref.Ship.Type)].Price) * (5 + MOD_SKILL_ENEMY_RATE) * (3 + GetNationRelation2MainCharacter(sti(NPChar.nation)))/360.0 );
И сразу после неё вставляем:

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

price = price + sti(chref.Ship.Crew.Quantity) * 10;

Готово!
Последний раз редактировалось LEOPARD 07 дек 2017, 22:04, всего редактировалось 1 раз.



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

Автор темы
LEOPARD
Сообщения: 1422
Зарегистрирован: 18 сен 2016, 19:48
Благодарил (а): 145 раз
Поблагодарили: 372 раза

Готовый код (scripts)

Сообщение LEOPARD » 15 фев 2018, 12:02

Открыл тему.
Сюда добавляем различные фишки и улучшения только по скриптовому коду.

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