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

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

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

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

[Корсары] Руководство по скриптам движка Storm

Сообщение Rasteador » 19 ноя 2017, 03:11

Оглавление

1. Комментирование кода


1. Комментирование кода

Закомментировать строку можно используя //

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

// Это какой-то комментарий
// И это тоже
Закомментировать какой-то участок кода можно используя /* и */, где между ними располагается комментируемый кусок

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

/*
Это все какой-то код
И это...
И это тоже
*/
Закомментированные фрагменты движок игнорирует. Таким образом, можно временно "отключить" какие-то участки кода, не удаляя их. Также можно подписывать комментариями ваш код, чтобы в дальнейшем в нем было легче ориентироваться.



2. Переменные

int - целое число. Принимает, как положительные, так и отрицательные значения.

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

int FirstIntEx = 350;	// Положительное значение
int SecondIntEx = -185;	// Отрицательное значение


float - число с плавающей запятой a.k.a дробные числа . Принимает, как положительные, так и отрицательные значения.

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

float FirstFloatEx = 55.12;	// Положительное значение
float SecondFloatEx = -25.3;	// Отрицательное значение


bool - переменная логического типа. Принимает два значения: true (значение "истинно") или false (значение "ложно")

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

bool FirstBoolEx = true;	// Значение "истинно"
bool SecondBoolEx = false;	// Значение "ложно"


string - строковая переменная a.k.a текст

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

string FirstStringEx = "Здесь может быть какой-то текст";
string SecondStringEx = "И это тоже текст";


object - переменная древовидной структуры. Может хранить в себе какие-то "дочерние" атрибуты. Используется для более удобного коддинга, т.к. несколько переменных, относящихся к одной тематике, можно сократить до одной переменной object.

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

object objectExample; // Объявляем переменную object

// Устанавливаем дочерние атрибуты
objectExample.id = "ExampleID";
objectExample.price = 15500;

// Можно также устанавливать дочерние атрибуты дочерних атрибутов :)
// Здесь position - это дочерний атрибут переменной objectExample
objectExample.position.x_pos = 1.53; // ...а x_pos - дочерний атрибут position
objectExample.position.y_pos = -23.5;
ВАЖНОЕ УТОЧНЕНИЕ! Переменная object хранит все данные в строковом значении (string), т.е. записанные в нее int (целое число) и float (дробное число) нужно будет конвертировать при дальнейшем использовании (функции для конвертации описаны в главе "операции с переменными").

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

object objectExample;
objectExample.price = 15500; // Целое число будет записано, как string "15500"

int getPrice = sti(objectExample.price); // Чтобы выполнять со значением price какие-либо вычисления, его нужно конвертировать из строкового значения в цельно-численное. Здесь оно конвертируется функцией sti (string to int).


ref - ссылка на object

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

object objectExample; // Объявляем переменную object
ref firstObject; // Объявляем переменную ref

makeref(firstObject, objectExample); // Функция makeref создает ссылку с firstObject на objectExample, т.к. сама по себе переменная ref ничего не имеет

// Далее в коде firstObject - это и будет objectExample
firstObject.id = "ExID";

// Тоже самое, что и...
objectExample.id = "ExID";


aref - ссылка на какой-то атрибут object'а

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

object objectExample; // Объявляем переменную object
aref objectPositionX; // Объявляем переменную aref

makeref(objectPositionX, objectExample.position.x_pos); // Функция makeref создает ссылку с objectPositionX на objectExample.position.x_pos

// Далее в коде objectPositionX - это и будет objectExample.position.x_pos
objectPositionX = 1.53;

// Тоже самое, что и...
objectExample.position.x_pos = 1.53;
Будьте внимательны, не путайте ref и aref. Нужно запомнить, что ref - это ссылка на объект в целом, а aref - ссылка на конкретный атрибут объекта



3. Базовая математика скриптов

Для различных расчетов с переменными и значениями используются следующие операторы:

+ - сложение

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

int a = 10;
int b = 15;

int c = a + b; // c = 25
- - вычитание

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

int a = 55;
int b = 10;

int c = a - b; // c = 45
* - умножение

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

int a = 5;
int b = 5;

int c = a * b; // c = 25
/ - деление

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

int a = 10;
int b = 2;

int c = a / b; // c = 5
^ - возведение в степень

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

int a = 2;
int b = 3;

int c = a ^ b; // c = 8
++ - прибавить к значению 1

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

int a = 10;

a++; // a = 11
-- - отнять от значения 1

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

int a = 20;

a--; // a = 19
+= - прибавить к левому значению правое

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

int a = 25;
int b = 40;

a += b; // a = 65
-= - отнять от левого значения правое

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

int a = 100;
int b = 20;

a -= b; // a = 80
*= - умножить левое значение на правое

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

int a = 90;
int b = 10;

a *= b; // a = 900
/= - разделить левое значение на правое

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

int a = 50;
int b = 5;

a /= b; // a = 10


4. Массивы переменных

Большое количество однотипных переменных лучше всего объединять в массивы.

Массив объявляется следующим образом:

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

тип НАЗВАНИЕ[размер];
тип - тип переменной (int, float, object и т.д.)
НАЗВАНИЕ - название массива переменных
размер - размер массива (общее кол-во переменных, которое он будет хранить)

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

// Таким образом несколько переменных одного типа...
int FirstInteger;
int SecondInteger;
int ThirdInteger;

