Subversion Repository Public Repository

fonline_sdk

This repository has no backups
This repository's network speed is throttled to 100KB/sec

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// FOS Common Sort -5

#define IS_COLLISION        # ( x1, y1, x2, y2, w, h )( ( x1 ) >= ( x2 ) && ( x1 ) < ( x2 ) + ( w ) && ( y1 ) >= ( y2 ) && ( y1 ) < ( y2 ) + ( h ) )

#define POW2                # (a)                 ( ( a ) * ( a ) )
#define POW3                # (a)                 ( ( a ) * ( a ) * ( a ) )
#define POW                                                                   \
    # ( x, y )                for( int ___i = 1, ___j = x; ___i < y; ___i++ ) \
        x *= ___j
#define MIN                 # ( a, b )( ( ( a ) < ( b ) ) ? ( a ) : ( b ) )
#define MAX                 # ( a, b )( ( ( a ) > ( b ) ) ? ( a ) : ( b ) )
#define CLAMP               # ( x, low, high )( ( ( x ) > ( high ) ) ? ( high ) : ( ( ( x ) < ( low ) ) ? ( low ) : ( x ) ) )
#define ABS                 # (val)                ( ( ( val ) > 0 ) ? ( val ) : -( val ) )
#define DISTANCE            # ( x1, y1, x2, y2 )( sqrt( POW2( ( x1 ) - ( x2 ) ) + POW2( ( y1 ) - ( y2 ) ) ) )

#define MAKEWORD            # ( a, b )( uint16( ( uint8( a ) ) | ( uint16( uint8( b ) ) ) << 8 ) )
#define MAKELONG            # ( a, b )( int32( ( uint16( a ) ) | ( uint32( uint16( b ) ) ) << 16 ) )
#define LOWORD              # (l)               ( uint16( l ) )
#define HIWORD              # (l)               ( uint16( ( uint32( l ) >> 16 ) & 0xFFFF ) )
#define LOBYTE              # (w)               ( uint8( w ) )
#define HIBYTE              # (w)               ( uint8( ( uint16( w ) >> 8 ) & 0xFF ) )

#define LBS_TO_GRAMM        # (lbs)       ( ( lbs ) * 453 )

#define NUMERICAL_NUMBER    # (num)   ( ( ( num ) % 2 ) != 0 ? ( num ) * ( ( num ) / 2 + 1 ) : ( num ) * ( num ) / 2 + ( num ) / 2 )

Commits for fonline_sdk/Modules/Core/Math.fos

Diff revisions: vs.
Revision Author Commited Message
646 Diff Diff cvet picture cvet Mon 04 Jul, 2016 14:40:54 +0000

Improved namespaces for scripts.
Now each script module treated as namespace (Gui::Object, Entire::GetEntire).
And now you can access from any module to any module by specifying it namespace.
Disabled features: #include, shared, import.
Script addressation changed from module@func to module::func.

606 Diff Diff cvet picture cvet Mon 23 May, 2016 15:41:24 +0000

Реорганизация движка.

571 Diff Diff cvet picture cvet Sat 24 Oct, 2015 10:17:44 +0000

Реорганизация контента.
Настройка Core скриптов.

570 Diff Diff cvet picture cvet Sat 24 Oct, 2015 10:12:43 +0000

Реорганизация контента.
Настройка Core скриптов.

569 Diff Diff cvet picture cvet Sat 24 Oct, 2015 10:11:51 +0000

Реорганизация контента.
Перемещение Core скриптов.

537 Diff Diff cvet picture cvet Mon 21 Sep, 2015 15:06:06 +0000

Введено некое подобие модульной системы организации контента.
Теперь все будет лежать не по отдельным папакам. т.е. скрипты в scripts, диалоги в dialogs и т.п., а в общей папке Modules, в которой можно группировать файлы как удобно.
Предполагается, что папки верхнего уровня это наименование отдельного модуля.
Любые папки в Modules (включая подпапки) начинающиеся с подчеркивания ‘_’ не будут обрабатываться.
Папки с именем ‘Resources’ будут паковаться в ресурсы клиента.
А в папках ‘Texts’ сервер будет искать файлы локализации текстов.
Пока есть только один модуль ‘TLA’, но в будущем он будет разделен на отдельные, например: Core, Traders, Combat и т.п.
Но нужно помнить, что пространство имен у всех контентных файлов (диалоги, прототипы и т.п.) одно и наличие двух одинаковых в разных папках не допускается.

503 Diff Diff cvet picture cvet Sat 16 May, 2015 07:33:53 +0000

Сигнатура скриптов изменена с первых трех символов ‘//$’ на наличие в первой строке символов ‘FOS’.

