Heartwood Heroes

Heartwood Heroes

Not enough ratings
Modding documentation
By Kataiser and 3 collaborators
Documentation of the data formats and event scripting language. Includes lists of all the data in the base game that can be used or replaced through modding, and examples of enemy stats and event rewards.
2
   
Award
Favorite
Favorited
Unfavorite
Modding workflow
Creating new mods
Create a folder named "mods" in the game's root folder. The game will load local mods from subdirectories in this folder.

E.g. to start work on a new mod, create the folder mods/MyNewMod, and start adding mod files to it. See further documentation on what files and data the game looks for.

Most data is reloaded when a scenario is started from the main menu, but adding new scenarios, paperdolls or resources requires a restart of the game.


Uploading to Steam
Once the mod is ready to be shared, copy its folder to another folder called steam_uploads (also located in the game's root folder).
E.g. from mods/MyNewMod to steam_uploads/MyNewMod
This folder serves as a repository for uploading data to Steam and is not loaded by the game directly.

Optionally add PNG file called steamicon.png, which will be used as the icon for the mod on Steam Workshop.

Open the game and go to the Mods menu from the main menu. You will see a list of all the mods in steam_uploads. The first time you upload a mod, the mod will need to be initialized. Press the Init button, and a new file called modinfo.dat will be created in the mod's folder. Do not delete or edit this file, as it contains important data connecting this mod to Steam. It cannot be recreated.

Once the mod is initialized and ready, the Upload button will be available, as well as title and description info. You can edit these fields and they will be updated on Steam Workshop when you upload. You should also add a message to describe what's changed in this upload.

When you press the Upload button, the game will check that all files compile correctly and then start uploading to Steam. Hopefully everything goes well, and then a success message will be displayed. If anything went wrong, an error message will be displayed instead.

Then what?
Continue working on your mod in mods/ folder and when new changes are ready to be uploaded, copy the contents to its counterpart in steam_uploads, but make sure not to overwrite modinfo.dat.

To make a mod visible to others, you need to go into Steam Workshop and change its visibility. You can also edit descriptions and titles there, though note that those changes will not be downloaded back to steam_uploads and may be overwritten the next time you upload.
Scripts - Basic syntax
Comments:
Line comments
// this is a line comment, anything after the two slashes will be ignored --- this is also a line comment


Instructions (<instr>):
<instruction> <argument0> <argument1> ... <argumentN>
e.g.
setlocal alpha 555

exception:
if arguments are expressions (see below), they need to be separated by a comma
currently this only applies to one instruction: add_stat, which takes a string
expression and an int expression as arguments

e.g.
add_stat "vio", 5+rand(3)

newlines separate instructions
exception: if, while, else, and blocks {, }, do not require newlines for the instruction that follow
see section: Basic Statements

Values:
Values of script variables can currently have 3 types
Int
a signed 32-bit integer value
5
(Only the decimal form is currently supported)
String
a string value
"hello"
List
a list value of multiple other values
{5, "hello", {"another", "list"}}

Comparisons are only valid between types of the same kind
e.g.
5 = "5"
is always false

Operations always result in the same type as the first operand, and the second will be converted to this type of possible
e.g.
5 + "5"
will be 10
"5" + 5
will be "55"
5 - {6}
will result in an error, as a list cannot be converted to int
Scripts - Expressions
Expressions (<expr>):
Expressions can be used as arguments to instructions to perform calculations
Any number of operators and comparisons can be combined anywhere that an expression is expected
They can use any of the following as operands
variables: an unquoted string, e.g., alpha. Will load the value of a previously defined script variable or a built-in value (see later) The order of precedence for loading values is 1. local variables (defined with setlocal) 2. script variables (defined with setvar) 3. built-in variables 4. globals (defined with global) literals: integers, e.g. 5 strings, e.g. "abc" lists, e.g. {5,5,5,5}

Sub-expressions can be grouped with parentheses
e.g.
(alpha + beta) * gamma alpha + (beta * gamma)

Available operators
(a and b are operands, they can be either named variables or literals)

Prefix operators:
+a (does nothing) -a negation negates a value, e.g. turns 5 into -5. Only valid for ints !a boolean inversion turns a boolean true (1) into false (0) and vice versa Only valid for ints

Arithmetic operators:
a * b multiplication multiplies a with b, e.g. 5*2 => 10 Only valid for ints a / b division divides a with b, e.g. 10 / 2 => 5 Only valid for ints a + b addition Ints: adds a and b, e.g: 5+2 => 7 Strings: appends b to the end of a, e.g: "abc" + "d" => "abcd" Lists: appends b as the last element of the list, e.g: {1,2,3} + "hello" => {1,2,3,"hello"} a - b subtraction subtracts a and b, e.g. 10 - 2 => 7 Only valid for ints

Ordering operators
(operands must be of same type)
(not defined for lists)
a < b "less than" comparison Ints: 1 if a is less than b, otherwise 0, e.g. 10 < 5 => 0 Strings: calculates lexical string ordering, e.g: "a" < "b" => 1 a <= b "less than or equal to" comparison Ints: 1 if a is less than or equal b, otherwise 0, e.g. 10 <= 10 => 1 Strings: calculates lexical string ordering, e.g: "b" <= "a" => 0 a > b "greater than" comparison Ints: 1 if a is greather than b, otherwise 0, e.g: 10 > 5 => 1 Strings: calculates lexical string ordering, e.g: "a" > "b" => 0 a >= b "greater than or equal to" comparison Ints: 1 if a is greater than or equal to be, otherwise 0, e.g: 10 >= 10 => 1 Strings: calculates lexial string ordering: e.g: "b" >= "a" => 1

Comparison operators
(always false if operands are not of same type)
a = b equality comparison 1 if a and b are exactly equal, otherwise 0 Lists: checks that each element of the lists are equal a != n inequality comparison 1 if and b are not exactly equal, otherwise 0 Lists: checks if any of the elements of the lists are not equal

Logical operators
(interpret their operands as boolean values (true/1 or false/0))
(non-zero ints are considered true, zero is false)
(non-empty strings are considered false, otherwise all strings are true)
(non-empty lists are considiered false, other all lists are true)

a && b logical AND 1 if both a and b are true, otherwise 0 a || b logical OR 1 if either a or b are true, 0 if both are zero

Index operator
a[b] gets the value at index b of a
Ints: not valid
Strings: returns the character value at the specified index as an int
Lists: returns the value at the specified index
Scripts - Additional expressions
Additional expressions
Function calls:
function_name(<arglist>)
calls the built-in function function_name with the specified arguments (see below for <arglist> definition)
trying to call an unknown function will result in a compile error
e.g: rand(5), returns a random value between 0 and 4
see section "Built-in functions" for full list of available functions

Select:
[<expr>: <arglist>]
selects any of the specified arguments based on the value of the <expr> expression
e.g:
[rand(3): "a", "b", "c"]
will result in either "a", "b" or "c", based on the value of rand(3)
conditional operator (<bool expr> ? (a) : (b)) can be implemented as [<bool expr>: a, b]
if <expr> results in a value that is outside the range of the arglist (less than 0 or larger than the number of items)
a warning will be issued and the first item chosen

shorthands:
a|b|c
shorthand for [diff: a,b,c]

a\b\c
shorthand for [q_diff, a,b,c]

Argument list expression (<arglist>)
Argument lists are used in function calls, list literals, and certain other contexts
They are a list of expressions separated by commas; <arg0 expr>, <arg1 expr>, <arg3 expr>
e.g.
func(1,2,3)
1,2,3 is the <arglist> here
they are usually enclosed by parentheses, but in list by brackets [],
and in select expressions, the square bracket ends the list

List expansion operator (...<expr>)
This operator expands a list value into additional individual arguments in an <arglist>
it is only valid in places that accepts an <arglist>
e.g.
setlocal arr {1,2,3} func(...arr)
will be interpreted as func(1,2,3)
as arr is a list variable

using the operator on a non-indexable value is an error
using it on a string will result in a list of character values
e.g.
..."abc"
may result in {97,98,99}
Scripts - Statements
Statements (<stmt>)
A statement is one of the following
  • <instr> - an instruction
  • if - an if statement
  • while - a loop statement
  • end - a return statement
  • @/label - a label statement
  • jump - a jump statement
  • {<stmt>...} - a block statement; multiple statements enclosed in brackets

Basic Statements
If
if <bool expr> <stmt>
if statement
executes the statement <stmt> if <bool expr> is true/1, otherwise doesn't and skips to the statement after the if block
e.g.
if alpha = 5 dbg_log("hello")
only executes dbg_log if alpha is 5

for multiline ifs, use block statements
if alpha = 5 { dbg_log("hello") dbg_log("world") }

can be nested to to any depth
e.g.
if (alpha = 5) if (beta = 4) if (gamma = 3) dbg_log("yup")
only executes dbg_log if alpha is 5, and beta is 4, and gamma is 3
(this could of course also be written as if (alpha = 5 && beta = 4 && gamma = 3) )


If-else
if <bool expr> <"then" stmt> else <"else" stmt>
if-else statement
executes <then stmt> if <bool expr> is true/1, otherwise executes <else stmt>
if <then stmt> is executed, <else stmt> is skipped
e.g.
if alpha = 5 dbg_log("hello from 5") else dbg_log("hello from something else")

as with any statement, use block statements for multiline ifs or else blocks


Looping
while <bool expr> <stmt>
loop statement
executes <stmt> repeatedly as long as <bool expr> is true/1
use block statements for multiple instruction etc. etc.


End
end [<expr>]
return statement
ends execution of the current script
if the current script has been started with call, returns control to the calling script
can push value of the optional <expr> as a return value to the caller


Label
@<labelname>
or
label <labelname>
label statement
creates a new label named <labelname> that be jumped to, or be the target of other jumping instructions
only valid in the current script context
label names must be unique
unused labels will result in a compile error


Jump
jump <labelname>
jump statement
moves execution from the current position to the instruction following the label <labelname>
e.g.
@branch1 ... jump branch1
goes back and runs the code from branch1 again (beware of infinite loops when jumping upwards)

<labelname> can also be a select statement, by the <arglist> must consist of valid labels

caution: excessive jumping makes code hard to follow and reason about,
prefer using other methods of structuring code


Set variable
setvar <varname> <expr>
set script variable statement
sets a variable named <varname> to the value of <expr>
this value is available throughout the whole script
e.g.
setvar alpha rand(4) * (beta + gamma)

shorthands:
addvar <varname> <expr> => setvar <varname> (<varname> + (<expr>))
adds <expr> to the current value of <varname>

subvar <varname> <expr> => setvar <varname> (<varname> - (<expr>))
subtracts <expr> from the current value <varname>


Set local variable
setlocal <varname> <expr>
set local variable statement
sets a local variable named <varname> to the value of <expr>
this value is only available in current script context (event),
not in other events, not even if they have been goto'd or call'd
e.g.
setlocal alpha "hello " + "world"

shorthands
addlocal <varname> <expr>
same as addvar, but for local variables

sublocal
same as subvar, but for local variables


Debug log
dbg_log(<arglist>)
debug log statement
prints the arguments in <arglist> to the debug log
Scripts - Built-in functions
Built-in Functions
These can be used in expressions.

to_int(a)
returns a interpeted as an int
to_str(a)
returns a interpreted as a string
rand(a)
returns a random value between integers 0 and a-1 (always less than a)
rand(a,b)
returns a random value between integers a, and b-1 (always less than b)
rand_entry(a)
returns a randomly selected entry in the list or string a
var(a)
returns the value of the script variable named by the string a
length(a)
returns the length of the string or list a
subset(a, idx)
returns a subset of the string or list a, starting at idx
subset(a, idx, end)
returns a subset of the string or list a, starting at idx and ending at end

get_name(a)
returns a string value containing the name defined by the string a
monster_name(a)
returns a string value containing the name of the monster defined by the string a
monster_gfx(a)
returns a string value containing the resource name of the graphics of the monster defined by the string a
has(a)
return true or false depending on if the current play has a certain gear, magic, etc.
special values:
"gear" - checks if the player has an item of type weapon, armor, or relic
"weapon"/"magic"/"armor"/"relic"/"misc" - checks if the player has an item of this item type
ranked_player(a)
returns the index of the player of rank a (ie. 0 - 3, if 4 players)
can be used with e.g. port_pl to set the portrait of the player of a certain rank
port_pl ranked_player(2) + 1
sets the portrait to player of rank 2

e.g.
if has("toysword") { message ("You have a toy sword already.") end } else { message ("Here, have a toy sword.") +item toysword }
has(a) used to check for a specific item. The short hand being if_has toysword
Scripts - Built-in variables
Built-in script variables
These can be used in expressions.
stats
list of the names of all possible stats a player can have
diff
the difficulty of the current tile the player is on
q_diff
the difficulty of the player's current quest
pl_name
a string of the current player's name
playerrank
the current player's rank
numberofplayers
the number of players that currently playing
nplayers
same as numberofplayers
turns_left
the number of turns left of the game
total_turns
the total number of turns at the start of the game
vio
tou
mag
sne
soc
coo
value of the current player's current stat of this type
gold
value of current player's current amount of cash
lvl
current player's level
turns
number of turns taken in the game
game_time
measures the number of milliseconds elapsed since the game was started
monsterlist_area1
monsterlist_area2
monsterlist_area3
monsterlist_area4
lists of the ids of all the monsters that can be encountered in the areas with the corresponding difficulty
Scripts - Script instructions
Script Instructions
These instructions handle how scripts are parsed or define new events.

strict
legacy
changes the parsing mode of the parser
these are only valid outside of events and will be interpreted as the end of the event if present inside an event

global <varname> <expr>
defines a new global variable named <varname> with the value <expr>
only valid outside of events and will be interpreted as the end of an event
<expr> is executed during compile time and in the order defined; beware of using variables other than earlier globals in <expr>


id: <event id> [override]
defines a new event named <event id>
the id must be unique, if the event already exists in the base game you will get an error
if you really want to override an existing script, mark the event as override.
e. g.
id: event_that_exists override
if no such event actually exists to override, you will instead get an error for that.
Scripts - Event instructions
Event instructions
The following instructions are only valid inside an event


goto <event id> [(<arglist>)]
starts the event <event id> and changes context there
if the optional <arglist> is specified, these values will be available in the goto'd event as local variables
argument variables are named
argv: a list of all the arguments
arg_0 ... arg_N: named variables of the values in the order defined in <arglist>
argc: number of arguments passed to event

e,g,
goto test_event (1, 2, 3)
test_event will have local variables
argv = {1, 2, 3}
argc = 3
arg_0 = 1, arg_1 = 2, arg_2 = 3

<event id> can also be a select statement, but the results must be valid event ids and cannot be full expressions


call <event id> [(<arglist>)] [<retval>]
same goto, but when <event id> ends, control returns to the current event and continues with the next instruction
after call
if <retval> is specified, a local variable named <retval> is stored with the value of the return value
e.g.
call test_event rval dbg_log(rval) id: test_event end 5

dbg_log will display 5, as that was the value returned from test_event and stored in rval


rng <int = N>
<stmt 0>
...
<stmt N-1>
defines a random switch statement
selects a random value between 0 and N and executes one of the following N instruction based on that value
e.g.
rng 3 dbg_log("selected 0") dbg_log("selected 1") dbg_log("selected 2")
will execute one of the dbg_log statements
the others are skipped

as with other <stmt>, block statements are considered a single statement


rng <instr type>
NOTE: Preferably don't use this one
similar to rng, but reads all the immediately following instructions of type <instr type>
and uses them in the list of random instructions to execute
e.g.
rng jump jump label1 jump label2 jump label3 @label1

will use one of the random jump instructions between rng and label1


ch_if <bool expr>
ch_0 <line>
ch_1 <line>
ch_2 <line>
ch_str <string expr>
NOTE: Wonky legacy syntax here
choice statement, displays a choice box, with a number of options
any of these initiates parsing of a choice statement
ch_0, ch_1, ch_2
Pushes the line as a new choice option
ch_str
Takes a string expression and pushes the value as a new choice option
ch_if
Make the next ch_X statement conditional on the value of the <bool expr>
If it is false/0, that option can't be selected

If the value of ch_X is -, that option is ignored
NOTE: This is not necessary and only available for legacy reasons
If you only want two options, then you only need to write two ch_X instructions

text in choice boxes is filtered, see section String Filtering

choice
acts as break between ch_X and the results of the choices

reads as many <stmt> after choice as the number of ch_X lines (ie. ch_if does not count to choice count)
that is, with two choices, it will read two <stmt>s and execute the one chosen in the box

e.g.
ch_0 Choice 1 ch_str "Choice 2" choice dbg_log("chose 1") dbg_log("chose 2")

displays a choice box with two options: "Choice 1" and "Choice 2".
Depending on which is chosen, either of the two dbg_logs are executed
Statements not chosen are skipped
As with other <stmt> block statements can be used for multiline instruction results etc. etc.

Here is another example:
ch_0 Give me Violence ch_1 Give me Toughness ch_if soc >= 10 ch_2 Give me Both<br>(Social Networking 10) choice { +vio 3 } { +tou 3 } { +vio 3 +tou 3 }

In this case the player may only choose the third option if their Soc is 10 or greater.


endturn
removes all remaining moves of the current player and skips the "resolve tile" step of the turn
meaning no other events would be drawn


exhaust
removes all remaining moves of the current player


add_ee <event id> [<labelname>]
adds the event <event id> on the map the next time the game returns to the map
if the enchantment event can't be placed on the current tile the script jumps
to the optional label <labelname>, if specified


fg_ev <event id>
do this before "fight" to add an override after-winning-event to the fight.
this will ignore any after-winning-event set in the monster data.
this override will remain with the monster on the map.

(if you want an event when you lose a fight, you add it in the monsters data:
- lose_ev: <event id> )


start_fight <string expr>
start a fight with a monster with id of the value of <string expr>
e.g.
start_fight "monster_id"
starts a fight with the monster monster_id

shorthands
fight <monster id> => start_fight "<monster id>"

start_fight_msg <string expr>
works like start_fight except it shows a random encounter message in the beginning of combat

block_check
shortcut to check levels based on area [#blockerlvls]
and does a goto: to [#monster_lvlblockers] if level is not high enough




Scripts - Event instructions (quests)
q_nm <line>
sets the name of the quest to <line>
any event that has a q_nm command in its body can't be drawn if an
active quest has the name <line> or if a quest in its line has the name <line>

q_ev <event id>
sets the quest event to <event id>

q_rew <reward id>
sets the quest reward to <reward id>
also accepts select literals

q_mr <int expr>
value of <int expr> = minimum range (number of tiles) away the quest objective has to be
sets the minimum range for the quest objective

q_diff <int expr>
if you set <int expr> to anything over 0, the next add_quest or add_quest all will place the quest somewhere in the region of that difficulty
but if you set this to 0, the quest will be placed in your current region or below

q_area <area id>
<area id> = darklair / castle
places the next add_quest or add_quest_all in this specific area.
other areas than darklair and castle will show an error
<area id> = NULL disables this feature and places quests normally, only needed if you place more than one quest in one event

q_req <line>
explanation of requirement to do the quest event
displays <line> as text in the quest menu

add_quest [<mode>]
adds a new quest and spawns the event in an appropriate place.
relies on q_nm and q_ev and q_rew being set beforehand.
if this event was the "next event" of a quest, that quest is replaced with this new one.

end_quest <event id>
ends a quest.
relies on q_ev being set beforehand so the game knows which quest you want to end.

optional <mode> =
  • all, adds quest for all players
  • main, adds as main quest

shorthands
add_quest_all => add_quest all add_quest_main => add_quest main
Scripts - Event instructions (misc)
wait <expr>
wait for <expr> / 50 seconds before running the next instructions
e.g.
wait 25
waits for 0.5 seconds

wait_for_input [<varname>]
waits until the player presses a button
if <varname> is specified, the value of the pressed button is stored in the local variable <varname>


death_check
checks if the player is dead, and if so ends the script
Scripts - Event instructions (text)
box_clear
clears the message box

nm_clear
clears the name box

name <string expr>
displays the value of <string expr> in the name box

shorthands
nm <line> => name "<line>" nm_p => name pl_name display the current player name nm_n <string> => name get_name("<string>") displays a name string <string> nm_m <monster id> => name monster_name("<monster id>") displays name of monster <monster id>

message <arglist>
displays the values of <arglist> in the message box
text in message box is filtered, see section String Filtering

message_add <arglist>
combines the arglist into a string and adds that onto the string
that is currently displayed in the textbox
e.g.
message("Lorem...") message_add(" Ipsum.")
first prints "Lorem..." then adds " Ipsum." to the existing text

box <line>
displays the line <line> as text in the message box
text in message box is filtered, see section String Filtering

nag <line>
works like the box command if the user has the Hint Messages setting on
otherwise this command is skipped

add <line>
adds the line <line> as text to the message box
text in message box is filtered, see section String Filtering

<color=#><line></color>
sets the line <line> to the color indicated by the RGB hex value following color=#
use this to color parts of text in message boxes
e.g.
message("This color is <color=#f98fff>pink</color>.") message("This color is <color=#70ff3c>green</color>.") message("This color is <color=#9999FF>blue</color>.") message("This color is <color=#FF4444>red</color>.") message("This color is <color=#2baeff>light blue</color>.") message("This color is <color=#ccc>grey</color>.")
examples of colors used in the games text boxes

color short hands can also be used
e.g.
message("This color is <color=yellow>yellow</color>.") message("This color is <color=red>red</color>.")
Scripts - Event instructions (misc. scene, graphics)
reset_snok_counter
snok events MUST have this
reset the Snok counter which allows players to get a Snok encounter
must be called in every Snok event when the player gets the reward
if the group has Snok event group with 1 or more in event_groups.txt it's allowed to draw it. Castle And Dark Castle have no Snok available, so it cannot be drawn there.

next_act
makes the game move forward one act after the event.

run_scene <string expr>
runs an EventScene prefab from Resources/EventScenes/ named as value of <string expr>

shorthands
scene <scene name> => run_scene "<scene name>"


set_bkg <string expr>
sets the background image to the value of <string expr> (searches first in Assets/Resources/Backgrounds)

shorthands
bkg <image name> => set_bkg "<image name>"

bkg_restore
restores the background to the tile-appropriate one

set_port <string expr>
sets the portrait to the value of <string expr> (searches first in Assets/Resources/Portraits)
to clear, use img name "None", which is a small 100% transparent texture

shorthands
port <image name> => set_port "<image name>" port_m <monster id> => set_port monster_gfx("<monster id>")

port_pl <int expr>
displays the portrait of player of index <int expr>

shorthands
port_rank_pl <expr> => port_pl ranked_player(<expr>)
displays the portrait of the player of a certain rank
Scripts - Event instructions (audio, effects, music)
play_fx <string expr>
show a portrait fx (sweat drop, anger thingy, shake etc). will be automatically cleared when changing portrait
these will stack so you can mix several

shorthands
fxp <fx> => play_fx "<fx>"

fxp_clear
remove all current portrait fx


play_music <string expr>
plays the song <string expr>

shorthands
music <name> => play_music "<name>"

set_next_music <string expr>
set the song <string expr> to be played next

shorthands
music_next <name> => set_next_music "<name>"

set_map_music <string expr>
sets the song <string expr> to be played on the map

shorthands
map_music <name> => set_map_music "<name>"

set_next_map_music <string expr>
set the song <string expr> to be played next on the map

shorthands
map_music_next <name> => set_next_map_music "<name>"

music_interrupt
instantly pauses the overworld music and instantly stops the "event music".

music_fadeout
stops the event music with a fadeout

music_pause
pauses the event music
all event music (even battle) will be paused until the music_resume command is used

music_resume
resumes the paused event music


play_snd <string expr>
plays the sound effect <string expr>
this sound interrupts the previous event sound

shorthands
sfx <name> => play_snd "<name>"

play_snd_ducked <string expr>
(UNDER CONSTRUCTION)
plays a sound just like the play_snd command but
the music ducks this quickly and intensely

shorthands
dsfx <name> => play_snd_ducked "<name>"
Scripts - Event instructions (stats, items, jobs, rewards, etc.)
add_stat <string expr>, <int expr>
updates the stat <string expr> with the value of <int expr> (note comma separating the two expressions)
will display a message box notifying the player of the change
e.g.
add_stat "vio", 5+rand(3)
adds 5-7 to the stat VIO

shorthands
+vio <expr> => add_stat "vio", <expr> +tou <expr> => add_stat "tou", <expr> +mag <expr> => add_stat "mag", <expr> +sne <expr> => add_stat "sne", <expr> +soc <expr> => add_stat "soc", <expr> +coo <expr> => add_stat "coo", <expr> +rst <expr> => add_stat rand_entry(stats), <expr> updates a random stat

add_item <string expr>
gives the player a specific item

shorthands
+item <name> => add_item "<name>"

rem_item <string expr>
removes the item <string expr> if it exists in the players inventory

shorthands
-item: <name> => rem_item "<name>" NOTE: colon after -item differentiates it from -item below

rem_item_type <string expr>
removes an item of a specific type from the player's invetory, if it exists

shorthands
-item => rem_item_type "all" NOTE: lack of colon differentiates it from -item: -weapon => rem_item_type "weapon" -armor => rem_item_type "armor" -relic => rem_item_type "relic" -magic => rem_item_type "magic" -gear => rem_item_type "gear"


add_exp <int expr>
updates the player's EXP value with the value of <int expr> and displays a message notifying the player of the change

shorthands
+xp <expr> => add_exp <expr>

add_gold<int expr>
updates the player's cash value with the value of <int expr> and displays a message notifying the player of the change

shorthands
+gold <expr> => add_gold <expr>

add_hp <int expr>
updates the player's HP with the value of <int expr> and displays a message about this.
if HP drops below 0, the event ends immediately

shortands
+hp <expr> => add_hp <expr>

add_status <string expr>
adds the status <string expr> to the player

shorthands
+s <name> => add_status "<name>"

rem_status <string expr>
removes the status <string expr> from the player if he has it
no textbox is shown if the player doesn't have the status effect

shorthands
-s <name> => rem_status "<name>"

status_clear
removes all the status effects from the players
automatically shows a textbox for every status removed

set_job <string expr>
changes the players job to <string expr> bypassing all normal requirements

shorthands
+job <name> => set_job "<name>"

give_reward <string expr>
gives the player a random item from the category in <string expr>

shorthands
+reward <name> => give_reward "<name>" +reward: #jobarea gives equipment tagged for the specific job the player currently is. If a new job is added, equipment must be tagged, or this function will crash the event.
Scripts - Event attributes
Event Attributes
These look like instructions but are interpreted during compilation and added to an event as attributes

freq <rarity>
<rarity> is a number typically from 2-8, or it can be rare (1), common (5), or uncommon (3)
sets how frequently an event appears

group <groupname>
sets which group an event belongs to
all events except those special or starter attributes must have a group
valid groups are:
  • good (something good happens)
  • bad (something bad happens)
  • event (random chance events)
  • snok (only appears for the player in last place)
  • quest (events that start quests)

loc <location>
sets which location the event should appear in
an event can have multiple loc attributes and then it will appear in all those locations
valid loc are:
  • road (generally very low risk and rewards, no quests)
  • town (generally very low risk and rewards, no quests)
  • flowers (generally find jobs)
  • forest (generally find cash)
  • ruins (generally find equipment)
  • runestones (generally find spells)
  • mountain (generally high risk and high rewards)

diff <range>
sets difficulty of the event
<range> can a single integer, or two integers separated by -, e.g. 0 - 3 (spaces are not necessary; negative integers are not accepted)
the first region is 0, the final region is 3

special
marks this event as special, it will not appear as a random event

pvp
marks this event as a pvp event, it will not appear as a random event if the player has disabled pvp events

enchantment <line>
sets the event as special and marks it be used for enchant events
<line> will be interpreted as a string and used as the name of the enchant event

enchantment_diff <int>
sets the tier of the area this enchantment would spawn in
0 is the default and means the current space when spawned in an event or a random space
if it is randomly placed by proceeding to a new act

enchantment_unremovable
makes this enchant event unremovable by other enchants (such as golden road)
put this after the enchantment: <string> portion in the event that is created to make it unremovable

starter
a possible starter quest that happens before the game
automatically sets event as "special" as well

lastplace_only
event can only randomly spawn for someone in last place

notfirst_only
event can only randomly spawn for someone in not in first place

first_only
event can only randomly spawn for someone in first place

notlast_only
event can only randomly spawn for someone not in last place

not_in_quests <event id list>
prevents a random event from being chosen if a quest with a q_ev found in <event id list> is currently active
e.g.
not_in_quests {event_1, event_2}
event ids are checked to make sure events with those ids actually exist
Note that when regular random quests are created in the games random events that event is already getting prevented from being picked again for as long as the quest remains on the quest log
Scripts - String filtering
Strings in certain message boxes are "filtered", this means they can contain certain variables
These are enclosed in <variable> brackets
Any available script variable can be used and displayed in this way

There are also some special values:
<location>
displays the name of the current location
<quest location>
displays the name of the current quest location, if any, otherwise there will be warning
<total turns>
total number of turns of the game, same as total_turns
<turns left>
number of turns left, same as turns_left
<player count>
number of players in game
<player 1>
name of player 1
<player 2>
name of player 2
<player 3>
name of player 3
<player 4>
name of player 4
<player rank 1>
name of first ranked player
<player rank 2>
name of second ranked player
<player rank 3>
name of third ranked player
<player rank 4>
name of fourth ranked player

E.g.
box We are currently in <location>...
May display "We are currently in Freaky Forest..." in the message box.
Scripts - About events and event groups
A player who has been in last place for 3 consecutive turns (or 4 turns when there are only two players), and is a minimum of 2 levels behind the leading player, automatically gets a Snok event if one is available at that location.

All events have a cooldown of 8 turns before any player can draw them again. Quests have a cooldown of 25 turns.

The castle and darklair locations have a special case; they only contain the events defaultcastle and defaultdarklair respectively.

When a player gets a random event, the event group is chosen first, and then a specific event is chosen within that group.

The Clairvoyant skill has a chance of rerolling the event group once if the Bad group was drawn. The Lucky status forces the Good or Quest group to be drawn, and the Unlucky status forces the Bad group to be drawn.

This is the frequency of each group of random events when exploring/loitering on each location type per region:

Location
Region
Event
Good
Bad
Quest
Waste
Battle
Snok
Road
1
24
34
3
2
37
1
Road
2-4
20
22
15
10
33
1
Town
1
45
45
5
5
1
Town
2-4
35
35
20
10
1
Flowers
1
25
25
5
35
10
1
Flowers
2-4
25
25
20
20
10
1
Forest
1
15
15
5
32
33
1
Forest
2-4
15
15
13
24
33
1
Ruins
1
15
20
5
38
22
1
Ruins
2-4
15
20
10
33
22
1
Runestones
1
15
20
5
38
22
1
Runestones
2-4
15
20
10
33
22
1
Mountain
1-4
15
15
13
24
33
1
Data formats - Common
Data specified in square [...] brackets are optional, and it is not an error to leave them out. Some default value will be used instead.

Values specified as <...> means those values should be defined by you. The brackets should not be included in the actual data file.

E.g., if a specification says <resource id>, you could write my_very_cool_resource_id in the data file.
Data formats - Resources
Mod file: resources.txt
(define all resources in this file)
File comments allowed

Resources are loaded when needed, that is, if a resource is defined but never used, it will not get loaded.

All paths should be considered local to the root folder of the mod.

Resource ids can in some cases override "hardcoded" resources, ie. those that come built-in with the game. This can be done for e.g. any texture referenced by scripts, or enemy sprites. To always use a certain built-in resource, reference it as res:/<resource id>

Format:
[Textures] tex <texture id> { path: <local path of texture file> }
Note: Valid file formats are png and jpg

[Sprites] sprite <sprite id> { path: <local path of texture file for sprite> [pixels_per_unit: <scale value; default: 128>] [pivot_x: <horizontal center offset in pixels>] [pivot_y: <vertical center offset in pixels>] }
Notes: Same file formats as for textures

[Music] music <music id> { path: <local path of texture file for sprite> [loop_left: <time in ms; default: 0>] [loop_right: <time in ms; default: 0>] [next: <music id>] }
Notes:
The song will loop if loop_left is a smaller value than loop_right.
The 'next:' variable only matters if this song is used as the overworld song.
When a new act begins the game checks the 'next:' variable for what song to switch to.

Example:
tex TestMod_apamouth { path: textures/apa_mouth.png } sprite TestMod_Sprite1 { path: textures/sprite1.png pixels_per_unit: 75 pivot_y: -70 }
Data formats - Paperdoll
Mod file: paperdoll.txt
(define all new doll parts in this file)
File comments allowed

Adds new selectable mouths, hairstyles, etc., for the player sprites

Format:
<doll part type> <part id> { gfx: <texture id> [tag: <tag id>] }

Available <doll part type> that can be selected:
  • hair_back - piece of hair rendered behind head
  • head - the sprite's basic head shape
  • mouth - the mouth
  • eyes - eyes
  • hair_front - piece of hair rendered in front of the head
Notes:
Tags are an optional feature that determine which parts that are incompatible with one another.
Currently only used for hairs. If a hair_front part has a tag, a hair_back needs to have the same tag in order to be used with that hair_front. Otherwise it will be skipped when trying to select it in the menu.

Example:
head apafrog { gfx: TestMod_apahead } eyes apaeyes { gfx: TestMod_apaeyes } mouth apamouth { gfx: TestMod_apamouth }
Data formats - Scenario
Mod file: scenarios.txt
(define all new scenarios in this file)
File comments allowed

Defines new scenarios that can be selected in the game menu.

Format:
{ name: "<name of the scenario to be displayed in the menu>" [desc: "<longer description of the scenario>"] start_event: <script event id that should start the scenario> [boss_exp_multiplier: <amount of EXP awarded per 100 HP damage dealt to the final boss, default: 333>] [final_reward_exp: <EXP reward for random bonuses at end of game, default: 750>] [start_gold: <how much cash to start the game with>] [turn_counts: <list of four integers that defines how many turns there should be for 1-player games, 2-player games etc, default: 50 48 42 38>] timeup_event: <script event id that should play when the number of turns are up> [music: <id of basic scenario music>] [enchant_events: <list of enchantment script event ids>] [act_settings: { {<list of settings for act 1>} {<list of settings for act 2>} {<list of settings for act 3>} {<list of settings for act 4>} }] [map_settings: { area_tiles: <list of 4 integers that define the number of tiles per region, must add up to 64, default: 12 15 17 20>] max_deadend: <integer for max length of dead ends, default: 2> max_path: <integer for max distance between two neighbouring tiles, default: 7> num_locations: <list of 4 integers for number of locations per region, must be at least 2 1 1 2, default: 4 5 6 7> num_locations_add: <list of 4 integers for the maximum number of locations to add randomly to each region, default: 1 1 1 1> }] [waste_events: <0 to disable, 1 to enable, default:1>] [snok_events: <0 to disable, 1 to enable, default:1>] [pvp_events: <0 to disable, 1 to enable, default:1>] [final_rewards: <0 to disable, 1 to enable, default:1>] [gold_rate: <integer as percentage, default:100>] [exp_rate: <integer as percentage, default:100>] }

Possible act settings:
  • spawn_bags - spawn chests with cash and EXP during the act
  • monster_surge - enable monster surge event
  • extra_move - enable +1 extra moves per turn
  • teleporter - enable a randomly placed teleporter
  • music - enable music
  • enchant - enable enchantment events

Example:
{ name: "TestMod Scenario" desc: "A scenario from the mod TestMod.\n\nYep." start_event: testmod_event_start start_gold: 500 turn_counts: 50 48 42 38 timeup_event: testmod_timeup enchant_events: expertised_enchantment speedy_enchantment act_settings: { {} {spawn_bags extra_move music} {spawn_bags teleporter music enchant} {spawn_bags monster_surge extra_move music} } }
Data formats - Constants
Mod file: constants.txt
(define all constants in this file)
File comments allowed

Constants are single expression shorthands that can be used as values in scripts. Expand constants in scripts with #

Format:
<constant id> <constant value>

Example:
my_cool_constant 4|5|6|7 // Defines a new constant "my_cool_constant" with the value 4|5|6|7

Using the constant in a script:
+exp #my_cool_constant // Will be expanded to +exp 4|5|6|7
Data formats - Names
Mod file: names.txt
(define all names in this file)
File comments allowed

Defines named strings that can be used in scripts, by e.g. the functions get_name() or event nm_n

Format:
id: <id of new name string> name: <value of new name string>

Example:
// This defines a new name "apafrog" with the value "Apathetic Frog" id: apafrog name: Apathetic Frog

Using a name in a script:
nm_n apafrog // Displays the value of the apafrog name in the name box name get_name("apafrog") // Does the same thing
Data formats - Jobs
Mod file: classes.txt
(define all classes in this file)
File comments allowed

Defines new jobs that players can use.

Each new job added also requires four custom reward tables. See the Data formats - Rewards section for more information.

Format:
id: <id of new class; marks the start of new class definition> name: <string line for the in-game name of the class displayed in menus etc.> [gfx: <resource id of the player sprite gfx for the job, e.g. "hat", default: job_<id> >] [reorder_gfx: <set to 1 to use special render ordering of the gfx>] [town: <list of ints for towns in which the class should be found>] [req_vio: <minimum VIO needed for the player to buy this class>] [req_tou: <minimum TOU needed>] [req_mag: <minimum MAG needed>] [req_sne: <minimum SNE needed>] [req_soc: <minimum SOC needed>] [req_coo: <minimum COO needed>] [cost: <how much money it costs to use the class>] [skill: <adds a skill the player can use when having the class; not a list, add multiple skills by having multiple skill: statements>]

Example:
id: delinquent name: Delinquent town: 1 // Available in level 1 town // No gfx: define, uses gfx job_delinquent reorder_gfx: 1 // Render gfx behind hair_front req_coo: 3 cost: 120 // The class gives both "knifecrimes" and "mug" skills skill: knifecrimes skill: mug
Data formats - Items
Mod files: items/*.txt
All .txt files in the items folder will be parsed as item definitions
File comments allowed

Defines new items; weapons, armors, accessories etc., that can be held and used by players.

Format:
id: <id of new item; marks the start of a new item definition> name: <line string of display name of item> type: <type of item> [desc: <line string of description of item>] [gfx: <resource id of gfx the item puts on the player sprite; defaults depend on item type, <type>_<id> >] [spell: <id of spell the item uses>] [wanted_by: <list of class ids that the item is wanted by, which adds it to some rewards tables, followed by a number signifying which region it is wanted in>] [+dmg: <extra damage the player does while equipping the item>] [+acc: <extra accuracy>] [+def: <extra defense>] [+mdef: <extra magic defense>] [+vio: <extra VIO>] [+tou: <extra TOU>] [+mag: <extra MAG>] [+sne: <extra SNE>] [+soc: <extra SOC>] [+coo: <extra COO>] [cost: <cost to buy item>] [sell: <selling price of item, default: cost / 2>] [skill: <add a skill that is gained while equipping item>] [subtype: <subtype of item>]

Item types:
  • weapon - Weapon
  • armor - Armor
  • relic - Accessory
  • magic - Spell
  • misc - Misc
Weapon subtypes:
  • stick
  • knife
  • snake

Example:
id: noif name: Noif desc: Now you're mister noif guy! type: weapon subtype: knife wanted_by: delinquent, knifewhisperer, mastercriminal 3 cost: 2200 +dmg: 100 +acc: 0
Data formats - Monsters
Mod file: monsters/*.txt
(all .txt files in the monsters folder will be parsed as monster definitions)
File comments allowed

Defines new monsters that can be encountered in the world or battled via scripts.
For "percentage" values, an optional % can be added after the value, which is ignored during parsing.
For "range" values, either a single integer, or two integers separated by a - can be used, e.g. a range of 2 - 5 defines a range between 2 and 5 and a range of 4 defines a range between 4 and 4.

Format:
id: <id of new monster; marks start of new monster definition> name: <line string of monster name, displayed in-game during battles etc.> gfx: <resource id of gfx sprite for the monster> [sneak: <percentage chance of successfully sneaking past monster>] [escape: <chance of successfully fleeing from an encounter>] hp: <how much HP the monster has> [hitability: <anti-dodging percentage, or rather how easy it is to hit the monster>] [def: <how much defense the monster has>] [mdef: <magical defense>] [fire: <elemental resistance to fire; -1 = weak, 0 = no change, 1 = strong>] [ice: <elemental resistant to ice>] [cute: <elemental resistant to cute>] [nasty: <elemental resistant to nasty>] [hitchance: <percentage of enemy attacks that hit player>] [critchance: <percentage of hits that will be critical hits>] [boss <flag monster as a boss, which gives it a special background and music>] [skip_ending <flag to skip the normal battle ending that plays a fanfare and gives you rewards>] [dmg: <range of damage for monster attacks>] [gold: <cash reward for defeating monster>] [exp: <EXP reward for defeating monster>] [win_ev: <script event id for event to run when winning against monster>] [lose_ev: <script event id for event to run when losing fight>] [skill: <add a skill the monster has>] [encounter: <list of regions the monster can be encountered in>] [spell: <add a new spell the monster can use, max 4> >chance: <percentage chance to use the spell> >dmg: <range of much damage the spell does> >recharge: <how many battle rounds before the spell can be used again> >status: <percentage chance of inflicting status> <sets the range of the buffing amount for the status effect, only applies to Pumped, Bricked and Insulated. Enter range 0 - 0 on other statuses> ]

Example:
id: kaisernova //unique id name: Kaiser Nova gfx: kaisernova - encounter: 4 //this adds it to the random encounter list in region 4 sneak: 5 % //chance to sneak past (these "%" do nothing, just for readability) escape: 10 % //chance to escape battle hp: 390 //max HP hitability: 45 % //anti-dodging, or rather how easy it is to hit the monster def: 40 //defense mdef: 20 //magic defense fire: 0 //elemental def. -1 weak, 0 normal, 1 strong (and status immune) ice: 0 //elemental def. -1 weak, 0 normal, 1 strong (and status immune) cute: 0 //elemental def. -1 weak, 0 normal, 1 strong (and status immune) nasty: -1 //elemental def. -1 weak, 0 normal, 1 strong (and status immune) hitchance: 110 % //chance to land attack critchance: 10 % //chance to do critical damage dmg: 45 - 60 //range of damage - spell: heartbreak //has this spell, max 4 spells >chance: 35 % //chance to cast the spell >dmg: 45 - 65 //override base dmg/heal with this >status: 60 % 0 - 0 // chance to status hit, effect of status >recharge: 100 //cannot use spell again for this many rounds - spell: flirt //has this spell >chance: 35 % //chance to cast the spell, max 4 spells >dmg: 65 - 80 //override base dmg/heal with this >status: 80 % 0 - 0 // chance to status hit, effect of status >recharge: 100 //cannot use spell again for this many rounds - exp: 1390 //exp reward gold: 1250 //cash reward
Data formats - Events
Mod files: events/*.txt
(all .txt files in the events folder will be parsed as script files defining events)

These files define new events that can be run in the game as scripts.
See Scripting documentation for reference.
Data formats - Rewards
Mod file: rewards.txt
(all new rewards should be defined in this file)
File comments allowed

Defines new reward categories that can be used in scripts as rewards.
A reward category is basically a list of one or more items; when given as reward, a random item from the list will be chosen.

If you have added a custom job, it will need four special reward tables. If your job is named testjob these reward tables should be named t1_testjob, t2_testjob, t3_testjob and t4_testjob. These tables must each have at least one item, and represent what your job would like to get as a reward in each region. They are only used in event scripting by the command +reward: #jobarea

Format:
<reward id, defines start of new category>: <item id> [<item id>] [<item id, etc.>]

Example:
// Defines the new reward category "t1_weapon" t1_weapon: bluntsock twig butterknife fakesnake newspaper foamstick knice biggnukkel toysword

Using a reward table in script:
+reward t1_weapon // Gives the player a random reward from the t1_weapon category give_reward "t1_weapon" // Same as above
Resource lists - Portraits
These are all the portraits in the base game. You can refer to them when scripting your events etc. Please see the scripting documentation for more information.

Click the pictures to zoom in.

Resource lists - Backgrounds
These are the backgrounds intended to be used in event scripting. Click the picture to zoom in.


There are some special backgrounds in the game, but they have the wrong aspect ratio and thus will look weird when used in events. If you want to use them anyway, here they are:
Resource lists - Effects
All the effects in the base game.

Effects used with the fxp: command. They also play a sound effect.
Note: confetti and confetti2 are the same visually, but use different sound effects.
Note: evilexplosion and evilpuff are roughly the same visually, but use different sound effects.
Note: exclamation is to be used at the start of events that lead to quests.

Click the picture to zoom in.

Resource lists - MoveFX
These effects are used by combat skills, followers, spell casting, etc. and are only intended for such use, NOT event scripting.

AccessoryDebuff
BattleBadHit
BattleCrit
BattleHit
BattleMiss
BattleResistedCute
BattleResistedFire
BattleResistedIce
BattleResistedNasty
BattleShake
FollowerAnnebiguous
FollowerAvengingspirit
FollowerBombus
FollowerChampion
FollowerClog
FollowerFurnacecannon
FollowerPompom
FollowerSchoolclass
FollowerSleepwalker
FollowerSleuth
MapCollectTreasure
MapSpellBootGoop
MapSpellBootGoopInflict
MapSpellExperienceMagnet
MapSpellGeneric
MapSpellGenericNegative
MapSpellGoldenRoad
MapSpellGoldenRoadReceive
MapSpellGoldenRoadStepOn
MapSpellHealing
MapSpellHomingMagpie
MapSpellMonsterWhistle
MapSpellRinsingBath
MonsterSkillBossTransform
SkillAnalyze
SkillAnalyzeComplete
SkillBandAid
SkillBearHug
SkillCrush
SkillDoubleEdge
SkillDrainDamage
SkillDrainHeal
SkillGratingVoice
SkillMug
SkillPennyPinch
SkillRiskyMoves
SkillUnluckyStart
SpellAntiMagicSurge
SpellAntiMagicSurgeDamage
SpellAstralFlex
SpellAstralFlexInflict
SpellBattleTraining
SpellBattleTrainingDamage
SpellBrickPile
SpellBrickPileDamage
SpellColdFront
SpellDarknessFalls
SpellDistractions
SpellDistractionsInflict
SpellEncouragingWords
SpellEncouragingWordsDamage
SpellEvilPhenomena
SpellFlashFire
SpellFlirt
SpellFlirtInflict
SpellFullHeal
SpellGoldRush
SpellGoldRushDamage
SpellHardenSteel
SpellHardenSteelDamage
SpellHealing
SpellHeartBreak
SpellHeartBreakInflict
SpellHugToDeath
SpellHugToDeathInflict
SpellIceAge
SpellIceBlizzard
SpellImminentBeatdown
SpellImminentBeatdownInflict
SpellIncinerateStatus
SpellIncinerateStatusInflict
SpellJinx
SpellKnockout
SpellKnockoutInflict
SpellLightlyBroiled
SpellLuckyBreak
SpellMusclePump
SpellMusclePumpDamage
SpellPeekABoo
SpellPillowCannon
SpellPollution
SpellPowerWalk
SpellRinsingBath
SpellRinsingBathDamage
SpellRuseOutrage
SpellRudeOutrageInflict
SpellSlipperyCold
SpellSlipperyColdInflict
SpellSmokeBomb
SpellSnakeHeads
SpellSolarOven
SpellSparkles
SpellStayCool
SpellStayCoolInflict
SpellTacticalRainbow
SpellWeakenToCute
SpellWeakenToCuteInflict
SpellWeakenToFire
SpellWeakenToFireInflict
SpellWeakenToIce
SpellWeakenToIceInflict
SpellWeakenToNasty
SpellWeakenToNastyInflict
Resource lists - Names
All the name definitions in the base game.

id
Name
???
???
annebiguous
Anne Biguous
apafrog
Apathetic Frog
avengingspirit
Avenging Spirit
bagfairy
Shady Fairy
battlemaster
Battle Master
bemp
Bemp
beehive
Swarm
bombus
Bombus
birdie
Ma Birdie
birdknight
Quijote
bugonslug
Bug on Slug
businessbusinessman
Business Businessman
bigguy
Kallahanden
gamblecat
Don Feline
champion
Champion
dance
Dansa Somendore
ducklord
Ducklord
fancyflower
Greg Arious
fairyofbigdamage
Fairy of Big Damage
fastbird
Crazy Fast Bird
leaflets
Leaflets
flopflop
Beet Boy
goldfairy
Gold Fairy
hypesnake
Hype Snake!
kaisernova
Kaiser Nova
kid
Kid
kingcrown
King Crown
lingeringlivid
Lingering Livid
machinebird
Archie Ology
mapman
Mapmaker
mermaid
Mermayd
mechanic
Mech Anne
mole
The Mole
monument1
Banneret
monument2
Dynast
muscleshop
Daisy Hunkman
oldmaster
Herr Mitt
pom_pous
Pom Pous
queencrown
Queen Crown
roadster
Roadster
salesbird
Gold Beak
snok
Snok
squaredude
Square Dude
superseer
Super Seer
toughtype
Di Law
toxin
Toxin
wizardbird
Apprentice
enchantmentstore
Illustrio
jums
Jums
crowd
Crowd
mysteriousavenger
_xXx_Mysterious = Avenger_xXx_
unclehiss
"Uncle Hiss"
cousinptera
"Cousin Ptera"
icelady
Iskall
paranoidfish
Fishman
shapestealer
Shape Stealer
frostwrack
Frostwrack
furnacelord
Furnacelord
formless
Formless
crowncourtfairy
Jeeves
sellpyramid
Sell Pyramid
sleepwalker
Sleep Walker
sleuth
Klein Destine
bcman
Business Celery Man
chiller
Chiller
toucan
Toucool
sleepyfairy
Sleepy Fairy
Resource lists - Sounds
All the sounds in the base game. Used with the sfx: command.

BattleBadHit
BattleCrit
BattleEnemyDefeated
BattleHit
BattleMiss
BattleResistedCute
BattleResistedFire
BattleResistedIce
BattleResistedNasty
BattleTransition
EventApplause
EventBad
EventBadStatus
EventBigDoorSlam
EventBrickBreaking
EventCards
EventCheer
EventCheer2
EventChoiceMade
EventCrowdBoo
EventCrowdCheer
EventDoor
EventDrumroll
EventExplosionMagic
EventFall
EventFallTumble
EventFootsteps
EventFormlessExplosion
EventGainExp
EventGainGold
EventGainHP
EventGainItem
EventGainStat
EventGood
EventGoodStatus
EventHammer
EventHauntingEffect
EventIceExplosion
EventLaugh
EventLightsOut
EventLoseExp
EventLoseGold
EventLoseHP
EventLoseItem
EventLoseStat
EventMystery
EventNextAct
EventOhNo
EventOminous
EventOpenChest
EventPaper
EventPop
EventPotentialQuest
EventPressure
EventQuestComplete
EventScenarioWon
EventSmash
EventSmashEcho
EventSplashBig
EventSplashSmall
EventSpooky
EventStatusClear
EventStingerDramatic
EventStingerHappy
EventSurprise
EventSweat
EventSwosh
EventTakeDamage
EventTeleport
EventTimeUp
EventWhistleLong
EventWhistleShort
FollowerAnnebiguous
FollowerAvengingspirit
FollowerBombus
FollowerChampion
FollowerClog
FollowerFurnacecannon
FollowerPompom
FollowerSchoolclass
FollowerSleepwalker
MapChoicePopup
MapCollectTreasure
MapEnterTown
MapJoinBattle
MapMove
MapNewDay
MapOverview
MapPlaceBag
MapPlaceEnchantmentEvent
MapPlaceMonster
MapPlaceQuest
MapPlaceTeleporter
MapRespawn
MapSneakFailed
MapSneakSuccessful
MapSpellGeneric
MapStay
MapTileFlip
MapUndo
MapUseTeleporter
MenuBuy
MenuEquip
MenuError
MenuHospitalHeal
MenuNo
MenuOpen
MenuSell
MenuStartGame
MenuTab
MenuTick
MenuYes
MonsterSkillBosstransform
PlayerJobChange
PlayerLevelUp
SkillAnalyze
SkillAnalyzeComplete
SkillBandAid
SkillBearHug
SkillCrush
SkillDoubleEdge
SkillDrainDamage
SkillDrainHeal
SkillGratingVoice
SkillMug
SkillPennyPinch
SkillRiskyMoves
SpellAntiMagicSurge
SpellAstralFlex
SpellAstralFlexInflict
SpellBattleTraining
SpellBootGoop
SpellBootGoopInflict
SpellBrickPile
SpellColdFront
SpellDarknessFalls
SpellDistractions
SpellDistractionsInflict
SpellEncouragingWords
SpellEvilPhenomena
SpellExperienceMagnet
SpellFlashFire
SpellFlirt
SpellFlirtInflict
SpellFullHeal
SpellGenericDamage
SpellGoldenRoad
SpellGoldenRoadStepOn
SpellGoldRush
SpellHardenSteel
SpellHealing
SpellHeartbreak
SpellHeartbreakInflict
SpellHomingMagpie
SpellHugToDeath
SpellHugToDeathInflict
SpellIceAge
SpellIceBlizzard
SpellImminentBeatdown
SpellImminentBeatdownInflict
SpellIncinerateStatus
SpellIncinerateStatusInflict
SpellJinx
SpellJinxInflict
SpellKnockout
SpellKnockoutInflict
SpellLightlyBroiled
SpellLuckyBreak
SpellMonsterWhistle
SpellMusclePump
SpellPeekABoo
SpellPillowCannon
SpellPollution
SpellPowerWalk
SpellRinsingBath
SpellRudeOutrage
SpellRudeOutrageInflict
SpellSlipperyCold
SpellSlipperyColdInflict
SpellSmokeBomb
SpellSnakeHeads
SpellSolarOven
SpellSparkles
SpellStayCool
SpellStayCoolInflict
SpellTacticalRainbow
SpellWeakenToCute
SpellWeakenToCuteInflict
SpellWeakenToFire
SpellWeakenToFireInflict
SpellWeakenToIce
SpellWeakenToIceInflict
SpellWeakenToNasty
SpellWeakenToNastyInflict


to listen to the sound effects you can subsciribe to the mod Sound Effects Test in the Workshop
Resource lists - Music
All the music in the base game. Used with the music: command among others.

BattleCheeseA
BattleCheeseB
Castle
Celebration
Clock
Credits
Eerie
Employment
FunnyCharacter
GameShow
Hospital
OverworldEarly
OverworldMid
OverworldLate
OverworldEnd
PlotThickens
Pompous
SereneHappy
SereneRevelation
Setup
Shop
ThemeUndoneShort
TimeUp
Title


links for listening to most tracks
Resource lists - Jobs
All the jobs in the base game.

id
Town
Requires
Cost
Skills
unemployed
-
-
-
-
seadog
1
Tou 3
120
crush, roughandtumble
healingstudent
1
Mag 3
120
charitable, drain
salaryman
1
Soc 3
80
dailydrudge
delinquent
1
Coo 3
120
knifecrimes, mug
librarian
1
Sne 3
80
librarycard
brute
2-3
Vio 8
600
stickswinger, riskymoves
explorer
2-3
Tou 8
500
roughandtumble, prospector, discovermagic
thriftmaster
2-3
Sne 8
400
thrifter, trashcollector, bargainhunter
booksmart
2-3
Mag 8
500
magicrecycling, analyze, healthy
scamartist
2-3
Soc 8
400
devilsadvocate, valuebyassociation, haggle
psychic
2-3
Coo 8
500
clairvoyant, protectiveaura, charitable
knifewhisperer
3-4
Sne 10
700
doubleedge, knifecrimes, nimble
wizard
3-4
Mag 10
700
snakecharmer, forbiddenknowledge, analyze
businesstycoon
3-4
Soc 10
500
insured, dailydrudge, pennypinch
diva
3-4
Coo 10
600
gratingvoice, disarmingcharm, fanclub
wrestler
3-4
Tou 10
600
roughandtumble, tagteam, bearhug
bigbrute
4
Vio 25
1000
grandstickswinger, intimidate, bigmug
superhunk
4
Tou 25
1000
absoftitanium, pleasinglysculpted, fanclub, bigcrush
direwizard
4
Mag 25
1000
snakecharmer, deepforbiddenknowledge, charitable, analyze
mastercriminal
4
Sne 25
1000
grandknifecrimes, nimble, devilsadvocate, pennypinch
mysticassassin
4
Soc 25
1000
grandsnakecharmer, forbiddenknowledge, guardianspirit, discovermagic
ultrahypemancer
4
Coo 25
1000
snakecharmer, fullthrottle, allin, keepthechange
infected
-
-
-
doubleedge, mutate, knowyourplace
apathetic
-
-
-
nullandvoid, wordlythings, pleaseleave
loser
-
-
-
gratingvoice, valuebyassociation, pleaseleave
Resource lists - Job skills
All the job skills in the base game.

id
Description
riskymoves
Combat Skill. Weak attack that grants extra cash if it deals the final blow.
bandaid
Combat Skill. Heals you for 70 HP, but only once per turn.
drain
Combat Skill. Weak non-elemental magic attack that heals you for 25 HP, but only once per turn.
mug
Combat Skill. Weak attack that grants you cash based on your Coolness.
bigmug
Combat Skill. Weak attack that grants you big cash based on your Coolness.
crush
Combat Skill. Sacrifice health to deal damage based on your Toughness. Never lands a bad hit.
bigcrush
Combat Skill. Sacrifice health to deal big damage based on your Toughness. Never lands a bad hit.
doubleedge
Combat Skill. Attack with higher Crit chance, but deals a bit of damage to yourself.
pennypinch
Combat Skill. Deal extra damage based on your current cash. Lower chance for a good hit.
analyze
Combat Skill. Weak non-elemental magic attack that shows opponent's base elemental resistances and other defenses.
bearhug
Combat Skill. Weaker attack that has a chance of inflicting Flustered, lowering the enemy's physical defense.
dailydrudge
Your soul-crushing day job grants cash based on your Social Networking every turn.
fanclub
Your fans give you cash based on your Coolness every turn.
devilsadvocate
Earn cash based on your Social Networking when other players damage monsters.
insured
Earn cash based on your Social Networking when you're damaged in combat.
prospector
Earn cash when uncovering new pieces of the map, based on the area difficulty.
valuebyassociation
Earn cash based on your Social Networking when ending your turn on a tile with other players. More players means more cash.
thrifter
When another player sells an item or spell, you may get a copy of it.
trashcollector
May find items when uncovering new pieces of the map. The item quality is based on your level.
discovermagic
May receive copies of spells that enemies cast on you.
magicrecycling
May receive copies of spells that other players cast.
librarycard
May receive basic spell at start of turn if you have none.
healthy
Increases the power of healing spells.
charitable
Casting a positive spell in combat also affect other players in the same battle.
gratingvoice
Casting a spell in combat causes additional non-elemental magic damage based on your level.
forbiddenknowledge
Increases the power of your spells by 45%.
deepforbiddenknowledge
Increases the power of your spells by 70%.
fireresistance
Increases resistance to Fire damage.
iceresistance
Increases resistance to Ice damage.
cuteresistance
Increases resistance to Cute damage.
nastyresistance
Increases resistance to Nasty damage.
mutate
Gain an additional random stat point when you level up.
knowyourplace
You deal half damage to final bosses.
nullandvoid
Have a small chance of nullifying incoming damage.
pleaseleave
Increases Flee chance.
fullthrottle
Increases map movement by one step.
allin
You both deal and receive extra damage in combat.
clairvoyant
When you are about to draw a bad random event you have a chance to draw another one in its place.
stickswinger
Greatly increases accuracy with Sticks based on your Violence.
grandstickswinger
Increases damage with Sticks based on your Violence.
knifecrimes
Increases damage with Knives based on your Coolness.
grandknifecrimes
Increases critical hit chance with Knives based on your Coolness.
snakecharmer
Increases damage with Snakes based on your Coolness.
grandsnakecharmer
Increases the damage of critical hits with Snakes based on your Coolness.
tagteam
Increases damage on attacks based on your Toughness if other players are present in your fight.
intimidate
Increases physical defense based on your Violence.
roughandtumble
Increases physical defense based on your Toughness.
nimble
Increases physical defense based on your Sneakiness.
beefybrain
Increases physical defense based on your Magic.
aplomb
Increases physical defense based on your Coolness.
finesse
Increases physical defense based on your Social Networking.
musclemountain
Greatly increases physical defense based on your Violence.
absoftitanium
Greatly increases physical defense based on your Toughness.
extraslithery
Greatly increases physical defense based on your Sneakiness.
protectiveaura
Greatly increases physical defense based on your Magic.
disarmingcharm
Greatly increases physical defense based on your Coolness.
guardianspirit
Greatly increases physical defense based on your Social Networking.
threaten
Lowers shop prices based on your Violence.
pleasinglysculpted
Lowers shop prices based on your Toughness.
bargainhunter
Lowers shop prices based on your Sneakiness.
hypnoticgesture
Lowers shop prices based on your Magic.
smoothtalker
Lowers shop prices based on your Coolness.
haggle
Slightly lowers shop prices based on your Social Networking.
wrangle
Lowers shop prices based on your Social Networking.
overbearing
Raises shop prices based on your Violence. Oh no!
swanky
Raises shop prices based on your Toughness. Oh no!
wantedcriminal
Raises shop prices based on your Sneakiness. Oh no!
uncannyaura
Raises shop prices based on your Magic. Oh no!
keepthechange
Raises shop prices based on your Coolness. Oh no!
lifeofluxury
Raises shop prices based on your Social Networking. Oh no!
wordlythings
You gain no cash from selling items in shops. Oh no!
Resource lists - Weapon skills
All the weapon skills in the base game.

id
Inflict%
Element
Description
attack_frightened
30%
Fire
Chance of inflicting Frightened, making the enemy deal minimum melee damage.
attack_speechless
30%
Nasty
Chance of inflicting Speechless, unabling the enemy to cast spells.
attack_chilledout
15%
Ice
Chance of inflicting Chilled Out, skipping the enemy's combat round.
attack_chilledout_icetrumpet
15%
Ice
Same as above with a custom message.
attack_weaktofire
30%
Fire
Chance of inflicting Weak to Fire, making the enemy take 50% more damage from Fire spells.
attack_weaktofire_firemace
30%
Fire
Same as above with a custom message.
attack_weaktoice
30%
Ice
Chance of inflicting Weak to Ice, making the enemy take 50% more damage from Ice spells.
attack_weaktoice_iceblade
30%
Ice
Same as above with a custom message.
attack_weaktocute
30%
Cute
Chance of inflicting Weak to Cute, making the enemy take 50% more damage from Cute spells.
attack_weaktonasty
30%
Nasty
Chance of inflicting Weak to Nasty, making the enemy take 50% more damage from Nasty spells.
attack_distracted
30%
Cute
Chance of inflicting Distracted, lowering the enemy's magic defense.
attack_distracted_laserpointer
30%
Cute
Same as above with a custom message.
attack_flustered
30%
Cute
Chance of inflicting Flustered, lowering the enemy's physical defense.
attack_flustered_loveletter
30%
Cute
Same as above with a custom message.
attack_slippery
30%
Ice
Chance of inflicting Slippery, lowering the enemy's accuracy.
attack_slippery_icicle
30%
Ice
Same as above with a custom message.
attack_huggedtodeath
15%
Cute
Chance of inflicting Hugged to Death, KO'ing the enemy after 4 combat rounds.
attack_inforit
15%
Nasty
Chance of inflicting In For It, KO'ing the enemy after 4 combat rounds.
attack_inforit_harvester
15%
Nasty
Same as above with a custom message.
Resource lists - Accessory skills
All the accessory skills in the base game.

id
Description
relic_frightened
Become Frightened at the start of battle. (Frightened: Deal minimum melee damage.)
relic_speechless
Become Speechless at the start of battle. (Speechless: Prevents you from using spells.)
vowofsilence
Same as above with a custom message.
relic_chilledout
Become Chilled Out every other turn in battle. (Chilled Out: Skip your next combat turn.)
relic_distracted
Become Distracted at the start of battle. (Distracted: Reduces your magic defense.)
closecombathandbook
Same as above with a custom message.
relic_flustered
Become Flustered at the start of battle. (Flustered: Reduces your physical defense.)
embarrassingunderwear
Same as above with a custom message.
relic_slippery
Become Slippery at the start of battle. (Slippery: Reduces your accuracy.)
relic_huggedtodeath
Become Hugged to Death at the start of battle. (Hugged to Death: KO's you after 4 combat rounds.)
relic_inforit
Become In For It at the start of battle. (In For It: KO's you after 4 combat rounds.)
desirablebird
Same as above with a custom message.
relic_weaktofire
Become Weak to Fire at the start of battle. (Weak to Fire: Take 50% more damage from Fire spells.)
relic_weaktoice
Become Weak to Ice at the start of battle. (Weak to Ice: Take 50% more damage from Ice spells.)
relic_weaktocute
Become Weak to Cute at the start of battle. (Weak to Cute: Take 50% more damage from cute spells.)
relic_weaktonasty
Become Weak to Nasty at the start of battle. (Weak to Nasty: Take 50% more damage from nasty spells.)
relic_crit5
Increases chance of critical hits by 5%.
relic_crit10
Increases chance of critical hits by 10%.
relic_crit20
Increases chance of critical hits by 20%.
relic_crit30
Increases chance of critical hits by 30%.
relic_crit40
Increases chance of critical hits by 40%.
relic_crit50
Increases chance of critical hits by 50%.
Resource lists - Weapons
All the weapons in the base game.

id
Type
Region
Cost
Dmg
Acc
Note
startweapon
(Fighting spirit)
100
4
-5
bluntsock
1
700
7
0
twig
Stick
1
150
12
-10
butterknife
Knife
1
150
10
0
fakesnake
Snake
1
150
8
10
Wanted by: mysticassassin, ultrahypemancer, wizard, direwizard
newspaper
1
120
10
0
foamstick
Stick
1
250
18
-10
Wanted by: brute, bigbrute
knice
Knife
1
250
15
0
Wanted by: delinquent, knifewhisperer, mastercriminal
biggnukkel
1
350
15
0
Weapon skill: attack_frightened
toysword
1
220
15
0
Wanted by: unemployed, seadog, healingstudent, salaryman, explorer, thriftmaster, booksmart, scamartist, psychic, businesstycoon, diva, infected, apathetic, loser, superhunk
bucket
1
300
15
25
Only found with trashcollector skill
trainingsnake
Snake
2
350
16
15
loveletter
2
500
20
0
Weapon skill: attack_flustered_loveletter
heavybrick
2
300
20
0
nailclub
Stick
2
500
36
-5
Wanted by: brute, bigbrute
crosshairknife
Knife
2
500
30
10
Wanted by: delinquent, knifewhisperer, mastercriminal
mallet
2
400
30
5
pypesnake
Snake
2
900
38
20
Wanted by: mysticassassin, ultrahypemancer, wizard, direwizard
icicle
2
1100
45
5
Weapon skill: attack_slippery_icicle
duelingglove
2
700
45
5
Wanted by: unemployed, seadog, healingstudent, salaryman, explorer, thriftmaster, booksmart, scamartist, psychic, businesstycoon, diva, infected, apathetic, loser, superhunk
baguette
Stick
2
1100
54
5
Only found with trashcollector skill
log
Stick
3
1300
78
-5
doubleedge
knife
3
1300
65
10
sawnoffdoublesword
3
1100
65
10
scopedsnake
Snake
3
1800
75
30
Wanted by: mysticassassin, ultrahypemancer, wizard, direwizard
laserpointer
3
2200
85
20
Weapon skill: attack_distracted_laserpointer
anactualsword
3
1600
85
20
oar
Stick
3
2200
120
0
Wanted by: brute, bigbrute
noif
Knife
3
2200
100
0
Wanted by: delinquent, knifewhisperer, mastercriminal
moustaxe
3
2000
100
15
Wanted by: unemployed, seadog, healingstudent, salaryman, explorer, thriftmaster, booksmart, scamartist, psychic, businesstycoon, diva, infected, apathetic, loser, superhunk
biggestfan
3
3000
100
30
Only found in events
sharpenedsnake
Snake
4
2800
100
35
iceblade
4
3400
120
20
Weapon skill: attack_weaktoice_iceblade
firemace
4
3400
120
20
Weapon skill: attack_weaktofire_firemace
slayerblade
4
2500
120
20
doublestick
Stick
4
3400
160
5
Wanted by: brute, bigbrute
pointypolygon
Knife
4
3400
135
25
Wanted by: delinquent, knifewhisperer, mastercriminal
plasmabolt
4
3000
135
25
harvester
4
4400
120
25
Weapon skill: attack_inforit_harvester, only found in events
twohandedsnake
Snake
4
4000
130
40
Wanted by: mysticassassin, ultrahypemancer, wizard, direwizard
icetrumpet
4
4800
150
5
Weapon skill: attack_chilledout_icetrumpet
smithingaccident
4
4800
150
15
Weapon skill: attack_frightened
chainaxe
4
3500
150
25
Wanted by: unemployed, seadog, healingstudent, salaryman, explorer, thriftmaster, booksmart, scamartist, psychic, businesstycoon, diva, infected, apathetic, loser, superhunk
anentiretree
Stick
4
5000
215
5
Not found in shops
mrsteele
Knife
4
5000
180
30
Not found in shops
nitropython
Snake
4
5000
155
45
Not found in shops
Resource lists - Armors
All the armors in the base game.

id
Region
Cost
Def
MDef
Note
barrel
1
25
2
0
businesssuspenders
1
50
3
0
barebarianoutfit
1
100
4
0
magicmesh
1
175
3
3
pristinerobe
1
250
2
6
adventuringattire
2
300
6
0
ruffledskirt
2
500
8
0
safetysuit
2
800
10
0
reinforcedrobe
2
900
6
6
lettucedressup
2
1100
4
12
roguerobe
3
1200
12
0
pricklyprotector
3
1600
16
0
battlebikini
3
2000
20
0
email
3
2200
16
8
hitechsuit
3
2400
14
14
Wanted by: unemployed, seadog, healingstudent, salaryman, delinquent, brute, explorer, thriftmaster, booksmart, scamartist, psychic, knifewhisperer, wizard, businesstycoon, diva, infected, apathetic, loser, bigbrute, superhunk, direwizard, mastercriminal, mysticassassin, ultrahypemancer
moonrobe
3
2500
8
24
raretshirt
3
3000
22
12
Only found in events
dragonsuit
4
2700
24
0
heavyarmor
4
3100
28
0
farmorearmor
4
3600
32
0
blastarmor
4
3700
24
12
halfmagicarmor
4
3900
20
20
Wanted by: unemployed, seadog, healingstudent, salaryman, delinquent, brute, explorer, thriftmaster, booksmart, scamartist, psychic, knifewhisperer, wizard, businesstycoon, diva, infected, apathetic, loser, bigbrute, superhunk, direwizard, mastercriminal, mysticassassin, ultrahypemancer
magiccape
4
4000
12
32
goldenarmor
4
5300
10
40
Not found in shops
edgyarmor
4
6300
40
10
Not found in shops
plotarmor
4
7000
30
30
Not found in shops
Resource lists - Accessories
All the accessories in the base game.

id
Region
Cost
Effect
Note
hook
1-2
200
Vio +2
swolexproteinwatch
1-2
200
Tou +2
magicalfox
1-2
200
Mag +2
throwingstar
1-2
200
Sne +2
cordlessphone
1-2
200
Soc +2
refreshingdrink
1-2
200
Coo +2
firepoker
1-3
800
Accessory skill: fireresistance
icecream
1-3
800
Accessory skill: iceresistance
liquidhealthiness
1-3
800
Def +4
protectivewand
1-3
800
MDef +4
criticalfork
1-3
800
Accessory skill: relic_crit10 (Crit chance +10%)
cuteflower
2-4
1200
Accessory skill: cuteresistance
nastytentacle
3-4
2000
Accessory skill: cuteresistance
ovenmitt
3-4
3000
Accessory skill: fireresistance, Accessory skill: iceresistance
legendaryshield
3-4
2500
Def +10
unilongbuncornhorn
3-4
2500
MDef +10
violentclaw
3-4
1000
Vio +4
Wanted by: brute, bigbrute
toughdumbbell
3-4
1000
Tou +4
Wanted by: seadog, explorer, superhunk
magicmissile
3-4
1000
Mag +4
Wanted by: healingstudent, booksmart, psychic, wizard, direwizard
sneakyglove
3-4
1000
Sne +4
Wanted by: knifewhisperer
socialbutterfly
3-4
1000
Soc +4
Wanted by: salaryman, scamartist, businesstycoon
coolshades
3-4
1000
Coo +4
Wanted by: delinquent, thriftmaster, diva, ultrahypemancer
direbee
4
2000
Accessory skill: relic_crit20 (Crit chance +20%)
omnipotato
4
1200
All stats +1
Wanted by: mastercriminal, mysticassassin
fishbunplushie
3-4
3000
All stats +2
Only found in events
closecombathandbook
4
2500
Vio +6, Accessory skill: closecombathandbook (Become Distracted)
vowofsilence
4
2500
Tou +6, Accessory skill: vowofsilence (Become Speechless)
embarrassingunderwear
4
2500
Mag +6, Accessory skill: embarrassingunderwear (Become Flustered)
desirablebird
4
2500
Coo +10, Accessory skill: desirablebird (Become In For It)
Resource lists - Items
All the event and quest items in the base game. These items do nothing and cannot be sold in shops.

id
Description
membershipcard
Membership card for the Pom Pous fanclub.
rareleaf
It'll be worth a fortune someday. Now your future is secured!
strangepackage
It's a strange package.
kid
A lost kid you're leading around.
purse
It's a small purse.
shoppinglist
It's a snazzy shopping list.
ytee
An ancient, drainpipe-like artifact.
monumentkey
A "very legal" copy of an ancient key.
Resource lists - Spells
All the non-chaos spells in the base game.

id
Effect
Boosted by
Used in
Shop
Rare
lightlybroiled
Deals 40 Fire damage.
Lvl+Mag
Combat
Yes
No
coldfront
Deals 40 Ice damage.
Lvl+Mag
Combat
Yes
No
sparkles
Deals 40 Cute damage.
Lvl+Mag
Combat
Yes
No
pollution
Deals 40 Nasty damage.
Lvl+Mag
Combat
Yes
No
flashfire
Deals 120 Fire damage.
Lvl+Mag
Combat
Yes
No
iceblizzard
Deals 120 Ice damage.
Lvl+Mag
Combat
Yes
No
pillowcannon
Deals 120 Cute damage.
Lvl+Mag
Combat
Yes
No
evilphenomena
Deals 120 Nasty damage.
Lvl+Mag
Combat
Yes
No
solaroven
Deals 140 Fire damage. Hits all heroes when used by enemies.
Lvl+Mag
Combat
No
No
iceage
Deals 140 Ice damage. Hits all heroes when used by enemies.
Lvl+Mag
Combat
No
No
tacticalrainbow
Deals 140 Cute damage. Hits all heroes when used by enemies.
Lvl+Mag
Combat
No
No
darknessfalls
Deals 140 Nasty damage. Hits all heroes when used by enemies.
Lvl+Mag
Combat
No
No
snakeheads
Deals 130 Physical damage. Hits all heroes when used by enemies.
Lvl+Mag
Combat
No
No
healing
Restores 30 of your health.
Lvl+Mag
Combat, Map
Yes
No
fullheal
Restores your health to maximum.
Combat, Map
Yes
Yes
smokebomb
Guaranteed escape from combat.
Combat
Yes
No
powerwalk
Makes you Speedy, giving you 3 extra steps on the map this turn. (4 with forbiddenknowledge, 5 with deepforbiddenknowledge.)
Map
Yes
No
musclepump
Makes you Pumped, raising your physical damage. Also deals 40 Non-elemental damage to enemies.
Lvl + Tou
Combat
Yes
No
antimagicsurge
Makes you Insulated, raising your magical defense. Also deals 90 Non-elemental damage to enemies.
Lvl+Mag
Combat
Yes
No
brickpile
Makes you Bricked, raising your physical defense. Also deals 40 Non-elemental damage to enemies.
Lvl+Mag
Combat
Yes
No
encouragingwords
Makes you Brave, maximizing physical damage. Also deals 90 Cute damage to enemies.
Lvl+Soc
Combat
No
Yes
hardensteel
Makes you Trusty, raising accuracy and critical hit chance. Also deals 90 Fire damage to enemies.
Lvl+Mag
Combat
No
Yes
goldrush
Makes you Prosperous, increasing cash rewards from combat. Also deals 90 Cute damage to enemies.
Lvl+Mag
Combat
No
Yes
battletraining
Makes you Expertised, raising experience rewards from combat. Also deals 90 Cute damage to enemies.
Lvl+Mag
Combat
No
Yes
luckybreak
Makes you Lucky, so your next random event will be a good one.
Map
Yes
No
rinsingbath
Removes all statuses on yourself. Deals 40 Non-elemental damage to enemies.
Lvl+Mag
Combat, Map
Yes
No
incineratestatus
Removes all status effects on opponent. Deals 40 Fire damage to enemies.
Lvl+Mag
Combat
Yes
No
probe
Shows opponent's base elemental resistances, and compares their physical and magical defenses. Deals 90 Non-elemental damage to enemies.
Lvl+Mag
Combat
Yes
No
astralflex
Deals 90 Fire damage. Has a 50% chance to make the target Frightened, minimizing physical damage.
Lvl+Tou
Combat
No
Yes
slipperycold
Deals 90 Ice damage. Has a 70% chance to make the target Slippery, reducing accuracy.
Lvl+Sne
Combat
No
Yes
rudeoutrage
Deals 90 Nasty damage. Has a 50% chance to make the target Speechless, unabling them to cast spells.
Lvl+Soc
Combat
Yes
No
flirt
Deals 90 Cute damage. Has a 50% chance to make the target Flustered, lowering physical defense.
Lvl+Soc
Combat
Yes
No
distractions
Deals 90 Cute damage. Has a 50% chance to make the target Distracted, lowering magic defense.
Lvl+Coo
Combat
Yes
No
imminentbeatdown
Deals 90 Nasty damage. Has a 80% chance to make the target In For It, knocking them out after 4 combat rounds.
Lvl+Vio
Combat
No
Yes
hugtodeath
Deals 90 Cute damage. Has a 80% chance to make the target Hugged to Death, knocking them out after 4 combat rounds.
Lvl+Vio
Combat
No
No
staycool
Deals 90 Ice damage. Has a 60% chance to make the target Chilled Out, skipping their next combat turn.
Lvl+Coo
Combat
No
Yes
weakentofire
Deals 90 Fire damage. Has a 50% chance to make the target Weak to Fire.
Lvl+Mag
Combat
No
Yes
weakentoice
Deals 90 Ice damage. Has a 50% chance to make the target Weak to Ice.
Lvl+Mag
Combat
No
Yes
weakentocute
Deals 90 Cute damage. Has a 50% chance to make the target Weak to Cute.
Lvl+Mag
Combat
No
Yes
weakentonasty
Deals 90 Nasty damage. Has a 50% chance to make the target Weak to Nasty.
Lvl+Mag
Combat
No
Yes
heartbreak
Deals 40 Nasty damage. Has a 70% chance to make the target lose half their health.
Lvl+Sne
Combat
No
Yes
knockout
Deals 90 Nasty damage. Has a 40% chance to make the target lose all their health.
Lvl+Tou
Combat
No
Yes
peekaboo
Can only be cast by monsters. Makes the player flee combat.
Resource lists - Chaos spells
All the chaos spells in the base game. These cannot be found in shops, and are instead obtained from special events that will not appear for the player in first place.

Whether a chaos spell is major or minor simply determines which reward table the belong to. If it is "None" it does not appear in any reward tables and must be given as a specific reward.

id
Effect
Type
Used in
homingmagpie
Steals a random item and spell from the player in the lead. Can't be cast if you are in the lead.
Major
Map
experiencemagnet
Steals experience points from the player in the lead. Can't be cast if you are in the lead.
Major
Map
jinx
Makes all players with a higher level than you Unlucky, so their next random event will be a bad one.
Major
Map
bootgoop
Give all other players Sticky boots, reducing their map movement. Can't be cast if you are in the lead.
Minor
Map
goldenroad
Creates a money vortex on your location. Whoever steps on it will have some of their cash stolen and given to you.
Minor
Map
monsterwhistle
Calls a random monster to the tile you stand on. Remember to move away from it once cast. Can only be used on the map but not in Towns, Castle, or Dark Lair.
None
Map
damageheroes
Deal damage to each hero equal to half their health, rounded down. Not obtained in the base game.
None
Map
Resource lists - Statuses
All the statuses in the base game.

id
Effect
Cleared on
Nullifies statuses
Element
speedy
Increases map movement by 3
End movement
stickyboots
Non-elemental
stickyboots
Decreases map movement by 2
End movement
speedy
Non-elemental
chilledout
Skip next combat round
Next combat round
None
Ice
pumped
Raise physical damage in combat
Combat won
None
Non-elemental
bricked
Raise physical defense in combat
Combat won
flustered
Non-elemental
insulated
Raise magic defense in combat
Combat won
insulated
Non-elemental
speechless
Can't use spells
Combat won
None
Nasty
flustered
Physical defense -40
Combat won
None
Cute
distracted
Magic defense -40
Combat won
None
Cute
frightened
Deal minimum on physical damage rolls
Combat won
brave, trusty
Fire
brave
Deal maximum on physical damage rolls
Combat won
frightened, slippery
Non-elemental
slippery
Accuracy -40
Combat won
brave, trusty
Ice
trusty
Accuracy +40, Critical hit chance +20
Combat won
frightened, slippery
Non-elemental
weaktofire
Receive +50% Fire damage
Combat won
None
Fire
weaktoice
Receive +50% Ice damage
Combat won
None
Ice
weaktocute
Receive +50% Cute damage
Combat won
None
Cute
weaktonasty
Receive +50% Nasty damage
Combat won
None
Nasty
expertised
Exp +50% upon defeating a monster
Combat won
None
Non-elemental
prosperous
Cash +50% upon defeating a monster
Combat won
None
Non-elemental
inforit
KO after 4 combat rounds
Combat won
None
Nasty
huggedtodeath
KO after 4 combat rounds
Combat won
None
Cute
lucky
Next event will be Good or Quest, unless it is Snok
Next event, Combat won
unlucky
Non-elemental
unlucky
Next event will be Bad
Next event, Combat won
lucky
Non-elemental
Resource lists - Followers
All the followers in the base game. These are given to players with +item: as if giving them an item. Each one has a followerskill which has the same name as the follower itself, and has the listed effect.

id
Effect
schoolclass
May get in the way and cause you to fumble your attacks in combat.
motorkobra
This trusty steed increases your map movement by 1.
pompom
Your personal cheerleader has a chance of maximising your damage, or buffing your accuracy and crit chance.
swarm
Dragging the beehive around decreases your map movement by 1.
furnacecannon
This orbital cannon may aid you in battle by dealing Fire damage based on your Social Networking that incinerates enemy statuses.
avengingspirit
May aid you in combat by dealing damage based on your Social Networking and making your opponent Frightened.
clog
This lucky cloverdog may make you Prosperous or Experienced in combat, raising cash or exp rewards respectively.
sleepwalker
May get in the way of both you and your opponent in combat.
champion
Has a chance of waking up and blocking an attack for you in combat.
bombus
Your cute beefriend may swoop down to heal you in combat.
annebiguous
May aid you in combat by dealing damage based on your Social Networking.
sleuth
This super P.I. may make you Bricked or Insulated in combat, raising defense or magic defense respectively.
Resource lists - Monsters
All the monsters in the base game.

Level 1 random monsters (Region 1)
bugonslug
carnivorouspal
fastbird
lazyshroom
trashmob


Level 5 random monsters (Region 2)
birdsassin
dancemacabre
doublebird
firesnout
flopflop
rogueroguerogue
roughrougerogue
sawbird
spiraltop
toughfishbun


Level 10 random monsters (Region 3)
apatheticmage
babymotorkobra
burrowingcreature
carnivorous_couch
crybulb
deathmask
feralbicycle
hawklike
mockeryofnature
motorkobra
northernwind
rowbugs


Level 15 random monsters (Region 4)
chiller
firefly
furnaceman
hypesnake
kaisernova
manpion
migranite
passingomen
pieceofcake
pteranomancer
pumpingbug
sleepparalysis
snakeman
specterofdeath


Level 5 special monsters and midbosses
scaryscroll
terriblytemperedtome
totalenforcers
wreckingrider
forestkeeper


Level 10 special monsters and midbosses
avengingspirit
mainquest_boss_icelady
mainquest_boss_shapestealer
mainquest_boss_ufo
wail


Level 15 special monsters and midbosses
arenaowner
bagofsorrows
goldenspacenord
harvestmaiden
hypedra
mainquest_boss_annebiguous
mainquest_boss_kallahanden
totalenforcers2
werehouse


Level 20 special monsters and midbosses
ultrafishbunjin

Level 15 final bosses (has the "boss" and "skip_ending" tags)
mainquest_boss_captor
mainquest_boss_moosecles
mainquest_boss_weirdo


Level 20 final bosses (has the "boss" and "skip_ending" tags)
mainquest_boss_crowncourt
mainquest_boss_formless
mainquest_boss_formlessfake
mainquest_boss_frostwrack
mainquest_boss_furnacelord
lingeringlivid_00ma00md - Magic attack, Magic defense
lingeringlivid_00mapd00 - Magic attack, Physical defense
lingeringlivid_00mapdmd - Magic attack, Physical defense, Magic defense
lingeringlivid_pa0000md - Physical attack, Magic defense
lingeringlivid_pa00pd00 - Physical attack, Physical defense
lingeringlivid_pa00pdmd - Physical attack, Physical defense, Magic defense
lingeringlivid_pamapdmd - Physical attack, Magic attack, Physical defense, Magic defense
Resource lists - Reward tables
These are the most common reward tables you'll want to use in event scripting.

The special case +reward: #jobarea gives a player a random piece of equipment (weapon, armor or accessory) that matches the current region and the player's current job. This is determined by the tag wanted_by, as seen in the resource tables above.

The following tables include all gear that isn't marked as "Only found in events" or "Only found with trashcollector skill" in the resource lists:
id
Description
t1_weapon
Region 1 weapons
t2_weapon
Region 2 weapons
t3_weapon
Region 3 weapons
t4_weapon
Region 4 weapons
t1_armor
Region 1 armors
t2_armor
Region 2 armors
t3_armor
Region 3 armors
t4_armor
Region 4 armors
t1_relic
Region 1 accessories
t2_relic
Region 2 accessories
t3_relic
Region 3 accessories
t4_relic
Region 4 accessories

The following tables include all gear that isn't marked as "Only found in events", "Only found with trashcollector skill", or "Not found in shops" in the resource lists:
id
Description
shop1_weapon
Region 1 weapons in shops
shop2_weapon
Region 2 weapons in shops
shop3_weapon
Region 3 weapons in shops
shop4_weapon
Region 4 weapons in shops
shop1_armor
Region 1 armors in shops
shop2_armor
Region 2 armors in shops
shop3_armor
Region 3 armors in shops
shop4_armor
Region 4 armors in shops
shop1_relic
Region 1 accessories in shops
shop2_relic
Region 2 accessories in shops
shop3_relic
Region 3 accessories in shops
shop4_relic
Region 4 accessories in shops

The following tables include only the best gear in each region that isn't marked as "Only found in events" or "Only found with trashcollector skill" in the resource lists:
id
Description
t1_good_weapon
Region 1 best weapons
t2_good_weapon
Region 2 best weapons
t3_good_weapon
Region 3 best weapons
t4_good_weapon
Region 4 best weapons
t1_good_armor
Region 1 best armors
t2_good_armor
Region 2 best armors
t3_good_armor
Region 3 best armors
t4_good_armor
Region 4 best armors
t1_good_relic
Region 1 best accessories
t2_good_relic
Region 2 best accessories
t3_good_relic
Region 3 best accessories
t4_good_relic
Region 4 best accessories

The following are tables of spells:
id
Region
Shop
Rare
Chaos
t1_magic
1
No
No
t2_magic
2
No
No
t3_magic
3
No
No
t4_magic
4
No
No
shop1_magic
1
Yes
No
shop2_magic
2
Yes
No
shop3_magic
3
Yes
No
shop4_magic
4
Yes
No
rare_magic
1-4
Yes
No
chaos_spell_major
1-4
Major
chaos_spell_minor
1-4
Minor

The following are auto-generated tables:
id
Description
weapon
any weapon in the game
armor
any armor in the game
relic
any accessory in the game
magic
any spell in the game
gear
any weapon/armor/accessory in the game
item
any weapon/armor/accessory/spell in the game
t1
any Region 1 reward
t2
any Region 2 reward
t3
any Region 3 reward
t4
any Region 4 reward
t1_gear
any Region 1 weapon/armor/acessory
t2_gear
any Region 2 weapon/armor/acessory
t3_gear
any Region 3 weapon/armor/acessory
t4_gear
any Region 4 weapon/armor/acessory
t1_any
any Region 1 weapon/armor/acessory/spell
t2_any
any Region 2 weapon/armor/acessory/spell
t3_any
any Region 3 weapon/armor/acessory/spell
t4_any
any Region 4 weapon/armor/acessory/spell

The following are custom tables used by various events in the base game:
t1_trashcollection
t2_trashcollection
t3_trashcollection
t4_trashcollection
librarycard
blackmarket_weapon
luxurywheel_weapon
t4_snok_weapon
blackmarket_armor
luxurywheel_armor
blackmarket_relic
luxurywheel_relic
t2_shopclean
t3_shopclean
t1_itemchest
t2_itemchest
t3_itemchest
t4_itemchest
t1_pittrap
t2_pittrap
t3_pittrap
t4_pittrap
ludo_set
harvestmaiden_reward
t2_vending_equip
t3_vending_equip
t4_vending_equip
sleepyfairymagic
Resource lists - Formulas
Various formulas used in the game.

Exp needed for next level
Lvl * Lvl * 5
HP
23 + (Lvl * 5) + (Tou * 2)
Attack hit %
Lvl + Vio + Weapon accuracy + Enemy Hitability
Critical hit %
Coo * 1
Normal attack damage
((Lvl + Vio) * (1 to 3)) + Weapon damage - Enemy Defense
Bad hit attack damage
(((Lvl + Vio) * (1 to 3)) + Weapon damage - Enemy Defense) * 0.5
Critical attack damage
(((Lvl + Vio) * 3) + Weapon damage - Enemy Defense) * 1.2
Magic damage
Spell damage + Lvl + (STAT * (2.7 to 3.2)) - Enemy MDefense
Elemental weakness
Spell damage * 1.5
Elemental resistance
Spell damage * 0.5
Healing
Spell healing + (Lvl * 1.2) + (STAT * (2.7 to 3.2))
Status infliction %
Spell status hit % + Lvl + (STAT * 2) - Enemy Mdefense
Escape from battle %
Lvl + Snea + Enemy escape chance
Sneak past %
Lvl + Snea + Enemy sneak past chance
Enemy attack hit %
Enemy hit chance - Player Sne
Enemy attack damage
Custom range between two values - Player defense
Enemy magic damage
Custom - Player MDefense
Enemy Status infliction %
Spell Hit Chance - player Mdefense. Random rolled range between 1-100.
Exp from bag on the board
CEIL(10 + ((last player’s level *  last player’s level) * 2) / 10) * 8
Gold from bag on the board
CEIL(20 + ((last player’s level *  last player’s level) * 2) / 10) * 9

The number of spawned gold bags at the start of an act is equal to the available spaces divided by a value based on the number of players.
1 player = divided by 7
2 players = divided by 6
3 players = divided by 5
4 players = divided by 4
Resource lists - Scenes
Here are the scenes that can be triggered from events.

id
Description
FinalReward
The victory text pops up and the final boss exp reward and special reward bonuses are handed out.
TimeUp
The transition curtains to put in at the start of the event triggered when turns run out to match with the transition effect.
Credits
The games credits roll.
GameGraphs
The ending graphs tracking the game session is displayed, after viewing the graphs the game session end.
Resource lists - Enchantment script event ids
List of existing enchantment script event ids to add to your scenario.
These are secondary tile events that gets spawned during act changes.

id
Description
healingspring_enchantment
Pay 50 cash to get healed and get the option to have statuses removed. Turn continues.
speedy_enchantment
Pay 600 cash to get the speedy status. Turn continues.
expertised_enchantment
Pay 1000 cash to get the expertised status. Turn continues.
lucky_enchantment
Pay 1200 cash to get the lucky status. Turn continues.
Design - Event rewards
Here are the typical rewards used in the base events and scenarios.

Type
Region 1
Region 2
Region 3
Region 4
Cash rewards from events and quests
200-400
400-600
600-800
800-1500
Small Exp from random events where
the main reward is something else
35
150
275
455
Exp from no-effort random events
77
275
455
679
Quest Exp
144
550
910
1358
Big quest Exp
270
750
1365
2000
Design - Monsters
These are approximate values for enemies and bosses throughout the game. You don't need to follow these guidelines, but it'll help balance the monsters against the player's power level as they progress through the scenario.

Data
Region 1
Region 2
Region 3
Region 4
Lvl 10 Midboss
Lvl 20 Final boss
sneak
90
30
20
10
30
0
escape
90
60
50
40
60
0
hp
25-30
100
250
400
500
1500
hitability
80
55
35
15
60-80
25
def/mdef
0
5
10-20
20-40
5-15
30-50
dmg
7-10
15-25
20-40
50-80
20-40
40-100
hitchance
80-90
80-90
90
100
85-95
90-120
critchance
1
10
10
10
5
0-10
exp
100-135
420-550
800-970
1250-1400
400
0
gold
250-340
400-550
700-1000
1100-1300
500
0

Note for Lvl 10 Midbosses:
  • The table above only shows the Exp for the monster itself. The Main Quest event typically adds 900 Exp as a reward on top.

Notes for Lvl 20 Final bosses:
  • It's important that final bosses are strong against the Nasty element, since instant KO spells are Nasty-aligned.
  • There is also the Cute-aligned spell Hug to Death, which is not normally obtainable except from fighting Formless, who is strong against Cute so you can't obtain the spell and use it on her.
  • Final bosses typically do not award Exp. Instead the game awards Exp in the ending based on how much damage each player dealt to the boss, according to the scenario's boss_exp_multiplier value.
  • Use the tag "boss" for a final boss to give it a unique background and music.
  • Use the tag "skip_ending" for a final boss to skip the normal battle ending that plays a fanfare and gives you rewards, if you want your event to handle that instead.
Troubleshooting
If you don't get an error message in the game you can take a look at the log files in the following folder:
%appdata%\..\LocalLow\Ludosity\Heartwood Heroes

If a fight starts and the game encounters an error in the monster, the encounter will default to a fight with the monster Bug on Slug. This also happens if the game cannot find the monster id when you trigger a specified monster encounter.
6 Comments
Professorn  [author] Sep 15, 2023 @ 5:49am 
Added the section 'Resource lists - Enchantment script event ids'.
Professorn  [author] Apr 17, 2023 @ 7:31am 
Added the section 'Resource lists - Statuses'. And sorry, spells do not have a modding script language.
PerskuleBenener Apr 4, 2023 @ 9:45am 
also is it possible to create your own spells at the current moment?
PerskuleBenener Apr 4, 2023 @ 7:32am 
I don't know if i'm blind but I don't see a list for all of the statuses here, It'd be really helpful to have :jums:
Miikka poikela Mar 28, 2023 @ 3:58am 
well i test it but now is super fun for workshop for now :steamthumbsup: !
Miikka poikela Mar 27, 2023 @ 10:06am 
so what next update for heartwood heroes for next day ?