// ... можно заменить одной строкой
int IntegerArray[3];
Чтобы использовать какой-то элемент массива используется следующая конструкция:

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

НАЗВАНИЕ[номер]
НАЗВАНИЕ - название массива переменных
номер - порядковый номер переменной в массиве

ВАЖНОЕ УТОЧНЕНИЕ! Порядковый номер элементов в массиве начинается с нуля!

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

int IntegerArray[3]; // Массив, где хранится 3 переменных типа int

// Если размер массива 3, то порядковый номер элементов от 0 до 2 (0, 1, 2)
IntegerArray[0] = 5;
IntegerArray[1] = 121;
IntegerArray[2] = 48;

// Если размер массива, например 25, то порядковый номер от 0 до 24
// Если размер 100, то порядковый номер от 0 до 99
// И т.д...


5. Операторы выбора

5.1. if-else

Операторы выбора позволяют движку выполнять скрипт, основываясь на истинности или ложности условия.

Условие объявляется следующим образом:

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

if(/*проверяемое условие*/)
{
	// Код, который будет выполнен, если условие ИСТИННО
}
Либо, если будет выполнятся 1 строка кода, то:

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

if(/*проверяемое условие*/) /* Вызываемая функция */;
Всего есть 6 условий:
a == b - a равно b
a != b - a не равно b
a > b - a больше b
a < b - a меньше b
a >= b - a больше или равно b
a <= b - a меньше или равно b

Вместо a и b, соответственно, выставляются какие-то переменные или определенные значения.

Чтобы выполнять код, если проверяемое условие ложное, используется оператор else

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

int val1, val2;

val1 = 50;
val2 = 25;

if(val1 == val2)
{
	// Здесь будет выполнен код, если переменная val1 равна переменной val2
}
else
{
	// ...во всех остальных случаях будет выполнен код в этом блоке
}
Либо, если после if и else будет выполнятся 1 строка кода, то:

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

int val1, val2;

val1 = 50;
val2 = 25;

if(val1 == val2) /* Условие истинно */;
else /* Условие ложно */;
Чтобы проверять в if несколько условий, используются следующие знаки:
&& - и
|| - или

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

if(val1 != 50 && val2 != 50)
{
	// Здесь код будет выполнен только в том случае, если оба значение val1 и val2 не равны 50
}

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

if(val1 < 20 || val2 < 50)
{
	// Здесь код будет выполнен только в том случае, если val1 меньше 20, либо val2 меньше 50
}
В if можно сравнивать переменные любого типа. Важно, чтобы это были однотипные переменные! То есть int сравнивается с int, float с float и т.д.


5.2. switch

Сложные конструкции из if-else может собой заменить оператор switch.
switch принимает какое-то значение, а затем выбирает case, который соответствует этому значению.
Каждый case обязательно должен быть закрыт оператором break. break в данном случае означает "конец блока". Выполняемый код, соответственно, прописывается внутри этого блока case-break.

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

switch(/*принимаемое значение*/)
{
	case /*выбираемое значение 1*/:
		// Код который будет выполнен, если принимаемое значение равно выбираемому 1
	break;
	
	case /*выбираемое значение 2*/:
		// Код который будет выполнен, если принимаемое значение равно выбираемому 2
	break;
	
	case /*выбираемое значение 3*/:
		// Код который будет выполнен, если принимаемое значение равно выбираемому 3
	break;
	
	// Таких кейсов может быть неограниченное количество
}
switch принимает переменные любого типа, хотя использование переменной float здесь мало применимо. Если на входе switch принимает строковое значение (string), то выбираемые значения в кейсах нужно писать в кавычках:

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

string characterName = "Диего";

switch(characterName)
{
	case "Диего":
		// Код который будет выполнен, если characterName это "Диего"
	break;
	
	case "Ян":
		// Код который будет выполнен, если characterName это "Ян"
	break;
	
	case "Питер":
		// Код который будет выполнен, если characterName это "Питер"
	break;
}
Для других переменных это не нужно. С цельно-численными переменными это выглядит вот так:

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

int exInteger = 15;

switch(exInteger)
{
	case 5:
		// Код который будет выполнен, если exInteger это 5
	break;
	
	case 10:
		// Код который будет выполнен, если exInteger это 10
	break;
	
	case 15:
		// Код который будет выполнен, если exInteger это 15
	break;
	
	case 20:
		// Код который будет выполнен, если exInteger это 20
	break;
	
	case 25:
		// Код который будет выполнен, если exInteger это 25
	break;
	
	case 30:
		// Код который будет выполнен, если exInteger это 30
	break;
}


6. Циклы

6.1. while

while - это цикл, который выполняется до тех пор, пока принимаемое условие "истинно".

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

while(/*проверяемое условие*/)
{
	// Код, который будет циклично выполняться до тех пор, пока условие ИСТИННО
}
Этот оператор работает примерно по тому-же принципу, что и if-else, т.е. принимает те же самые условия.

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

int exampleNum = 0; // Объявляем переменную типа int

while(exampleNum < 500) // Запускаем цикл, который будет работать до тех пор, пока exampleNum меньше 500
{
	exampleNum += 10; // С каждым проходом увеличиваем значение exampleNum на 10
	
	// Таким образом, спустя 50 проходов цикл будет завершен и далее будет выполнятся следующий код
}
ВАЖНОЕ УТОЧНЕНИЕ! Циклы во время своей работы блокируют дальнейшее выполнение кода. То есть тот код, который расположен под циклом, не будет выполнятся до тех пор, пока цикл не отработает свое дело.


