e0825e5bbb
[NEW] Afegit music_player [NEW] Música de fons des de l'inici
94 lines
2.7 KiB
Lua
94 lines
2.7 KiB
Lua
|
|
states={
|
|
registre={}, -- {nom {ptr (a l'estat actual), path (llista de funcions ordenada)} ...}
|
|
actiu = "", -- nom del registre actiu
|
|
stack = {}, -- guarda els canvis de registre per a poder tornar a l'estat anterior
|
|
safe_show = false,
|
|
add_stack = {}, -- pila per a pasar a stack en quan arribe el següent executar
|
|
}
|
|
|
|
|
|
function states:safe()
|
|
if not states.safe_show then
|
|
print("[STATES] No hi ha res en la pila")
|
|
states.safe_show = true
|
|
end
|
|
end
|
|
|
|
function states:registrar(nom, _path)
|
|
print("[STATES] REGISTRAR => "..nom)
|
|
self.registre[nom]= {ptr=0, path=_path}
|
|
-- print(" nom.ptr -> "..self.registre[nom].ptr)
|
|
-- print(" nom.path -> "..#self.registre[nom].path)
|
|
end
|
|
|
|
function states:borrar(nom)
|
|
self.registre[nom].ptr=0
|
|
self.registre[nom].path=nil
|
|
end
|
|
|
|
function states:add(nom)
|
|
print("[STATES] add "..nom)
|
|
self.add_stack[#self.add_stack+1] = nom
|
|
end
|
|
|
|
function states:executar(nom, stacking)
|
|
print("[STATES] EXEC "..nom)
|
|
if stacking then
|
|
-- table.insert(self.stack, self.actiu)
|
|
self.stack[#self.stack+1] = self.actiu
|
|
-- print(" APILAT "..self.actiu.."!")
|
|
if #self.add_stack>0 then
|
|
for i, v in ipairs(self.add_stack) do
|
|
self.stack[#self.stack+1] = v
|
|
end
|
|
self.add_stack={}
|
|
end
|
|
end
|
|
self.actiu=nom
|
|
self.registre[self.actiu].ptr=0
|
|
-- Executar el primer pas
|
|
self:next()
|
|
end
|
|
|
|
function states:next()
|
|
-- print("[STATES] NEXT "..self.actiu);
|
|
local estat = self.registre[self.actiu]
|
|
local ptr = estat.ptr
|
|
local steps = #estat.path
|
|
if ptr+1>steps then
|
|
self:finish()
|
|
else
|
|
estat.ptr = ptr+1
|
|
-- print("[STATES] NEXT "..self.actiu.." ("..estat.ptr.." / "..steps..")")
|
|
game_update = estat.path[estat.ptr]
|
|
end
|
|
|
|
return self.actiu, estat.ptr
|
|
end
|
|
|
|
function states:finish()
|
|
print("[STATES] FINISH "..self.actiu);
|
|
self.actiu = table.remove(self.stack)
|
|
print("[STATES] ACTIU "..self.actiu);
|
|
if self.actiu==nil then
|
|
-- no queda res en la pila
|
|
self.actiu="states"
|
|
self.registre[self.actiu].ptr = 1
|
|
else
|
|
-- ultim element afegit a la pila
|
|
-- No se fa cap acció lo que implica que se restaura l'estat en el
|
|
-- que s'estava abans de l'ultima cridada
|
|
|
|
-- Per si es un estat afegit amb add
|
|
if self.registre[self.actiu].ptr ==0 then
|
|
self.registre[self.actiu].ptr = 1
|
|
end
|
|
end
|
|
local curr_states = self.registre[self.actiu]
|
|
local ptr = self.registre[self.actiu].ptr
|
|
game_update = self.registre[self.actiu].path[self.registre[self.actiu].ptr]
|
|
end
|
|
|
|
states:registrar("states",{states.safe})
|