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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
// FOS Client Mapper

/*EXPORT*/ class Sprite
{
    void Load( string& name )
    {
        Id = ( name.length() > 0 ? LoadSprite( name ) : 0 );
        LoadedNameHash = uint( -1 );
        RefreshData();
    }

    void Load( uint nameHash )
    {
        if( nameHash == LoadedNameHash )
            return;
        LoadedNameHash = nameHash;

        Id = LoadSprite( nameHash );
        RefreshData();
    }

    // cornerX/Y = -1 left / top, 0 center, 1 right / bottom
    void Draw( int x, int y, int w = 0, int h = 0, int cornerX = -1, int cornerY = -1, int layout = -1 )
    {
        if( Id == 0 || Hidden )
            return;

        if( w == 0 )
            w = Width;
        if( h == 0 )
            h = Height;

        if( AnimPlay )
        {
            uint ticksPerFrame = Ticks / FrmCount;
            int  framesPassed = ( GetTick() - AnimStartTick ) / ticksPerFrame;
            if( framesPassed > 0 )
            {
                AnimStartTick += framesPassed * ticksPerFrame;
                Frame += ( AnimReverse ? -framesPassed : framesPassed );

                bool endAnim = false;
                if( Frame <= 0 )
                {
                    endAnim = true;
                    AnimStartTick -= -Frame * ticksPerFrame;
                    Frame = 0;
                }
                else if( Frame >= int(FrmCount) - 1 )
                {
                    endAnim = true;
                    AnimStartTick -= ( Frame + 1 - FrmCount ) * ticksPerFrame;
                    Frame = FrmCount - 1;
                }

                if( endAnim )
                {
                    if( AnimLoop )
                        Frame = ( AnimReverse ? int(FrmCount) - 1 : 0 );
                    else
                        AnimPlay = false;
                }
            }
        }

        if( cornerX == 0 )
            x -= w / 2;
        else if( cornerX == 1 )
            x -= w;
        if( cornerY == 0 )
            y -= h / 2;
        else if( cornerY == 1 )
            y -= h;

        switch( layout != -1 ? layout : Layout )
        {
        case IMAGE_LAYOUT_TILE:
            DrawSpritePattern( Id, Frame, x, y, w, h, Width, Height );
            break;
        case IMAGE_LAYOUT_CENTER:
            DrawSprite( Id, Frame, x + w / 2 - Width / 2, y + h / 2 - Height / 2 );
            break;
        case IMAGE_LAYOUT_STRETCH:
            DrawSprite( Id, Frame, x, y, w, h );
            break;
        case IMAGE_LAYOUT_ZOOM:
            DrawSprite( Id, Frame, x, y, w, h, true );
            break;
        default:
            DrawSprite( Id, Frame, x, y );
            break;
        }
    }

    void SetFrame( int index )
    {
        Frame = index;
        AnimPlay = false;
    }

    void SetFirstFrame()
    {
        SetFrame( 0 );
    }

    void SetLastFrame()
    {
        SetFrame( int(FrmCount) - 1 );
    }

    void PlayAnimation( bool loop = true, bool reverse = false )
    {
        if( Id == 0 )
            return;
        if( AnimPlay && AnimLoop == loop && AnimReverse == reverse )
            return;

        AnimPlay = true;
        AnimLoop = loop;
        AnimReverse = reverse;
        AnimStartTick = GetTick();
    }

    private void RefreshData()
    {
        if( Id != 0 )
        {
            Width = GetSpriteWidth( Id, 0 );
            Height = GetSpriteHeight( Id, 0 );
            FrmCount = GetSpriteCount( Id );
            Ticks = GetSpriteTicks( Id );
        }
        else
        {
            Width = 0;
            Height = 0;
            FrmCount = 0;
            Ticks = 0;
        }
    }

    uint Id;
    int  Frame = -1;
    int  Layout = IMAGE_LAYOUT_NONE;
    int  Width;
    int  Height;
    uint FrmCount;
    uint Ticks;
    bool AnimPlay;
    bool AnimLoop;
    bool AnimReverse;
    uint AnimStartTick;
    bool Hidden;
    uint LoadedNameHash;
}

Commits for fonline_sdk/Modules/Core/Sprite.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.

631 Diff Diff cvet picture cvet Wed 08 Jun, 2016 13:02:47 +0000

Правка загрузки анимаций фаллаута.
Убраны константы предопределенных путей.

610 Diff Diff cvet picture cvet Mon 23 May, 2016 16:22:23 +0000

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

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 скриптов.

566 Diff Diff cvet picture cvet Sat 24 Oct, 2015 10:08:47 +0000

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

565 Diff Diff cvet picture cvet Sat 24 Oct, 2015 09:57:00 +0000

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

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

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

525 cvet picture cvet Fri 24 Jul, 2015 19:36:13 +0000

Добавлена поддержка работы с вебом.
Для работы используется библиотека cURL
http://curl.haxx.se/
Добавлена глобальная функция
void YieldWebRequest(const string& url, const dict< string, string >@+ post, bool& success, string& result)
const string& url - ссылка запроса;
const dict< string, string >@+ post – POST данные (может быть null);
bool& success - успешно ли прошла операция;
string& result - текст ответа при успешном результате или текст ошибки при провале.
Как видно из названия (Yield) функция прерывает работу скрипта, т.к. взаимодействие с вебом требует некоторого времени.

Добавлены глобальные функции для вычисления хеша
string@ SHA1(const string& text)
string@ SHA2(const string& text)

Добавлена глобальная функция для открытия ссылки в браузере из программы
void OpenLink(const string& link)

Проведены работы в системе интерфейса.

Различные правки багов.