6.2. for

Цикл for объявляется следующим образом:

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

for(base_val; condition; operator)
{
	// Код, выполняемый циклом
}
base_val - базовое значение переменной, с которой будет начат отсчет цикла
condition - условие переменной, при которой цикл выполняет работу
operator - оператор, прибавляющий/отнимающий значение на 1 переменной с каждым проходом (только ++ или --)

Этот тип цикла удобен для перебора массивов и для других сфер применения, в которых заранее известно количество проходов цикла. По сути, это цикл со встроенным счетчиком.

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

int exArray[10]; // Объявим массив переменных int размером 10

for(int n = 0; n < 10; n++)
{
	// Базовое значение переменной n установлено на 0, т.е. отсчет идет с нуля
	// Условие переменной n < 10, т.е. цикл активен только в том случае, если значение n от 0 до 9

	// n++ - с каждым проходом идет увеличение переменной n на 1 единицу
	// Первый проход n = 0, второй проход n = 1, третий проход n = 2 и т.д.

	// Здесь идет перебор массива под тем же порядковым номером, что и номер текущего прохода цикла
	exArray[n] = n * 10; // В значение переменной записываем номер прохода умноженный на 10
}

/*
На выходе получаем следующие значения:
exArray[0] = 0;
exArray[1] = 10;
exArray[2] = 20;
...
exArray[9] = 90;
*/
В циклах также возможно использовать следующие операторы перехода:

break - досрочно завершает выполнение цикла

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

int exInteger = 0; // Объявляем переменную int

for(int n = 0; n < 100; n++)
{
	exInteger += 50; // С каждым проходом увеличиваем значение переменной на 50
	if(exInteger >= 500) break; // Завершим цикл, если exInteger больше либо равно 500
	
	// Таким образом цикл будет завершен уже через 10 проходов, даже несмотря на то, что n еще далеко до 100
}
continue - пропускает проход и переходит к следующему. Весь код, что расположен в цикле под continue не будет выполнен, будет сразу начато следующее прохождение

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

for(int n = 0; n < 10; n++)
{
	if(n == 5) continue; // На 6 проходе пропускаем весь оставшийся код и сразу переходим к 7 проходу
	
	/*
	Здесь какой-то другой код
	Много-много кода
	*/
}


7. Функции

void - базовая функция, которая чаще всего встречается в скриптах Корсаров. Функции - это "фундамент" всего кода. Все игровые скрипты задействованы именно таким образом.

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

void StartedVoid()
{
	AnotherFuction(); // Будет вызван код из AnotherFuction
}

void AnotherFuction()
{
	// Здесь код
}
Кроме того, если один и тот-же кусок кода используется в скриптах несколько раз, то лучше сделать для него функцию и вызывать уже ее. Так получится более правильный, грамотный и удобный код. Так как для того, чтобы внести в него правки, достаточно будет отредактировать код в определенном блоке, а не искать его по всем скриптам.

Функции также могут принимать на входе какие-то переменные и производить на основе их расчеты.

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

ExampleFunc("test", 421, 50.4433);

void ExampleFunc(string exStr, int exInteger, float exFloat)
{
	// Здесь код
}
Любую переменную также можно записать, как функцию, которая имеет тот-же функционал, что и void, однако может "вернуть" какое-то итоговое значение

Для возврата используется оператор return

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

void StartedVoid()
{
	int exInteger = AnotherFuction(10, 15); // exInteger = 25
}

int AnotherFuction(int First, int Second)
{
	int baseInteger = First + Second; // 10 + 15 = 25
	return baseInteger; // Возвращает переменную baseInteger, т.е. число 25
}
ВАЖНО! Все функции объявляются в файле глобально! Нельзя объявлять одни функции внутри других!



8. Операции с переменными

rand(X) - случайное число в диапазоне от 0 до X (включительно)

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

int exInteger = rand(50); // 0 - 50
frnd() - случайное дробное число в диапазоне от 0 до 1.0 (включительно)

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

float exFlt = frnd(); // 0 - 1.0
MakeInt(X) - округление дробного (float) числа X до целого

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

int exInteger = MakeInt(45.12); // exInteger = 45
MakeFloat(X) - приведение целого (int) числа X к дробному

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

float exFlt = MakeInt(198); // exFlt = 198.0
sti(X) - конвертирует строковое (string) значение в цельно-численное (int)

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

int exInteger = sti("65"); // exInteger = 65
stf(X) - конвертирует строковое (string) значение в дробное (float)

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

float exFlt = stf("322.11"); // exFlt = 322.11
abs(X) - находит модуль целого (int) или дробного (float) числа X

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

int exInteger = abs(-143); // exInteger = 143
sqrt(X) - находит квадратный корень из целого (int) или дробного (float) числа X

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

float exFlt = sqrt(224.66); // exFlt = 14.9886623819
sqr(X) - возведение в квадрат целого (int) или дробного (float) числа X

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

float exFlt = sqr(12.1); // exFlt = 146.41
sin(X) - находит синус дробного (float) числа X (принимает значение в радианах)

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

float exFlt = sin(0.523598776); // exFlt = 0.5
cos(X) - находит косинус дробного (float) числа X (принимает значение в радианах)

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

float exFlt = cos(1.04719755); // exFlt = 0.5
tan(X) - находит тангенс дробного (float) числа X (принимает значение в радианах)

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

