Tyrian modding: level events
A mod can add events to an original level or replace its whole event list. Events are written by name; the map itself (the tiles) cannot be changed yet.
The level file
Each level file is levels/epN_NN.json in the mod, where N is the episode (1 to 5) and NN the level file
number. Every level on the episode pages shows its file name; for example the first level of
episode 1, TYRIAN, is ep1_09.
{ "episode": 1, "lvl_file_num": 9,
"add_events": [ { "time": 300, "spawn": "my_drone", "x": 130 },
{ "time": 300, "spawn": "tech_corridor_32", "x": "random", "link": 3 } ] }
| Key | Meaning |
|---|---|
events | Replaces the original event list. |
add_events | Inserted into the original list, each one after the original events of the same time. |
random_enemies (40 at most) | Replaces the level's random enemies (enemy names). |
Writing an event
- Every event has a
time: the scroll position from 0 to 65535 at which it fires (thecur_locvalue the level editor shows). - It has exactly one type key. The type key holds the main parameter, for example
"spawn": "my_drone", ortruewhen the type has none, for example"stars_off": true. - Other parameters are named and default to 0.
- Enemies, image banks and specials are written by name. Special values have names too:
"x": "random","keep", or{ "picked": 2 }for a link chosen bypick_random_link. Their numeric codes are refused. - An unknown type or parameter is an error that names the event.
The level editor's Export to the mod button writes this same format, and every original level exported and read back plays identically.
Spawning enemies
Most mods only need the spawn events. They differ by the layer the enemy belongs to:
spawn: an enemy in the sky, the usual flying enemy;spawn_ground,spawn_ground2: enemies on the scrolling ground layers;spawn_top: an enemy on the top background layer;spawn_bottom,spawn_ground_bottom,spawn_top_bottom,spawn_top_low,spawn_ground2_low: the same, entering from the bottom of the screen;spawn_2x2: a four-part enemy (the enemy and the next three), with alayerparameter.
All take x (a position, "random" or "none"), y_speed, link, y and
fixed_move_y. The link number groups enemies so that later events (move_enemies, set_armor,
boss_bar…) can act on them together.
All event types
| Type key | Main value | Other parameters |
|---|---|---|
nothing | true | |
starfield_speed | speed | |
scroll_speed | back | back2, back3 |
scroll_slow | true | |
stop_map | layers | |
load_banks | bank1 (bank NAME or null) | bank2 (bank NAME or null), bank3 (bank NAME or null), bank4 (bank NAME or null) |
spawn_ground | enemy (enemy NAME) | x ("random", "none"), y_speed, link, y, fixed_move_y |
spawn_top | enemy (enemy NAME) | x ("random", "none"), y_speed, link, y, fixed_move_y |
stars_off | true | |
stars_on | true | |
spawn_ground2 | enemy (enemy NAME) | x ("random", "none"), y_speed, link, y, fixed_move_y |
end_level | immediate | |
spawn_2x2 | enemy (enemy NAME) | x ("random", "none"), y_speed, link, y, layer ("ground", "sky", "top", "ground2") |
random_enemies_off | true | |
random_enemies_on | true | |
spawn | enemy (enemy NAME) | x ("random", "none"), y_speed, link, y, fixed_move_y |
text | message | |
spawn_ground_bottom | enemy (enemy NAME) | x ("random", "none"), y_speed, link, y, fixed_move_y |
spawn_bottom | enemy (enemy NAME) | x ("random", "none"), y_speed, link, y, fixed_move_y |
move_enemies | x_speed ("keep") | y_speed ("keep"), targets ("ground", "sky", "top", "all", { "picked": n }), link, cycle, fixed_move_y ("zero") |
accelerate_enemies | x ("keep") | y ("keep"), targets ({ "picked": n }), link, cycle, animation |
background3_over | true | |
background3_under | true | |
spawn_top_bottom | enemy (enemy NAME) | x ("random", "none"), y_speed, link, y, fixed_move_y |
animate_enemies | animation | cycle, mode, link |
set_armor | armor | link |
small_enemy_adjust | on | |
reverse_enemies | x ("keep") | y ("keep"), color ({ "picked": n }), link |
top_enemies_under | true | |
top_enemies_over | true | |
scroll_speed_keep_stop | back | back2, back3 |
fire_rate | rate1 | rate2, rate3, link ("all"), launch_rate |
spawn_top_low | enemy (enemy NAME) | x ("random", "none"), y_speed, link, y, fixed_move_y |
drop_on_death | enemy (enemy NAME) | link |
music_fade | true | |
music | song | |
end_level_when_clear | true | |
random_enemy_rate | rate | |
jump_to | time | |
relink | from | to |
continual_damage | true | |
clear_enemies | sky_only | |
background3_mode2 | true | |
background2_over | mode | |
color_filter | mode | color, brightness, new_color, brightness_change, fade_start |
drop_on_death_multiplayer | enemy (enemy NAME) | link |
difficulty | change | condition, damage_rate |
set_armor_plain | armor | link |
background2_opaque | true | |
custom_enemy_ground | image | x ("random", "none"), bank (bank NAME or null), link, y, armor |
custom_enemy | image | x ("random", "none"), bank (bank NAME or null), link, y, armor |
custom_enemy_top | image | x ("random", "none"), bank (bank NAME or null), link, y, armor |
custom_enemy_ground2 | image | x ("random", "none"), bank (bank NAME or null), link, y, armor |
force_events | mode ("off") | |
jump | time ("return") | |
set_acceleration | x ("keep") | y ("keep"), targets ({ "picked": n }), link |
spawn_ground2_low | enemy (enemy NAME) | x ("random", "none"), y_speed, link, y, fixed_move_y |
jump_on_boss_death | time | |
set_launch | enemy (enemy NAME) | link ("all") |
replace_enemies | enemy (enemy NAME) | link |
special_enemy | flag | set, link |
skip_if_flag | flag | value, skip |
sound | sound | |
skip_if_one_player | skip | |
smoothie | effect | on, data |
background3_1x1 | mode | |
skip_by_difficulty | difficulty | skip |
level_timer | on | target, seconds |
invulnerable | ticks | |
jump_if_cleared | time | link1, link2, link3 |
jump_if_map_before | time | position |
background3_variant_b | on | |
sky_enemies_over_all | on | |
bounce | x_max ("keep") | y_max ("keep"), link, x_min ("keep"), y_min ("keep") |
pick_random_link | from | to, slot (0..9), skip |
return_when_clear | true | |
set_map_position | y | y2 |
galaga_fire_rate | true | |
boss_bar | link | link2 |
skip_if_two_players | skip | |
wrap_background2 | from | to |
give_special | special (special NAME) | |
timed_battle_timer | on | target, seconds |
timed_battle_drop | enemy (enemy NAME) | link |
random_explosions | on |
85 event types.
Limits
A level file holds at most 2500 events and 40 random enemies, and a mod at most 64 level files.