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