-
Notifications
You must be signed in to change notification settings - Fork 0
/
cell.tl
117 lines (103 loc) · 3.05 KB
/
cell.tl
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
require "types"
require "common"
local inspect = require "inspect"
local istate: CommonSetup
local stat: Statistic
local actions: CellActions
local rng: love.math.RandomGenerator
-- здесь работает ассемблер
local function getCodeValues(): {string}
local codeValues = {}
for k, _ in pairs(actions as {string:string}) do
table.insert(codeValues, k)
end
return codeValues
end
local codeValues: {string}
printLog("codeValues", inspect(codeValues))
-- генератор кода
function genCode(): {string}
local code = {}
local len = #codeValues
for _ = 1, istate.codeLen do
table.insert(code, codeValues[math.floor(rng:random(1, len))])
end
return code
end
function Cell.new(t: CellSetup): Cell
local self: Cell = setmetatable({} as Cell, { __index = Cell })
self.pos = {}
t = t or {}
if t.pos and t.pos.x then
self.pos.x = t.pos.x
else
self.pos.x = math.floor(istate.rng:random(1, istate.gridSize))
end
if t.pos and t.pos.y then
self.pos.y = t.pos.y
else
self.pos.y = math.floor(istate.rng:random(1, istate.gridSize))
end
if t.wantdivide then
self.wantdivide = t.wantdivide
end
if t.code then
self.code = shallowCopy(t.code)
else
self.code = genCode()
--error("No cell code")
end
if t.generation then
self.generation = self.generation + 1
else
self.generation = 1
end
if t.energy then
self.energy = t.energy
end
self.ip = 1
self.id = istate.cellId
istate.cellId = istate.cellId + 1
--printLog('Cell:new')
--printLog('istate.initialEnergy', istate.initialEnergy[1], istate.initialEnergy[2])
--printLog('istate.rg:random() =', self.energy)
self:print()
self.energy = istate.rng:random(istate.initialEnergy[1], istate.initialEnergy[2])
return self
end
function Cell:print()
--printLog('Cell:print')
end
-- здесь работа vm
function Cell:update(): boolean
local isalive: boolean = true
-- прокрутка кода клетки по кругу
if self.ip >= #self.code then
self.ip = 1
end
--print("cell", cell.id, "energy", cell.energy)
if self.energy > 0 then
local code = self.code[self.ip]
--print("code", code)
--isalive = not actions[code](self)
isalive = actions[code](self)
self.ip = self.ip + 1
self.energy = self.energy - istate.denergy
-- если счетчик установлен, то постоянно умешьшать его значение до 0
if self.wantdivide and self.wantdivide - 1 >= 0 then
self.wantdivide = self.wantdivide - 1
end
else
isalive = false
-- увеличить количество умерших
stat.died = stat.died + 1
end
return isalive
end
function cellInitInternal(state: CommonSetup, s: Statistic)
istate = shallowCopy(state)
actions = state.cellActions
rng = state.rng
stat = s
codeValues = getCodeValues()
end