A traditional way to accomplish this goal in game development is to use a data-driven architecture for the game systems.
In essence, this means that code does not implement a particular type of weapon (a gun) with explicitly defined values for its range/damage/penetration rather it populates the generic concepts of a ranged weapon (range/damage/penetration...) from an external (to the code) data source. This external source can vary from parse-able (perhaps XML) files read in from disk, to binary files or database elements generated via tools internal or external to the game engine itself.
Defining something like an enemy, the AI system might be designed to support some number of generic behaviors (aggressive, defensive, support, coward) which are then tweaked by data driven elements.
My New Enemy, starts with the aggressive base AI behavior with data-driven values for:
-ignore players > my level + X
-pursue players up to X units beyond spawn point
-flee when health < X
-ranged ability priorities
-melee ability priorities (for when players get too close)
A more complicated data driven scheme might allow the definition of specific data points (events) where an AI state transitions (finite state machine) to another state (or even a chance to transition to one of N other states) allowing your users to define a complicated hierarchy of behaviors.
All of this is of course more work than just coding explicitly a behavior, but its a fun challenge to enable users to produce content without modification of the source.
There are bonus points to be achieved:
- if you can dynamically update data and have the changes reflected within the game engine without restarting the application
- if you create user friendly UIs over the data allowing users to use an interface to interact with the data rather than directly editing text (xml, or whatever) files
For a tutorial game targeted as a more technical crowd, most of the work is instead in designed classes/objects that expose clean interfaces for the users to extend which in turn may also be data-driven.