Корсары - кодинг


Оглавление

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


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

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

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

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

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

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



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

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

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

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


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

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

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


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

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

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


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

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

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


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

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

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 (дробное число) нужно будет конвертировать при дальнейшем использовании (функции для конвертации описаны в главе "операции с переменными").

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

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

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


ref - ссылка на object

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

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

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

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

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


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

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

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. Базовая математика скриптов

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

+ - сложение

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

int a = 10;
int b = 15;

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

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

int a = 55;
int b = 10;

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

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

int a = 5;
int b = 5;

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

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

int a = 10;
int b = 2;

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

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

int a = 2;
int b = 3;

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

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

int a = 10;

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

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

int a = 20;

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

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

int a = 25;
int b = 40;

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

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

int a = 100;
int b = 20;

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

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

int a = 90;
int b = 10;

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

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

int a = 50;
int b = 5;

a /= b; // a = 10


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

int val1, val2;

val1 = 50;
val2 = 25;

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

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

int val1, val2;

val1 = 50;
val2 = 25;

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

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

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

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

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.

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

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

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

string characterName = "Диего";

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

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

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 - это цикл, который выполняется до тех пор, пока принимаемое условие "истинно".

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

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

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

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

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


6.2. for

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

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

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

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

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

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 - досрочно завершает выполнение цикла

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

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 не будет выполнен, будет сразу начато следующее прохождение

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

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


7. Функции

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

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

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

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

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

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

ExampleFunc("test", 421, 50.4433);

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

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

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

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 (включительно)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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