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
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
// FOS Server
// Author: Atom

// utilities for tracing
// pathfinding/critter-gathering functions etc.

/*EXPORT*/ interface ITraceContext
{
    void StartExec( const Map map, uint16 hx, uint16 hy, uint16 tx, uint16 ty, uint maxDist );
    void FinishExec( const Map map, uint resultDist );
    bool Exec( const Map map, uint16 hx, uint16 hy ); // Return true to stop tracing
}

// math
const float SQRT3T2_FLOAT = 3.4641016151f;
const float SQRT3_FLOAT = 1.732050807568877f;
const float BIAS_FLOAT = 0.02f;
const float RAD2DEG = 57.29577951f;

float GetDirectionF( uint16 hx, uint16 hy, uint16 tx, uint16 ty )
{
    float nx = 3 * ( float(tx) - float(hx) );
    float ny = SQRT3T2_FLOAT * ( float(ty) - float(hy) ) - ( float(tx % 2) - float(hx % 2) ) * SQRT3_FLOAT;
    return 180.0f + RAD2DEG* atan2( ny, nx ); // In degrees, because cvet loves the degrees
}

/*EXPORT*/ uint LineTracerHex( uint16 hx, uint16 hy, uint16 tx, uint16 ty, const Map map, uint dist, ITraceContext context )
{
    if( dist == 0 )
        dist = GetDistantion( hx, hy, tx, ty );

    context.StartExec( map, hx, hy, tx, ty, dist );

    float dir = GetDirectionF( hx, hy, tx, ty );
    uint8 dir1, dir2;
    if( ( 30.0f <= dir ) && ( dir < 90.0f ) )
    {
        dir1 = 5;
        dir2 = 0;
    }
    else if( ( 90.0f <= dir ) && ( dir < 150.0f ) )
    {
        dir1 = 4;
        dir2 = 5;
    }
    else if( ( 150.0f <= dir ) && ( dir < 210.0f ) )
    {
        dir1 = 3;
        dir2 = 4;
    }
    else if( ( 210.0f <= dir ) && ( dir < 270.0f ) )
    {
        dir1 = 2;
        dir2 = 3;
    }
    else if( ( 270.0f <= dir ) && ( dir < 330.0f ) )
    {
        dir1 = 1;
        dir2 = 2;
    }
    else
    {
        dir1 = 0;
        dir2 = 1;
    }

    uint16 cx = hx;
    uint16 cy = hy;
    uint16 px = hx;
    uint16 py = hy;

    uint16 t1x, t1y, t2x, t2y;

    float  x1 = 3 * float(hx) + BIAS_FLOAT;
    float  y1 = SQRT3T2_FLOAT * float(hy) - ( float(hx % 2) ) * SQRT3_FLOAT + BIAS_FLOAT;

    float  x2 = 3 * float(tx) + BIAS_FLOAT;
    float  y2 = SQRT3T2_FLOAT * float(ty) - ( float(tx % 2) ) * SQRT3_FLOAT + BIAS_FLOAT;

    float  dx = x2 - x1;
    float  dy = y2 - y1;

    float  c1x, c1y, c2x, c2y; // test hex
    float  dist1, dist2;

    for( uint i = 1; i <= dist; i++ )
    {
        t1x = cx;
        t2x = cx;
        t1y = cy;
        t2y = cy;
        map.MoveHexByDir( t1x, t1y, dir1, 1 );
        map.MoveHexByDir( t2x, t2y, dir2, 1 );
        c1x = 3 * float(t1x);
        c1y = SQRT3T2_FLOAT * float(t1y) - ( float(t1x % 2) ) * SQRT3_FLOAT;
        c2x = 3 * float(t2x);
        c2y = SQRT3T2_FLOAT * float(t2y) - ( float(t2x % 2) ) * SQRT3_FLOAT;
        dist1 = dx * ( y1 - c1y ) - dy * ( x1 - c1x );
        dist2 = dx * ( y1 - c2y ) - dy * ( x1 - c2x );
        dist1 = ( ( dist1 > 0 ) ? dist1 : -dist1 );
        dist2 = ( ( dist2 > 0 ) ? dist2 : -dist2 );
        if( dist1 <= dist2 )
        {
            cx = t1x;
            cy = t1y;
        } // left hand biased
        else
        {
            cx = t2x;
            cy = t2y;
        }

        // if MoveHexByDir tried to leave the map and failed:
        if( cx == px && cy == py )
        {
            dist = i - 1;
            break;
        }

        px = cx;
        py = cy;

        if( context.Exec( map, cx, cy ) )
        {
            dist = i;
            break;
        }
    }

    context.FinishExec( map, dist );
    return dist;
}