500 Diff Diff cvet picture cvet Mon 11 May, 2015 14:15:04 +0000

Изменен принцип загрузки скриптов.
Теперь в каждом файле скрипта, первой строкой, должна присутствовать сигнатура ‘//$’ после которой перечисляются следующие идентификаторы:
Server - серверный скрипт;
Client - клиентский скрипт;
Mapper - скрипт маппера;
Common - серверный, клиентский и скрипт маппера;
Header - заголовочный файл, не загружается как модуль, без этого скрипт будет загружен как модуль.
Идентификаторов можут быть несколько и перечисляться через пробел.
Пример:
//$ Server Client Header
означает, что это заголовочный файл для сервера и клиента.
Все скрипты загружаются автоматически из папки Server/scripts, необходимости в scripts.cfg больше нет.

429 Diff Diff cvet picture cvet Sat 21 Jun, 2014 20:34:17 +0000

С данной ревизии сдк начинается перевод хардкод гуи в скрипты.
На данный момент создана базовая архитектура новой системы, которая состоит из
- редактора интерфейса Tools/InterfaceEditor;
- gui.fos - ядро системы, которое осуществляет работу интерфейса;
- gui_h.fos - базовые классы и пользовательский функционал для работы с интерфейсом;
- gui_screens.fos - автоматически сгенерированный скрипт в InterfaceEditor, где находится логика работы окон.
- gui_screens_stuff.fos - скрипт, который включается в gui_screens.fos, для внесения функционала вручную, который будет там использоваться.
Постепенно интерфейс будет замещаться, а по окончании хардкод будет исключен из клиента.
Соответственно произошли правки в скриптах, связанные с удалением старой системы и вводом новой.
Еще раз подчеркну, что текущая версия только начало работы над новым гуи, и в течении нескольких месяцев система и редактор будут дорабатываться.

API нового гуи находится в начале скрипта gui_h.fos.
Примеры использования новой системы находятся в обновленных скриптах client_screen_test.fos и radio.fos. А так же в автоматически сгенерированном скрипте gui_screens.fos.
Несколько советов:
- помечайте колбеки событий объектов гуи (начинаются с ‘On’) как override, на случай, если допустите ошибку в имени или параметрах, что бы компилятор вас предупредил об этом;
- не используйте методы и параметры начинающиеся с подчеркивания в базовых классах gui, они для внутренней работы системы и их поведение может меняться со временем.

Редактор интерфейса состоит из программы InterfaceEditor.exe и файлов для хранения информации о интерфейсе.
Расширение .fogui - отдельное окно;
Расширение .foguischeme - схема набора окон, нужно будет для моддинга стандартного интерфейса.
На данный момент взаимодействие с гуи осуществляется посредством контекстного меню вызываемого правой кнопкой мыши на панели GUI.

В этой ревизии уже замещен экран логина в игру.
Перемещено рисование информации по F1 в скрипты.

AngelScript обновлен до ревизии 1959, версия 2.29.0.
По скриптам произошло много правок, в связи с новыми ворнингами при компиляции.
В скрипты включен аддон AngelScript weakref.

Для обработки хардкод ввода добавлены функции
void HandleHardcodedScreenMouse(int screen, int button, bool down, bool move)
void HandleHardcodedScreenKey(int screen, uint8 key, string@ text, bool down)
они будут использоваться для работы с хардкод гуи на время его переноса.

На время миграции интерфейса в скрипты добавлена функция
string@ CustomCall(string& command, string& separator = “ ”)
нужна для работы с движком, вызова некоторых его функций, которые не нужно выносить в скрипты, но необходимость в вызове существует.

Добавлена глобальная функция
void CloneObject(?&in, ?&out, bool copy)
с помощью которой можно создавать копии объектов не

Переработаны функции DrawSprite, теперь они имеют следующие сигнатуры
void DrawSprite(uint sprId, int frameIndex, int x, int y, uint color = 0, bool applyOffsets = false)
void DrawSprite(uint sprId, int frameIndex, int x, int y, int w, int h, bool zoom = false, uint color = 0, bool applyOffsets = false)
void DrawSpritePattern(uint sprId, int frameIndex, int x, int y, int w, int h, int sprWidth, int sprHeight, uint color = 0)
bool zoom - если true, то изображение сохраняет пропорции, если false, то растягивается.

