So this may come down to me still learning ruby, but getting an error I’m not grasping.
I’m working on a set of items to simulate hacking in a futuristic game. The following script is in a plugin titled ate hacking so the path is plugins\atehacking\public\ate_lattice_script.rb
The code is below but when I run devstart the system throws an error when it gets to include LearnableAbility
NameError: uninitialized constant AresMUSH::AteLatticeScript::LearnableAbility
Is this because this plugin tries to load earlier than FS3Skill? Or something I’m not seeing.
class AteLatticeScript < Ohm::Model
reference :character, "AresMUSH::Character"
Yes, that looks like a plugin ordering issue. Included modules are one of the few things that are affected by the order in which plugins are loaded, because the include needs to be ‘available’ at load time. Most other things Ruby doesn’t look for until run time, after everything has been loaded.
For that reason, modules aren’t normally shared across plugins. LearnableAbility in particular is highly FS3-specific, so that’s not something I would expect to see used outside of the fs3skills plugin.
Cool I didn’t know if Ruby was one of those languages that pre-reads all the files before it starts processing or not. Sounds like the answer is not.
Yeah Ruby loads as it goes. For static apps you can just specify the files in the desired load order in require statements like these. That’s what the Ares engine does.
But the beauty of Ruby is that it can also load things dynamically, even as the app is running. That is what powers Ares’ plugin framework. For that, things are loaded as you specify
load <filename>. Because the plugin framework dynamically ‘discovers’ the plugins and the files within them, you can’t specify an order in the traditional Ruby way.