float exFlt = tan(0.785398163); // exFlt = 1.0
atan(X) - находит арктангенс дробного (float) числа X (возвращает значение в радианах)

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

float exFlt = atan(1.0); // exFlt = 0.785398163
atan2(Y, X) - находит арктангенс величины Y/X (принимает дробные (float) числа) (возвращает значение в радианах)

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

float exFlt = atan2(1.0, 2.0); // exFlt = 1.10714871779409


9. Заключение

По большей степени, скрипты Корсаров - это тот же C#, только более урезанный и несколько упрощенный. По этой причине, коддинг на этом движке имеет относительно низкий порог вхождения, т.е. для того, чтобы начать что-то на нем писать, не нужно изучать тонну документации - достаточно понять основы и суть его работы.

Опять таки, изучение программирования - это постепенный процесс, который требует того, чтобы ему уделялось время и желание. Если вы новичок, то не стоит сразу залезать в дебри и приступать к чему-то сложному. Начните с чего-то по-проще, с того, что более подходит вам по уровню знаний (элементарно, хотя-бы с того, чтобы подставлять в переменные какие-то свои значения и смотреть, какие изменения в игре это за собой несет). Со временем вы будете понимать все больше и больше и сможете постепенно переходить к решению более сложных задач. На протяжении всей работы идет процесс самообучения.
Автор руководства: Rasteador
Копирование данного материала на другие сайты и форумы в любых целях запрещено! @LEOPARD
Последний раз редактировалось LEOPARD 07 дек 2017, 12:45, всего редактировалось 1 раз.



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

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

[scripts] Корсары: ГПК 1.3.2 AT_R

Сообщение LEOPARD » 20 ноя 2017, 22:50

student_5, качаешь репак ГПК 1.3.2 AT_R, качаешь скрипты из шапки этой темы и будет то, что ты хочешь.

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

student_5
Сообщения: 1
Зарегистрирован: 20 ноя 2017, 22:43

[scripts] Корсары: ГПК 1.3.2 AT_R

Сообщение student_5 » 22 ноя 2017, 02:32

впрочем можно и так.. Это дефолтные, изменения не вносились?

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

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

[scripts] Корсары: ГПК 1.3.2 AT_R

Сообщение LEOPARD » 22 ноя 2017, 11:45

student_5 писал(а):
22 ноя 2017, 02:32
впрочем можно и так..
Других вариантов нет.
student_5 писал(а):
22 ноя 2017, 02:32
Это дефолтные, изменения не вносились?
Зачем мне выкладывать измененные?
Это чистые, нетронутые скрипты.

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

Shram94

[scripts] Корсары: ГПК 1.3.2 AT_R

Сообщение Shram94 » 28 ноя 2017, 11:12

Хм, интересно, а можно ли наподобие функции закупки товаров для казначея, сделать такое же но для боцмана - найм команды, и для компаньона - найм оффицеров. Помнится было дополнение для первой части тдм, оно тут http://forum.bestgamer.ru/showthread.php?t=935&page=5 называется Офицеры для компаньонов, правда там компаньона через боцмана надо было вызывать, а потом через диалог с компаньоном нанимать тому офицеров.

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

Korsar1234
Сообщения: 57
Зарегистрирован: 12 ноя 2017, 07:05
Благодарил (а): 2 раза

[scripts] Корсары: ГПК 1.3.2 AT_R

Сообщение Korsar1234 » 30 ноя 2017, 16:58

Как изменить стоимость товаров? Цены, как в КС хочу сделать.
Также, хотелось бы убрать контрабанду во всех пиратских поселениях, а не только на Бермудах.

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

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

[scripts] Корсары: ГПК 1.3.2 AT_R

Сообщение LEOPARD » 02 дек 2017, 01:28

Korsar1234 писал(а):
30 ноя 2017, 16:58
Как изменить стоимость товаров? Цены, как в КС хочу сделать.
Подозреваю, что в файле initGoods.c находится все.

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

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

[scripts] Корсары: ГПК 1.3.2 AT_R

Сообщение LEOPARD » 03 дек 2017, 02:43


Переработка мушкетного залпа (теперь он действительно убивает 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 <--

Добавляем дополнительную информацию для предметов
Файл 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 <-- Найм на постоянку


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

Korsar1234
Сообщения: 57
Зарегистрирован: 12 ноя 2017, 07:05
Благодарил (а): 2 раза

[scripts] Корсары: ГПК 1.3.2 AT_R

Сообщение Korsar1234 » 03 дек 2017, 15:55

Возможно ли ввести фишку,что когда оставляешь корабль на хранение в ПУ,команда остается с ним,никуда не исчезает. В какой-то части Корсаров такое было.
Допустим,нужно на небольшое судно пересесть на некоторое время,для контрабанды той же, ты просто берешь свой корабль и оставляешь порту в полной готовности.

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

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

[scripts] Корсары: ГПК 1.3.2 AT_R

Сообщение LEOPARD » 03 дек 2017, 18:20

Korsar1234, была у меня такая задумка)
Узнаю, отпишу.

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

Shram94

[scripts] Корсары: ГПК 1.3.2 AT_R

Сообщение Shram94 » 03 дек 2017, 21:43

хм интересно, а можно ли вернуть менеджмент колоний из корсаров 3 в гпк.

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

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

[scripts] Корсары: ГПК 1.3.2 AT_R

