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
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
|
---@meta
---Library of https://github.com/cloudwu/luaecs
---We use a component id and a index in a component pooid, then we can
---get this component's entity id ,then get all other components.
---@class ITER
---@field index integer index of the component pool
---@field cid integer component type id
---@field iter ENTITY_GROUPITER #userdata
---Return depend the pattern, every pattern will be return a table.
---This is a C function, and it will be used as the __call metamethod of the
---ECSWorld#_groupiter 's return usedata's metatable.
---If the pattern of select is a component name but not a condition,then return
---is the component pool index and component id.
---@alias ENTITY_GROUPITER fun():ITER
---Every entity must defined which component it contains on new.
---@class ECSWorld
local meta = {}
---Register a component, use Lua table to describe data struct.
---The table is a name field and data field list, and can has a type field, field will be 'filed_name:type'.
---Then, will caulate the size of component type's data.
---Support type is: int, float, bool, int64, dword, word, byte, double, userdata
---* if type is `lua`, the size is ecs._LUAOBJECT, -1;
---* if type is `raw`, we must set the type's size explict;
---* or the size may bigger than 0, which caculated from the data field list.
---* or if the size is 0, it is a one value component, if it has type field, then the size is the type size;
---* or if the size litter then 0, it is a tag.
---```
---In C, this is init a component pool, every component pool's data will in a continus memory.
--- {name = 'vector', 'x:float','y:float'} -- normal component
--- {name = 'object',type='lua'}} -- lua component
--- {name = 'hp', type='int'} -- one value component
--- {name = 'mark'}, -- tag, default it boolean
----{name = 'rawobj', type='raw', size= '20'} -- raw object
--- {name = 'byname', order = true} -- order tag
--- Then the c api _newtype will malloc a continus memory of the types' size.
---@param typeclass table
---@see ECSWorld#_newtype
function meta:register(typeclass)
end
---Construct a new entity, use Lua table to describe it.
---The key is the component type, must register it before,
---so, every kv pair is a component.
---Every component pool will get the new entity id.
---@param obj? table #{name = "hello", position= {x = 1, y = 2}}
---@return integer #eid
function meta:new(obj)
end
---Return the info of a list of component names.
---May be, for test use?
---@param t string[] component name list
---@return userdata #ctx info
---@see ECSWorld#_context
function meta:context(t)
end
---Select a patterns of entitys, the mainkey( first key) can't not be has absent condtion.
---The pattern is a space-separated combination of `componentname[:?]action`, and the `action` can be
---* in : read the component
---* out : write the component
---* update : read / write
---* absent : check if the component is not exist
---* exist (default) : check if the component is exist
---* new : create the component
---* ? means it's an optional action if the component is not exist
---NOTICE: If you use action `new` , you must guarantee the component is clear (None entity has this component) before iteration.
---If opt and inout is absent, the return is the id info of the entitys.{ {pooid, cid}}
---**Return value will only has components in he pattern**
---**Return value will like {component_index, component_id,ENTITY_GROUPITER,component1, component2}
---@param pat string #key [{opt inout}] , opt is : or ?, inout is in, out, update, exist(default), absent, new.like t:in, b:out, id?update
---@return ENTITY_GROUPITER #iter function
---@see ECSWorld#_groupiter
function meta:select(pat)
end
---Sync all then component of the entity represent by a iter to LUA
---@param iter number|ITER #ITER or entity id
---@return table
---@see ECSWorld#_read
---@see ECSWorld#access
---@see ECSWorld#fetch
function meta:readall(iter)
end
---Clear a component type of name `name`
---@param name string component name
---@see ECSWorld#_clear
function meta:clear(name)
end
---Clear all component types.
---@see ECSWorld#clear
function meta:clearall()
end
---Dump all indexes of a component of name `name`
---@param name string
---@return integer[]
---@see ECSWorld#_dumpid
function meta:dumpid(name)
end
---Update world, will free removed(default, or with tag `tagname`) entity.
---@param tagname? string #tagname, default is REMOVED, but we also can use other tag to delete entities.
---@see ECSWorld#_update
function meta:update(tagname)
end
local M = {
_MAXTYPE = 255,
_METHODS = meta,
_TYPE_INT = 0,
_TYPE_FLOAT = 1,
_TYPE_BOOL = 2,
_TYPE_INT64 = 3,
_TYPE_DWORD = 4,
_TYPE_WORD = 5,
_TYPE_BYTE = 6,
_TYPE_DOUBLE = 7,
_TYPE_USERDATA = 8,
_TYPE_COUNT = 9,
_LUAOBJECT = -1,
_REMOVED = 0,
_ORDERKEY = -2,
NULL = 0x0, -- userdata
}
---Lua function
---Construct a new LuaECS World
---@return ECSWorld
function M.world()
end
---Like new(obj), but use a specifie entity
---@param eid integer #entity id
---@param obj table #describe all component of the type
function meta:import(eid, obj)
end
-- Create a template first
---local t = w:template {
--- name = "foobar"
---}
-- instance the template into an entity, and add visible tag.
--- The additional components ( { visible = true } ) is optional.
--- local eid = w:template_instance(w:new(), t, { visible = true })
---Use a templat to Construct an entity.
---@param eid integer #entity id
---@param temp string #template name
---@param obj table
function meta:template_instance(eid, temp, obj)
end
---Get an entity's one component, can can write the value.
---@param eid integer
---@param pat string #only one key
---@param value? any # when with this values, is write.
---@return any|nil # pattern key is tag, return boolean; lua type, return lua data; else table; if write, return nil.
---@see ECSWorld#readall
---@see ECSWorld#fetch
function meta:access(eid, pat, value)
end
---Count the pattern 's object number
---@param pat string
---@return integer
function meta:count(pat)
end
---Extend an iter with pattern.
---@param iter ITER
---@param expat string
---@see ECSWorld#_read
function meta:extend(iter, expat) end
---Get component id by name
---@param name string
---@return integer #component id
function meta:component_id(name) end
---Persist Use
function meta:read_component(reader, name, offset, stride, n) end
---Get the first entity of pattern `pattern`
---We can use this as a signletone component.
---@param pattern string
---@return ITER
function meta:first(pattern) end
---Check pattern `pattern` whether has entitys.
---Work same as ECSWorld#first but return boolean.
---@param pattern string
---@return boolean
function meta:check(pattern) end
---Register a template.
---@param obj table #component and value pairs
function meta:template(obj) end
---You can tags entities in groups with `w:group_enable(tagname, groupid1, groupid2,...)`
---Enable tag `tagname` on multi groups
---@param tagname string tagname
---@param ... number #group id s
---@see ECSWorld#_group_enable
function meta:group_enable(tagname, ...) end
---Get a component's type.
---@param name string
---@return string # tag | lua | c | M._TYPE*
function meta:type(name) end
---This will reset `tagname`'s component pool.
---Set tag on entitys in pattern `pat`
---@param tagname string
---@param pat string
function meta:filter(tagname, pat) end
---Fetch entity's component with pattern `pat`
---You can use out, update and then w:sumit() to modify entity.
---@param eid integer
---@param pat? string
---@see ECSWorld#readall
---@see ECSWorld#access
---@return table # entity with pat specified component
function meta:fetch(eid, pat) end
----------- C API -------------
---C API
---Get the world size
---@return integer, integer #capaticy size, used size
function meta:memory() end
---C API
---shrink_component_pool
function meta:collect() end
---C API
---New component type.
---@param cid integer component id, cacul from the Lua
---@param size integer # size
---@see ECSWorld#register
function meta:_newtype(cid, size)
end
--- C API
---Return a new entity
---@return integer entity id
function meta:_newentity()
end
--- C API
---Check the entity is exist
---@param eid integer
---@return integer #entity's index in the world, start at 0
---@see ECSWorld#exist
function meta:_indexentity(eid) end
--- C API
---Add entity of id `eid` to the component pool of id `cid`, return the pool index.
---@param eid integer entity id
---@param cid integer component id,
---@return integer #pool index id
function meta:_addcomponent(eid, cid)
end
--- C API
---Update world.
---Remove all entity which removed(default) or with component id `cid`, and will rearrange the world.
---@param cid? integer #tagid
---@see ECSWorld#update
function meta:_update(cid)
end
--- C API
---Clear component of id `cid`
---@param cid integer component id
---@see ECSWorld#clear
function meta:_clear(cid)
end
--- C API
---Return the info of a list of component ids.
---@param t integer[]
---@return userdata #ctx info
---@see ECSWorld#context
function meta:_context(t)
end
--- C API
---Return an iter function for a list of pattren.
---@param pat_desc table[] #{ {name, id, type, [opt, r, w, exist, absent, new] }
---@return ENTITY_GROUPITER #iter C function
function meta:_groupiter(pat_desc)
end
--- C API
function meta:_mergeiter(...) end
--- C API
---Get a iter of entity eid.
---@param eid integer
---@return ITER # the cid will by -1
function meta:_fetch(eid) end
--- C API
---Entity exists?
---@param eid integer
function meta:exist(eid) end
--- C API
--- Remove an entity with eid
--- The removed entity will has a tag REMOVED
---@param eid number
function meta:remove(eid)
end
---C API
---@param ref ENTITY_GROUPITER #the iter of component
---@param cv any #the inited component
---@param index integer #the index of the component pool
function meta:_object(ref, cv, index)
end
---@param pattern string
---@param iter ITER
function meta:_read(pattern, iter)
end
---C API
---Commit an mod of a group iter with out or new
---@param iter ITER
function meta:submit(iter) end
---@see ECSWorld:#first
function meta:_first(...) end
---Dump all id of a component of id `cid`
---@param cid integer
---@return integer[]
---@see ECSWorld#dumpid
function meta:_dumpid(cid)
end
---@see ECSWorld:count
function meta:_count(...) end
---@see ECSWorld:filter
function meta:_filter(...) end
function meta:_access(...) end
function meta:__gc(...) end
---C API
--- Add entity (eid) into a group with groupid (32bit integer)
---**NOTE:We can add entity to a group, but we can not remove it from a group.**
---**NOTE:We can iterate a group, but we can not random visit a group member.**
---@param groupid number #32bit
---@param eid number
function meta:group_add(groupid, eid) end
---C API. Add tag of group's entitys
---**NOTICE: this call will clear the the tag's component pool.**
---@param tagid number
---@param ... number #max number is 1024
---@see ECSWorld#group_enable
function meta:_group_enable(tagid, ...) end
---C api, get the eid list of a group
---@param groupid number
---@return table # eid list
function meta:group_get(groupid) end
return M
|