You can create two types of addons for Korax Mod 5: custom maps (or map packs) and mods that introduce new NPCs, monsters, items, quests etc.
Table of Contents
Creating a custom map (pack)
Creating and editing maps
To create a new map or adapt an existing one for Korax Mod 5, use Doom Builder 2 (DB2). Korax Mod 5 is distributed with two configuration files for DB2: kmod5_Hexen.cfg and kmod5_ZDoom_Hexen.cfg; they are based on Hexen.cfg and ZDoom_Hexen.cfg from the standard DB2 distribution, adding entries for the new monsters and items (and removing definitions for some items that are not relevant).
NPCs
Three NPCs are included with the Korax Mod 5 distribution that you can use on any maps you want:
- Merchant: buys and sells a wide variety of artifacts
- Blacksmith: sells a wide variety of armor pieces; fully repairs your currently equipped armor; sells armorer’s hammers that allow you to (partially) repair your armor when not in town
- Innkeeper: offers food and lodging that reset your hunger and fatigue counters to zero; sells portable food that can be used to lower the hunger counter when not in town
Editing map scripts
You can use the DB2 script editor to create and modify ACS scripts. Korax Mod 5 is distributed with modified versions of the original Hexen maps, including a decoded version of the original map scripts, some of which have been heavily modified. All new and modified scripts have a “// kmod5” comment in the script head, making it easy to locate them. This guide also includes a number of examples in the Appendix.
When configuring a map at first entry, use ENTER instead of OPEN, so that you can check the player’s inventory for identifiers that allow you to detect things like the RPG complexity setting, the game difficulty wrapper used by conversations, etc.
If you prefer not to add NPCs with conversation options, you can give the player any weapons and spells (also armor and artifacts if you so wish) when he enters a certain map using a script with conditions (check the ENTER scripts in map35 of kmod5maps.wad for an example).
Packaging your map
It is recommended that you distribute your map(s) in a ZIP archive along with a few other files:
- yourmapname.wad
this is the .wad containing any maps you created - yourmapname.bat with the following content:
vavoom.exe -opengl -openal -debug -file yourmapname.wad - yourmapname.sh with the following content:
./vavoom.bin -file yourmapname.wad - yourmapname.txt
Put any information regarding your map(s) here
Creating a mod
First, create an empty ZIP archive and rename it to yourmodname.pk3 (where “yourmodname” stands for what you want to call your mod).
Adding maps
Consult the previous chapter on pointers about creating new maps or modifying existing ones. Once you have your map(s), just copy any number of .wad files into your PK3 archive.
Adding NPCs and conversations
To add your own NPCs, you can use DECORATE. First, create your definition files in your PK3 archive (e.g. mynpcs.txt), then copy the file “decorate.txt” from kmod/basepak.pk3 into your PK3 archive. Do not delete/modify any of the existing entries or the game might not work! Add your entries at the bottom of this file in the following format:
#include "mynpcs.txt"
To link a conversation to an NPC, add the following attribute to the DECORATE definition of the NPC:
ConversationID 12345
You can use any ID for the conversation, just make sure to include the same ID in the conversation lump’s definition:
conitem myfirstnpc 12345
To add a conversation, first create a text file in your PK3 archive (e.g. convo001.txt), then copy the file “coninfo.txt” from kmod/data.pk3 into your PK3 archive. You can delete any existing entries if you don’t use those conversations in your mod, or you can leave them and add your own entries at the bottom of the file in the following format:
import convo001
Adding items
You can add new items using DECORATE. First, create your definition files in your PK3 archive (e.g. myitems.txt), then copy the file “decorate.txt” from kmod/basepak.pk3 into the root of your PK3 archive. Do not delete or modify any of the existing entries or the game might not work! Add your entries at the bottom of this file in the following format:
#include "myitems.txt"
Packaging your mod
It is recommended that you distribute your mod in a ZIP archive along with a few other files:
- yourmodname.pk3
this is the .pk3 containing your mod - yourmodname.bat with the following content:
vavoom.exe -opengl -openal -debug -file yourmodname.pk3 - yourmodname.sh with the following content:
./vavoom.bin -file yourmodname.pk3 - yourmodname.txt
Put any information regarding your mod here
Appendix
Script examples
Script lump header
It is recommended to start the map script lump with the following lines:
#include "zcommon.acs" bool FirstTime = true;
The first line ensures that Doom Builder 2 accepts and compiles ACS (to ensure you don’t use a ZDOOM-only action special, check https://www.vavoomengine.com/wiki/action-specials/ first). The second line defines a variable that you can use in an OPEN or ENTER script to make sure you only run a specific action when the player enters the map for the first time.
Setting up a map for different RPG complexities
The following example checks the RPG complexity setting and modifies parts of the map according to the complexity level:
script 100 ENTER { if (FirstTime == true) { FirstTime = false; if (CheckInventory("ComplexityIdentifierOldschool")) { GiveInventory("Grant250Exp", 1); GiveInventory("Grant250Exp", 1);}
else if (CheckInventory("ComplexityIdentifierStandard")) { Door_Open(31,16,0); Door_Open(32,16,0); GiveInventory("Grant100Exp", 1);}
else if (CheckInventory("ComplexityIdentifierOff")) { GiveInventory("KeyCastle", 1); Door_Open(31,16,0); Door_Open(32,16,0); SetLineTexture(1, SIDE_FRONT, TEXTURE_MIDDLE, "-"); SetLineTexture(1, SIDE_BACK, TEXTURE_MIDDLE, "-"); SetLineBlocking(1, BLOCK_NOTHING);}
}
}
This example script does the following:
- Hypothetical scenario: A castle courtyard with a locked door on the north side and two doors on the east and west sides that only open from the inside. There is a portcullis on the south side that can be raised remotely. The map exit is behind the locked door that requires the Castle Key.
- On Old school RPG complexity, the player needs to explore a large part of the castle until he finds the rooms behind the side doors, where he throws a switch on each side to open the portcullis, then enters the boss monster’s lair, picks up the Castle Key, and finally opens the locked door. We also give the player 500 experience for entering this map (note that like in the example above, you need to pass the hidden experience giver items to the player one by one or only the first one will auto-activate).
- If RPG Complexity is set to Standard, it opens the two side doors right away, so the player only needs to enter the rooms behind those doors and throw the switches to open the portcullis, then fight the monster, pick up the key, and open the locked door on the north, saving him a lot of exploring. We also give the player 100 experience for entering this map.
- If RPG Complexity is Off, in addition to the side doors the portcullis also opens right away. In addition, the player automatically receives the Castle Key, so he can exit the map any time, and it’s his choice whether to go kill the boss monster first (probably worth a lot of experience), or explore any parts of the castle (artifacts, treasure and experience).
Outfitting the player
The following example gives the player his third weapon upon entering the map, as well as a light armor with poison resistance if he doesn’t already wear one. If the difficulty is set to easy or medium, it also restores the player’s health to full:
script 100 ENTER { if (FirstTime == true) { FirstTime = false; if (CheckInventory("ClassIdentifierFighter")) { GiveInventory("WeaponFighterAxeoftheDepths", 1);}
else if (CheckInventory("ClassIdentifierCleric")) { GiveInventory("WeaponClericSerpentStaff", 1);}
else if (CheckInventory("ClassIdentifierMage")) { GiveInventory("WeaponMageWandRed", 1);}
if (!CheckInventory("LightArmorPoison")) { GiveInventory("LightArmorPoison", 1);}
if (!CheckInventory("DifficultyIdentifierHard")) { GiveInventory("CrystalVial", 12);}
}
}
Spawn numbers
These spawn numbers can be used in scripts or as Argument 1 for items like breakable pots and suits of armor. Note that numbers 1 through 108 are unchanged versus the original Hexen spawn numbers (the select entries below 109 displayed in this table are replicated from the ZDOOM wiki for a quicker reference).
Spawn Number | Spawned Actor |
---|---|
1 | Centaur |
2 | Slaughtaur |
3 | Green Chaos Serpent |
4 | Ettin |
5 | Afrit |
6 | Stalker |
7 | Stalker Leader |
8 | Wraith |
9 | Wraith (buried) |
11 | Blue Mana |
12 | Green Mana |
13 | Boots of Stealth |
17 | Banishment Device |
18 | Chaos Device |
19 | Dark Bishop |
20 | Wendigo |
23 | Health Vial |
24 | Quartz Flask |
25 | Mystic Urn |
26 | Krater of Might |
72 | Flechette |
73 | Torch |
74 | Disc of Repulsion |
75 | Red Mana |
109 | Time Bomb |
111 | Potion of Charisma |
112 | Potion of Constitution |
113 | Potion of Dexterity |
114 | Potion of Intelligence |
115 | Potion of Strength |
116 | Potion of Wisdom |
120 | Silver Bar |
121 | Gold Bar |
129 | Afrit Leader |
130 | Afrit Martyr |
131 | Flame Centaur |
132 | Spectral Centaur |
133 | Centaur Ghost-King |
134 | Ettin Slinger |
135 | Ettin Grenadier |
136 | Ettin Commander |
137 | Ettin Warlord |
138 | Stone Ettin |
139 | Magma Serpent |
140 | Heresiarch |
141 | Exarch |
142 | Heresiarch for EZ mode |
143 | Ghost |
144 | Dark Cardinal |
145 | Dark Advisor |
146 | Chilling Mist |
147 | Toxic Mist |
148 | Lava Dweller |
149 | Specter |
150 | Magma Stalker |
171 | Brown Chaos Serpent |
172 | Icon of the Defender |
173 | Afrit Dominator |