Сообщение LEOPARD » 03 дек 2017, 22:15

Shram94, без правки движка это реализовать очень трудно. Возможно, но некоторый функционал будет костыльный.

Отправлено спустя 58 минут 59 секунд:
Korsar1234 писал(а):
03 дек 2017, 15:55
Возможно ли ввести фишку,что когда оставляешь корабль на хранение в ПУ,команда остается с ним,никуда не исчезает. В какой-то части Корсаров такое было.
Допустим,нужно на небольшое судно пересесть на некоторое время,для контрабанды той же, ты просто берешь свой корабль и оставляешь порту в полной готовности.
Говорим спасибо 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;

Готово!

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

Shram94

[scripts] Корсары: ГПК 1.3.2 AT_R

Сообщение Shram94 » 04 дек 2017, 09:27

LEOPARD, может сделать это через диалог с наместником как это реализовано с закупкой товара через казначея? Или как это было реализовано в ПС?

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

Korsar1234
Сообщения: 57
Зарегистрирован: 12 ноя 2017, 07:05
Благодарил (а): 2 раза

[scripts] Корсары: ГПК 1.3.2 AT_R

Сообщение Korsar1234 » 04 дек 2017, 16:56

Как скинуть стоимость аренды склада на Бермудах? А то уж больно дорого...

Отправлено спустя 55 минут 22 секунды:
Кстати, уважаемый LEOPARD , не планируешь что либо делать с ИИ ботов, в частности кораблей своей эскдры, и/или их управлением? А то иногда более-менее нормально, а иногда ( в большинстве случаев) тупят. Бывает, приказываешь кораблю атаковать форт, а он, глупый, во время маневров между залпами подходит к нему, а форт ему полкорпуса и сотню-другую команды сносит. В боях с кораблями то же самое. Расстояние не держат. Или вообще просто плывут на него, не делая залпов вообще. Думаю, те, кто как и я, любят плавать эскадрой, согласятся со мной.

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

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

[scripts] Корсары: ГПК 1.3.2 AT_R

Сообщение LEOPARD » 04 дек 2017, 20:52

Korsar1234 писал(а):
04 дек 2017, 17:52
не планируешь что либо делать с ИИ ботов, в частности кораблей своей эскдры, и/или их управлением?
Без понятия, где это правится. Но я бы с удовольствием взял бы логику из КВЛ. Там ИИ кораблей дает подгореть твоей заднице.

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

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

[scripts] Корсары: ГПК 1.3.2 AT_R

Сообщение Rasteador » 04 дек 2017, 23:40

LEOPARD писал(а):
06 ноя 2017, 22:28
Добавляем дополнительную информацию для предметов
LEOPARD писал(а):
06 ноя 2017, 22:28
//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)
describeStr += "Защита " + FloatToString(fItmShield, 2) + " проц." + newStr();
}
Код с ошибками.

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

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

[scripts] Корсары: ГПК 1.3.2 AT_R

Сообщение LEOPARD » 04 дек 2017, 23:56

Rasteador писал(а):
04 дек 2017, 23:40
Код с ошибками.
Код был взят отсюда
Я уже убился искать решение :)
LEOPARD писал(а):
06 ноя 2017, 22:28
Я не шарю в скриптах.

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

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

[scripts] Корсары: ГПК 1.3.2 AT_R

Сообщение Rasteador » 05 дек 2017, 00:18

1. Пропущен символ ";" (окончание строки) в след. строках:

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

