game-flow: reduce key naming differences

This commit is contained in:
Marcin Kurczewski 2025-01-24 13:20:34 +01:00
parent 6096153b99
commit c88972c7e5
11 changed files with 183 additions and 187 deletions

View file

@ -28,9 +28,9 @@
"levels": [
// Level 0: Lara's Home
{
"file": "data/gym.phd",
"path": "data/gym.phd",
"type": "gym",
"music": 0,
"music_track": 0,
"inherit_injections": false,
"injections": [
"data/injections/lara_gym_guns.bin",
@ -42,8 +42,8 @@
"data/injections/font.bin",
],
"sequence": [
{"type": "play_fmv", "fmv_num": 3},
{"type": "loading_screen", "picture_path": "data/images/gym.webp", "display_time": 5},
{"type": "play_fmv", "fmv_id": 3},
{"type": "loading_screen", "path": "data/images/gym.webp"},
{"type": "load_level"},
{"type": "play_level"},
{"type": "level_stats", "level_id": 0},
@ -53,17 +53,17 @@
// Level 1: Caves
{
"file": "data/level1.phd",
"path": "data/level1.phd",
"type": "normal",
"music": 57,
"music_track": 57,
"injections": [
"data/injections/caves_fd.bin",
"data/injections/caves_itemrots.bin",
"data/injections/caves_textures.bin",
],
"sequence": [
{"type": "play_fmv", "fmv_num": 4},
{"type": "loading_screen", "picture_path": "data/images/peru.webp", "display_time": 5},
{"type": "play_fmv", "fmv_id": 4},
{"type": "loading_screen", "path": "data/images/peru.webp"},
{"type": "load_level"},
{"type": "play_level"},
{"type": "level_stats", "level_id": 1},
@ -73,15 +73,15 @@
// Level 2: City of Vilcabamba
{
"file": "data/level2.phd",
"path": "data/level2.phd",
"type": "normal",
"music": 57,
"music_track": 57,
"injections": [
"data/injections/vilcabamba_itemrots.bin",
"data/injections/vilcabamba_textures.bin",
],
"sequence": [
{"type": "loading_screen", "picture_path": "data/images/peru.webp", "display_time": 5},
{"type": "loading_screen", "path": "data/images/peru.webp"},
{"type": "load_level"},
{"type": "play_level"},
{"type": "level_stats", "level_id": 2},
@ -92,9 +92,9 @@
// Level 3: Lost Valley
{
"file": "data/level3a.phd",
"path": "data/level3a.phd",
"type": "normal",
"music": 57,
"music_track": 57,
"injections": [
"data/injections/braid_valley.bin",
"data/injections/valley_itemrots.bin",
@ -102,7 +102,7 @@
"data/injections/valley_textures.bin",
],
"sequence": [
{"type": "loading_screen", "picture_path": "data/images/peru.webp", "display_time": 5},
{"type": "loading_screen", "path": "data/images/peru.webp"},
{"type": "load_level"},
{"type": "play_level"},
{"type": "level_stats", "level_id": 3},
@ -113,9 +113,9 @@
// Level 4: Tomb of Qualopec
{
"file": "data/level3b.phd",
"path": "data/level3b.phd",
"type": "normal",
"music": 57,
"music_track": 57,
"injections": [
"data/injections/larson_textures.bin",
"data/injections/qualopec_fd.bin",
@ -123,7 +123,7 @@
"data/injections/qualopec_textures.bin",
],
"sequence": [
{"type": "loading_screen", "picture_path": "data/images/peru.webp", "display_time": 5},
{"type": "loading_screen", "path": "data/images/peru.webp"},
{"type": "load_level"},
{"type": "play_level"},
{"type": "exit_to_cine", "level_id": 16},
@ -132,17 +132,17 @@
// Level 5: St. Francis' Folly
{
"file": "data/level4.phd",
"path": "data/level4.phd",
"type": "normal",
"music": 59,
"music_track": 59,
"injections": [
"data/injections/folly_fd.bin",
"data/injections/folly_itemrots.bin",
"data/injections/folly_textures.bin",
],
"sequence": [
{"type": "play_fmv", "fmv_num": 5},
{"type": "loading_screen", "picture_path": "data/images/greece.webp", "display_time": 5},
{"type": "play_fmv", "fmv_id": 5},
{"type": "loading_screen", "path": "data/images/greece.webp"},
{"type": "load_level"},
{"type": "play_level"},
{"type": "level_stats", "level_id": 5},
@ -152,9 +152,9 @@
// Level 6: Colosseum
{
"file": "data/level5.phd",
"path": "data/level5.phd",
"type": "normal",
"music": 59,
"music_track": 59,
"injections": [
"data/injections/colosseum_door.bin",
"data/injections/colosseum_fd.bin",
@ -163,7 +163,7 @@
"data/injections/colosseum_textures.bin",
],
"sequence": [
{"type": "loading_screen", "picture_path": "data/images/greece.webp", "display_time": 5},
{"type": "loading_screen", "path": "data/images/greece.webp"},
{"type": "load_level"},
{"type": "play_level"},
{"type": "level_stats", "level_id": 6},
@ -173,15 +173,15 @@
// Level 7: Palace Midas
{
"file": "data/level6.phd",
"path": "data/level6.phd",
"type": "normal",
"music": 59,
"music_track": 59,
"injections": [
"data/injections/midas_itemrots.bin",
"data/injections/midas_textures.bin",
],
"sequence": [
{"type": "loading_screen", "picture_path": "data/images/greece.webp", "display_time": 5},
{"type": "loading_screen", "path": "data/images/greece.webp"},
{"type": "load_level"},
{"type": "play_level"},
{"type": "level_stats", "level_id": 7},
@ -192,9 +192,9 @@
// Level 8: The Cistern
{
"file": "data/level7a.phd",
"path": "data/level7a.phd",
"type": "normal",
"music": 58,
"music_track": 58,
"injections": [
"data/injections/cistern_fd.bin",
"data/injections/cistern_itemrots.bin",
@ -202,7 +202,7 @@
"data/injections/cistern_textures.bin",
],
"sequence": [
{"type": "loading_screen", "picture_path": "data/images/greece.webp", "display_time": 5},
{"type": "loading_screen", "path": "data/images/greece.webp"},
{"type": "load_level"},
{"type": "play_level"},
{"type": "level_stats", "level_id": 8},
@ -212,9 +212,9 @@
// Level 9: Tomb of Tihocan
{
"file": "data/level7b.phd",
"path": "data/level7b.phd",
"type": "normal",
"music": 58,
"music_track": 58,
"injections": [
"data/injections/cistern_plants.bin",
"data/injections/tihocan_fd.bin",
@ -225,7 +225,7 @@
{"enemy_num": 82, "object_ids": [86, 144, 129]},
],
"sequence": [
{"type": "loading_screen", "picture_path": "data/images/greece.webp", "display_time": 5},
{"type": "loading_screen", "path": "data/images/greece.webp"},
{"type": "load_level"},
{"type": "play_level"},
{"type": "exit_to_cine", "level_id": 17},
@ -234,17 +234,17 @@
// Level 10: City of Khamoon
{
"file": "data/level8a.phd",
"path": "data/level8a.phd",
"type": "normal",
"music": 59,
"music_track": 59,
"injections": [
"data/injections/khamoon_fd.bin",
"data/injections/khamoon_mummy.bin",
"data/injections/khamoon_textures.bin",
],
"sequence": [
{"type": "play_fmv", "fmv_num": 6},
{"type": "loading_screen", "picture_path": "data/images/egypt.webp", "display_time": 5},
{"type": "play_fmv", "fmv_id": 6},
{"type": "loading_screen", "path": "data/images/egypt.webp"},
{"type": "load_level"},
{"type": "play_level"},
{"type": "level_stats", "level_id": 10},
@ -254,9 +254,9 @@
// Level 11: Obelisk of Khamoon
{
"file": "data/level8b.phd",
"path": "data/level8b.phd",
"type": "normal",
"music": 59,
"music_track": 59,
"injections": [
"data/injections/obelisk_fd.bin",
"data/injections/obelisk_itemrots.bin",
@ -265,7 +265,7 @@
"data/injections/obelisk_textures.bin",
],
"sequence": [
{"type": "loading_screen", "picture_path": "data/images/egypt.webp", "display_time": 5},
{"type": "loading_screen", "path": "data/images/egypt.webp"},
{"type": "load_level"},
{"type": "play_level"},
{"type": "level_stats", "level_id": 11},
@ -275,16 +275,16 @@
// Level 12: Sanctuary of the Scion
{
"file": "data/level8c.phd",
"path": "data/level8c.phd",
"type": "normal",
"music": 59,
"music_track": 59,
"injections": [
"data/injections/sanctuary_fd.bin",
"data/injections/sanctuary_itemrots.bin",
"data/injections/sanctuary_textures.bin",
],
"sequence": [
{"type": "loading_screen", "picture_path": "data/images/egypt.webp", "display_time": 5},
{"type": "loading_screen", "path": "data/images/egypt.webp"},
{"type": "load_level"},
{"type": "play_level"},
{"type": "level_stats", "level_id": 12},
@ -294,9 +294,9 @@
// Level 13: Natla's Mines
{
"file": "data/level10a.phd",
"path": "data/level10a.phd",
"type": "normal",
"music": 58,
"music_track": 58,
"injections": [
"data/injections/cowboy_textures.bin",
"data/injections/kold_textures.bin",
@ -314,8 +314,8 @@
{"enemy_num": 75, "object_ids": [85]},
],
"sequence": [
{"type": "play_fmv", "fmv_num": 7},
{"type": "loading_screen", "picture_path": "data/images/atlantis.webp", "display_time": 5},
{"type": "play_fmv", "fmv_id": 7},
{"type": "loading_screen", "path": "data/images/atlantis.webp"},
{"type": "remove_weapons"},
{"type": "remove_scions"},
{"type": "load_level"},
@ -327,21 +327,21 @@
// Level 14: Atlantis
{
"file": "data/level10b.phd",
"path": "data/level10b.phd",
"type": "normal",
"music": 60,
"music_track": 60,
"injections": [
"data/injections/atlantis_fd.bin",
"data/injections/atlantis_textures.bin",
],
"sequence": [
{"type": "play_fmv", "fmv_num": 8},
{"type": "loading_screen", "picture_path": "data/images/atlantis.webp", "display_time": 5},
{"type": "play_fmv", "fmv_id": 8},
{"type": "loading_screen", "path": "data/images/atlantis.webp"},
{"type": "load_level"},
{"type": "give_item", "object_id": 84, "quantity": 1},
{"type": "setup_bacon_lara", "anchor_room": 10},
{"type": "play_level"},
{"type": "play_fmv", "fmv_num": 9},
{"type": "play_fmv", "fmv_id": 9},
{"type": "exit_to_cine", "level_id": 19},
],
"unobtainable_pickups": 3,
@ -349,35 +349,35 @@
// Level 15: The Great Pyramid
{
"file": "data/level10c.phd",
"path": "data/level10c.phd",
"type": "normal",
"music": 60,
"music_track": 60,
"injections": [
"data/injections/pyramid_fd.bin",
"data/injections/pyramid_textures.bin",
"data/injections/scion_collision.bin",
],
"sequence": [
{"type": "loading_screen", "picture_path": "data/images/atlantis.webp", "display_time": 5},
{"type": "loading_screen", "path": "data/images/atlantis.webp"},
{"type": "load_level"},
{"type": "play_level"},
{"type": "level_stats", "level_id": 15},
{"type": "play_fmv", "fmv_num": 10},
{"type": "play_fmv", "fmv_id": 10},
{"type": "play_synced_audio", "audio_id": 19},
{"type": "display_picture", "picture_path": "data/images/end.webp", "display_time": 7.5},
{"type": "display_picture", "picture_path": "data/images/credits_1.webp", "display_time": 7.5},
{"type": "display_picture", "picture_path": "data/images/credits_2.webp", "display_time": 7.5},
{"type": "display_picture", "picture_path": "data/images/credits_3.webp", "display_time": 7.5},
{"type": "total_stats", "picture_path": "data/images/install.webp"},
{"type": "display_picture", "path": "data/images/end.webp", "display_time": 7.5},
{"type": "display_picture", "path": "data/images/credits_1.webp", "display_time": 7.5},
{"type": "display_picture", "path": "data/images/credits_2.webp", "display_time": 7.5},
{"type": "display_picture", "path": "data/images/credits_3.webp", "display_time": 7.5},
{"type": "total_stats", "background_path": "data/images/install.webp"},
{"type": "exit_to_title"},
],
},
// Level 16: Cut Scene 1
{
"file": "data/cut1.phd",
"path": "data/cut1.phd",
"type": "cutscene",
"music": 0,
"music_track": 0,
"lara_type": 77,
"inherit_injections": false,
"injections": [
@ -398,9 +398,9 @@
// Level 17: Cut Scene 2
{
"file": "data/cut2.phd",
"path": "data/cut2.phd",
"type": "cutscene",
"music": 0,
"music_track": 0,
"lara_type": 77,
"inherit_injections": false,
"injections": [
@ -423,9 +423,9 @@
// Level 18: Cut Scene 3
{
"file": "data/cut3.phd",
"path": "data/cut3.phd",
"type": "cutscene",
"music": 0,
"music_track": 0,
"inherit_injections": false,
"injections": [
"data/injections/cut3_textures.bin",
@ -444,9 +444,9 @@
// Level 19: Cut Scene 4
{
"file": "data/cut4.phd",
"path": "data/cut4.phd",
"type": "cutscene",
"music": 0,
"music_track": 0,
"draw_distance_fade": 12.0,
"draw_distance_max": 18.0,
"lara_type": 77,
@ -472,19 +472,19 @@
// Level 20: Title
{
"file": "data/title.phd",
"path": "data/title.phd",
"type": "title",
"music": 2,
"music_track": 2,
"inherit_injections": false,
"injections": [
"data/injections/pda_model.bin",
"data/injections/font.bin",
],
"sequence": [
{"type": "display_picture", "picture_path": "data/images/eidos.webp", "display_time": 1},
{"type": "play_fmv", "fmv_num": 0},
{"type": "play_fmv", "fmv_num": 1},
{"type": "play_fmv", "fmv_num": 2},
{"type": "display_picture", "path": "data/images/eidos.webp", "display_time": 1},
{"type": "play_fmv", "fmv_id": 0},
{"type": "play_fmv", "fmv_id": 1},
{"type": "play_fmv", "fmv_id": 2},
{"type": "exit_to_title"},
],
},
@ -496,9 +496,9 @@
// expect the level count to match, otherwise the game will crash.
// Hence this dummy level.
{
"file": "data/current.phd",
"path": "data/current.phd",
"type": "current",
"music": 0,
"music_track": 0,
"inherit_injections": false,
"sequence": [
{"type": "exit_to_title"},

View file

@ -28,15 +28,15 @@
"levels": [
// Level 2: City of Vilcabamba
{
"file": "data_demo_pc/level2.phd",
"path": "data_demo_pc/level2.phd",
"type": "level_demo_pc",
"music": 0,
"music_track": 0,
"injections": [
"data/injections/vilcabamba_itemrots.bin",
"data/injections/vilcabamba_textures.bin",
],
"sequence": [
{"type": "loading_screen", "picture_path": "data/images/peru.webp", "display_time": 5},
{"type": "loading_screen", "picture_path": "data/images/peru.webp"},
{"type": "load_level"},
{"type": "play_level"},
{"type": "level_stats", "level_id": 0},
@ -47,9 +47,9 @@
// Level 3: Title
{
"file": "data_demo_pc/title.phd",
"path": "data_demo_pc/title.phd",
"type": "title_demo_pc",
"music": 0,
"music_track": 0,
"inherit_injections": false,
"injections": [
"data/injections/pda_model.bin",
@ -61,9 +61,9 @@
// Level 4: Current Position
{
"file": "data/current.phd",
"path": "data/current.phd",
"type": "current",
"music": 0,
"music_track": 0,
"inherit_injections": false,
"sequence": [
{"type": "exit_to_title"},

View file

@ -31,9 +31,9 @@
"levels": [
// Level 0: Return to Egypt
{
"file": "data/egypt.phd",
"path": "data/egypt.phd",
"type": "normal",
"music": 59,
"music_track": 59,
"injections": [
"data/injections/egypt_cameras.bin",
"data/injections/egypt_fd.bin",
@ -52,9 +52,9 @@
// Level 1: Temple of the Cat
{
"file": "data/cat.phd",
"path": "data/cat.phd",
"type": "normal",
"music": 59,
"music_track": 59,
"injections": [
"data/injections/cat_cameras.bin",
"data/injections/cat_fd.bin",
@ -74,9 +74,9 @@
// Level 2: Atlantean Stronghold
{
"file": "data/end.phd",
"path": "data/end.phd",
"type": "normal",
"music": 60,
"music_track": 60,
"injections": [
"data/injections/stronghold_fd.bin",
"data/injections/stronghold_itemrots.bin",
@ -93,9 +93,9 @@
// Level 3: The Hive
{
"file": "data/end2.phd",
"path": "data/end2.phd",
"type": "normal",
"music": 60,
"music_track": 60,
"injections": [
"data/injections/hive_fd.bin",
"data/injections/hive_itemrots.bin",
@ -106,29 +106,29 @@
{"type": "play_level"},
{"type": "level_stats", "level_id": 3},
{"type": "play_synced_audio", "audio_id": 19},
{"type": "display_picture", "picture_path": "data/images/end.webp", "display_time": 7.5},
{"type": "display_picture", "picture_path": "data/images/credits_ub.webp", "display_time": 7.5},
{"type": "display_picture", "picture_path": "data/images/credits_1.webp", "display_time": 7.5},
{"type": "display_picture", "picture_path": "data/images/credits_2.webp", "display_time": 7.5},
{"type": "display_picture", "picture_path": "data/images/credits_3.webp", "display_time": 7.5},
{"type": "total_stats", "picture_path": "data/images/install.webp"},
{"type": "display_picture", "path": "data/images/end.webp", "display_time": 7.5},
{"type": "display_picture", "path": "data/images/credits_ub.webp", "display_time": 7.5},
{"type": "display_picture", "path": "data/images/credits_1.webp", "display_time": 7.5},
{"type": "display_picture", "path": "data/images/credits_2.webp", "display_time": 7.5},
{"type": "display_picture", "path": "data/images/credits_3.webp", "display_time": 7.5},
{"type": "total_stats", "background_path": "data/images/install.webp"},
{"type": "exit_to_title"},
],
},
// Level 4: Title
{
"file": "data/title.phd",
"path": "data/title.phd",
"type": "title",
"music": 2,
"music_track": 2,
"inherit_injections": false,
"injections": [
"data/injections/pda_model.bin",
],
"sequence": [
{"type": "display_picture", "picture_path": "data/images/eidos.webp", "display_time": 1},
{"type": "play_fmv", "fmv_num": 0},
{"type": "play_fmv", "fmv_num": 1},
{"type": "display_picture", "path": "data/images/eidos.webp", "display_time": 1},
{"type": "play_fmv", "fmv_id": 0},
{"type": "play_fmv", "fmv_id": 1},
{"type": "exit_to_title"},
],
},
@ -136,9 +136,9 @@
// Level 5: Current Position
{
"title": "Current Position",
"file": "data/current.phd",
"path": "data/current.phd",
"type": "current",
"music": 0,
"music_track": 0,
"inherit_injections": false,
"sequence": [{"type": "exit_to_title"}],
},

View file

@ -27,8 +27,8 @@
"music_track": 64,
"sequence": [
{"type": "display_picture", "path": "data/legal.pcx"},
{"type": "play_fmv", "fmv_num": 0},
{"type": "play_fmv", "fmv_num": 1},
{"type": "play_fmv", "fmv_id": 0},
{"type": "play_fmv", "fmv_id": 1},
],
},
@ -48,12 +48,12 @@
"path": "data/wall.tr2",
"music_track": 33,
"sequence": [
{"type": "play_fmv", "fmv_num": 2},
{"type": "play_fmv", "fmv_id": 2},
{"type": "add_secret_reward", "item": "grenade_launcher"},
{"type": "add_secret_reward", "item": "grenade_launcher_ammo", "qty": 2},
{"type": "add_secret_reward", "item": "small_medipack"},
{"type": "play_level"},
{"type": "play_cutscene", "cutscene_num": 0},
{"type": "play_cutscene", "cutscene_id": 0},
{"type": "level_complete"},
],
"injections": [
@ -92,7 +92,7 @@
{"type": "add_secret_reward", "item": "uzis"},
{"type": "add_secret_reward", "item": "uzis_ammo", "qty": 4},
{"type": "play_level"},
{"type": "play_cutscene", "cutscene_num": 1},
{"type": "play_cutscene", "cutscene_id": 1},
{"type": "level_complete"},
],
"injections": [
@ -106,7 +106,7 @@
"path": "data/rig.tr2",
"music_track": 58,
"sequence": [
{"type": "play_fmv", "fmv_num": 3},
{"type": "play_fmv", "fmv_id": 3},
{"type": "set_lara_start_anim", "anim": 8},
{"type": "remove_weapons"},
{"type": "add_secret_reward", "item": "uzis"},
@ -126,7 +126,7 @@
"sequence": [
{"type": "add_secret_reward", "item": "uzis_ammo", "qty": 4},
{"type": "play_level"},
{"type": "play_cutscene", "cutscene_num": 2},
{"type": "play_cutscene", "cutscene_id": 2},
{"type": "level_complete"},
],
"injections": [
@ -139,7 +139,7 @@
"path": "data/unwater.tr2",
"music_track": 34,
"sequence": [
{"type": "play_fmv", "fmv_num": 4},
{"type": "play_fmv", "fmv_id": 4},
{"type": "add_secret_reward", "item": "harpoon_gun_ammo", "qty": 4},
{"type": "play_level"},
{"type": "level_complete"},
@ -192,7 +192,7 @@
"path": "data/skidoo.tr2",
"music_track": 33,
"sequence": [
{"type": "play_fmv", "fmv_num": 5},
{"type": "play_fmv", "fmv_id": 5},
{"type": "give_item", "item": "puzzle_4"},
{"type": "add_secret_reward", "item": "uzis_ammo", "qty": 4},
{"type": "play_level"},
@ -255,10 +255,10 @@
"path": "data/emprtomb.tr2",
"music_track": 59,
"sequence": [
{"type": "play_fmv", "fmv_num": 6},
{"type": "play_fmv", "fmv_id": 6},
{"type": "add_secret_reward", "item": "uzis_ammo", "qty": 8},
{"type": "play_level"},
{"type": "play_cutscene", "cutscene_num": 3},
{"type": "play_cutscene", "cutscene_id": 3},
{"type": "level_complete"},
],
"injections": [
@ -291,7 +291,7 @@
{"type": "set_secret_count", "count": 0},
{"type": "play_level"},
{"type": "level_complete"},
{"type": "play_fmv", "fmv_num": 7},
{"type": "play_fmv", "fmv_id": 7},
],
},

View file

@ -38,7 +38,7 @@ various pieces of global behaviour.
},
"levels": [
{
"file": "data/gym.phd",
"path": "data/gym.phd",
// etc
},
],
@ -221,9 +221,9 @@ Following are each of the properties available within a level.
```json5
{
"file": "data/example.phd",
"path": "data/example.phd",
"type": "normal",
"music": 57,
"music_track": 57,
"lara_type": 0,
"water_color": [0.7, 0.5, 0.85],
"draw_distance_fade": 34.0,
@ -242,7 +242,7 @@ Following are each of the properties available within a level.
// etc
],
"sequence": [
{"type": "play_fmv", "fmv_num": 0},
{"type": "play_fmv", "fmv_id": 0},
{"type": "load_level"},
// etc
],
@ -345,7 +345,7 @@ Following are each of the properties available within a level.
</tr>
<tr valign="top">
<td>
<code>music</code>
<code>music_track</code>
</td>
<td>Integer</td>
<td>Yes</td>
@ -489,11 +489,11 @@ default gameflow for examples.
<code>display_picture</code>
</td>
<td>
<code>picture_path</code>
<code>path</code>
</td>
<td>String</td>
<td rowspan="2">
Displays the specified picture for the given number of seconds.
Displays the specified picture for the given number of seconds (default: 5).
</td>
</tr>
<tr valign="top">
@ -507,11 +507,11 @@ default gameflow for examples.
<code>loading_screen</code>
</td>
<td>
<code>picture_path</code>
<code>path</code>
</td>
<td>String</td>
<td rowspan="2">
Displays the specified picture for the given number of seconds. Functions identically to display_picture except these pictures can be enabled/disabled by the user with the loading screen option in the config tool.
Displays the specified picture for the given number of seconds (default: 5). Functions identically to display_picture except these pictures can be enabled/disabled by the user with the loading screen option in the config tool.
</td>
</tr>
<tr valign="top">
@ -618,11 +618,11 @@ default gameflow for examples.
<code>play_fmv</code>
</td>
<td>
<code>fmv_num</code>
<code>fmv_id</code>
</td>
<td>String</td>
<td>
Plays the specified FMV. <code>fmv_num</code> must be a valid index into
Plays the specified FMV. <code>fmv_id</code> must be a valid index into
the <code>fmvs</code> root key.
</td>
</tr>
@ -746,7 +746,7 @@ default gameflow for examples.
<code>total_stats</code>
</td>
<td>
<code>picture_path</code>
<code>path</code>
</td>
<td>String</td>
<td>
@ -779,9 +779,9 @@ game will exit to title.
},
{
"file": "data/level1.phd",
"path": "data/level1.phd",
"type": "normal",
"music": 57,
"music_track": 57,
"sequence": [
{"type": "load_level"},
{"type": "play_level"},
@ -791,9 +791,9 @@ game will exit to title.
},
{
"file": "data/level2.phd",
"path": "data/level2.phd",
"type": "normal",
"music": 57,
"music_track": 57,
"sequence": [
{"type": "load_level"},
{"type": "play_level"},
@ -803,27 +803,27 @@ game will exit to title.
},
{
"file": "data/level3.phd",
"path": "data/level3.phd",
"type": "normal",
"music": 57,
"music_track": 57,
"sequence": [
{"type": "load_level"},
{"type": "play_level"},
{"type": "level_stats", "level_id": 3},
{"type": "play_synced_audio", "audio_id": 19},
{"type": "display_picture", "picture_path": "data/end.pcx", "display_time": 7.5},
{"type": "display_picture", "picture_path": "data/cred1.pcx", "display_time": 7.5},
{"type": "display_picture", "picture_path": "data/cred2.pcx", "display_time": 7.5},
{"type": "display_picture", "picture_path": "data/cred3.pcx", "display_time": 7.5},
{"type": "total_stats", "picture_path": "data/install.pcx"},
{"type": "display_picture", "path": "data/end.pcx", "display_time": 7.5},
{"type": "display_picture", "path": "data/cred1.pcx", "display_time": 7.5},
{"type": "display_picture", "path": "data/cred2.pcx", "display_time": 7.5},
{"type": "display_picture", "path": "data/cred3.pcx", "display_time": 7.5},
{"type": "total_stats", "background_path": "data/install.pcx"},
{"type": "exit_to_level", "level_id": 4},
],
},
{
"file": "data/bonus1.phd",
"path": "data/bonus1.phd",
"type": "bonus",
"music": 57,
"music_track": 57,
"sequence": [
{"type": "play_fmv", "fmv_path": "fmv/snow.avi"},
{"type": "load_level"},
@ -833,23 +833,23 @@ game will exit to title.
},
{
"file": "data/bonus2.phd",
"path": "data/bonus2.phd",
"type": "bonus",
"music": 57,
"music_track": 57,
"sequence": [
{"type": "load_level"},
{"type": "play_level"},
{"type": "level_stats", "level_id": 5},
{"type": "play_synced_audio", "audio_id": 14},
{"type": "total_stats", "picture_path": "data/install.pcx"},
{"type": "total_stats", "background_path": "data/install.pcx"},
{"type": "exit_to_title"},
],
},
{
"file": "data/bonuscut1.phd",
"path": "data/bonuscut1.phd",
"type": "cutscene",
"music": 0,
"music_track": 0,
"sequence": [
{"type": "load_level"},
{"type": "set_cam_x", "value": 36668},
@ -887,9 +887,9 @@ the engine's overall item limit).
```json5
{
"file": "data/example.phd",
"path": "data/example.phd",
"type": "normal",
"music": 57,
"music_track": 57,
"item_drops": [
{"enemy_num": 17, "object_ids": [86]},
{"enemy_num": 50, "object_ids": [87]},

View file

@ -82,7 +82,7 @@ static M_SEQUENCE_EVENT_HANDLER m_SequenceEventHandlers[] = {
// Events with integer arguments
{ GFS_LOAD_LEVEL, M_HandleIntEvent, "level_id" },
{ GFS_PLAY_LEVEL, M_HandleIntEvent, "level_id" },
{ GFS_PLAY_FMV, M_HandleIntEvent, "fmv_num" },
{ GFS_PLAY_FMV, M_HandleIntEvent, "fmv_id" },
{ GFS_LEVEL_STATS, M_HandleIntEvent, "level_id" },
{ GFS_EXIT_TO_LEVEL, M_HandleIntEvent, "level_id" },
{ GFS_EXIT_TO_CINE, M_HandleIntEvent, "level_id" },
@ -149,22 +149,17 @@ static int32_t M_HandlePictureEvent(
JSON_OBJECT *event_obj, GAME_FLOW_SEQUENCE_EVENT *event, void *extra_data,
void *user_arg)
{
const char *const path =
JSON_ObjectGetString(event_obj, "picture_path", NULL);
const char *const path = JSON_ObjectGetString(event_obj, "path", NULL);
if (path == NULL) {
LOG_ERROR("Missing picture path");
return -1;
}
const float display_time =
JSON_ObjectGetDouble(event_obj, "display_time", -1.0);
if (display_time < 0.0) {
Shell_ExitSystemFmt("'display_time' must be a positive number");
}
if (event != NULL) {
GAME_FLOW_DISPLAY_PICTURE_DATA *const event_data = extra_data;
event_data->path =
(char *)extra_data + sizeof(GAME_FLOW_DISPLAY_PICTURE_DATA);
event_data->display_time = display_time;
event_data->display_time =
JSON_ObjectGetDouble(event_obj, "display_time", 5.0);
strcpy(event_data->path, path);
event->data = event_data;
}
@ -176,7 +171,7 @@ static int32_t M_HandleTotalStatsEvent(
void *user_arg)
{
const char *const path =
JSON_ObjectGetString(event_obj, "picture_path", NULL);
JSON_ObjectGetString(event_obj, "background_path", NULL);
if (path == NULL) {
LOG_ERROR("Missing picture path");
return -1;
@ -396,14 +391,14 @@ static void M_LoadLevels(JSON_OBJECT *const obj, GAME_FLOW *const gf)
int32_t tmp_i;
JSON_ARRAY *tmp_arr;
tmp_i = JSON_ObjectGetInt(jlvl_obj, "music", JSON_INVALID_NUMBER);
tmp_i = JSON_ObjectGetInt(jlvl_obj, "music_track", JSON_INVALID_NUMBER);
if (tmp_i == JSON_INVALID_NUMBER) {
Shell_ExitSystemFmt(
"level %d: 'music' must be a number", level_num);
"level %d: 'music_track' must be a number", level_num);
}
level->music_track = tmp_i;
tmp_s = JSON_ObjectGetString(jlvl_obj, "file", JSON_INVALID_STRING);
tmp_s = JSON_ObjectGetString(jlvl_obj, "path", JSON_INVALID_STRING);
if (tmp_s == JSON_INVALID_STRING) {
Shell_ExitSystemFmt("level %d: 'file' must be a string", level_num);
}

View file

@ -102,12 +102,12 @@ GF_InterpretSequence(int32_t level_num, GAME_FLOW_LEVEL_TYPE level_type)
break;
case GFS_PLAY_FMV: {
const int16_t fmv_num = (int16_t)(intptr_t)event->data;
const int16_t fmv_id = (int16_t)(intptr_t)event->data;
if (level_type != GFL_SAVED) {
if (fmv_num < 0 || fmv_num >= g_GameFlow.fmv_count) {
LOG_ERROR("Invalid FMV number: %d", fmv_num);
if (fmv_id < 0 || fmv_id >= g_GameFlow.fmv_count) {
LOG_ERROR("Invalid FMV number: %d", fmv_id);
} else {
FMV_Play(g_GameFlow.fmvs[fmv_num].path);
FMV_Play(g_GameFlow.fmvs[fmv_id].path);
}
}
break;
@ -320,11 +320,11 @@ GF_StorySoFar(const GAME_FLOW_SEQUENCE *const sequence, int32_t savegame_level)
}
case GFS_PLAY_FMV: {
const int16_t fmv_num = (int16_t)(intptr_t)event->data;
if (fmv_num < 0 || fmv_num >= g_GameFlow.fmv_count) {
LOG_ERROR("Invalid FMV number: %d", fmv_num);
const int16_t fmv_id = (int16_t)(intptr_t)event->data;
if (fmv_id < 0 || fmv_id >= g_GameFlow.fmv_count) {
LOG_ERROR("Invalid FMV number: %d", fmv_id);
} else {
FMV_Play(g_GameFlow.fmvs[fmv_num].path);
FMV_Play(g_GameFlow.fmvs[fmv_id].path);
}
break;
}

View file

@ -80,9 +80,9 @@ static M_SEQUENCE_EVENT_HANDLER m_SequenceEventHandlers[] = {
{ GFS_SET_NUM_SECRETS, M_HandleIntEvent, "count" },
{ GFS_SET_CAMERA_ANGLE, M_HandleIntEvent, "angle" },
{ GFS_SET_START_ANIM, M_HandleIntEvent, "anim" },
{ GFS_PLAY_LEVEL, M_HandleIntEvent, "level_num" },
{ GFS_PLAY_CUTSCENE, M_HandleIntEvent, "cutscene_num" },
{ GFS_PLAY_FMV, M_HandleIntEvent, "fmv_num" },
{ GFS_PLAY_LEVEL, M_HandleIntEvent, "level_id" },
{ GFS_PLAY_CUTSCENE, M_HandleIntEvent, "cutscene_id" },
{ GFS_PLAY_FMV, M_HandleIntEvent, "fmv_id" },
{ GFS_DISABLE_FLOOR, M_HandleIntEvent, "height" },
// Special cases with custom handlers
@ -142,9 +142,10 @@ static int32_t M_HandlePictureEvent(
}
if (event != NULL) {
GAME_FLOW_DISPLAY_PICTURE_DATA *const event_data = extra_data;
event_data->duration = JSON_ObjectGetDouble(event_obj, "duration", 6.0);
event_data->path =
(char *)extra_data + sizeof(GAME_FLOW_DISPLAY_PICTURE_DATA);
event_data->display_time =
JSON_ObjectGetDouble(event_obj, "display_time", 5.0);
strcpy(event_data->path, path);
event->data = event_data;
}

View file

@ -106,7 +106,7 @@ GAME_FLOW_COMMAND GF_InterpretSequence(
(GAME_FLOW_DISPLAY_PICTURE_DATA *)event->data;
PHASE *const phase = Phase_Picture_Create((PHASE_PICTURE_ARGS) {
.file_name = data->path,
.display_time = data->duration,
.display_time = data->display_time,
.fade_in_time = 1.0,
.fade_out_time = 1.0 / 3.0,
.display_time_includes_fades = true,
@ -146,12 +146,12 @@ GAME_FLOW_COMMAND GF_InterpretSequence(
}
case GFS_PLAY_FMV: {
const int16_t fmv_num = (int16_t)(intptr_t)event->data;
const int16_t fmv_id = (int16_t)(intptr_t)event->data;
if (type != GFL_SAVED) {
if (fmv_num < 0 || fmv_num >= g_GameFlow.fmv_count) {
LOG_ERROR("Invalid FMV number: %d", fmv_num);
if (fmv_id < 0 || fmv_id >= g_GameFlow.fmv_count) {
LOG_ERROR("Invalid FMV number: %d", fmv_id);
} else {
FMV_Play(g_GameFlow.fmvs[fmv_num].path);
FMV_Play(g_GameFlow.fmvs[fmv_id].path);
}
}
break;

View file

@ -22,7 +22,7 @@ typedef struct {
typedef struct {
char *path;
float duration;
float display_time;
} GAME_FLOW_DISPLAY_PICTURE_DATA;
typedef enum {

View file

@ -219,23 +219,23 @@ def transform_script(script: list[int]):
pass
case GameFlowEvent.PLAY_FMV:
fmv_num = script.pop(0)
yield {"type": "play_fmv", "fmv_num": fmv_num}
fmv_id = script.pop(0)
yield {"type": "play_fmv", "fmv_id": fmv_id}
case GameFlowEvent.START_LEVEL:
level_num = script.pop(0)
yield {"type": "play_level", "level_num": level_num}
level_id = script.pop(0)
yield {"type": "play_level", "level_id": level_id}
case GameFlowEvent.CUTSCENE:
cutscene_num = script.pop(0)
yield {"type": "play_level", "cutscene_num": cutscene_num}
cutscene_id = script.pop(0)
yield {"type": "play_level", "cutscene_id": cutscene_id}
case GameFlowEvent.LEVEL_COMPLETE:
yield {"type": "level_complete"}
case GameFlowEvent.DEMO_PLAY:
demo_num = script.pop(0)
yield {"type": "play_level", "level_num": demo_num}
yield {"type": "play_level", "level_id": demo_num}
case GameFlowEvent.JUMP_TO_SEQ:
seq_num = script.pop(0)