/*EXPORT*/ uint LineTracerSquare( uint16 hx, uint16 hy, uint16 tx, uint16 ty, const Map map, uint dist, ITraceContext context )
{
    context.StartExec( map, hx, hy, tx, ty, dist );

    float dir = atan2( float(ty - hy), float(tx - hx) );
    float dx = cos( dir );
    float dy = sin( dir );
    if( abs( dx ) > abs( dy ) )
    {
        dy /= abs( dx );
        dx = ( dx > 0 ? 1.0f : -1.0f );
    }
    else
    {
        dx /= abs( dy );
        dy = ( dy > 0 ? 1.0f : -1.0f );
    }
    float  x1 = float(hx) + 0.5f;
    float  y1 = float(hy) + 0.5f;
    uint16 maxx = map.Width;
    uint16 maxy = map.Height;
    uint16 cx = 0, cy = 0;

    for( uint i = 1; i <= dist; i++ )
    {
        x1 += dx;
        y1 += dy;
        cx = uint16( floor( x1 ) );
        cy = uint16( floor( y1 ) );
        if( cx >= maxx || cy >= maxy )
        {
            dist = i - 1;
            break;
        }
        if( context.Exec( map, cx, cy ) )
        {
            dist = i;
            break;
        }
    }

    context.FinishExec( map, dist );
    return dist;
}

Commits for fonline_sdk/Modules/Core/LineTracer.fos

Diff revisions: vs.
Revision Author Commited Message
809 Diff Diff cvet picture cvet Fri 21 Sep, 2018 13:48:59 +0000

Added ‘#undef’ directive.
Added ‘filesystem’ script class.
Fixed ‘ModelName’ change handling.
Fixed crash when pressing Maps/Locations in server gui.
Fixed build pipeline on non Windows machines.
Fixed scripts loading order for correct defines loading.

786 Diff Diff cvet picture cvet Mon 06 Mar, 2017 17:32:49 +0000

Excluded stuff related to AI.

Added some stuff for control movements:
void Critter::MoveToCritter(Critter@+ cr, uint cut, bool isRun) - init moving to critter;
void Critter::MoveToHex(uint16 hexX, uint16 hexY, uint cut, bool isRun) - init moving to hex;
MovingState Critter::GetMovingState() const – current state;
void Critter::ResetMovingState(uint& gagId) - reset state to Success and return id of critter/item for GagCritter/GagItem states;

704 Diff Diff cvet picture cvet Mon 21 Nov, 2016 10:49:18 +0000

Excluded some hardcoded stuff.
Formatting.

694 Diff Diff cvet picture cvet Sat 12 Nov, 2016 14:24:27 +0000

From script language excluded pointer to object ‘@’.
Now all types separated on Value and Reference types.
Value types:
- primitives like int/float/etc;
- string.
Reference types (all other):
- built-in types array/dict/etc;
- funcdef;
- script types (class MyClass);
- engine types like Entity/Critter/Map/etc.
Value types can’t be null and new instance created when it assigned.
Reference types null by default and new instance not created when it assigned.
Reference operator ‘&’ can be used for both.

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

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

593 Diff Diff cvet picture cvet Sat 19 Dec, 2015 11:01:26 +0000

Все классы сущностей (Item, Critter, Map, Location, кастомные) наследуются от общего Entity.
Что дает возможность даункастить их в Entity, и апкастить в нужный тип.
Пример:
void func(Entity@ a)
{
Item@ item = cast< Item >( a );
if( item !is null )
...
}

Изменения по прототипам.
В скриптах больше нет класса ProtoItem, теперь все свойства хранятся в экземпляре Item.
Теперь прототип это строго значения по умолчанию свойств сущностей.
Значение может меняться в экземпляре.
Функция GetProtoItem сейчас возвращает константный экземпляр Item со стартовыми значениями из прототипа.

Прототипы теперь могут наследоваться.
Для наследования используется ключевое слово $Parent, где перечисляется один или несколько прототипов для наследования.
Пример:
$Parent = Parent1 Parent2 Parent3
Наследование идет слева направо.
Так же есть возможность инъекции в определенные или все прототипы.
Для этого используются ключевые слова $Inject и $InjectOverride.
Для указания всех прототипов используется ключевое слово All.
Пример:
$Inject = All
Что означает, что прототип будет внедрен во все остальные прототипы.
$InjectOverride означает то, что свойства применяться в самом конце.
Весь порядок применения свойств:
$Inject из других прототипов в этот, $Parent прототипа (слева направо), свойства прототипа, $InjectOverride других прототипов в этот.
После всей этой цепочки и появляется итоговые значения свойств прототипа.

Один файл прототипа может содержать в себе несколько прототипов.
Сделано для возможности размещения групп прототипов в одном файле. Например: сет стен, однотипные ящики.
Для задания имени прототипа явно (т.к. неявно оно берется из имени файла) используется ключевое слово $Name.
Пример:
Файл MyWall.foitem
[ProtoItem]
Type = Wall
IsShootThru = false
...
[ProtoItem]
$Name = MyWall1
$Parent = MyWall
PicMap = MyWall1.png
[ProtoItem]
$Name = MyWall2
$Parent = MyWall
PicMap = MyWall2.png

Немного изменился формат прототипов, для их миграции написан питон скрипт (Tools/Scripts/592_ProtoFix.py).
В будущем для различного рода патчей контента будет практиковаться написание подобных скриптов.