float fItmPrice = (stf(arItm.price) / (stf(arItm.Weight))
float fItmShield = (stf(arItm.CirassLevel) * 100)
2. В этой строке зачем-то напихали скобок до кучи:

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

float fItmPrice = (stf(arItm.price) / (stf(arItm.Weight))



Эти строки нужно привести к такому виду:

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

float fItmPrice = stf(arItm.price) / stf(arItm.Weight);

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

float fItmShield = stf(arItm.CirassLevel) * 100.0;
...тогда все будет работать
Love and respect

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

Korsar1234
Сообщения: 57
Зарегистрирован: 12 ноя 2017, 07:05
Благодарил (а): 2 раза

[scripts] Корсары: ГПК 1.3.2 AT_R

Сообщение Korsar1234 » 05 дек 2017, 19:32

Если крупным калибрам высоту полета снарядов уменьшить до 0.7, то сможет ли до форта долетать? А то если значение "1" будет, то с такой мортирной траекторией трудней будет попадать по кораблям, в частности по мачтам-парусам.
Сам проверить не могу, тех. неполадки.


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

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

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

Сообщение LEOPARD » 07 дек 2017, 12:49

Мощное руководство!
Надеюсъ, что в скором времени начнут появляться скриптеры :)

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

Korsar1234
Сообщения: 57
Зарегистрирован: 12 ноя 2017, 07:05
Благодарил (а): 2 раза

[scripts] Корсары: ГПК 1.3.2 AT_R

Сообщение Korsar1234 » 07 дек 2017, 17:21

1.Можно ли выставить коэффициент зарплаты команды и офицеров меньше 0.5?
2. Возможна ли замена ЗП на долю добычи? ЗП отсутствует, есть только доля, которая выдается раз в месяц.
В случае невыдачи,и отсутствия добычи резко падает мораль, и лояльность офицеров.
3. Хотелось бы, чтобы перк "Спасение на шлюпке" был прописан у всех офицеров изначально. Но шанс того, что компаньон спасается, зависит от того, как был потоплен корабль - абордаж - 0,1 ; пушечный залп - 0,7 ; брандер - 1
4. Как увеличить шанс сдачи корабля? А то абордируешь бриг из торговой эскадры на фрегате, а он не сдается.
5. Как уменьшить стоимость аренды склада на Бермудах? 50к - слишком много.

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

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

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

Сообщение Rasteador » 08 дек 2017, 06:27

Korsar1234 писал(а):
07 дек 2017, 17:21
1.Можно ли выставить коэффициент зарплаты команды и офицеров меньше 0.5?
2. Возможна ли замена ЗП на долю добычи? ЗП отсутствует, есть только доля, которая выдается раз в месяц.
В случае невыдачи,и отсутствия добычи резко падает мораль, и лояльность офицеров.
3. Хотелось бы, чтобы перк "Спасение на шлюпке" был прописан у всех офицеров изначально. Но шанс того, что компаньон спасается, зависит от того, как был потоплен корабль - абордаж - 0,1 ; пушечный залп - 0,7 ; брандер - 1
4. Как увеличить шанс сдачи корабля? А то абордируешь бриг из торговой эскадры на фрегате, а он не сдается.
5. Как уменьшить стоимость аренды склада на Бермудах? 50к - слишком много.
Неправильный подход к программированию. Нужно ставить цель так, чтобы попытаться самостоятельно найти решение этих задач, а не получать сразу готовые варианты кода - это не даст знаний и умений. Только так можно развиваться в этом направлении, а уже в процессе я отвечу на вопросы, помогу решить какие-то проблемы, которые будут возникать.
Love and respect

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

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

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

Сообщение LEOPARD » 17 дек 2017, 00:51

Korsar1234 писал(а):
07 дек 2017, 17:21
Как увеличить шанс сдачи корабля?
По моему, это зависит от навыков: абордаж и авторитет. Чем выше, тем больше шанса на то, что враг сдастся.
Korsar1234 писал(а):
07 дек 2017, 17:21
Как уменьшить стоимость аренды склада на Бермудах? 50к - слишком много.
Поищи поиском по папке program про склад. Зацепки ищи в квестах, а уже оттуда по функциям и найдешь цифру.

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

Shram94

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

Сообщение Shram94 » 19 дек 2017, 19:50

А как сделать чтобы пгг в женским полом спавнились в таверне? Просто по крайней мере в под паке персонажи женского пола не появляются в таверне, если у них пол стоит woman, а не man.

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

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

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

Сообщение Rasteador » 20 дек 2017, 10:59

Shram94 писал(а):
20 дек 2017, 07:14
А как сделать чтобы пгг в женским полом спавнились в таверне?
Файл scripts\PsHero.c, функция void InitPsHeros() - она отвечает за появление ПГГ при старте новой игры.
Shram94 писал(а):
20 дек 2017, 07:14
Просто по крайней мере в под паке персонажи женского пола не появляются в таверне, если у них пол стоит woman, а не man.
В функции, указанной выше, стоит дополнительная проверка на пол создаваемого ПГГ, т.е. скриптами принудительно запрещено появление персонажей женского пола. В 28 строке GetNewMainCharacterParam("sex_" + n) == "man". Достаточно ее убрать, чтобы женские персонажи тоже начали создаваться (также нужно не забыть убрать оператор "И" &&)
Love and respect

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

Shram94

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

Сообщение Shram94 » 20 дек 2017, 13:04

Rasteador, а что насчёт диалогов пгг?

Отправлено спустя 4 минуты 6 секунд:
Rasteador, то есть в данной функции оставить лишь startHeroType?

Отправлено спустя 37 минут 15 секунд:
Диалоги там ведь заточены под мужских пгг

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

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

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

Сообщение Rasteador » 21 дек 2017, 12:08

Shram94 писал(а):
20 дек 2017, 13:46
Rasteador, а что насчёт диалогов пгг?
Диалоги нужно доработать. В файле pgg_dialog.c заменить все фразы/слова мужского рода, относящиеся к ПГГ, на функцию NPCharSexPhrase(NPChar, "для man", "для woman"). Затем в функцию вносятся фразы, которые будут выбираться в зависимости от пола NPC. "для man" - это мужская фраза, "для woman" - женская.

Например:

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

Dialog.Text = "Я слышал о тебе много слухов";

// Здесь фраза с глаголом муж. рода. Выводится вне зависимости от пола
Доработать так:

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

Dialog.Text = "Я " + NPCharSexPhrase(NPChar, "слышал", "слышала") + " о тебе много слухов";

// В этом случае, если пол man, тогда будет:  "Я слышал о тебе много слухов"
// ... если пол woman:  "Я слышала о тебе много слухов"
Shram94 писал(а):
20 дек 2017, 13:46
Rasteador, то есть в данной функции оставить лишь startHeroType?
n != startHeroType
Love and respect

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

SPAZ100
Сообщения: 9
Зарегистрирован: 08 янв 2017, 15:17
Благодарил (а): 3 раза
Поблагодарили: 1 раз

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

Сообщение SPAZ100 » 22 дек 2017, 16:46

Добавил двух абордажников, теперь их 5. Подскажите, как добавить портреты с уровнем жизни и энергии.

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

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

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

Сообщение Rasteador » 22 дек 2017, 20:18

SPAZ100 писал(а):
22 дек 2017, 16:46
Добавил двух абордажников, теперь их 5. Подскажите, как добавить портреты с уровнем жизни и энергии.
Файл battle_interface\landinterface.c

1. Функция void BLI_SetObjectData()

1.1. Редактируем цикл

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

for(i=0; i<4; i++)
{
	cn = GetOfficersIndex(pchar,i);
	if(cn==-1) continue;
	curCh = GetCharacter(cn);
	attrName = "id"+i;
	makearef(ar,objLandInterface.data.icons.(attrName));
	SetCharacterIconData(cn,ar);
	//ar.picture = curCh.FaceId;
	//ar.health = 0.0;
	//ar.charge = 0.0;
}
Меняем значение кол-ва проходов по умолчанию 4 на то кол-во офицеров, которое задали

1.2. Добавляем к блоку...

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

objLandInterface.ManSign.iconoffset1 = "70,70";
objLandInterface.ManSign.iconoffset2 = "70,180";
objLandInterface.ManSign.iconoffset3 = "70,290";
objLandInterface.ManSign.iconoffset4 = "70,400";
...координаты индикаторов добавленных офицеров. Нумеруем iconoffset и увеличиваем с каждым разом значение оси Y на 110. Например:

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

objLandInterface.ManSign.iconoffset5 = "70,510";
objLandInterface.ManSign.iconoffset6 = "70,620";
iconoffset1 - это индикаторы ГГ. iconoffset2 и далее - индикаторы офицеров.

2. Функция void BLI_UpdateObjectData()

2.1. Редактируем цикл также, как в пункте 1.1

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

for(i=0; i<4; i++)
{
	attrName = "id"+i;
	cn = GetOfficersIndex(pchar,i);
	if(cn==-1 || !IsEntity(&Characters[cn]))
	{
		DeleteAttribute(&objLandInterface,"data.icons."+attrName);
		continue;
	}
	curCh = GetCharacter(cn);
	makearef(ar,objLandInterface.data.icons.(attrName));
	SetCharacterIconData(cn,ar);
	//ar.picture = curCh.FaceId;
	//ar.health = LAi_GetCharacterRelHP(curCh);
	//ar.charge = LAi_GetCharacterRelCharge(curCh);
	//ar.shootMax = LAi_GetCharacterChargeQuant(curCh);
	//ar.shootCur = LAi_GetCharacterChargeCur(curCh);
	//ar.poison = LAi_IsPoison(curCh);
}
3. Функция void BLI_UpdateOfficers()

3.1. Добавляем к списку...

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

SetOfficerTexture(0);
SetOfficerTexture(1);
SetOfficerTexture(2);
SetOfficerTexture(3);
...вызов для добавленных офицеров, по аналогии с пунктом 1.2. Например:

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

SetOfficerTexture(4);
SetOfficerTexture(5);
3.2. К списку...

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

SendMessage(&objLandInterface, "lls", MSG_BATTLE_LAND_SET_ICONTEX, 0, objLandInterface.Parameters.iconTexture0);
SendMessage(&objLandInterface, "lls", MSG_BATTLE_LAND_SET_ICONTEX, 1, objLandInterface.Parameters.iconTexture1);
SendMessage(&objLandInterface, "lls", MSG_BATTLE_LAND_SET_ICONTEX, 2, objLandInterface.Parameters.iconTexture2);
SendMessage(&objLandInterface, "lls", MSG_BATTLE_LAND_SET_ICONTEX, 3, objLandInterface.Parameters.iconTexture3);
...также добавляем строки, не забывая выставлять значения после MSG_BATTLE_LAND_SET_ICONTEX и нумеруя iconTexture

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

SendMessage(&objLandInterface, "lls", MSG_BATTLE_LAND_SET_ICONTEX, 4, objLandInterface.Parameters.iconTexture4);
SendMessage(&objLandInterface, "lls", MSG_BATTLE_LAND_SET_ICONTEX, 5, objLandInterface.Parameters.iconTexture5);
Love and respect

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

SPAZ100
Сообщения: 9
Зарегистрирован: 08 янв 2017, 15:17
Благодарил (а): 3 раза
Поблагодарили: 1 раз

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

Сообщение SPAZ100 » 22 дек 2017, 22:27

Всё это у меня уже было сделано .При назначении абордажника иконка не появляется.
Хотя в сохранениях добавленые иконки работают.
А вот в локациях иконок абордажников всего три а я хочу сделать пять.

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

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

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

Сообщение LEOPARD » 23 дек 2017, 22:49

SPAZ100, вот тут у меня есть папка PROGRAM с мода ERAS2.6. Там у них реализовано то, что ты проделал. Возможно, это тебе поможет, проглядев их код.
Кстати, я тоже хотел замутить 5 абордажников, но хз как это сделать.
ERAS2.6_Program

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

SPAZ100
Сообщения: 9
Зарегистрирован: 08 янв 2017, 15:17
Благодарил (а): 3 раза
Поблагодарили: 1 раз

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

Сообщение SPAZ100 » 24 дек 2017, 00:16

Я сделал уже они все пять бегают за мной.
Там надо во всех моделях локаций локаторы офицеров допилить.
Дело в том что не появляются дополнительные иконки абордажников.
За скрипты благодарю может помогут.

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

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

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

Сообщение LEOPARD » 24 дек 2017, 00:47

SPAZ100 писал(а):
24 дек 2017, 00:16
Там надо во всех моделях локаций локаторы офицеров допилить.
Не надо, там немного изменен код. Когда я пробовал перенести код в ГПК, Rasteador, сказал, что там они появляются не во всех нужных локаторах, а в некоторых + потом телепортируются ближе к ГГ.
SPAZ100 писал(а):
24 дек 2017, 00:16
За скрипты благодарю может помогут.
Определенно помогут, посмотри ;)

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

