Difference between revisions of "Mod Handler"

From VCMI Project Wiki
Jump to: navigation, search
(Objects identifiers)
Line 1: Line 1:
Mod handler is a class of modding engine which performs the following tasks:
 
*Reads all [[packages]] and [[conversions]]
 
*Manages mods, turning them on and off. List of active mods is stored in a file.
 
*Performs consistency checks: if all mod prerequisistes are met, and if mod files are still present.
 
*Synchronizes mod files in online game
 
 
 
=Objects identifiers=
 
=Objects identifiers=
 
Every game object ([[creature]], [[artifact]], [[hero]], [[spell]]) needs to have unique numeric identifier (ID). These IDs are assigned dynamically at game start. Original Shadow of Death objects are considered fixed.
 
Every game object ([[creature]], [[artifact]], [[hero]], [[spell]]) needs to have unique numeric identifier (ID). These IDs are assigned dynamically at game start. Original Shadow of Death objects are considered fixed.
Line 11: Line 5:
 
Additionally, each object has unique string identifier that allows user to quickly call it. This, however, may cause troubles when two different mods try to use same identifier.
 
Additionally, each object has unique string identifier that allows user to quickly call it. This, however, may cause troubles when two different mods try to use same identifier.
 
String IDS are suggested to be upper-case.
 
String IDS are suggested to be upper-case.
 +
 +
==Wrappers==
 +
 +
Wrappers are object pointers that allow direct access to certain object and simple modification based on it's build-in functions. Only safe functions related to scripted mechanics should be accessible with them.
  
 
==usage of identifiers==
 
==usage of identifiers==
Line 28: Line 26:
  
 
These calls are equal and interchangeable.
 
These calls are equal and interchangeable.
 +
* monID - numeric indentifier (integer)
 +
* TWO_HEADED_PHOENIX - string identifier
 +
* monster - object wrapper
  
 
<pre>monID = creatures("TWO_HEADED_PHOENIX")
 
<pre>monID = creatures("TWO_HEADED_PHOENIX")
Line 37: Line 38:
 
OR even
 
OR even
 
<pre>monID = OurMod.creatures("TWO_HEADED_PHOENIX")</pre>
 
<pre>monID = OurMod.creatures("TWO_HEADED_PHOENIX")</pre>
 +
OR
 +
<pre>monster = OurMod.getCReature(index_of_phoenix);
 +
monster.AddNewBonus(Bonus)</pre>
 +
OR
 +
<pre>monster = OurMod.getCreature("TWO_HEADED_PHOENIX")</pre>
 +
 +
Discussion: How to differ between numeric IDs, string IDs and wrappers in convenient way? WHich of them should be default for user? Which one is recommended?
  
 
==Adventure object identifiers==
 
==Adventure object identifiers==

Revision as of 08:33, 17 April 2012

Objects identifiers

Every game object (creature, artifact, hero, spell) needs to have unique numeric identifier (ID). These IDs are assigned dynamically at game start. Original Shadow of Death objects are considered fixed. This solution makes the script independent of mods currently installed and active.

Additionally, each object has unique string identifier that allows user to quickly call it. This, however, may cause troubles when two different mods try to use same identifier. String IDS are suggested to be upper-case.

Wrappers

Wrappers are object pointers that allow direct access to certain object and simple modification based on it's build-in functions. Only safe functions related to scripted mechanics should be accessible with them.

usage of identifiers

Reference to certain object via script has a form:

[PACKAGE_NAME].[OBJECT_TYPE](localID)

For example, for package Wake of Gods

WOG.creatures(1)

is Supreme Archangel ID and

WOG.artifacts(3)

is Monster's Power ID.

Converting identifiers

These calls are equal and interchangeable.

  • monID - numeric indentifier (integer)
  • TWO_HEADED_PHOENIX - string identifier
  • monster - object wrapper
monID = creatures("TWO_HEADED_PHOENIX")
giveCreatureBonus(monID, Bonus)

OR (overloading)

giveCreatureBonus("TWO_HEADED_PHOENIX",Bonus)

OR

monID = OurMod.creatures(index_of_phoenix);

OR even

monID = OurMod.creatures("TWO_HEADED_PHOENIX")

OR

monster = OurMod.getCReature(index_of_phoenix);
monster.AddNewBonus(Bonus)

OR

monster = OurMod.getCreature("TWO_HEADED_PHOENIX")

Discussion: How to differ between numeric IDs, string IDs and wrappers in convenient way? WHich of them should be default for user? Which one is recommended?

Adventure object identifiers

As adventure objects have double identifiers (ID and subID), they have to be threated differently. By default, Mod Handler assigns unique ID to each new adventure object class added and their subID is 0.

There is a script function which allows to add object as a next subID to the existing group with specific ID.