Я пытаюсь реализовать систему поворота на основе скорости для рогалика. Я создал класс Mob с использованием метаметодов, поэтому присвоение следующей переменной переменной вызовет появление моба на карте в определенных координатах сетки:
function Mob:spawn(x,y,m)
local mob = {}
setmetatable(mob, Mob)
mob.x = x
mob.y = y
mob.is_monster = m
return mob
end
Как только это будет сделано, я вызываю следующее:
function Mob:roll_call()
who_is_here[self.y][self.x] = self.is_monster
self.turn_counter = self.turn_counter * math.random(0.9, 1.1)
table.insert(allTurnCounters, self.turn_counter)
end
Это помещает self.turn_counter моба в таблицу. Между тем, в другом модуле я определил эти две функции, составляющие суть проблемы:
function turn.decrement_counters(dt) -- runs in Dungeon.update(dt) and subtracts from allTurnCounters
for i = 1,#allMobsSpawned do
if allTurnCounters[i] <= 0 then
allTurnCounters[i] = 0
turn_active = true
whose_turn = i
return
elseif allTurnCounters[i] > 0 then
allTurnCounters[i] = allTurnCounters[i] - (10 * dt)
end
end
end
function turn.whose_is_it() -- called when an entry in allTurnCounters goes zero
if whose_turn == 1 then -- spots 1 and 2 in the spawn list are only ever for players
player1.my_turn = true -- turns on player 1's keys
elseif whose_turn == 2 then
player2.my_turn = true -- turns on player 2's keys
elseif whose_turn >= 3 then -- above 3 we're in monster territory
end
end
Я решил, что первыми двумя экземплярами Mob, которые будут инициализированы, всегда будут игроки 1 и 2, присвоенные переменным player1 и player2 соответственно. И как бы то ни было, он отлично работает для передачи управления между игроками! Но для полноценной игры этого явно недостаточно. Мне тоже нужны монстры.
Таблица allTurnCounters получает новые записи по порядку от каждого появляющегося моба (класс, который включает как игроков, так и монстров, поэтому они могут делиться статистикой). Вот мой вопрос: Как я могу заставить Lua динамически извлекать имя таблицы, связанной с данным Turn_counter / value в этой таблице, и использовать его для получения приоритета очереди, даже если я не знаю, что был заранее создан процедурно или какое место он займет в порядке появления?
У меня есть 3 идеи, ни одну из которых я твердо не знаю, как реализовать. Один из методов - это что-то вроде отправки всей таблицы экземпляров в другую таблицу, а не только их turn_counters, а затем каким-то образом захватить пару значений (сама таблица и my_turn в таблице), напрямую обновляя значение my_turn.
Другой способ - каким-то образом использовать среду _G ... Я все еще изучаю главу 14 PiL, пытаясь адаптировать ее к своим целям, но value = _G [varname] кажется мощным фрагментом кода, который я мог бы использовать для этого. Не знаю как, но пока.
Моя последняя идея заключалась в том, чтобы, возможно, написать какой-то вид поиска-замены с распознаванием строк, который мог бы захватывать какое-то другое значение в таблице каждого моба, а затем помещать его в начало my_turn. Например, присвоение некоторого значения с известным шаблоном для каждого типа моба, которое я могу использовать в string.find, а затем в string.gsub, чтобы понравиться ... вручную, чтобы строка кода читалась так, как задумано. Хотя кажется неэлегантным.
Мне повезло, что я задал здесь свой предыдущий вопрос о Lua / Love2D, поэтому я решил, что давайте выбросим его, пока я думаю!