SPAZ100
Сообщения: 9
Зарегистрирован: 08 янв 2017, 15:17
Благодарил (а): 3 раза
Поблагодарили: 1 раз

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

Сообщение SPAZ100 » 24 дек 2017, 15:19

А с какой части игры эти скрипты.

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

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

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

Сообщение LEOPARD » 24 дек 2017, 16:40

SPAZ100 писал(а):
24 дек 2017, 15:19
А с какой части игры эти скрипты.
LEOPARD писал(а):
23 дек 2017, 22:49
ERAS2.6
Этот мод построен на базе ГПК 1.2.12

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

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

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

Сообщение LEOPARD » 25 дек 2017, 09:30

Капитан Джек воробей писал(а):
25 дек 2017, 06:00
спасибо за помощь "мододелы"
Если тебе сию минуту никто не ответил, то значит не у всех есть время на это, а тем более ответ на твою проблему.
Если бы все пользователи умели грамотно составлять баг-репорты, то ответы приходилы бы быстрее.
1) скриншоты
2) логи с ошибками: error.log, system.log, compile.log
Это как минимум.

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

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

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

Сообщение LEOPARD » 25 дек 2017, 12:23

Капитан Джек воробей, что это сейчас было?)
Технические изменения никак не могут быть связаны с игровым функционалом.
Что-то ты на "модил" не то.
У меня такое было один раз, и то при некорректном изменении функционала.
Не вводи людей в заблуждение ;)

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