В связи с новой концепцией работы прототипов теперь опции Default и Random в прагмах property исключены, т.к. задание стартовых значений происходит в прототипах.

Изменился механизм работы с картами.
Удалена промежуточная сущность MapperObject, теперь работа идет с обычными Item/Critter.
Формат карт изменился, теперь он соответствует стандартному формату [App]/Key=Value.
Теперь можно работать с любыми свойствами сущностей, для их просмотра используются функции ShowCritterProperty, ShowItemProperty.
После чего они будут видны в инспекторе сущностей в маппере.
Пока редактирование свойств работает не очень хорошо, будет исправлено в ближайшем будущем.
Так же в будущем будет перенос на скриптовый гуй, и возможно объединение маппера с клиентом.
Новый функционал:
Item@+ Item::AddChild(hash pid)
Item@+ Critter::AddChild(hash pid) const
uint Item::GetChildren(uint16 hexX, uint16 hexY, array<Item@>@+ children)
uint Item::GetChildren(uint16 hexX, uint16 hexY, array<const Item@>@+ children) const
uint Critter::GetChildren(uint16 hexX, uint16 hexY, array<Item@>@+ children)
uint Critter::GetChildren(uint16 hexX, uint16 hexY, array<const Item@>@+ children) const
Item@+ AddItem(hash protoId, uint16 hexX, uint16 hexY)
Critter@+ AddCritter(hash protoId, uint16 hexX, uint16 hexY)
Item@+ GetItemByHex(uint16 hexX, uint16 hexY)
uint GetItemsByHex(uint16 hexX, uint16 hexY, array<Item@>@+ items)
Critter@+ GetCritterByHex(uint16 hexX, uint16 hexY, int findType)
void GetCrittersByHex(uint16 hexX, uint16 hexY, int findType, array<Critter@>@+ critters)
void MoveEntity(Entity& entity, uint16 hexX, uint16 hexY)
void DeleteEntity(Entity& entity)
void DeleteEntities(array<Entity@>& entities)
void SelectEntity(Entity& entity, bool set)
void SelectEntities(array<Entity@>& entities, bool set)
Entity@+ GetSelectedEntity()
uint GetSelectedEntities(array<Entity@>@+ entities)
uint GetTilesCount(uint16 hexX, uint16 hexY, bool roof)
void DeleteTile(uint16 hexX, uint16 hexY, bool roof, int layer)
hash GetTile(uint16 hexX, uint16 hexY, bool roof, int layer)
void AddTile(uint16 hexX, uint16 hexY, int offsX, int offsY, int layer, bool roof, hash picHash)
string@ GetTileName(uint16 hexX, uint16 hexY, bool roof, int layer)
void AddTileName(uint16 hexX, uint16 hexY, int offsX, int offsY, int layer, bool roof, string@+ picName)

Начат переход к более строгому соблюдению константности передаваемых в скрипт сущностей.
Константный объект не может менять своего состояния.
Сделано это для того, что бы исключить возможность модификации сущностей, когда это не подразумевается (например различного рода геттеры).
Данная работа еще не завершена полностью, об окончании будет сообщено дополнительно.

Предметы получили возможность вкладываться друг в друга при любом типе, не только контейнере.
Но пока клиент не получает информации о вложенных в него предметах, поэтому метод
uint Item::GetItems(uint stackId, array<Item@>@+ items) будет всегда возвращать пустой список.
Будет исправлено в будущем.

Различные изменения по скриптам:
Item
IsStackable() -> Stackable
IsDeteriorable() -> Deteriorable
GetScriptId() -> ScriptId
GetCost() -> GetWholeCost()
удалено ProtoItem@ Proto
Critter
ProtoItem@+ GetSlotProto(int slot, uint8& mode) const -> const Item@+ GetSlotItem(int slot) const
Map
Critter@+ AddNpc(hash protoId, uint16 hexX, uint16 hexY, uint8 dir, int[]+ params, int[]+ items, string@+ script)
-> Critter@+ AddNpc(hash protoId, uint16 hexX, uint16 hexY, uint8 dir, array< int >@+ props, string@+ script)
GetWidth() -> Width
GetHeight() -> Height
Location
удалено void Update()
DrawMapSprite разделена на две функции (в первой используется вызов второй, с параметрами взятыми из переданного прототипа)
void DrawMapSpriteProto(uint16 hx, uint16 hy, uint sprId, int frameIndex, int offsX, int offsY, hash protoId)
void DrawMapSpriteExt(uint16 hx, uint16 hy, uint sprId, int frameIndex, int offsX, int offsY, bool isFlat, bool noLight, int drawOrder, int drawOrderHyOffset, int corner, bool disableEgg, uint color, uint contourColor)
В Item@+ AddItem(uint16 hexX, uint16 hexY, hash protoId, uint count, dict< ItemProperty, int >@+ props = null) можно передавать стартовые свойства для генерируемого предмета.

Различного рода фиксы.

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 cvet picture cvet Sat 24 Oct, 2015 10:08:47 +0000

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