В функции GetTextInfo теперь вместо ссылки для текста используется указатель
void GetTextInfo(string& text...
void GetTextInfo(string@ text...
теперь при передаче null будет рассчитываться максимальное количество строк, которое может вместиться в заданную область.

В функцию HideScreen теперь не передаются какие-либо параметры, а в функцию ShowScreen теперь вместо int p0, p1, p2 можно опционально передать dictionary, который потом уже можно будет использовать в GUIObject::OnInit
void ShowScreen(int screen, dictionary@ params = null)

При передаче в функцию MouseClick значения -1 в параметр cursor, то смены курсора не будет.

Исправлена работа функции GetMonitorHex, когда не учитывались параметры x и y.

Для обработки пользовательского ввода создан скрипт input.fos.
Туда перемещена из движка обработка всех горячих клавиш.

Добавлены глобальные переменные
int __SoundVolume - регулировка громкости звуков (0..100);
int __MusicVolume - регулировка громкости музыки (0..100);
bool __DebugInfo - отладочная информация по F1.

Переделано обозначение версий сервера, клиента и маппера, теперь оно будет обозначать номер ревизии сдк.

Добавлена зарезервированная функция для скриптов клиента и маппера
void finish()
которая вызывается в момент выхода из программы.
Нужно учитывать, что функция может не вызваться, если произошло падение клиента или он был закрыт по Alt+F4. ????

Добавлена зарезервированная функция для скриптов клиента, которая вызывается при добавлении игрового сообщения
void message_box( string& messageText, int messageType, bool scriptCall )
string& messageText - текст сообщения, можно модифицировать для движка;
int messageType - тип сообщения;
bool scriptCall - был ли вызов инициирован со скриптов функцией Message или движком.

Изменены сигнатуры функций mouse_down, mouse_up, mouse_move, key_down, key_up.

Для работы с кешем на строне клиента добавлены функции
void SetCacheData(const string& name, const uint8[]& data)
void SetCacheData(const string& name, const uint8[]& data, uint dataSize)
bool GetCacheData(const string& name, uint8[]& data)
void SetCacheDataStr(const string& name, const string& data)
string@ GetCacheDataStr(const string& name)
bool IsCacheData(const string& name)
void EraseCacheData(const string& name)
const string& name - имя данных;
const uint8[]& data - данные;
uint dataSize - длинна данных;
const string& data - данные.
Теперь класс serializator.fos может работать и в клиенте.

Исправлен баг с перегенерацией клиентских скриптов, баг с 428 ревизии.

Вычисление смещение текстуры в аталсе теперь происходит в шейдере
TexCoord.x = ( InTexCoord.x * ColorMapAtlasOffset.z ) + ColorMapAtlasOffset.x;
TexCoord.y = ( InTexCoord.y * ColorMapAtlasOffset.w ) + ColorMapAtlasOffset.y;
соответсвенно добавлена переменная ColorMapAtlasOffset.
Вместо атрибута InTexCoordBase теперь передается вторая текстурная координата TexCoord2.
См. файл Client/data/effects/ReadMe.txt

В статистике памяти сервера добавлен учет памяти массивов.

Для строк добавлены методы
bool startsWith(const string &in) const - начинается ли строка с переданной;
bool endsWith(const string &in) const - кончается ли строка переданной.
Так же все глоабльные функции для работы со строками получили соответствующие методы в самом классе
string@ substring(int start, int count = -1)
int findFirst(const string &in, int start = 0)
int findLast(const string &in, int start = 0)
int findFirstOf(const string &in, int start = 0)
int findFirstNotOf(const string &in, int start = 0)
int findLastOf(const string &in, int start = 0)
int findLastNotOf(const string &in, int start = 0)
array<string@>@ split(const string &in)
string@ toLower()
string@ toUpper()

400 cvet picture cvet Sat 27 Apr, 2013 19:27:18 +0000

Добавлена поддержка Unicode, кодировка UTF-8.
Все текстовые файлы переведены в кодировку UTF-8 (без BOM).

Обновлен весь инструментарий на предмет совместимости с юникодом.
В том числе редактор прототипов (ObjectEditor). (by Ghosthack)

Была исправлена работоспособность и модифицирована глобальная функция клиента/маппера
void KeyboardPress(uint8 key1, uint8 key2, string@+ key1Text = null, string@+ key2Text = null)
добавлены опциональные параметры key1Text/key2Text, которые будут переданы в обработчики key_up/key_down вместе с переменными key1/key2.

Для обработки ввода была добавлена константа DIK_CLIPBOARD_PASTE, событие которой означает вставку текста с буфера обмена.

Изменен принцип ввода с клавиатуры и работы с языком ввода.
В зарезервированные функции клиента/маппера key_down/key_up теперь передается параметр string& keyText, в котором будет записан текст на нужном языке, базирующийся на текущем языке ввода ОС.
Переключение раскладки клавиатуры теперь контролируется ОС, а не программой, ввиду чего была убрана глобальная переменная ChangeLang и соответствующие ей константы. Так же удалена глобальная функция int GetKeybLang().
Удалена функция перевода текста из одного языка в другой по кнопке Pause (пользуйтесь сторонними программами, например, PuntoSwicher).

Проверки корректности имени перенесена в скрипты, клиент/сервер проверяют только длину, корректность UTF-8 символов и отсутствие знака ‘*’ (которым в некоторых местах потом заменяется пробел).
В зарезервированную клиентскую функцию 'bool player_data_check( string& name, int[]& data ) добавлен параметр ‘string name’ для проверки его корректности перед регистрацией.

В скрипты сервера/клиента/маппера добавлены глобальные функции:
uint DecodeUTF8(const string& text, uint& length) - декодирование символа из текста (const string& text) с возвращением его UCS кода и длинны кода в строке (uint& length). Если символ не распознан, то будет возвращен код 0xFFFD.
string@ EncodeUTF8(uint ucs) - кодирование UCS кода в строку.

Изменился формат файлов шрифта fofnt, теперь в первую очередь должен присутствовать тег с версией формата (Version).
- изменился формат тега Letter, c “Letter 65 # 'A'” на “Letter 'A'”;
- добавлен тег LineHeight, который указывает на высоту строки шрифта (если не указан, то высота берется по самому большому символу из всего списка);
- в имя атласа для шрифта Image можно добавить символ ‘*’, тогда цвет текстуры нормализуется с любого на RGB [128, 128, 128] (только для OpenGL рендера);
- метка ‘End’ прекратит парсинг файла (для отладки).
Эти шрифты теперь кешируются в бинарном виде, их загрузка теперь будет очень быстрой, после первого запуска. Рекеширование идет, если изменилось время записи файла.
В основной шрифт Default.fofnt добавлены дополнительные символы юникода из шрифта DefaultExt.fnt (хотя сам шрифт нигде не используется), в связи с чем клиент теперь поддерживает не только английский и русский язык, как минимум для шрифта по умолчанию.

Обновлена работа со строками.

Индексный оператор теперь возвращает строку содержащую нужный символ, соответственно сравнивать теперь необходимо не с символьными константами (‘X’), а со строками (“X”). Пример:
string s = “abcd”; // s[ 1 ] вернет "b"
string s = “abcd”; // s[ 4 ] исключение - выход за пределы массива
При присвоении с индексным оператором идет удаление символа и вставка присваиваемой строки, примеры:
string s = “abcd”; s[ 1 ] = “g”; // s == "agcd"
string s = “abcd”; s[ 2 ] = “xyz”; // s == "abxyzd"
string s = “abcd”; s[ 1 ] = ""; // s == "acd"
Появилась возможность индексировать строки с помощью отрицательных значений. Это применимо так же к глобальным функциям для работы со строками (substr, findFirst, findLast и т.п.) для параметра ‘int start’. Примеры:
string s = “abcd”; // s[ -1 ] вернет "d"
string s = “abcs”; // s[ -100 ] исключение - выход за пределы массива
string s = “abcd”; s[ -3 ] = “X”; // s == "aXcd"
string s = “abcd”; s[ -1 ] = ""; // s == "abc"

Метод length() теперь возвращает количество символов юникода в строке, а не количество байт, т.е. как метод lengthUTF8(), который сейчас удален (замену старому length() см. ниже).

Обновлены все функции для работы со строками (substr, findFirst, findLast и т.п.), теперь они так же работают с символами юникода, а не байтами.

Переименован метод resize(uint), см. ниже.

Для работы с байтами в строке добавлены следующие методы:
uint rawLength() const - вместо предыдущего length();
void rawResize(uint size) - вместо resize(uint);
uint8 rawGet(uint index) const - вместо старого индексного оператора;
void rawSet(uint index, uint8 value) - вместо старого индексного оператора.

Исправления по трехмерной графике.

Исправлена утечка памяти при работе с эффектами.

В формате fo3d тег Mesh теперь может принимать значение -1, это означает, что установка текстур, эффектов и отключения материалов (теги Texture, Effect, DesableSubset) будут касаться всех мешей в текущей модели. Так же теперь этот тег по умолчанию равен -1, а не 0 (т.е. установка для всех моделей, а не только для первой).

Исправлено использование эффектов в 3д моделях OpenGL ренеринга (до этого они не устанавливались и всегда использовались эффекты по умолчанию).

Другое.

Оптимизирована скорость загрузки карт (fomap) и прототипов (fopro) файлов.