SPAZ100
Сообщения: 9
Зарегистрирован: 08 янв 2017, 15:17
Благодарил (а): 3 раза
Поблагодарили: 1 раз

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

Сообщение SPAZ100 » 26 дек 2017, 11:59

Капитан Джек воробей писал(а):
26 дек 2017, 10:03
LEOPARD,Подскажи как ты в характеристиках гг добавил поинтов? Это там где в начале игры распределяешь их.
SPECIAL Находится в файле RPGUtilite.c

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

SPAZ100
Сообщения: 9
Зарегистрирован: 08 янв 2017, 15:17
Благодарил (а): 3 раза
Поблагодарили: 1 раз

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

Сообщение SPAZ100 » 26 дек 2017, 22:17

Скачай здесь на сайте открытые скрипты и в гугле крякнутый экзэшник а еще можно пиратес
поменять через артмани.

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

Майор
Сообщения: 8
Зарегистрирован: 28 дек 2017, 20:51
Благодарил (а): 2 раза
Поблагодарили: 1 раз

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

Сообщение Майор » 28 дек 2017, 20:58

Такой назрел вопрос, можно ли как-то изменить расположение камеры кораблей, потому что у некоторых кораблей она находится где-то наверху.

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

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

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

Сообщение LEOPARD » 28 дек 2017, 21:21

Майор писал(а):
28 дек 2017, 20:58
Такой назрел вопрос, можно ли как-то изменить расположение камеры кораблей, потому что у некоторых кораблей она находится где-то наверху.
Эта проблема наблюдается, в основном, на широкоформатных мониторах 16:9. Если поставить соотношение 4:3, то такого не будет.

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

Майор
Сообщения: 8
Зарегистрирован: 28 дек 2017, 20:51
Благодарил (а): 2 раза
Поблагодарили: 1 раз

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

Сообщение Майор » 28 дек 2017, 23:52

LEOPARD писал(а):
28 дек 2017, 21:21
Эта проблема наблюдается, в основном, на широкоформатных мониторах 16:9. Если поставить соотношение 4:3, то такого не будет.
А при сохранении соотношения 16:9 можно как-то данную проблему исправить?

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

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

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

Сообщение LEOPARD » 28 дек 2017, 23:53

Майор писал(а):
28 дек 2017, 23:52
А при сохранении соотношения 16:9 можно как-то данную проблему исправить?
Переработать модель корабля и опустить камеру ниже.


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

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

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

Сообщение LEOPARD » 29 дек 2017, 09:30

Капитан Джек воробей писал(а):
29 дек 2017, 09:18
Ну пожалуйста сделай в мод сабельку Я же не мододел как ты, нет таких навыков.
Ты же хвастался на весь форум, что у тебя есть своя "супер сборка". Значит навыки присутствуют?)

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

Korsar1234
Сообщения: 57
Зарегистрирован: 12 ноя 2017, 07:05
Благодарил (а): 2 раза

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

Сообщение Korsar1234 » 29 дек 2017, 09:53

А что за сборка, Капитан?


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

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

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

Сообщение LEOPARD » 29 дек 2017, 19:52

Капитан Джек воробей писал(а):
29 дек 2017, 19:51
Можно будет если что загрузить к тебе на сайт свою сборку как доделаю?
Легко)
Я же тебе говорил, создавай тему и наполняй её.

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

Korsar1234
Сообщения: 57
Зарегистрирован: 12 ноя 2017, 07:05
Благодарил (а): 2 раза

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

Сообщение Korsar1234 » 31 дек 2017, 17:45

Есть вопрос. Где изменить расположение кораблей своей эскадры, или же расстояние между ними на боевке?

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