Cycle de vie — settings → data → runtime¶
Factorio charge les mods en trois passes séquentielles. RitnLib expose des outils différents à chaque passe. Savoir quelle passe est active te dit quel require est valide, quelles APIs Factorio sont disponibles, et quelles classes RitnLib tu peux instancier.
Vue d'ensemble¶
Factorio démarre
│
├─► SETTINGS STAGE settings.lua / settings-updates.lua / settings-final-fixes.lua
│ Disponible : settings (écriture)
│ RitnLib : RitnLibSetting (🚧 beta)
│
├─► DATA STAGE data.lua / data-updates.lua / data-final-fixes.lua
│ Disponible : data, settings (lecture)
│ RitnLib : RitnProto* + RitnIngredient (require explicite)
│ helpers lualib/entity, lualib/gui, lualib/LuaStyle
│
└─► RUNTIME STAGE control.lua + handlers script.on_event(...)
Disponible : game, storage, script, rendering, remote…
RitnLib : toutes les classes LuaClass/* injectées en _G automatiquement
+ RitnLibInventory, RitnLibGui, RitnLibInformatron
Settings stage¶
Le premier à s'exécuter. Les settings Factorio (mod-settings.dat) sont lus et écrits ici.
RitnLib propose RitnLibSetting comme builder fluent — voir sa page de référence pour l'état actuel (🚧 beta).
-- mon-mod/settings.lua
require("__RitnLib__.defines")
local RitnSetting = require(ritnlib.defines.class.ritnClass.setting)
RitnSetting("mon-mod-activer-feature")
:setSettingStartup()
:setDefaultValueBool(true)
:new()
Data stage¶
Tous les data.lua s'exécutent, construisant data.raw (le registre des prototypes). Les settings sont accessibles en lecture.
RitnLib injecte ritnlib.defines dès le premier require("__RitnLib__.defines") dans ton data.lua. Ensuite tu peux require les classes proto :
-- mon-mod/data.lua
require("__RitnLib__.defines")
local RitnProtoRecipe = require(ritnlib.defines.class.prototype.recipe)
RitnProtoRecipe("ma-recette")
:setIngredients({ { "iron-plate", 5 } })
:setResult("iron-gear-wheel", 2)
:new()
Limitation : game, storage, script n'existent pas au data stage. Ne les utilise jamais ici.
Runtime stage¶
C'est l'étape de jeu. RitnLib charge core/setup-classes.lua dans son control.lua, ce qui injecte toutes les classes runtime en _G. Tu les utilises sans require :
-- mon-mod/control.lua
script.on_event(defines.events.on_player_created, function(event)
local player = RitnLibPlayer(game.get_player(event.player_index))
player:print("Bienvenue !")
end)
RitnLib n'enregistre aucun handler propre. Il n'appelle pas script.on_event, n'accède pas à storage. Tous les handlers viennent de ton mod.
Erreurs courantes¶
| Erreur | Cause | Correction |
|---|---|---|
attempt to index a nil value (global 'game') au data stage |
game n'existe pas au data stage |
Retire l'appel, utilise data.raw à la place |
RitnLibPlayer est nil au data stage |
Classes LuaClass/* non chargées | Elles ne sont disponibles qu'au runtime stage |
data.raw est nil au runtime stage |
data n'existe qu'aux stages settings/data |
Lis les prototypes au bon stage |