Showing preview only (9,302K chars total). Download the full file or copy to clipboard to get everything.
Repository: LostArtefacts/TR1X
Branch: develop
Commit: 23607f8db368
Files: 1612
Total size: 8.5 MB
Directory structure:
gitextract_glsblazi/
├── .clang-format
├── .dockerignore
├── .editorconfig
├── .github/
│ ├── CODEOWNERS
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.yml
│ │ ├── config.yml
│ │ └── feature_request.yml
│ ├── actions/
│ │ └── prepare_macos_tooling/
│ │ └── action.yml
│ ├── docker/
│ │ └── lint.Dockerfile
│ ├── pull_request_template.md
│ └── workflows/
│ ├── build_docker.yml
│ ├── build_lint_image.yml
│ ├── comment_build.yml
│ ├── job_build.yml
│ ├── job_build_macos.yml
│ ├── job_release.yml
│ ├── lint.yml
│ ├── pr_builds.yml
│ ├── prerelease.yml
│ └── release.yml
├── .gitignore
├── .gitmodules
├── .pre-commit-config.yaml
├── BUG_REPORTING.md
├── CODE_OF_CONDUCT.md
├── COPYING.md
├── README.md
├── data/
│ ├── common/
│ │ └── glyphs/
│ │ ├── mapping.txt
│ │ ├── mapping_basic_latin.txt
│ │ ├── mapping_combining_diactrics.txt
│ │ ├── mapping_controller.txt
│ │ ├── mapping_cyrillic.txt
│ │ ├── mapping_greek_and_coptic.txt
│ │ ├── mapping_icons.txt
│ │ ├── mapping_keyboard.txt
│ │ ├── mapping_latin-1_supplement.txt
│ │ ├── mapping_latin_extended-a.txt
│ │ ├── mapping_latin_extended-b.txt
│ │ ├── mapping_latin_extended_additional.txt
│ │ ├── mapping_misc.txt
│ │ └── mapping_small.txt
│ ├── scripting/
│ │ ├── assault_stats.lua
│ │ ├── camera.lua
│ │ ├── catalog.lua
│ │ ├── config.lua
│ │ ├── console.lua
│ │ ├── creatures.lua
│ │ ├── events.lua
│ │ ├── game.lua
│ │ ├── items.lua
│ │ ├── lara.lua
│ │ ├── log.lua
│ │ ├── music.lua
│ │ ├── objects.lua
│ │ ├── rooms.lua
│ │ └── sound.lua
│ ├── tomb-11.bdf
│ ├── tr1/
│ │ └── mac/
│ │ ├── Info.plist
│ │ └── icon.icns
│ ├── tr2/
│ │ └── mac/
│ │ ├── Info.plist
│ │ └── icon.icns
│ ├── tr3/
│ │ ├── glyphs/
│ │ │ ├── mapping_basic_latin.txt
│ │ │ ├── mapping_combining_diactrics.txt
│ │ │ ├── mapping_cyrillic.txt
│ │ │ ├── mapping_greek_and_coptic.txt
│ │ │ ├── mapping_latin-1_supplement.txt
│ │ │ ├── mapping_latin_extended-a.txt
│ │ │ ├── mapping_latin_extended-b.txt
│ │ │ ├── mapping_latin_extended_additional.txt
│ │ │ ├── mapping_misc.txt
│ │ │ └── mapping_small.txt
│ │ └── mac/
│ │ ├── Info.plist
│ │ └── icon.icns
│ └── trx/
│ ├── icon.rc
│ ├── ship/
│ │ ├── cfg/
│ │ │ ├── base_strings-de.json5
│ │ │ ├── base_strings-en-gb.json5
│ │ │ ├── base_strings-fr.json5
│ │ │ ├── base_strings-gd.json5
│ │ │ ├── base_strings-it.json5
│ │ │ ├── base_strings-pl.json5
│ │ │ ├── base_strings-ru.json5
│ │ │ ├── base_strings.json5
│ │ │ ├── outfits.json5
│ │ │ ├── poses.json5
│ │ │ ├── presets/
│ │ │ │ ├── tr1-pc.json5
│ │ │ │ ├── tr1-ps1.json5
│ │ │ │ ├── tr2-pc.json5
│ │ │ │ ├── tr2-ps1.json5
│ │ │ │ ├── tr3-pc.json5
│ │ │ │ └── tr3-ps1.json5
│ │ │ ├── shaders/
│ │ │ │ ├── 2d.glsl
│ │ │ │ ├── billboard.glsl
│ │ │ │ ├── common.glsl
│ │ │ │ ├── fbo.glsl
│ │ │ │ ├── lights.glsl
│ │ │ │ ├── meshes.glsl
│ │ │ │ ├── meshes_tr12.glsl
│ │ │ │ ├── meshes_tr3.glsl
│ │ │ │ └── ui.glsl
│ │ │ └── ui.json5
│ │ └── games/
│ │ ├── tr1/
│ │ │ ├── catalog_item_actions.csv
│ │ │ ├── catalog_lara_anims.csv
│ │ │ ├── catalog_lara_states.csv
│ │ │ ├── catalog_music.csv
│ │ │ ├── catalog_objects.csv
│ │ │ ├── catalog_samples.csv
│ │ │ ├── gameflow.json5
│ │ │ ├── inv_ring.json5
│ │ │ ├── scripts/
│ │ │ │ └── gym.lua
│ │ │ ├── strings-de.json5
│ │ │ ├── strings-en-gb.json5
│ │ │ ├── strings-fr.json5
│ │ │ ├── strings-gd.json5
│ │ │ ├── strings-it.json5
│ │ │ ├── strings-pl.json5
│ │ │ ├── strings-ru.json5
│ │ │ ├── strings.json5
│ │ │ └── weapons.json5
│ │ ├── tr1-demo-pc/
│ │ │ ├── gameflow.json5
│ │ │ ├── strings-de.json5
│ │ │ ├── strings-fr.json5
│ │ │ ├── strings-gd.json5
│ │ │ ├── strings-it.json5
│ │ │ ├── strings-pl.json5
│ │ │ ├── strings-ru.json5
│ │ │ └── strings.json5
│ │ ├── tr1-level/
│ │ │ ├── gameflow.json5
│ │ │ ├── strings-de.json5
│ │ │ ├── strings-fr.json5
│ │ │ ├── strings-gd.json5
│ │ │ ├── strings-it.json5
│ │ │ ├── strings-pl.json5
│ │ │ ├── strings-ru.json5
│ │ │ └── strings.json5
│ │ ├── tr1-ub/
│ │ │ ├── gameflow.json5
│ │ │ ├── strings-de.json5
│ │ │ ├── strings-fr.json5
│ │ │ ├── strings-gd.json5
│ │ │ ├── strings-it.json5
│ │ │ ├── strings-pl.json5
│ │ │ ├── strings-ru.json5
│ │ │ └── strings.json5
│ │ ├── tr2/
│ │ │ ├── catalog_item_actions.csv
│ │ │ ├── catalog_lara_anims.csv
│ │ │ ├── catalog_lara_states.csv
│ │ │ ├── catalog_music.csv
│ │ │ ├── catalog_objects.csv
│ │ │ ├── catalog_samples.csv
│ │ │ ├── gameflow.json5
│ │ │ ├── inv_ring.json5
│ │ │ ├── scripts/
│ │ │ │ ├── assault.lua
│ │ │ │ ├── cut3.lua
│ │ │ │ ├── floating.lua
│ │ │ │ ├── house.lua
│ │ │ │ ├── level1.lua
│ │ │ │ ├── level3.lua
│ │ │ │ ├── level4.lua
│ │ │ │ └── monastry.lua
│ │ │ ├── strings-de.json5
│ │ │ ├── strings-en-gb.json5
│ │ │ ├── strings-fr.json5
│ │ │ ├── strings-gd.json5
│ │ │ ├── strings-it.json5
│ │ │ ├── strings-pl.json5
│ │ │ ├── strings.json5
│ │ │ └── weapons.json5
│ │ ├── tr2-gm/
│ │ │ ├── gameflow.json5
│ │ │ ├── strings-de.json5
│ │ │ ├── strings-fr.json5
│ │ │ ├── strings-gd.json5
│ │ │ ├── strings-it.json5
│ │ │ ├── strings-pl.json5
│ │ │ └── strings.json5
│ │ ├── tr2-level/
│ │ │ ├── gameflow.json5
│ │ │ ├── strings-de.json5
│ │ │ ├── strings-fr.json5
│ │ │ ├── strings-gd.json5
│ │ │ ├── strings-it.json5
│ │ │ ├── strings-pl.json5
│ │ │ └── strings.json5
│ │ ├── tr3/
│ │ │ ├── catalog_item_actions.csv
│ │ │ ├── catalog_lara_anims.csv
│ │ │ ├── catalog_lara_states.csv
│ │ │ ├── catalog_music.csv
│ │ │ ├── catalog_objects.csv
│ │ │ ├── catalog_samples.csv
│ │ │ ├── gameflow.json5
│ │ │ ├── inv_ring.json5
│ │ │ ├── scripts/
│ │ │ │ ├── area51.lua
│ │ │ │ ├── compound.lua
│ │ │ │ ├── crash.lua
│ │ │ │ ├── cut8.lua
│ │ │ │ ├── jungle.lua
│ │ │ │ ├── mines.lua
│ │ │ │ ├── tower.lua
│ │ │ │ └── zoo.lua
│ │ │ ├── strings-de.json5
│ │ │ ├── strings-it.json5
│ │ │ ├── strings-pl.json5
│ │ │ ├── strings.json5
│ │ │ └── weapons.json5
│ │ ├── tr3-la/
│ │ │ ├── gameflow.json5
│ │ │ ├── strings-de.json5
│ │ │ ├── strings-it.json5
│ │ │ ├── strings-pl.json5
│ │ │ └── strings.json5
│ │ └── tr3-level/
│ │ ├── gameflow.json5
│ │ ├── strings-it.json5
│ │ ├── strings-pl.json5
│ │ └── strings.json5
│ └── version.rc
├── docs/
│ ├── BUILDING.md
│ ├── BUILDING_ON_LINUX.md
│ ├── BUILDING_ON_MACOS.md
│ ├── BUILDING_ON_WINDOWS.md
│ ├── CHANGELOG.md
│ ├── CHANGE_SUBMISSION.md
│ ├── CODING_GUIDELINES.md
│ ├── CONTRIBUTING.md
│ ├── GLOSSARY.md
│ ├── RELEASING.md
│ ├── SECRETS.md
│ ├── gameflow.schema.json
│ ├── tr1/
│ │ ├── CHANGELOG.md
│ │ └── INSTALLING.md
│ ├── tr2/
│ │ ├── CHANGELOG.md
│ │ ├── INSTALLING.md
│ │ └── symbols.txt
│ ├── tr3/
│ │ └── INSTALLING.md
│ └── trx/
│ ├── CATALOGS.md
│ ├── COMMANDS.md
│ ├── COMMAND_LINE.md
│ ├── ENEMY_DEFAULTS.md
│ ├── GAME_STRINGS.md
│ ├── INJECTIONS.md
│ ├── INSTALLING.md
│ ├── LEVELS.md
│ ├── MIGRATING.md
│ ├── MUSIC.md
│ ├── OUTFITS.md
│ ├── SAMPLES.md
│ ├── SUPPORT.md
│ ├── WATER_COLORS.md
│ ├── WEAPONS.md
│ ├── game_flow/
│ │ ├── COMMANDS.md
│ │ ├── GLOBAL_PROPERTIES.md
│ │ ├── README.md
│ │ ├── SEQUENCES.md
│ │ ├── USER_CONFIGURATION.md
│ │ └── levels/
│ │ ├── BONUS_LEVELS.md
│ │ ├── CUTSCENE_PROPERTIES.md
│ │ ├── DEMO_PROPERTIES.md
│ │ ├── FMV_PROPERTIES.md
│ │ ├── ITEM_DROPS.md
│ │ ├── README.md
│ │ └── REGULAR_LEVELS.md
│ ├── lua/
│ │ ├── GETTING_STARTED.md
│ │ ├── README.md
│ │ ├── examples/
│ │ │ └── README.md
│ │ └── reference/
│ │ ├── ASSAULT_STATS.md
│ │ ├── CAMERA.md
│ │ ├── CATALOG.md
│ │ ├── CONFIG.md
│ │ ├── CONSOLE.md
│ │ ├── CREATURE.md
│ │ ├── EVENTS.md
│ │ ├── GAME.md
│ │ ├── ITEMS.md
│ │ ├── LARA.md
│ │ ├── LOGGING.md
│ │ ├── MISC.md
│ │ ├── MUSIC.md
│ │ ├── OBJECTS.md
│ │ ├── README.md
│ │ ├── ROOMS.md
│ │ └── SOUND.md
│ └── water_colors.yml
├── justfile
├── justfile.tr1
├── justfile.tr2
├── justfile.tr3
├── src/
│ ├── meson.build
│ ├── meson.options
│ ├── subprojects/
│ │ ├── dwarfstack.wrap
│ │ └── packagefiles/
│ │ └── dwarfstack/
│ │ └── meson.build
│ └── trx/
│ ├── av/
│ │ ├── audio.c
│ │ ├── audio.h
│ │ ├── audio_internal.h
│ │ ├── audio_reverb.c
│ │ ├── audio_sample.c
│ │ ├── audio_stream.c
│ │ ├── image.c
│ │ ├── image.h
│ │ ├── video.c
│ │ └── video.h
│ ├── config/
│ │ ├── common.c
│ │ ├── common.h
│ │ ├── const.h
│ │ ├── dynamic_enum.c
│ │ ├── dynamic_enum.h
│ │ ├── enum.c
│ │ ├── enum.h
│ │ ├── file.c
│ │ ├── file.h
│ │ ├── map.c
│ │ ├── map.def
│ │ ├── map_tr1.def
│ │ ├── map_tr2.def
│ │ ├── map_tr3.def
│ │ ├── option.h
│ │ ├── presets.c
│ │ ├── presets.h
│ │ ├── priv.c
│ │ ├── priv.h
│ │ ├── types.h
│ │ ├── vars.c
│ │ └── vars.h
│ ├── config.h
│ ├── core/
│ │ ├── benchmark.c
│ │ ├── benchmark.h
│ │ ├── bson/
│ │ │ ├── enum.h
│ │ │ ├── parse.c
│ │ │ ├── parse.h
│ │ │ ├── types.h
│ │ │ ├── write.c
│ │ │ └── write.h
│ │ ├── bson.h
│ │ ├── colors.c
│ │ ├── colors.h
│ │ ├── enum_map.c
│ │ ├── enum_map.h
│ │ ├── event_manager.c
│ │ ├── event_manager.h
│ │ ├── filesystem.c
│ │ ├── filesystem.h
│ │ ├── hash.c
│ │ ├── hash.h
│ │ ├── json/
│ │ │ ├── base.c
│ │ │ ├── base.h
│ │ │ ├── enum.h
│ │ │ ├── parse.c
│ │ │ ├── parse.h
│ │ │ ├── types.h
│ │ │ ├── util/
│ │ │ │ ├── file.c
│ │ │ │ ├── file.h
│ │ │ │ ├── read_io.c
│ │ │ │ ├── read_io.h
│ │ │ │ ├── write_io.c
│ │ │ │ └── write_io.h
│ │ │ ├── write.c
│ │ │ └── write.h
│ │ ├── json.h
│ │ ├── log.c
│ │ ├── log.h
│ │ ├── log_linux.c
│ │ ├── log_unknown.c
│ │ ├── log_windows.c
│ │ ├── math/
│ │ │ ├── const.h
│ │ │ ├── func.c
│ │ │ ├── func.h
│ │ │ ├── geom.c
│ │ │ ├── geom.h
│ │ │ ├── trig.c
│ │ │ ├── trig.h
│ │ │ ├── types.h
│ │ │ ├── util.c
│ │ │ └── util.h
│ │ ├── math.h
│ │ ├── memory.c
│ │ ├── memory.h
│ │ ├── shell.h
│ │ ├── strings/
│ │ │ ├── case_funcs.c
│ │ │ ├── case_map.def
│ │ │ ├── common.c
│ │ │ ├── common.h
│ │ │ ├── fuzzy_match.c
│ │ │ └── fuzzy_match.h
│ │ ├── strings.h
│ │ ├── thread_pool.c
│ │ ├── thread_pool.h
│ │ ├── utils.h
│ │ ├── vector.c
│ │ ├── vector.h
│ │ ├── virtual_file.c
│ │ └── virtual_file.h
│ ├── debug.h
│ ├── game/
│ │ ├── anims/
│ │ │ ├── commands.c
│ │ │ ├── common.c
│ │ │ ├── common.h
│ │ │ ├── enum.h
│ │ │ ├── frames.c
│ │ │ └── types.h
│ │ ├── anims.h
│ │ ├── camera/
│ │ │ ├── box_camera.c
│ │ │ ├── cinematic.c
│ │ │ ├── cinematic.h
│ │ │ ├── common.c
│ │ │ ├── common.h
│ │ │ ├── const.h
│ │ │ ├── enum.h
│ │ │ ├── environment.c
│ │ │ ├── environment.h
│ │ │ ├── fixed.c
│ │ │ ├── fixed.h
│ │ │ ├── los_camera.c
│ │ │ ├── photo_mode.c
│ │ │ ├── photo_mode.h
│ │ │ ├── types.h
│ │ │ ├── vars.c
│ │ │ └── vars.h
│ │ ├── camera.h
│ │ ├── catalog/
│ │ │ ├── item_actions.def
│ │ │ ├── lara_anims.def
│ │ │ ├── lara_states.def
│ │ │ ├── manager.c
│ │ │ ├── manager.h
│ │ │ ├── music.def
│ │ │ ├── objects.def
│ │ │ └── samples.def
│ │ ├── clock/
│ │ │ ├── common.c
│ │ │ ├── common.h
│ │ │ ├── const.h
│ │ │ ├── timer.c
│ │ │ ├── timer.h
│ │ │ ├── turbo.c
│ │ │ └── turbo.h
│ │ ├── clock.h
│ │ ├── collision/
│ │ │ ├── common.c
│ │ │ ├── common.h
│ │ │ ├── los.c
│ │ │ ├── los.h
│ │ │ └── types.h
│ │ ├── collision.h
│ │ ├── console/
│ │ │ ├── cmd/
│ │ │ │ ├── clear.c
│ │ │ │ ├── config.c
│ │ │ │ ├── config.h
│ │ │ │ ├── debug.c
│ │ │ │ ├── die.c
│ │ │ │ ├── easy_config.c
│ │ │ │ ├── end_level.c
│ │ │ │ ├── exit_game.c
│ │ │ │ ├── exit_to_title.c
│ │ │ │ ├── flipmap.c
│ │ │ │ ├── flood.c
│ │ │ │ ├── fly.c
│ │ │ │ ├── give_item.c
│ │ │ │ ├── give_secret.c
│ │ │ │ ├── heal.c
│ │ │ │ ├── help.c
│ │ │ │ ├── immune.c
│ │ │ │ ├── inf_sprint.c
│ │ │ │ ├── kill.c
│ │ │ │ ├── load_game.c
│ │ │ │ ├── lua.c
│ │ │ │ ├── mod.c
│ │ │ │ ├── music.c
│ │ │ │ ├── play_cutscene.c
│ │ │ │ ├── play_demo.c
│ │ │ │ ├── play_gym.c
│ │ │ │ ├── play_level.c
│ │ │ │ ├── pos.c
│ │ │ │ ├── save_game.c
│ │ │ │ ├── screenshot.c
│ │ │ │ ├── set_health.c
│ │ │ │ ├── sfx.c
│ │ │ │ ├── spawn.c
│ │ │ │ ├── speed.c
│ │ │ │ ├── strings.c
│ │ │ │ ├── teleport.c
│ │ │ │ ├── test_text.c
│ │ │ │ ├── trigger.c
│ │ │ │ ├── weather.c
│ │ │ │ └── winston.c
│ │ │ ├── common.c
│ │ │ ├── common.h
│ │ │ ├── enum.h
│ │ │ ├── history.c
│ │ │ ├── history.h
│ │ │ ├── internal.h
│ │ │ ├── registry.c
│ │ │ ├── registry.h
│ │ │ └── types.h
│ │ ├── console.h
│ │ ├── const.h
│ │ ├── creature/
│ │ │ ├── alert.c
│ │ │ ├── alert.h
│ │ │ ├── behavior.c
│ │ │ ├── common.c
│ │ │ ├── common.h
│ │ │ ├── const.h
│ │ │ ├── enum.h
│ │ │ ├── shooting.c
│ │ │ └── types.h
│ │ ├── creature.h
│ │ ├── cutscene.c
│ │ ├── cutscene.h
│ │ ├── demo.c
│ │ ├── demo.h
│ │ ├── effects/
│ │ │ ├── const.h
│ │ │ ├── draw.c
│ │ │ ├── draw.h
│ │ │ ├── manager.c
│ │ │ ├── manager.h
│ │ │ └── types.h
│ │ ├── effects.h
│ │ ├── enum.c
│ │ ├── events.c
│ │ ├── events.h
│ │ ├── fader.c
│ │ ├── fader.h
│ │ ├── fmv.c
│ │ ├── fmv.h
│ │ ├── fx/
│ │ │ ├── common.c
│ │ │ ├── common.h
│ │ │ ├── explosion_ring.c
│ │ │ ├── explosion_ring.h
│ │ │ ├── footprint.c
│ │ │ ├── footprint.h
│ │ │ ├── gun_flash.c
│ │ │ ├── gun_flash.h
│ │ │ ├── laser.c
│ │ │ ├── laser.h
│ │ │ ├── wake.c
│ │ │ ├── wake.h
│ │ │ ├── water.c
│ │ │ ├── water.h
│ │ │ ├── water_particles.c
│ │ │ ├── water_particles.h
│ │ │ ├── weather.c
│ │ │ └── weather.h
│ │ ├── fx.h
│ │ ├── game/
│ │ │ ├── control.c
│ │ │ ├── control.h
│ │ │ ├── draw.c
│ │ │ ├── draw.h
│ │ │ ├── enum.h
│ │ │ ├── state.c
│ │ │ └── state.h
│ │ ├── game.h
│ │ ├── game_buf.c
│ │ ├── game_buf.h
│ │ ├── game_flow/
│ │ │ ├── common.c
│ │ │ ├── common.h
│ │ │ ├── enum.h
│ │ │ ├── inventory.c
│ │ │ ├── inventory.h
│ │ │ ├── reader.c
│ │ │ ├── reader.h
│ │ │ ├── sequencer.c
│ │ │ ├── sequencer.h
│ │ │ ├── sequencer_events.c
│ │ │ ├── sequencer_events.h
│ │ │ ├── sequencer_misc.c
│ │ │ ├── types.h
│ │ │ ├── util.c
│ │ │ ├── util.h
│ │ │ ├── vars.c
│ │ │ └── vars.h
│ │ ├── game_flow.h
│ │ ├── game_strings/
│ │ │ ├── entries.c
│ │ │ ├── entries.def
│ │ │ ├── entries.h
│ │ │ ├── manager.c
│ │ │ ├── manager.h
│ │ │ ├── table/
│ │ │ │ ├── common.c
│ │ │ │ ├── priv.c
│ │ │ │ ├── priv.h
│ │ │ │ └── reader.c
│ │ │ └── table.h
│ │ ├── gun/
│ │ │ ├── common.c
│ │ │ ├── common.h
│ │ │ ├── control.c
│ │ │ ├── control.h
│ │ │ ├── misc.c
│ │ │ ├── misc.h
│ │ │ ├── pistols.c
│ │ │ ├── pistols.h
│ │ │ ├── rifle.c
│ │ │ ├── rifle.h
│ │ │ ├── smashing.c
│ │ │ ├── smashing.h
│ │ │ ├── smoke.c
│ │ │ ├── smoke.h
│ │ │ ├── types.h
│ │ │ ├── vars.c
│ │ │ └── vars.h
│ │ ├── gun.h
│ │ ├── gym.c
│ │ ├── gym.h
│ │ ├── inject/
│ │ │ ├── common.c
│ │ │ ├── common.h
│ │ │ ├── data/
│ │ │ │ ├── anims.c
│ │ │ │ ├── camera.c
│ │ │ │ ├── meshes.c
│ │ │ │ ├── objects.c
│ │ │ │ ├── sound.c
│ │ │ │ └── textures.c
│ │ │ ├── editor.c
│ │ │ ├── editor.h
│ │ │ ├── editors/
│ │ │ │ ├── anims.c
│ │ │ │ ├── floor_data.c
│ │ │ │ ├── items.c
│ │ │ │ ├── meshes.c
│ │ │ │ ├── objects.c
│ │ │ │ ├── rooms.c
│ │ │ │ └── textures.c
│ │ │ ├── enum.h
│ │ │ ├── testers/
│ │ │ │ ├── items.c
│ │ │ │ └── rooms.c
│ │ │ ├── types.h
│ │ │ ├── utils.c
│ │ │ └── utils.h
│ │ ├── inject.h
│ │ ├── input/
│ │ │ ├── backends/
│ │ │ │ ├── base.h
│ │ │ │ ├── controller.c
│ │ │ │ ├── controller.def
│ │ │ │ ├── controller.h
│ │ │ │ ├── internal.c
│ │ │ │ ├── internal.h
│ │ │ │ ├── keyboard.c
│ │ │ │ ├── keyboard.def
│ │ │ │ └── keyboard.h
│ │ │ ├── combo.c
│ │ │ ├── combo.h
│ │ │ ├── common.c
│ │ │ ├── common.h
│ │ │ ├── roles.def
│ │ │ └── update.c
│ │ ├── input.h
│ │ ├── interpolation.c
│ │ ├── interpolation.h
│ │ ├── inventory.c
│ │ ├── inventory.h
│ │ ├── inventory_ring/
│ │ │ ├── control.c
│ │ │ ├── control.h
│ │ │ ├── draw.c
│ │ │ ├── draw.h
│ │ │ ├── enum.h
│ │ │ ├── priv.c
│ │ │ ├── priv.h
│ │ │ ├── types.h
│ │ │ ├── vars.c
│ │ │ └── vars.h
│ │ ├── inventory_ring.h
│ │ ├── items/
│ │ │ ├── actions/
│ │ │ │ ├── common.c
│ │ │ │ ├── effects.c
│ │ │ │ ├── footprint.c
│ │ │ │ ├── general.c
│ │ │ │ ├── gym_tr3.c
│ │ │ │ ├── ids.c
│ │ │ │ ├── ids.h
│ │ │ │ ├── items.c
│ │ │ │ └── lara.c
│ │ │ ├── actions.h
│ │ │ ├── anim.c
│ │ │ ├── anim.h
│ │ │ ├── carrier.c
│ │ │ ├── carrier.h
│ │ │ ├── col.c
│ │ │ ├── col.h
│ │ │ ├── const.h
│ │ │ ├── draw.c
│ │ │ ├── draw.h
│ │ │ ├── enum.h
│ │ │ ├── manager.c
│ │ │ ├── manager.h
│ │ │ ├── types.h
│ │ │ ├── utils.c
│ │ │ ├── utils.h
│ │ │ ├── walkable.c
│ │ │ └── walkable.h
│ │ ├── items.h
│ │ ├── lara/
│ │ │ ├── breath.c
│ │ │ ├── breath.h
│ │ │ ├── cheat.c
│ │ │ ├── cheat.h
│ │ │ ├── cheat_keys.c
│ │ │ ├── cheat_keys.h
│ │ │ ├── col/
│ │ │ │ ├── climb.c
│ │ │ │ ├── crouch.c
│ │ │ │ ├── jump.c
│ │ │ │ ├── land.c
│ │ │ │ ├── monkey.c
│ │ │ │ └── swim.c
│ │ │ ├── col.c
│ │ │ ├── col.h
│ │ │ ├── common.c
│ │ │ ├── common.h
│ │ │ ├── const.h
│ │ │ ├── control.c
│ │ │ ├── control.h
│ │ │ ├── draw.c
│ │ │ ├── draw.h
│ │ │ ├── electric.c
│ │ │ ├── electric.h
│ │ │ ├── enum.h
│ │ │ ├── flare.c
│ │ │ ├── flare.h
│ │ │ ├── hair.c
│ │ │ ├── hair.h
│ │ │ ├── look.c
│ │ │ ├── look.h
│ │ │ ├── mesh.c
│ │ │ ├── mesh.h
│ │ │ ├── misc.c
│ │ │ ├── misc.h
│ │ │ ├── pose.c
│ │ │ ├── pose.h
│ │ │ ├── skin/
│ │ │ │ ├── common.c
│ │ │ │ ├── common.h
│ │ │ │ ├── enum.h
│ │ │ │ ├── storage.c
│ │ │ │ ├── storage.h
│ │ │ │ └── types.h
│ │ │ ├── skin.h
│ │ │ ├── state/
│ │ │ │ ├── climb.c
│ │ │ │ ├── crouch.c
│ │ │ │ ├── extra.c
│ │ │ │ ├── jump.c
│ │ │ │ ├── land.c
│ │ │ │ ├── monkey.c
│ │ │ │ └── swim.c
│ │ │ ├── state.c
│ │ │ ├── state.h
│ │ │ ├── types.h
│ │ │ ├── util.h
│ │ │ ├── vehicle.c
│ │ │ └── vehicle.h
│ │ ├── lara.h
│ │ ├── level/
│ │ │ ├── cache.c
│ │ │ ├── cache.h
│ │ │ ├── common.c
│ │ │ ├── common.h
│ │ │ ├── context.c
│ │ │ ├── context.h
│ │ │ ├── finalize/
│ │ │ │ ├── animations.c
│ │ │ │ ├── gameplay_objects.c
│ │ │ │ ├── render_assets.c
│ │ │ │ └── rooms.c
│ │ │ ├── finalize.h
│ │ │ ├── format/
│ │ │ │ ├── format.h
│ │ │ │ ├── format_tr1.c
│ │ │ │ ├── format_tr2.c
│ │ │ │ ├── format_tr3.c
│ │ │ │ ├── pipeline.c
│ │ │ │ └── priv.h
│ │ │ ├── pipeline.c
│ │ │ ├── pipeline.h
│ │ │ ├── sections/
│ │ │ │ ├── anims.c
│ │ │ │ ├── append.h
│ │ │ │ ├── audio.c
│ │ │ │ ├── cinematics.c
│ │ │ │ ├── meshes.c
│ │ │ │ ├── objects.c
│ │ │ │ ├── pathing.c
│ │ │ │ ├── read.h
│ │ │ │ ├── rooms.c
│ │ │ │ └── textures.c
│ │ │ ├── settings.c
│ │ │ └── settings.h
│ │ ├── level.h
│ │ ├── los.h
│ │ ├── lua/
│ │ │ ├── assault_stats.c
│ │ │ ├── camera.c
│ │ │ ├── catalog.c
│ │ │ ├── common.c
│ │ │ ├── common.h
│ │ │ ├── config.c
│ │ │ ├── console.c
│ │ │ ├── creatures.c
│ │ │ ├── embedded_scripts.h
│ │ │ ├── events.c
│ │ │ ├── events.h
│ │ │ ├── game.c
│ │ │ ├── items.c
│ │ │ ├── lara.c
│ │ │ ├── log.c
│ │ │ ├── music.c
│ │ │ ├── objects.c
│ │ │ ├── rooms.c
│ │ │ └── sound.c
│ │ ├── lua.h
│ │ ├── matrix.c
│ │ ├── matrix.h
│ │ ├── music/
│ │ │ ├── backend_cdaudio.c
│ │ │ ├── backend_cdaudio.h
│ │ │ ├── backend_cdaudio_wad.c
│ │ │ ├── backend_cdaudio_wad.h
│ │ │ ├── backend_files.c
│ │ │ ├── backend_files.h
│ │ │ ├── common.c
│ │ │ ├── common.h
│ │ │ ├── const.h
│ │ │ ├── enum.h
│ │ │ ├── ids.c
│ │ │ ├── ids.h
│ │ │ └── types.h
│ │ ├── music.h
│ │ ├── objects/
│ │ │ ├── col.c
│ │ │ ├── col.h
│ │ │ ├── common.c
│ │ │ ├── common.h
│ │ │ ├── creatures/
│ │ │ │ ├── ape.c
│ │ │ │ ├── atlantean.c
│ │ │ │ ├── atlantean.h
│ │ │ │ ├── bacon_lara.c
│ │ │ │ ├── bacon_lara.h
│ │ │ │ ├── baldy.c
│ │ │ │ ├── bandit_1.c
│ │ │ │ ├── bandit_2.c
│ │ │ │ ├── bandit_common.h
│ │ │ │ ├── barracuda.c
│ │ │ │ ├── bartoli.c
│ │ │ │ ├── bat.c
│ │ │ │ ├── bear.c
│ │ │ │ ├── big_eel.c
│ │ │ │ ├── big_spider.c
│ │ │ │ ├── big_spider.h
│ │ │ │ ├── bird.c
│ │ │ │ ├── bird_guardian.c
│ │ │ │ ├── centaur.c
│ │ │ │ ├── centaur_statue.c
│ │ │ │ ├── civilian.c
│ │ │ │ ├── claw_mutant.c
│ │ │ │ ├── claw_mutant_internal.h
│ │ │ │ ├── claw_mutant_plasma_ball.c
│ │ │ │ ├── cobra.c
│ │ │ │ ├── compy.c
│ │ │ │ ├── cowboy.c
│ │ │ │ ├── crawler_mutant.c
│ │ │ │ ├── crocodile.c
│ │ │ │ ├── cultist_1.c
│ │ │ │ ├── cultist_2.c
│ │ │ │ ├── cultist_3.c
│ │ │ │ ├── cultist_common.h
│ │ │ │ ├── diver.c
│ │ │ │ ├── dog.c
│ │ │ │ ├── dragon.c
│ │ │ │ ├── eel.c
│ │ │ │ ├── hybrid_mutant.c
│ │ │ │ ├── jelly.c
│ │ │ │ ├── larson.c
│ │ │ │ ├── lion.c
│ │ │ │ ├── lizard.c
│ │ │ │ ├── mercenary.c
│ │ │ │ ├── monk.c
│ │ │ │ ├── monkey.c
│ │ │ │ ├── mouse.c
│ │ │ │ ├── mp_1.c
│ │ │ │ ├── mp_2.c
│ │ │ │ ├── mummy.c
│ │ │ │ ├── natla.c
│ │ │ │ ├── natla_gun.c
│ │ │ │ ├── orca.c
│ │ │ │ ├── patrol_dog.c
│ │ │ │ ├── pierre.c
│ │ │ │ ├── pod.c
│ │ │ │ ├── pod.h
│ │ │ │ ├── prisoner.c
│ │ │ │ ├── punk.c
│ │ │ │ ├── raptor.c
│ │ │ │ ├── rat.c
│ │ │ │ ├── rx_worker_1.c
│ │ │ │ ├── rx_worker_2.c
│ │ │ │ ├── rx_worker_3.c
│ │ │ │ ├── security_guard.c
│ │ │ │ ├── shark.c
│ │ │ │ ├── shiva.c
│ │ │ │ ├── skate_kid.c
│ │ │ │ ├── skidoo_driver.c
│ │ │ │ ├── skidoo_driver.h
│ │ │ │ ├── sophia.c
│ │ │ │ ├── sophia_internal.h
│ │ │ │ ├── sophia_laser_bolt.c
│ │ │ │ ├── sophia_plasma_ball.c
│ │ │ │ ├── spider.c
│ │ │ │ ├── swat.c
│ │ │ │ ├── tiger.c
│ │ │ │ ├── tony.c
│ │ │ │ ├── tony_fire_ball.c
│ │ │ │ ├── tony_internal.h
│ │ │ │ ├── torso.c
│ │ │ │ ├── trex.c
│ │ │ │ ├── trex_alpha.c
│ │ │ │ ├── tribe_axeman.c
│ │ │ │ ├── tribe_boss.c
│ │ │ │ ├── tribe_boss.h
│ │ │ │ ├── tribe_pipeman.c
│ │ │ │ ├── wasp_mutant.c
│ │ │ │ ├── willard.c
│ │ │ │ ├── willard_internal.h
│ │ │ │ ├── willard_plasma_ball.c
│ │ │ │ ├── winston.c
│ │ │ │ ├── winston_army.c
│ │ │ │ ├── wolf.c
│ │ │ │ ├── worker_1.c
│ │ │ │ ├── worker_2.c
│ │ │ │ ├── worker_3.c
│ │ │ │ ├── worker_common.h
│ │ │ │ ├── xian_common.c
│ │ │ │ ├── xian_common.h
│ │ │ │ ├── xian_knight.c
│ │ │ │ ├── xian_spearman.c
│ │ │ │ └── yeti.c
│ │ │ ├── draw.c
│ │ │ ├── draw.h
│ │ │ ├── effects/
│ │ │ │ ├── blood.c
│ │ │ │ ├── body_part.c
│ │ │ │ ├── bubble.c
│ │ │ │ ├── dart_effect.c
│ │ │ │ ├── ember.c
│ │ │ │ ├── explosion.c
│ │ │ │ ├── flame.c
│ │ │ │ ├── flame.h
│ │ │ │ ├── glow.c
│ │ │ │ ├── gun_flash.c
│ │ │ │ ├── gun_shell.c
│ │ │ │ ├── hot_liquid.c
│ │ │ │ ├── missile.c
│ │ │ │ ├── pickup_aid.c
│ │ │ │ ├── ricochet.c
│ │ │ │ ├── snow_sprite.c
│ │ │ │ ├── splash.c
│ │ │ │ ├── twinkle.c
│ │ │ │ ├── twinkle.h
│ │ │ │ └── water_sprite.c
│ │ │ ├── general/
│ │ │ │ ├── ai_node.c
│ │ │ │ ├── alarm_sound.c
│ │ │ │ ├── animating.c
│ │ │ │ ├── area_51_rocket.c
│ │ │ │ ├── assault_target.c
│ │ │ │ ├── bat_emitter.c
│ │ │ │ ├── bell.c
│ │ │ │ ├── big_bowl.c
│ │ │ │ ├── bird_tweeter.c
│ │ │ │ ├── boat.c
│ │ │ │ ├── bridge_common.c
│ │ │ │ ├── bridge_common.h
│ │ │ │ ├── bridge_flat.c
│ │ │ │ ├── bridge_tilt1.c
│ │ │ │ ├── bridge_tilt2.c
│ │ │ │ ├── cabin.c
│ │ │ │ ├── camera_target.c
│ │ │ │ ├── carcass.c
│ │ │ │ ├── clock_chimes.c
│ │ │ │ ├── cog.c
│ │ │ │ ├── combat_end.c
│ │ │ │ ├── combat_end.h
│ │ │ │ ├── copter.c
│ │ │ │ ├── cutscene_player.c
│ │ │ │ ├── detonator_box.c
│ │ │ │ ├── ding_dong.c
│ │ │ │ ├── disposable_animating.c
│ │ │ │ ├── door.c
│ │ │ │ ├── door.h
│ │ │ │ ├── drawbridge.c
│ │ │ │ ├── dummy.c
│ │ │ │ ├── earthquake.c
│ │ │ │ ├── final_cutscene.c
│ │ │ │ ├── flare_item.c
│ │ │ │ ├── flare_item.h
│ │ │ │ ├── fuse_box.c
│ │ │ │ ├── gas_emitter.c
│ │ │ │ ├── general.c
│ │ │ │ ├── general.h
│ │ │ │ ├── gong.c
│ │ │ │ ├── gong_bonger.c
│ │ │ │ ├── grenade.c
│ │ │ │ ├── harpoon_bolt.c
│ │ │ │ ├── keyhole.c
│ │ │ │ ├── keyhole.h
│ │ │ │ ├── kill_all_triggered.c
│ │ │ │ ├── lara_alarm.c
│ │ │ │ ├── lift.c
│ │ │ │ ├── lights/
│ │ │ │ │ ├── beacon_light.c
│ │ │ │ │ ├── colored_light.c
│ │ │ │ │ ├── electrical_light.c
│ │ │ │ │ ├── on_off_light.c
│ │ │ │ │ ├── pulse_light.c
│ │ │ │ │ └── strobe_light.c
│ │ │ │ ├── mini_copter.c
│ │ │ │ ├── moving_bar.c
│ │ │ │ ├── pickup.c
│ │ │ │ ├── pickup.h
│ │ │ │ ├── puzzle_hole.c
│ │ │ │ ├── rocket.c
│ │ │ │ ├── save_crystal.c
│ │ │ │ ├── scion1.c
│ │ │ │ ├── scion3.c
│ │ │ │ ├── scion4.c
│ │ │ │ ├── scion_holder.c
│ │ │ │ ├── shoal.c
│ │ │ │ ├── shoal.h
│ │ │ │ ├── smashable.c
│ │ │ │ ├── smashable.h
│ │ │ │ ├── smoke_emitter.c
│ │ │ │ ├── sphere_of_doom.c
│ │ │ │ ├── switch.c
│ │ │ │ ├── switch.h
│ │ │ │ ├── trapdoor.c
│ │ │ │ ├── trigger_gate.c
│ │ │ │ ├── waterfall.c
│ │ │ │ └── zipline.c
│ │ │ ├── ids.h
│ │ │ ├── names.c
│ │ │ ├── names.def
│ │ │ ├── names.h
│ │ │ ├── setup.c
│ │ │ ├── setup.h
│ │ │ ├── traps/
│ │ │ │ ├── blade.c
│ │ │ │ ├── bubble_emitter.c
│ │ │ │ ├── cleaner.c
│ │ │ │ ├── common.c
│ │ │ │ ├── common.h
│ │ │ │ ├── damocles_sword.c
│ │ │ │ ├── dart.c
│ │ │ │ ├── dart_emitter.c
│ │ │ │ ├── dying_monk.c
│ │ │ │ ├── electric_fence.c
│ │ │ │ ├── ember_emitter.c
│ │ │ │ ├── falling_block.c
│ │ │ │ ├── falling_ceiling.c
│ │ │ │ ├── fire_head.c
│ │ │ │ ├── flame_emitter.c
│ │ │ │ ├── gondola.c
│ │ │ │ ├── gondola.h
│ │ │ │ ├── hook.c
│ │ │ │ ├── icicle.c
│ │ │ │ ├── killer_statue.c
│ │ │ │ ├── lava_wedge.c
│ │ │ │ ├── lightning_emitter.c
│ │ │ │ ├── midas_touch.c
│ │ │ │ ├── mine.c
│ │ │ │ ├── movable_block.c
│ │ │ │ ├── movable_block.h
│ │ │ │ ├── pendulum.c
│ │ │ │ ├── power_saw.c
│ │ │ │ ├── propeller.c
│ │ │ │ ├── propeller.h
│ │ │ │ ├── raptor_emitter.c
│ │ │ │ ├── rolling_ball.c
│ │ │ │ ├── rotating_laser.c
│ │ │ │ ├── security_laser.c
│ │ │ │ ├── sentry_gun.c
│ │ │ │ ├── sliding_pillar.c
│ │ │ │ ├── spike_ceiling.c
│ │ │ │ ├── spike_wall.c
│ │ │ │ ├── spikes.c
│ │ │ │ ├── spinning_blade.c
│ │ │ │ ├── springboard.c
│ │ │ │ ├── teeth_trap.c
│ │ │ │ ├── thors_hammer.c
│ │ │ │ ├── train.c
│ │ │ │ └── wasp_emitter.c
│ │ │ ├── types.h
│ │ │ ├── vars.c
│ │ │ ├── vars.h
│ │ │ └── vehicles/
│ │ │ ├── boat.c
│ │ │ ├── common.c
│ │ │ ├── common.h
│ │ │ ├── kayak.c
│ │ │ ├── kayak.h
│ │ │ ├── mine_cart.c
│ │ │ ├── mine_cart.h
│ │ │ ├── mounted_gun.c
│ │ │ ├── mounted_gun.h
│ │ │ ├── quad_bike.c
│ │ │ ├── quad_bike.h
│ │ │ ├── rib.c
│ │ │ ├── skidoo_armed.c
│ │ │ ├── skidoo_armed.h
│ │ │ ├── skidoo_common.c
│ │ │ ├── skidoo_common.h
│ │ │ ├── skidoo_fast.c
│ │ │ ├── upv.c
│ │ │ └── upv.h
│ │ ├── objects.h
│ │ ├── option/
│ │ │ ├── common.c
│ │ │ ├── common.h
│ │ │ ├── controls.c
│ │ │ ├── controls.h
│ │ │ ├── examine.c
│ │ │ ├── examine.h
│ │ │ ├── gameplay.c
│ │ │ ├── gameplay.h
│ │ │ ├── globe_select.c
│ │ │ ├── globe_select.h
│ │ │ ├── graphics.c
│ │ │ ├── graphics.h
│ │ │ ├── passport.c
│ │ │ ├── passport.h
│ │ │ ├── sound.c
│ │ │ ├── sound.h
│ │ │ ├── stats.c
│ │ │ └── stats.h
│ │ ├── option.h
│ │ ├── output/
│ │ │ ├── bind.c
│ │ │ ├── bind.h
│ │ │ ├── common.c
│ │ │ ├── common.h
│ │ │ ├── const.h
│ │ │ ├── draw.c
│ │ │ ├── draw.h
│ │ │ ├── func.c
│ │ │ ├── func.h
│ │ │ ├── lights.c
│ │ │ ├── lights.h
│ │ │ ├── mesh_batcher/
│ │ │ │ ├── batcher.c
│ │ │ │ ├── batcher.h
│ │ │ │ ├── mesh.c
│ │ │ │ ├── mesh.h
│ │ │ │ ├── mesh_builder.c
│ │ │ │ └── mesh_builder.h
│ │ │ ├── overlay.h
│ │ │ ├── quad.c
│ │ │ ├── quad.h
│ │ │ ├── scene_compositor.c
│ │ │ ├── scene_compositor.h
│ │ │ ├── scene_source.h
│ │ │ ├── shaders/
│ │ │ │ ├── generic.c
│ │ │ │ ├── generic.h
│ │ │ │ ├── mesh.c
│ │ │ │ ├── mesh.h
│ │ │ │ ├── ui.c
│ │ │ │ └── ui.h
│ │ │ ├── sources/
│ │ │ │ ├── lightnings.c
│ │ │ │ ├── lightnings.h
│ │ │ │ ├── misc.c
│ │ │ │ ├── misc.h
│ │ │ │ ├── objects.c
│ │ │ │ ├── objects.h
│ │ │ │ ├── overlay.c
│ │ │ │ ├── overlay.h
│ │ │ │ ├── poly_fx.c
│ │ │ │ ├── poly_fx.h
│ │ │ │ ├── rooms.c
│ │ │ │ ├── rooms.h
│ │ │ │ ├── rooms_debug.c
│ │ │ │ ├── rooms_debug.h
│ │ │ │ ├── shadows.c
│ │ │ │ ├── shadows.h
│ │ │ │ ├── sprites.c
│ │ │ │ ├── sprites.h
│ │ │ │ ├── ui.c
│ │ │ │ └── ui.h
│ │ │ ├── state.c
│ │ │ ├── state.h
│ │ │ ├── textures.c
│ │ │ ├── textures.h
│ │ │ ├── types.h
│ │ │ ├── uniforms.c
│ │ │ ├── uniforms.h
│ │ │ ├── utils.c
│ │ │ ├── utils.h
│ │ │ ├── vars.c
│ │ │ ├── vars.h
│ │ │ ├── vertex_range.c
│ │ │ └── vertex_range.h
│ │ ├── output.h
│ │ ├── overlay.c
│ │ ├── overlay.h
│ │ ├── pathing/
│ │ │ ├── box.c
│ │ │ ├── box.h
│ │ │ ├── const.h
│ │ │ ├── lot.c
│ │ │ ├── lot.h
│ │ │ └── types.h
│ │ ├── pathing.h
│ │ ├── phase/
│ │ │ ├── control.h
│ │ │ ├── executor.c
│ │ │ ├── executor.h
│ │ │ ├── phase_cutscene.c
│ │ │ ├── phase_cutscene.h
│ │ │ ├── phase_demo.c
│ │ │ ├── phase_demo.h
│ │ │ ├── phase_game.c
│ │ │ ├── phase_game.h
│ │ │ ├── phase_globe_select.c
│ │ │ ├── phase_globe_select.h
│ │ │ ├── phase_inventory.c
│ │ │ ├── phase_inventory.h
│ │ │ ├── phase_pause.c
│ │ │ ├── phase_pause.h
│ │ │ ├── phase_photo_mode.c
│ │ │ ├── phase_photo_mode.h
│ │ │ ├── phase_picture.c
│ │ │ ├── phase_picture.h
│ │ │ ├── phase_stats.c
│ │ │ ├── phase_stats.h
│ │ │ └── types.h
│ │ ├── phase.h
│ │ ├── photo_mode.c
│ │ ├── photo_mode.h
│ │ ├── random.c
│ │ ├── random.h
│ │ ├── replay/
│ │ │ ├── test_recorder.c
│ │ │ ├── test_recorder.h
│ │ │ ├── test_replay.c
│ │ │ └── test_replay.h
│ │ ├── rooms/
│ │ │ ├── common.c
│ │ │ ├── common.h
│ │ │ ├── const.h
│ │ │ ├── draw.c
│ │ │ ├── draw.h
│ │ │ ├── enum.h
│ │ │ ├── floor_data.c
│ │ │ ├── floor_data.h
│ │ │ ├── geometry.c
│ │ │ ├── geometry.h
│ │ │ ├── types.h
│ │ │ └── utils.h
│ │ ├── rooms.h
│ │ ├── savegame/
│ │ │ ├── common.c
│ │ │ ├── common.h
│ │ │ ├── enum.h
│ │ │ ├── file.c
│ │ │ ├── file.h
│ │ │ ├── file_read.c
│ │ │ ├── file_write.c
│ │ │ └── types.h
│ │ ├── savegame.h
│ │ ├── screenshot.c
│ │ ├── screenshot.h
│ │ ├── shell/
│ │ │ ├── args.c
│ │ │ ├── args.h
│ │ │ ├── common.c
│ │ │ ├── common.h
│ │ │ ├── config.c
│ │ │ ├── config.h
│ │ │ ├── const.h
│ │ │ ├── events.c
│ │ │ ├── events.h
│ │ │ ├── flow.c
│ │ │ ├── flow.h
│ │ │ ├── input.c
│ │ │ ├── input.h
│ │ │ ├── main.c
│ │ │ ├── mod.c
│ │ │ ├── mod.h
│ │ │ ├── paths.c
│ │ │ ├── paths.h
│ │ │ ├── platform.c
│ │ │ ├── platform.h
│ │ │ ├── session.c
│ │ │ ├── session.h
│ │ │ ├── state.c
│ │ │ └── state.h
│ │ ├── shell.h
│ │ ├── sound/
│ │ │ ├── common.c
│ │ │ ├── common.h
│ │ │ ├── enum.h
│ │ │ ├── ids.c
│ │ │ ├── ids.h
│ │ │ └── types.h
│ │ ├── sound.h
│ │ ├── sparks/
│ │ │ ├── enum.h
│ │ │ ├── manager.c
│ │ │ ├── manager.h
│ │ │ ├── spawners.c
│ │ │ ├── spawners.h
│ │ │ └── types.h
│ │ ├── sparks.h
│ │ ├── spawn.c
│ │ ├── spawn.h
│ │ ├── stats/
│ │ │ ├── common.c
│ │ │ ├── common.h
│ │ │ ├── const.h
│ │ │ ├── init.c
│ │ │ ├── init.h
│ │ │ ├── scan.c
│ │ │ ├── scan.h
│ │ │ └── types.h
│ │ ├── stats.h
│ │ ├── types.h
│ │ ├── ui/
│ │ │ ├── common.c
│ │ │ ├── common.h
│ │ │ ├── dialogs/
│ │ │ │ ├── base_passport.c
│ │ │ │ ├── base_passport.h
│ │ │ │ ├── color_editor.c
│ │ │ │ ├── color_editor.h
│ │ │ │ ├── config_presets.c
│ │ │ │ ├── config_presets.h
│ │ │ │ ├── controls.c
│ │ │ │ ├── controls.h
│ │ │ │ ├── controls_backend.c
│ │ │ │ ├── controls_backend.h
│ │ │ │ ├── controls_editor.c
│ │ │ │ ├── controls_editor.h
│ │ │ │ ├── gameplay_settings.c
│ │ │ │ ├── gameplay_settings.h
│ │ │ │ ├── graphic_settings.c
│ │ │ │ ├── graphic_settings.h
│ │ │ │ ├── new_game.c
│ │ │ │ ├── new_game.h
│ │ │ │ ├── pause.c
│ │ │ │ ├── pause.h
│ │ │ │ ├── photo_mode.c
│ │ │ │ ├── photo_mode.h
│ │ │ │ ├── play_any_level.c
│ │ │ │ ├── play_any_level.h
│ │ │ │ ├── save_slot.c
│ │ │ │ ├── save_slot.h
│ │ │ │ ├── select_level.c
│ │ │ │ ├── select_level.h
│ │ │ │ ├── setting_helpers/
│ │ │ │ │ ├── enums.c
│ │ │ │ │ ├── enums.h
│ │ │ │ │ ├── handlers.c
│ │ │ │ │ ├── handlers.h
│ │ │ │ │ └── handlers_language.c
│ │ │ │ ├── setting_tabs/
│ │ │ │ │ ├── gameplay_controls.def
│ │ │ │ │ ├── gameplay_fixes.def
│ │ │ │ │ ├── gameplay_general.def
│ │ │ │ │ ├── gameplay_mods.def
│ │ │ │ │ ├── graphic_rendering.def
│ │ │ │ │ ├── graphic_ui.def
│ │ │ │ │ ├── graphic_ui_bars.def
│ │ │ │ │ ├── graphic_ui_stats.def
│ │ │ │ │ ├── graphic_visuals.def
│ │ │ │ │ ├── sound_misc.def
│ │ │ │ │ └── sound_volume.def
│ │ │ │ ├── settings.c
│ │ │ │ ├── settings.h
│ │ │ │ ├── settings_editor.c
│ │ │ │ ├── settings_editor.h
│ │ │ │ ├── settings_tabs.c
│ │ │ │ ├── settings_tabs.h
│ │ │ │ ├── sound_settings.c
│ │ │ │ ├── sound_settings.h
│ │ │ │ ├── stats.c
│ │ │ │ ├── stats.h
│ │ │ │ ├── switch_mod.c
│ │ │ │ ├── switch_mod.h
│ │ │ │ ├── text.c
│ │ │ │ └── text.h
│ │ │ ├── dialogs.h
│ │ │ ├── draw.c
│ │ │ ├── draw.h
│ │ │ ├── elements/
│ │ │ │ ├── ammo_label.c
│ │ │ │ ├── ammo_label.h
│ │ │ │ ├── anchor.c
│ │ │ │ ├── anchor.h
│ │ │ │ ├── bar.c
│ │ │ │ ├── bar.h
│ │ │ │ ├── bar_enemy_hp.c
│ │ │ │ ├── bar_enemy_hp.h
│ │ │ │ ├── bar_lara_air.c
│ │ │ │ ├── bar_lara_air.h
│ │ │ │ ├── bar_lara_exposure.c
│ │ │ │ ├── bar_lara_exposure.h
│ │ │ │ ├── bar_lara_hp.c
│ │ │ │ ├── bar_lara_hp.h
│ │ │ │ ├── bar_lara_sprint.c
│ │ │ │ ├── bar_lara_sprint.h
│ │ │ │ ├── button_label.c
│ │ │ │ ├── button_label.h
│ │ │ │ ├── color_swatch.c
│ │ │ │ ├── color_swatch.h
│ │ │ │ ├── flash.c
│ │ │ │ ├── flash.h
│ │ │ │ ├── fps_counter.c
│ │ │ │ ├── fps_counter.h
│ │ │ │ ├── frame.c
│ │ │ │ ├── frame.h
│ │ │ │ ├── gradient_slider.c
│ │ │ │ ├── gradient_slider.h
│ │ │ │ ├── hide.c
│ │ │ │ ├── hide.h
│ │ │ │ ├── horizontal_line.c
│ │ │ │ ├── horizontal_line.h
│ │ │ │ ├── label.c
│ │ │ │ ├── label.h
│ │ │ │ ├── modal.c
│ │ │ │ ├── modal.h
│ │ │ │ ├── offset.c
│ │ │ │ ├── offset.h
│ │ │ │ ├── pad.c
│ │ │ │ ├── pad.h
│ │ │ │ ├── progress_button.c
│ │ │ │ ├── progress_button.h
│ │ │ │ ├── prompt.c
│ │ │ │ ├── prompt.h
│ │ │ │ ├── requester.c
│ │ │ │ ├── requester.h
│ │ │ │ ├── resize.c
│ │ │ │ ├── resize.h
│ │ │ │ ├── row_arrows.c
│ │ │ │ ├── row_arrows.h
│ │ │ │ ├── scrollable_stack.c
│ │ │ │ ├── scrollable_stack.h
│ │ │ │ ├── sleek_bar.c
│ │ │ │ ├── sleek_bar.h
│ │ │ │ ├── spacer.c
│ │ │ │ ├── spacer.h
│ │ │ │ ├── span.c
│ │ │ │ ├── span.h
│ │ │ │ ├── stack.c
│ │ │ │ ├── stack.h
│ │ │ │ ├── tab_switch.c
│ │ │ │ ├── tab_switch.h
│ │ │ │ ├── window.c
│ │ │ │ └── window.h
│ │ │ ├── elements.h
│ │ │ ├── events.c
│ │ │ ├── events.h
│ │ │ ├── helpers.c
│ │ │ ├── helpers.h
│ │ │ ├── hud/
│ │ │ │ ├── console.c
│ │ │ │ ├── console.h
│ │ │ │ ├── console_logs.c
│ │ │ │ ├── console_logs.h
│ │ │ │ ├── overlay.c
│ │ │ │ └── overlay.h
│ │ │ ├── hud.h
│ │ │ ├── scaler.c
│ │ │ ├── scaler.h
│ │ │ ├── scrollable.c
│ │ │ ├── scrollable.h
│ │ │ ├── settings.c
│ │ │ ├── settings.h
│ │ │ ├── text.c
│ │ │ ├── text.def
│ │ │ ├── text.h
│ │ │ └── text_autogen.def
│ │ ├── ui.h
│ │ ├── viewport.c
│ │ └── viewport.h
│ ├── gl/
│ │ ├── buffer.c
│ │ ├── buffer.h
│ │ ├── config.h
│ │ ├── context.c
│ │ ├── context.h
│ │ ├── enum.c
│ │ ├── enum.h
│ │ ├── fbo.c
│ │ ├── fbo.h
│ │ ├── program.c
│ │ ├── program.h
│ │ ├── renderer.c
│ │ ├── renderer.h
│ │ ├── sampler.c
│ │ ├── sampler.h
│ │ ├── screenshot.c
│ │ ├── screenshot.h
│ │ ├── texture.c
│ │ ├── texture.h
│ │ ├── track.c
│ │ ├── track.h
│ │ ├── utils.c
│ │ ├── utils.h
│ │ ├── vertex_array.c
│ │ └── vertex_array.h
│ ├── version.c
│ └── version.h
└── tools/
├── additional_lint
├── download_assets
├── embed_trx_lua.py
├── ffmpeg_flags.txt
├── generate_icon
├── generate_init
├── generate_rcfile
├── get_version
├── glyphs/
│ ├── README.md
│ ├── generate_case_map
│ ├── generate_compositions
│ ├── generate_defs
│ ├── generate_keyboard_map
│ ├── test_alignment.html
│ └── test_language
├── inspect_save
├── installer/
│ ├── .gitignore
│ ├── TR1X_Installer/
│ │ ├── App.xaml
│ │ ├── App.xaml.cs
│ │ ├── Installers/
│ │ │ ├── CDRomInstallSource.cs
│ │ │ ├── GOGInstallSource.cs
│ │ │ ├── SteamInstallSource.cs
│ │ │ ├── TR1XInstallSource.cs
│ │ │ └── TombATIInstallSource.cs
│ │ ├── Resources/
│ │ │ ├── Lang/
│ │ │ │ ├── en.json
│ │ │ │ └── it.json
│ │ │ └── const.json
│ │ └── TR1X_Installer.csproj
│ ├── TR2X_Installer/
│ │ ├── App.xaml
│ │ ├── App.xaml.cs
│ │ ├── Installers/
│ │ │ ├── CDRomInstallSource.cs
│ │ │ ├── GOGInstallSource.cs
│ │ │ ├── GenericInstallSource.cs
│ │ │ ├── SteamInstallSource.cs
│ │ │ └── TR2XInstallSource.cs
│ │ ├── Resources/
│ │ │ ├── Lang/
│ │ │ │ ├── en.json
│ │ │ │ └── it.json
│ │ │ └── const.json
│ │ └── TR2X_Installer.csproj
│ ├── TRX_Installer/
│ │ ├── App.xaml
│ │ ├── App.xaml.cs
│ │ ├── BoolToVisibilityConverter.cs
│ │ ├── CueFile.cs
│ │ ├── CueTrack.cs
│ │ ├── DiscImageInstallSource.cs
│ │ ├── DownloadOption.cs
│ │ ├── ExistingTRXInstallSource.cs
│ │ ├── IInstallSource.cs
│ │ ├── IInstallerProgress.cs
│ │ ├── InstallComponent.cs
│ │ ├── InstallComponentFactory.cs
│ │ ├── InstallFileHelper.cs
│ │ ├── InstallMappings.cs
│ │ ├── InstallSourceOption.cs
│ │ ├── InstallerService.cs
│ │ ├── MainWindow.xaml
│ │ ├── MainWindow.xaml.cs
│ │ ├── OptionalDownload.cs
│ │ ├── OriginalDirectoryInstallSource.cs
│ │ ├── Resources/
│ │ │ ├── Lang/
│ │ │ │ ├── en.json
│ │ │ │ └── it.json
│ │ │ └── const.json
│ │ └── TRX_Installer.csproj
│ ├── TRX_Installer.sln
│ └── TRX_InstallerLib/
│ ├── Controls/
│ │ ├── FinishStepControl.xaml
│ │ ├── FinishStepControl.xaml.cs
│ │ ├── InstallSettingsStepControl.xaml
│ │ ├── InstallSettingsStepControl.xaml.cs
│ │ ├── InstallSourceControl.xaml
│ │ ├── InstallSourceControl.xaml.cs
│ │ ├── InstallStepControl.xaml
│ │ ├── InstallStepControl.xaml.cs
│ │ ├── SourceStepControl.xaml
│ │ ├── SourceStepControl.xaml.cs
│ │ ├── TRXInstallWindow.xaml
│ │ └── TRXInstallWindow.xaml.cs
│ ├── Installers/
│ │ ├── BaseInstallSource.cs
│ │ ├── IInstallSource.cs
│ │ ├── InstallExecutor.cs
│ │ └── InstallUtils.cs
│ ├── Models/
│ │ ├── BaseLanguageViewModel.cs
│ │ ├── ExpansionPackType.cs
│ │ ├── FinishSettings.cs
│ │ ├── FinishStep.cs
│ │ ├── IStep.cs
│ │ ├── InstallSettings.cs
│ │ ├── InstallSettingsStep.cs
│ │ ├── InstallSourceViewModel.cs
│ │ ├── InstallStep.cs
│ │ ├── Language.cs
│ │ ├── Logger.cs
│ │ ├── MainWindowViewModel.cs
│ │ ├── SourceStep.cs
│ │ └── TRXConstants.cs
│ ├── Resources/
│ │ ├── Lang/
│ │ │ ├── en.json
│ │ │ └── it.json
│ │ ├── const.json
│ │ └── styles.xaml
│ ├── TRX_InstallerLib.csproj
│ └── Utils/
│ ├── AssemblyUtils.cs
│ ├── BaseNotifyPropertyChanged.cs
│ ├── BinaryReaderExtensions.cs
│ ├── BoolToVisibilityConverter.cs
│ ├── ComparisonConverter.cs
│ ├── ConditionalMarkupConverter.cs
│ ├── ConditionalViewTextConverter.cs
│ ├── CueFile.cs
│ ├── CueTrack.cs
│ ├── FileBrowser.cs
│ ├── HttpProgressClient.cs
│ ├── InstallProgress.cs
│ ├── JsonUtils.cs
│ ├── ProcessUtils.cs
│ ├── RelayCommand.cs
│ └── ShortcutUtils.cs
├── output_current_changelog
├── output_package_name
├── output_release_name
├── release
├── shared/
│ ├── __init__.py
│ ├── changelog.py
│ ├── docker/
│ │ ├── __init__.py
│ │ ├── game-linux/
│ │ │ ├── Dockerfile
│ │ │ └── entrypoint.sh
│ │ ├── game-win/
│ │ │ ├── Dockerfile
│ │ │ ├── entrypoint.sh
│ │ │ └── meson_linux_mingw32.txt
│ │ ├── game_entrypoint.py
│ │ ├── installer/
│ │ │ ├── Dockerfile
│ │ │ └── entrypoint.sh
│ │ └── lua.pc
│ ├── files.py
│ ├── git.py
│ ├── glyph_mapping.py
│ ├── icons.py
│ ├── ida_progress.py
│ ├── import_sorter.py
│ ├── json_utils.py
│ ├── linting.py
│ ├── mac/
│ │ ├── bundle_dylibs
│ │ ├── create_installer
│ │ ├── install_tree
│ │ └── x86-64_cross_file.txt
│ ├── packaging.py
│ ├── paths.py
│ ├── utils.py
│ ├── versioning.py
│ └── vfs.py
├── sort_imports
├── tr2/
│ ├── __init__.py
│ ├── generate_ida_importer
│ └── read_tombpc_script
├── tr3/
│ └── objects_tracker/
│ ├── objects_dump.json
│ ├── objects_support.json
│ ├── read_levels
│ └── render
├── update_game_strings
├── update_install_trees
└── update_water_colors
================================================
FILE CONTENTS
================================================
================================================
FILE: .clang-format
================================================
---
AlignAfterOpenBracket: AlwaysBreak
AllowShortFunctionsOnASingleLine: None
AlwaysBreakAfterReturnType: None
BasedOnStyle: Webkit
BreakBeforeBinaryOperators: NonAssignment
BreakAdjacentStringLiterals: true
AlwaysBreakBeforeMultilineStrings: true
ColumnLimit: 80
IndentPPDirectives: BeforeHash
NamespaceIndentation: None
PenaltyReturnTypeOnItsOwnLine: 1000
PointerAlignment: Right
SortIncludes: false
InsertBraces: true
SpaceInEmptyBraces: Never
================================================
FILE: .dockerignore
================================================
/data
/test
/build
================================================
FILE: .editorconfig
================================================
[*]
insert_final_newline = true
charset = utf-8
indent_style = space
end_of_line = lf
[*.py]
indent_size = 4
max_line_length = 79
trim_trailing_whitespace = true
[*.lua]
indent_size = 2
================================================
FILE: .github/CODEOWNERS
================================================
* @LostArtefacts/dev @LostArtefacts/qa
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yml
================================================
name: Bug report
description: Report a reproducible problem in TRX
title: "[Bug] "
body:
- type: markdown
attributes:
value: |
Please open one issue per bug.
Before submitting, read the bug reporting guide:
https://github.com/LostArtefacts/TRX/blob/develop/BUG_REPORTING.md
- type: dropdown
id: game_type
attributes:
label: Game type
description: What does this affect?
options:
- Original game
- Custom level
- Not sure
validations:
required: true
- type: dropdown
id: game
attributes:
label: Game
options:
- All games
- TR1
- TR2
- TR3
- Other
validations:
required: true
- type: markdown
attributes:
value: |
If your report is about TR3, please note that current support is limited to Lara's Home, India, and South Pacific.
Reports for other TR3 areas are still out of scope while that work is in progress, so those issues are not being accepted yet.
- type: input
id: trx_version
attributes:
label: TRX version
description: Use the exact version. It can be found in the main menu, or .exe properties.
placeholder: 1.2.3
validations:
required: true
- type: input
id: os
attributes:
label: Operating system
placeholder: Windows 11
validations:
required: true
- type: input
id: gpu
attributes:
label: GPU
placeholder: NVIDIA GeForce RTX 4070
validations:
required: false
- type: textarea
id: repro_steps
attributes:
label: Describe the bug in plain terms, and write the shortest steps that reproduce it.
placeholder: |
Lara falls through the bridge after loading a save near the switch room.
1. Load the attached save.
2. Walk onto the bridge.
3. Pull the switch.
4. Observe Lara falling through the floor.
validations:
required: true
- type: textarea
id: expected_result
attributes:
label: What did you expect instead?
placeholder: Lara should stay on the bridge and the switch should work normally.
validations:
required: true
- type: textarea
id: attachments
attributes:
label: Attachments
description: Attach `TRX.log`, saves, screenshots, videos, and custom level files here if they help reproduce the issue.
placeholder: Drag and drop `TRX.log`, save files, screenshots, videos, or custom level files here.
validations:
required: true
- type: checkboxes
id: confirmations
attributes:
label: Before submitting
options:
- label: I included enough detail to reproduce this.
required: true
- label: I attached `TRX.log` and any saves, media, or custom level files needed to reproduce this.
required: true
- label: This issue covers one bug.
required: true
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
- name: Bug reporting guidelines
url: https://github.com/LostArtefacts/TRX/blob/develop/BUG_REPORTING.md
about: Read this before opening a bug report, especially for logs, savegames, and custom levels.
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.yml
================================================
name: Feature request
description: Suggest an improvement, enhancement, or new idea
title: "[Feature] "
body:
- type: markdown
attributes:
value: |
Feature requests can be lightweight.
A clear problem statement is more useful than a fully detailed spec.
- type: textarea
id: idea
attributes:
label: What would you like to see?
description: Describe the idea in plain terms.
placeholder: I'd like photo mode to remember the last-used HUD visibility setting.
validations:
required: true
- type: textarea
id: problem
attributes:
label: What problem would this solve?
description: Explain the pain point, limitation, or workflow this would improve.
placeholder: Re-enabling the same setting every time is repetitive when taking several screenshots in a row.
validations:
required: false
- type: textarea
id: proposed_behavior
attributes:
label: Extra context
description: Add mockups, examples, references, screenshots, videos, related issues, etc.
placeholder: Add any extra context here that helps.
validations:
required: false
================================================
FILE: .github/actions/prepare_macos_tooling/action.yml
================================================
name: Cache TRX MacOS Dependencies
inputs:
FFMPEG_INSTALL_TMP_ARM64:
required: false
default: /opt/local/install_arm64
FFMPEG_INSTALL_TMP_X86_64:
required: false
default: /opt/local/install_x86_64
CACHE_SRC_DIR:
required: false
default: /opt/local
CACHE_DIR:
required: true
runs:
using: "composite"
steps:
- name: Select latest stable Xcode
if: steps.restore-cache.outputs.cache-hit != 'true'
uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: latest-stable
- name: Install and update MacPorts
if: steps.restore-cache.outputs.cache-hit != 'true'
shell: bash
run: |
wget -O ${{ github.workspace }}/macports.pkg https://github.com/macports/macports-base/releases/download/v2.9.2/MacPorts-2.9.2-14-Sonoma.pkg
sudo installer -pkg ${{ github.workspace }}/macports.pkg -target /
- name: Install build and deployment tools
if: steps.restore-cache.outputs.cache-hit != 'true'
shell: bash
run: |
# Install Python first to avoid multiple Python in the dep tree later on.
sudo port -N install python313 py313-pip
sudo port select --set python python313
sudo port select --set python3 python313
sudo port select --set pip pip313
sudo port select --set pip3 pip313
# Install Clang to get better C23 support.
sudo port -N install clang-16
sudo port select --set clang mp-clang-16
# Install the rest.
sudo port -N install create-dmg meson ninja pkgconfig
sudo pip3 install pyjson5
- name: "Build dependencies: Compression libraries (universal)"
if: steps.restore-cache.outputs.cache-hit != 'true'
shell: bash
run: |
sudo port -N install zlib +universal
sudo port -N install bzip2 +universal
sudo port -N install xz +universal
- name: "Build dependency: pcre2 (universal)"
if: steps.restore-cache.outputs.cache-hit != 'true'
shell: bash
run: sudo port -N install pcre2 +universal
- name: "Build dependency: GLEW (universal)"
if: steps.restore-cache.outputs.cache-hit != 'true'
shell: bash
run: sudo port -N install glew +universal
- name: "Build dependency: libsdl2 (universal)"
if: steps.restore-cache.outputs.cache-hit != 'true'
shell: bash
run: sudo port -N install libsdl2 +universal
- name: "Build dependency: lua (universal)"
if: steps.restore-cache.outputs.cache-hit != 'true'
shell: bash
run: sudo port -N install lua +universal
- name: "Build dependency: uthash (universal)"
if: steps.restore-cache.outputs.cache-hit != 'true'
shell: bash
run: sudo port -N install uthash +universal
- name: "Build dependency: ffmpeg (universal)"
if: steps.restore-cache.outputs.cache-hit != 'true'
shell: bash
run: |
# Install to separate staging paths for all architectures in
# preparation for fusing universal libraries in a follow-up step.
cd "$RUNNER_TEMP"
git clone https://github.com/FFmpeg/FFmpeg ffmpeg-arm64
cd ffmpeg-arm64
git checkout 066432ebcf
# Common FFmpeg configure options
FFMPEG_CONFIG_OPTIONS=" \
--enable-shared \
--disable-static \
$(cat $GITHUB_WORKSPACE/tools/ffmpeg_flags.txt)"
# Configure for arm64.
./configure \
--arch=arm64 \
--prefix=${{ inputs.FFMPEG_INSTALL_TMP_ARM64 }} \
--cc='clang' \
$FFMPEG_CONFIG_OPTIONS
# Build and install.
make -j$(sysctl -n hw.ncpu)
sudo make install
cd "$RUNNER_TEMP"
git clone https://github.com/FFmpeg/FFmpeg ffmpeg-x86-64
cd ffmpeg-x86-64
git checkout 066432ebcf
# Configure for x86-64.
./configure \
--arch=x86_64 \
--enable-cross-compile \
--prefix=${{ inputs.FFMPEG_INSTALL_TMP_X86_64 }} \
--cc='clang -arch x86_64' \
$FFMPEG_CONFIG_OPTIONS
# Build and install.
make -j$(sysctl -n hw.ncpu)
sudo make install
- name: "Build dependency: ffmpeg (fuse universal libraries)"
if: steps.restore-cache.outputs.cache-hit != 'true'
shell: bash
run: |
# Libs
FFMPEG_LIBS=(
"libavcodec"
"libavdevice"
"libavfilter"
"libavformat"
"libavutil"
"libswresample"
"libswscale"
)
# Recreate include tree in MacPorts install prefix.
sudo rsync -arvL ${{ inputs.FFMPEG_INSTALL_TMP_ARM64 }}/include/ ${{ inputs.CACHE_SRC_DIR }}/include/
# Recreate library symlinks in MacPorts install prefix.
sudo find ${{ inputs.FFMPEG_INSTALL_TMP_ARM64 }}/lib/ -type l -exec cp -P '{}' ${{ inputs.CACHE_SRC_DIR }}/lib/ ';'
# Fuse platform-specific binaries into a universal binary.
for LIB in ${FFMPEG_LIBS[@]}; do
RESOLVED_LIB=$(ls -l ${{ inputs.FFMPEG_INSTALL_TMP_ARM64 }}/lib/${LIB}* \
| grep -v '^l' \
| awk -F'/' '{print $NF}')
sudo lipo -create \
${{ inputs.FFMPEG_INSTALL_TMP_ARM64 }}/lib/$RESOLVED_LIB \
${{ inputs.FFMPEG_INSTALL_TMP_X86_64 }}/lib/$RESOLVED_LIB \
-output ${{ inputs.CACHE_SRC_DIR }}/lib/$RESOLVED_LIB
sudo ln -s -f \
${{ inputs.CACHE_SRC_DIR }}/lib/$RESOLVED_LIB \
${{ inputs.FFMPEG_INSTALL_TMP_ARM64 }}/lib/$RESOLVED_LIB
sudo ln -s -f \
${{ inputs.CACHE_SRC_DIR }}/lib/$RESOLVED_LIB \
${{ inputs.FFMPEG_INSTALL_TMP_X86_64 }}/lib/$RESOLVED_LIB
done
# Update and install pkgconfig files.
for file in "${{ inputs.FFMPEG_INSTALL_TMP_ARM64 }}/lib/pkgconfig"/*.pc; do
sudo sed -i '' "s:${{ inputs.FFMPEG_INSTALL_TMP_ARM64 }}:${{ inputs.CACHE_SRC_DIR }}:g" "$file"
done
sudo mv ${{ inputs.FFMPEG_INSTALL_TMP_ARM64 }}/lib/pkgconfig/* ${{ inputs.CACHE_SRC_DIR }}/lib/pkgconfig/
- name: "Prepare dependencies for caching"
if: steps.restore-cache.outputs.cache-hit != 'true'
shell: bash
run: |
# Remove MacPorts leftover build and download files
sudo rm -rf /opt/local/var/macports/build/*
sudo rm -rf /opt/local/var/macports/distfiles/*
sudo rm -rf /opt/local/var/macports/packages/*
# Delete broken symlinks
sudo find ${{ inputs.CACHE_SRC_DIR }} -type l ! -exec test -e {} \; -exec rm {} \;
# Trying to cache the source directory directly leads to permission errors,
# so copy it to an intermediate temporary directory.
sudo rsync -arvq ${{ inputs.CACHE_SRC_DIR }}/ ${{ inputs.CACHE_DIR }}
- name: "Save dependencies to cache"
if: steps.restore-cache.outputs.cache-hit != 'true'
uses: actions/cache/save@v4
with:
key: ${{ runner.os }}-tooling-${{ hashFiles('.github/actions/prepare_macos_tooling/action.yml') }}
path: |
${{ inputs.CACHE_DIR }}
================================================
FILE: .github/docker/lint.Dockerfile
================================================
FROM python:3.12-slim-bookworm
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y --no-install-recommends \
ca-certificates \
curl \
git \
gnupg \
xz-utils \
&& rm -rf /var/lib/apt/lists/*
RUN curl -fsSL https://apt.llvm.org/llvm-snapshot.gpg.key | gpg --dearmor -o /usr/share/keyrings/llvm-archive-keyring.gpg
RUN echo 'deb [signed-by=/usr/share/keyrings/llvm-archive-keyring.gpg] https://apt.llvm.org/bookworm llvm-toolchain-bookworm-22 main' > /etc/apt/sources.list.d/llvm.list
RUN apt-get update && apt-get install -y --no-install-recommends \
clang-format-22 \
&& apt-get purge -y --auto-remove gnupg xz-utils \
&& rm -rf /var/lib/apt/lists/*
RUN ln -s /usr/bin/clang-format-22 /usr/local/bin/clang-format
RUN just_version='1.40.0' && \
curl -fsSL "https://github.com/casey/just/releases/download/${just_version}/just-${just_version}-x86_64-unknown-linux-musl.tar.gz" \
| tar -xz -C /usr/local/bin just && \
chmod +x /usr/local/bin/just
RUN python3 -m pip install --no-cache-dir \
prek \
pyjson5
ENV PATH="/usr/local/bin:${PATH}"
================================================
FILE: .github/pull_request_template.md
================================================
#### Checklist
- [ ] I have read the [coding conventions](https://github.com/LostArtefacts/TRX/blob/develop/docs/CONTRIBUTING.md#coding-conventions)
- [ ] I have added a changelog entry about what my pull request accomplishes, or it is an internal change
- [ ] I have added a readme entry about my new feature or OG bug fix, or it is a different change
#### Description
...
================================================
FILE: .github/workflows/build_docker.yml
================================================
name: Build Docker toolchain
on:
- workflow_dispatch
jobs:
publish_docker_image:
name: Build Docker toolchain
runs-on: ubuntu-latest
strategy:
matrix:
include:
- platform: win
- platform: linux
steps:
- name: Login to Docker Hub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
- name: Install dependencies
uses: taiki-e/install-action@just
- name: Checkout code
uses: actions/checkout@v4
with:
submodules: 'true'
- name: Build Docker image (${{ matrix.platform }})
run: |
just image-${{ matrix.platform }}
just push-image-${{ matrix.platform }}
================================================
FILE: .github/workflows/build_lint_image.yml
================================================
name: Build lint image
on:
push:
branches:
- main
- lint
paths:
- .github/docker/lint.Dockerfile
- .github/workflows/build_lint_image.yml
workflow_dispatch:
permissions:
contents: read
packages: write
jobs:
build:
name: Build and push lint image
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Login to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Normalize repository owner
id: vars
run: echo "owner_lc=${GITHUB_REPOSITORY_OWNER,,}" >> "$GITHUB_OUTPUT"
- name: Build and push lint image
uses: docker/build-push-action@v6
with:
context: .
file: .github/docker/lint.Dockerfile
push: true
tags: |
ghcr.io/${{ steps.vars.outputs.owner_lc }}/trx-lint:latest
ghcr.io/${{ steps.vars.outputs.owner_lc }}/trx-lint:${{ github.sha }}
================================================
FILE: .github/workflows/comment_build.yml
================================================
name: Post build links to pull request
on:
workflow_run:
workflows: ['Create a test build']
types: [completed]
permissions:
actions: write
contents: write
pull-requests: write
jobs:
pr_comment:
if: github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'success'
runs-on: ubuntu-latest
steps:
- uses: actions/github-script@v7
with:
# This snippet is public-domain, combined from
# https://github.com/oprypin/nightly.link/blob/master/.github/workflows/pr-comment.yml
# https://github.com/AKSW/submission.d2r2.aksw.org/blob/main/.github/workflows/pr-comment.yml
script: |
// Function Definitions
class NoMatchingPRError extends Error {
constructor(message) {
super(message);
this.name = "NoMatchingPRError";
}
}
/**
* Fetch PR details for a given commit SHA.
* @returns {Object} PR details containing prNumber, prRef, prRepoId.
* @throws {Error} If no matching PR is found.
*/
async function fetchPRDetails() {
const iterator = github.paginate.iterator(github.rest.pulls.list, {
owner: context.repo.owner,
repo: context.repo.repo,
});
for await (const { data } of iterator) {
for (const pull of data) {
if (pull.head.sha === '${{github.event.workflow_run.head_sha}}') {
return {
prNumber: pull.number,
prRef: pull.head.ref,
prRepoId: pull.head.repo.id
};
}
}
}
throw new NoMatchingPRError("No matching PR found for the commit SHA");
}
/**
* Fetch all artifacts for a given workflow run.
* @returns {Object} All artifacts data.
* @throws {Error} If no artifacts are found.
*/
async function fetchAllArtifacts() {
const artifactsResponse = await github.rest.actions.listWorkflowRunArtifacts({
owner: context.repo.owner,
repo: context.repo.repo,
run_id: context.payload.workflow_run.id,
});
if (!(artifactsResponse.data && artifactsResponse.data.artifacts && artifactsResponse.data.artifacts.length)) {
throw new Error("No artifacts found for the workflow run");
}
return artifactsResponse.data.artifacts;
}
/**
* Create or update a comment on the PR.
* @param {number} prNumber - The PR number.
* @param {string} purpose - The purpose of the comment.
* @param {string} body - The comment body.
* @throws {Error} If the comment creation or update fails.
*/
async function upsertComment(prNumber, purpose, body) {
const { data: comments } = await github.rest.issues.listComments({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: prNumber,
});
const marker = `<!-- bot: ${purpose} -->`;
body = marker + "\n" + body;
const existing = comments.filter(c => c.body.includes(marker));
if (existing.length > 0) {
const last = existing[existing.length - 1];
core.info(`Updating comment ${last.id}`);
await github.rest.issues.updateComment({
owner: context.repo.owner,
repo: context.repo.repo,
body: body,
comment_id: last.id,
});
} else {
core.info(`Creating a comment in PR #${prNumber}`);
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
body: body,
issue_number: prNumber,
});
}
}
/**
* Handle and log errors with detailed context and exit the process.
* @param {Error} error - The error object.
* @param {string} description - Description of the context where the error occurred.
*/
function handleError(error, description, prNumber) {
let exitCode = 1;
let log = core.error;
if (error instanceof NoMatchingPRError) {
exitCode = 0;
log = core.warning;
}
log(`Failed to ${description}`);
log(`Message: ${error.message}`);
log(`Stack Trace: ${error.stack || 'No stack trace available'}`);
if (prNumber) {
log(`PR Number: ${prNumber}`);
}
log(`PRs: https://api.github.com/repos/${context.repo.owner}/${context.repo.repo}/pulls`);
log(`SHA: ${{github.event.workflow_run.head_sha}}`);
process.exit(exitCode);
}
// Main Code Execution
let prNumber, prRef, prRepoId;
// Fetch PR details
try {
({ prNumber, prRef, prRepoId } = await fetchPRDetails());
core.info(`Found PR: #${prNumber}, Ref: ${prRef}, Repo ID: ${prRepoId}`);
} catch (error) {
handleError(error, 'fetch PR details', undefined);
}
// Fetch all artifacts
let allArtifacts;
try {
allArtifacts = await fetchAllArtifacts();
core.info(`Artifacts fetched successfully`);
} catch (error) {
handleError(error, 'fetch artifacts', prNumber);
}
// Construct the comment body
let body = 'Download the built assets for this pull request:\n' +
allArtifacts
.filter(item => item.name !== "assets")
.sort((a, b) => a.name.localeCompare(b.name))
.map(item => `* [${item.name}.zip](https://nightly.link/${context.repo.owner}/${context.repo.repo}/actions/artifacts/${item.id}.zip)`)
.join('\n');
// Upsert the comment on the PR
try {
await upsertComment(prNumber, "nightly-link", body);
core.info("Comment created/updated successfully");
} catch (error) {
handleError(error, 'create/update comment', prNumber);
}
================================================
FILE: .github/workflows/job_build.yml
================================================
name: Build TRX and the installer
on:
workflow_call:
inputs:
platform:
type: string
description: "Platform to build for"
required: true
target:
type: string
description: "Target to build for"
required: true
zip:
type: boolean
description: "Pack the artifacts into zip"
required: true
jobs:
build:
name: Build release assets
runs-on: ubuntu-latest
steps:
- name: Install dependencies
uses: taiki-e/install-action@just
- name: Checkout code
uses: actions/checkout@v4
with:
submodules: 'true'
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha || github.sha }}
- id: vars
name: Prepare variables
run: |
echo "version=$(just output-current-version)" >> $GITHUB_OUTPUT
echo "tr1_dir=build/artifacts/tr1/" >> $GITHUB_OUTPUT
echo "tr2_dir=build/artifacts/tr2/" >> $GITHUB_OUTPUT
echo "tr3_dir=build/artifacts/tr3/" >> $GITHUB_OUTPUT
echo "trx_dir=build/artifacts/trx/" >> $GITHUB_OUTPUT
echo "tr1_asset=$(just output-package-name --game 1 --platform ${{ inputs.platform }})" >> $GITHUB_OUTPUT
echo "tr2_asset=$(just output-package-name --game 2 --platform ${{ inputs.platform }})" >> $GITHUB_OUTPUT
echo "tr3_asset=$(just output-package-name --game 3 --platform ${{ inputs.platform }})" >> $GITHUB_OUTPUT
echo "trx_asset=$(just output-package-name --platform ${{ inputs.platform }})" >> $GITHUB_OUTPUT
- name: Download large assets
if: ${{ inputs.target == 'release' }}
run: |
just download-assets 1
just download-assets 2
just download-assets 3
just download-assets --combined
- name: Restore ccache
if: ${{ inputs.platform == 'linux' || inputs.platform == 'win' }}
uses: actions/cache@v4
with:
path: .cache/ccache
key: ccache-v1-${{ runner.os }}-${{ inputs.platform }}-${{ inputs.target }}-${{ hashFiles('justfile', 'tools/shared/docker/game-linux/Dockerfile', 'tools/shared/docker/game-win/Dockerfile', 'tools/shared/docker/game-win/meson_linux_mingw32.txt') }}
restore-keys: |
ccache-v1-${{ runner.os }}-${{ inputs.platform }}-${{ inputs.target }}-
ccache-v1-${{ runner.os }}-${{ inputs.platform }}-
- name: Package asset (${{ inputs.platform }})
env:
CCACHE_DIR: /app/.cache/ccache/${{ inputs.platform }}-${{ inputs.target }}
CCACHE_BASEDIR: /app
CCACHE_COMPILERCHECK: content
CCACHE_MAXSIZE: 1G
run: |
if [ "${{ inputs.platform }}" = "linux" ] || [ "${{ inputs.platform }}" = "win" ]; then
mkdir -p ".cache/ccache/${{ inputs.platform }}-${{ inputs.target }}"
if [ "${{ inputs.zip }}" = "1" ] || [ "${{ inputs.zip }}" = "true" ]; then
just trx-package-${{ inputs.platform }} "${{ inputs.target }}" -o "build/artifacts/"
else
just trx-package-${{ inputs.platform }} "${{ inputs.target }}" -o "build/artifacts/" --no-zip
fi
else
if [ "${{ inputs.zip }}" = "1" ] || [ "${{ inputs.zip }}" = "true" ]; then
just tr1-package-${{ inputs.platform }} "${{ inputs.target }}" -o "${{ steps.vars.outputs.tr1_dir }}"
just tr2-package-${{ inputs.platform }} "${{ inputs.target }}" -o "${{ steps.vars.outputs.tr2_dir }}"
just trx-package-${{ inputs.platform }} "${{ inputs.target }}" -o "${{ steps.vars.outputs.trx_dir }}"
else
just tr1-package-${{ inputs.platform }} "${{ inputs.target }}" -o "${{ steps.vars.outputs.tr1_dir }}" --no-zip
just tr2-package-${{ inputs.platform }} "${{ inputs.target }}" -o "${{ steps.vars.outputs.tr2_dir }}" --no-zip
just trx-package-${{ inputs.platform }} "${{ inputs.target }}" -o "${{ steps.vars.outputs.trx_dir }}" --no-zip
fi
fi
- name: Upload artifacts (tr1)
uses: actions/upload-artifact@v4
with:
name: ${{ steps.vars.outputs.tr1_asset }}
path: ${{ steps.vars.outputs.tr1_dir }}
compression-level: 0
- name: Upload artifacts (tr2)
uses: actions/upload-artifact@v4
with:
name: ${{ steps.vars.outputs.tr2_asset }}
path: ${{ steps.vars.outputs.tr2_dir }}
compression-level: 0
- name: Upload artifacts (tr3)
if: ${{ inputs.platform != 'win-installer' }}
uses: actions/upload-artifact@v4
with:
name: ${{ steps.vars.outputs.tr3_asset }}
path: ${{ steps.vars.outputs.tr3_dir }}
compression-level: 0
- name: Upload artifacts (combined)
uses: actions/upload-artifact@v4
with:
name: ${{ steps.vars.outputs.trx_asset }}
path: ${{ steps.vars.outputs.trx_dir }}
compression-level: 0
================================================
FILE: .github/workflows/job_build_macos.yml
================================================
name: Build TRX and the installer (macOS)
on:
workflow_call:
inputs:
target:
type: string
description: "Target to build for"
required: true
let_mac_fail:
type: boolean
description: "Do not require Mac builds to pass"
required: false
default: false
env:
FFMPEG_INSTALL_FINAL: /opt/local
FFMPEG_INSTALL_TMP_UNIVERSAL: /tmp/install_universal
FFMPEG_INSTALL_TMP_ARM64: /tmp/install_arm64
FFMPEG_INSTALL_TMP_X86_64: /tmp/install_x86_64
CACHE_TMP_DIR: /tmp/opt_local/
CACHE_DST_DIR: /opt/local/
C_INCLUDE_PATH: /opt/local/include/uthash/:/opt/local/include/
jobs:
build:
strategy:
matrix:
game:
- { version: 1 }
- { version: 2 }
- { version: 3 }
name: Build release assets
runs-on: macos-14
continue-on-error: ${{ inputs.let_mac_fail == true || inputs.let_mac_fail == 'true' }}
steps:
- name: Set up signing certificate
env:
MACOS_KEYCHAIN_PWD: ${{ secrets.MACOS_KEYCHAIN_PWD }}
MACOS_CERTIFICATE: ${{ secrets.MACOS_CERTIFICATE }}
MACOS_CERTIFICATE_PWD: ${{ secrets.MACOS_CERTIFICATE_PWD }}
run: |
CERTIFICATE_PATH=$RUNNER_TEMP/build_certificate.p12
KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db
echo -n "$MACOS_CERTIFICATE" | base64 --decode -o $CERTIFICATE_PATH
security create-keychain -p "$MACOS_KEYCHAIN_PWD" $KEYCHAIN_PATH
security set-keychain-settings -lut 21600 $KEYCHAIN_PATH
security unlock-keychain -p "$MACOS_KEYCHAIN_PWD" $KEYCHAIN_PATH
security import $CERTIFICATE_PATH -P "$MACOS_KEYCHAIN_PWD" -A -t cert -f pkcs12 -k $KEYCHAIN_PATH -T /usr/bin/codesign
security list-keychain -d user -s $KEYCHAIN_PATH
security set-key-partition-list -S "apple-tool:,apple:,codesign:" -s -k $MACOS_KEYCHAIN_PWD $KEYCHAIN_PATH
- name: Checkout
uses: actions/checkout@v4
with:
submodules: 'true'
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha || github.sha }}
- id: vars
name: Prepare variables
run: |
echo "version=$(tools/get_version)" >> $GITHUB_OUTPUT
echo "tag=tr${{matrix.game.version}}" >> $GITHUB_OUTPUT
echo "name=TR${{matrix.game.version}}X" >> $GITHUB_OUTPUT
echo "asset_name=$(tools/output_package_name --game ${{matrix.game.version}} --platform mac)" >> $GITHUB_OUTPUT
- name: Extend PATH for MacPorts
run: |
echo -e "/opt/local/bin" >> $GITHUB_PATH
echo -e "/opt/local/sbin" >> $GITHUB_PATH
- name: "Try restore dependencies from cache"
id: restore-cache
uses: actions/cache/restore@v4
with:
key: ${{ runner.os }}-tooling-${{ hashFiles('.github/actions/prepare_macos_tooling/action.yml') }}
path: |
/tmp/opt_local/
- name: "Build MacOS dependencies"
if: steps.restore-cache.outputs.cache-hit != 'true'
uses: ./.github/actions/prepare_macos_tooling
with:
CACHE_DIR: /tmp/opt_local/
- name: "Prepare cached dependencies for use"
if: steps.restore-cache.outputs.cache-hit == 'true'
shell: bash
run: |
sudo rsync -arvq /tmp/opt_local/ /opt/local/
sudo dscl . -create /Groups/macports
sudo dscl . -create /Groups/macports RealName "MacPorts"
sudo dscl . -create /Groups/macports PrimaryGroupID 501
sudo dscl . -create /Groups/macports GeneratedUID 172D097F-351A-4579-BBD1-430D99BC4ABF
sudo dscl . -append /Groups/macports GroupMembership macports
sudo dscl . -create /Users/macports
sudo dscl . -create /Users/macports RealName "MacPorts"
sudo dscl . -create /Users/macports UniqueID 502
sudo dscl . -create /Users/macports PrimaryGroupID 501
sudo dscl . -create /Users/macports UserShell /usr/bin/false
sudo dscl . -create /Users/macports NFSHomeDirectory /opt/local/var/macports/home
sudo mkdir -p /opt/local/var/macports/home
sudo chown -R macports:macports /opt/local/var/macports
- name: Setup CA
run: |
sudo port -N install apple-pki-bundle curl-ca-bundle
- name: Download large assets
#if: ${{ inputs.target == 'release' }}
run: tools/download_assets ${{ matrix.game.version }}
- name: Build arm64 and create app bundle
env:
CC: clang
run: |
BUILD_DIR=build-arm64
BUILD_OPTIONS="src --prefix=/tmp/${{ steps.vars.outputs.name }}.app --bindir=Contents/MacOS --buildtype ${{ inputs.target }}"
meson setup $BUILD_DIR $BUILD_OPTIONS
meson install -C $BUILD_DIR --tags "${{ steps.vars.outputs.tag }},common"
- name: Build x86-64
env:
CC: clang
run: |
BUILD_DIR=build-x86-64
BUILD_OPTIONS="src --prefix=/tmp/${{ steps.vars.outputs.name }}.app --bindir=Contents/MacOS --cross-file tools/shared/mac/x86-64_cross_file.txt --buildtype ${{ inputs.target }}"
meson setup $BUILD_DIR $BUILD_OPTIONS
meson compile -C $BUILD_DIR
- name: Fuse universal executable
run: |
BUNDLE_EXEC_DIR=/tmp/${{ steps.vars.outputs.name }}.app/Contents/MacOS
# Fuse executable and move it into the app bundle.
lipo -create build-x86-64/TRX $BUNDLE_EXEC_DIR/TRX -output $BUNDLE_EXEC_DIR/TRX_universal
mv $BUNDLE_EXEC_DIR/TRX_universal $BUNDLE_EXEC_DIR/TRX
# Update dynamic library links in the fused executable.
./tools/shared/mac/bundle_dylibs -a ${{ steps.vars.outputs.name }} --links-only
- name: Sign app bundle
run: |
KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db
IDENTITY=$(security find-identity -v -p codesigning $KEYCHAIN_PATH | awk -F'"' '{print $2}')
xattr -cr /tmp/${{ steps.vars.outputs.name }}.app
/usr/bin/codesign --force --deep --options runtime -s "${IDENTITY}" --keychain $KEYCHAIN_PATH -v /tmp/${{ steps.vars.outputs.name }}.app
- name: Create, sign and notarize disk image
env:
MACOS_APPLEID: ${{ secrets.MACOS_APPLEID }}
MACOS_APP_PWD: ${{ secrets.MACOS_APP_PWD }}
MACOS_TEAMID: ${{ secrets.MACOS_TEAMID }}
run: |
KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db
IDENTITY=$(security find-identity -v -p codesigning $KEYCHAIN_PATH | awk -F'"' '{print $2}')
DMG_NAME="${{ steps.vars.outputs.asset_name }}.dmg"
tools/shared/mac/create_installer -a ${{ steps.vars.outputs.name }} -i "data/${{ steps.vars.outputs.tag }}/mac/icon.icns" -d "${DMG_NAME}"
xattr -cr "${DMG_NAME}"
/usr/bin/codesign --force --options runtime -s "${IDENTITY}" --keychain $KEYCHAIN_PATH -v "${DMG_NAME}"
xcrun notarytool submit --wait --apple-id "$MACOS_APPLEID" --password "$MACOS_APP_PWD" --team-id "$MACOS_TEAMID" "${DMG_NAME}"
xcrun stapler staple -v "${DMG_NAME}"
- name: Upload signed+notarized installer image
uses: actions/upload-artifact@v4
with:
name: ${{ steps.vars.outputs.asset_name }}
path: |
*.dmg
compression-level: 0 # .dmg is already compressed.
================================================
FILE: .github/workflows/job_release.yml
================================================
name: Create a new release
on:
workflow_call:
inputs:
draft:
type: boolean
description: "Draft"
required: true
default: false
prerelease:
type: boolean
description: "Prerelease"
required: true
default: false
tag_name:
type: string
description: "Tag name"
required: false
default: github.ref_name
jobs:
release:
name: Release
runs-on: ubuntu-latest
steps:
- name: "Install dependencies"
uses: taiki-e/install-action@just
- name: "Checkout code"
uses: actions/checkout@v4
with:
submodules: 'true'
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha || github.sha }}
- name: "Prepare release data"
id: prepare_release_data
run: |
if [ "${{ inputs.prerelease }}" = "1" ] || [ "${{ inputs.prerelease }}" = "true" ]; then
echo "release_name=Development snapshot" >> $GITHUB_OUTPUT
echo "changelog<<EOF" >> $GITHUB_OUTPUT
just output-current-changelog >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
else
echo -n "release_name=" >> $GITHUB_OUTPUT
just output-release-name >> $GITHUB_OUTPUT
echo "changelog<<EOF" >> $GITHUB_OUTPUT
just output-current-changelog --stable >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
fi
- name: "Download built assets"
uses: actions/download-artifact@v4
with:
path: artifacts/
merge-multiple: true
- name: "Get information on the latest pre-release"
if: ${{ inputs.prerelease == true || inputs.prerelease == 'true' }}
id: last_release
uses: InsonusK/get-latest-release@v1.0.1
with:
myToken: ${{ github.token }}
exclude_types: "draft|release"
- name: 'Mark the pre-release as latest'
if: ${{ inputs.prerelease == true || inputs.prerelease == 'true' }}
uses: EndBug/latest-tag@latest
- name: "Delete old pre-release assets"
if: ${{ inputs.prerelease == true || inputs.prerelease == 'true' }}
uses: mknejp/delete-release-assets@v1
continue-on-error: true
with:
token: ${{ github.token }}
tag: ${{ steps.last_release.outputs.tag_name }}
assets: "*.*"
- name: "Publish a release"
uses: softprops/action-gh-release@v2.2.2
with:
token: ${{ secrets.GITHUB_TOKEN }}
tag_name: ${{ inputs.tag_name }}
name: ${{ steps.prepare_release_data.outputs.release_name }}
body: ${{ steps.prepare_release_data.outputs.changelog }}
draft: ${{ inputs.draft == true || inputs.draft == 'true' }}
prerelease: ${{ inputs.prerelease == true || inputs.prerelease == 'true' }}
fail_on_unmatched_files: true
files: |
artifacts/*
================================================
FILE: .github/workflows/lint.yml
================================================
name: Run code linters
on:
- push
- pull_request
jobs:
lint:
name: Run code linters
runs-on: ubuntu-latest
env:
PREK_HOME: ${{ github.workspace }}/.cache/prek
permissions:
contents: read
packages: read
container:
image: ghcr.io/lostartefacts/trx-lint:latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 1
fetch-tags: false
ref: ${{ github.event.pull_request.head.sha || github.sha }}
- name: Configure git safe directory
working-directory: ${{ github.workspace }}
run: git config --global --add safe.directory "${GITHUB_WORKSPACE}"
- name: Ensure prek cache dir exists
run: mkdir -p "${PREK_HOME}"
- name: Restore prek cache
uses: actions/cache@v4
with:
path: .cache/prek
key: prek-v1-${{ runner.os }}-${{ hashFiles('.pre-commit-config.yaml') }}
restore-keys: |
prek-v1-${{ runner.os }}-
- name: Check formatted code differences
working-directory: ${{ github.workspace }}
run: |
set +e
just lint-format
lint_format_status=$?
set -e
if ! git diff --quiet; then
echo 'Formatting diffs detected in:'
git diff --exit-code || (
clang-format --version
echo 'Please run `just lint` and commit the changes.'
exit 1
)
fi
if [ "${lint_format_status}" -ne 0 ]; then
clang-format --version
echo 'just lint-format failed.'
exit "${lint_format_status}"
fi
- name: Check imports
working-directory: ${{ github.workspace }}
run: |
git add -u
just lint-imports
git diff --exit-code || (
include-what-you-use --version
echo 'Please run `just lint` and commit the changes.'
exit 1
)
================================================
FILE: .github/workflows/pr_builds.yml
================================================
name: Create a test build
permissions:
contents: write
on:
pull_request:
push:
branches:
- '!stable'
- '!develop'
jobs:
package_linux:
name: Linux
uses: ./.github/workflows/job_build.yml
with:
platform: linux
target: debug
zip: false
secrets: inherit
package_win:
name: Windows
uses: ./.github/workflows/job_build.yml
with:
platform: win
target: debug
zip: false
secrets: inherit
# package_mac:
# name: Mac
# if: vars.MACOS_ENABLE == 'true'
# uses: ./.github/workflows/job_build_macos.yml
# with:
# target: debug
# let_mac_fail: true
# secrets: inherit
================================================
FILE: .github/workflows/prerelease.yml
================================================
name: Publish a pre-release
permissions:
contents: write
on:
push:
branches:
- develop
jobs:
package_linux:
name: Build Linux
if: vars.PRERELEASE_ENABLE == 'true'
uses: ./.github/workflows/job_build.yml
with:
platform: linux
target: debug
zip: true
secrets: inherit
package_win:
name: Build Windows
if: vars.PRERELEASE_ENABLE == 'true'
uses: ./.github/workflows/job_build.yml
with:
platform: win
target: debug
zip: true
secrets: inherit
# package_win_installer:
# name: Build Windows installer
# if: vars.PRERELEASE_ENABLE == 'true'
# uses: ./.github/workflows/job_build.yml
# with:
# platform: win-installer
# target: debug
# zip: false
# secrets: inherit
package_mac:
name: Build Mac
if: |
vars.PRERELEASE_ENABLE == 'true' &&
vars.MACOS_ENABLE == 'true'
uses: ./.github/workflows/job_build_macos.yml
with:
target: debug
let_mac_fail: true
secrets: inherit
publish_prerelease:
if: always() && (vars.PRERELEASE_ENABLE == 'true')
name: Create a prerelease
needs:
- package_linux
- package_mac
- package_win
# - package_win_installer
with:
draft: false
prerelease: true
tag_name: 'latest'
uses: ./.github/workflows/job_release.yml
================================================
FILE: .github/workflows/release.yml
================================================
name: Publish a release
permissions:
contents: write
on:
push:
branch: stable
tags:
- "trx-*"
workflow_dispatch:
inputs:
draft:
description: "Draft"
required: true
type: boolean
default: false
prerelease:
description: "Prerelease"
required: true
type: boolean
default: false
tag_name:
description: "Tag name"
required: false
type: string
default: github.ref_name
jobs:
package_linux:
name: Build Linux
if: vars.RELEASE_ENABLE == 'true'
uses: ./.github/workflows/job_build.yml
with:
platform: linux
target: release
zip: true
secrets: inherit
package_win:
name: Build Windows
if: vars.RELEASE_ENABLE == 'true'
uses: ./.github/workflows/job_build.yml
with:
platform: win
target: release
zip: true
secrets: inherit
package_win_installer:
name: Build Windows installer
if: vars.RELEASE_ENABLE == 'true'
uses: ./.github/workflows/job_build.yml
with:
platform: win-installer
target: release
zip: false
secrets: inherit
package_mac:
name: Build Mac
if: |
vars.RELEASE_ENABLE == 'true' &&
vars.MACOS_ENABLE == 'true'
uses: ./.github/workflows/job_build_macos.yml
with:
target: release
let_mac_fail: ${{ inputs.let_mac_fail == true || inputs.let_mac_fail == 'true' }}
secrets: inherit
publish_release:
if: always() && (vars.RELEASE_ENABLE == 'true')
name: Create a GitHub release
needs:
- package_linux
- package_win
- package_win_installer
- package_mac
with:
draft: ${{ inputs.draft || false }}
prerelease: ${{ inputs.draft || false }}
tag_name: ${{ inputs.tag_name || github.ref_name }}
uses: ./.github/workflows/job_release.yml
================================================
FILE: .gitignore
================================================
*.cache.json
TR1X.dll
TR1X.exe
TR1X.log
TR2X.dll
TR2X.exe
TR2X.log
# Docker builds garbage
/build
/.secrets
/.local
/workflow
/TR1X*.zip
/TR1X*.exe
/TR2X*.zip
/TR2X*.exe
__pycache__/
# VS garbage
v15/
v16/
*.suo
*.o
*.obj
*.pdb
*.lib
*.exp
Debug/
Release/
*.user
*.ipch
.vs/
*.vcxproj
*.filters
.dotnet/
# MacOS garbage
.DS_Store
# libtrx artefacts
**/subprojects/packagecache/
**/subprojects/dwarfstack-*/
data/tr1/ship/data/images/
data/tr2/ship/data/images/
data/tr2/ship/data/level1.tr2
data/tr2/ship/data/level2.tr2
data/tr2/ship/data/level3.tr2
data/tr2/ship/data/level4.tr2
data/tr2/ship/data/level5.tr2
data/tr2/ship/data/main_gm.sfx
data/tr2/ship/data/title_gm.tr2
data/tr2/ship/music/
data/tr3/ship/data/images/
tools/installer/TR1X_Installer/Resources/release.zip
tools/installer/TR2X_Installer/Resources/release.zip
tools/installer/TRX_Installer/Resources/release.zip
================================================
FILE: .gitmodules
================================================
[submodule "libtrx"]
path = subprojects/libtrx
url = https://github.com/LostArtefacts/libtrx.git
================================================
FILE: .pre-commit-config.yaml
================================================
repos:
- repo: local
hooks:
- id: clang-format
name: clang-format
entry: clang-format
args: ["-style=file", "-i"]
language: system
files: \.[ch](pp)?$
- id: additional-lint
name: Run additional linters
entry: tools/additional_lint
language: python
stages: [pre-commit]
additional_dependencies:
- pyjson5
- jsonschema
- id: additional-lint -a
name: Run additional linters (repo-wide)
entry: tools/additional_lint -a
language: python
stages: [pre-commit]
pass_filenames: false
additional_dependencies:
- pyjson5
- jsonschema
- id: imports
name: imports
entry: tools/sort_imports
language: system
files: \.[ch](pp)?$
- id: update-game-strings
name: Update game strings to match source code
entry: tools/update_game_strings
language: python
stages: [pre-commit]
pass_filenames: false
additional_dependencies:
- pyjson5
- repo: https://github.com/JohnnyMorganz/StyLua
rev: v2.3.0
hooks:
- id: stylua-github
================================================
FILE: BUG_REPORTING.md
================================================
# TRX Bug Reporting Guide
Thanks for taking the time to report an issue.
Good bug reports help us reproduce problems quickly and spend more time fixing
them instead of guessing. The goal is simple: give us enough information to
see the same bug you saw.
## 1. Where to report bugs
- Please report bugs on GitHub issues.
- If you cannot create a GitHub account, use `#trx-bugs` on Discord.
- For Discord users, please **do not** report bugs in general chat.
They are much harder to track there and usually miss important details.
## 2. One issue per report
Please open one ticket per bug.
Keeping reports separate makes it easier to reproduce, discuss, fix, and close
each issue cleanly.
## 3. What every report should include
Please include:
- Clear step-by-step reproduction steps
- Exact TRX version
- Operating system
- Logs, especially `TRX.log`
- GPU details if you think it might be relevant
Helpful extras:
- Save files
- Screenshots
- Videos
Extra requirement for custom levels:
- Include the level files
If a custom level bug does not include the level data, we usually cannot debug
it properly.
## 4. How to write reproduction steps
Try to describe the shortest reliable path to the issue.
Good examples:
- > 1. Load Escape from the Base
> 2. Reach room 66
> 3. pull the lever
> 4. game crashes.
- > Play level X → do Y → push block disappears.
Less helpful example:
- `The game crashes sometimes when playing Bartoli's Bughouse.`
That kind of report tells us something is wrong, but not how to reproduce it,
and thus we can't do anything about it.
## 5. Why this matters
Actionable reports are the fastest route to a fix.
If a report does not include reproduction steps, version details, or the files
needed to reproduce the issue, we may not be able to investigate it further and
on a bad day may close it altogether.
================================================
FILE: CODE_OF_CONDUCT.md
================================================
# TRX Community Guide and Code of Conduct
TRX is a volunteer, maintainer-led open source project. We're happy to have you here.
Our number one enemy is exhaustion. If discussion drains maintainers more than
it helps the project, everyone loses. So we keep communication clean,
constructive, and low-friction. There's no room for prolonged negativity,
entitlement, or argument-as-a-hobby.
## 1. The vibe we want
- Curious, practical, kind
- Clear reports, clear proposals
- Disagreement expressed as "here's a better idea"
- Solutions over speeches
You don't need to be an expert, but you do need to be respectful and actionable.
## 2. How to participate in a way that gets results
When you want change, write it as a proposal.
Good patterns:
- "It would be great if [specific change], because [reason]".
- "Current behavior: X. Expected behavior: Y. Evidence: Z."
- "Comparison: Original game does [behavior]. TRX does [behavior]."
- "Minimal reproduction case: [shortest possible steps to trigger issue]."
- "After reading [documentation page/section], [specific information] remains unclear."
- "Technical observation: [system/component] appears to ignore [condition/input]."
- "Tested on: [version], [platform], [configuration]. Issue: [description]."
If you can't describe the change clearly, it's not ready to be requested.
Contributions are evaluated, not adopted automatically. Submitting research,
proposals, or patches does not guarantee they will be merged in their current
form, or at all. Maintainers may modify, defer, or decline contributions to
keep the project aligned with its goals and plans.
## 3. What we will not engage with
These are exhaustion-generators. They will be moderated quickly.
- Drive-by bug reports (no steps, no version, no logs, “crashes sometimes”); reports outside bug channels
- Complaints without a concrete proposal
- Catastrophizing ("this ruins the game", "this breaks everything") instead of specifics
- Re-litigating decisions after maintainers say it's decided
- "Truth voice" posting: presenting personal preference as objective fact
- Purity tests and vision wars ("real TR is X", "this feels like it drifts from the original vision", etc.)
- Mislabeling TRX as “just a mod” or otherwise misrepresenting what the project is (TRX is a standalone, reverse engineered, build-from-source engine project).
- Pressure tactics: guilt, demands, timelines, "you must", "you owe", "everyone agrees", "I think it is very important"
## 4. Governance
TRX is maintainer-led. Maintainers have final say on:
- Project vision and scope
- Features and defaults
- UI/UX and discoverability
- What gets accepted, declined, closed, or locked
You're welcome to suggest. Maintainers decide. If a decision is made, continuing to argue it is not "discussion", it's drain.
## 5. Moderation
To protect the project, maintainers may:
- Ask for a proposal format
- Close issues that aren't actionable
- Lock threads that turn circular or hostile
- Remove disruptive participants from project spaces
We don't want to do this. We will do this.
## 6. Basic respect
Instant hard no:
- Harassment or personal attacks
- Discrimination
- Threats or intimidation
## 7. If you disagree
Totally fine. Choose a productive path:
- Propose an alternative clearly
- Adjust settings to your taste
- Contribute a patch
- Fork the project
- Go play the OGs, Remasters, or something else altogether
What's not fine is trying to force agreement through volume, repetition, or hostility.
## Closing
> Push hard enough against the current, and even the river will stop trying to pull you along.
When you consistently create friction rather than progress, you will lose your seat at the table.
We're building something we care about, and we want the community (and ourselves) to feel good to be in.
================================================
FILE: COPYING.md
================================================
GNU GENERAL PUBLIC LICENSE
==========================
Version 3, 29 June 2007
==========================
> Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
# Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
# TERMS AND CONDITIONS
## 0. Definitions.
_"This License"_ refers to version 3 of the GNU General Public License.
_"Copyright"_ also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
_"The Program"_ refers to any copyrightable work licensed under this
License. Each licensee is addressed as _"you"_. _"Licensees"_ and
"recipients" may be individuals or organizations.
To _"modify"_ a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a _"modified version"_ of the
earlier work or a work _"based on"_ the earlier work.
A _"covered work"_ means either the unmodified Program or a work based
on the Program.
To _"propagate"_ a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To _"convey"_ a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
## 1. Source Code.
The _"source code"_ for a work means the preferred form of the work
for making modifications to it. _"Object code"_ means any non-source
form of a work.
A _"Standard Interface"_ means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The _"System Libraries"_ of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The _"Corresponding Source"_ for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
## 2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
## 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
## 4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
## 5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
## 6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A _"User Product"_ is either (1) a _"consumer product"_, which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
_"Installation Information"_ for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
## 7. Additional Terms.
_"Additional permissions"_ are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
## 8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
## 9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
## 10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An _"entity transaction"_ is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
## 11. Patents.
A _"contributor"_ is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's _"essential patent claims"_ are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
## 12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
## 13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
## 14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
## 15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
## 16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
## 17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
# END OF TERMS AND CONDITIONS
--------------------------------------------------------------------------
# How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type 'show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type 'show c' for details.
The hypothetical commands _'show w'_ and _'show c'_ should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
================================================
FILE: README.md
================================================
<div align="center">
<h1>TRX – Tomb Raider I & II: Community Edition</h1>
<p align="center">
<a href="https://lostartefacts.dev/">
<img src="data/trx/icon.png" style="width: 128px;" alt="TRX logo"/>
</a>
</p>
<a href="https://github.com/LostArtefacts/TRX/releases?q=prerelease%3Afalse&expanded=true">
<img src="data/download_trx.svg"/>
</a>
</div>
<hr/>
Welcome to **TRX** – an open-source reimplementation of **Tomb Raider 1**, **Tomb Raider 2** and **Tomb Raider 3**. TRX aims to enhance these classic games through decompilation and the implementation of open-source alternatives to proprietary components. TRX is a single engine capable of running TR1, TR2, and custom levels respecting each of the distinct, classic engines' mechanics.
## Showcase
<table>
<tr>
<th>
Restored braid in TR1
<img src="docs/showcase/braid.jpg"/>
</th>
<th>
Enemy health bar and UI scaling
<img src="docs/showcase/enemy_health_bar_and_scaling.jpg"/>
</th>
</tr>
<tr>
<th>
Photo mode
<img src="docs/showcase/photo_mode.webp"/>
</th>
<th>
3D pickups
<img src="docs/showcase/3d_pickups.jpg"/>
</th>
</tr>
<tr>
<th>
Skybox support
<img src="docs/showcase/skybox.jpg"/>
</th>
<th>
Updated moveset including sprint
<img src="docs/showcase/sprint.webp"/>
</th>
</tr>
<tr>
<th>
Customizable draw distance
<img src="docs/showcase/draw_distance.webp"/>
</th>
<th>
Developer console
<img src="docs/showcase/console.webp"/>
</th>
</tr>
<tr>
<th>
Detailed level stats
<img src="docs/showcase/compass_stats.jpg"/>
</th>
<th>
PS1 UI and expanded options
<img src="docs/showcase/ps1_ui_and_options.webp"/>
</th>
</tr>
</table>
## Download
Download the latest TRX release for TR1-TR3:
<a href="https://github.com/LostArtefacts/TRX/releases?q=prerelease%3Afalse&expanded=true">
<img src="data/download_trx.svg"/>
</a>
### Installation instructions
* [Tomb Raider 1](docs/tr1/INSTALLING.md).
* [Tomb Raider 2](docs/tr2/INSTALLING.md).
* [Tomb Raider 3](docs/tr3/INSTALLING.md).
* [Combined directory tree](docs/trx/INSTALLING.md).
### Changelog
For the changelog for all of the games (TRX uses a unified engine capable of
running all 3 games), please refer to [this document](docs/CHANGELOG.md).
## Q&A
1. **Are all three games fully playable from beginning to end?**
TR1 and TR2 – yes, by all means! If you encounter a bug, please file a
ticket.
TR3 is still in the works, though, and the team is hard at work to make
this happen!
2. **Can we get HD textures? What about other visual updates?**
Regarding HD texture packs, that feature is not currently planned.
As for other visual updates, being able to introduce reflections and
skyboxes shows that quite literally the sky is the limit. TRX is constantly
getting new rendering improvements and texture fixes. But great stuff
takes time.
4. **Can I play this on Mac, Linux, Android...?**
Currently supported platforms include Windows, Linux and macOS.
5. **Can I play this with a controller?**
TRX supports a wide variety of controllers out of the box with no
additional software required. The keyboard or controller controls
can be fully customized in the Controls menu with multiple layouts.
Multi-key combo shortcuts (up to 3 keys) and two binding slots per
action are also supported.
6. **What about TR3 support?**
TR3 work is well underway! Thanks to *TOMB3* serving as the backbone
for many of its core systems, tons of native systems are already in
place – new triangle geometry logic, new rendering effects, and
more. Still early, but we're moving _fast_.
## Website
The Lost Artefacts team is a small, passionate community of developers and
creators with a deep love for the classic Tomb Raider titles. Our team builds
and maintains freeware fan projects that celebrate Lara Croft's iconic
adventures. Visit the website by clicking the logo below for more information
on TRX and its documentation as well as other Tomb Raider projects.
<p align="left">
<a href="https://lostartefacts.dev/">
<img src="data/lostartefacts.png" style="width: 128px;" alt="TRX logo"/>
</a>
</p>
## Credits
- Endless GitHub contributors.
- TR1 title screen image by Kidd Bowyer. HD assets by goblan and posix.
- TR2 HD images by Arsunt.
================================================
FILE: data/common/glyphs/mapping.txt
================================================
# This file is used by the tooling in the tools/glyphs/ directory and is
# crucial for the game's graphical text handling, serving two roles:
#
# 1. Hardcoding Unicode to sprite mapping
# It generates C macros that map Unicode code points and escaped sequences
# to O_ALPHABET's sprite indices, specify glyph dimensions, and instruct how
# to compose compound characters - all getting hardcoded into the executable.
# 2. Guidance for font.bin creation
# It directs the injector tool in creating the font.bin file that contains
# O_ALPHABET sprite bitmaps, along with additional positional information.
#
# Important notes:
# - Some sprite indices are fixed. This is for compatibility with the original
# game to retains original text format even if font.bin goes missing.
include "mapping_basic_latin.txt"
include "mapping_icons.txt"
include "mapping_combining_diactrics.txt"
include "mapping_latin-1_supplement.txt"
include "mapping_latin_extended-a.txt"
include "mapping_latin_extended-b.txt"
include "mapping_greek_and_coptic.txt"
include "mapping_cyrillic.txt"
include "mapping_latin_extended_additional.txt"
include "mapping_misc.txt"
include "mapping_keyboard.txt"
include "mapping_controller.txt"
include "mapping_small.txt"
================================================
FILE: data/common/glyphs/mapping_basic_latin.txt
================================================
# --------------------------------------------------
# Unicode Block "Basic Latin" (U+0000 to U+007F)
# --------------------------------------------------
# ASCII a-z
U+0061:a 0 T manual_sprite("glyphs.png", 218, 41, 11, 18, index=26)
U+0062:b 0 T manual_sprite("glyphs.png", 229, 41, 11, 18, index=27)
U+0063:c 0 T manual_sprite("glyphs.png", 240, 41, 11, 18, index=28)
U+0064:d 0 T manual_sprite("glyphs.png", 0, 59, 11, 18, index=29)
U+0065:e 0 T manual_sprite("glyphs.png", 11, 59, 11, 18, index=30)
U+0066:f 0 T manual_sprite("glyphs.png", 22, 59, 11, 18, index=31)
U+0067:g 0 T manual_sprite("glyphs.png", 33, 59, 11, 18, index=32)
U+0068:h 0 T manual_sprite("glyphs.png", 44, 59, 11, 18, index=33)
U+0069:i 0 T manual_sprite("glyphs.png", 55, 59, 7, 18, index=34)
U+006A:j 0 T manual_sprite("glyphs.png", 62, 59, 11, 18, index=35)
U+006B:k 0 T manual_sprite("glyphs.png", 73, 59, 12, 18, index=36)
U+006C:l 0 T manual_sprite("glyphs.png", 85, 59, 7, 18, index=37)
U+006D:m 0 T manual_sprite("glyphs.png", 92, 59, 14, 18, index=38)
U+006E:n 0 T manual_sprite("glyphs.png", 106, 59, 12, 18, index=39)
U+006F:o 0 T manual_sprite("glyphs.png", 118, 59, 11, 18, index=40)
U+0070:p 0 T manual_sprite("glyphs.png", 129, 59, 11, 18, index=41)
U+0071:q 0 T manual_sprite("glyphs.png", 140, 59, 11, 18, index=42)
U+0072:r 0 T manual_sprite("glyphs.png", 151, 59, 10, 18, index=43)
U+0073:s 0 T manual_sprite("glyphs.png", 161, 59, 11, 18, index=44)
U+0074:t 0 T manual_sprite("glyphs.png", 172, 59, 11, 18, index=45)
U+0075:u 0 T manual_sprite("glyphs.png", 183, 59, 11, 18, index=46)
U+0076:v 0 T manual_sprite("glyphs.png", 194, 59, 11, 18, index=47)
U+0077:w 0 T manual_sprite("glyphs.png", 205, 59, 13, 18, index=48)
U+0078:x 0 T manual_sprite("glyphs.png", 218, 59, 11, 18, index=49)
U+0079:y 0 T manual_sprite("glyphs.png", 229, 59, 11, 18, index=50)
U+007A:z 0 T manual_sprite("glyphs.png", 240, 59, 11, 18, index=51)
# ASCII A-Z
U+0041:A 0 T manual_sprite("glyphs.png", 65, 23, 17, 18, index=0) expand(-1)
U+0042:B 0 T manual_sprite("glyphs.png", 82, 23, 13, 18, index=1)
U+0043:C 0 T manual_sprite("glyphs.png", 95, 23, 13, 18, index=2)
U+0044:D 0 T manual_sprite("glyphs.png", 108, 23, 13, 18, index=3)
U+0045:E 0 T manual_sprite("glyphs.png", 121, 23, 13, 18, index=4)
U+0046:F 0 T manual_sprite("glyphs.png", 134, 23, 13, 18, index=5)
U+0047:G 0 T manual_sprite("glyphs.png", 147, 23, 13, 18, index=6)
U+0048:H 0 T manual_sprite("glyphs.png", 160, 23, 15, 18, index=7)
U+0049:I 0 T manual_sprite("glyphs.png", 175, 23, 10, 18, index=8)
U+004A:J 0 T manual_sprite("glyphs.png", 185, 23, 13, 18, index=9)
U+004B:K 0 T manual_sprite("glyphs.png", 198, 23, 14, 18, index=10)
U+004C:L 0 T manual_sprite("glyphs.png", 212, 23, 13, 18, index=11)
U+004D:M 0 T manual_sprite("glyphs.png", 225, 23, 15, 18, index=12)
U+004E:N 0 T manual_sprite("glyphs.png", 240, 23, 15, 18, index=13)
U+004F:O 0 T manual_sprite("glyphs.png", 0, 41, 14, 18, index=14)
U+0050:P 0 T manual_sprite("glyphs.png", 14, 41, 13, 18, index=15)
U+0051:Q 0 T manual_sprite("glyphs.png", 27, 41, 14, 18, index=16)
U+0052:R 0 T manual_sprite("glyphs.png", 41, 41, 14, 18, index=17)
U+0053:S 0 T manual_sprite("glyphs.png", 55, 41, 13, 18, index=18)
U+0054:T 0 T manual_sprite("glyphs.png", 68, 41, 14, 18, index=19)
U+0055:U 0 T manual_sprite("glyphs.png", 82, 41, 15, 18, index=20)
U+0056:V 0 T manual_sprite("glyphs.png", 97, 41, 15, 18, index=21)
U+0057:W 0 T manual_sprite("glyphs.png", 112, 41, 15, 18, index=22)
U+0058:X 0 T manual_sprite("glyphs.png", 127, 41, 14, 18, index=23)
U+0059:Y 0 T manual_sprite("glyphs.png", 141, 41, 14, 18, index=24)
U+005A:Z 0 T manual_sprite("glyphs.png", 155, 41, 13, 18, index=25)
# Digits 0-9
U+0030:0 0 T manual_sprite("glyphs.png", 135, 5, 14, 18, index=52)
U+0031:1 0 T manual_sprite("glyphs.png", 149, 5, 11, 18, index=53)
U+0032:2 0 T manual_sprite("glyphs.png", 160, 5, 12, 18, index=54)
U+0033:3 0 T manual_sprite("glyphs.png", 172, 5, 12, 18, index=55)
U+0034:4 0 T manual_sprite("glyphs.png", 184, 5, 12, 18, index=56)
U+0035:5 0 T manual_sprite("glyphs.png", 196, 5, 12, 18, index=57)
U+0036:6 0 T manual_sprite("glyphs.png", 208, 5, 12, 18, index=58)
U+0037:7 0 T manual_sprite("glyphs.png", 220, 5, 12, 18, index=59)
U+0038:8 0 T manual_sprite("glyphs.png", 232, 5, 12, 18, index=60)
U+0039:9 0 T manual_sprite("glyphs.png", 244, 5, 12, 18, index=61)
# Basic Punctuation
U+0021:! 0 T manual_sprite("glyphs.png", 0, 5, 6, 18, index=64)
U+0022:" 0 T manual_sprite("glyphs.png", 6, 5, 9, 18)
U+0023:# 0 T manual_sprite("glyphs.png", 16, 5, 14, 18, index=78)
U+0024:$ 0 T manual_sprite("glyphs.png", 30, 5, 11, 18)
U+0025:% 0 T manual_sprite("glyphs.png", 41, 5, 13, 18)
U+0026:& 0 T manual_sprite("glyphs.png", 54, 5, 11, 18)
U+0027:' 0 T manual_sprite("glyphs.png", 65, 5, 6, 18, index=79)
U+0028:( 0 T manual_sprite("glyphs.png", 71, 5, 7, 18) expand(w=-1)
U+0029:) 0 T manual_sprite("glyphs.png", 78, 5, 7, 18) translate(x=1) expand(w=1)
U+002A:* 0 T manual_sprite("glyphs.png", 85, 5, 9, 18)
U+002B:+ 0 T manual_sprite("glyphs.png", 94, 5, 11, 18, index=72)
U+002C:, 0 T manual_sprite("glyphs.png", 105, 5, 6, 18, index=63)
U+002D:- 0 T manual_sprite("glyphs.png", 111, 5, 9, 18, index=71)
U+002E:. 0 T manual_sprite("glyphs.png", 120, 5, 6, 18, index=62)
U+002F:/ 0 T manual_sprite("glyphs.png", 126, 5, 9, 18, index=68)
U+003A:: 0 T manual_sprite("glyphs.png", 0, 23, 6, 18, index=73)
U+003B:; 0 T manual_sprite("glyphs.png", 6, 23, 6, 18)
U+003C:< 0 T manual_sprite("glyphs.png", 13, 23, 9, 18)
U+003D:= 0 T manual_sprite("glyphs.png", 22, 23, 9, 18)
U+003E:> 0 T manual_sprite("glyphs.png", 31, 23, 9, 18)
U+003F:? 0 T manual_sprite("glyphs.png", 41, 23, 12, 18, index=65)
U+0040:@ 0 T manual_sprite("glyphs.png", 53, 23, 12, 18)
U+005B:[ 0 T manual_sprite("glyphs.png", 168, 41, 8, 18, index=66)
U+005C:\ 0 T manual_sprite("glyphs.png", 176, 41, 9, 18, index=76)
U+005D:] 0 T manual_sprite("glyphs.png", 185, 41, 8, 18, index=75)
U+005E:^ 0 T manual_sprite("glyphs.png", 193, 41, 9, 18)
U+005F:_ 0 T manual_sprite("glyphs.png", 202, 41, 9, 18)
U+0060:` 0 T manual_sprite("glyphs.png", 211, 41, 7, 18)
U+007B:{ 0 T manual_sprite("glyphs.png", 0, 77, 8, 18)
U+007C:| 0 T manual_sprite("glyphs.png", 8, 77, 6, 18)
U+007D:} 0 T manual_sprite("glyphs.png", 14, 77, 8, 18)
U+007E:~ 0 T manual_sprite("glyphs.png", 22, 77, 10, 18)
================================================
FILE: data/common/glyphs/mapping_combining_diactrics.txt
================================================
# --------------------------------------------------
# Combining diactrics
# --------------------------------------------------
"\\{grave accent}" 0 c manual_sprite("glyphs.png", 0, 0, 7, 5, index=77)
"\\{acute accent}" 0 c manual_sprite("glyphs.png", 7, 0, 7, 5, index=70)
"\\{circumflex accent}" 0 c manual_sprite("glyphs.png", 32, 0, 9, 5, index=69)
"\\{circumflex}" 0 T link("\\{circumflex accent}")
"\\{macron}" 0 c manual_sprite("glyphs.png", 23, 0, 9, 5)
"\\{breve}" 0 c manual_sprite("glyphs.png", 50, 0, 8, 5)
"\\{dot above}" 0 c manual_sprite("glyphs.png", 58, 0, 6, 5)
"\\{umlaut}" 0 c manual_sprite("glyphs.png", 14, 0, 9, 5, index=67)
"\\{caron}" 0 c manual_sprite("glyphs.png", 41, 0, 9, 5)
"\\{ring above}" 0 c manual_sprite("glyphs.png", 64, 0, 7, 5)
"\\{tilde}" 0 c manual_sprite("glyphs.png", 71, 0, 10, 5)
"\\{double acute accent}" 0 c manual_sprite("glyphs.png", 81, 0, 9, 5)
"\\{acute umlaut}" 0 c manual_sprite("glyphs.png", 90, 0, 11, 5)
================================================
FILE: data/common/glyphs/mapping_controller.txt
================================================
# --------------------------------------------------
# Controller button icons
# --------------------------------------------------
"\\{controller rstick}" 0 I manual_sprite("controller.png", 0, 0, 16, 16) translate(y=1)
"\\{controller rstick up}" 0 I manual_sprite("controller.png", 16, 0, 16, 16) translate(y=1)
"\\{controller rstick right}" 0 I manual_sprite("controller.png", 32, 0, 16, 16) translate(y=1)
"\\{controller rstick down}" 0 I manual_sprite("controller.png", 48, 0, 16, 16) translate(y=1)
"\\{controller rstick left}" 0 I manual_sprite("controller.png", 64, 0, 16, 16) translate(y=1)
"\\{controller lstick}" 0 I manual_sprite("controller.png", 0, 16, 16, 16) translate(y=1)
"\\{controller lstick up}" 0 I manual_sprite("controller.png", 16, 16, 16, 16) translate(y=1)
"\\{controller lstick right}" 0 I manual_sprite("controller.png", 32, 16, 16, 16) translate(y=1)
"\\{controller lstick down}" 0 I manual_sprite("controller.png", 48, 16, 16, 16) translate(y=1)
"\\{controller lstick left}" 0 I manual_sprite("controller.png", 64, 16, 16, 16) translate(y=1)
"\\{controller dpad up}" 0 I manual_sprite("controller.png", 0, 32, 15, 15) translate(y=1)
"\\{controller dpad right}" 0 I manual_sprite("controller.png", 16, 32, 15, 15) translate(y=1)
"\\{controller dpad down}" 0 I manual_sprite("controller.png", 32, 32, 15, 15) translate(y=1)
"\\{controller dpad left}" 0 I manual_sprite("controller.png", 48, 32, 15, 15) translate(y=1)
"\\{controller button l1}" 0 I manual_sprite("controller.png", 80, 0, 15, 15) translate(y=4)
"\\{controller button r1}" 0 I manual_sprite("controller.png", 96, 0, 15, 15) translate(y=4)
"\\{controller button l2}" 0 I manual_sprite("controller.png", 80, 16, 15, 15) translate(y=4)
"\\{controller button r2}" 0 I manual_sprite("controller.png", 96, 16, 15, 15) translate(y=4)
"\\{controller bumper left}" 0 I manual_sprite("controller.png", 80, 32, 16, 15) translate(y=4)
"\\{controller bumper right}" 0 I manual_sprite("controller.png", 96, 32, 16, 15) translate(y=4)
"\\{controller button zl}" 0 I manual_sprite("controller.png", 80, 48, 15, 15) translate(y=4)
"\\{controller button zr}" 0 I manual_sprite("controller.png", 96, 48, 15, 15) translate(y=4)
"\\{controller trigger left}" 0 I manual_sprite("controller.png", 80, 64, 15, 15) translate(y=1, x=2)
"\\{controller trigger right}" 0 I manual_sprite("controller.png", 96, 64, 15, 15) translate(y=2, x=2)
"\\{controller button a}" 0 I manual_sprite("controller.png", 0, 48, 15, 15) translate(y=2, x=1)
"\\{controller button b}" 0 I manual_sprite("controller.png", 16, 48, 15, 15) translate(y=2, x=1)
"\\{controller button x}" 0 I manual_sprite("controller.png", 32, 48, 15, 15) translate(y=2, x=1)
"\\{controller button y}" 0 I manual_sprite("controller.png", 48, 48, 15, 15) translate(y=2, x=1)
"\\{controller button xbox}" 0 I manual_sprite("controller.png", 64, 48, 15, 15) translate(y=2, x=1)
"\\{controller button triangle}" 0 I manual_sprite("controller.png", 0, 64, 15, 15) translate(y=2, x=1)
"\\{controller button square}" 0 I manual_sprite("controller.png", 16, 64, 15, 15) translate(y=2, x=1)
"\\{controller button cross}" 0 I manual_sprite("controller.png", 32, 64, 15, 15) translate(y=2, x=1)
"\\{controller button circle}" 0 I manual_sprite("controller.png", 48, 64, 15, 15) translate(y=2, x=1)
"\\{controller button ps}" 0 I manual_sprite("controller.png", 64, 64, 15, 15) translate(y=2, x=1)
"\\{controller button capture}" 0 I manual_sprite("controller.png", 0, 80, 64, 15) translate(y=2)
"\\{controller button touchpad}" 0 I manual_sprite("controller.png", 0, 96, 64, 15) translate(y=2)
"\\{controller button paddle 1}" 0 I manual_sprite("controller.png", 0, 112, 64, 15) translate(y=2)
"\\{controller button paddle 2}" 0 I manual_sprite("controller.png", 0, 128, 64, 15) translate(y=2)
"\\{controller button paddle 3}" 0 I manual_sprite("controller.png", 0, 144, 64, 15) translate(y=2)
"\\{controller button paddle 4}" 0 I manual_sprite("controller.png", 0, 160, 64, 15) translate(y=2)
"\\{controller button share}" 0 I manual_sprite("controller.png", 64, 80, 48, 15) translate(y=2)
"\\{controller button back}" 0 I manual_sprite("controller.png", 64, 96, 48, 15) translate(y=2)
"\\{controller button start}" 0 I manual_sprite("controller.png", 64, 112, 48, 15) translate(y=2)
"\\{controller button mic}" 0 I manual_sprite("controller.png", 64, 128, 32, 15) translate(y=2)
"\\{controller button home}" 0 I manual_sprite("controller.png", 64, 144, 48, 15) translate(y=2)
"\\{controller button options}" 0 I manual_sprite("controller.png", 64, 160, 48, 15) translate(y=2)
================================================
FILE: data/common/glyphs/mapping_cyrillic.txt
================================================
# --------------------------------------------------
# Unicode Block "Cyrillic" (U+0400 to U+04FF)
# --------------------------------------------------
U+0400:Ѐ 0 C combine(U+0415:Е, "\\{grave accent}")
U+0401:Ё 0 C combine(U+0415:Е, "\\{umlaut}")
U+0402:Ђ 0 T manual_sprite("glyphs.png", 73, 167, 15, 18)
U+0403:Ѓ 0 C combine(U+0413:Г, "\\{acute accent}")
U+0404:Є 0 T manual_sprite("glyphs.png", 88, 167, 13, 18)
U+0405:Ѕ 0 T link("S")
U+0406:І 0 T link("I")
U+0407:Ї 0 C combine(U+0406:І, "\\{umlaut}")
U+0408:Ј 0 T link("J")
U+0409:Љ 0 T manual_sprite("glyphs.png", 101, 167, 18, 18)
U+040A:Њ 0 T manual_sprite("glyphs.png", 119, 167, 18, 18)
U+040B:Ћ 0 T manual_sprite("glyphs.png", 137, 167, 16, 18)
U+040C:Ќ 0 C combine(U+041A:К, "\\{acute accent}")
U+040D:Ѝ 0 C combine(U+0418:И, "\\{grave accent}")
U+040E:Ў 0 C combine(U+0423:У, "\\{breve}")
U+040F:Џ 0 T manual_sprite("glyphs.png", 153, 167, 14, 18)
U+0410:А 0 T link("A")
U+0411:Б 0 T manual_sprite("glyphs.png", 167, 167, 13, 18)
U+0412:В 0 T link("B")
U+0413:Г 0 T link(U+0393:Γ)
U+0414:Д 0 T manual_sprite("glyphs.png", 180, 167, 16, 18)
U+0415:Е 0 T link("E")
U+0416:Ж 0 T manual_sprite("glyphs.png", 196, 167, 18, 18)
U+0417:З 0 T manual_sprite("glyphs.png", 214, 167, 12, 18)
U+0418:И 0 T manual_sprite("glyphs.png", 226, 167, 15, 18)
U+0419:Й 0 C combine(U+0418:И, "\\{breve}")
U+041A:К 0 T link("K")
U+041B:Л 0 T manual_sprite("glyphs.png", 241, 167, 15, 18)
U+041C:М 0 T link("M")
U+041D:Н 0 T link("H")
U+041E:О 0 T link("O")
U+041F:П 0 T link(U+03A0:Π)
U+0420:Р 0 T link("P")
U+0421:С 0 T link("C")
U+0422:Т 0 T link("T")
U+0423:У 0 T manual_sprite("glyphs.png", 0, 185, 14, 18)
U+0424:Ф 0 T link(U+03A6:Φ)
U+0425:Х 0 T link("X")
U+0426:Ц 0 T manual_sprite("glyphs.png", 14, 185, 15, 18)
U+0427:Ч 0 T manual_sprite("glyphs.png", 29, 185, 15, 18)
U+0428:Ш 0 T manual_sprite("glyphs.png", 44, 185, 18, 18)
U+0429:Щ 0 T manual_sprite("glyphs.png", 62, 185, 18, 18)
U+042A:Ъ 0 T manual_sprite("glyphs.png", 80, 185, 15, 18)
U+042B:Ы 0 T manual_sprite("glyphs.png", 95, 185, 18, 18)
U+042C:Ь 0 T manual_sprite("glyphs.png", 113, 185, 13, 18)
U+042D:Э 0 T manual_sprite("glyphs.png", 126, 185, 13, 18)
U+042E:Ю 0 T manual_sprite("glyphs.png", 139, 185, 18, 18)
U+042F:Я 0 T manual_sprite("glyphs.png", 157, 185, 13, 18)
U+0430:а 0 T link("a")
U+0431:б 0 T manual_sprite("glyphs.png", 170, 185, 11, 18)
U+0432:в 0 T manual_sprite("glyphs.png", 181, 185, 11, 18)
U+0433:г 0 T manual_sprite("glyphs.png", 192, 185, 10, 18)
U+0434:д 0 T manual_sprite("glyphs.png", 202, 185, 12, 18)
U+0435:е 0 T link("e")
U+0436:ж 0 T manual_sprite("glyphs.png", 214, 185, 17, 18)
U+0437:з 0 T manual_sprite("glyphs.png", 232, 185, 11, 18)
U+0438:и 0 T manual_sprite("glyphs.png", 243, 185, 12, 18)
U+0439:й 0 C combine(U+0438:и, "\\{breve}")
U+043A:к 0 T link(U+0138:ĸ)
U+043B:л 0 T manual_sprite("glyphs.png", 0, 203, 11, 18)
U+043C:м 0 T manual_sprite("glyphs.png", 11, 203, 13, 18)
U+043D:н 0 T manual_sprite("glyphs.png", 24, 203, 11, 18)
U+043E:о 0 T link("o")
U+043F:п 0 T manual_sprite("glyphs.png", 35, 203, 11, 18)
U+0440:р 0 T link("p")
U+0441:с 0 T link("c")
U+0442:т 0 T manual_sprite("glyphs.png", 46, 203, 10, 18)
U+0443:у 0 T link("y")
U+0444:ф 0 T manual_sprite("glyphs.png", 56, 203, 14, 18)
U+0445:х 0 T link("x")
U+0446:ц 0 T manual_sprite("glyphs.png", 70, 203, 12, 18)
U+0447:ч 0 T manual_sprite("glyphs.png", 82, 203, 11, 18)
U+0448:ш 0 T manual_sprite("glyphs.png", 93, 203, 14, 18)
U+0449:щ 0 T manual_sprite("glyphs.png", 107, 203, 15, 18)
U+044A:ъ 0 T manual_sprite("glyphs.png", 122, 203, 13, 18)
U+044B:ы 0 T manual_sprite("glyphs.png", 135, 203, 14, 18)
U+044C:ь 0 T manual_sprite("glyphs.png", 149, 203, 11, 18)
U+044D:э 0 T manual_sprite("glyphs.png", 160, 203, 11, 18)
U+044E:ю 0 T manual_sprite("glyphs.png", 171, 203, 14, 18)
U+044F:я 0 T manual_sprite("glyphs.png", 185, 203, 11, 18)
U+0450:ѐ 0 C combine("e", "\\{grave accent}")
U+0451:ё 0 C combine("e", "\\{umlaut}")
U+0452:ђ 0 T manual_sprite("glyphs.png", 196, 203, 12, 18)
U+0453:ѓ 0 C combine(U+0433:г, "\\{acute accent}")
U+0454:є 0 T manual_sprite("glyphs.png", 208, 203, 11, 18)
U+0455:ѕ 0 T link("s")
U+0456:і 0 T link("i")
U+0457:ї 0 C combine(U+0131:ı, "\\{umlaut}")
U+0458:ј 0 T link("j")
U+0459:љ 0 T manual_sprite("glyphs.png", 219, 203, 16, 18)
U+045A:њ 0 T manual_sprite("glyphs.png", 235, 203, 16, 18)
U+045B:ћ 0 T link(U+0127:ħ)
U+045C:ќ 0 C combine(U+043A:к, "\\{acute accent}")
U+045D:ѝ 0 C combine(U+0438:и, "\\{grave accent}")
U+045E:ў 0 C combine(U+0443:у, "\\{breve}")
U+045F:џ 0 T manual_sprite("glyphs.png", 0, 221, 11, 18)
U+0490:Ґ 0 T manual_sprite("glyphs.png", 11, 221, 13, 18)
U+0491:ґ 0 T manual_sprite("glyphs.png", 24, 221, 10, 18)
================================================
FILE: data/common/glyphs/mapping_greek_and_coptic.txt
================================================
# --------------------------------------------------
# Unicode Block "Greek and Coptic" (U+0370 to U+03FF)
# --------------------------------------------------
U+0393:Γ 0 T manual_sprite("glyphs.png", 194, 131, 13, 18)
U+0394:Δ 0 T manual_sprite("glyphs.png", 207, 131, 15, 18)
U+0395:Ε 0 T link("E")
U+0396:Ζ 0 T link("Z")
U+0397:Η 0 T link("H")
U+0398:Θ 0 T manual_sprite("glyphs.png", 222, 131, 14, 18)
U+0399:Ι 0 T link("I")
U+039A:Κ 0 T link("K")
U+039B:Λ 0 T manual_sprite("glyphs.png", 236, 131, 17, 18)
U+039C:Μ 0 T link("M")
U+039D:Ν 0 T link("N")
U+039E:Ξ 0 T manual_sprite("glyphs.png", 0, 149, 14, 18)
U+039F:Ο 0 T link("O")
U+03A0:Π 0 T manual_sprite("glyphs.png", 14, 149, 15, 18)
U+03A1:Ρ 0 T link("P")
U+03A3:Σ 0 T manual_sprite("glyphs.png", 29, 149, 13, 18)
U+03A4:Τ 0 T link("T")
U+03A5:Υ 0 T link("Y")
U+03A6:Φ 0 T manual_sprite("glyphs.png", 42, 149, 16, 18)
U+03A7:Χ 0 T link("X")
U+03A8:Ψ 0 T manual_sprite("glyphs.png", 58, 149, 18, 18)
U+03A9:Ω 0 T manual_sprite("glyphs.png", 76, 149, 14, 18)
U+03B1:α 0 T manual_sprite("glyphs.png", 90, 149, 12, 18)
U+03B2:β 0 T manual_sprite("glyphs.png", 102, 149, 11, 18)
U+03B3:γ 0 T manual_sprite("glyphs.png", 113, 149, 12, 18)
U+03B4:δ 0 T manual_sprite("glyphs.png", 125, 149, 11, 18)
U+03B5:ε 0 T manual_sprite("glyphs.png", 136, 149, 11, 18)
U+03B6:ζ 0 T manual_sprite("glyphs.png", 147, 149, 11, 18)
U+03B7:η 0 T manual_sprite("glyphs.png", 158, 149, 11, 18)
U+03B8:θ 0 T manual_sprite("glyphs.png", 169, 149, 11, 18)
U+03B9:ι 0 T link(U+0131:ı)
U+03BA:κ 0 T link(U+0138:ĸ)
U+03BB:λ 0 T manual_sprite("glyphs.png", 180, 149, 12, 18)
U+03BC:μ 0 T link(U+00B5:µ)
U+03BD:ν 0 T link("v")
U+03BE:ξ 0 T manual_sprite("glyphs.png", 192, 149, 11, 18)
U+03BF:ο 0 T link("o")
U+03C0:π 0 T manual_sprite("glyphs.png", 203, 149, 13, 18)
U+03C1:ρ 0 T manual_sprite("glyphs.png", 216, 149, 11, 18)
U+03C2:ς 0 T manual_sprite("glyphs.png", 227, 149, 11, 18)
U+03C3:σ 0 T manual_sprite("glyphs.png", 238, 149, 12, 18)
U+03C4:τ 0 T manual_sprite("glyphs.png", 0, 167, 10, 18)
U+03C5:υ 0 T manual_sprite("glyphs.png", 10, 167, 11, 18)
U+03C6:φ 0 T manual_sprite("glyphs.png", 21, 167, 14, 18)
U+03C7:χ 0 T manual_sprite("glyphs.png", 35, 167, 11, 18)
U+03C8:ψ 0 T manual_sprite("glyphs.png", 46, 167, 14, 18)
U+03C9:ω 0 T manual_sprite("glyphs.png", 60, 167, 13, 18)
U+0386:Ά 0 C combine(U+0391:Α, "\\{acute accent}", offset_x=-4, offset_y=2)
U+0388:Έ 0 C combine(U+0395:Ε, "\\{acute accent}", offset_x=-4, offset_y=2)
U+0389:Ή 0 C combine(U+0397:Η, "\\{acute accent}", offset_x=-4, offset_y=2)
U+038A:Ί 0 C combine(U+0399:Ι, "\\{acute accent}", offset_x=-4, offset_y=2)
U+038C:Ό 0 C combine(U+039F:Ο, "\\{acute accent}", offset_x=-4, offset_y=2)
U+038E:Ύ 0 C combine(U+03A5:Υ, "\\{acute accent}", offset_x=-4, offset_y=2)
U+038F:Ώ 0 C combine(U+03A9:Ω, "\\{acute accent}", offset_x=-4, offset_y=2)
U+0390:ΐ 0 C combine(U+03B9:ι, "\\{acute umlaut}")
U+0391:Α 0 T link("A")
U+0392:Β 0 T link("B")
U+03AA:Ϊ 0 C combine(U+0399:Ι, "\\{umlaut}")
U+03AB:Ϋ 0 C combine(U+03A5:Υ, "\\{umlaut}")
U+03AC:ά 0 C combine(U+03B1:α, "\\{acute accent}")
U+03AD:έ 0 C combine(U+03B5:ε, "\\{acute accent}")
U+03AE:ή 0 C combine(U+03B7:η, "\\{acute accent}")
U+03AF:ί 0 C combine(U+03B9:ι, "\\{acute accent}")
U+03B0:ΰ 0 C combine(U+03C5:υ, "\\{acute umlaut}")
U+03CA:ϊ 0 C combine(U+03B9:ι, "\\{umlaut}")
U+03CB:ϋ 0 C combine(U+03C5:υ, "\\{umlaut}")
U+03CC:ό 0 C combine(U+03BF:ο, "\\{acute accent}")
U+03CD:ύ 0 C combine(U+03C5:υ, "\\{acute accent}")
U+03CE:ώ 0 C combine(U+03C9:ω, "\\{acute accent}")
================================================
FILE: data/common/glyphs/mapping_icons.txt
================================================
# --------------------------------------------------
# Icons
# --------------------------------------------------
"\\{button down}" 0 I grid_sprite("buttons.png", 0, 1, index=106)
"\\{button up}" 0 I grid_sprite("buttons.png", 1, 1, index=107)
"\\{button left}" 0 I grid_sprite("buttons.png", 2, 1, index=108)
"\\{button right}" 0 I grid_sprite("buttons.png", 3, 1, index=109)
"\\{button triangle}" 0 I grid_sprite("buttons.png", 0, 2, index=93)
"\\{button circle}" 0 I grid_sprite("buttons.png", 1, 2, index=94)
"\\{button x}" 0 I grid_sprite("buttons.png", 2, 2, index=95)
"\\{button square}" 0 I grid_sprite("buttons.png", 3, 2, index=96)
"\\{button empty}" 0 I grid_sprite("buttons.png", 0, 3, index=92)
"\\{button l1}" 0 I grid_sprite("buttons.png", 1, 3, index=97)
"\\{button r1}" 0 I grid_sprite("buttons.png", 2, 3, index=98)
"\\{button l2}" 0 I grid_sprite("buttons.png", 3, 3, index=99)
"\\{button r2}" 0 I grid_sprite("buttons.png", 4, 3, index=100)
"\\{icon sound}" 0 I grid_sprite("buttons.png", 8, 3, index=101)
"\\{icon music}" 0 I grid_sprite("buttons.png", 9, 3, index=102)
"\\{ammo shotgun}" 0 I grid_sprite("buttons.png", 7, 1, index=103)
"\\{ammo magnums}" 0 I grid_sprite("buttons.png", 8, 1, index=104)
"\\{ammo uzis}" 0 I grid_sprite("buttons.png", 9, 1, index=105)
"\\{arrow up}" 0 I grid_sprite("buttons.png", 8, 2, index=80)
"\\{arrow down}" 0 I grid_sprite("buttons.png", 9, 2, index=81) translate(y=-2)
"\\{review}" 0 R grid_sprite("buttons.png", 7, 2)
================================================
FILE: data/common/glyphs/mapping_keyboard.txt
================================================
# --------------------------------------------------
# Keyboard button icons
# --------------------------------------------------
"\\{keyboard backspace}" 0 I manual_sprite("keyboard.png", 0, 0, 60, 14) translate(y=2)
"\\{keyboard scroll_lock}" 0 I manual_sprite("keyboard.png", 60, 0, 60, 14) translate(y=2)
"\\{keyboard return}" 0 I manual_sprite("keyboard.png", 120, 0, 50, 14) translate(y=2)
"\\{keyboard caps_lock}" 0 I manual_sprite("keyboard.png", 170, 0, 50, 14) translate(y=2)
"\\{keyboard print_screen}" 0 I manual_sprite("keyboard.png", 220, 0, 50, 14) translate(y=2)
"\\{keyboard insert}" 0 I manual_sprite("keyboard.png", 270, 0, 50, 14) translate(y=2)
"\\{keyboard num_lock}" 0 I manual_sprite("keyboard.png", 320, 0, 50, 14) translate(y=2)
"\\{keyboard l_ctrl}" 0 I manual_sprite("keyboard.png", 370, 0, 32, 14) translate(y=2)
"\\{keyboard r_ctrl}" 0 I manual_sprite("keyboard.png", 402, 0, 32, 14) translate(y=2)
"\\{keyboard r_shift}" 0 I manual_sprite("keyboard.png", 434, 0, 32, 14) translate(y=2)
"\\{keyboard l_shift}" 0 I manual_sprite("keyboard.png", 466, 0, 32, 14) translate(y=2)
"\\{keyboard r_alt}" 0 I manual_sprite("keyboard.png", 0, 14, 32, 14) translate(y=2)
"\\{keyboard l_alt}" 0 I manual_sprite("keyboard.png", 32, 14, 32, 14) translate(y=2)
"\\{keyboard l_win}" 0 I manual_sprite("keyboard.png", 64, 14, 32, 14) translate(y=2)
"\\{keyboard r_win}" 0 I manual_sprite("keyboard.png", 96, 14, 32, 14) translate(y=2)
"\\{keyboard escape}" 0 I manual_sprite("keyboard.png", 128, 14, 32, 14) translate(y=2)
"\\{keyboard tab}" 0 I manual_sprite("keyboard.png", 160, 14, 32, 14) translate(y=2)
"\\{keyboard space}" 0 I manual_sprite("keyboard.png", 192, 14, 32, 14) translate(y=2)
"\\{keyboard pause}" 0 I manual_sprite("keyboard.png", 224, 14, 32, 14) translate(y=2)
"\\{keyboard home}" 0 I manual_sprite("keyboard.png", 256, 14, 32, 14) translate(y=2)
"\\{keyboard page_up}" 0 I manual_sprite("keyboard.png", 288, 14, 32, 14) translate(y=2)
"\\{keyboard delete}" 0 I manual_sprite("keyboard.png", 320, 14, 32, 14) translate(y=2)
"\\{keyboard end}" 0 I manual_sprite("keyboard.png", 352, 14, 32, 14) translate(y=2)
"\\{keyboard page_down}" 0 I manual_sprite("keyboard.png", 384, 14, 32, 14) translate(y=2)
"\\{keyboard f10}" 0 I manual_sprite("keyboard.png", 416, 14, 32, 14) translate(y=2)
"\\{keyboard f11}" 0 I manual_sprite("keyboard.png", 448, 14, 32, 14) translate(y=2)
"\\{keyboard f12}" 0 I manual_sprite("keyboard.png", 0, 28, 32, 14) translate(y=2)
"\\{keyboard f13}" 0 I manual_sprite("keyboard.png", 32, 28, 32, 14) translate(y=2)
"\\{keyboard f14}" 0 I manual_sprite("keyboard.png", 64, 28, 32, 14) translate(y=2)
"\\{keyboard f15}" 0 I manual_sprite("keyboard.png", 96, 28, 32, 14) translate(y=2)
"\\{keyboard f16}" 0 I manual_sprite("keyboard.png", 128, 28, 32, 14) translate(y=2)
"\\{keyboard f17}" 0 I manual_sprite("keyboard.png", 160, 28, 32, 14) translate(y=2)
"\\{keyboard f18}" 0 I manual_sprite("keyboard.png", 192, 28, 32, 14) translate(y=2)
"\\{keyboard f19}" 0 I manual_sprite("keyboard.png", 224, 28, 32, 14) translate(y=2)
"\\{keyboard f20}" 0 I manual_sprite("keyboard.png", 256, 28, 32, 14) translate(y=2)
"\\{keyboard f21}" 0 I manual_sprite("keyboard.png", 288, 28, 32, 14) translate(y=2)
"\\{keyboard f22}" 0 I manual_sprite("keyboard.png", 320, 28, 32, 14) translate(y=2)
"\\{keyboard f23}" 0 I manual_sprite("keyboard.png", 352, 28, 32, 14) translate(y=2)
"\\{keyboard f24}" 0 I manual_sprite("keyboard.png", 384, 28, 32, 14) translate(y=2)
"\\{keyboard num_0}" 0 I manual_sprite("keyboard.png", 416, 28, 32, 14) translate(y=2)
"\\{keyboard num_1}" 0 I manual_sprite("keyboard.png", 448, 28, 32, 14) translate(y=2)
"\\{keyboard num_2}" 0 I manual_sprite("keyboard.png", 0, 42, 32, 14) translate(y=2)
"\\{keyboard num_3}" 0 I manual_sprite("keyboard.png", 32, 42, 32, 14) translate(y=2)
"\\{keyboard num_4}" 0 I manual_sprite("keyboard.png", 64, 42, 32, 14) translate(y=2)
"\\{keyboard num_5}" 0 I manual_sprite("keyboard.png", 96, 42, 32, 14) translate(y=2)
"\\{keyboard num_6}" 0 I manual_sprite("keyboard.png", 128, 42, 32, 14) translate(y=2)
"\\{keyboard num_7}" 0 I manual_sprite("keyboard.png", 160, 42, 32, 14) translate(y=2)
"\\{keyboard num_8}" 0 I manual_sprite("keyboard.png", 192, 42, 32, 14) translate(y=2)
"\\{keyboard num_9}" 0 I manual_sprite("keyboard.png", 224, 42, 32, 14) translate(y=2)
"\\{keyboard num_period}" 0 I manual_sprite("keyboard.png", 256, 42, 32, 14) translate(y=2)
"\\{keyboard num_divide}" 0 I manual_sprite("keyboard.png", 288, 42, 32, 14) translate(y=2)
"\\{keyboard num_multiply}" 0 I manual_sprite("keyboard.png", 320, 42, 32, 14) translate(y=2)
"\\{keyboard num_minus}" 0 I manual_sprite("keyboard.png", 352, 42, 32, 14) translate(y=2)
"\\{keyboard num_plus}" 0 I manual_sprite("keyboard.png", 384, 42, 32, 14) translate(y=2)
"\\{keyboard num_equals}" 0 I manual_sprite("keyboard.png", 416, 42, 32, 14) translate(y=2)
"\\{keyboard num_comma}" 0 I manual_sprite("keyboard.png", 448, 42, 32, 14) translate(y=2)
"\\{keyboard num_enter}" 0 I manual_sprite("keyboard.png", 0, 56, 32, 14) translate(y=2)
"\\{keyboard unknown}" 0 I manual_sprite("keyboard.png", 32, 56, 32, 14) translate(y=2)
"\\{keyboard f1}" 0 I manual_sprite("keyboard.png", 64, 56, 21, 14) translate(y=2)
"\\{keyboard f2}" 0 I manual_sprite("keyboard.png", 85, 56, 21, 14) translate(y=2)
"\\{keyboard f3}" 0 I manual_sprite("keyboard.png", 106, 56, 21, 14) translate(y=2)
"\\{keyboard f4}" 0 I manual_sprite("keyboard.png", 127, 56, 21, 14) translate(y=2)
"\\{keyboard f5}" 0 I manual_sprite("keyboard.png", 148, 56, 21, 14) translate(y=2)
"\\{keyboard f6}" 0 I manual_sprite("keyboard.png", 169, 56, 21, 14) translate(y=2)
"\\{keyboard f7}" 0 I manual_sprite("keyboard.png", 190, 56, 21, 14) translate(y=2)
"\\{keyboard f8}" 0 I manual_sprite("keyboard.png", 211, 56, 21, 14) translate(y=2)
"\\{keyboard f9}" 0 I manual_sprite("keyboard.png", 232, 56, 21, 14) translate(y=2)
"\\{keyboard left}" 0 I manual_sprite("keyboard.png", 480, 14, 15, 14) translate(y=2)
"\\{keyboard up}" 0 I manual_sprite("keyboard.png", 480, 28, 15, 14) translate(y=2)
"\\{keyboard right}" 0 I manual_sprite("keyboard.png", 480, 42, 15, 14) translate(y=2)
"\\{keyboard down}" 0 I manual_sprite("keyboard.png", 253, 56, 15, 14) translate(y=2)
"\\{keyboard a}" 0 I manual_sprite("keyboard.png", 268, 56, 15, 14) translate(y=2)
"\\{keyboard b}" 0 I manual_sprite("keyboard.png", 283, 56, 15, 14) translate(y=2)
"\\{keyboard c}" 0 I manual_sprite("keyboard.png", 298, 56, 15, 14) translate(y=2)
"\\{keyboard d}" 0 I manual_sprite("keyboard.png", 313, 56, 15, 14) translate(y=2)
"\\{keyboard e}" 0 I manual_sprite("keyboard.png", 328, 56, 15, 14) translate(y=2)
"\\{keyboard f}" 0 I manual_sprite("keyboard.png", 343, 56, 15, 14) translate(y=2)
"\\{keyboard g}" 0 I manual_sprite("keyboard.png", 358, 56, 15, 14) translate(y=2)
"\\{keyboard h}" 0 I manual_sprite("keyboard.png", 373, 56, 15, 14) translate(y=2)
"\\{keyboard i}" 0 I manual_sprite("keyboard.png", 388, 56, 15, 14) translate(y=2)
"\\{keyboard j}" 0 I manual_sprite("keyboard.png", 403, 56, 15, 14) translate(y=2)
"\\{keyboard k}" 0 I manual_sprite("keyboard.png", 418, 56, 15, 14) translate(y=2)
"\\{keyboard l}" 0 I manual_sprite("keyboard.png", 433, 56, 15, 14) translate(y=2)
"\\{keyboard m}" 0 I manual_sprite("keyboard.png", 448, 56, 15, 14) translate(y=2)
"\\{keyboard n}" 0 I manual_sprite("keyboard.png", 463, 56, 15, 14) translate(y=2)
"\\{keyboard o}" 0 I manual_sprite("keyboard.png", 478, 56, 15, 14) translate(y=2)
"\\{keyboard p}" 0 I manual_sprite("keyboard.png", 0, 70, 15, 14) translate(y=2)
"\\{keyboard q}" 0 I manual_sprite("keyboard.png", 15, 70, 15, 14) translate(y=2)
"\\{keyboard r}" 0 I manual_sprite("keyboard.png", 30, 70, 15, 14) translate(y=2)
"\\{keyboard s}" 0 I manual_sprite("keyboard.png", 45, 70, 15, 14) translate(y=2)
"\\{keyboard t}" 0 I manual_sprite("keyboard.png", 60, 70, 15, 14) translate(y=2)
"\\{keyboard u}" 0 I manual_sprite("keyboard.png", 75, 70, 15, 14) translate(y=2)
"\\{keyboard v}" 0 I manual_sprite("keyboard.png", 90, 70, 15, 14) translate(y=2)
"\\{keyboard w}" 0 I manual_sprite("keyboard.png", 105, 70, 15, 14) translate(y=2)
"\\{keyboard x}" 0 I manual_sprite("keyboard.png", 120, 70, 15, 14) translate(y=2)
"\\{keyboard y}" 0 I manual_sprite("keyboard.png", 135, 70, 15, 14) translate(y=2)
"\\{keyboard z}" 0 I manual_sprite("keyboard.png", 150, 70, 15, 14) translate(y=2)
"\\{keyboard 0}" 0 I manual_sprite("keyboard.png", 165, 70, 15, 14) translate(y=2)
"\\{keyboard 1}" 0 I manual_sprite("keyboard.png", 180, 70, 15, 14) translate(y=2)
"\\{keyboard 2}" 0 I manual_sprite("keyboard.png", 195, 70, 15, 14) translate(y=2)
"\\{keyboard 3}" 0 I manual_sprite("keyboard.png", 210, 70, 15, 14) translate(y=2)
"\\{keyboard 4}" 0 I manual_sprite("keyboard.png", 225, 70, 15, 14) translate(y=2)
"\\{keyboard 5}" 0 I manual_sprite("keyboard.png", 240, 70, 15, 14) translate(y=2)
"\\{keyboard 6}" 0 I manual_sprite("keyboard.png", 255, 70, 15, 14) translate(y=2)
"\\{keyboard 7}" 0 I manual_sprite("keyboard.png", 270, 70, 15, 14) translate(y=2)
"\\{keyboard 8}" 0 I manual_sprite("keyboard.png", 285, 70, 15, 14) translate(y=2)
"\\{keyboard 9}" 0 I manual_sprite("keyboard.png", 300, 70, 15, 14) translate(y=2)
"\\{keyboard minus}" 0 I manual_sprite("keyboard.png", 315, 70, 15, 14) translate(y=2)
"\\{keyboard equals}" 0 I manual_sprite("keyboard.png", 330, 70, 15, 14) translate(y=2)
"\\{keyboard left_square_bracket}" 0 I manual_sprite("keyboard.png", 345, 70, 15, 14) translate(y=2)
"\\{keyboard right_square_bracket}" 0 I manual_sprite("keyboard.png", 360, 70, 15, 14) translate(y=2)
"\\{keyboard backslash}" 0 I manual_sprite("keyboard.png", 375, 70, 15, 14) translate(y=2)
"\\{keyboard hash}" 0 I manual_sprite("keyboard.png", 390, 70, 15, 14) translate(y=2)
"\\{keyboard semicolon}" 0 I manual_sprite("keyboard.png", 405, 70, 15, 14) translate(y=2)
"\\{keyboard apostrophe}" 0 I manual_sprite("keyboard.png", 420, 70, 15, 14) translate(y=2)
"\\{keyboard backtick}" 0 I manual_sprite("keyboard.png", 435, 70, 15, 14) translate(y=2)
"\\{keyboard comma}" 0 I manual_sprite("keyboard.png", 450, 70, 15, 14) translate(y=2)
"\\{keyboard period}" 0 I manual_sprite("keyboard.png", 465, 70, 15, 14) translate(y=2)
"\\{keyboard slash}" 0 I manual_sprite("keyboard.png", 480, 70, 15, 14) translate(y=2)
================================================
FILE: data/common/glyphs/mapping_latin-1_supplement.txt
================================================
# --------------------------------------------------
# Unicode Block "Latin-1 Supplement" (U+0080 to U+00FF)
# --------------------------------------------------
U+00A1:¡ 0 T manual_sprite("glyphs.png", 32, 77, 6, 18)
U+00A2:¢ 0 T manual_sprite("glyphs.png", 38, 77, 11, 18)
U+00A3:£ 0 T manual_sprite("glyphs.png", 49, 77, 13, 18)
U+00A4:¤ 0 T manual_sprite("glyphs.png", 62, 77, 12, 18)
U+00A5:¥ 0 T manual_sprite("glyphs.png", 74, 77, 14, 18)
U+00A6:¦ 0 T manual_sprite("glyphs.png", 88, 77, 6, 18)
U+00A7:§ 0 T manual_sprite("glyphs.png", 94, 77, 11, 18)
U+00A9:© 0 T manual_sprite("glyphs.png", 105, 77, 15, 18)
U+00AA:ª 0 T manual_sprite("glyphs.png", 121, 77, 7, 18)
U+00AB:« 0 T manual_sprite("glyphs.png", 128, 77, 9, 18)
U+00AC:¬ 0 T manual_sprite("glyphs.png", 137, 77, 11, 18)
U+00AE:® 0 T manual_sprite("glyphs.png", 148, 77, 15, 18)
U+00B0:° 0 T manual_sprite("glyphs.png", 163, 77, 8, 18)
U+00B1:± 0 T manual_sprite("glyphs.png", 171, 77, 11, 18)
U+00B2:² 0 T manual_sprite("glyphs.png", 20, 95, 7, 9)
U+00B3:³ 0 T manual_sprite("glyphs.png", 13, 104, 7, 9)
U+00B5:µ 0 T manual_sprite("glyphs.png", 182, 77, 11, 18)
U+00B6:¶ 0 T manual_sprite("glyphs.png", 193, 77, 15, 18)
U+00B7:· 0 T manual_sprite("glyphs.png", 208, 77, 6, 18)
U+00B9:¹ 0 T manual_sprite("glyphs.png", 13, 95, 7, 9)
U+00BA:º 0 T manual_sprite("glyphs.png", 214, 77, 7, 18)
U+00BB:» 0 T manual_sprite("glyphs.png", 221, 77, 9, 18)
U+00BC:¼ 0 T manual_sprite("glyphs.png", 230, 77, 13, 18)
U+00BD:½ 0 T manual_sprite("glyphs.png", 243, 77, 13, 18)
U+00BE:¾ 0 T manual_sprite("glyphs.png", 0, 95, 13, 18)
U+00BF:¿ 0 T manual_sprite("glyphs.png", 27, 95, 12, 18)
U+00C0:À 0 C combine("A", "\\{grave accent}")
U+00C1:Á 0 C combine("A", "\\{acute accent}")
U+00C2:Â 0 C combine("A", "\\{circumflex}")
U+00C3:Ã 0 C combine("A", "\\{tilde}")
U+00C4:Ä 0 C combine("A", "\\{umlaut}")
U+00C5:Å 0 C combine("A", "\\{ring above}")
U+00C6:Æ 0 T manual_sprite("glyphs.png", 39, 95, 18, 18)
U+00C7:Ç 0 T manual_sprite("glyphs.png", 57, 95, 13, 18)
U+00C8:È 0 C combine("E", "\\{grave accent}")
U+00C9:É 0 C combine("E", "\\{acute accent}")
U+00CA:Ê 0 C combine("E", "\\{circumflex}")
U+00CB:Ë 0 C combine("E", "\\{umlaut}")
U+00CC:Ì 0 C combine("I", "\\{grave accent}")
U+00CD:Í 0 C combine("I", "\\{acute accent}")
U+00CE:Î 0 C combine("I", "\\{circumflex}")
U+00CF:Ï 0 C combine("I", "\\{umlaut}")
U+00D0:Ð 0 T manual_sprite("glyphs.png", 70, 95, 13, 18)
U+00D1:Ñ 0 C combine("N", "\\{tilde}")
U+00D2:Ò 0 C combine("O", "\\{grave accent}")
U+00D3:Ó 0 C combine("O", "\\{acute accent}")
U+00D4:Ô 0 C combine("O", "\\{circumflex}")
U+00D5:Õ 0 C combine("O", "\\{tilde}")
U+00D6:Ö 0 C combine("O", "\\{umlaut}")
U+00D7:× 0 T manual_sprite("glyphs.png", 83, 95, 10, 18)
U+00D8:Ø 0 T manual_sprite("glyphs.png", 93, 95, 14, 18)
U+00D9:Ù 0 C combine("U", "\\{grave accent}")
U+00DA:Ú 0 C combine("U", "\\{acute accent}")
U+00DB:Û 0 C combine("U", "\\{circumflex}")
U+00DC:Ü 0 C combine("U", "\\{umlaut}")
U+00DD:Ý 0 C combine("Y", "\\{acute accent}")
U+00DE:Þ 0 T manual_sprite("glyphs.png", 107, 95, 13, 18)
U+00DF:ß 0 T manual_sprite("glyphs.png", 120, 95, 11, 18, index=74)
U+00E0:à 0 C combine("a", "\\{grave accent}")
U+00E1:á 0 C combine("a", "\\{acute accent}")
U+00E2:â 0 C combine("a", "\\{circumflex}")
U+00E3:ã 0 C combine("a", "\\{tilde}")
U+00E4:ä 0 C combine("a", "\\{umlaut}")
U+00E5:å 0 C combine("a", "\\{ring above}")
U+00E6:æ 0 T manual_sprite("glyphs.png", 131, 95, 16, 18)
U+00E7:ç 0 T manual_sprite("glyphs.png", 147, 95, 11, 18)
U+00E8:è 0 C combine("e", "\\{grave accent}")
U+00E9:é 0 C combine("e", "\\{acute accent}")
U+00EA:ê 0 C combine("e", "\\{circumflex}")
U+00EB:ë 0 C combine("e", "\\{umlaut}")
U+00EC:ì 0 C combine(U+0131:ı, "\\{grave accent}")
U+00ED:í 0 C combine(U+0131:ı, "\\{acute accent}")
U+00EE:î 0 C combine(U+0131:ı, "\\{circumflex}")
U+00EF:ï 0 C combine(U+0131:ı, "\\{umlaut}")
U+00F0:ð 0 T manual_sprite("glyphs.png", 158, 95, 11, 18)
U+00F1:ñ 0 C combine("n", "\\{tilde}")
U+00F2:ò 0 C combine("o", "\\{grave accent}")
U+00F3:ó 0 C combine("o", "\\{acute accent}")
U+00F4:ô 0 C combine("o", "\\{circumflex}")
U+00F5:õ 0 C combine("o", "\\{tilde}")
U+00F6:ö 0 C combine("o", "\\{umlaut}")
U+00F7:÷ 0 T manual_sprite("glyphs.png", 169, 95, 10, 18)
U+00F8:ø 0 T manual_sprite("glyphs.png", 179, 95, 13, 18)
U+00F9:ù 0 C combine("u", "\\{grave accent}")
U+00FA:ú 0 C combine("u", "\\{acute accent}")
U+00FB:û 0 C combine("u", "\\{circumflex}")
U+00FC:ü 0 C combine("u", "\\{umlaut}")
U+00FD:ý 0 C combine("y", "\\{acute accent}")
U+00FE:þ 0 T manual_sprite("glyphs.png", 192, 95, 11, 18)
U+00FF:ÿ 0 C combine("y", "\\{umlaut}")
================================================
FILE: data/common/glyphs/mapping_latin_extended-a.txt
================================================
# --------------------------------------------------
# Unicode Block "Latin Extended-A" (U+0100 to U+017F)
# --------------------------------------------------
U+0100:Ā 0 C combine("A", "\\{macron}")
U+0101:ā 0 C combine("a", "\\{macron}")
U+0102:Ă 0 C combine("A", "\\{breve}")
U+0103:ă 0 C combine("a", "\\{breve}")
U+0104:Ą 0 T manual_sprite("glyphs.png", 203, 95, 17, 18)
U+0105:ą 0 T manual_sprite("glyphs.png", 220, 95, 11, 18)
U+0106:Ć 0 C combine("C", "\\{acute accent}")
U+0107:ć 0 C combine("c", "\\{acute accent}")
U+0108:Ĉ 0 C combine("C", "\\{circumflex}")
U+0109:ĉ 0 C combine("c", "\\{circumflex}")
U+010A:Ċ 0 C combine("C", "\\{dot above}")
U+010B:ċ 0 C combine("c", "\\{dot above}")
U+010C:Č 0 C combine("C", "\\{caron}")
U+010D:č 0 C combine("c", "\\{caron}")
U+010E:Ď 0 C combine("D", "\\{caron}")
U+010F:ď 0 C combine("d", "\\{caron}")
U+0110:Đ 0 T link(U+00D0:Ð)
U+0111:đ 0 T manual_sprite("glyphs.png", 231, 95, 12, 18)
U+0112:Ē 0 C combine("E", "\\{macron}")
U+0113:ē 0 C combine("e", "\\{macron}")
U+0114:Ĕ 0 C combine("E", "\\{breve}")
U+0115:ĕ 0 C combine("e", "\\{breve}")
U+0116:Ė 0 C combine("E", "\\{dot above}")
U+0117:ė 0 C combine("e", "\\{dot above}")
U+0118:Ę 0 T manual_sprite("glyphs.png", 243, 95, 13, 18)
U+0119:ę 0 T manual_sprite("glyphs.png", 0, 113, 11, 18)
U+011A:Ě 0 C combine("E", "\\{caron}")
U+011B:ě 0 C combine("e", "\\{caron}")
U+011C:Ĝ 0 C combine("G", "\\{circumflex}")
U+011D:ĝ 0 C combine("g", "\\{circumflex}")
U+011E:Ğ 0 C combine("G", "\\{breve}")
U+011F:ğ 0 C combine("g", "\\{breve}")
U+0120:Ġ 0 C combine("G", "\\{dot above}")
U+0121:ġ 0 C combine("g", "\\{dot above}")
U+0122:Ģ 0 T manual_sprite("glyphs.png", 11, 113, 13, 18)
U+0123:ģ 0 T manual_sprite("glyphs.png", 24, 113, 11, 18)
U+0124:Ĥ 0 C combine("H", "\\{circumflex}")
U+0125:ĥ 0 C combine("h", "\\{circumflex}")
U+0126:Ħ 0 T manual_sprite("glyphs.png", 35, 113, 15, 18)
U+0127:ħ 0 T manual_sprite("glyphs.png", 50, 113, 12, 18)
U+0128:Ĩ 0 C combine("I", "\\{tilde}")
U+0129:ĩ 0 C combine("i", "\\{tilde}")
U+012A:Ī 0 C combine("I", "\\{macron}")
U+012B:ī 0 C combine("i", "\\{macron}")
U+012C:Ĭ 0 C combine("I", "\\{breve}")
U+012D:ĭ 0 C combine("i", "\\{breve}")
U+012E:Į 0 T manual_sprite("glyphs.png", 62, 113, 10, 18)
U+012F:į 0 T manual_sprite("glyphs.png", 72, 113, 7, 18)
U+0130:İ 0 C combine("I", "\\{dot above}")
U+0131:ı 0 T manual_sprite("glyphs.png", 79, 113, 7, 18)
U+0134:Ĵ 0 C combine("J", "\\{circumflex}")
U+0135:ĵ 0 C combine("j", "\\{circumflex}")
U+0136:Ķ 0 T manual_sprite("glyphs.png", 86, 113, 14, 18)
U+0137:ķ 0 T manual_sprite("glyphs.png", 100, 113, 12, 18)
U+0138:ĸ 0 T manual_sprite("glyphs.png", 112, 113, 11, 18)
U+0139:Ĺ 0 C combine("L", "\\{acute accent}")
U+013A:ĺ 0 C combine("l", "\\{acute accent}")
U+013B:Ļ 0 T manual_sprite("glyphs.png", 123, 113, 13, 18)
U+013C:ļ 0 T manual_sprite("glyphs.png", 136, 113, 7, 18)
U+013D:Ľ 0 C combine("L", "\\{caron}")
U+013E:ľ 0 C combine("l", "\\{caron}")
U+013F:Ŀ 0 C combine("L", U+00B7:·, align="middle", offset_x=3, offset_y=-1)
U+0140:ŀ 0 C combine("l", U+00B7:·, align="middle", offset_x=3, offset_y=-1)
U+0141:Ł 0 T manual_sprite("glyphs.png", 143, 113, 14, 18)
U+0142:ł 0 T manual_sprite("glyphs.png", 157, 113, 10, 18)
U+0143:Ń 0 C combine("N", "\\{acute accent}")
U+0144:ń 0 C combine("n", "\\{acute accent}")
U+0145:Ņ 0 T manual_sprite("glyphs.png", 167, 113, 15, 18)
U+0146:ņ 0 T manual_sprite("glyphs.png", 182, 113, 12, 18)
U+0147:Ň 0 C combine("N", "\\{caron}")
U+0148:ň 0 C combine("n", "\\{caron}")
U+0149:ʼn 0 C combine("n", "\\{acute accent}", offset_x=-2)
U+014A:Ŋ 0 T manual_sprite("glyphs.png", 194, 113, 15, 18)
U+014B:ŋ 0 T manual_sprite("glyphs.png", 209, 113, 12, 18)
U+014C:Ō 0 C combine("O", "\\{macron}")
U+014D:ō 0 C combine("o", "\\{macron}")
U+014E:Ŏ 0 C combine("O", "\\{breve}")
U+014F:ŏ 0 C combine("o", "\\{breve}")
U+0150:Ő 0 C combine("O", "\\{double acute accent}")
U+0151:ő 0 C combine("o", "\\{double acute accent}")
U+0152:Œ 0 T manual_sprite("glyphs.png", 221, 113, 18, 18)
U+0153:œ 0 T manual_sprite("glyphs.png", 239, 113, 16, 18)
U+0154:Ŕ 0 C combine("R", "\\{acute accent}")
U+0155:ŕ 0 C combine("r", "\\{acute accent}")
U+0156:Ŗ 0 T manual_sprite("glyphs.png", 0, 131, 14, 18)
U+0157:ŗ 0 T manual_sprite("glyphs.png", 14, 131, 10, 18)
U+0158:Ř 0 C combine("R", "\\{caron}")
U+0159:ř 0 C combine("r", "\\{caron}")
U+015A:Ś 0 C combine("S", "\\{acute accent}")
U+015B:ś 0 C combine("s", "\\{acute accent}")
U+015C:Ŝ 0 C combine("S", "\\{circumflex}")
U+015D:ŝ 0 C combine("s", "\\{circumflex}")
U+015E:Ş 0 T manual_sprite("glyphs.png", 24, 131, 13, 18)
U+015F:ş 0 T manual_sprite("glyphs.png", 37, 131, 11, 18)
U+0160:Š 0 C combine("S", "\\{caron}")
U+0161:š 0 C combine("s", "\\{caron}")
U+0162:Ţ 0 T manual_sprite("glyphs.png", 48, 131, 14, 18)
U+0163:ţ 0 T manual_sprite("glyphs.png", 62, 131, 10, 18)
U+0164:Ť 0 C combine("T", "\\{caron}")
U+0165:ť 0 C combine("t", "\\{caron}")
U+0166:Ŧ 0 T manual_sprite("glyphs.png", 72, 131, 14, 18)
U+0167:ŧ 0 T manual_sprite("glyphs.png", 86, 131, 11, 18)
U+0168:Ũ 0 C combine("U", "\\{tilde}")
U+0169:ũ 0 C combine("u", "\\{tilde}")
U+016A:Ū 0 C combine("U", "\\{macron}")
U+016B:ū 0 C combine("u", "\\{macron}")
U+016C:Ŭ 0 C combine("U", "\\{breve}")
U+016D:ŭ 0 C combine("u", "\\{breve}")
U+016E:Ů 0 C combine("U", "\\{ring above}")
U+016F:ů 0 C combine("u", "\\{ring above}")
U+0170:Ű 0 C combine("U", "\\{double acute accent}")
U+0171:ű 0 C combine("u", "\\{double acute accent}")
U+0172:Ų 0 T manual_sprite("glyphs.png", 97, 131, 15, 18)
U+0173:ų 0 T manual_sprite("glyphs.png", 112, 131, 11, 18)
U+0174:Ŵ 0 C combine("W", "\\{circumflex}")
U+0175:ŵ 0 C combine("w", "\\{circumflex}")
U+0176:Ŷ 0 C combine("Y", "\\{circumflex}")
U+0177:ŷ 0 C combine("y", "\\{circumflex}")
U+0178:Ÿ 0 C combine("Y", "\\{umlaut}")
U+0179:Ź 0 C combine("Z", "\\{acute accent}")
U+017A:ź 0 C combine("z", "\\{acute accent}")
U+017B:Ż 0 C combine("Z", "\\{dot above}")
U+017C:ż 0 C combine("z", "\\{dot above}")
U+017D:Ž 0 C combine("Z", "\\{caron}")
U+017E:ž 0 C combine("z", "\\{caron}")
================================================
FILE: data/common/glyphs/mapping_latin_extended-b.txt
================================================
# --------------------------------------------------
# Unicode Block "Latin Extended-B" (U+0180 to U+024F)
# --------------------------------------------------
U+0192:ƒ 0 T manual_sprite("glyphs.png", 123, 131, 11, 18)
U+01CD:Ǎ 0 C combine("A", "\\{caron}")
U+01CE:ǎ 0 C combine("a", "\\{caron}")
U+01CF:Ǐ 0 C combine("I", "\\{caron}")
U+01D0:ǐ 0 C combine("i", "\\{caron}")
U+01D1:Ǒ 0 C combine("O", "\\{caron}")
U+01D2:ǒ 0 C combine("o", "\\{caron}")
U+01D3:Ǔ 0 C combine("U", "\\{caron}")
U+01D4:ǔ 0 C combine("u", "\\{caron}")
U+01E6:Ǧ 0 C combine("G", "\\{caron}")
U+01E7:ǧ 0 C combine("g", "\\{caron}")
U+01E8:Ǩ 0 C combine("K", "\\{caron}")
U+01E9:ǩ 0 C combine("k", "\\{caron}")
U+01F0:ǰ 0 C combine("j", "\\{caron}")
U+01F4:Ǵ 0 C combine("G", "\\{acute accent}")
U+01F5:ǵ 0 C combine("g", "\\{acute accent}")
U+01F8:Ǹ 0 C combine("N", "\\{grave accent}")
U+01F9:ǹ 0 C combine("n", "\\{grave accent}")
U+021E:Ȟ 0 C combine("H", "\\{caron}")
U+021F:ȟ 0 C combine("h", "\\{caron}")
U+0226:Ȧ 0 C combine("A", "\\{dot above}")
U+0227:ȧ 0 C combine("a", "\\{dot above}")
U+022E:Ȯ 0 C combine("O", "\\{dot above}")
U+022F:ȯ 0 C combine("o", "\\{dot above}")
U+0232:Ȳ 0 C combine("Y", "\\{macron}")
U+0233:ȳ 0 C combine("y", "\\{macron}")
U+0218:Ș 0 T manual_sprite("glyphs.png", 134, 131, 13, 18)
U+0219:ș 0 T manual_sprite("glyphs.png", 147, 131, 11, 18)
U+021A:Ț 0 T manual_sprite("glyphs.png", 158, 131, 14, 18)
U+021B:ț 0 T manual_sprite("glyphs.png", 172, 131, 11, 18)
================================================
FILE: data/common/glyphs/mapping_latin_extended_additional.txt
================================================
# --------------------------------------------------
# Unicode Block "Latin Extended Additional" (U+1E00 to U+1EFF)
# --------------------------------------------------
U+1E02:Ḃ 0 C combine("B", "\\{dot above}")
U+1E03:ḃ 0 C combine("b", "\\{dot above}")
U+1E0A:Ḋ 0 C combine("D", "\\{dot above}")
U+1E0B:ḋ 0 C combine("d", "\\{dot above}")
U+1E1E:Ḟ 0 C combine("F", "\\{dot above}")
U+1E1F:ḟ 0 C combine("f", "\\{dot above}")
U+1E20:Ḡ 0 C combine("G", "\\{macron}")
U+1E21:ḡ 0 C combine("g", "\\{macron}")
U+1E22:Ḣ 0 C combine("H", "\\{dot above}")
U+1E23:ḣ 0 C combine("h", "\\{dot above}")
U+1E26:Ḧ 0 C combine("H", "\\{umlaut}")
U+1E27:ḧ 0 C combine("h", "\\{umlaut}")
U+1E30:Ḱ 0 C combine("K", "\\{acute accent}")
U+1E31:ḱ 0 C combine("k", "\\{acute accent}")
U+1E3E:Ḿ 0 C combine("M", "\\{acute accent}")
U+1E3F:ḿ 0 C combine("m", "\\{acute accent}")
U+1E40:Ṁ 0 C combine("M", "\\{dot above}")
U+1E41:ṁ 0 C combine("m", "\\{dot above}")
U+1E44:Ṅ 0 C combine("N", "\\{dot above}")
U+1E45:ṅ 0 C combine("n", "\\{dot above}")
U+1E54:Ṕ 0 C combine("P", "\\{acute accent}")
U+1E55:ṕ 0 C combine("p", "\\{acute accent}")
U+1E56:Ṗ 0 C combine("P", "\\{dot above}")
U+1E57:ṗ 0 C combine("p", "\\{dot above}")
U+1E58:Ṙ 0 C combine("R", "\\{dot above}")
U+1E59:ṙ 0 C combine("r", "\\{dot above}")
U+1E60:Ṡ 0 C combine("S", "\\{dot above}")
U+1E61:ṡ 0 C combine("s", "\\{dot above}")
U+1E6A:Ṫ 0 C combine("T", "\\{dot above}")
U+1E6B:ṫ 0 C combine("t", "\\{dot above}")
U+1E7C:Ṽ 0 C combine("V", "\\{tilde}")
U+1E7D:ṽ 0 C combine("v", "\\{tilde}")
U+1E80:Ẁ 0 C combine("W", "\\{grave accent}")
U+1E81:ẁ 0 C combine("w", "\\{grave accent}")
U+1E82:Ẃ 0 C combine("W", "\\{acute accent}")
U+1E83:ẃ 0 C combine("w", "\\{acute accent}")
U+1E84:Ẅ 0 C combine("W", "\\{umlaut}")
U+1E85:ẅ 0 C combine("w", "\\{umlaut}")
U+1E86:Ẇ 0 C combine("W", "\\{dot above}")
U+1E87:ẇ 0 C combine("w", "\\{dot above}")
U+1E8A:Ẋ 0 C combine("X", "\\{dot above}")
U+1E8B:ẋ 0 C combine("x", "\\{dot above}")
U+1E8C:Ẍ 0 C combine("X", "\\{umlaut}")
U+1E8D:ẍ 0 C combine("x", "\\{umlaut}")
U+1E8E:Ẏ 0 C combine("Y", "\\{dot above}")
U+1E8F:ẏ 0 C combine("y", "\\{dot above}")
U+1E90:Ẑ 0 C combine("Z", "\\{circumflex}")
U+1E91:ẑ 0 C combine("z", "\\{circumflex}")
U+1E97:ẗ 0 C combine("t", "\\{umlaut}")
U+1E98:ẘ 0 C combine("w", "\\{ring above}")
U+1E99:ẙ 0 C combine("y", "\\{ring above}")
U+1EBC:Ẽ 0 C combine("E", "\\{tilde}")
U+1EBD:ẽ 0 C combine("e", "\\{tilde}")
U+1EF2:Ỳ 0 C combine("Y", "\\{grave accent}")
U+1EF3:ỳ 0 C combine("y", "\\{grave accent}")
U+1EF8:Ỹ 0 C combine("Y", "\\{tilde}")
U+1EF9:ỹ 0 C combine("y", "\\{tilde}")
================================================
FILE: data/common/glyphs/mapping_misc.txt
================================================
# --------------------------------------------------
# Unicode Block "General Punctuation" (U+2000 to U+206F)
# --------------------------------------------------
U+2013:– 0 T manual_sprite("glyphs.png", 35, 221, 11, 18)
U+2014:— 0 T manual_sprite("glyphs.png", 46, 221, 18, 18)
U+2018:‘ 0 T manual_sprite("glyphs.png", 64, 221, 6, 9)
U+2019:’ 0 T manual_sprite("glyphs.png", 64, 230, 6, 9)
U+201C:“ 0 T manual_sprite("glyphs.png", 70, 221, 9, 9)
U+201D:” 0 T manual_sprite("glyphs.png", 70, 230, 9, 9)
U+2020:† 0 T manual_sprite("glyphs.png", 80, 221, 10, 18)
U+2021:‡ 0 T manual_sprite("glyphs.png", 90, 221, 10, 18)
U+2022:• 0 T manual_sprite("glyphs.png", 100, 221, 8, 18)
U+2026:… 0 T manual_sprite("glyphs.png", 108, 221, 12, 18)
U+2030:‰ 0 T manual_sprite("glyphs.png", 120, 221, 16, 18)
U+2039:‹ 0 T manual_sprite("glyphs.png", 137, 221, 7, 18)
U+203A:› 0 T manual_sprite("glyphs.png", 144, 221, 7, 18)
# --------------------------------------------------
# Unicode Block "Superscripts and Subscripts" (U+2070 to U+209F)
# --------------------------------------------------
U+2074:⁴ 0 T manual_sprite("glyphs.png", 20, 104, 7, 9)
# --------------------------------------------------
# Unicode Block "Currency Symbols" (U+20A0 to U+20CF)
# --------------------------------------------------
U+20AC:€ 0 T manual_sprite("glyphs.png", 170, 221, 14, 18)
U+20AF:₯ 0 T manual_sprite("glyphs.png", 151, 221, 19, 18)
# --------------------------------------------------
# Unicode Block "Letterlike Symbols" (U+2100 to U+214F)
# --------------------------------------------------
U+2116:№ 0 T manual_sprite("glyphs.png", 184, 221, 18, 18)
U+2122:™ 0 T manual_sprite("glyphs.png", 203, 221, 18, 18)
# --------------------------------------------------
# Unicode Block "Alphabetic Presentation Forms" (U+FB00 to U+FB4F)
# --------------------------------------------------
U+FB01:fi 0 T manual_sprite("glyphs.png", 221, 221, 13, 18)
U+FB02:fl 0 T manual_sprite("glyphs.png", 234, 221, 13, 18)
================================================
FILE: data/common/glyphs/mapping_small.txt
================================================
# --------------------------------------------------
# Small text
# --------------------------------------------------
U+0030:0 1 T grid_sprite("buttons.png", 0, 0)
U+0031:1 1 T grid_sprite("buttons.png", 1, 0)
U+0032:2 1 T grid_sprite("buttons.png", 2, 0)
U+0033:3 1 T grid_sprite("buttons.png", 3, 0)
U+0034:4 1 T grid_sprite("buttons.png", 4, 0)
U+0035:5 1 T grid_sprite("buttons.png", 5, 0)
U+0036:6 1 T grid_sprite("buttons.png", 6, 0)
U+0037:7 1 T grid_sprite("buttons.png", 7, 0)
U+0038:8 1 T grid_sprite("buttons.png", 8, 0)
U+0039:9 1 T grid_sprite("buttons.png", 9, 0)
U+002D:- 1 T grid_sprite("buttons.png", 4, 1)
U+002C:, 1 T grid_sprite("buttons.png", 5, 1)
U+00B0:° 1 T grid_sprite("buttons.png", 6, 1)
================================================
FILE: data/scripting/assault_stats.lua
================================================
local raw = trxc.assault_stats
trx.assault_stats = {
add_record = raw.record,
remove_record = raw.remove,
list_records = raw.list,
}
================================================
FILE: data/scripting/camera.lua
================================================
local raw = trxc.camera
local getters = {
pos = raw.get_pos,
room_num = raw.get_room,
room = function()
local room_num = raw.get_room()
return room_num and trx.rooms[room_num] or nil
end,
target_pos = raw.get_target_pos,
target_room_num = raw.get_target_room,
}
local camera = {
shake = raw.shake,
reset = raw.reset,
}
setmetatable(camera, {
__index = function(self, key)
local getter = getters[key]
return getter and getter() or nil
end,
__newindex = function(self, key, value)
error("Cannot set field '" .. key .. "' on trx.camera", 2)
end,
})
trx.camera = camera
================================================
FILE: data/scripting/catalog.lua
================================================
local raw = trxc.catalog
local catalog = {
objects = raw.objects,
flip_effects = raw.flip_effects,
lara_states = raw.lara_states,
lara_anims = raw.lara_anims,
music = raw.music,
samples = raw.samples,
weapons = raw.weapons,
}
trx.catalog = catalog
================================================
FILE: data/scripting/config.lua
================================================
local raw = trxc.config
local config = {}
function config.get(key)
return raw.get(key)
end
function config.set(key, value)
return raw.set(key, value)
end
function config.list()
return raw.list()
end
trx.config = config
================================================
FILE: data/scripting/console.lua
================================================
local raw = trxc.console
local LogLevel = trxc.log.LogLevel
local log = { LogLevel = LogLevel }
function log.generic(level, ...)
raw.log(level, ...)
end
function log.info(...)
raw.log(LogLevel.INFO, ...)
end
function log.warn(...)
raw.log(LogLevel.WARNING, ...)
end
function log.warning(...)
raw.log(LogLevel.WARNING, ...)
end
function log.error(...)
raw.log(LogLevel.ERROR, ...)
end
function log.debug(...)
raw.log(LogLevel.DEBUG, ...)
end
local console = {
log = log,
}
setmetatable(console.log, {
__call = function(_, ...)
return console.log.info(...)
end,
})
function console.clear()
return raw.clear()
end
function console.eval(cmd, opts)
return raw.eval(cmd, opts)
end
trx.console = console
================================================
FILE: data/scripting/creatures.lua
================================================
local raw = trxc.creatures
local creatures = {
add_ally = raw.add_ally,
add_ally_target = raw.add_ally_target,
}
local getters = {
hostile_allies = raw.are_allies_hostile,
}
local setters = {
hostile_allies = raw.set_allies_hostile,
}
local creatures_mt = {
__index = function(self, key)
local getter = getters[key]
return getter and getter() or nil
end,
__newindex = function(self, key, value)
local setter = setters[key]
if setter then
setter(value)
return
end
error("Cannot set field '" .. key .. "' on trx.creatures", 2)
end,
}
setmetatable(creatures, creatures_mt)
trx.creatures = creatures
================================================
FILE: data/scripting/events.lua
================================================
local raw = trxc.events
local types = trxc.events.EventType
local Event = {}
function Event.__call(self, callback)
local et = self._type
return raw.attach(et, callback)
end
local function to_event_name(name)
if string.sub(name, 1, 7) == "BEFORE_" then
return string.lower(name)
elseif string.sub(name, 1, 6) == "AFTER_" then
return string.lower(name)
end
return "on_" .. string.lower(name)
end
local events = { EventType = types }
for name, et in pairs(types) do
local proxy = { _type = et }
setmetatable(proxy, Event)
events[to_event_name(name)] = proxy
end
function events.detach(id)
raw.detach(id)
end
trx.events = events
================================================
FILE: data/scripting/game.lua
================================================
local raw = trxc.game
local function make_level(table_type, i)
return {
num = raw.get_level_num(table_type, i),
name = raw.get_level_name(table_type, i),
path = raw.get_level_path(table_type, i),
type = raw.get_level_type(table_type, i),
}
end
local function make_levels(table_type)
local count = raw.count_levels(table_type)
local levels = {}
for i = 1, count do
levels[i] = make_level(table_type, i)
end
return levels
end
local table_map = {
levels = raw.LevelTable.MAIN,
demos = raw.LevelTable.DEMOS,
cutscenes = raw.LevelTable.CUTSCENES,
}
-- settings system
local Settings = (function()
local function config_entry(path)
return {
get = function()
return trx.config.get(path)
end,
set = function(value)
trx.config.set(path, value)
end,
}
end
local registry = {
lockout_option_ring = config_entry("flow.lockout_option_ring"),
load_save_disabled = config_entry("flow.load_save_disabled"),
play_any_level = config_entry("flow.play_any_level"),
demo_delay = config_entry("flow.demo_delay"),
cheat_keys = config_entry("flow.cheat_keys"),
}
return setmetatable({}, {
__index = function(_, key)
local r = registry[key]
return r and r.get() or nil
end,
__newindex = function(_, key, value)
local r = registry[key]
if not r then
error("Cannot set field '" .. key .. "' on Settings")
end
r.set(value)
end,
})
end)()
local dynamic_getters = {
current_level = function()
return make_level(raw.get_current_level_table(), raw.get_current_level_idx())
end,
version = raw.get_version,
trx_version = raw.get_trx_version,
}
trx.game = setmetatable({
LevelTable = raw.LevelTable,
LevelType = raw.LevelType,
settings = Settings,
play_level = raw.play_level,
play_cutscene = raw.play_cutscene,
play_demo = raw.play_demo,
}, {
__index = function(self, key)
local table_type = table_map[key]
if table_type then
local t = make_levels(table_type)
rawset(self, key, t)
return t
end
local getter = dynamic_getters[key]
return getter and getter() or nil
end,
__newindex = function(self, key, value)
error("Cannot set field '" .. key .. "' on trx.game")
end,
})
================================================
FILE: data/scripting/items.lua
================================================
local raw = trxc.items
-- Item proxy metatable
local getters = {
pos = raw.get_pos,
rot = raw.get_rot,
anim = raw.get_anim,
frame = raw.get_frame,
room_num = raw.get_room,
room = function(idx)
return trx.rooms[raw.get_room(idx)]
end,
status = raw.get_status,
flags = raw.get_flags,
timer = raw.get_timer,
object_id = raw.get_object_id,
hit_points = raw.get_hit_points,
max_hit_points = raw.get_max_hit_points,
name = raw.get_name,
}
local setters = {
pos = raw.set_pos,
rot = raw.set_rot,
anim = raw.set_anim,
frame = raw.set_frame,
hit_points = raw.set_hit_points,
max_hit_points = raw.set_max_hit_points,
name = raw.set_name,
object_id = raw.set_object_id,
}
local Item = {}
Item.__index = function(self, key)
local getter = getters[key]
return getter and getter(self.idx) or nil
end
Item.__newindex = function(self, key, value)
local setter = setters[key]
if setter then
setter(self.idx, value)
return
end
error("Cannot set field '" .. key .. "' on trx.items.Item")
end
-- items metatable - functions
local fn = {}
function fn.get(arg)
local idx = raw.get(arg)
if not idx then
return nil
end
return setmetatable({ idx = idx }, Item)
end
local find_query_keys = {
object_id = true,
room_num = true,
}
local function validate_find_query(query, fn_name)
if type(query) ~= "table" then
error("trx.items." .. fn_name .. " query must be a table", 2)
end
for key, _ in pairs(query) do
if not find_query_keys[key] then
trx.log.warn("trx.items." .. fn_name .. ": unknown property '" .. tostring(key) .. "'")
end
end
end
local function is_matching(item, query)
if query.object_id ~= nil and item.object_id ~= query.object_id then
return false
end
if query.room_num ~= nil and item.room_num ~= query.room_num then
return false
end
return true
end
local function find_items(query, first_only)
local matches = first_only and nil or {}
local count = raw.count()
for i = 1, count do
local item = setmetatable({ idx = i }, Item)
if is_matching(item, query) then
if first_only then
return item
end
table.insert(matches, item)
end
end
return first_only and nil or matches
end
function fn.find(query)
if query == nil then
return {}
end
validate_find_query(query, "find")
return find_items(query, false)
end
function fn.first(query)
if query == nil then
return nil
end
validate_find_query(query, "first")
return find_items(query, true)
end
-- items metatable - metamethods
trx.items = setmetatable({}, {
Item = Item,
__len = function()
return raw.count()
end,
__index = function(_, key)
if key == "fn" then
return fn
elseif key == "find" then
return fn.find
elseif key == "first" then
return fn.first
elseif type(key) == "number" or type(key) == "string" then
return fn.get(key)
end
return nil
end,
})
================================================
FILE: data/scripting/lara.lua
================================================
local raw = trxc.lara
local lara = {
set_extra_equipment = raw.set_extra_equipment,
clear_equipment = raw.clear_equipment,
mesh = raw.mesh,
extra_mesh = raw.extra_mesh,
}
-- Item proxy metatable
local getters = {
exposure_bar = raw.get_exposure_bar,
air_bar = raw.get_air_bar,
outfit = raw.get_outfit,
holsters_visible = raw.are_holsters_visible,
has_pistol_weapon = raw.has_pistol_weapon,
equipped_gun = raw.get_equipped_gun,
extra_anim = raw.get_extra_anim,
item = function()
return trx.items[raw.get_item()]
end,
target = function()
local target = raw.get_target()
if target == nil then
return nil
end
return trx.items[target]
end,
}
local setters = {
exposure_bar = raw.set_exposure_bar,
air_bar = raw.set_air_bar,
outfit = raw.set_outfit,
holsters_visible = raw.set_holsters_visible,
}
local lara_mt = {
__index = function(self, key)
local getter = getters[key]
return getter and getter() or nil
end,
__newindex = function(self, key, value)
local setter = setters[key]
if setter then
setter(value)
return
end
error("Cannot set field '" .. key .. "' on trx.lara", 2)
end,
}
setmetatable(lara, lara_mt)
trx.lara = lara
================================================
FILE: data/scripting/log.lua
================================================
local raw = trxc.log
local LogLevel = trxc.log.LogLevel
local log = { LogLevel = LogLevel }
function log.generic(level, ...)
raw.log(level, ...)
end
function log.info(...)
raw.log(LogLevel.INFO, ...)
end
function log.warn(...)
raw.log(LogLevel.WARNING, ...)
end
function log.warning(...)
raw.log(LogLevel.WARNING, ...)
end
function log.error(...)
raw.log(LogLevel.ERROR, ...)
end
function log.debug(...)
raw.log(LogLevel.DEBUG, ...)
end
trx.log = log
================================================
FILE: data/scripting/music.lua
================================================
local raw = trxc.music
local music = {
PlayMode = raw.PlayMode,
}
function music.get_track()
return raw.get_track()
end
function music.play(id, opts)
opts = opts or {}
mode = opts.mode or trx.music.PlayMode.ONCE
raw.play(id, mode)
end
function music.pause()
raw.pause()
end
function music.unpause()
raw.unpause()
end
function music.stop()
raw.stop()
end
music.play_track = music.play
trx.music = music
================================================
FILE: data/scripting/objects.lua
================================================
local raw = trxc.objects
local objects = {
swap_mesh = raw.swap_mesh,
}
trx.objects = objects
================================================
FILE: data/scripting/rooms.lua
================================================
local raw = trxc.rooms
-- Room proxy metatable
local getters = {
num = function(idx)
return idx
end,
underwater = raw.get_underwater,
wind = raw.get_wind,
flip_status = raw.get_flip_status,
flipped_room = function(self, key)
local flipped_room = raw.get_flipped_room(self)
if flipped_room == nil then
return nil
end
return trx.rooms[flipped_room]
end,
bounds = raw.get_bounds,
internal_bounds = function(self, key)
local bounds = raw.get_bounds(self)
return {
min_x = bounds.min_x + 1024,
min_y = bounds.min_y,
min_z = bounds.min_z + 1024,
max_x = bounds.max_x - 1024,
max_y = bounds.max_y,
max_z = bounds.max_z - 1024,
}
end,
}
local setters = {
underwater = raw.set_underwater,
wind = raw.set_wind,
}
local Room = {}
Room.__index = function(self, key)
local getter = getters[key]
return getter and getter(self.idx) or nil
end
Room.__newindex = function(self, key, value)
local setter = setters[key]
if setter then
setter(self.idx, value)
return
end
error("Cannot set field '" .. key .. "' on trx.items.Room")
end
-- rooms metatable - functions
local fn = {
FlipStatus = raw.FlipStatus,
Room = Room,
flip = raw.flip,
flip_effect = raw.flip_effect,
}
function fn.get(arg)
local idx = raw.get(arg)
if not idx then
return nil
end
return setmetatable({ idx = idx }, Room)
end
trx.rooms = setmetatable({}, {
__len = function()
return raw.count()
end,
__index = function(_, key)
if key == "fn" then
return fn
elseif key == "flip" or key == "flip_effect" then
return fn[key]
elseif type(key) == "number" or type(key) == "string" then
return fn.get(key)
end
return nil
end,
})
================================================
FILE: data/scripting/sound.lua
================================================
local raw = trxc.sound
local sound = {}
function sound.is_available(id)
return raw.is_available(id)
end
function sound.play(id, opts)
raw.play(id, opts)
end
function sound.stop(id)
raw.stop(id)
end
function sound.stop_all()
raw.stop_all()
end
trx.sound = sound
================================================
FILE: data/tomb-11.bdf
================================================
STARTFONT 2.1
FONT -nerdypepper-tomb-medium-r-normal--11-80-100-100-C-50-ISO10646-1
SIZE 11 75 75
FONTBOUNDINGBOX 7 10 0 -2
STARTPROPERTIES 34
FOUNDRY "nerdypepper"
FAMILY_NAME "tomb"
WEIGHT_NAME "medium"
SLANT "r"
SETWIDTH_NAME "normal"
ADD_STYLE_NAME ""
PIXEL_SIZE 11
POINT_SIZE 80
RESOLUTION_X 100
RESOLUTION_Y 100
SPACING "C"
AVERAGE_WIDTH 50
CHARSET_REGISTRY "ISO10646"
CHARSET_ENCODING "1"
FONTNAME_REGISTRY ""
CHARSET_COLLECTIONS "ISO8859-2 ISO8859-9 ISO8859-4 ISO10646-1"
FONT_NAME "tomb"
FACE_NAME "tomb"
COPYRIGHT "Copyright (c) 2025 LostArtefacts"
FONT_VERSION "1.0.0"
FONT_ASCENT 9
FONT_DESCENT 2
UNDERLINE_POSITION -1
UNDERLINE_THICKNESS 1
X_HEIGHT 4
CAP_HEIGHT 4
RAW_ASCENT 818
RAW_DESCENT 181
NORM_SPACE 5
RELATIVE_WEIGHT 50
RELATIVE_SETWIDTH 50
FIGURE_WIDTH 5
AVG_LOWERCASE_WIDTH 50
AVG_UPPERCASE_WIDTH 50
ENDPROPERTIES
CHARS 101
STARTCHAR space
ENCODING 32
SWIDTH 454 0
DWIDTH 5 0
BBX 1 1 4 0
BITMAP
00
ENDCHAR
STARTCHAR exclam
ENCODING 33
SWIDTH 454 0
DWIDTH 5 0
BBX 1 7 2 0
BITMAP
80
80
80
80
80
00
80
ENDCHAR
STARTCHAR quotedbl
ENCODING 34
SWIDTH 454 0
DWIDTH 5 0
BBX 3 3 1 4
BITMAP
A0
A0
A0
ENDCHAR
STARTCHAR numbersign
ENCODING 35
SWIDTH 545 0
DWIDTH 6 0
BBX 5 7 0 0
BITMAP
50
50
F8
50
F8
50
50
ENDCHAR
STARTCHAR dollar
ENCODING 36
SWIDTH 454 0
DWIDTH 5 0
BBX 5 9 0 -1
BITMAP
20
70
A8
A0
70
28
A8
70
20
ENDCHAR
STARTCHAR percent
ENCODING 37
SWIDTH 545 0
DWIDTH 6 0
BBX 5 7 0 0
BITMAP
C8
C8
10
20
40
98
98
ENDCHAR
STARTCHAR ampersand
ENCODING 38
SWIDTH 454 0
DWIDTH 5 0
BBX 5 7 0 0
BITMAP
60
80
90
78
90
90
68
ENDCHAR
STARTCHAR quotesingle
ENCODING 39
SWIDTH 454 0
DWIDTH 5 0
BBX 1 3 2 4
BITMAP
80
80
80
ENDCHAR
STARTCHAR parenleft
ENCODING 40
SWIDTH 454 0
DWIDTH 5 0
BBX 4 8 0 -1
BITMAP
30
40
80
80
80
80
40
30
ENDCHAR
STARTCHAR parenright
ENCODING 41
SWIDTH 454 0
DWIDTH 5 0
BBX 4 8 0 -1
BITMAP
C0
20
10
10
10
10
20
C0
ENDCHAR
STARTCHAR asterisk
ENCODING 42
SWIDTH 454 0
DWIDTH 5 0
BBX 5 5 0 0
BITMAP
50
20
F8
20
50
ENDCHAR
STARTCHAR plus
ENCODING 43
SWIDTH 454 0
DWIDTH 5 0
BBX 5 5 0 0
BITMAP
20
20
F8
20
20
ENDCHAR
STARTCHAR comma
ENCODING 44
SWIDTH 454 0
DWIDTH 5 0
BBX 2 3 1 -1
BITMAP
40
40
80
ENDCHAR
STARTCHAR hyphen
ENCODING 45
SWIDTH 454 0
DWIDTH 5 0
BBX 4 1 0 2
BITMAP
F0
ENDCHAR
STARTCHAR period
ENCODING 46
SWIDTH 454 0
DWIDTH 5 0
BBX 1 1 2 0
BITMAP
80
ENDCHAR
STARTCHAR slash
ENCODING 47
SWIDTH 727 0
DWIDTH 8 0
BBX 7 7 0 0
BITMAP
02
04
08
10
20
40
80
ENDCHAR
STARTCHAR zero
ENCODING 48
SWIDTH 545 0
DWIDTH 6 0
BBX 5 7 0 0
BITMAP
70
88
98
A8
C8
88
70
ENDCHAR
STARTCHAR one
ENCODING 49
SWIDTH 545 0
DWIDTH 6 0
BBX 5 7 0 0
BITMAP
20
60
A0
20
20
20
F8
ENDCHAR
STARTCHAR two
ENCODING 50
SWIDTH 545 0
DWIDTH 6 0
BBX 5 7 0 0
BITMAP
70
88
08
10
20
40
F8
ENDCHAR
STARTCHAR three
ENCODING 51
SWIDTH 545 0
DWIDTH 6 0
BBX 5 7 0 0
BITMAP
70
88
08
10
08
88
70
ENDCHAR
STARTCHAR four
ENCODING 52
SWIDTH 545 0
DWIDTH 6 0
BBX 5 7 0 0
BITMAP
80
90
90
F8
10
10
10
ENDCHAR
STARTCHAR five
ENCODING 53
SWIDTH 545 0
DWIDTH 6 0
BBX 5 7 0 0
BITMAP
F8
80
80
F0
08
08
F0
ENDCHAR
STARTCHAR six
ENCODING 54
SWIDTH 545 0
DWIDTH 6 0
BBX 5 7 0 0
BITMAP
70
88
80
F0
88
88
70
ENDCHAR
STARTCHAR seven
ENCODING 55
SWIDTH 454 0
DWIDTH 5 0
BBX 5 7 0 0
BITMAP
F8
08
08
10
10
20
20
ENDCHAR
STARTCHAR eight
ENCODING 56
SWIDTH 454 0
DWIDTH 5 0
BBX 5 7 0 0
BITMAP
70
88
88
70
88
88
70
ENDCHAR
STARTCHAR nine
ENCODING 57
SWIDTH 454 0
DWIDTH 5 0
BBX 5 7 0 0
BITMAP
70
88
88
78
08
88
70
ENDCHAR
STARTCHAR colon
ENCODING 58
SWIDTH 454 0
DWIDTH 5 0
BBX 1 4 2 1
BITMAP
80
00
00
80
ENDCHAR
STARTCHAR semicolon
ENCODING 59
SWIDTH 454 0
DWIDTH 5 0
BBX 2 6 1 -1
BITMAP
40
00
00
40
40
80
ENDCHAR
STARTCHAR less
ENCODING 60
SWIDTH 454 0
DWIDTH 5 0
BBX 3 5 0 0
BITMAP
20
40
80
40
20
ENDCHAR
STARTCHAR equal
ENCODING 61
SWIDTH 454 0
DWIDTH 5 0
BBX 4 3 0 1
BITMAP
F0
00
F0
ENDCHAR
STARTCHAR greater
ENCODING 62
SWIDTH 454 0
DWIDTH 5 0
BBX 3 5 1 0
BITMAP
80
40
20
40
80
ENDCHAR
STARTCHAR question
ENCODING 63
SWIDTH 454 0
DWIDTH 5 0
BBX 4 7 0 0
BITMAP
60
90
10
20
40
00
40
ENDCHAR
STARTCHAR at
ENCODING 64
SWIDTH 454 0
DWIDTH 5 0
BBX 5 7 0 0
BITMAP
70
88
B8
A8
B8
80
70
ENDCHAR
STARTCHAR A
ENCODING 65
SWIDTH 544 0
DWIDTH 6 0
BBX 5 7 0 0
BITMAP
20
50
88
F8
88
88
88
ENDCHAR
STARTCHAR B
ENCODING 66
SWIDTH 544 0
DWIDTH 6 0
BBX 5 7 0 0
BITMAP
F0
88
88
F0
88
88
F0
ENDCHAR
STARTCHAR C
ENCODING 67
SWIDTH 544 0
DWIDTH 6 0
BBX 5 7 0 0
BITMAP
70
88
80
80
80
88
70
ENDCHAR
STARTCHAR D
ENCODING 68
SWIDTH 544 0
DWIDTH 6 0
BBX 5 7 0 0
BITMAP
F0
88
88
88
88
88
F0
ENDCHAR
STARTCHAR E
ENCODING 69
SWIDTH 544 0
DWIDTH 6 0
BBX 5 7 0 0
BITMAP
F8
80
80
F0
80
80
F8
ENDCHAR
STARTCHAR F
ENCODING 70
SWIDTH 544 0
DWIDTH 6 0
BBX 5 7 0 0
BITMAP
F8
80
80
F0
80
80
80
ENDCHAR
STARTCHAR G
ENCODING 71
SWIDTH 544 0
DWIDTH 6 0
BBX 5 7 0 0
BITMAP
70
88
80
98
88
88
70
ENDCHAR
STARTCHAR H
ENCODING 72
SWIDTH 544 0
DWIDTH 6 0
BBX 5 7 0 0
BITMAP
88
88
88
F8
88
88
88
ENDCHAR
STARTCHAR I
ENCODING 73
SWIDTH 544 0
DWIDTH 6 0
BBX 3 7 1 0
BITMAP
E0
40
40
40
40
40
E0
ENDCHAR
STARTCHAR J
ENCODING 74
SWIDTH 544 0
DWIDTH 6 0
BBX 4 7 0 0
BITMAP
F0
10
10
10
10
10
E0
ENDCHAR
STARTCHAR K
ENCODING 75
SWIDTH 544 0
DWIDTH 6 0
BBX 5 7 0 0
BITMAP
88
90
A0
C0
A0
90
88
ENDCHAR
STARTCHAR L
ENCODING 76
SWIDTH 544 0
DWIDTH 6 0
BBX 5 7 0 0
BITMAP
80
80
80
80
80
80
F8
ENDCHAR
STARTCHAR M
ENCODING 77
SWIDTH 544 0
DWIDTH 6 0
BBX 5 7 0 0
BITMAP
88
D8
A8
88
88
88
88
ENDCHAR
STARTCHAR N
ENCODING 78
SWIDTH 544 0
DWIDTH 6 0
BBX 5 7 0 0
BITMAP
88
C8
A8
98
88
88
88
ENDCHAR
STARTCHAR O
ENCODING 79
SWIDTH 544 0
DWIDTH 6 0
BBX 5 7 0 0
BITMAP
70
88
88
88
88
88
70
ENDCHAR
STARTCHAR P
ENCODING 80
SWIDTH 544 0
DWIDTH 6 0
BBX 5 7 0 0
BITMAP
F0
88
88
F0
80
80
80
ENDCHAR
STARTCHAR Q
ENCODING 81
SWIDTH 544 0
DWIDTH 6 0
BBX 6 8 0 -1
BITMAP
70
88
88
88
88
98
78
04
ENDCHAR
STARTCHAR R
ENCODING 82
SWIDTH 544 0
DWIDTH 6 0
BBX 5 7 0 0
BITMAP
F0
88
88
F0
88
88
88
ENDCHAR
STARTCHAR S
ENCODING 83
SWIDTH 544 0
DWIDTH 6 0
BBX 5 7 0 0
BITMAP
70
88
80
70
08
88
70
ENDCHAR
STARTCHAR T
ENCODING 84
SWIDTH 544 0
DWIDTH 6 0
BBX 5 7 0 0
BITMAP
F8
20
20
20
20
20
20
ENDCHAR
STARTCHAR U
ENCODING 85
SWIDTH 544 0
DWIDTH 6 0
BBX 5 7 0 0
BITMAP
88
88
88
88
88
88
70
ENDCHAR
STARTCHAR V
ENCODING 86
SWIDTH 544 0
DWIDTH 6 0
BBX 5 7 0 0
BITMAP
88
88
88
88
88
50
20
ENDCHAR
STARTCHAR W
ENCODING 87
SWIDTH 544 0
DWIDTH 6 0
BBX 5 7 0 0
BITMAP
88
88
88
88
A8
D8
88
ENDCHAR
STARTCHAR X
ENCODING 88
SWIDTH 544 0
DWIDTH 6 0
BBX 5 7 0 0
BITMAP
88
88
50
20
50
88
88
ENDCHAR
STARTCHAR Y
ENCODING 89
SWIDTH 544 0
DWIDTH 6 0
BBX 5 7 0 0
BITMAP
88
88
88
50
20
20
20
ENDCHAR
STARTCHAR Z
ENCODING 90
SWIDTH 544 0
DWIDTH 6 0
BBX 5 7 0 0
BITMAP
F8
08
10
20
40
80
F8
ENDCHAR
STARTCHAR bracketleft
ENCODING 91
SWIDTH 363 0
DWIDTH 4 0
BBX 2 7 1 0
BITMAP
C0
80
80
80
80
80
C0
ENDCHAR
STARTCHAR backslash
ENCODING 92
SWIDTH 727 0
DWIDTH 8 0
BBX 7 7 0 0
BITMAP
80
40
20
10
08
04
02
ENDCHAR
STARTCHAR bracketright
ENCODING 93
SWIDTH 363 0
DWIDTH 4 0
BBX 2 7 1 0
BITMAP
C0
40
40
40
40
40
C0
ENDCHAR
STARTCHAR asciicircum
ENCODING 94
SWIDTH 454 0
DWIDTH 5 0
BBX 5 3 0 4
BITMAP
20
50
88
ENDCHAR
STARTCHAR underscore
ENCODING 95
SWIDTH 454 0
DWIDTH 5 0
BBX 4 1 0 0
BITMAP
F0
ENDCHAR
STARTCHAR grave
ENCODING 96
SWIDTH 454 0
DWIDTH 5 0
BBX 3 3 1 4
BITMAP
80
40
20
ENDCHAR
STARTCHAR a
ENCODING 97
SWIDTH 454 0
DWIDTH 5 0
BBX 4 5 0 0
BITMAP
70
90
90
B0
50
ENDCHAR
STARTCHAR b
ENCODING 98
SWIDTH 454 0
DWIDTH 5 0
BBX 4 7 0 0
BITMAP
80
80
E0
90
90
90
E0
ENDCHAR
STARTCHAR c
ENCODING 99
SWIDTH 454 0
DWIDTH 5 0
BBX 4 5 0 0
BITMAP
60
90
80
90
60
ENDCHAR
STARTCHAR d
ENCODING 100
SWIDTH 454 0
DWIDTH 5 0
BBX 4 7 0 0
BITMAP
10
10
70
90
90
90
70
ENDCHAR
STARTCHAR e
ENCODING 101
SWIDTH 454 0
DWIDTH 5 0
BBX 4 5 0 0
BITMAP
60
90
F0
80
70
ENDCHAR
STARTCHAR f
ENCODING 102
SWIDTH 454 0
DWIDTH 5 0
BBX 4 7 0 0
BITMAP
30
40
40
E0
40
40
40
ENDCHAR
STARTCHAR g
ENCODING 103
SWIDTH 454 0
DWIDTH 5 0
BBX 4 7 0 -2
BITMAP
70
90
90
90
70
10
60
ENDCHAR
STARTCHAR h
ENCODING 104
SWIDTH 454 0
DWIDTH 5 0
BBX 4 7 0 0
BITMAP
80
80
E0
90
90
90
90
ENDCHAR
STARTCHAR i
ENCODING 105
SWIDTH 454 0
DWIDTH 5 0
BBX 4 7 0 0
BITMAP
40
00
C0
40
40
40
30
ENDCHAR
STARTCHAR j
ENCODING 106
SWIDTH 454 0
DWIDTH 5 0
BBX 3 9 0 -2
BITMAP
20
00
60
20
20
20
20
20
C0
ENDCHAR
STARTCHAR k
ENCODING 107
SWIDTH 454 0
DWIDTH 5 0
BBX 4 7 0 0
BITMAP
80
80
90
A0
C0
A0
90
ENDCHAR
STARTCHAR l
ENCODING 108
SWIDTH 454 0
DWIDTH 5 0
BBX 4 7 0 0
BITMAP
C0
40
40
40
40
40
30
ENDCHAR
STARTCHAR m
ENCODING 109
SWIDTH 454 0
DWIDTH 5 0
BBX 4 5 0 0
BITMAP
90
F0
90
90
90
ENDCHAR
STARTCHAR n
ENCODING 110
SWIDTH 454 0
DWIDTH 5 0
BBX 4 5 0 0
BITMAP
E0
90
90
90
90
ENDCHAR
STARTCHAR o
ENCODING 111
SWIDTH 454 0
DWIDTH 5 0
BBX 4 5 0 0
BITMAP
60
90
90
90
60
ENDCHAR
STARTCHAR p
ENCODING 112
SWIDTH 454 0
DWIDTH 5 0
BBX 4 7 0 -2
BITMAP
E0
90
90
90
E0
80
80
ENDCHAR
STARTCHAR q
ENCODING 113
SWIDTH 454 0
DWIDTH 5 0
BBX 4 7 0 -2
BITMAP
70
90
90
90
70
10
10
ENDCHAR
STARTCHAR r
ENCODING 114
SWIDTH 454 0
DWIDTH 5 0
BBX 4 5 0 0
BITMAP
E0
90
80
80
80
ENDCHAR
STARTCHAR s
ENCODING 115
SWIDTH 454 0
DWIDTH 5 0
BBX 4 5 0 0
BITMAP
70
80
60
10
E0
ENDCHAR
STARTCHAR t
ENCODING 116
SWIDTH 454 0
DWIDTH 5 0
BBX 4 7 0 0
BITMAP
40
40
F0
40
40
40
30
ENDCHAR
STARTCHAR u
ENCODING 117
SWIDTH 454 0
DWIDTH 5 0
BBX 4 5 0 0
BITMAP
90
90
90
90
70
ENDCHAR
STARTCHAR v
ENCODING 118
SWIDTH 454 0
DWIDTH 5 0
BBX 4 5 0 0
BITMAP
90
90
90
60
60
ENDCHAR
STARTCHAR w
ENCODING 119
SWIDTH 454 0
DWIDTH 5 0
BBX 4 5 0 0
BITMAP
90
90
90
F0
90
ENDCHAR
STARTCHAR x
ENCODING 120
SWIDTH 454 0
DWIDTH 5 0
BBX 4 5 0 0
BITMAP
90
90
60
90
90
ENDCHAR
STARTCHAR y
ENCODING 121
SWIDTH 454 0
DWIDTH 5 0
BBX 4 7 0 -2
BITMAP
90
90
90
90
70
10
60
ENDCHAR
STARTCHAR z
ENCODING 122
SWIDTH 454 0
DWIDTH 5 0
BBX 4 5 0 0
BITMAP
F0
20
40
80
F0
ENDCHAR
STARTCHAR braceleft
ENCODING 123
SWIDTH 363 0
DWIDTH 4 0
BBX 3 7 0 0
BITMAP
20
40
40
C0
40
40
20
ENDCHAR
STARTCHAR bar
ENCODING 124
SWIDTH 454 0
DWIDTH 5 0
BBX 1 9 2 -1
BITMAP
80
80
80
80
80
80
80
80
80
ENDCHAR
STARTCHAR braceright
ENCODING 125
SWIDTH 363 0
DWIDTH 4 0
BBX 3 7 1 0
BITMAP
80
40
40
20
40
40
80
ENDCHAR
STARTCHAR asciitilde
ENCODING 126
SWIDTH 727 0
DWIDTH 8 0
BBX 7 3 0 1
BITMAP
60
92
0C
ENDCHAR
STARTCHAR uni00A0
ENCODING 160
SWIDTH 454 0
DWIDTH 5 0
BBX 1 1 0 0
BITMAP
00
ENDCHAR
STARTCHAR arrowleft
ENCODING 8592
SWIDTH 636 0
DWIDTH 7 0
BBX 6 5 0 1
BITMAP
20
60
FC
60
20
ENDCHAR
STARTCHAR arrowup
ENCODING 8593
SWIDTH 545 0
DWIDTH 6 0
BBX 5 6 0 0
BITMAP
20
70
F8
20
20
20
ENDCHAR
STARTCHAR arrowright
ENCODING 8594
SWIDTH 636 0
DWIDTH 7 0
BBX 6 5 0 1
BITMAP
10
18
FC
18
10
ENDCHAR
STARTCHAR arrowdown
ENCODING 8595
SWIDTH 545 0
DWIDTH 6 0
BBX 5 5 0 1
BITMAP
20
20
F8
70
20
ENDCHAR
STARTCHAR carriagereturn
ENCODING 8629
SWIDTH 636 0
DWIDTH 7 0
BBX 6 6 0 0
BITMAP
04
24
64
FC
60
20
ENDCHAR
ENDFONT
================================================
FILE: data/tr1/mac/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleExecutable</key>
<string>TRX</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleIdentifier</key>
<string>com.lostartefacts.tr1x</string>
<key>CFBundleName</key>
<string>TR1X</string>
<key>CFBundleIconFile</key>
<string>icon</string>
</dict>
</plist>
================================================
FILE: data/tr2/mac/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleExecutable</key>
<string>TRX</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleIdentifier</key>
<string>com.lostartefacts.tr2x</string>
<key>CFBundleName</key>
<string>TR2X</string>
<key>CFBundleIconFile</key>
<string>icon</string>
</dict>
</plist>
================================================
FILE: data/tr3/glyphs/mapping_basic_latin.txt
================================================
# --------------------------------------------------
# Unicode Block "Basic Latin" (U+0000 to U+007F)
# --------------------------------------------------
# ASCII a-z
U+0061:a 0 T render("Timesbd.ttf", index=26)
U+0062:b 0 T render("Timesbd.ttf", index=27)
U+0063:c 0 T render("Timesbd.ttf", index=28)
U+0064:d 0 T render("Timesbd.ttf", index=29)
U+0065:e 0 T render("Timesbd.ttf", index=30)
U+0066:f 0 T render("Timesbd.ttf", index=31)
U+0067:g 0 T render("Timesbd.ttf", index=32)
U+0068:h 0 T render("Timesbd.ttf", index=33)
U+0069:i 0 T render("Timesbd.ttf", index=34)
U+006A:j 0 T render("Timesbd.ttf", index=35)
U+006B:k 0 T render("Timesbd.ttf", index=36)
U+006C:l 0 T render("Timesbd.ttf", index=37)
U+006D:m 0 T render("Timesbd.ttf", index=38)
U+006E:n 0 T render("Timesbd.ttf", index=39)
U+006F:o 0 T render("Timesbd.ttf", index=40)
U+0070:p 0 T render("Timesbd.ttf", index=41)
U+0071:q 0 T render("Timesbd.ttf", index=42)
U+0072:r 0 T render("Timesbd.ttf", index=43)
U+0073:s 0 T render("Timesbd.ttf", index=44)
U+0074:t 0 T render("Timesbd.ttf", index=45)
U+0075:u 0 T render("Timesbd.ttf", index=46)
U+0076:v 0 T render("Timesbd.ttf", index=47)
U+0077:w 0 T render("Timesbd.ttf", index=48)
U+0078:x 0 T render("Timesbd.ttf", index=49)
U+0079:y 0 T render("Timesbd.ttf", index=50)
U+007A:z 0 T render("Timesbd.ttf", index=51)
# ASCII A-Z
U+0041:A 0 T render("Timesbd.ttf", index=0)
U+0042:B 0 T render("Timesbd.ttf", index=1)
U+0043:C 0 T render("Timesbd.ttf", index=2)
U+0044:D 0 T render("Timesbd.ttf", index=3)
U+0045:E 0 T render("Timesbd.ttf", index=4)
U+0046:F 0 T render("Timesbd.ttf", index=5)
U+0047:G 0 T render("Timesbd.ttf", index=6)
U+0048:H 0 T render("Timesbd.ttf", index=7)
U+0049:I 0 T render("Timesbd.ttf", index=8)
U+004A:J 0 T render("Timesbd.ttf", index=9)
U+004B:K 0 T render("Timesbd.ttf", index=10)
U+004C:L 0 T render("Timesbd.ttf", index=11)
U+004D:M 0 T render("Timesbd.ttf", index=12)
U+004E:N 0 T render("Timesbd.ttf", index=13)
U+004F:O 0 T render("Timesbd.ttf", index=14)
U+0050:P 0 T render("Timesbd.ttf", index=15)
U+0051:Q 0 T render("Timesbd.ttf", index=16)
U+0052:R 0 T render("Timesbd.ttf", index=17)
U+0053:S 0 T render("Timesbd.ttf", index=18)
U+0054:T 0 T render("Timesbd.ttf", index=19)
U+0055:U 0 T render("Timesbd.ttf", index=20)
U+0056:V 0 T render("Timesbd.ttf", index=21)
U+0057:W 0 T render("Timesbd.ttf", index=22)
U+0058:X 0 T render("Timesbd.ttf", index=23)
U+0059:Y 0 T render("Timesbd.ttf", index=24)
U+005A:Z 0 T render("Timesbd.ttf", index=25)
# Digits 0-9
U+0030:0 0 T render("Timesbd.ttf", index=52)
U+0031:1 0 T render("Timesbd.ttf", index=53)
U+0032:2 0 T render("Timesbd.ttf", index=54)
U+0033:3 0 T render("Timesbd.ttf", index=55)
U+0034:4 0 T render("Timesbd.ttf", index=56)
U+0035:5 0 T render("Timesbd.ttf", index=57)
U+0036:6 0 T render("Timesbd.ttf", index=58)
U+0037:7 0 T render("Timesbd.ttf", index=59)
U+0038:8 0 T render("Timesbd.ttf", index=60)
U+0039:9 0 T render("Timesbd.ttf", index=61)
# Basic Punctuation
U+0021:! 0 T render("Timesbd.ttf", index=64)
U+0022:" 0 T render("Timesbd.ttf")
U+0023:# 0 T render("Timesbd.ttf", index=78)
U+0024:$ 0 T render("Timesbd.ttf")
U+0025:% 0 T render("Timesbd.ttf")
U+0026:& 0 T render("Timesbd.ttf")
U+0027:' 0 T render("Timesbd.ttf", index=79)
U+0028:( 0 T render("Timesbd.ttf")
U+0029:) 0 T render("Timesbd.ttf")
U+002A:* 0 T render("Timesbd.ttf")
U+002B:+ 0 T render("Timesbd.ttf", index=72)
U+002C:, 0 T render("Timesbd.ttf", index=63)
U+002D:- 0 T render("Timesbd.ttf", index=71, offset_y=-2)
U+002E:. 0 T render("Timesbd.ttf", index=62)
U+002F:/ 0 T render("Timesbd.ttf", index=68)
U+003A:: 0 T render("Timesbd.ttf", index=73)
U+003B:; 0 T render("Timesbd.ttf")
U+003C:< 0 T render("Timesbd.ttf")
U+003D:= 0 T render("Timesbd.ttf")
U+003E:> 0 T render("Timesbd.ttf")
U+003F:? 0 T render("Timesbd.ttf", index=65)
U+0040:@ 0 T render("Timesbd.ttf")
U+005B:[ 0 T render("Timesbd.ttf", index=66)
U+005C:\ 0 T render("Timesbd.ttf", index=76)
U+005D:] 0 T render("Timesbd.ttf", index=75)
U+005E:^ 0 T render("Timesbd.ttf")
U+005F:_ 0 T render("Timesbd.ttf")
U+0060:` 0 T render("Timesbd.ttf")
U+007B:{ 0 T render("Timesbd.ttf")
U+007C:| 0 T render("Timesbd.ttf")
U+007D:} 0 T render("Timesbd.ttf")
U+007E:~ 0 T render("Timesbd.ttf")
================================================
FILE: data/tr3/glyphs/mapping_combining_diactrics.txt
================================================
# --------------------------------------------------
# Combining diactrics
# --------------------------------------------------
"\\{grave accent}" 0 T render("Timesbd.ttf", index=77)
"\\{acute accent}" 0 T render("Timesbd.ttf", index=70)
"\\{circumflex accent}" 0 T render("Timesbd.ttf", index=69)
"\\{circumflex}" 0 T link("\\{circumflex accent}")
"\\{macron}" 0 T render("Timesbd.ttf")
"\\{breve}" 0 T render("Timesbd.ttf")
"\\{dot above}" 0 T render("Timesbd.ttf")
"\\{umlaut}" 0 T render("Timesbd.ttf", index=67)
"\\{caron}" 0 T render("Timesbd.ttf")
"\\{ring above}" 0 T render("Timesbd.ttf")
"\\{tilde}" 0 T render("Timesbd.ttf")
"\\{double acute accent}" 0 T render("Timesbd.ttf")
"\\{acute umlaut}" 0 T render("Timesbd.ttf")
================================================
FILE: data/tr3/glyphs/mapping_cyrillic.txt
================================================
# --------------------------------------------------
# Unicode Block "Cyrillic" (U+0400 to U+04FF)
# --------------------------------------------------
U+0400:Ѐ 0 T render("Timesbd.ttf")
U+0401:Ё 0 T render("Timesbd.ttf")
U+0402:Ђ 0 T render("Timesbd.ttf")
U+0403:Ѓ 0 T render("Timesbd.ttf")
U+0404:Є 0 T render("Timesbd.ttf")
U+0405:Ѕ 0 T link("S")
U+0406:І 0 T link("I")
U+0407:Ї 0 T render("Timesbd.ttf")
U+0408:Ј 0 T link("J")
U+0409:Љ 0 T render("Timesbd.ttf")
U+040A:Њ 0 T render("Timesbd.ttf")
U+040B:Ћ 0 T render("Timesbd.ttf")
U+040C:Ќ 0 T render("Timesbd.ttf")
U+040D:Ѝ 0 T render("Timesbd.ttf")
U+040E:Ў 0 T render("Timesbd.ttf")
U+040F:Џ 0 T render("Timesbd.ttf")
U+0410:А 0 T link("A")
U+0411:Б 0 T render("Timesbd.ttf")
U+0412:В 0 T link("B")
U+0413:Г 0 T link(U+0393:Γ)
U+0414:Д 0 T render("Timesbd.ttf")
U+0415:Е 0 T link("E")
U+0416:Ж 0 T render("Timesbd.ttf")
U+0417:З 0 T render("Timesbd.ttf")
U+0418:И 0 T render("Timesbd.ttf")
U+0419:Й 0 T render("Timesbd.ttf")
U+041A:К 0 T link("K")
U+041B:Л 0 T render("Timesbd.ttf")
U+041C:М 0 T link("M")
U+041D:Н 0 T link("H")
U+041E:О 0 T link("O")
U+041F:П 0 T link(U+03A0:Π)
U+0420:Р 0 T link("P")
U+0421:С 0 T link("C")
U+0422:Т 0 T link("T")
U+0423:У 0 T render("Timesbd.ttf")
U+0424:Ф 0 T link(U+03A6:Φ)
U+0425:Х 0 T link("X")
U+0426:Ц 0 T render("Timesbd.ttf")
U+0427:Ч 0 T render("Timesbd.ttf")
U+0428:Ш 0 T render("Timesbd.ttf")
U+0429:Щ 0 T render("Timesbd.ttf")
U+042A:Ъ 0 T render("Timesbd.ttf")
U+042B:Ы 0 T render("Timesbd.ttf")
U+042C:Ь 0 T render("Timesbd.ttf")
U+042D:Э 0 T render("Timesbd.ttf")
U+042E:Ю 0 T render("Timesbd.ttf")
U+042F:Я 0 T render("Timesbd.ttf")
U+0430:а 0 T link("a")
U+0431:б 0 T render("Timesbd.ttf")
U+0432:в 0 T render("Timesbd.ttf")
U+0433:г 0 T render("Timesbd.ttf")
U+0434:д 0 T render("Timesbd.ttf")
U+0435:е 0 T link("e")
U+0436:ж 0 T render("Timesbd.ttf")
U+0437:з 0 T render("Timesbd.ttf")
U+0438:и 0 T render("Timesbd.ttf")
U+0439:й 0 T render("Timesbd.ttf")
U+043A:к 0 T link(U+0138:ĸ)
U+043B:л 0 T render("Timesbd.ttf")
U+043C:м 0 T render("Timesbd.ttf")
U+043D:н 0 T render("Timesbd.ttf")
U+043E:о 0 T link("o")
U+043F:п 0 T render("Timesbd.ttf")
U+0440:р 0 T link("p")
U+0441:с 0 T link("c")
U+0442:т 0 T render("Timesbd.ttf")
U+0443:у 0 T link("y")
U+0444:ф 0 T render("Timesbd.ttf")
U+0445:х 0 T link("x")
U+0446:ц 0 T render("Timesbd.ttf")
U+0447:ч 0 T render("Timesbd.ttf")
U+0448:ш 0 T render("Timesbd.ttf")
U+0449:щ 0 T render("Timesbd.ttf")
U+044A:ъ 0 T render("Timesbd.ttf")
U+044B:ы 0 T render("Timesbd.ttf")
U+044C:ь 0 T render("Timesbd.ttf")
U+044D:э 0 T render("Timesbd.ttf")
U+044E:ю 0 T render("Timesbd.ttf")
U+044F:я 0 T render("Timesbd.ttf")
U+0450:ѐ 0 T render("Timesbd.ttf")
U+0451:ё 0 T render("Timesbd.ttf")
U+0452:ђ 0 T render("Timesbd.ttf")
U+0453:ѓ 0 T render("Timesbd.ttf")
U+0454:є 0 T render("Timesbd.ttf")
U+0455:ѕ 0 T link("s")
U+0456:і 0 T link("i")
U+0457:ї 0 T render("Timesbd.ttf")
U+0458:ј 0 T link("j")
U+0459:љ 0 T render("Timesbd.ttf")
U+045A:њ 0 T render("Timesbd.ttf")
U+045B:ћ 0 T link(U+0127:ħ)
U+045C:ќ 0 T render("Timesbd.ttf")
U+045D:ѝ 0 T render("Timesbd.ttf")
U+045E:ў 0 T render("Timesbd.ttf")
U+045F:џ 0 T render("Timesbd.ttf")
U+0490:Ґ 0 T render("Timesbd.ttf")
U+0491:ґ 0 T render("Timesbd.ttf")
================================================
FILE: data/tr3/glyphs/mapping_greek_and_coptic.txt
================================================
# --------------------------------------------------
# Unicode Block "Greek and Coptic" (U+0370 to U+03FF)
# --------------------------------------------------
U+0393:Γ 0 T render("Timesbd.ttf")
U+0394:Δ 0 T render("Timesbd.ttf")
U+0395:Ε 0 T link("E")
U+0396:Ζ 0 T link("Z")
U+0397:Η 0 T link("H")
U+0398:Θ 0 T render("Timesbd.ttf")
U+0399:Ι 0 T link("I")
U+039A:Κ 0 T link("K")
U+039B:Λ 0 T render("Timesbd.ttf")
U+039C:Μ 0 T link("M")
U+039D:Ν 0 T link("N")
U+039E:Ξ 0 T render("Timesbd.ttf")
U+039F:Ο 0 T link("O")
U+03A0:Π 0 T render("Timesbd.ttf")
U+03A1:Ρ 0 T link("P")
U+03A3:Σ 0 T render("Timesbd.ttf")
U+03A4:Τ 0 T link("T")
U+03A5:Υ 0 T link("Y")
U+03A6:Φ 0 T render("Timesbd.ttf")
U+03A7:Χ 0 T link("X")
U+03A8:Ψ 0 T render("Timesbd.ttf")
U+03A9:Ω 0 T render("Timesbd.ttf")
U+03B1:α 0 T render("Timesbd.ttf")
U+03B2:β 0 T render("Timesbd.ttf")
U+03B3:γ 0 T render("Timesbd.ttf")
U+03B4:δ 0 T render("Timesbd.ttf")
U+03B5:ε 0 T render("Timesbd.ttf")
U+03B6:ζ 0 T render("Timesbd.ttf")
U+03B7:η 0 T render("Timesbd.ttf")
U+03B8:θ 0 T render("Timesbd.ttf")
U+03B9:ι 0 T link(U+0131:ı)
U+03BA:κ 0 T link(U+0138:ĸ)
U+03BB:λ 0 T render("Timesbd.ttf")
U+03BC:μ 0 T link(U+00B5:µ)
U+03BD:ν 0 T link("v")
U+03BE:ξ 0 T render("Timesbd.ttf")
U+03BF:ο 0 T link("o")
U+03C0:π 0 T render("Timesbd.ttf")
U+03C1:ρ 0 T render("Timesbd.ttf")
U+03C2:ς 0 T render("Timesbd.ttf")
U+03C3:σ 0 T render("Timesbd.ttf")
U+03C4:τ 0 T render("Timesbd.ttf")
U+03C5:υ 0 T render("Timesbd.ttf")
U+03C6:φ 0 T render("Timesbd.ttf")
U+03C7:χ 0 T render("Timesbd.ttf")
U+03C8:ψ 0 T render("Timesbd.ttf")
U+03C9:ω 0 T render("Timesbd.ttf")
U+0386:Ά 0 T render("Timesbd.ttf")
U+0388:Έ 0 T render("Timesbd.ttf")
U+0389:Ή 0 T render("Timesbd.ttf")
U+038A:Ί 0 T render("Timesbd.ttf")
U+038C:Ό 0 T render("Timesbd.ttf")
U+038E:Ύ 0 T render("Timesbd.ttf")
U+038F:Ώ 0 T render("Timesbd.ttf")
U+0390:ΐ 0 T render("Timesbd.ttf")
U+0391:Α 0 T link("A")
U+0392:Β 0 T link("B")
U+03AA:Ϊ 0 T render("Timesbd.ttf")
U+03AB:Ϋ 0 T render("Timesbd.ttf")
U+03AC:ά 0 T render("Timesbd.ttf")
U+03AD:έ 0 T render("Timesbd.ttf")
U+03AE:ή 0 T render("Timesbd.ttf")
U+03AF:ί 0 T render("Timesbd.ttf")
U+03B0:ΰ 0 T render("Timesbd.ttf")
U+03CA:ϊ 0 T render("Timesbd.ttf")
U+03CB:ϋ 0 T render("Timesbd.ttf")
U+03CC:ό 0 T render("Timesbd.ttf")
U+03CD:ύ 0 T render("Timesbd.ttf")
U+03CE:ώ 0 T render("Timesbd.ttf")
================================================
FILE: data/tr3/glyphs/mapping_latin-1_supplement.txt
================================================
# --------------------------------------------------
# Unicode Block "Latin-1 Supplement" (U+0080 to U+00FF)
# --------------------------------------------------
U+00A1:¡ 0 T render("Timesbd.ttf")
U+00A2:¢ 0 T render("Timesbd.ttf")
U+00A3:£ 0 T render("Timesbd.ttf")
U+00A4:¤ 0 T render("Timesbd.ttf")
U+00A5:¥ 0 T render("Timesbd.ttf")
U+00A6:¦ 0 T render("Timesbd.ttf")
U+00A7:§ 0 T render("Timesbd.ttf")
U+00A9:© 0 T render("Timesbd.ttf")
U+00AA:ª 0 T render("Timesbd.ttf")
U+00AB:« 0 T render("Timesbd.ttf")
U+00AC:¬ 0 T render("Timesbd.ttf")
U+00AE:® 0 T render("Timesbd.ttf")
U+00B0:° 0 T render("Timesbd.ttf")
U+00B1:± 0 T render("Timesbd.ttf")
U+00B2:² 0 T render("Timesbd.ttf")
U+00B3:³ 0 T render("Timesbd.ttf")
U+00B5:µ 0 T render("Timesbd.ttf")
U+00B6:¶ 0 T render("Timesbd.ttf")
U+00B7:· 0 T render("Timesbd.ttf")
U+00B9:¹ 0 T render("Timesbd.ttf")
U+00BA:º 0 T render("Timesbd.ttf")
U+00BB:» 0 T render("Timesbd.ttf")
U+00BC:¼ 0 T render("Timesbd.ttf")
U+00BD:½ 0 T render("Timesbd.ttf")
U+00BE:¾ 0 T render("Timesbd.ttf")
U+00BF:¿ 0 T render("Timesbd.ttf")
U+00C0:À 0 T render("Timesbd.ttf")
U+00C1:Á 0 T render("Timesbd.ttf")
U+00C2:Â 0 T render("Timesbd.ttf")
U+00C3:Ã 0 T render("Timesbd.ttf")
U+00C4:Ä 0 T render("Timesbd.ttf")
U+00C5:Å 0 T render("Timesbd.ttf")
U+00C6:Æ 0 T render("Timesbd.ttf")
U+00C7:Ç 0 T render("Timesbd.ttf")
U+00C8:È 0 T render("Timesbd.ttf")
U+00C9:É 0 T render("Timesbd.ttf")
U+00CA:Ê 0 T render("Timesbd.ttf")
U+00CB:Ë 0 T render("Timesbd.ttf")
U+00CC:Ì 0 T render("Timesbd.ttf")
U+00CD:Í 0 T render("Timesbd.ttf")
U+00CE:Î 0 T render("Timesbd.ttf")
U+00CF:Ï 0 T render("Timesbd.ttf")
U+00D0:Ð 0 T render("Timesbd.ttf")
U+00D1:Ñ 0 T render("Timesbd.ttf")
U+00D2:Ò 0 T render("Timesbd.ttf")
U+00D3:Ó 0 T render("Timesbd.ttf")
U+00D4:Ô 0 T render("Timesbd.ttf")
U+00D5:Õ 0 T render("Timesbd.ttf")
U+00D6:Ö 0 T render("Timesbd.ttf")
U+00D7:× 0 T render("Timesbd.ttf")
U+00D8:Ø 0 T render("Timesbd.ttf")
U+00D9:Ù 0 T render("Timesbd.ttf")
U+00DA:Ú 0 T render("Timesbd.ttf")
U+00DB:Û 0 T render("Timesbd.ttf")
U+00DC:Ü 0 T render("Timesbd.ttf")
U+00DD:Ý 0 T render("Timesbd.ttf")
U+00DE:Þ 0 T render("Timesbd.ttf")
U+00DF:ß 0 T render("Timesbd.ttf", index=74)
U+00E0:à 0 T render("Timesbd.ttf")
U+00E1:á 0 T render("Timesbd.ttf")
U+00E2:â 0 T render("Timesbd.ttf")
U+00E3:ã 0 T render("Timesbd.ttf")
U+00E4:ä 0 T render("Timesbd.ttf")
U+00E5:å 0 T render("Timesbd.ttf")
U+00E6:æ 0 T render("Timesbd.ttf")
U+00E7:ç 0 T render("Timesbd.ttf")
U+00E8:è 0 T render("Timesbd.ttf")
U+00E9:é 0 T render("Timesbd.ttf")
U+00EA:ê 0 T render("Timesbd.ttf")
U+00EB:ë 0 T render("Timesbd.ttf")
U+00EC:ì 0 T render("Timesbd.ttf")
U+00ED:í 0 T render("Timesbd.ttf")
U+00EE:î 0 T render("Timesbd.ttf")
U+00EF:ï 0 T render("Timesbd.ttf")
U+00F0:ð 0 T render("Timesbd.ttf")
U+00F1:ñ 0 T render("Timesbd.ttf")
U+00F2:ò 0 T render("Timesbd.ttf")
U+00F3:ó 0 T render("Timesbd.ttf")
U+00F4:ô 0 T render("Timesbd.ttf")
U+00F5:õ 0 T render("Timesbd.ttf")
U+00F6:ö 0 T render("Timesbd.ttf")
U+00F7:÷ 0 T render("Timesbd.ttf")
U+00F8:ø 0 T render("Timesbd.ttf")
U+00F9:ù 0 T render("Timesbd.ttf")
U+00FA:ú 0 T render("Timesbd.ttf")
U+00FB:û 0 T render("Timesbd.ttf")
U+00FC:ü 0 T render("Timesbd.ttf")
U+00FD:ý 0 T render("Timesbd.ttf")
U+00FE:þ 0 T render("Timesbd.ttf")
U+00FF:ÿ 0 T render("Timesbd.ttf")
================================================
FILE: data/tr3/glyphs/mapping_latin_extended-a.txt
================================================
# --------------------------------------------------
# Unicode Block "Latin Extended-A" (U+0100 to U+017F)
# --------------------------------------------------
U+0100:Ā 0 T render("Timesbd.ttf")
U+0101:ā 0 T render("Timesbd.ttf")
U+0102:Ă 0 T render("Timesbd.ttf")
U+0103:ă 0 T render("Timesbd.ttf")
U+0104:Ą 0 T render("Timesbd.ttf")
U+0105:ą 0 T render("Timesbd.ttf")
U+0106:Ć 0 T render("Timesbd.ttf")
U+0107:ć 0 T render("Timesbd.ttf")
U+0108:Ĉ 0 T render("Timesbd.ttf")
U+0109:ĉ 0 T render("Timesbd.ttf")
U+010A:Ċ 0 T render("Timesbd.ttf")
U+010B:ċ 0 T render("Timesbd.ttf")
U+010C:Č 0 T render("Timesbd.ttf")
U+010D:č 0 T render("Timesbd.ttf")
U+010E:Ď 0 T render("Timesbd.ttf")
U+010F:ď 0 T render("Timesbd.ttf")
U+0110:Đ 0 T link(U+00D0:Ð)
U+0111:đ 0 T render("Timesbd.ttf")
U+0112:Ē 0 T render("Timesbd.ttf")
U+0113:ē 0 T render("Timesbd.ttf")
U+0114:Ĕ 0 T render("Timesbd.ttf")
U+0115:ĕ 0 T render("Timesbd.ttf")
U+0116:Ė 0 T render("Timesbd.ttf")
U+0117:ė 0 T render("Timesbd.ttf")
U+0118:Ę 0 T render("Timesbd.ttf")
U+0119:ę 0 T render("Timesbd.ttf")
U+011A:Ě 0 T render("Timesbd.ttf")
U+011B:ě 0 T render("Timesbd.ttf")
U+011C:Ĝ 0 T render("Timesbd.ttf")
U+011D:ĝ 0 T render("Timesbd.ttf")
U+011E:Ğ 0 T render("Timesbd.ttf")
U+011F:ğ 0 T render("Timesbd.ttf")
U+0120:Ġ 0 T render("Timesbd.ttf")
U+0121:ġ 0 T render("Timesbd.ttf")
U+0122:Ģ 0 T render("Timesbd.ttf")
U+0123:ģ 0 T render("Timesbd.ttf")
U+0124:Ĥ 0 T render("Timesbd.ttf")
U+0125:ĥ 0 T render("Timesbd.ttf")
U+0126:Ħ 0 T render("Timesbd.ttf")
U+0127:ħ 0 T render("Timesbd.ttf")
U+0128:Ĩ 0 T render("Timesbd.ttf")
U+0129:ĩ 0 T render("Timesbd.ttf")
U+012A:Ī 0 T render("Timesbd.ttf")
U+012B:ī 0 T render("Timesbd.ttf")
U+012C:Ĭ 0 T render("Timesbd.ttf")
U+012D:ĭ 0 T render("Timesbd.ttf")
U+012E:Į 0 T render("Timesbd.ttf")
U+012F:į 0 T render("Timesbd.ttf")
U+0130:İ 0 T render("Timesbd.ttf")
U+0131:ı 0 T render("Timesbd.ttf")
U+0134:Ĵ 0 T render("Timesbd.ttf")
U+0135:ĵ 0 T render("Timesbd.ttf")
U+0136:Ķ 0 T render("Timesbd.ttf")
U+0137:ķ 0 T render("Timesbd.ttf")
U+0138:ĸ 0 T render("Timesbd.ttf")
U+0139:Ĺ 0 T render("Timesbd.ttf")
U+013A:ĺ 0 T render("Timesbd.ttf")
U+013B:Ļ 0 T render("Timesbd.ttf")
U+013C:ļ 0 T render("Timesbd.ttf")
U+013D:Ľ 0 T render("Timesbd.ttf")
U+013E:ľ 0 T render("Timesbd.ttf")
U+013F:Ŀ 0 T render("Timesbd.ttf")
U+0140:ŀ 0 T render("Timesbd.ttf")
U+0141:Ł 0 T render("Timesbd.ttf")
U+0142:ł 0 T render("Timesbd.ttf")
U+0143:Ń 0 T render("Timesbd.ttf")
U+0144:ń 0 T render("Timesbd.ttf")
U+0145:Ņ 0 T render("Timesbd.ttf")
U+0146:ņ 0 T render("Timesbd.ttf")
U+0147:Ň 0 T render("Timesbd.ttf")
U+0148:ň 0 T render("Timesbd.ttf")
U+0149:ʼn 0 T render("Timesbd.ttf")
U+014A:Ŋ 0 T render("Timesbd.ttf")
U+014B:ŋ 0 T render("Timesbd.ttf")
U+014C:Ō 0 T render("Timesbd.ttf")
U+014D:ō 0 T render("Timesbd.ttf")
U+014E:Ŏ 0 T render("Timesbd.ttf")
U+014F:ŏ 0 T render("Timesbd.ttf")
U+0150:Ő 0 T render("Timesbd.ttf")
U+0151:ő 0 T render("Timesbd.ttf")
U+0152:Œ 0 T render("Timesbd.ttf")
U+0153:œ 0 T render("Timesbd.ttf")
U+0154:Ŕ 0 T render("Timesbd.ttf")
U+0155:ŕ 0 T render("Timesbd.ttf")
U+0156:Ŗ 0 T render("Timesbd.ttf")
U+0157:ŗ 0 T render("Timesbd.ttf")
U+0158:Ř 0 T render("Timesbd.ttf")
U+0159:ř 0 T render("Timesbd.ttf")
U+015A:Ś 0 T render("Timesbd.ttf")
U+015B:ś 0 T render("Timesbd.ttf")
U+015C:Ŝ 0 T render("Timesbd.ttf")
U+015D:ŝ 0 T render("Timesbd.ttf")
U+015E:Ş 0 T render("Timesbd.ttf")
U+015F:ş 0 T render("Timesbd.ttf")
U+0160:Š 0 T render("Timesbd.ttf")
U+0161:š 0 T render("Timesbd.ttf")
U+0162:Ţ 0 T render("Timesbd.ttf")
U+0163:ţ 0 T render("Timesbd.ttf")
U+0164:Ť 0 T render("Timesbd.ttf")
U+0165:ť 0 T render("Timesbd.ttf")
U+0166:Ŧ 0 T render("Timesbd.ttf")
U+0167:ŧ 0 T render("Timesbd.ttf")
U+0168:Ũ 0 T render("Timesbd.ttf")
U+0169:ũ 0 T render("Timesbd.ttf")
U+016A:Ū 0 T render("Timesbd.ttf")
U+016B:ū 0 T render("Timesbd.ttf")
U+016C:Ŭ 0 T render("Timesbd.ttf")
U+016D:ŭ 0 T render("Timesbd.ttf")
U+016E:Ů 0 T render("Timesbd.ttf")
U+016F:ů 0 T render("Timesbd.ttf")
U+0170:Ű 0 T render("Timesbd.ttf")
U+0171:ű 0 T render("Timesbd.ttf")
U+0172:Ų 0 T render("Timesbd.ttf")
U+0173:ų 0 T render("Timesbd.ttf")
U+0174:Ŵ 0 T render("Timesbd.ttf")
U+0175:ŵ 0 T render("Timesbd.ttf")
U+0176:Ŷ 0 T render("Timesbd.ttf")
U+0177:ŷ 0 T render("Timesbd.ttf")
U+0178:Ÿ 0 T render("Timesbd.ttf")
U+0179:Ź 0 T render("Timesbd.ttf")
U+017A:ź 0 T render("Timesbd.ttf")
U+017B:Ż 0 T render("Timesbd.ttf")
U+017C:ż 0 T render("Timesbd.ttf")
U+017D:Ž 0 T render("Timesbd.ttf")
U+017E:ž 0 T render("Timesbd.ttf")
================================================
FILE: data/tr3/glyphs/mapping_latin_extended-b.txt
================================================
# --------------------------------------------------
# Unicode Block "Latin Extended-B" (U+0180 to U+024F)
# --------------------------------------------------
U+0192:ƒ 0 T render("Timesbd.ttf")
U+01CD:Ǎ 0 T render("Timesbd.ttf")
U+01CE:ǎ 0 T render("Timesbd.ttf")
U+01CF:Ǐ 0 T render("Timesbd.ttf")
U+01D0:ǐ 0 T render("Timesbd.ttf")
U+01D1:Ǒ 0 T render("Timesbd.ttf")
U+01D2:ǒ 0 T render("Timesbd.ttf")
U+01D3:Ǔ 0 T render("Timesbd.ttf")
U+01D4:ǔ 0 T render("Timesbd.ttf")
U+01E6:Ǧ 0 T render("Timesbd.ttf")
U+01E7:ǧ 0 T render("Timesbd.ttf")
U+01E8:Ǩ 0 T render("Timesbd.ttf")
U+01E9:ǩ 0 T render("Timesbd.ttf")
U+01F0:ǰ 0 T render("Timesbd.ttf")
U+01F4:Ǵ 0 T render("Timesbd.ttf")
U+01F5:ǵ 0 T render("Timesbd.ttf")
U+01F8:Ǹ 0 T render("Timesbd.ttf")
U+01F9:ǹ 0 T render("Timesbd.ttf")
U+021E:Ȟ 0 T render("Timesbd.ttf")
U+021F:ȟ 0 T render("Timesbd.ttf")
U+0226:Ȧ 0 T render("Timesbd.ttf")
U+0227:ȧ 0 T render("Timesbd.ttf")
U+022E:Ȯ 0 T render("Timesbd.ttf")
U+022F:ȯ 0 T render("Timesbd.ttf")
U+0232:Ȳ 0 T render("Timesbd.ttf")
U+0233:ȳ 0 T render("Timesbd.ttf")
U+0218:Ș 0 T render("Timesbd.ttf")
U+0219:ș 0 T render("Timesbd.ttf")
U+021A:Ț 0 T render("Timesbd.ttf")
U+021B:ț 0 T render("Timesbd.ttf")
================================================
FILE: data/tr3/glyphs/mapping_latin_extended_additional.txt
================================================
# --------------------------------------------------
# Unicode Block "Latin Extended Additional" (U+1E00 to U+1EFF)
# --------------------------------------------------
U+1E02:Ḃ 0 T render("Timesbd.ttf")
U+1E03:ḃ 0 T render("Timesbd.ttf")
U+1E0A:Ḋ 0 T render("Timesbd.ttf")
U+1E0B:ḋ 0 T render("Timesbd.ttf")
U+1E1E:Ḟ 0 T render("Timesbd.ttf")
U+1E1F:ḟ 0 T render("Timesbd.ttf")
U+1E20:Ḡ 0 T render("Timesbd.ttf")
U+1E21:ḡ 0 T render("Timesbd.ttf")
U+1E22:Ḣ 0 T render("Timesbd.ttf")
U+1E23:ḣ 0 T render("Timesbd.ttf")
U+1E26:Ḧ 0 T render("Timesbd.ttf")
U+1E27:ḧ 0 T render("Timesbd.ttf")
U+1E30:Ḱ 0 T render("Timesbd.ttf")
U+1E31:ḱ 0 T render("Timesbd.ttf")
U+1E3E:Ḿ 0 T render("Timesbd.ttf")
U+1E3F:ḿ 0 T render("Timesbd.ttf")
U+1E40:Ṁ 0 T render("Timesbd.ttf")
U+1E41:ṁ 0 T render("Timesbd.ttf")
U+1E44:Ṅ 0 T render("Timesbd.ttf")
U+1E45:ṅ 0 T render("Timesbd.ttf")
U+1E54:Ṕ 0 T render("Timesbd.ttf")
U+1E55:ṕ 0 T render("Timesbd.ttf")
U+1E56:Ṗ 0 T render("Timesbd.ttf")
U+1E57:ṗ 0 T render("Timesbd.ttf")
U+1E58:Ṙ 0 T render("Timesbd.ttf")
U+1E59:ṙ 0 T render("Timesbd.ttf")
U+1E60:Ṡ 0 T render("Timesbd.ttf")
U+1E61:ṡ 0 T render("Timesbd.ttf")
U+1E6A:Ṫ 0 T render("Timesbd.ttf")
U+1E6B:ṫ 0 T render("Timesbd.ttf")
U+1E7C:Ṽ 0 T render("Timesbd.ttf")
U+1E7D:ṽ 0 T render("Timesbd.ttf")
U+1E80:Ẁ 0 T render("Timesbd.ttf")
U+1E81:ẁ 0 T render("Timesbd.ttf")
U+1E82:Ẃ 0 T render("Timesbd.ttf")
U+1E83:ẃ 0 T render("Timesb
gitextract_glsblazi/
├── .clang-format
├── .dockerignore
├── .editorconfig
├── .github/
│ ├── CODEOWNERS
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.yml
│ │ ├── config.yml
│ │ └── feature_request.yml
│ ├── actions/
│ │ └── prepare_macos_tooling/
│ │ └── action.yml
│ ├── docker/
│ │ └── lint.Dockerfile
│ ├── pull_request_template.md
│ └── workflows/
│ ├── build_docker.yml
│ ├── build_lint_image.yml
│ ├── comment_build.yml
│ ├── job_build.yml
│ ├── job_build_macos.yml
│ ├── job_release.yml
│ ├── lint.yml
│ ├── pr_builds.yml
│ ├── prerelease.yml
│ └── release.yml
├── .gitignore
├── .gitmodules
├── .pre-commit-config.yaml
├── BUG_REPORTING.md
├── CODE_OF_CONDUCT.md
├── COPYING.md
├── README.md
├── data/
│ ├── common/
│ │ └── glyphs/
│ │ ├── mapping.txt
│ │ ├── mapping_basic_latin.txt
│ │ ├── mapping_combining_diactrics.txt
│ │ ├── mapping_controller.txt
│ │ ├── mapping_cyrillic.txt
│ │ ├── mapping_greek_and_coptic.txt
│ │ ├── mapping_icons.txt
│ │ ├── mapping_keyboard.txt
│ │ ├── mapping_latin-1_supplement.txt
│ │ ├── mapping_latin_extended-a.txt
│ │ ├── mapping_latin_extended-b.txt
│ │ ├── mapping_latin_extended_additional.txt
│ │ ├── mapping_misc.txt
│ │ └── mapping_small.txt
│ ├── scripting/
│ │ ├── assault_stats.lua
│ │ ├── camera.lua
│ │ ├── catalog.lua
│ │ ├── config.lua
│ │ ├── console.lua
│ │ ├── creatures.lua
│ │ ├── events.lua
│ │ ├── game.lua
│ │ ├── items.lua
│ │ ├── lara.lua
│ │ ├── log.lua
│ │ ├── music.lua
│ │ ├── objects.lua
│ │ ├── rooms.lua
│ │ └── sound.lua
│ ├── tomb-11.bdf
│ ├── tr1/
│ │ └── mac/
│ │ ├── Info.plist
│ │ └── icon.icns
│ ├── tr2/
│ │ └── mac/
│ │ ├── Info.plist
│ │ └── icon.icns
│ ├── tr3/
│ │ ├── glyphs/
│ │ │ ├── mapping_basic_latin.txt
│ │ │ ├── mapping_combining_diactrics.txt
│ │ │ ├── mapping_cyrillic.txt
│ │ │ ├── mapping_greek_and_coptic.txt
│ │ │ ├── mapping_latin-1_supplement.txt
│ │ │ ├── mapping_latin_extended-a.txt
│ │ │ ├── mapping_latin_extended-b.txt
│ │ │ ├── mapping_latin_extended_additional.txt
│ │ │ ├── mapping_misc.txt
│ │ │ └── mapping_small.txt
│ │ └── mac/
│ │ ├── Info.plist
│ │ └── icon.icns
│ └── trx/
│ ├── icon.rc
│ ├── ship/
│ │ ├── cfg/
│ │ │ ├── base_strings-de.json5
│ │ │ ├── base_strings-en-gb.json5
│ │ │ ├── base_strings-fr.json5
│ │ │ ├── base_strings-gd.json5
│ │ │ ├── base_strings-it.json5
│ │ │ ├── base_strings-pl.json5
│ │ │ ├── base_strings-ru.json5
│ │ │ ├── base_strings.json5
│ │ │ ├── outfits.json5
│ │ │ ├── poses.json5
│ │ │ ├── presets/
│ │ │ │ ├── tr1-pc.json5
│ │ │ │ ├── tr1-ps1.json5
│ │ │ │ ├── tr2-pc.json5
│ │ │ │ ├── tr2-ps1.json5
│ │ │ │ ├── tr3-pc.json5
│ │ │ │ └── tr3-ps1.json5
│ │ │ ├── shaders/
│ │ │ │ ├── 2d.glsl
│ │ │ │ ├── billboard.glsl
│ │ │ │ ├── common.glsl
│ │ │ │ ├── fbo.glsl
│ │ │ │ ├── lights.glsl
│ │ │ │ ├── meshes.glsl
│ │ │ │ ├── meshes_tr12.glsl
│ │ │ │ ├── meshes_tr3.glsl
│ │ │ │ └── ui.glsl
│ │ │ └── ui.json5
│ │ └── games/
│ │ ├── tr1/
│ │ │ ├── catalog_item_actions.csv
│ │ │ ├── catalog_lara_anims.csv
│ │ │ ├── catalog_lara_states.csv
│ │ │ ├── catalog_music.csv
│ │ │ ├── catalog_objects.csv
│ │ │ ├── catalog_samples.csv
│ │ │ ├── gameflow.json5
│ │ │ ├── inv_ring.json5
│ │ │ ├── scripts/
│ │ │ │ └── gym.lua
│ │ │ ├── strings-de.json5
│ │ │ ├── strings-en-gb.json5
│ │ │ ├── strings-fr.json5
│ │ │ ├── strings-gd.json5
│ │ │ ├── strings-it.json5
│ │ │ ├── strings-pl.json5
│ │ │ ├── strings-ru.json5
│ │ │ ├── strings.json5
│ │ │ └── weapons.json5
│ │ ├── tr1-demo-pc/
│ │ │ ├── gameflow.json5
│ │ │ ├── strings-de.json5
│ │ │ ├── strings-fr.json5
│ │ │ ├── strings-gd.json5
│ │ │ ├── strings-it.json5
│ │ │ ├── strings-pl.json5
│ │ │ ├── strings-ru.json5
│ │ │ └── strings.json5
│ │ ├── tr1-level/
│ │ │ ├── gameflow.json5
│ │ │ ├── strings-de.json5
│ │ │ ├── strings-fr.json5
│ │ │ ├── strings-gd.json5
│ │ │ ├── strings-it.json5
│ │ │ ├── strings-pl.json5
│ │ │ ├── strings-ru.json5
│ │ │ └── strings.json5
│ │ ├── tr1-ub/
│ │ │ ├── gameflow.json5
│ │ │ ├── strings-de.json5
│ │ │ ├── strings-fr.json5
│ │ │ ├── strings-gd.json5
│ │ │ ├── strings-it.json5
│ │ │ ├── strings-pl.json5
│ │ │ ├── strings-ru.json5
│ │ │ └── strings.json5
│ │ ├── tr2/
│ │ │ ├── catalog_item_actions.csv
│ │ │ ├── catalog_lara_anims.csv
│ │ │ ├── catalog_lara_states.csv
│ │ │ ├── catalog_music.csv
│ │ │ ├── catalog_objects.csv
│ │ │ ├── catalog_samples.csv
│ │ │ ├── gameflow.json5
│ │ │ ├── inv_ring.json5
│ │ │ ├── scripts/
│ │ │ │ ├── assault.lua
│ │ │ │ ├── cut3.lua
│ │ │ │ ├── floating.lua
│ │ │ │ ├── house.lua
│ │ │ │ ├── level1.lua
│ │ │ │ ├── level3.lua
│ │ │ │ ├── level4.lua
│ │ │ │ └── monastry.lua
│ │ │ ├── strings-de.json5
│ │ │ ├── strings-en-gb.json5
│ │ │ ├── strings-fr.json5
│ │ │ ├── strings-gd.json5
│ │ │ ├── strings-it.json5
│ │ │ ├── strings-pl.json5
│ │ │ ├── strings.json5
│ │ │ └── weapons.json5
│ │ ├── tr2-gm/
│ │ │ ├── gameflow.json5
│ │ │ ├── strings-de.json5
│ │ │ ├── strings-fr.json5
│ │ │ ├── strings-gd.json5
│ │ │ ├── strings-it.json5
│ │ │ ├── strings-pl.json5
│ │ │ └── strings.json5
│ │ ├── tr2-level/
│ │ │ ├── gameflow.json5
│ │ │ ├── strings-de.json5
│ │ │ ├── strings-fr.json5
│ │ │ ├── strings-gd.json5
│ │ │ ├── strings-it.json5
│ │ │ ├── strings-pl.json5
│ │ │ └── strings.json5
│ │ ├── tr3/
│ │ │ ├── catalog_item_actions.csv
│ │ │ ├── catalog_lara_anims.csv
│ │ │ ├── catalog_lara_states.csv
│ │ │ ├── catalog_music.csv
│ │ │ ├── catalog_objects.csv
│ │ │ ├── catalog_samples.csv
│ │ │ ├── gameflow.json5
│ │ │ ├── inv_ring.json5
│ │ │ ├── scripts/
│ │ │ │ ├── area51.lua
│ │ │ │ ├── compound.lua
│ │ │ │ ├── crash.lua
│ │ │ │ ├── cut8.lua
│ │ │ │ ├── jungle.lua
│ │ │ │ ├── mines.lua
│ │ │ │ ├── tower.lua
│ │ │ │ └── zoo.lua
│ │ │ ├── strings-de.json5
│ │ │ ├── strings-it.json5
│ │ │ ├── strings-pl.json5
│ │ │ ├── strings.json5
│ │ │ └── weapons.json5
│ │ ├── tr3-la/
│ │ │ ├── gameflow.json5
│ │ │ ├── strings-de.json5
│ │ │ ├── strings-it.json5
│ │ │ ├── strings-pl.json5
│ │ │ └── strings.json5
│ │ └── tr3-level/
│ │ ├── gameflow.json5
│ │ ├── strings-it.json5
│ │ ├── strings-pl.json5
│ │ └── strings.json5
│ └── version.rc
├── docs/
│ ├── BUILDING.md
│ ├── BUILDING_ON_LINUX.md
│ ├── BUILDING_ON_MACOS.md
│ ├── BUILDING_ON_WINDOWS.md
│ ├── CHANGELOG.md
│ ├── CHANGE_SUBMISSION.md
│ ├── CODING_GUIDELINES.md
│ ├── CONTRIBUTING.md
│ ├── GLOSSARY.md
│ ├── RELEASING.md
│ ├── SECRETS.md
│ ├── gameflow.schema.json
│ ├── tr1/
│ │ ├── CHANGELOG.md
│ │ └── INSTALLING.md
│ ├── tr2/
│ │ ├── CHANGELOG.md
│ │ ├── INSTALLING.md
│ │ └── symbols.txt
│ ├── tr3/
│ │ └── INSTALLING.md
│ └── trx/
│ ├── CATALOGS.md
│ ├── COMMANDS.md
│ ├── COMMAND_LINE.md
│ ├── ENEMY_DEFAULTS.md
│ ├── GAME_STRINGS.md
│ ├── INJECTIONS.md
│ ├── INSTALLING.md
│ ├── LEVELS.md
│ ├── MIGRATING.md
│ ├── MUSIC.md
│ ├── OUTFITS.md
│ ├── SAMPLES.md
│ ├── SUPPORT.md
│ ├── WATER_COLORS.md
│ ├── WEAPONS.md
│ ├── game_flow/
│ │ ├── COMMANDS.md
│ │ ├── GLOBAL_PROPERTIES.md
│ │ ├── README.md
│ │ ├── SEQUENCES.md
│ │ ├── USER_CONFIGURATION.md
│ │ └── levels/
│ │ ├── BONUS_LEVELS.md
│ │ ├── CUTSCENE_PROPERTIES.md
│ │ ├── DEMO_PROPERTIES.md
│ │ ├── FMV_PROPERTIES.md
│ │ ├── ITEM_DROPS.md
│ │ ├── README.md
│ │ └── REGULAR_LEVELS.md
│ ├── lua/
│ │ ├── GETTING_STARTED.md
│ │ ├── README.md
│ │ ├── examples/
│ │ │ └── README.md
│ │ └── reference/
│ │ ├── ASSAULT_STATS.md
│ │ ├── CAMERA.md
│ │ ├── CATALOG.md
│ │ ├── CONFIG.md
│ │ ├── CONSOLE.md
│ │ ├── CREATURE.md
│ │ ├── EVENTS.md
│ │ ├── GAME.md
│ │ ├── ITEMS.md
│ │ ├── LARA.md
│ │ ├── LOGGING.md
│ │ ├── MISC.md
│ │ ├── MUSIC.md
│ │ ├── OBJECTS.md
│ │ ├── README.md
│ │ ├── ROOMS.md
│ │ └── SOUND.md
│ └── water_colors.yml
├── justfile
├── justfile.tr1
├── justfile.tr2
├── justfile.tr3
├── src/
│ ├── meson.build
│ ├── meson.options
│ ├── subprojects/
│ │ ├── dwarfstack.wrap
│ │ └── packagefiles/
│ │ └── dwarfstack/
│ │ └── meson.build
│ └── trx/
│ ├── av/
│ │ ├── audio.c
│ │ ├── audio.h
│ │ ├── audio_internal.h
│ │ ├── audio_reverb.c
│ │ ├── audio_sample.c
│ │ ├── audio_stream.c
│ │ ├── image.c
│ │ ├── image.h
│ │ ├── video.c
│ │ └── video.h
│ ├── config/
│ │ ├── common.c
│ │ ├── common.h
│ │ ├── const.h
│ │ ├── dynamic_enum.c
│ │ ├── dynamic_enum.h
│ │ ├── enum.c
│ │ ├── enum.h
│ │ ├── file.c
│ │ ├── file.h
│ │ ├── map.c
│ │ ├── map.def
│ │ ├── map_tr1.def
│ │ ├── map_tr2.def
│ │ ├── map_tr3.def
│ │ ├── option.h
│ │ ├── presets.c
│ │ ├── presets.h
│ │ ├── priv.c
│ │ ├── priv.h
│ │ ├── types.h
│ │ ├── vars.c
│ │ └── vars.h
│ ├── config.h
│ ├── core/
│ │ ├── benchmark.c
│ │ ├── benchmark.h
│ │ ├── bson/
│ │ │ ├── enum.h
│ │ │ ├── parse.c
│ │ │ ├── parse.h
│ │ │ ├── types.h
│ │ │ ├── write.c
│ │ │ └── write.h
│ │ ├── bson.h
│ │ ├── colors.c
│ │ ├── colors.h
│ │ ├── enum_map.c
│ │ ├── enum_map.h
│ │ ├── event_manager.c
│ │ ├── event_manager.h
│ │ ├── filesystem.c
│ │ ├── filesystem.h
│ │ ├── hash.c
│ │ ├── hash.h
│ │ ├── json/
│ │ │ ├── base.c
│ │ │ ├── base.h
│ │ │ ├── enum.h
│ │ │ ├── parse.c
│ │ │ ├── parse.h
│ │ │ ├── types.h
│ │ │ ├── util/
│ │ │ │ ├── file.c
│ │ │ │ ├── file.h
│ │ │ │ ├── read_io.c
│ │ │ │ ├── read_io.h
│ │ │ │ ├── write_io.c
│ │ │ │ └── write_io.h
│ │ │ ├── write.c
│ │ │ └── write.h
│ │ ├── json.h
│ │ ├── log.c
│ │ ├── log.h
│ │ ├── log_linux.c
│ │ ├── log_unknown.c
│ │ ├── log_windows.c
│ │ ├── math/
│ │ │ ├── const.h
│ │ │ ├── func.c
│ │ │ ├── func.h
│ │ │ ├── geom.c
│ │ │ ├── geom.h
│ │ │ ├── trig.c
│ │ │ ├── trig.h
│ │ │ ├── types.h
│ │ │ ├── util.c
│ │ │ └── util.h
│ │ ├── math.h
│ │ ├── memory.c
│ │ ├── memory.h
│ │ ├── shell.h
│ │ ├── strings/
│ │ │ ├── case_funcs.c
│ │ │ ├── case_map.def
│ │ │ ├── common.c
│ │ │ ├── common.h
│ │ │ ├── fuzzy_match.c
│ │ │ └── fuzzy_match.h
│ │ ├── strings.h
│ │ ├── thread_pool.c
│ │ ├── thread_pool.h
│ │ ├── utils.h
│ │ ├── vector.c
│ │ ├── vector.h
│ │ ├── virtual_file.c
│ │ └── virtual_file.h
│ ├── debug.h
│ ├── game/
│ │ ├── anims/
│ │ │ ├── commands.c
│ │ │ ├── common.c
│ │ │ ├── common.h
│ │ │ ├── enum.h
│ │ │ ├── frames.c
│ │ │ └── types.h
│ │ ├── anims.h
│ │ ├── camera/
│ │ │ ├── box_camera.c
│ │ │ ├── cinematic.c
│ │ │ ├── cinematic.h
│ │ │ ├── common.c
│ │ │ ├── common.h
│ │ │ ├── const.h
│ │ │ ├── enum.h
│ │ │ ├── environment.c
│ │ │ ├── environment.h
│ │ │ ├── fixed.c
│ │ │ ├── fixed.h
│ │ │ ├── los_camera.c
│ │ │ ├── photo_mode.c
│ │ │ ├── photo_mode.h
│ │ │ ├── types.h
│ │ │ ├── vars.c
│ │ │ └── vars.h
│ │ ├── camera.h
│ │ ├── catalog/
│ │ │ ├── item_actions.def
│ │ │ ├── lara_anims.def
│ │ │ ├── lara_states.def
│ │ │ ├── manager.c
│ │ │ ├── manager.h
│ │ │ ├── music.def
│ │ │ ├── objects.def
│ │ │ └── samples.def
│ │ ├── clock/
│ │ │ ├── common.c
│ │ │ ├── common.h
│ │ │ ├── const.h
│ │ │ ├── timer.c
│ │ │ ├── timer.h
│ │ │ ├── turbo.c
│ │ │ └── turbo.h
│ │ ├── clock.h
│ │ ├── collision/
│ │ │ ├── common.c
│ │ │ ├── common.h
│ │ │ ├── los.c
│ │ │ ├── los.h
│ │ │ └── types.h
│ │ ├── collision.h
│ │ ├── console/
│ │ │ ├── cmd/
│ │ │ │ ├── clear.c
│ │ │ │ ├── config.c
│ │ │ │ ├── config.h
│ │ │ │ ├── debug.c
│ │ │ │ ├── die.c
│ │ │ │ ├── easy_config.c
│ │ │ │ ├── end_level.c
│ │ │ │ ├── exit_game.c
│ │ │ │ ├── exit_to_title.c
│ │ │ │ ├── flipmap.c
│ │ │ │ ├── flood.c
│ │ │ │ ├── fly.c
│ │ │ │ ├── give_item.c
│ │ │ │ ├── give_secret.c
│ │ │ │ ├── heal.c
│ │ │ │ ├── help.c
│ │ │ │ ├── immune.c
│ │ │ │ ├── inf_sprint.c
│ │ │ │ ├── kill.c
│ │ │ │ ├── load_game.c
│ │ │ │ ├── lua.c
│ │ │ │ ├── mod.c
│ │ │ │ ├── music.c
│ │ │ │ ├── play_cutscene.c
│ │ │ │ ├── play_demo.c
│ │ │ │ ├── play_gym.c
│ │ │ │ ├── play_level.c
│ │ │ │ ├── pos.c
│ │ │ │ ├── save_game.c
│ │ │ │ ├── screenshot.c
│ │ │ │ ├── set_health.c
│ │ │ │ ├── sfx.c
│ │ │ │ ├── spawn.c
│ │ │ │ ├── speed.c
│ │ │ │ ├── strings.c
│ │ │ │ ├── teleport.c
│ │ │ │ ├── test_text.c
│ │ │ │ ├── trigger.c
│ │ │ │ ├── weather.c
│ │ │ │ └── winston.c
│ │ │ ├── common.c
│ │ │ ├── common.h
│ │ │ ├── enum.h
│ │ │ ├── history.c
│ │ │ ├── history.h
│ │ │ ├── internal.h
│ │ │ ├── registry.c
│ │ │ ├── registry.h
│ │ │ └── types.h
│ │ ├── console.h
│ │ ├── const.h
│ │ ├── creature/
│ │ │ ├── alert.c
│ │ │ ├── alert.h
│ │ │ ├── behavior.c
│ │ │ ├── common.c
│ │ │ ├── common.h
│ │ │ ├── const.h
│ │ │ ├── enum.h
│ │ │ ├── shooting.c
│ │ │ └── types.h
│ │ ├── creature.h
│ │ ├── cutscene.c
│ │ ├── cutscene.h
│ │ ├── demo.c
│ │ ├── demo.h
│ │ ├── effects/
│ │ │ ├── const.h
│ │ │ ├── draw.c
│ │ │ ├── draw.h
│ │ │ ├── manager.c
│ │ │ ├── manager.h
│ │ │ └── types.h
│ │ ├── effects.h
│ │ ├── enum.c
│ │ ├── events.c
│ │ ├── events.h
│ │ ├── fader.c
│ │ ├── fader.h
│ │ ├── fmv.c
│ │ ├── fmv.h
│ │ ├── fx/
│ │ │ ├── common.c
│ │ │ ├── common.h
│ │ │ ├── explosion_ring.c
│ │ │ ├── explosion_ring.h
│ │ │ ├── footprint.c
│ │ │ ├── footprint.h
│ │ │ ├── gun_flash.c
│ │ │ ├── gun_flash.h
│ │ │ ├── laser.c
│ │ │ ├── laser.h
│ │ │ ├── wake.c
│ │ │ ├── wake.h
│ │ │ ├── water.c
│ │ │ ├── water.h
│ │ │ ├── water_particles.c
│ │ │ ├── water_particles.h
│ │ │ ├── weather.c
│ │ │ └── weather.h
│ │ ├── fx.h
│ │ ├── game/
│ │ │ ├── control.c
│ │ │ ├── control.h
│ │ │ ├── draw.c
│ │ │ ├── draw.h
│ │ │ ├── enum.h
│ │ │ ├── state.c
│ │ │ └── state.h
│ │ ├── game.h
│ │ ├── game_buf.c
│ │ ├── game_buf.h
│ │ ├── game_flow/
│ │ │ ├── common.c
│ │ │ ├── common.h
│ │ │ ├── enum.h
│ │ │ ├── inventory.c
│ │ │ ├── inventory.h
│ │ │ ├── reader.c
│ │ │ ├── reader.h
│ │ │ ├── sequencer.c
│ │ │ ├── sequencer.h
│ │ │ ├── sequencer_events.c
│ │ │ ├── sequencer_events.h
│ │ │ ├── sequencer_misc.c
│ │ │ ├── types.h
│ │ │ ├── util.c
│ │ │ ├── util.h
│ │ │ ├── vars.c
│ │ │ └── vars.h
│ │ ├── game_flow.h
│ │ ├── game_strings/
│ │ │ ├── entries.c
│ │ │ ├── entries.def
│ │ │ ├── entries.h
│ │ │ ├── manager.c
│ │ │ ├── manager.h
│ │ │ ├── table/
│ │ │ │ ├── common.c
│ │ │ │ ├── priv.c
│ │ │ │ ├── priv.h
│ │ │ │ └── reader.c
│ │ │ └── table.h
│ │ ├── gun/
│ │ │ ├── common.c
│ │ │ ├── common.h
│ │ │ ├── control.c
│ │ │ ├── control.h
│ │ │ ├── misc.c
│ │ │ ├── misc.h
│ │ │ ├── pistols.c
│ │ │ ├── pistols.h
│ │ │ ├── rifle.c
│ │ │ ├── rifle.h
│ │ │ ├── smashing.c
│ │ │ ├── smashing.h
│ │ │ ├── smoke.c
│ │ │ ├── smoke.h
│ │ │ ├── types.h
│ │ │ ├── vars.c
│ │ │ └── vars.h
│ │ ├── gun.h
│ │ ├── gym.c
│ │ ├── gym.h
│ │ ├── inject/
│ │ │ ├── common.c
│ │ │ ├── common.h
│ │ │ ├── data/
│ │ │ │ ├── anims.c
│ │ │ │ ├── camera.c
│ │ │ │ ├── meshes.c
│ │ │ │ ├── objects.c
│ │ │ │ ├── sound.c
│ │ │ │ └── textures.c
│ │ │ ├── editor.c
│ │ │ ├── editor.h
│ │ │ ├── editors/
│ │ │ │ ├── anims.c
│ │ │ │ ├── floor_data.c
│ │ │ │ ├── items.c
│ │ │ │ ├── meshes.c
│ │ │ │ ├── objects.c
│ │ │ │ ├── rooms.c
│ │ │ │ └── textures.c
│ │ │ ├── enum.h
│ │ │ ├── testers/
│ │ │ │ ├── items.c
│ │ │ │ └── rooms.c
│ │ │ ├── types.h
│ │ │ ├── utils.c
│ │ │ └── utils.h
│ │ ├── inject.h
│ │ ├── input/
│ │ │ ├── backends/
│ │ │ │ ├── base.h
│ │ │ │ ├── controller.c
│ │ │ │ ├── controller.def
│ │ │ │ ├── controller.h
│ │ │ │ ├── internal.c
│ │ │ │ ├── internal.h
│ │ │ │ ├── keyboard.c
│ │ │ │ ├── keyboard.def
│ │ │ │ └── keyboard.h
│ │ │ ├── combo.c
│ │ │ ├── combo.h
│ │ │ ├── common.c
│ │ │ ├── common.h
│ │ │ ├── roles.def
│ │ │ └── update.c
│ │ ├── input.h
│ │ ├── interpolation.c
│ │ ├── interpolation.h
│ │ ├── inventory.c
│ │ ├── inventory.h
│ │ ├── inventory_ring/
│ │ │ ├── control.c
│ │ │ ├── control.h
│ │ │ ├── draw.c
│ │ │ ├── draw.h
│ │ │ ├── enum.h
│ │ │ ├── priv.c
│ │ │ ├── priv.h
│ │ │ ├── types.h
│ │ │ ├── vars.c
│ │ │ └── vars.h
│ │ ├── inventory_ring.h
│ │ ├── items/
│ │ │ ├── actions/
│ │ │ │ ├── common.c
│ │ │ │ ├── effects.c
│ │ │ │ ├── footprint.c
│ │ │ │ ├── general.c
│ │ │ │ ├── gym_tr3.c
│ │ │ │ ├── ids.c
│ │ │ │ ├── ids.h
│ │ │ │ ├── items.c
│ │ │ │ └── lara.c
│ │ │ ├── actions.h
│ │ │ ├── anim.c
│ │ │ ├── anim.h
│ │ │ ├── carrier.c
│ │ │ ├── carrier.h
│ │ │ ├── col.c
│ │ │ ├── col.h
│ │ │ ├── const.h
│ │ │ ├── draw.c
│ │ │ ├── draw.h
│ │ │ ├── enum.h
│ │ │ ├── manager.c
│ │ │ ├── manager.h
│ │ │ ├── types.h
│ │ │ ├── utils.c
│ │ │ ├── utils.h
│ │ │ ├── walkable.c
│ │ │ └── walkable.h
│ │ ├── items.h
│ │ ├── lara/
│ │ │ ├── breath.c
│ │ │ ├── breath.h
│ │ │ ├── cheat.c
│ │ │ ├── cheat.h
│ │ │ ├── cheat_keys.c
│ │ │ ├── cheat_keys.h
│ │ │ ├── col/
│ │ │ │ ├── climb.c
│ │ │ │ ├── crouch.c
│ │ │ │ ├── jump.c
│ │ │ │ ├── land.c
│ │ │ │ ├── monkey.c
│ │ │ │ └── swim.c
│ │ │ ├── col.c
│ │ │ ├── col.h
│ │ │ ├── common.c
│ │ │ ├── common.h
│ │ │ ├── const.h
│ │ │ ├── control.c
│ │ │ ├── control.h
│ │ │ ├── draw.c
│ │ │ ├── draw.h
│ │ │ ├── electric.c
│ │ │ ├── electric.h
│ │ │ ├── enum.h
│ │ │ ├── flare.c
│ │ │ ├── flare.h
│ │ │ ├── hair.c
│ │ │ ├── hair.h
│ │ │ ├── look.c
│ │ │ ├── look.h
│ │ │ ├── mesh.c
│ │ │ ├── mesh.h
│ │ │ ├── misc.c
│ │ │ ├── misc.h
│ │ │ ├── pose.c
│ │ │ ├── pose.h
│ │ │ ├── skin/
│ │ │ │ ├── common.c
│ │ │ │ ├── common.h
│ │ │ │ ├── enum.h
│ │ │ │ ├── storage.c
│ │ │ │ ├── storage.h
│ │ │ │ └── types.h
│ │ │ ├── skin.h
│ │ │ ├── state/
│ │ │ │ ├── climb.c
│ │ │ │ ├── crouch.c
│ │ │ │ ├── extra.c
│ │ │ │ ├── jump.c
│ │ │ │ ├── land.c
│ │ │ │ ├── monkey.c
│ │ │ │ └── swim.c
│ │ │ ├── state.c
│ │ │ ├── state.h
│ │ │ ├── types.h
│ │ │ ├── util.h
│ │ │ ├── vehicle.c
│ │ │ └── vehicle.h
│ │ ├── lara.h
│ │ ├── level/
│ │ │ ├── cache.c
│ │ │ ├── cache.h
│ │ │ ├── common.c
│ │ │ ├── common.h
│ │ │ ├── context.c
│ │ │ ├── context.h
│ │ │ ├── finalize/
│ │ │ │ ├── animations.c
│ │ │ │ ├── gameplay_objects.c
│ │ │ │ ├── render_assets.c
│ │ │ │ └── rooms.c
│ │ │ ├── finalize.h
│ │ │ ├── format/
│ │ │ │ ├── format.h
│ │ │ │ ├── format_tr1.c
│ │ │ │ ├── format_tr2.c
│ │ │ │ ├── format_tr3.c
│ │ │ │ ├── pipeline.c
│ │ │ │ └── priv.h
│ │ │ ├── pipeline.c
│ │ │ ├── pipeline.h
│ │ │ ├── sections/
│ │ │ │ ├── anims.c
│ │ │ │ ├── append.h
│ │ │ │ ├── audio.c
│ │ │ │ ├── cinematics.c
│ │ │ │ ├── meshes.c
│ │ │ │ ├── objects.c
│ │ │ │ ├── pathing.c
│ │ │ │ ├── read.h
│ │ │ │ ├── rooms.c
│ │ │ │ └── textures.c
│ │ │ ├── settings.c
│ │ │ └── settings.h
│ │ ├── level.h
│ │ ├── los.h
│ │ ├── lua/
│ │ │ ├── assault_stats.c
│ │ │ ├── camera.c
│ │ │ ├── catalog.c
│ │ │ ├── common.c
│ │ │ ├── common.h
│ │ │ ├── config.c
│ │ │ ├── console.c
│ │ │ ├── creatures.c
│ │ │ ├── embedded_scripts.h
│ │ │ ├── events.c
│ │ │ ├── events.h
│ │ │ ├── game.c
│ │ │ ├── items.c
│ │ │ ├── lara.c
│ │ │ ├── log.c
│ │ │ ├── music.c
│ │ │ ├── objects.c
│ │ │ ├── rooms.c
│ │ │ └── sound.c
│ │ ├── lua.h
│ │ ├── matrix.c
│ │ ├── matrix.h
│ │ ├── music/
│ │ │ ├── backend_cdaudio.c
│ │ │ ├── backend_cdaudio.h
│ │ │ ├── backend_cdaudio_wad.c
│ │ │ ├── backend_cdaudio_wad.h
│ │ │ ├── backend_files.c
│ │ │ ├── backend_files.h
│ │ │ ├── common.c
│ │ │ ├── common.h
│ │ │ ├── const.h
│ │ │ ├── enum.h
│ │ │ ├── ids.c
│ │ │ ├── ids.h
│ │ │ └── types.h
│ │ ├── music.h
│ │ ├── objects/
│ │ │ ├── col.c
│ │ │ ├── col.h
│ │ │ ├── common.c
│ │ │ ├── common.h
│ │ │ ├── creatures/
│ │ │ │ ├── ape.c
│ │ │ │ ├── atlantean.c
│ │ │ │ ├── atlantean.h
│ │ │ │ ├── bacon_lara.c
│ │ │ │ ├── bacon_lara.h
│ │ │ │ ├── baldy.c
│ │ │ │ ├── bandit_1.c
│ │ │ │ ├── bandit_2.c
│ │ │ │ ├── bandit_common.h
│ │ │ │ ├── barracuda.c
│ │ │ │ ├── bartoli.c
│ │ │ │ ├── bat.c
│ │ │ │ ├── bear.c
│ │ │ │ ├── big_eel.c
│ │ │ │ ├── big_spider.c
│ │ │ │ ├── big_spider.h
│ │ │ │ ├── bird.c
│ │ │ │ ├── bird_guardian.c
│ │ │ │ ├── centaur.c
│ │ │ │ ├── centaur_statue.c
│ │ │ │ ├── civilian.c
│ │ │ │ ├── claw_mutant.c
│ │ │ │ ├── claw_mutant_internal.h
│ │ │ │ ├── claw_mutant_plasma_ball.c
│ │ │ │ ├── cobra.c
│ │ │ │ ├── compy.c
│ │ │ │ ├── cowboy.c
│ │ │ │ ├── crawler_mutant.c
│ │ │ │ ├── crocodile.c
│ │ │ │ ├── cultist_1.c
│ │ │ │ ├── cultist_2.c
│ │ │ │ ├── cultist_3.c
│ │ │ │ ├── cultist_common.h
│ │ │ │ ├── diver.c
│ │ │ │ ├── dog.c
│ │ │ │ ├── dragon.c
│ │ │ │ ├── eel.c
│ │ │ │ ├── hybrid_mutant.c
│ │ │ │ ├── jelly.c
│ │ │ │ ├── larson.c
│ │ │ │ ├── lion.c
│ │ │ │ ├── lizard.c
│ │ │ │ ├── mercenary.c
│ │ │ │ ├── monk.c
│ │ │ │ ├── monkey.c
│ │ │ │ ├── mouse.c
│ │ │ │ ├── mp_1.c
│ │ │ │ ├── mp_2.c
│ │ │ │ ├── mummy.c
│ │ │ │ ├── natla.c
│ │ │ │ ├── natla_gun.c
│ │ │ │ ├── orca.c
│ │ │ │ ├── patrol_dog.c
│ │ │ │ ├── pierre.c
│ │ │ │ ├── pod.c
│ │ │ │ ├── pod.h
│ │ │ │ ├── prisoner.c
│ │ │ │ ├── punk.c
│ │ │ │ ├── raptor.c
│ │ │ │ ├── rat.c
│ │ │ │ ├── rx_worker_1.c
│ │ │ │ ├── rx_worker_2.c
│ │ │ │ ├── rx_worker_3.c
│ │ │ │ ├── security_guard.c
│ │ │ │ ├── shark.c
│ │ │ │ ├── shiva.c
│ │ │ │ ├── skate_kid.c
│ │ │ │ ├── skidoo_driver.c
│ │ │ │ ├── skidoo_driver.h
│ │ │ │ ├── sophia.c
│ │ │ │ ├── sophia_internal.h
│ │ │ │ ├── sophia_laser_bolt.c
│ │ │ │ ├── sophia_plasma_ball.c
│ │ │ │ ├── spider.c
│ │ │ │ ├── swat.c
│ │ │ │ ├── tiger.c
│ │ │ │ ├── tony.c
│ │ │ │ ├── tony_fire_ball.c
│ │ │ │ ├── tony_internal.h
│ │ │ │ ├── torso.c
│ │ │ │ ├── trex.c
│ │ │ │ ├── trex_alpha.c
│ │ │ │ ├── tribe_axeman.c
│ │ │ │ ├── tribe_boss.c
│ │ │ │ ├── tribe_boss.h
│ │ │ │ ├── tribe_pipeman.c
│ │ │ │ ├── wasp_mutant.c
│ │ │ │ ├── willard.c
│ │ │ │ ├── willard_internal.h
│ │ │ │ ├── willard_plasma_ball.c
│ │ │ │ ├── winston.c
│ │ │ │ ├── winston_army.c
│ │ │ │ ├── wolf.c
│ │ │ │ ├── worker_1.c
│ │ │ │ ├── worker_2.c
│ │ │ │ ├── worker_3.c
│ │ │ │ ├── worker_common.h
│ │ │ │ ├── xian_common.c
│ │ │ │ ├── xian_common.h
│ │ │ │ ├── xian_knight.c
│ │ │ │ ├── xian_spearman.c
│ │ │ │ └── yeti.c
│ │ │ ├── draw.c
│ │ │ ├── draw.h
│ │ │ ├── effects/
│ │ │ │ ├── blood.c
│ │ │ │ ├── body_part.c
│ │ │ │ ├── bubble.c
│ │ │ │ ├── dart_effect.c
│ │ │ │ ├── ember.c
│ │ │ │ ├── explosion.c
│ │ │ │ ├── flame.c
│ │ │ │ ├── flame.h
│ │ │ │ ├── glow.c
│ │ │ │ ├── gun_flash.c
│ │ │ │ ├── gun_shell.c
│ │ │ │ ├── hot_liquid.c
│ │ │ │ ├── missile.c
│ │ │ │ ├── pickup_aid.c
│ │ │ │ ├── ricochet.c
│ │ │ │ ├── snow_sprite.c
│ │ │ │ ├── splash.c
│ │ │ │ ├── twinkle.c
│ │ │ │ ├── twinkle.h
│ │ │ │ └── water_sprite.c
│ │ │ ├── general/
│ │ │ │ ├── ai_node.c
│ │ │ │ ├── alarm_sound.c
│ │ │ │ ├── animating.c
│ │ │ │ ├── area_51_rocket.c
│ │ │ │ ├── assault_target.c
│ │ │ │ ├── bat_emitter.c
│ │ │ │ ├── bell.c
│ │ │ │ ├── big_bowl.c
│ │ │ │ ├── bird_tweeter.c
│ │ │ │ ├── boat.c
│ │ │ │ ├── bridge_common.c
│ │ │ │ ├── bridge_common.h
│ │ │ │ ├── bridge_flat.c
│ │ │ │ ├── bridge_tilt1.c
│ │ │ │ ├── bridge_tilt2.c
│ │ │ │ ├── cabin.c
│ │ │ │ ├── camera_target.c
│ │ │ │ ├── carcass.c
│ │ │ │ ├── clock_chimes.c
│ │ │ │ ├── cog.c
│ │ │ │ ├── combat_end.c
│ │ │ │ ├── combat_end.h
│ │ │ │ ├── copter.c
│ │ │ │ ├── cutscene_player.c
│ │ │ │ ├── detonator_box.c
│ │ │ │ ├── ding_dong.c
│ │ │ │ ├── disposable_animating.c
│ │ │ │ ├── door.c
│ │ │ │ ├── door.h
│ │ │ │ ├── drawbridge.c
│ │ │ │ ├── dummy.c
│ │ │ │ ├── earthquake.c
│ │ │ │ ├── final_cutscene.c
│ │ │ │ ├── flare_item.c
│ │ │ │ ├── flare_item.h
│ │ │ │ ├── fuse_box.c
│ │ │ │ ├── gas_emitter.c
│ │ │ │ ├── general.c
│ │ │ │ ├── general.h
│ │ │ │ ├── gong.c
│ │ │ │ ├── gong_bonger.c
│ │ │ │ ├── grenade.c
│ │ │ │ ├── harpoon_bolt.c
│ │ │ │ ├── keyhole.c
│ │ │ │ ├── keyhole.h
│ │ │ │ ├── kill_all_triggered.c
│ │ │ │ ├── lara_alarm.c
│ │ │ │ ├── lift.c
│ │ │ │ ├── lights/
│ │ │ │ │ ├── beacon_light.c
│ │ │ │ │ ├── colored_light.c
│ │ │ │ │ ├── electrical_light.c
│ │ │ │ │ ├── on_off_light.c
│ │ │ │ │ ├── pulse_light.c
│ │ │ │ │ └── strobe_light.c
│ │ │ │ ├── mini_copter.c
│ │ │ │ ├── moving_bar.c
│ │ │ │ ├── pickup.c
│ │ │ │ ├── pickup.h
│ │ │ │ ├── puzzle_hole.c
│ │ │ │ ├── rocket.c
│ │ │ │ ├── save_crystal.c
│ │ │ │ ├── scion1.c
│ │ │ │ ├── scion3.c
│ │ │ │ ├── scion4.c
│ │ │ │ ├── scion_holder.c
│ │ │ │ ├── shoal.c
│ │ │ │ ├── shoal.h
│ │ │ │ ├── smashable.c
│ │ │ │ ├── smashable.h
│ │ │ │ ├── smoke_emitter.c
│ │ │ │ ├── sphere_of_doom.c
│ │ │ │ ├── switch.c
│ │ │ │ ├── switch.h
│ │ │ │ ├── trapdoor.c
│ │ │ │ ├── trigger_gate.c
│ │ │ │ ├── waterfall.c
│ │ │ │ └── zipline.c
│ │ │ ├── ids.h
│ │ │ ├── names.c
│ │ │ ├── names.def
│ │ │ ├── names.h
│ │ │ ├── setup.c
│ │ │ ├── setup.h
│ │ │ ├── traps/
│ │ │ │ ├── blade.c
│ │ │ │ ├── bubble_emitter.c
│ │ │ │ ├── cleaner.c
│ │ │ │ ├── common.c
│ │ │ │ ├── common.h
│ │ │ │ ├── damocles_sword.c
│ │ │ │ ├── dart.c
│ │ │ │ ├── dart_emitter.c
│ │ │ │ ├── dying_monk.c
│ │ │ │ ├── electric_fence.c
│ │ │ │ ├── ember_emitter.c
│ │ │ │ ├── falling_block.c
│ │ │ │ ├── falling_ceiling.c
│ │ │ │ ├── fire_head.c
│ │ │ │ ├── flame_emitter.c
│ │ │ │ ├── gondola.c
│ │ │ │ ├── gondola.h
│ │ │ │ ├── hook.c
│ │ │ │ ├── icicle.c
│ │ │ │ ├── killer_statue.c
│ │ │ │ ├── lava_wedge.c
│ │ │ │ ├── lightning_emitter.c
│ │ │ │ ├── midas_touch.c
│ │ │ │ ├── mine.c
│ │ │ │ ├── movable_block.c
│ │ │ │ ├── movable_block.h
│ │ │ │ ├── pendulum.c
│ │ │ │ ├── power_saw.c
│ │ │ │ ├── propeller.c
│ │ │ │ ├── propeller.h
│ │ │ │ ├── raptor_emitter.c
│ │ │ │ ├── rolling_ball.c
│ │ │ │ ├── rotating_laser.c
│ │ │ │ ├── security_laser.c
│ │ │ │ ├── sentry_gun.c
│ │ │ │ ├── sliding_pillar.c
│ │ │ │ ├── spike_ceiling.c
│ │ │ │ ├── spike_wall.c
│ │ │ │ ├── spikes.c
│ │ │ │ ├── spinning_blade.c
│ │ │ │ ├── springboard.c
│ │ │ │ ├── teeth_trap.c
│ │ │ │ ├── thors_hammer.c
│ │ │ │ ├── train.c
│ │ │ │ └── wasp_emitter.c
│ │ │ ├── types.h
│ │ │ ├── vars.c
│ │ │ ├── vars.h
│ │ │ └── vehicles/
│ │ │ ├── boat.c
│ │ │ ├── common.c
│ │ │ ├── common.h
│ │ │ ├── kayak.c
│ │ │ ├── kayak.h
│ │ │ ├── mine_cart.c
│ │ │ ├── mine_cart.h
│ │ │ ├── mounted_gun.c
│ │ │ ├── mounted_gun.h
│ │ │ ├── quad_bike.c
│ │ │ ├── quad_bike.h
│ │ │ ├── rib.c
│ │ │ ├── skidoo_armed.c
│ │ │ ├── skidoo_armed.h
│ │ │ ├── skidoo_common.c
│ │ │ ├── skidoo_common.h
│ │ │ ├── skidoo_fast.c
│ │ │ ├── upv.c
│ │ │ └── upv.h
│ │ ├── objects.h
│ │ ├── option/
│ │ │ ├── common.c
│ │ │ ├── common.h
│ │ │ ├── controls.c
│ │ │ ├── controls.h
│ │ │ ├── examine.c
│ │ │ ├── examine.h
│ │ │ ├── gameplay.c
│ │ │ ├── gameplay.h
│ │ │ ├── globe_select.c
│ │ │ ├── globe_select.h
│ │ │ ├── graphics.c
│ │ │ ├── graphics.h
│ │ │ ├── passport.c
│ │ │ ├── passport.h
│ │ │ ├── sound.c
│ │ │ ├── sound.h
│ │ │ ├── stats.c
│ │ │ └── stats.h
│ │ ├── option.h
│ │ ├── output/
│ │ │ ├── bind.c
│ │ │ ├── bind.h
│ │ │ ├── common.c
│ │ │ ├── common.h
│ │ │ ├── const.h
│ │ │ ├── draw.c
│ │ │ ├── draw.h
│ │ │ ├── func.c
│ │ │ ├── func.h
│ │ │ ├── lights.c
│ │ │ ├── lights.h
│ │ │ ├── mesh_batcher/
│ │ │ │ ├── batcher.c
│ │ │ │ ├── batcher.h
│ │ │ │ ├── mesh.c
│ │ │ │ ├── mesh.h
│ │ │ │ ├── mesh_builder.c
│ │ │ │ └── mesh_builder.h
│ │ │ ├── overlay.h
│ │ │ ├── quad.c
│ │ │ ├── quad.h
│ │ │ ├── scene_compositor.c
│ │ │ ├── scene_compositor.h
│ │ │ ├── scene_source.h
│ │ │ ├── shaders/
│ │ │ │ ├── generic.c
│ │ │ │ ├── generic.h
│ │ │ │ ├── mesh.c
│ │ │ │ ├── mesh.h
│ │ │ │ ├── ui.c
│ │ │ │ └── ui.h
│ │ │ ├── sources/
│ │ │ │ ├── lightnings.c
│ │ │ │ ├── lightnings.h
│ │ │ │ ├── misc.c
│ │ │ │ ├── misc.h
│ │ │ │ ├── objects.c
│ │ │ │ ├── objects.h
│ │ │ │ ├── overlay.c
│ │ │ │ ├── overlay.h
│ │ │ │ ├── poly_fx.c
│ │ │ │ ├── poly_fx.h
│ │ │ │ ├── rooms.c
│ │ │ │ ├── rooms.h
│ │ │ │ ├── rooms_debug.c
│ │ │ │ ├── rooms_debug.h
│ │ │ │ ├── shadows.c
│ │ │ │ ├── shadows.h
│ │ │ │ ├── sprites.c
│ │ │ │ ├── sprites.h
│ │ │ │ ├── ui.c
│ │ │ │ └── ui.h
│ │ │ ├── state.c
│ │ │ ├── state.h
│ │ │ ├── textures.c
│ │ │ ├── textures.h
│ │ │ ├── types.h
│ │ │ ├── uniforms.c
│ │ │ ├── uniforms.h
│ │ │ ├── utils.c
│ │ │ ├── utils.h
│ │ │ ├── vars.c
│ │ │ ├── vars.h
│ │ │ ├── vertex_range.c
│ │ │ └── vertex_range.h
│ │ ├── output.h
│ │ ├── overlay.c
│ │ ├── overlay.h
│ │ ├── pathing/
│ │ │ ├── box.c
│ │ │ ├── box.h
│ │ │ ├── const.h
│ │ │ ├── lot.c
│ │ │ ├── lot.h
│ │ │ └── types.h
│ │ ├── pathing.h
│ │ ├── phase/
│ │ │ ├── control.h
│ │ │ ├── executor.c
│ │ │ ├── executor.h
│ │ │ ├── phase_cutscene.c
│ │ │ ├── phase_cutscene.h
│ │ │ ├── phase_demo.c
│ │ │ ├── phase_demo.h
│ │ │ ├── phase_game.c
│ │ │ ├── phase_game.h
│ │ │ ├── phase_globe_select.c
│ │ │ ├── phase_globe_select.h
│ │ │ ├── phase_inventory.c
│ │ │ ├── phase_inventory.h
│ │ │ ├── phase_pause.c
│ │ │ ├── phase_pause.h
│ │ │ ├── phase_photo_mode.c
│ │ │ ├── phase_photo_mode.h
│ │ │ ├── phase_picture.c
│ │ │ ├── phase_picture.h
│ │ │ ├── phase_stats.c
│ │ │ ├── phase_stats.h
│ │ │ └── types.h
│ │ ├── phase.h
│ │ ├── photo_mode.c
│ │ ├── photo_mode.h
│ │ ├── random.c
│ │ ├── random.h
│ │ ├── replay/
│ │ │ ├── test_recorder.c
│ │ │ ├── test_recorder.h
│ │ │ ├── test_replay.c
│ │ │ └── test_replay.h
│ │ ├── rooms/
│ │ │ ├── common.c
│ │ │ ├── common.h
│ │ │ ├── const.h
│ │ │ ├── draw.c
│ │ │ ├── draw.h
│ │ │ ├── enum.h
│ │ │ ├── floor_data.c
│ │ │ ├── floor_data.h
│ │ │ ├── geometry.c
│ │ │ ├── geometry.h
│ │ │ ├── types.h
│ │ │ └── utils.h
│ │ ├── rooms.h
│ │ ├── savegame/
│ │ │ ├── common.c
│ │ │ ├── common.h
│ │ │ ├── enum.h
│ │ │ ├── file.c
│ │ │ ├── file.h
│ │ │ ├── file_read.c
│ │ │ ├── file_write.c
│ │ │ └── types.h
│ │ ├── savegame.h
│ │ ├── screenshot.c
│ │ ├── screenshot.h
│ │ ├── shell/
│ │ │ ├── args.c
│ │ │ ├── args.h
│ │ │ ├── common.c
│ │ │ ├── common.h
│ │ │ ├── config.c
│ │ │ ├── config.h
│ │ │ ├── const.h
│ │ │ ├── events.c
│ │ │ ├── events.h
│ │ │ ├── flow.c
│ │ │ ├── flow.h
│ │ │ ├── input.c
│ │ │ ├── input.h
│ │ │ ├── main.c
│ │ │ ├── mod.c
│ │ │ ├── mod.h
│ │ │ ├── paths.c
│ │ │ ├── paths.h
│ │ │ ├── platform.c
│ │ │ ├── platform.h
│ │ │ ├── session.c
│ │ │ ├── session.h
│ │ │ ├── state.c
│ │ │ └── state.h
│ │ ├── shell.h
│ │ ├── sound/
│ │ │ ├── common.c
│ │ │ ├── common.h
│ │ │ ├── enum.h
│ │ │ ├── ids.c
│ │ │ ├── ids.h
│ │ │ └── types.h
│ │ ├── sound.h
│ │ ├── sparks/
│ │ │ ├── enum.h
│ │ │ ├── manager.c
│ │ │ ├── manager.h
│ │ │ ├── spawners.c
│ │ │ ├── spawners.h
│ │ │ └── types.h
│ │ ├── sparks.h
│ │ ├── spawn.c
│ │ ├── spawn.h
│ │ ├── stats/
│ │ │ ├── common.c
│ │ │ ├── common.h
│ │ │ ├── const.h
│ │ │ ├── init.c
│ │ │ ├── init.h
│ │ │ ├── scan.c
│ │ │ ├── scan.h
│ │ │ └── types.h
│ │ ├── stats.h
│ │ ├── types.h
│ │ ├── ui/
│ │ │ ├── common.c
│ │ │ ├── common.h
│ │ │ ├── dialogs/
│ │ │ │ ├── base_passport.c
│ │ │ │ ├── base_passport.h
│ │ │ │ ├── color_editor.c
│ │ │ │ ├── color_editor.h
│ │ │ │ ├── config_presets.c
│ │ │ │ ├── config_presets.h
│ │ │ │ ├── controls.c
│ │ │ │ ├── controls.h
│ │ │ │ ├── controls_backend.c
│ │ │ │ ├── controls_backend.h
│ │ │ │ ├── controls_editor.c
│ │ │ │ ├── controls_editor.h
│ │ │ │ ├── gameplay_settings.c
│ │ │ │ ├── gameplay_settings.h
│ │ │ │ ├── graphic_settings.c
│ │ │ │ ├── graphic_settings.h
│ │ │ │ ├── new_game.c
│ │ │ │ ├── new_game.h
│ │ │ │ ├── pause.c
│ │ │ │ ├── pause.h
│ │ │ │ ├── photo_mode.c
│ │ │ │ ├── photo_mode.h
│ │ │ │ ├── play_any_level.c
│ │ │ │ ├── play_any_level.h
│ │ │ │ ├── save_slot.c
│ │ │ │ ├── save_slot.h
│ │ │ │ ├── select_level.c
│ │ │ │ ├── select_level.h
│ │ │ │ ├── setting_helpers/
│ │ │ │ │ ├── enums.c
│ │ │ │ │ ├── enums.h
│ │ │ │ │ ├── handlers.c
│ │ │ │ │ ├── handlers.h
│ │ │ │ │ └── handlers_language.c
│ │ │ │ ├── setting_tabs/
│ │ │ │ │ ├── gameplay_controls.def
│ │ │ │ │ ├── gameplay_fixes.def
│ │ │ │ │ ├── gameplay_general.def
│ │ │ │ │ ├── gameplay_mods.def
│ │ │ │ │ ├── graphic_rendering.def
│ │ │ │ │ ├── graphic_ui.def
│ │ │ │ │ ├── graphic_ui_bars.def
│ │ │ │ │ ├── graphic_ui_stats.def
│ │ │ │ │ ├── graphic_visuals.def
│ │ │ │ │ ├── sound_misc.def
│ │ │ │ │ └── sound_volume.def
│ │ │ │ ├── settings.c
│ │ │ │ ├── settings.h
│ │ │ │ ├── settings_editor.c
│ │ │ │ ├── settings_editor.h
│ │ │ │ ├── settings_tabs.c
│ │ │ │ ├── settings_tabs.h
│ │ │ │ ├── sound_settings.c
│ │ │ │ ├── sound_settings.h
│ │ │ │ ├── stats.c
│ │ │ │ ├── stats.h
│ │ │ │ ├── switch_mod.c
│ │ │ │ ├── switch_mod.h
│ │ │ │ ├── text.c
│ │ │ │ └── text.h
│ │ │ ├── dialogs.h
│ │ │ ├── draw.c
│ │ │ ├── draw.h
│ │ │ ├── elements/
│ │ │ │ ├── ammo_label.c
│ │ │ │ ├── ammo_label.h
│ │ │ │ ├── anchor.c
│ │ │ │ ├── anchor.h
│ │ │ │ ├── bar.c
│ │ │ │ ├── bar.h
│ │ │ │ ├── bar_enemy_hp.c
│ │ │ │ ├── bar_enemy_hp.h
│ │ │ │ ├── bar_lara_air.c
│ │ │ │ ├── bar_lara_air.h
│ │ │ │ ├── bar_lara_exposure.c
│ │ │ │ ├── bar_lara_exposure.h
│ │ │ │ ├── bar_lara_hp.c
│ │ │ │ ├── bar_lara_hp.h
│ │ │ │ ├── bar_lara_sprint.c
│ │ │ │ ├── bar_lara_sprint.h
│ │ │ │ ├── button_label.c
│ │ │ │ ├── button_label.h
│ │ │ │ ├── color_swatch.c
│ │ │ │ ├── color_swatch.h
│ │ │ │ ├── flash.c
│ │ │ │ ├── flash.h
│ │ │ │ ├── fps_counter.c
│ │ │ │ ├── fps_counter.h
│ │ │ │ ├── frame.c
│ │ │ │ ├── frame.h
│ │ │ │ ├── gradient_slider.c
│ │ │ │ ├── gradient_slider.h
│ │ │ │ ├── hide.c
│ │ │ │ ├── hide.h
│ │ │ │ ├── horizontal_line.c
│ │ │ │ ├── horizontal_line.h
│ │ │ │ ├── label.c
│ │ │ │ ├── label.h
│ │ │ │ ├── modal.c
│ │ │ │ ├── modal.h
│ │ │ │ ├── offset.c
│ │ │ │ ├── offset.h
│ │ │ │ ├── pad.c
│ │ │ │ ├── pad.h
│ │ │ │ ├── progress_button.c
│ │ │ │ ├── progress_button.h
│ │ │ │ ├── prompt.c
│ │ │ │ ├── prompt.h
│ │ │ │ ├── requester.c
│ │ │ │ ├── requester.h
│ │ │ │ ├── resize.c
│ │ │ │ ├── resize.h
│ │ │ │ ├── row_arrows.c
│ │ │ │ ├── row_arrows.h
│ │ │ │ ├── scrollable_stack.c
│ │ │ │ ├── scrollable_stack.h
│ │ │ │ ├── sleek_bar.c
│ │ │ │ ├── sleek_bar.h
│ │ │ │ ├── spacer.c
│ │ │ │ ├── spacer.h
│ │ │ │ ├── span.c
│ │ │ │ ├── span.h
│ │ │ │ ├── stack.c
│ │ │ │ ├── stack.h
│ │ │ │ ├── tab_switch.c
│ │ │ │ ├── tab_switch.h
│ │ │ │ ├── window.c
│ │ │ │ └── window.h
│ │ │ ├── elements.h
│ │ │ ├── events.c
│ │ │ ├── events.h
│ │ │ ├── helpers.c
│ │ │ ├── helpers.h
│ │ │ ├── hud/
│ │ │ │ ├── console.c
│ │ │ │ ├── console.h
│ │ │ │ ├── console_logs.c
│ │ │ │ ├── console_logs.h
│ │ │ │ ├── overlay.c
│ │ │ │ └── overlay.h
│ │ │ ├── hud.h
│ │ │ ├── scaler.c
│ │ │ ├── scaler.h
│ │ │ ├── scrollable.c
│ │ │ ├── scrollable.h
│ │ │ ├── settings.c
│ │ │ ├── settings.h
│ │ │ ├── text.c
│ │ │ ├── text.def
│ │ │ ├── text.h
│ │ │ └── text_autogen.def
│ │ ├── ui.h
│ │ ├── viewport.c
│ │ └── viewport.h
│ ├── gl/
│ │ ├── buffer.c
│ │ ├── buffer.h
│ │ ├── config.h
│ │ ├── context.c
│ │ ├── context.h
│ │ ├── enum.c
│ │ ├── enum.h
│ │ ├── fbo.c
│ │ ├── fbo.h
│ │ ├── program.c
│ │ ├── program.h
│ │ ├── renderer.c
│ │ ├── renderer.h
│ │ ├── sampler.c
│ │ ├── sampler.h
│ │ ├── screenshot.c
│ │ ├── screenshot.h
│ │ ├── texture.c
│ │ ├── texture.h
│ │ ├── track.c
│ │ ├── track.h
│ │ ├── utils.c
│ │ ├── utils.h
│ │ ├── vertex_array.c
│ │ └── vertex_array.h
│ ├── version.c
│ └── version.h
└── tools/
├── additional_lint
├── download_assets
├── embed_trx_lua.py
├── ffmpeg_flags.txt
├── generate_icon
├── generate_init
├── generate_rcfile
├── get_version
├── glyphs/
│ ├── README.md
│ ├── generate_case_map
│ ├── generate_compositions
│ ├── generate_defs
│ ├── generate_keyboard_map
│ ├── test_alignment.html
│ └── test_language
├── inspect_save
├── installer/
│ ├── .gitignore
│ ├── TR1X_Installer/
│ │ ├── App.xaml
│ │ ├── App.xaml.cs
│ │ ├── Installers/
│ │ │ ├── CDRomInstallSource.cs
│ │ │ ├── GOGInstallSource.cs
│ │ │ ├── SteamInstallSource.cs
│ │ │ ├── TR1XInstallSource.cs
│ │ │ └── TombATIInstallSource.cs
│ │ ├── Resources/
│ │ │ ├── Lang/
│ │ │ │ ├── en.json
│ │ │ │ └── it.json
│ │ │ └── const.json
│ │ └── TR1X_Installer.csproj
│ ├── TR2X_Installer/
│ │ ├── App.xaml
│ │ ├── App.xaml.cs
│ │ ├── Installers/
│ │ │ ├── CDRomInstallSource.cs
│ │ │ ├── GOGInstallSource.cs
│ │ │ ├── GenericInstallSource.cs
│ │ │ ├── SteamInstallSource.cs
│ │ │ └── TR2XInstallSource.cs
│ │ ├── Resources/
│ │ │ ├── Lang/
│ │ │ │ ├── en.json
│ │ │ │ └── it.json
│ │ │ └── const.json
│ │ └── TR2X_Installer.csproj
│ ├── TRX_Installer/
│ │ ├── App.xaml
│ │ ├── App.xaml.cs
│ │ ├── BoolToVisibilityConverter.cs
│ │ ├── CueFile.cs
│ │ ├── CueTrack.cs
│ │ ├── DiscImageInstallSource.cs
│ │ ├── DownloadOption.cs
│ │ ├── ExistingTRXInstallSource.cs
│ │ ├── IInstallSource.cs
│ │ ├── IInstallerProgress.cs
│ │ ├── InstallComponent.cs
│ │ ├── InstallComponentFactory.cs
│ │ ├── InstallFileHelper.cs
│ │ ├── InstallMappings.cs
│ │ ├── InstallSourceOption.cs
│ │ ├── InstallerService.cs
│ │ ├── MainWindow.xaml
│ │ ├── MainWindow.xaml.cs
│ │ ├── OptionalDownload.cs
│ │ ├── OriginalDirectoryInstallSource.cs
│ │ ├── Resources/
│ │ │ ├── Lang/
│ │ │ │ ├── en.json
│ │ │ │ └── it.json
│ │ │ └── const.json
│ │ └── TRX_Installer.csproj
│ ├── TRX_Installer.sln
│ └── TRX_InstallerLib/
│ ├── Controls/
│ │ ├── FinishStepControl.xaml
│ │ ├── FinishStepControl.xaml.cs
│ │ ├── InstallSettingsStepControl.xaml
│ │ ├── InstallSettingsStepControl.xaml.cs
│ │ ├── InstallSourceControl.xaml
│ │ ├── InstallSourceControl.xaml.cs
│ │ ├── InstallStepControl.xaml
│ │ ├── InstallStepControl.xaml.cs
│ │ ├── SourceStepControl.xaml
│ │ ├── SourceStepControl.xaml.cs
│ │ ├── TRXInstallWindow.xaml
│ │ └── TRXInstallWindow.xaml.cs
│ ├── Installers/
│ │ ├── BaseInstallSource.cs
│ │ ├── IInstallSource.cs
│ │ ├── InstallExecutor.cs
│ │ └── InstallUtils.cs
│ ├── Models/
│ │ ├── BaseLanguageViewModel.cs
│ │ ├── ExpansionPackType.cs
│ │ ├── FinishSettings.cs
│ │ ├── FinishStep.cs
│ │ ├── IStep.cs
│ │ ├── InstallSettings.cs
│ │ ├── InstallSettingsStep.cs
│ │ ├── InstallSourceViewModel.cs
│ │ ├── InstallStep.cs
│ │ ├── Language.cs
│ │ ├── Logger.cs
│ │ ├── MainWindowViewModel.cs
│ │ ├── SourceStep.cs
│ │ └── TRXConstants.cs
│ ├── Resources/
│ │ ├── Lang/
│ │ │ ├── en.json
│ │ │ └── it.json
│ │ ├── const.json
│ │ └── styles.xaml
│ ├── TRX_InstallerLib.csproj
│ └── Utils/
│ ├── AssemblyUtils.cs
│ ├── BaseNotifyPropertyChanged.cs
│ ├── BinaryReaderExtensions.cs
│ ├── BoolToVisibilityConverter.cs
│ ├── ComparisonConverter.cs
│ ├── ConditionalMarkupConverter.cs
│ ├── ConditionalViewTextConverter.cs
│ ├── CueFile.cs
│ ├── CueTrack.cs
│ ├── FileBrowser.cs
│ ├── HttpProgressClient.cs
│ ├── InstallProgress.cs
│ ├── JsonUtils.cs
│ ├── ProcessUtils.cs
│ ├── RelayCommand.cs
│ └── ShortcutUtils.cs
├── output_current_changelog
├── output_package_name
├── output_release_name
├── release
├── shared/
│ ├── __init__.py
│ ├── changelog.py
│ ├── docker/
│ │ ├── __init__.py
│ │ ├── game-linux/
│ │ │ ├── Dockerfile
│ │ │ └── entrypoint.sh
│ │ ├── game-win/
│ │ │ ├── Dockerfile
│ │ │ ├── entrypoint.sh
│ │ │ └── meson_linux_mingw32.txt
│ │ ├── game_entrypoint.py
│ │ ├── installer/
│ │ │ ├── Dockerfile
│ │ │ └── entrypoint.sh
│ │ └── lua.pc
│ ├── files.py
│ ├── git.py
│ ├── glyph_mapping.py
│ ├── icons.py
│ ├── ida_progress.py
│ ├── import_sorter.py
│ ├── json_utils.py
│ ├── linting.py
│ ├── mac/
│ │ ├── bundle_dylibs
│ │ ├── create_installer
│ │ ├── install_tree
│ │ └── x86-64_cross_file.txt
│ ├── packaging.py
│ ├── paths.py
│ ├── utils.py
│ ├── versioning.py
│ └── vfs.py
├── sort_imports
├── tr2/
│ ├── __init__.py
│ ├── generate_ida_importer
│ └── read_tombpc_script
├── tr3/
│ └── objects_tracker/
│ ├── objects_dump.json
│ ├── objects_support.json
│ ├── read_levels
│ └── render
├── update_game_strings
├── update_install_trees
└── update_water_colors
Showing preview only (661K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (7493 symbols across 922 files)
FILE: src/trx/av/audio.c
function M_MixerCallback (line 21) | static void M_MixerCallback(void *userdata, Uint8 *stream_data, int32_t ...
function Audio_Init (line 34) | bool Audio_Init(void)
function Audio_Shutdown (line 82) | bool Audio_Shutdown(void)
function Audio_ShouldSkipSDLQuitAudio (line 110) | bool Audio_ShouldSkipSDLQuitAudio(void)
function Audio_Mute (line 115) | void Audio_Mute(void)
function Audio_Unmute (line 120) | void Audio_Unmute(void)
function Audio_IsMuted (line 125) | bool Audio_IsMuted(void)
function Audio_LockDevice (line 130) | void Audio_LockDevice(void)
function Audio_UnlockDevice (line 138) | void Audio_UnlockDevice(void)
function Audio_SetReverbType (line 146) | void Audio_SetReverbType(const uint8_t reverb_type)
function Audio_GetReverbType (line 157) | uint8_t Audio_GetReverbType(void)
function Audio_GetAVChannelLayout (line 170) | int32_t Audio_GetAVChannelLayout(const int32_t channels)
function Audio_GetAVAudioFormat (line 181) | int32_t Audio_GetAVAudioFormat(const int32_t sample_fmt)
function Audio_GetSDLAudioFormat (line 194) | int32_t Audio_GetSDLAudioFormat(const enum AVSampleFormat sample_fmt)
FILE: src/trx/av/audio_internal.h
type AVSampleFormat (line 20) | enum AVSampleFormat
FILE: src/trx/av/audio_reverb.c
type M_I3DL2_PARAMETERS (line 42) | typedef struct {
type M_PARAMETERS (line 58) | typedef struct {
type M_DSP_DELAY (line 83) | typedef struct {
type M_DSP_BI_QUAD_TYPE (line 92) | typedef enum {
type M_DSP_BI_QUAD (line 97) | typedef struct {
type M_DSP_COMB_SHELVING (line 110) | typedef struct {
type M_DSP_ALL_PASS (line 117) | typedef struct {
type M_CHANNEL_POSITION_FLAGS (line 122) | typedef enum {
type M_DSP_REVERB_CHANNEL (line 129) | typedef struct {
type M_DSP_REVERB (line 138) | typedef struct {
function M_DbGainToFactor (line 179) | static inline float M_DbGainToFactor(const float gain)
function M_MsToSamples (line 184) | static inline uint32_t M_MsToSamples(
function M_Undenormalize (line 190) | static inline float M_Undenormalize(const float sample_in)
function M_DspDelay_Initialize (line 195) | static inline void M_DspDelay_Initialize(
function M_DspDelay_Change (line 208) | static inline void M_DspDelay_Change(
function M_DspDelay_Read (line 218) | static inline float M_DspDelay_Read(M_DSP_DELAY *const filter)
function M_DspDelay_Write (line 226) | static inline void M_DspDelay_Write(
function M_DspDelay_Process (line 234) | static inline float M_DspDelay_Process(
function M_DspDelay_Reset (line 242) | static inline void M_DspDelay_Reset(M_DSP_DELAY *const filter)
function M_DspDelay_Destroy (line 249) | static inline void M_DspDelay_Destroy(M_DSP_DELAY *const filter)
function M_DspComb_FeedbackFromRT60 (line 255) | static inline float M_DspComb_FeedbackFromRT60(
function M_DspBiQuad_Change (line 263) | static inline void M_DspBiQuad_Change(
function M_DspBiQuad_Initialize (line 289) | static inline void M_DspBiQuad_Initialize(
function M_DspBiQuad_Process (line 300) | static inline float M_DspBiQuad_Process(
function M_DspBiQuad_Reset (line 313) | static inline void M_DspBiQuad_Reset(M_DSP_BI_QUAD *const filter)
function M_DspBiQuad_Destroy (line 319) | static inline void M_DspBiQuad_Destroy(M_DSP_BI_QUAD *const filter)
function M_DspCombShelving_Initialize (line 324) | static inline void M_DspCombShelving_Initialize(
function M_DspCombShelving_Process (line 341) | static inline float M_DspCombShelving_Process(
function M_DspCombShelving_Reset (line 356) | static inline void M_DspCombShelving_Reset(M_DSP_COMB_SHELVING *const fi...
function M_DspCombShelving_Destroy (line 363) | static inline void M_DspCombShelving_Destroy(M_DSP_COMB_SHELVING *const ...
function M_DspAllPass_Initialize (line 370) | static inline void M_DspAllPass_Initialize(
function M_DspAllPass_Change (line 378) | static inline void M_DspAllPass_Change(
function M_DspAllPass_Process (line 385) | static inline float M_DspAllPass_Process(
function M_DspAllPass_Reset (line 395) | static inline void M_DspAllPass_Reset(M_DSP_ALL_PASS *const filter)
function M_DspAllPass_Destroy (line 400) | static inline void M_DspAllPass_Destroy(M_DSP_ALL_PASS *const filter)
function M_CHANNEL_POSITION_FLAGS (line 405) | static inline M_CHANNEL_POSITION_FLAGS M_GetChannelPositionFlags(
function M_GetStereoSpreadDelayMS (line 421) | static inline float M_GetStereoSpreadDelayMS(
function M_DspReverb_Create (line 429) | static inline void M_DspReverb_Create(
function M_DspReverb_Destroy (line 479) | static inline void M_DspReverb_Destroy(M_DSP_REVERB *const reverb)
function M_DspReverb_SetParameters (line 499) | static inline void M_DspReverb_SetParameters(
function M_DspReverb_Reset (line 598) | static inline void M_DspReverb_Reset(M_DSP_REVERB *const reverb)
function M_DspReverb_ProcessEarly (line 616) | static inline float M_DspReverb_ProcessEarly(
function M_DspReverb_ProcessChannel (line 626) | static inline float M_DspReverb_ProcessChannel(
function M_DspReverb_Process_2_to_2 (line 655) | static inline void M_DspReverb_Process_2_to_2(
function M_DspReverb_Process_1_to_1 (line 678) | static inline void M_DspReverb_Process_1_to_1(
function M_ConvertI3DL2ToNative (line 693) | static inline void M_ConvertI3DL2ToNative(
function Audio_Reverb_Init (line 749) | void Audio_Reverb_Init(const int32_t sample_rate, const int32_t channels)
function Audio_Reverb_Shutdown (line 762) | void Audio_Reverb_Shutdown(void)
function Audio_Reverb_SetType (line 772) | void Audio_Reverb_SetType(uint8_t reverb_type)
function Audio_Reverb_GetType (line 791) | uint8_t Audio_Reverb_GetType(void)
function Audio_Reverb_Process (line 796) | void Audio_Reverb_Process(float *const dst_buffer, const size_t len)
FILE: src/trx/av/audio_sample.c
type M_SWR_CONTEXT (line 27) | typedef struct {
type AUDIO_SAMPLE (line 38) | typedef struct {
type AUDIO_SAMPLE_SOUND (line 46) | typedef struct {
type AUDIO_AV_BUFFER (line 79) | typedef struct {
function M_DecibelToMultiplier (line 90) | static double M_DecibelToMultiplier(double db_gain)
function M_RecalculateChannelVolumes (line 101) | static bool M_RecalculateChannelVolumes(int32_t sound_id)
function M_ReadAVBuffer (line 117) | static int32_t M_ReadAVBuffer(void *opaque, uint8_t *dst, int32_t dst_size)
function M_SeekAVBuffer (line 132) | static int64_t M_SeekAVBuffer(void *opaque, int64_t offset, int32_t whence)
function M_OutputAudioFrame (line 165) | static int32_t M_OutputAudioFrame(
function M_DecodePacket (line 217) | static int32_t M_DecodePacket(
function M_ConvertRawData (line 250) | static bool M_ConvertRawData(
function M_ConvertSample (line 453) | static bool M_ConvertSample(const int32_t sample_id)
function M_IsOriginalDataDefined (line 478) | static bool M_IsOriginalDataDefined(const int32_t sample_id)
function Audio_Sample_Init (line 485) | void Audio_Sample_Init(void)
function Audio_Sample_Shutdown (line 500) | void Audio_Sample_Shutdown(void)
function Audio_Sample_Unload (line 506) | bool Audio_Sample_Unload(const int32_t sample_id)
function Audio_Sample_UnloadAll (line 525) | bool Audio_Sample_UnloadAll(void)
function Audio_Sample_Load (line 536) | bool Audio_Sample_Load(
function Audio_Sample_Play (line 569) | int32_t Audio_Sample_Play(
function Audio_Sample_IsPlaying (line 621) | bool Audio_Sample_IsPlaying(int32_t sound_id)
function Audio_Sample_Pause (line 631) | bool Audio_Sample_Pause(int32_t sound_id)
function Audio_Sample_PauseAll (line 646) | bool Audio_Sample_PauseAll(void)
function Audio_Sample_Unpause (line 662) | bool Audio_Sample_Unpause(int32_t sound_id)
function Audio_Sample_UnpauseAll (line 677) | bool Audio_Sample_UnpauseAll(void)
function Audio_Sample_Close (line 693) | bool Audio_Sample_Close(int32_t sound_id)
function Audio_Sample_CloseAll (line 708) | bool Audio_Sample_CloseAll(void)
function Audio_Sample_SetPan (line 724) | bool Audio_Sample_SetPan(int32_t sound_id, int32_t pan)
function Audio_Sample_SetVolume (line 739) | bool Audio_Sample_SetVolume(int32_t sound_id, int32_t volume)
function Audio_Sample_SetPitch (line 754) | bool Audio_Sample_SetPitch(int32_t sound_id, float pitch)
function Audio_Sample_Mix (line 769) | void Audio_Sample_Mix(float *dst_buffer, size_t len)
FILE: src/trx/av/audio_stream.c
type M_STREAM_SOURCE_TYPE (line 31) | typedef enum {
type M_MEM_SOURCE (line 36) | typedef struct {
type AUDIO_STREAM_SOUND (line 42) | typedef struct {
function M_MemoryRead (line 93) | static int32_t M_MemoryRead(
function M_MemorySeek (line 118) | static int64_t M_MemorySeek(
function M_ResetPlaybackState (line 151) | static void M_ResetPlaybackState(
function M_DiscardSDLStreamData (line 160) | static void M_DiscardSDLStreamData(AUDIO_STREAM_SOUND *const stream)
function M_SeekToStart (line 175) | static void M_SeekToStart(AUDIO_STREAM_SOUND *stream)
function M_DecodeFrame (line 214) | static bool M_DecodeFrame(AUDIO_STREAM_SOUND *stream)
function M_InitialiseFromFormatContext (line 263) | static bool M_InitialiseFromFormatContext(
function M_EnqueueFrame (line 375) | static bool M_EnqueueFrame(AUDIO_STREAM_SOUND *stream)
function M_InitialiseFromPath (line 482) | static bool M_InitialiseFromPath(int32_t sound_id, const char *file_path)
function M_Clear (line 504) | static void M_Clear(AUDIO_STREAM_SOUND *stream)
function Audio_Stream_Init (line 526) | void Audio_Stream_Init(void)
function Audio_Stream_Shutdown (line 534) | void Audio_Stream_Shutdown(void)
function Audio_Stream_SyncTimestamp (line 550) | bool Audio_Stream_SyncTimestamp(const int32_t sound_id, const double tim...
function Audio_Stream_Pause (line 570) | bool Audio_Stream_Pause(int32_t sound_id)
function Audio_Stream_Unpause (line 587) | bool Audio_Stream_Unpause(int32_t sound_id)
function Audio_Stream_SetPaused (line 604) | bool Audio_Stream_SetPaused(const int32_t sound_id, const bool is_paused)
function Audio_Stream_CreateFromFile (line 610) | int32_t Audio_Stream_CreateFromFile(const char *file_path)
function Audio_Stream_CreateFromMemory (line 635) | int32_t Audio_Stream_CreateFromMemory(uint8_t *const data, const size_t ...
function Audio_Stream_Close (line 704) | bool Audio_Stream_Close(int32_t sound_id)
function Audio_Stream_SetVolume (line 781) | bool Audio_Stream_SetVolume(int32_t sound_id, float volume)
function Audio_Stream_IsLooped (line 793) | bool Audio_Stream_IsLooped(int32_t sound_id)
function Audio_Stream_SetIsLooped (line 803) | bool Audio_Stream_SetIsLooped(int32_t sound_id, bool is_looped)
function Audio_Stream_SetFinishCallback (line 815) | bool Audio_Stream_SetFinishCallback(
function Audio_Stream_Mix (line 830) | void Audio_Stream_Mix(float *dst_buffer, size_t len)
function Audio_Stream_GetTimestamp (line 883) | double Audio_Stream_GetTimestamp(int32_t sound_id)
function Audio_Stream_GetDuration (line 902) | double Audio_Stream_GetDuration(int32_t sound_id)
function Audio_Stream_SeekTimestamp (line 916) | bool Audio_Stream_SeekTimestamp(const int32_t sound_id, const double tim...
function Audio_Stream_SetStartTimestamp (line 963) | bool Audio_Stream_SetStartTimestamp(int32_t sound_id, double timestamp)
function Audio_Stream_SetStopTimestamp (line 974) | bool Audio_Stream_SetStopTimestamp(int32_t sound_id, double timestamp)
FILE: src/trx/av/image.c
type IMAGE_BLIT (line 25) | typedef struct {
type IMAGE_READER_CONTEXT (line 34) | typedef struct {
function M_Free (line 43) | static void M_Free(IMAGE_READER_CONTEXT *const ctx)
function M_Init (line 62) | static bool M_Init(const char *const path, IMAGE_READER_CONTEXT *const ctx)
function IMAGE_BLIT (line 168) | static IMAGE_BLIT M_GetBlit(
function IMAGE (line 248) | static IMAGE *M_ConstructImage(
function IMAGE (line 293) | IMAGE *Image_Create(const int width, const int height)
function IMAGE (line 302) | IMAGE *Image_CreateFromFile(const char *const path)
function IMAGE (line 319) | IMAGE *Image_CreateFromFileInto(
function Image_SaveToFile (line 338) | bool Image_SaveToFile(const IMAGE *const image, const char *const path)
function IMAGE (line 495) | IMAGE *Image_Scale(
function Image_Free (line 543) | void Image_Free(IMAGE *image)
FILE: src/trx/av/image.h
type IMAGE_PIXEL (line 6) | typedef struct {
type IMAGE (line 12) | typedef struct {
type IMAGE_FIT_MODE (line 18) | typedef enum {
FILE: src/trx/av/video.c
type M_PACKET_LIST (line 88) | typedef struct {
type M_PACKET_QUEUE (line 93) | typedef struct {
type M_AUDIO_PARAMS (line 104) | typedef struct {
type M_CLOCK (line 113) | typedef struct {
type M_FRAME (line 123) | typedef struct {
type M_FRAME_DATA (line 135) | typedef struct {
type M_FRAME_QUEUE (line 139) | typedef struct {
type M_CLOCK_TYPE (line 152) | typedef enum {
type M_DECODER (line 158) | typedef struct {
type M_STATE (line 173) | typedef struct {
function M_PacketQueuePutPrivate (line 281) | static int M_PacketQueuePutPrivate(M_PACKET_QUEUE *q, AVPacket *pkt)
function M_PacketQueuePut (line 303) | static int M_PacketQueuePut(M_PACKET_QUEUE *q, AVPacket *pkt)
function M_PacketQueuePutNullPacket (line 326) | static int M_PacketQueuePutNullPacket(
function M_PacketQueueInit (line 333) | static int M_PacketQueueInit(M_PACKET_QUEUE *q)
function M_PacketQueueFlush (line 358) | static void M_PacketQueueFlush(M_PACKET_QUEUE *q)
function M_PacketQueueDestroy (line 377) | static void M_PacketQueueDestroy(M_PACKET_QUEUE *q)
function M_PacketQueueAbort (line 396) | static void M_PacketQueueAbort(M_PACKET_QUEUE *q)
function M_PacketQueueStart (line 404) | static void M_PacketQueueStart(M_PACKET_QUEUE *q)
function M_PacketQueueGet (line 412) | static int M_PacketQueueGet(
function M_DecoderInit (line 448) | static int M_DecoderInit(
function M_DecoderDecodeFrame (line 465) | static int M_DecoderDecodeFrame(M_DECODER *d, AVFrame *frame)
function M_DecoderShutdown (line 561) | static void M_DecoderShutdown(M_DECODER *d)
function M_FrameQueueUnrefItem (line 567) | static void M_FrameQueueUnrefItem(M_FRAME *vp)
function M_FrameQueueInit (line 572) | static int M_FrameQueueInit(
function M_FrameQueueShutdown (line 595) | static void M_FrameQueueShutdown(M_FRAME_QUEUE *f)
function M_FrameQueueSignal (line 614) | static void M_FrameQueueSignal(M_FRAME_QUEUE *f)
function M_FRAME (line 621) | static M_FRAME *M_FrameQueuePeek(M_FRAME_QUEUE *f)
function M_FRAME (line 626) | static M_FRAME *M_FrameQueuePeekNext(M_FRAME_QUEUE *f)
function M_FRAME (line 631) | static M_FRAME *M_FrameQueuePeekLast(M_FRAME_QUEUE *f)
function M_FRAME (line 636) | static M_FRAME *M_FrameQueuePeekWritable(M_FRAME_QUEUE *f)
function M_FRAME (line 651) | static M_FRAME *M_FrameQueuePeekReadable(M_FRAME_QUEUE *f)
function M_FrameQueuePush (line 666) | static void M_FrameQueuePush(M_FRAME_QUEUE *f)
function M_FrameQueueNext (line 677) | static void M_FrameQueueNext(M_FRAME_QUEUE *f)
function M_FrameQueueNBRemaining (line 693) | static int M_FrameQueueNBRemaining(M_FRAME_QUEUE *f)
function M_DecoderAbort (line 698) | static void M_DecoderAbort(M_DECODER *d, M_FRAME_QUEUE *fq)
function M_ReallocPrimarySurface (line 707) | static void M_ReallocPrimarySurface(
function M_RecalcSurfaceTargetRect (line 731) | static void M_RecalcSurfaceTargetRect(
function M_UploadTexture (line 747) | static int M_UploadTexture(M_STATE *is, AVFrame *frame)
function M_VideoImageDisplay (line 797) | static void M_VideoImageDisplay(M_STATE *is)
function M_StreamComponentClose (line 805) | static void M_StreamComponentClose(M_STATE *is, int stream_index)
function M_StreamClose (line 852) | static void M_StreamClose(M_STATE *is)
function M_VideoDisplay (line 896) | static void M_VideoDisplay(M_STATE *is)
function M_GetClock (line 903) | static double M_GetClock(M_CLOCK *c)
function M_SetClockAt (line 917) | static void M_SetClockAt(M_CLOCK *c, double pts, int serial, double time)
function M_SetClock (line 925) | static void M_SetClock(M_CLOCK *c, double pts, int serial)
function M_InitClock (line 931) | static void M_InitClock(M_CLOCK *c, int *queue_serial)
function M_SyncClockToSlave (line 939) | static void M_SyncClockToSlave(M_CLOCK *const c, M_CLOCK *const slave)
function M_GetMasterSyncType (line 949) | static int M_GetMasterSyncType(M_STATE *is)
function M_GetMasterClock (line 968) | static double M_GetMasterClock(M_STATE *is)
function M_ComputeTargetDelay (line 982) | static double M_ComputeTargetDelay(double delay, M_STATE *is)
function M_VPDuration (line 1006) | static double M_VPDuration(M_STATE *is, M_FRAME *vp, M_FRAME *nextvp)
function M_UpdateVideoPTS (line 1021) | static void M_UpdateVideoPTS(M_STATE *is, double pts, int64_t pos, int s...
function M_VideoRefresh (line 1027) | static void M_VideoRefresh(void *opaque, double *remaining_time)
function M_QueuePicture (line 1098) | static int M_QueuePicture(
function M_GetVideoFrame (line 1124) | static int M_GetVideoFrame(M_STATE *is, AVFrame *frame)
function M_AudioThread (line 1159) | static int M_AudioThread(void *arg)
function M_DecoderStart (line 1215) | static int M_DecoderStart(
function M_VideoThread (line 1227) | static int M_VideoThread(void *arg)
function M_SynchronizeAudio (line 1274) | static int M_SynchronizeAudio(M_STATE *is, int nb_samples)
function M_AudioDecodeFrame (line 1314) | static int M_AudioDecodeFrame(M_STATE *is)
function M_SDLAudioCallback (line 1441) | static void M_SDLAudioCallback(void *opaque, Uint8 *stream, int len)
function M_AudioOpen (line 1491) | static int M_AudioOpen(
function M_StreamComponentOpen (line 1585) | static int M_StreamComponentOpen(M_STATE *is, int stream_index)
function M_DecodeInterruptCB (line 1709) | static int M_DecodeInterruptCB(void *ctx)
function M_StreamHasEnoughPackets (line 1715) | static int M_StreamHasEnoughPackets(
function M_ReadThread (line 1725) | static int M_ReadThread(void *arg)
function M_STATE (line 1907) | static M_STATE *M_StreamOpen(const char *filename)
function VIDEO (line 1956) | VIDEO *Video_Open(const char *const file_path)
function Video_PumpEvents (line 1987) | void Video_PumpEvents(VIDEO *video)
function Video_SetAudioEnabled (line 2002) | void Video_SetAudioEnabled(VIDEO *const video, const bool enabled)
function Video_SetVolume (line 2008) | void Video_SetVolume(VIDEO *const video, const double volume)
function Video_Start (line 2014) | void Video_Start(VIDEO *const video)
function Video_Stop (line 2024) | void Video_Stop(VIDEO *const video)
function Video_Close (line 2030) | void Video_Close(VIDEO *const video)
function Video_SetSurfaceSize (line 2043) | void Video_SetSurfaceSize(
function Video_SetSurfacePixelFormat (line 2056) | void Video_SetSurfacePixelFormat(VIDEO *video, enum AVPixelFormat pixel_...
function Video_SetSurfaceStride (line 2067) | void Video_SetSurfaceStride(VIDEO *video, const int32_t stride)
function Video_SetSurfaceAllocatorFunc (line 2078) | void Video_SetSurfaceAllocatorFunc(
function Video_SetSurfaceDeallocatorFunc (line 2087) | void Video_SetSurfaceDeallocatorFunc(
function Video_SetSurfaceClearFunc (line 2096) | void Video_SetSurfaceClearFunc(
function Video_SetSurfaceLockFunc (line 2105) | void Video_SetSurfaceLockFunc(
function Video_SetSurfaceUnlockFunc (line 2114) | void Video_SetSurfaceUnlockFunc(
function Video_SetSurfaceUploadFunc (line 2123) | void Video_SetSurfaceUploadFunc(
function Video_SetRenderBeginFunc (line 2132) | void Video_SetRenderBeginFunc(
function Video_SetRenderEndFunc (line 2141) | void Video_SetRenderEndFunc(
function Video_SetExternalAudioClock (line 2150) | void Video_SetExternalAudioClock(VIDEO *const video, const double timest...
function Video_SetPaused (line 2156) | void Video_SetPaused(VIDEO *const video, const bool paused)
FILE: src/trx/av/video.h
type VIDEO (line 6) | typedef struct {
type AVPixelFormat (line 19) | enum AVPixelFormat
FILE: src/trx/config/common.c
function M_FreeStringOptionValues (line 24) | static void M_FreeStringOptionValues(void)
function M_Init (line 35) | __attribute__((constructor)) static void M_Init(void)
function M_Shutdown (line 40) | __attribute__((destructor)) static void M_Shutdown(void)
function Config_ApplyDefaultSettings (line 59) | void Config_ApplyDefaultSettings(void)
function Config_Read (line 68) | bool Config_Read(
function Config_Update (line 110) | bool Config_Update(void)
function Config_Write (line 130) | bool Config_Write(void)
function Config_SubscribeChanges (line 141) | int32_t Config_SubscribeChanges(
function Config_UnsubscribeChanges (line 149) | void Config_UnsubscribeChanges(const int32_t listener_id)
function CONFIG_OPTION (line 155) | const CONFIG_OPTION *Config_GetOption(const void *const target)
function Config_IsOptionEnforced (line 170) | bool Config_IsOptionEnforced(const void *const target)
function Config_IsOptionHidden (line 176) | bool Config_IsOptionHidden(const void *const target)
function Config_IsOptionAtDefault (line 182) | bool Config_IsOptionAtDefault(const void *const target)
function Config_RestoreOptionDefault (line 222) | bool Config_RestoreOptionDefault(const void *const target)
function M_ParseBool (line 264) | static bool M_ParseBool(const char *const value, bool *const result)
function M_ParseInt32 (line 277) | static bool M_ParseInt32(const char *const value, int32_t *const result)
function M_ParseFloat (line 282) | static bool M_ParseFloat(const char *const value, float *const result)
function M_ParseDouble (line 287) | static bool M_ParseDouble(const char *const value, double *const result)
function M_ParseEnum (line 292) | static bool M_ParseEnum(
function M_ParseRGB888 (line 307) | static bool M_ParseRGB888(const char *const value, RGB_888 *const result)
function Config_SetOptionValueFromString (line 490) | bool Config_SetOptionValueFromString(
FILE: src/trx/config/dynamic_enum.c
type M_DYNAMIC_ENUM_VALUE (line 11) | typedef struct {
type M_DYNAMIC_ENUM_REGISTRY_ENTRY (line 16) | typedef struct M_DYNAMIC_ENUM_REGISTRY_ENTRY {
function M_IsDynamicEnum (line 24) | static bool M_IsDynamicEnum(const CONFIG_OPTION *const option)
function M_IsSameValue (line 29) | static bool M_IsSameValue(const char *const left, const char *const right)
function M_DYNAMIC_ENUM_REGISTRY_ENTRY (line 40) | static M_DYNAMIC_ENUM_REGISTRY_ENTRY *M_GetRegistryEntry(
function M_FreeValues (line 66) | static void M_FreeValues(VECTOR **const values_ptr)
function M_FindValueIndex (line 82) | static int32_t M_FindValueIndex(
function M_DYNAMIC_ENUM_VALUE (line 102) | static const M_DYNAMIC_ENUM_VALUE *M_GetValueEntry(
function M_Shutdown (line 134) | static void M_Shutdown(void)
function M_AtShutdown (line 146) | __attribute__((destructor)) static void M_AtShutdown(void)
function Config_DynamicEnum_ResetValues (line 151) | void Config_DynamicEnum_ResetValues(const CONFIG_OPTION *const option)
function Config_DynamicEnum_AddValue (line 164) | bool Config_DynamicEnum_AddValue(
function Config_DynamicEnum_IsValidValue (line 187) | bool Config_DynamicEnum_IsValidValue(
function Config_DynamicEnum_GetValueCount (line 193) | int32_t Config_DynamicEnum_GetValueCount(const CONFIG_OPTION *const option)
function Config_DynamicEnum_CanCycle (line 232) | bool Config_DynamicEnum_CanCycle(
FILE: src/trx/config/enum.c
function M_Init (line 5) | static __attribute__((constructor)) void M_Init(void)
FILE: src/trx/config/enum.h
type ASPECT_MODE (line 3) | typedef enum {
type INPUT_BACKEND (line 10) | typedef enum {
type INPUT_LAYOUT (line 16) | typedef enum {
type SCREENSHOT_FORMAT (line 24) | typedef enum {
type BACKGROUND_TYPE (line 29) | typedef enum {
type UI_ELEMENT_LOCATION (line 42) | typedef enum {
type BAR_SHOW_MODE (line 52) | typedef enum {
type MUSIC_LOAD_CONDITION (line 58) | typedef enum {
type LOADING_SCREENS_MODE (line 64) | typedef enum {
type UI_STYLE (line 70) | typedef enum {
type CAMERA_MODE (line 75) | typedef enum {
type WALL_GLITCH_MODE (line 82) | typedef enum {
type JUMP_LOCK_MODE (line 88) | typedef enum {
type LOOK_MODE (line 95) | typedef enum {
type QUICK_GUNS_MODE (line 101) | typedef enum {
type LIGHTING_CONTRAST (line 106) | typedef enum {
type BILLBOARD_LOCK_MODE (line 113) | typedef enum {
type TARGET_LOCK_MODE (line 121) | typedef enum {
type STATS_STYLE (line 127) | typedef enum {
type SHADOW_TYPE (line 132) | typedef enum {
type BLOOD_EFFECTS (line 139) | typedef enum {
type ALLY_HOSTILITY_POLICY (line 146) | typedef enum {
type CREATURE_DROWN_POLICY (line 151) | typedef enum {
type PROJECTILE_AREA_DAMAGE (line 157) | typedef enum {
type SUNGLASSES_MODE (line 162) | typedef enum {
FILE: src/trx/config/file.c
function M_ReadFromJSON (line 21) | static bool M_ReadFromJSON(
function M_PreserveEnforcedState (line 94) | static void M_PreserveEnforcedState(
function ConfigFile_Read (line 127) | bool ConfigFile_Read(const CONFIG_IO_ARGS *const args)
function ConfigFile_Write (line 135) | bool ConfigFile_Write(const CONFIG_IO_ARGS *const args)
function ConfigFile_LoadOptions (line 156) | void ConfigFile_LoadOptions(JSON_OBJECT *root_obj, const CONFIG_OPTION *...
function ConfigFile_DumpOptions (line 250) | void ConfigFile_DumpOptions(JSON_OBJECT *root_obj, const CONFIG_OPTION *...
function ConfigFile_ReadEnum (line 308) | int ConfigFile_ReadEnum(
function ConfigFile_WriteEnum (line 319) | void ConfigFile_WriteEnum(
function ConfigFile_LoadGymTrackStats (line 325) | bool ConfigFile_LoadGymTrackStats(
function ConfigFile_DumpGymTrackStats (line 351) | bool ConfigFile_DumpGymTrackStats(
FILE: src/trx/config/file.h
type CONFIG_IO_ARGS (line 11) | typedef struct {
FILE: src/trx/config/map.c
function CONFIG_OPTION (line 124) | const CONFIG_OPTION *Config_GetOptionMap(void)
function CONFIG_OPTION (line 141) | const CONFIG_OPTION *Config_GetOptionByPath(const char *const path)
FILE: src/trx/config/option.h
type CONFIG_OPTION_TYPE (line 3) | typedef enum {
type CONFIG_OPTION (line 15) | typedef struct {
FILE: src/trx/config/presets.c
function M_FreePreset (line 15) | static void M_FreePreset(CONFIG_PRESET *const preset)
function M_FreeAllPresets (line 26) | static void M_FreeAllPresets(void)
function M_LoadPreset (line 57) | static bool M_LoadPreset(const char *const path)
function M_Shutdown (line 118) | static void __attribute__((destructor)) M_Shutdown(void)
function Config_Presets_ScanFiles (line 123) | void Config_Presets_ScanFiles(void)
function Config_Presets_GetCount (line 164) | int32_t Config_Presets_GetCount(void)
function CONFIG_PRESET (line 169) | const CONFIG_PRESET *Config_Presets_Get(const int32_t idx)
function Config_Presets_Apply (line 177) | void Config_Presets_Apply(const int32_t idx)
FILE: src/trx/config/presets.h
type CONFIG_PRESET (line 8) | typedef struct {
FILE: src/trx/config/priv.c
function M_LoadKeyboardLayout (line 21) | static void M_LoadKeyboardLayout(
function M_LoadControllerLayout (line 43) | static void M_LoadControllerLayout(
function M_LoadLegacyInputConfig (line 65) | static void M_LoadLegacyInputConfig(JSON_OBJECT *const root_obj)
function M_LoadInputLayout (line 74) | static void M_LoadInputLayout(
function M_LoadInputConfig (line 92) | static void M_LoadInputConfig(JSON_OBJECT *const root_obj)
function M_DumpInputLayout (line 114) | static void M_DumpInputLayout(
function M_DumpInputConfig (line 143) | static void M_DumpInputConfig(JSON_OBJECT *const root_obj)
function M_MigrateBarColorName (line 158) | static void M_MigrateBarColorName(char **const value_ptr)
type M_LEGACY_STATS_DETAILS (line 184) | typedef enum {
function M_TryGetLegacyStatsDetails (line 190) | static bool M_TryGetLegacyStatsDetails(
function M_MigrateLegacyStatsOptions (line 235) | static void M_MigrateLegacyStatsOptions(JSON_OBJECT *const parent_obj)
function M_LoadLegacyOptions (line 286) | static void M_LoadLegacyOptions(JSON_OBJECT *const parent_obj)
function Config_LoadFromJSON (line 511) | void Config_LoadFromJSON(JSON_OBJECT *root_obj)
function Config_DumpToJSON (line 527) | void Config_DumpToJSON(JSON_OBJECT *root_obj)
function Config_Sanitize (line 541) | void Config_Sanitize(void)
FILE: src/trx/config/types.h
type GYM_TRACK_ENTRY (line 8) | typedef struct {
type GYM_TRACK_STATS (line 13) | typedef struct {
type CONFIG (line 18) | typedef struct {
FILE: src/trx/core/benchmark.c
function M_Log (line 7) | static void M_Log(
function BENCHMARK (line 41) | BENCHMARK Benchmark_Start(void)
function Benchmark_Tick_Impl (line 50) | void Benchmark_Tick_Impl(
function Benchmark_End_Impl (line 59) | void Benchmark_End_Impl(
FILE: src/trx/core/benchmark.h
type BENCHMARK (line 5) | typedef struct {
FILE: src/trx/core/bson/enum.h
type BSON_PARSE_ERROR (line 3) | typedef enum {
FILE: src/trx/core/bson/parse.c
type M_STATE (line 11) | typedef struct {
function M_ReadI32 (line 27) | static int32_t M_ReadI32(const char *const src)
function M_ReadDouble (line 34) | static double M_ReadDouble(const char *const src)
function M_GetObjectKeySize (line 41) | static bool M_GetObjectKeySize(M_STATE *state)
function M_GetNullValueSize (line 53) | static bool M_GetNullValueSize(M_STATE *state)
function M_GetBoolValueSize (line 59) | static bool M_GetBoolValueSize(M_STATE *state)
function M_GetInt32ValueSize (line 81) | static bool M_GetInt32ValueSize(M_STATE *state)
function M_GetDoubleValueSize (line 96) | static bool M_GetDoubleValueSize(M_STATE *state)
function M_GetStringValueSize (line 111) | static bool M_GetStringValueSize(M_STATE *state)
function M_GetArrayElementWrappedSize (line 134) | static bool M_GetArrayElementWrappedSize(M_STATE *state)
function M_GetArraySize (line 155) | static bool M_GetArraySize(M_STATE *state)
function M_GetArrayValueSize (line 186) | static bool M_GetArrayValueSize(M_STATE *state)
function M_GetObjectElementWrappedSize (line 193) | static bool M_GetObjectElementWrappedSize(M_STATE *state)
function M_GetObjectSize (line 213) | static bool M_GetObjectSize(M_STATE *state)
function M_GetObjectValueSize (line 244) | static bool M_GetObjectValueSize(M_STATE *state)
function M_GetValueSize (line 251) | static bool M_GetValueSize(M_STATE *state, uint8_t marker)
function M_GetRootSize (line 275) | static bool M_GetRootSize(M_STATE *state)
function M_HandleObjectKey (line 282) | static void M_HandleObjectKey(M_STATE *state, JSON_STRING *string)
function M_HandleNullValue (line 297) | static void M_HandleNullValue(M_STATE *state, JSON_VALUE *value)
function M_HandleBoolValue (line 305) | static void M_HandleBoolValue(M_STATE *state, JSON_VALUE *value)
function M_HandleInt32Value (line 325) | static void M_HandleInt32Value(M_STATE *state, JSON_VALUE *value)
function M_HandleDoubleValue (line 347) | static void M_HandleDoubleValue(M_STATE *state, JSON_VALUE *value)
function M_HandleStringValue (line 378) | static void M_HandleStringValue(M_STATE *state, JSON_VALUE *value)
function M_HandleArrayElementWrapped (line 402) | static void M_HandleArrayElementWrapped(
function M_HandleArray (line 427) | static void M_HandleArray(M_STATE *state, JSON_ARRAY *array)
function M_HandleArrayValue (line 465) | static void M_HandleArrayValue(M_STATE *state, JSON_VALUE *value)
function M_HandleObjectElementWrapped (line 480) | static void M_HandleObjectElementWrapped(
function M_HandleObject (line 505) | static void M_HandleObject(M_STATE *state, JSON_OBJECT *object)
function M_HandleObjectValue (line 543) | static void M_HandleObjectValue(M_STATE *state, JSON_VALUE *value)
function M_HandleValue (line 558) | static void M_HandleValue(M_STATE *state, JSON_VALUE *value, uint8_t mar...
function JSON_VALUE (line 589) | JSON_VALUE *BSON_Parse(const char *src, size_t src_size)
function JSON_VALUE (line 594) | JSON_VALUE *BSON_ParseEx(
FILE: src/trx/core/bson/types.h
type BSON_PARSE_RESULT (line 6) | typedef struct {
FILE: src/trx/core/bson/write.c
function M_GetMarkerSize (line 18) | static bool M_GetMarkerSize(size_t *size, const char *key)
function M_GetNullWrappedSize (line 28) | static bool M_GetNullWrappedSize(size_t *size, const char *key)
function M_GetBoolWrappedSize (line 35) | static bool M_GetBoolWrappedSize(size_t *size, const char *key)
function M_GetInt32Size (line 46) | static bool M_GetInt32Size(size_t *size)
function M_GetInt32WrappedSize (line 53) | static bool M_GetInt32WrappedSize(size_t *size, const char *key)
function M_GetDoubleSize (line 66) | static bool M_GetDoubleSize(size_t *size)
function M_GetDoubleWrappedSize (line 73) | static bool M_GetDoubleWrappedSize(size_t *size, const char *key)
function M_GetNumberWrappedSize (line 86) | static bool M_GetNumberWrappedSize(
function M_GetStringSize (line 121) | static bool M_GetStringSize(size_t *size, const JSON_STRING *string)
function M_GetStringWrappedSize (line 131) | static bool M_GetStringWrappedSize(
function M_GetArraySize (line 146) | static bool M_GetArraySize(size_t *size, const JSON_ARRAY *array)
function M_GetArrayWrappedSize (line 165) | static bool M_GetArrayWrappedSize(
function M_GetObjectSize (line 180) | static bool M_GetObjectSize(size_t *size, const JSON_OBJECT *object)
function M_GetObjectWrappedSize (line 196) | static bool M_GetObjectWrappedSize(
function M_GetValueSize (line 211) | static bool M_GetValueSize(size_t *size, const JSON_VALUE *value)
function M_GetValueWrappedSize (line 226) | static bool M_GetValueWrappedSize(
FILE: src/trx/core/colors.c
function RGBA_8888 (line 11) | RGBA_8888 Color_RGB888ToRGBA8888_Impl(const RGB_888 color)
function RGBA_8888 (line 16) | RGBA_8888 Color_RGB888ToRGBA8888Ex_Impl(
function RGBA_F (line 22) | RGBA_F Color_RGBFToRGBAF_Impl(const RGB_F color)
function RGBA_F (line 27) | RGBA_F Color_RGBFToRGBAFEx_Impl(const RGB_F color, const float alpha)
function RGBA_8888 (line 32) | RGBA_8888 Color_ARGB1555ToRGBA8888(const uint16_t argb1555)
function RGB_F (line 54) | RGB_F Color_MixRGBF_Impl(
function RGBA_F (line 64) | RGBA_F Color_MixRGBAF_Impl(
function RGB_888 (line 75) | RGB_888 Color_MixRGB888_Impl(
function RGBA_8888 (line 85) | RGBA_8888 Color_MixRGBA8888_Impl(
function RGB_888 (line 96) | RGB_888 Color_HSLToRGB(const float h, const float s, const float l)
function Color_RGBToHSL (line 140) | void Color_RGBToHSL(
function M_SRGBToLinear (line 176) | static float M_SRGBToLinear(const float c)
function M_LinearToSRGB (line 184) | static float M_LinearToSRGB(const float c)
function RGB_888 (line 192) | RGB_888 Color_OKLCHToRGB(const float l, const float c, const float h)
function Color_RGBToOKLCH (line 234) | void Color_RGBToOKLCH(
FILE: src/trx/core/colors.h
type RGB_F (line 5) | typedef struct {
type RGBA_F (line 9) | typedef struct {
type RGB_888 (line 13) | typedef struct {
type RGBA_8888 (line 17) | typedef struct {
FILE: src/trx/core/enum_map.c
type M_STR_TO_ID_ENTRY (line 9) | typedef struct {
type M_ID_TO_STR_ENTRY (line 15) | typedef struct {
function M_ClearStr2IdMap (line 26) | static void M_ClearStr2IdMap(M_STR_TO_ID_ENTRY **map)
function M_ClearId2StrMap (line 37) | static void M_ClearId2StrMap(M_ID_TO_STR_ENTRY **map)
function M_Shutdown (line 49) | static __attribute__((destructor)) void M_Shutdown(void)
function M_DefineStr2Id (line 57) | static void M_DefineStr2Id(
function M_DefineId2Str (line 69) | static void M_DefineId2Str(
function M_Str2Id (line 91) | static int32_t M_Str2Id(
function EnumMap_Define (line 113) | void EnumMap_Define(
function EnumMap_Get (line 124) | int32_t EnumMap_Get(
function VECTOR (line 154) | VECTOR *EnumMap_ListValues(const char *const enum_type_name)
FILE: src/trx/core/event_manager.c
type M_LISTENER (line 9) | typedef struct {
type EVENT_MANAGER (line 17) | typedef struct EVENT_MANAGER {
function EVENT_MANAGER (line 22) | EVENT_MANAGER *EventManager_Create(void)
function EventManager_Free (line 30) | void EventManager_Free(EVENT_MANAGER *const manager)
function EventManager_Subscribe (line 39) | int32_t EventManager_Subscribe(
function EventManager_Unsubscribe (line 55) | void EventManager_Unsubscribe(
function EventManager_Fire (line 67) | void EventManager_Fire(EVENT_MANAGER *const manager, const EVENT *const ...
FILE: src/trx/core/event_manager.h
type EVENT (line 5) | typedef struct {
type EVENT_MANAGER (line 13) | typedef struct EVENT_MANAGER EVENT_MANAGER;
FILE: src/trx/core/filesystem.c
type MYFILE (line 24) | struct MYFILE {
function wchar_t (line 35) | static wchar_t *M_UTF8ToWide(const char *const utf8_str)
function FILE (line 49) | static FILE *M_UTF8Fopen(const char *path, const char *mode)
function FILE (line 63) | static FILE *M_UTF8Fopen(const char *path, const char *mode)
function M_ExistsRaw (line 72) | static bool M_ExistsRaw(const char *path)
function File_IsAbsolute (line 85) | bool File_IsAbsolute(const char *path)
function File_IsRelative (line 90) | bool File_IsRelative(const char *path)
function File_DirExists (line 95) | bool File_DirExists(const char *path)
function File_Exists (line 108) | bool File_Exists(const char *path)
function MYFILE (line 130) | MYFILE *File_Open(const char *path, FILE_OPEN_MODE mode)
function File_ReadData (line 155) | bool File_ReadData(MYFILE *const file, void *const data, const size_t size)
function File_ReadItems (line 160) | bool File_ReadItems(
function File_ReadS8 (line 166) | int8_t File_ReadS8(MYFILE *const file)
function File_ReadS16 (line 173) | int16_t File_ReadS16(MYFILE *const file)
function File_ReadS32 (line 180) | int32_t File_ReadS32(MYFILE *const file)
function File_ReadU8 (line 187) | uint8_t File_ReadU8(MYFILE *const file)
function File_ReadU16 (line 194) | uint16_t File_ReadU16(MYFILE *const file)
function File_ReadU32 (line 201) | uint32_t File_ReadU32(MYFILE *const file)
function File_WriteData (line 208) | void File_WriteData(
function File_WriteItems (line 214) | void File_WriteItems(
function File_WriteS8 (line 221) | void File_WriteS8(MYFILE *const file, const int8_t value)
function File_WriteS16 (line 226) | void File_WriteS16(MYFILE *const file, const int16_t value)
function File_WriteS32 (line 231) | void File_WriteS32(MYFILE *const file, const int32_t value)
function File_WriteU8 (line 236) | void File_WriteU8(MYFILE *const file, const uint8_t value)
function File_WriteU16 (line 241) | void File_WriteU16(MYFILE *const file, const uint16_t value)
function File_WriteU32 (line 246) | void File_WriteU32(MYFILE *const file, const uint32_t value)
function File_WriteString (line 251) | void File_WriteString(MYFILE *file, const char *fmt, ...)
function File_Skip (line 263) | void File_Skip(MYFILE *file, size_t bytes)
function File_Seek (line 268) | void File_Seek(MYFILE *file, size_t pos, FILE_SEEK_MODE mode)
function File_Pos (line 283) | size_t File_Pos(MYFILE *file)
function File_Size (line 288) | size_t File_Size(MYFILE *file)
function File_GetMeta (line 302) | bool File_GetMeta(
function File_Close (line 334) | void File_Close(MYFILE *file)
function File_Load (line 342) | bool File_Load(const char *path, char **output_data, size_t *output_size)
function File_CreateDirectory (line 373) | void File_CreateDirectory(const char *path)
function File_EnsureParentDirectories (line 385) | void File_EnsureParentDirectories(const char *path)
type dirent (line 410) | struct dirent
function File_CloseDirectory (line 417) | void File_CloseDirectory(void *const dir)
FILE: src/trx/core/filesystem.h
type FILE_SEEK_MODE (line 10) | typedef enum {
type FILE_OPEN_MODE (line 16) | typedef enum {
type MYFILE (line 22) | typedef struct MYFILE MYFILE;
FILE: src/trx/core/hash.c
function Hash_FNV1a64_Init (line 7) | uint64_t Hash_FNV1a64_Init(void)
function Hash_FNV1a64_Update (line 12) | uint64_t Hash_FNV1a64_Update(
function Hash_FNV1a64_UpdateU32 (line 23) | uint64_t Hash_FNV1a64_UpdateU32(const uint64_t hash, const uint32_t value)
function Hash_FNV1a64_UpdateU64 (line 28) | uint64_t Hash_FNV1a64_UpdateU64(const uint64_t hash, const uint64_t value)
function Hash_FNV1a64_UpdateString (line 33) | uint64_t Hash_FNV1a64_UpdateString(uint64_t hash, const char *const value)
FILE: src/trx/core/json/base.c
function JSON_NUMBER (line 10) | static JSON_NUMBER *M_NumberNewInt(const int number)
function JSON_NUMBER (line 21) | static JSON_NUMBER *M_NumberNewInt64(const int64_t number)
function JSON_NUMBER (line 32) | static JSON_NUMBER *M_NumberNewDouble(const double number)
function M_NumberFree (line 63) | static void M_NumberFree(JSON_NUMBER *const num)
function JSON_STRING (line 71) | static JSON_STRING *M_StringNew(const char *const string)
function M_StringFree (line 79) | static void M_StringFree(JSON_STRING *const str)
function JSON_VALUE (line 87) | static JSON_VALUE *M_ValueFromNumber(JSON_NUMBER *const num)
function M_ArrayElementFree (line 95) | static void M_ArrayElementFree(JSON_ARRAY_ELEMENT *const element)
function M_ObjectElementFree (line 102) | static void M_ObjectElementFree(JSON_OBJECT_ELEMENT *element)
function JSON_VALUE (line 109) | JSON_VALUE *JSON_ValueFromBool(const int b)
function JSON_VALUE (line 117) | JSON_VALUE *JSON_ValueFromInt(const int number)
function JSON_VALUE (line 122) | JSON_VALUE *JSON_ValueFromInt64(const int64_t number)
function JSON_VALUE (line 127) | JSON_VALUE *JSON_ValueFromDouble(const double number)
function JSON_VALUE (line 132) | JSON_VALUE *JSON_ValueFromString(const char *const string)
function JSON_VALUE (line 140) | JSON_VALUE *JSON_ValueFromArray(JSON_ARRAY *const arr)
function JSON_VALUE (line 148) | JSON_VALUE *JSON_ValueFromObject(JSON_OBJECT *const obj)
function JSON_ValueFree (line 156) | void JSON_ValueFree(JSON_VALUE *const value)
function JSON_ValueIsNull (line 186) | bool JSON_ValueIsNull(const JSON_VALUE *const value)
function JSON_ValueIsTrue (line 191) | bool JSON_ValueIsTrue(const JSON_VALUE *const value)
function JSON_ValueIsFalse (line 196) | bool JSON_ValueIsFalse(const JSON_VALUE *const value)
function JSON_ValueGetBool (line 201) | int JSON_ValueGetBool(const JSON_VALUE *const value, const int d)
function JSON_NUMBER (line 211) | const JSON_NUMBER *JSON_ValueGetNumber(const JSON_VALUE *const value)
function JSON_ValueGetInt (line 219) | int JSON_ValueGetInt(const JSON_VALUE *const value, const int d)
function JSON_ValueGetInt64 (line 235) | int64_t JSON_ValueGetInt64(const JSON_VALUE *const value, const int64_t d)
function JSON_ValueGetDouble (line 241) | double JSON_ValueGetDouble(const JSON_VALUE *const value, const double d)
function JSON_ARRAY (line 257) | JSON_ARRAY *JSON_ValueAsArray_Impl(const JSON_VALUE *const value)
function JSON_OBJECT (line 265) | JSON_OBJECT *JSON_ValueAsObject_Impl(const JSON_VALUE *const value)
function JSON_ARRAY (line 273) | JSON_ARRAY *JSON_ArrayNew(void)
function JSON_ArrayFree (line 281) | void JSON_ArrayFree(JSON_ARRAY *const arr)
function JSON_ArrayAppend (line 295) | void JSON_ArrayAppend(JSON_ARRAY *const arr, JSON_VALUE *const value)
function JSON_ArrayAppendBool (line 312) | void JSON_ArrayAppendBool(JSON_ARRAY *const arr, const int b)
function JSON_ArrayAppendInt (line 317) | void JSON_ArrayAppendInt(JSON_ARRAY *const arr, const int number)
function JSON_ArrayAppendDouble (line 322) | void JSON_ArrayAppendDouble(JSON_ARRAY *const arr, const double number)
function JSON_ArrayAppendString (line 327) | void JSON_ArrayAppendString(JSON_ARRAY *const arr, const char *string)
function JSON_ArrayAppendArray (line 332) | void JSON_ArrayAppendArray(JSON_ARRAY *const arr, JSON_ARRAY *const arr2)
function JSON_ArrayAppendObject (line 337) | void JSON_ArrayAppendObject(JSON_ARRAY *const arr, JSON_OBJECT *const obj)
function JSON_VALUE (line 342) | JSON_VALUE *JSON_ArrayGetValue(const JSON_ARRAY *const arr, const size_t...
function JSON_ArrayGetBool (line 354) | int JSON_ArrayGetBool(
function JSON_ArrayGetInt (line 361) | int JSON_ArrayGetInt(const JSON_ARRAY *const arr, const size_t idx, cons...
function JSON_ArrayGetDouble (line 367) | double JSON_ArrayGetDouble(
function JSON_ARRAY (line 381) | JSON_ARRAY *JSON_ArrayGetArray_Impl(
function JSON_OBJECT (line 388) | JSON_OBJECT *JSON_ArrayGetObject_Impl(
function JSON_OBJECT (line 395) | JSON_OBJECT *JSON_ObjectNew(void)
function JSON_ObjectFree (line 403) | void JSON_ObjectFree(JSON_OBJECT *const obj)
function JSON_ObjectAppend (line 418) | void JSON_ObjectAppend(
function JSON_ObjectAppendBool (line 437) | void JSON_ObjectAppendBool(
function JSON_ObjectAppendInt (line 443) | void JSON_ObjectAppendInt(
function JSON_ObjectAppendInt64 (line 449) | void JSON_ObjectAppendInt64(
function JSON_ObjectAppendDouble (line 455) | void JSON_ObjectAppendDouble(
function JSON_ObjectAppendString (line 461) | void JSON_ObjectAppendString(
function JSON_ObjectAppendArray (line 467) | void JSON_ObjectAppendArray(
function JSON_ObjectAppendObject (line 473) | void JSON_ObjectAppendObject(
function JSON_ObjectContainsKey (line 479) | bool JSON_ObjectContainsKey(JSON_OBJECT *const obj, const char *const key)
function JSON_ObjectEvictKey (line 493) | void JSON_ObjectEvictKey(JSON_OBJECT *const obj, const char *const key)
function JSON_ObjectMerge (line 518) | void JSON_ObjectMerge(JSON_OBJECT *const root, const JSON_OBJECT *const ...
function JSON_VALUE (line 528) | JSON_VALUE *JSON_ObjectGetValue(
function JSON_ObjectGetBool (line 544) | int JSON_ObjectGetBool(
function JSON_ObjectGetInt (line 551) | int JSON_ObjectGetInt(
function JSON_ObjectGetInt64 (line 558) | int64_t JSON_ObjectGetInt64(
function JSON_ObjectGetDouble (line 565) | double JSON_ObjectGetDouble(
function JSON_ARRAY (line 579) | JSON_ARRAY *JSON_ObjectGetArray_Impl(
function JSON_OBJECT (line 586) | JSON_OBJECT *JSON_ObjectGetObject_Impl(
FILE: src/trx/core/json/enum.h
type JSON_TYPE (line 3) | typedef enum {
FILE: src/trx/core/json/parse.c
type M_STATE (line 5) | typedef struct {
function M_HexDigit (line 23) | static int M_HexDigit(const char c)
function M_HexValue (line 37) | static int M_HexValue(
function M_SkipWhitespace (line 59) | static int M_SkipWhitespace(M_STATE *state)
function M_SkipCStyleComments (line 101) | static int M_SkipCStyleComments(M_STATE *state)
function M_SkipAllSkippables (line 165) | static int M_SkipAllSkippables(M_STATE *state)
function M_GetStringSize (line 213) | static int M_GetStringSize(M_STATE *state, size_t is_key)
function M_IsValidUnquotedKeyChar (line 404) | static int M_IsValidUnquotedKeyChar(const char c)
function M_GetKeySize (line 411) | static int M_GetKeySize(M_STATE *state)
function M_GetObjectSize (line 461) | static int M_GetObjectSize(M_STATE *state, int is_global_object)
function M_GetArraySize (line 600) | static int M_GetArraySize(M_STATE *state)
function M_GetNumberSize (line 674) | static int M_GetNumberSize(M_STATE *state)
function M_GetValueSize (line 890) | static int M_GetValueSize(M_STATE *state, int is_global_object)
function M_HandleString (line 999) | static void M_HandleString(M_STATE *state, JSON_STRING *string)
function M_HandleKey (line 1141) | static void M_HandleKey(M_STATE *state, JSON_STRING *string)
function M_HandleObject (line 1181) | static void M_HandleObject(
function M_HandleArray (line 1320) | static void M_HandleArray(M_STATE *state, JSON_ARRAY *array)
function M_HandleNumber (line 1410) | static void M_HandleNumber(M_STATE *state, JSON_NUMBER *number)
function M_HandleValue (line 1514) | static void M_HandleValue(
function JSON_VALUE (line 1621) | JSON_VALUE *JSON_Parse(const void *src, size_t src_size)
function JSON_VALUE (line 1627) | JSON_VALUE *JSON_ParseEx(
FILE: src/trx/core/json/parse.h
type JSON_PARSE_ERROR (line 5) | typedef enum {
type JSON_PARSE_FLAGS (line 20) | typedef enum {
FILE: src/trx/core/json/types.h
type JSON_VALUE (line 17) | typedef struct {
type JSON_STRING (line 23) | typedef struct {
type JSON_STRING_EX (line 29) | typedef struct {
type JSON_NUMBER (line 36) | typedef struct {
type JSON_OBJECT_ELEMENT (line 42) | typedef struct JSON_OBJECT_ELEMENT {
type JSON_OBJECT (line 49) | typedef struct {
type JSON_ARRAY_ELEMENT (line 55) | typedef struct JSON_ARRAY_ELEMENT {
type JSON_ARRAY (line 61) | typedef struct {
type JSON_VALUE_EX (line 67) | typedef struct {
type JSON_PARSE_RESULT (line 74) | typedef struct {
FILE: src/trx/core/json/util/file.c
function JSONFile_ExitWithReadIOError (line 15) | void JSONFile_ExitWithReadIOError(
function JSON_VALUE (line 30) | JSON_VALUE *JSONFile_Read(const char *path)
function JSON_VALUE (line 35) | JSON_VALUE *JSONFile_ReadEx(const char *path, const bool exit_on_error)
function JSONFile_Write (line 64) | bool JSONFile_Write(const char *path, JSON_VALUE *const value)
FILE: src/trx/core/json/util/file.h
type JSON_READ_IO (line 5) | typedef struct JSON_READ_IO JSON_READ_IO;
FILE: src/trx/core/json/util/read_io.c
type JSON_READ_IO (line 14) | typedef struct JSON_READ_IO {
function M_SetErrorV (line 30) | static void M_SetErrorV(
function M_SetError (line 112) | static void M_SetError(JSON_READ_IO *const io, const char *fmt, ...)
function M_SetErrorAt (line 120) | static void M_SetErrorAt(
function M_PushPathKey (line 130) | static bool M_PushPathKey(JSON_READ_IO *const io, const char *const key)
function M_PushPathIndex (line 144) | static bool M_PushPathIndex(JSON_READ_IO *const io, const size_t idx)
function M_PopPath (line 156) | static void M_PopPath(JSON_READ_IO *const io)
function M_PushValue (line 167) | static bool M_PushValue(JSON_READ_IO *const io, JSON_VALUE *const value)
function M_ReadBoolCurrent (line 183) | static bool M_ReadBoolCurrent(JSON_READ_IO *const io, bool *const target)
function M_ReadNumCurrent_Double (line 222) | static bool M_ReadNumCurrent_Double(
function M_ReadNumCurrent_Float (line 234) | static bool M_ReadNumCurrent_Float(JSON_READ_IO *const io, float *const ...
function M_ReadStringCurrent (line 246) | static bool M_ReadStringCurrent(
function JSON_ReadIO_ReadXYZ32Current (line 257) | bool JSON_ReadIO_ReadXYZ32Current(
function JSON_ReadIO_ReadXYZ16Current (line 279) | bool JSON_ReadIO_ReadXYZ16Current(
function M_ReadRGB888Current (line 296) | static bool M_ReadRGB888Current(JSON_READ_IO *const io, RGB_888 *const t...
function M_ReadRGBA8888Current (line 333) | static bool M_ReadRGBA8888Current(
function JSON_ReadIO_GetErrorLine (line 380) | int32_t JSON_ReadIO_GetErrorLine(const JSON_READ_IO *const io)
function JSON_ReadIO_GetErrorCol (line 385) | int32_t JSON_ReadIO_GetErrorCol(const JSON_READ_IO *const io)
function JSON_ReadIO_GetVersion (line 390) | uint16_t JSON_ReadIO_GetVersion(const JSON_READ_IO *const io)
function JSON_ReadIO_FormatError (line 395) | void JSON_ReadIO_FormatError(
function JSON_ReadIO_SetError (line 440) | void JSON_ReadIO_SetError(JSON_READ_IO *const io, const char *fmt, ...)
function JSON_ReadIO_SetErrorAt (line 450) | void JSON_ReadIO_SetErrorAt(
function JSON_ReadIO_PushObject (line 462) | bool JSON_ReadIO_PushObject(JSON_READ_IO *const io, const char *const key)
function JSON_ReadIO_PushArrayElem (line 481) | bool JSON_ReadIO_PushArrayElem(JSON_READ_IO *const io, const size_t index)
function JSON_ReadIO_Pop (line 500) | bool JSON_ReadIO_Pop(JSON_READ_IO *const io)
function JSON_ReadIO_GetArrayLength (line 512) | int32_t JSON_ReadIO_GetArrayLength(JSON_READ_IO *const io)
function JSON_ReadIO_HasKey (line 522) | bool JSON_ReadIO_HasKey(JSON_READ_IO *const io, const char *const key)
function JSON_OBJECT (line 531) | JSON_OBJECT *JSON_ReadIO_GetCurrentObject(JSON_READ_IO *const io)
function JSON_VALUE (line 536) | JSON_VALUE *JSON_ReadIO_GetCurrentValue(JSON_READ_IO *const io)
function JSON_READ_IO (line 541) | JSON_READ_IO *JSON_ReadIO_Create(
function JSON_ReadIO_Destroy (line 558) | void JSON_ReadIO_Destroy(JSON_READ_IO *const io)
FILE: src/trx/core/json/util/read_io.h
type JSON_READ_IO (line 11) | typedef struct JSON_READ_IO JSON_READ_IO;
type JSON_READ_IO_DUMMY (line 13) | typedef struct {
FILE: src/trx/core/json/util/write_io.c
type JSON_WRITE_IO (line 9) | typedef struct JSON_WRITE_IO {
function M_PushValue (line 15) | static void M_PushValue(JSON_WRITE_IO *const io, JSON_VALUE *const value)
function M_Pop (line 22) | static void M_Pop(JSON_WRITE_IO *const io)
function JSON_WriteIO_PushObject (line 28) | void JSON_WriteIO_PushObject(JSON_WRITE_IO *const io)
function JSON_WriteIO_PushArray (line 34) | void JSON_WriteIO_PushArray(JSON_WRITE_IO *const io)
function JSON_WriteIO_PopAndSet (line 40) | void JSON_WriteIO_PopAndSet(JSON_WRITE_IO *const io, const char *const key)
function JSON_WriteIO_DiscardCurrent (line 49) | void JSON_WriteIO_DiscardCurrent(JSON_WRITE_IO *const io)
function JSON_WriteIO_PopAndSetNZ (line 55) | void JSON_WriteIO_PopAndSetNZ(JSON_WRITE_IO *const io, const char *const...
function JSON_WriteIO_PopAndAppend (line 72) | void JSON_WriteIO_PopAndAppend(JSON_WRITE_IO *const io)
function JSON_OBJECT (line 81) | JSON_OBJECT *JSON_WriteIO_GetCurrentObject(JSON_WRITE_IO *const io)
function JSON_WriteIO_PushString (line 86) | void JSON_WriteIO_PushString(JSON_WRITE_IO *const io, const char *const ...
function JSON_WriteIO_PushBool (line 91) | void JSON_WriteIO_PushBool(JSON_WRITE_IO *const io, const bool value)
function JSON_WriteIO_PushInt (line 96) | void JSON_WriteIO_PushInt(JSON_WRITE_IO *const io, const int32_t value)
function JSON_WriteIO_PushDouble (line 101) | void JSON_WriteIO_PushDouble(JSON_WRITE_IO *const io, const double value)
function JSON_WriteIO_PushRGB888 (line 106) | void JSON_WriteIO_PushRGB888(JSON_WRITE_IO *const io, const RGB_888 value)
function JSON_WriteIO_PushXYZ16 (line 117) | void JSON_WriteIO_PushXYZ16(JSON_WRITE_IO *const io, const XYZ_16 value)
function JSON_WriteIO_PushXYZ32 (line 128) | void JSON_WriteIO_PushXYZ32(JSON_WRITE_IO *const io, const XYZ_32 value)
function JSON_WRITE_IO (line 139) | JSON_WRITE_IO *JSON_WriteIO_Create(void)
function JSON_WriteIO_Destroy (line 148) | void JSON_WriteIO_Destroy(JSON_WRITE_IO *const io)
function JSON_VALUE (line 154) | JSON_VALUE *JSON_WriteIO_GetRoot(JSON_WRITE_IO *const io)
FILE: src/trx/core/json/util/write_io.h
type JSON_WRITE_IO (line 11) | typedef struct JSON_WRITE_IO JSON_WRITE_IO;
type JSON_WRITE_TYPE (line 13) | typedef enum JSON_WRITE_TYPE {
FILE: src/trx/core/json/write.c
function M_GetNumberSize (line 15) | static int M_GetNumberSize(const JSON_NUMBER *number, size_t *size)
function M_GetStringSize (line 137) | static int M_GetStringSize(const JSON_STRING *string, size_t *size)
function M_GetArraySize_Minified (line 162) | static int M_GetArraySize_Minified(const JSON_ARRAY *array, size_t *size)
function M_GetObjectSize_Minified (line 182) | static int M_GetObjectSize_Minified(const JSON_OBJECT *object, size_t *s...
function M_GetValueSize_Minified (line 209) | static int M_GetValueSize_Minified(const JSON_VALUE *value, size_t *size)
function M_GetArraySize_Pretty (line 602) | static int M_GetArraySize_Pretty(
function M_GetObjectSize_Pretty (line 644) | static int M_GetObjectSize_Pretty(
function M_GetValueSize_Pretty (line 686) | static int M_GetValueSize_Pretty(
FILE: src/trx/core/log.c
function Log_Init (line 27) | void Log_Init(const char *path, const LOG_LEVEL min_level)
function LOG_LEVEL (line 41) | LOG_LEVEL Log_GetMinLevel(void)
function Log_SetMinLevel (line 46) | void Log_SetMinLevel(const LOG_LEVEL min_level)
function Log_Message (line 51) | void Log_Message(
function Log_Shutdown (line 102) | void Log_Shutdown(void)
FILE: src/trx/core/log.h
type LOG_LEVEL (line 3) | typedef enum {
FILE: src/trx/core/log_linux.c
function M_ErrorCallback (line 10) | static void M_ErrorCallback(void *data, const char *msg, int errnum)
function M_StackTrace (line 15) | static int M_StackTrace(
function M_SignalHandler (line 29) | static void M_SignalHandler(int sig)
function Log_Init_Extra (line 40) | void Log_Init_Extra(const char *path)
function Log_Shutdown_Extra (line 47) | void Log_Shutdown_Extra(void)
function Log_ShouldUseAnsiColors (line 51) | bool Log_ShouldUseAnsiColors(void)
FILE: src/trx/core/log_unknown.c
function Log_ShouldUseAnsiColors (line 3) | bool Log_ShouldUseAnsiColors(void)
function Log_Init_Extra (line 8) | void Log_Init_Extra(const char *path)
function Log_Shutdown_Extra (line 12) | void Log_Shutdown_Extra(void)
FILE: src/trx/core/log_windows.c
function M_StackTrace (line 37) | static void M_StackTrace(
function M_CreateMiniDump (line 71) | static void M_CreateMiniDump(
function LONG (line 89) | LONG WINAPI Log_CrashHandler(EXCEPTION_POINTERS *ex)
function Log_Init_Extra (line 104) | void Log_Init_Extra(const char *log_path)
function Log_Shutdown_Extra (line 129) | void Log_Shutdown_Extra(void)
function Log_ShouldUseAnsiColors (line 134) | bool Log_ShouldUseAnsiColors(void)
FILE: src/trx/core/math/func.c
function Math_Sqrt (line 7) | uint32_t Math_Sqrt(uint32_t n)
function Math_Sqrt64 (line 30) | uint64_t Math_Sqrt64(uint64_t n)
function Math_GetVectorAngles (line 52) | void Math_GetVectorAngles(
function Math_AngleInCone (line 59) | int32_t Math_AngleInCone(int32_t angle1, int32_t angle2, int32_t cone)
function DIRECTION (line 65) | DIRECTION Math_GetDirection(const int16_t angle)
function DIRECTION (line 70) | DIRECTION Math_GetDirectionCone(const int16_t angle, const int16_t cone)
function Math_DirectionToAngle (line 84) | int16_t Math_DirectionToAngle(const DIRECTION dir)
function Math_AngleMean (line 100) | int32_t Math_AngleMean(int32_t angle1, int32_t angle2, double ratio)
function Math_FloorDiv (line 120) | int32_t Math_FloorDiv(const int32_t x, const int32_t divisor)
function Math_GCD (line 125) | int32_t Math_GCD(int32_t a, int32_t b)
FILE: src/trx/core/math/geom.c
function XYZ_32_GetYaw (line 10) | int16_t XYZ_32_GetYaw(const XYZ_32 pos)
function XYZ_32_GetYawDiff (line 15) | int16_t XYZ_32_GetYawDiff(const XYZ_32 pos1, const XYZ_32 pos2)
function XYZ_32_GetPitch (line 20) | int16_t XYZ_32_GetPitch(XYZ_32 pos)
function XYZ_32_GetDistance (line 32) | int32_t XYZ_32_GetDistance(const XYZ_32 pos1, const XYZ_32 pos2)
function XYZ_32_IsNearby (line 55) | bool XYZ_32_IsNearby(
function XYZ_32_GetLength (line 67) | int32_t XYZ_32_GetLength(const XYZ_32 pos)
function XYZ_32_GetLength2 (line 75) | int32_t XYZ_32_GetLength2(const XYZ_32 pos)
function XYZ_32_GetLength2_64 (line 81) | int64_t XYZ_32_GetLength2_64(const XYZ_32 pos)
function XYZ_32_AreEquivalent (line 87) | bool XYZ_32_AreEquivalent(const XYZ_32 pos1, const XYZ_32 pos2)
function XYZ_16_AreEquivalent (line 92) | bool XYZ_16_AreEquivalent(const XYZ_16 rot1, const XYZ_16 rot2)
function XYZ_32 (line 97) | XYZ_32 XYZ_32_From16(const XYZ_16 src)
function XYZ_32 (line 102) | XYZ_32 XYZ_32_OffsetYaw(
function XYZ_32 (line 112) | XYZ_32 XYZ_32_FromYawPitch(
function XYZ_32_DotProduct_64 (line 128) | int64_t XYZ_32_DotProduct_64(const XYZ_32 a, const XYZ_32 b)
function XYZ_32_ProjectPointOntoAxis (line 133) | bool XYZ_32_ProjectPointOntoAxis(
function XYZ_F_DotProduct (line 168) | float XYZ_F_DotProduct(const XYZ_F a, const XYZ_F b)
function XYZ_F_Length2 (line 173) | float XYZ_F_Length2(const XYZ_F pos)
function XYZ_F_Length (line 178) | float XYZ_F_Length(const XYZ_F pos)
function XYZ_F (line 183) | XYZ_F XYZ_F_Subtract(const XYZ_F a, const XYZ_F b)
FILE: src/trx/core/math/trig.c
function Math_Cos (line 357) | int32_t Math_Cos(int32_t angle)
function Math_Sin (line 362) | int32_t Math_Sin(int32_t angle)
function Math_Atan (line 375) | int32_t Math_Atan(int32_t x, int32_t y)
FILE: src/trx/core/math/types.h
type XZ_32 (line 7) | typedef struct {
type XZ_16 (line 12) | typedef struct {
type XYZ_32 (line 17) | typedef struct {
type XYZ_16 (line 23) | typedef struct {
type XYZ_BOOL (line 29) | typedef struct {
type XYZ_F (line 35) | typedef struct {
type XYZW_F (line 39) | typedef struct {
type DIRECTION (line 43) | typedef enum {
type BOUNDS_16 (line 51) | typedef struct {
type BOUNDS_32 (line 56) | typedef struct {
FILE: src/trx/core/math/util.c
function Bounds32_Intersect (line 3) | bool Bounds32_Intersect(const BOUNDS_32 *const a, const BOUNDS_32 *const b)
FILE: src/trx/core/memory.c
function MEMORY_ARENA_CHUNK (line 9) | static MEMORY_ARENA_CHUNK *M_ArenaAllocChunk(
function Memory_Align (line 22) | size_t Memory_Align(const size_t size)
function Memory_Free (line 42) | void Memory_Free(void *const memory)
function Memory_FreePointer (line 49) | void Memory_FreePointer(void *arg)
function Memory_ArenaReset (line 111) | void Memory_ArenaReset(MEMORY_ARENA_ALLOCATOR *const allocator)
function Memory_ArenaFree (line 122) | void Memory_ArenaFree(MEMORY_ARENA_ALLOCATOR *const allocator)
FILE: src/trx/core/memory.h
type MEMORY_ARENA_CHUNK (line 10) | typedef struct MEMORY_ARENA_CHUNK {
type MEMORY_ARENA_ALLOCATOR (line 17) | typedef struct {
FILE: src/trx/core/strings/case_funcs.c
function String_GetCharByteSize (line 18) | size_t String_GetCharByteSize(const char *const ptr)
FILE: src/trx/core/strings/common.c
type M_STATIC_BUFFER (line 17) | typedef struct {
function M_Shutdown (line 25) | __attribute__((destructor)) static void M_Shutdown(void)
function M_STATIC_BUFFER (line 33) | static M_STATIC_BUFFER *M_CycleStaticBuffer(void)
function M_AddPage (line 40) | static void M_AddPage(
function String_EndsWith (line 55) | bool String_EndsWith(const char *str, const char *suffix)
function String_Equivalent (line 67) | bool String_Equivalent(const char *a, const char *b)
function String_Match (line 117) | bool String_Match(const char *const subject, const char *const pattern)
function String_IsEmpty (line 152) | bool String_IsEmpty(const char *const value)
function String_ParseBool (line 157) | bool String_ParseBool(const char *const value, bool *const target)
function String_ParseInteger (line 176) | bool String_ParseInteger(const char *const value, int32_t *const target)
function String_ParseDecimal (line 181) | bool String_ParseDecimal(const char *const value, float *const target)
function String_ParseRGB888 (line 205) | bool String_ParseRGB888(const char *value, RGB_888 *const target)
function String_ParseRGBA8888 (line 215) | bool String_ParseRGBA8888(const char *value, RGBA_8888 *const target)
function VECTOR (line 226) | VECTOR *String_Paginate(const char *const text, const int32_t max_lines)
function String_FormatInto (line 279) | void String_FormatInto(
function String_FormatIntoV (line 288) | void String_FormatIntoV(
FILE: src/trx/core/strings/fuzzy_match.c
function STRING_FUZZY_SCORE (line 14) | static STRING_FUZZY_SCORE M_GetScore(
function M_DiscardNonFullMatches (line 54) | static void M_DiscardNonFullMatches(VECTOR *const matches)
function M_DiscardNonWordMatches (line 73) | static void M_DiscardNonWordMatches(VECTOR *const matches)
function M_SortMatches (line 92) | static void M_SortMatches(VECTOR *const matches)
function M_DiscardDuplicateMatches (line 106) | static void M_DiscardDuplicateMatches(VECTOR *const matches)
function VECTOR (line 125) | VECTOR *String_FuzzyMatch(const char *user_input, const VECTOR *const so...
FILE: src/trx/core/strings/fuzzy_match.h
type STRING_FUZZY_SOURCE (line 7) | typedef struct {
type STRING_FUZZY_SCORE (line 13) | typedef struct {
type STRING_FUZZY_MATCH (line 19) | typedef struct {
FILE: src/trx/core/thread_pool.c
type JOB (line 8) | typedef struct JOB {
type THREAD_POOL (line 14) | struct THREAD_POOL {
function M_WorkerThread (line 26) | static int32_t M_WorkerThread(void *const arg)
function THREAD_POOL (line 60) | THREAD_POOL *ThreadPool_Create(int32_t num_threads)
function ThreadPool_Destroy (line 85) | void ThreadPool_Destroy(THREAD_POOL *const pool)
function ThreadPool_AddJob (line 105) | bool ThreadPool_AddJob(
function ThreadPool_Wait (line 125) | void ThreadPool_Wait(THREAD_POOL *pool)
FILE: src/trx/core/thread_pool.h
type THREAD_POOL (line 5) | typedef struct THREAD_POOL THREAD_POOL;
FILE: src/trx/core/vector.c
type VECTOR_PRIV (line 13) | struct VECTOR_PRIV {
function M_EnsureCapacity (line 17) | static void M_EnsureCapacity(VECTOR *const vector, const int32_t n)
function VECTOR (line 26) | VECTOR *Vector_Create(const size_t item_size)
function VECTOR (line 31) | VECTOR *Vector_CreateAtCapacity(const size_t item_size, const int32_t ca...
function Vector_EnsureCapacity (line 43) | void Vector_EnsureCapacity(VECTOR *const vector, const int32_t capacity)
function Vector_Free (line 53) | void Vector_Free(VECTOR *vector)
function Vector_IndexOf (line 63) | int32_t Vector_IndexOf(const VECTOR *const vector, const void *const item)
function Vector_LastIndexOf (line 76) | int32_t Vector_LastIndexOf(const VECTOR *const vector, const void *const...
function Vector_Contains (line 88) | bool Vector_Contains(const VECTOR *const vector, const void *const item)
function Vector_Add (line 115) | void Vector_Add(VECTOR *const vector, const void *const item)
function Vector_Insert (line 120) | void Vector_Insert(
function Vector_Swap (line 136) | void Vector_Swap(
function Vector_Remove (line 154) | bool Vector_Remove(VECTOR *const vector, const void *item)
function Vector_RemoveAt (line 164) | void Vector_RemoveAt(VECTOR *const vector, const int32_t index)
function Vector_Reverse (line 178) | void Vector_Reverse(VECTOR *const vector)
function Vector_Clear (line 194) | void Vector_Clear(VECTOR *const vector)
function Vector_ClearRealloc (line 199) | void Vector_ClearRealloc(VECTOR *const vector)
FILE: src/trx/core/vector.h
type VECTOR_PRIV (line 6) | struct VECTOR_PRIV
type VECTOR (line 8) | typedef struct {
FILE: src/trx/core/virtual_file.c
function VFILE (line 10) | VFILE *VFile_CreateFromPath(const char *const path)
function VFILE (line 36) | VFILE *VFile_CreateFromBuffer(const char *data, size_t size)
function VFile_Close (line 45) | void VFile_Close(VFILE *file)
function VFile_GetPos (line 52) | size_t VFile_GetPos(const VFILE *file)
function VFile_SetPos (line 57) | void VFile_SetPos(VFILE *const file, const size_t pos)
function VFile_Skip (line 63) | void VFile_Skip(VFILE *const file, const int32_t offset)
function VFile_TrySkip (line 68) | bool VFile_TrySkip(VFILE *const file, const int32_t offset)
function VFile_Read (line 78) | void VFile_Read(VFILE *const file, void *const target, const size_t size)
function VFile_TryRead (line 83) | bool VFile_TryRead(VFILE *const file, void *const target, const size_t s...
function VFile_ReadS8 (line 100) | int8_t VFile_ReadS8(VFILE *file)
function VFile_ReadS16 (line 107) | int16_t VFile_ReadS16(VFILE *file)
function VFile_ReadS32 (line 114) | int32_t VFile_ReadS32(VFILE *file)
function VFile_ReadU8 (line 121) | uint8_t VFile_ReadU8(VFILE *file)
function VFile_ReadU16 (line 128) | uint16_t VFile_ReadU16(VFILE *file)
function VFile_ReadU32 (line 135) | uint32_t VFile_ReadU32(VFILE *file)
FILE: src/trx/core/virtual_file.h
type VFILE (line 6) | typedef struct {
FILE: src/trx/game/anims/commands.c
function M_ParseCommand (line 6) | static void M_ParseCommand(ANIM_COMMAND *const command, const int16_t **...
function Anim_LoadCommands (line 56) | void Anim_LoadCommands(const int16_t *data)
FILE: src/trx/game/anims/common.c
function Anim_InitialiseAnims (line 16) | void Anim_InitialiseAnims(const int32_t num_anims)
function Anim_InitialiseChanges (line 22) | void Anim_InitialiseChanges(const int32_t num_changes)
function Anim_InitialiseRanges (line 29) | void Anim_InitialiseRanges(const int32_t num_ranges)
function Anim_InitialiseBones (line 35) | void Anim_InitialiseBones(const int32_t num_bones)
function Anim_GetTotalCount (line 41) | int32_t Anim_GetTotalCount(void)
function ANIM (line 46) | ANIM *Anim_GetAnim(const int32_t anim_idx)
function ANIM_CHANGE (line 54) | ANIM_CHANGE *Anim_GetChange(const int32_t change_idx)
function ANIM_RANGE (line 60) | ANIM_RANGE *Anim_GetRange(const int32_t range_idx)
function ANIM_BONE (line 66) | ANIM_BONE *Anim_GetBone(const int32_t bone_idx)
function ANIM_BONE (line 73) | ANIM_BONE *Anim_TryGetBone(const int32_t bone_idx)
function Anim_TestAbsFrameEqual (line 81) | bool Anim_TestAbsFrameEqual(const int16_t abs_frame, const int16_t frame)
function Anim_TestAbsFrameRange (line 86) | bool Anim_TestAbsFrameRange(
function Anim_HasChange (line 92) | bool Anim_HasChange(const ANIM *const anim, const int16_t goal_state_id)
function Anim_HasFXCommand (line 103) | bool Anim_HasFXCommand(const ANIM *const anim, const int16_t fx_num)
function Anim_HasFXCommandBetween (line 109) | bool Anim_HasFXCommandBetween(
FILE: src/trx/game/anims/enum.h
type ANIM_COMMAND_TYPE (line 4) | typedef enum {
type ANIM_COMMAND_ENVIRONMENT (line 14) | typedef enum {
FILE: src/trx/game/anims/frames.c
type ROT_PACK_MODE (line 12) | typedef enum {
function M_GetAnimFrameCount (line 21) | static int32_t M_GetAnimFrameCount(
function OBJECT (line 43) | static OBJECT *M_GetAnimObject(const int32_t anim_idx)
function ANIM_FRAME (line 55) | static ANIM_FRAME *M_FindFrameBase(const uint32_t frame_ofs)
function M_ExtractRotation (line 68) | static void M_ExtractRotation(
function M_ParseMeshRotation (line 76) | static void M_ParseMeshRotation(
function M_ParseFrame (line 111) | static int32_t M_ParseFrame(
function Anim_GetTotalFrameCount (line 144) | int32_t Anim_GetTotalFrameCount(
function Anim_InitialiseFrames (line 155) | void Anim_InitialiseFrames(const int32_t num_frames)
function Anim_LoadFrames (line 161) | void Anim_LoadFrames(
FILE: src/trx/game/anims/types.h
type ANIM_CHANGE (line 6) | typedef struct {
type ANIM_RANGE (line 12) | typedef struct {
type ANIM_COMMAND (line 19) | typedef struct {
type ANIM_COMMAND_VELOCITY_DATA (line 24) | typedef struct {
type ANIM_COMMAND_EFFECT_DATA (line 29) | typedef struct {
type ANIM_BONE (line 36) | typedef struct {
type ANIM_FRAME (line 43) | typedef struct {
type ANIM (line 49) | typedef struct {
FILE: src/trx/game/camera/box_camera.c
type M_SETTINGS (line 21) | typedef struct {
function M_SETTINGS (line 104) | static const M_SETTINGS *M_GetSettings(void)
function M_GetChaseSpeed (line 109) | static int16_t M_GetChaseSpeed(void)
function CAMERA_LOOK_SETTINGS (line 114) | static const CAMERA_LOOK_SETTINGS *M_GetLookSettingsFunc(const bool on_s...
function BOX_INFO (line 120) | static const BOX_INFO *M_GetBox(
function SECTOR (line 141) | static const SECTOR *M_GetSector(
function M_IsGoodPosition (line 154) | static bool M_IsGoodPosition(
function M_ShiftClamp (line 160) | static int32_t M_ShiftClamp(GAME_VECTOR *const pos, const int32_t clamp)
function M_SmartShift (line 206) | static void M_SmartShift(GAME_VECTOR *const target, void (*shift)(M_SHIF...
function M_Clip (line 407) | static void M_Clip(M_SHIFT_ARGS)
function M_Shift (line 437) | static void M_Shift(M_SHIFT_ARGS)
function M_Move (line 490) | static void M_Move(const GAME_VECTOR *const target, const int32_t speed)
function M_Chase (line 549) | static void M_Chase(const ITEM *const item)
function M_Combat (line 586) | static void M_Combat(const ITEM *const item)
function M_Fixed (line 642) | static void M_Fixed(void)
function M_Look (line 669) | static void M_Look(const ITEM *const item)
function M_ClampResult (line 726) | static void M_ClampResult(void)
function M_Reset (line 755) | static void M_Reset(void)
function M_Update (line 772) | static void M_Update(
FILE: src/trx/game/camera/cinematic.c
function M_UpdateCutscene (line 13) | static void M_UpdateCutscene(const XYZ_32 base_pos, const int16_t angle)
function Camera_InitialiseCineFrames (line 50) | void Camera_InitialiseCineFrames(const int32_t num_frames)
function CINE_FRAME (line 59) | CINE_FRAME *Camera_GetCineFrame(const int32_t frame_idx)
function CINE_FRAME (line 67) | CINE_FRAME *Camera_GetCurrentCineFrame(void)
function CINE_DATA (line 72) | CINE_DATA *Camera_GetCineData(void)
function Camera_InvokeCinematic (line 77) | void Camera_InvokeCinematic(
function Camera_LoadCutsceneFrame (line 87) | void Camera_LoadCutsceneFrame(void)
function Camera_UpdateCutscene (line 103) | void Camera_UpdateCutscene(void)
FILE: src/trx/game/camera/common.c
function M_OffsetAdditionalAngle (line 23) | static void M_OffsetAdditionalAngle(const int16_t delta)
function M_OffsetAdditionalElevation (line 28) | static void M_OffsetAdditionalElevation(const int16_t delta)
function M_OffsetReset (line 36) | static void M_OffsetReset(void)
function CAMERA_STRATEGY (line 42) | static const CAMERA_STRATEGY *M_GetStrategy(void)
function CAMERA_LOOK_SETTINGS (line 47) | const CAMERA_LOOK_SETTINGS *Camera_GetLookSettings(const bool on_surface)
function Camera_RegisterStrategy (line 52) | void Camera_RegisterStrategy(
function Camera_IsChunky (line 58) | bool Camera_IsChunky(void)
function Camera_SetChunky (line 63) | void Camera_SetChunky(const bool is_chunky)
function Camera_Initialise (line 68) | void Camera_Initialise(void)
function Camera_ResetPosition (line 79) | void Camera_ResetPosition(void)
function Camera_Reset (line 100) | void Camera_Reset(void)
function Camera_ApplyBounce (line 106) | void Camera_ApplyBounce(void)
function Camera_ClampInterpResult (line 128) | void Camera_ClampInterpResult(void)
function Camera_Update (line 145) | void Camera_Update(void)
function Camera_MoveManual (line 214) | void Camera_MoveManual(void)
function Camera_Apply (line 239) | void Camera_Apply(void)
FILE: src/trx/game/camera/enum.h
type CAMERA_TYPE (line 3) | typedef enum {
type CAMERA_FLAGS (line 13) | typedef enum {
FILE: src/trx/game/camera/environment.c
type M_TARGET_STATUS (line 12) | typedef enum {
function M_AdjustMusicVolume (line 18) | static void M_AdjustMusicVolume(const bool is_underwater)
function M_TARGET_STATUS (line 35) | static inline M_TARGET_STATUS M_HandleCameraTrigger(
function M_HandleTargetTrigger (line 62) | static inline void M_HandleTargetTrigger(const TRIGGER_CMD *const cmd)
function M_ValidateTriggerTarget (line 72) | static inline void M_ValidateTriggerTarget(const M_TARGET_STATUS status)
function Camera_RefreshFromTrigger (line 88) | void Camera_RefreshFromTrigger(const TRIGGER *const trigger)
function Camera_EnsureEnvironment (line 109) | void Camera_EnsureEnvironment(void)
function Camera_UpdateMicPosition (line 135) | void Camera_UpdateMicPosition(void)
FILE: src/trx/game/camera/fixed.c
function Camera_InitialiseFixedObjects (line 11) | void Camera_InitialiseFixedObjects(const int32_t num_objects)
function Camera_GetFixedObjectCount (line 18) | int32_t Camera_GetFixedObjectCount(void)
function Camera_GetDynamicFixedObjectIdx (line 23) | int32_t Camera_GetDynamicFixedObjectIdx(void)
function Camera_UpdateDynamicFixedObject (line 28) | void Camera_UpdateDynamicFixedObject(const XYZ_32 pos, const int16_t roo...
function OBJECT_VECTOR (line 36) | OBJECT_VECTOR *Camera_GetFixedObject(const int32_t object_idx)
function Camera_IsLocked (line 44) | bool Camera_IsLocked(const int32_t camera_num)
FILE: src/trx/game/camera/los_camera.c
type M_STATE (line 22) | typedef struct {
type M_IDEAL (line 36) | typedef struct {
function M_GetChaseSpeed (line 58) | static int16_t M_GetChaseSpeed(void)
function CAMERA_LOOK_SETTINGS (line 63) | static const CAMERA_LOOK_SETTINGS *M_GetLookSettingsFunc(const bool on_s...
function M_LOS (line 68) | static bool M_LOS(
function M_ClampY (line 147) | static inline void M_ClampY(int16_t room_num, XYZ_32 *const pos)
function M_Collide (line 164) | static bool M_Collide(
function M_UpdateLaraState (line 235) | static bool M_UpdateLaraState(void)
function M_Move (line 274) | static void M_Move(GAME_VECTOR *const ideal, const int32_t speed)
function GAME_VECTOR (line 355) | static GAME_VECTOR M_GetIdeal(
function M_Chase (line 413) | static void M_Chase(const ITEM *const item)
function M_Combat (line 478) | static void M_Combat(const ITEM *const item)
function M_Fixed (line 552) | static void M_Fixed(void)
function XYZ_32 (line 573) | static XYZ_32 M_GetHeadPos(const int32_t x, const int32_t y, const int32...
function M_Look (line 588) | static void M_Look(const ITEM *const item)
function M_ClampResult (line 789) | static void M_ClampResult(void)
function M_Reset (line 806) | static void M_Reset(void)
function M_Update (line 820) | static void M_Update(
function Camera_LOSCheck (line 931) | bool Camera_LOSCheck(
function Camera_Collide (line 937) | bool Camera_Collide(
FILE: src/trx/game/camera/photo_mode.c
function M_ResetCamera (line 38) | static void M_ResetCamera(const bool exiting)
function M_GetShiftSpeed (line 48) | static int32_t M_GetShiftSpeed(const int32_t val)
function M_GetRotSpeed (line 53) | static int32_t M_GetRotSpeed(void)
function XYZ_32 (line 58) | static XYZ_32 M_GetShift(const int32_t dx, const int32_t dy, const int32...
function M_ShiftCamera (line 79) | static void M_ShiftCamera(int32_t dx, int32_t dy, int32_t dz)
function M_ApplyRotation (line 90) | static void M_ApplyRotation(
function M_RotateCamera (line 120) | static void M_RotateCamera(
function M_RotateTarget (line 130) | static void M_RotateTarget(
function M_ClampCameraPos (line 140) | static void M_ClampCameraPos(void)
function M_CameraInsideRoom (line 154) | static bool M_CameraInsideRoom(const XYZ_32 pos, const int16_t room_num)
function M_UpdateCameraRooms (line 159) | static void M_UpdateCameraRooms(void)
function M_HandleShiftInputs (line 184) | static bool M_HandleShiftInputs(void)
function M_HandleRotationInputs (line 216) | static bool M_HandleRotationInputs(void)
function M_HandleTargetRotationInputs (line 247) | static bool M_HandleTargetRotationInputs(void)
function M_HandleFOVInputs (line 257) | static bool M_HandleFOVInputs(void)
function Camera_PhotoMode_Enter (line 273) | void Camera_PhotoMode_Enter(void)
function Camera_PhotoMode_Exit (line 307) | void Camera_PhotoMode_Exit(void)
function Camera_PhotoMode_Update (line 314) | void Camera_PhotoMode_Update(void)
function Camera_PhotoMode_UpdateFOV (line 345) | void Camera_PhotoMode_UpdateFOV(void)
function Camera_PhotoMode_Pause (line 350) | void Camera_PhotoMode_Pause(void)
function Camera_PhotoMode_Resume (line 359) | void Camera_PhotoMode_Resume(void)
FILE: src/trx/game/camera/types.h
type CAMERA_LOOK_SETTINGS (line 6) | typedef struct {
type CAMERA_STRATEGY (line 16) | typedef struct {
type CAMERA_INFO (line 24) | typedef struct {
type CINE_FRAME (line 64) | typedef struct {
type CINE_DATA (line 72) | typedef struct {
FILE: src/trx/game/catalog/manager.c
type M_ENTRY (line 18) | typedef struct {
type M_NAME_ENTRY (line 52) | typedef struct {
type M_GAME_ID_ENTRY (line 60) | typedef struct {
function M_ClearGameIDMap (line 74) | static void M_ClearGameIDMap(M_GAME_ID_ENTRY **const map)
function M_ClearNameMap (line 85) | static void M_ClearNameMap(M_NAME_ENTRY **const map)
function M_ParseCSVField (line 112) | static void M_ParseCSVField(
function M_Initialize (line 148) | static void M_Initialize(void)
function Catalog_Load (line 171) | bool Catalog_Load(
function Catalog_NameToEnum (line 232) | bool Catalog_NameToEnum(
function Catalog_EnumToGameID (line 244) | bool Catalog_EnumToGameID(
function Catalog_GameIDToEnum (line 259) | bool Catalog_GameIDToEnum(
function Catalog_Shutdown (line 272) | void Catalog_Shutdown(void)
FILE: src/trx/game/catalog/manager.h
type CATALOG_CONTEXT (line 6) | typedef enum CATALOG_CONTEXT {
type CATALOG_ID (line 16) | typedef int32_t CATALOG_ID;
FILE: src/trx/game/clock/common.c
function M_GetHighPrecisionCounter (line 31) | static double M_GetHighPrecisionCounter(void)
function Clock_Init (line 40) | void Clock_Init(void)
function Clock_DisableWait (line 46) | void Clock_DisableWait(void)
function Clock_EnableHeadlessFixedFPS (line 51) | void Clock_EnableHeadlessFixedFPS(int32_t fps)
function Clock_GetDateTime (line 65) | size_t Clock_GetDateTime(char *const buffer, const size_t size)
function Clock_GetCurrentFPS (line 76) | int32_t Clock_GetCurrentFPS(void)
function Clock_GetFrameAdvance (line 81) | int32_t Clock_GetFrameAdvance(void)
function Clock_SyncTick (line 86) | void Clock_SyncTick(void)
function Clock_WaitTick (line 92) | int32_t Clock_WaitTick(void)
function Clock_GetRealTime (line 160) | double Clock_GetRealTime(void)
function Clock_GetSimTime (line 165) | double Clock_GetSimTime(void)
function Clock_SetSimSpeed (line 172) | void Clock_SetSimSpeed(const double new_speed)
FILE: src/trx/game/clock/timer.c
function M_GetTime (line 5) | static double M_GetTime(const CLOCK_TIMER *const timer)
function ClockTimer_Sync (line 11) | void ClockTimer_Sync(CLOCK_TIMER *const timer)
function ClockTimer_PeekElapsed (line 16) | double ClockTimer_PeekElapsed(const CLOCK_TIMER *const timer)
function ClockTimer_TakeElapsed (line 21) | double ClockTimer_TakeElapsed(CLOCK_TIMER *const timer)
function ClockTimer_CheckElapsed (line 29) | bool ClockTimer_CheckElapsed(const CLOCK_TIMER *const timer, double sec)
function ClockTimer_CheckElapsedAndTake (line 34) | bool ClockTimer_CheckElapsedAndTake(CLOCK_TIMER *const timer, double sec)
FILE: src/trx/game/clock/timer.h
type CLOCK_TIMER_TYPE (line 3) | typedef enum {
type CLOCK_TIMER (line 8) | typedef struct {
FILE: src/trx/game/clock/turbo.c
function Clock_CycleTurboSpeed (line 12) | void Clock_CycleTurboSpeed(const bool forward)
function Clock_GetTurboSpeed (line 22) | int32_t Clock_GetTurboSpeed(void)
function Clock_SetTurboSpeed (line 27) | void Clock_SetTurboSpeed(int32_t value)
function Clock_GetSpeedMultiplier (line 39) | double Clock_GetSpeedMultiplier(void)
FILE: src/trx/game/collision/common.c
function M_IsOnWalkable (line 15) | static bool M_IsOnWalkable(
function M_FillSide (line 26) | static void M_FillSide(
function Collide_GetSpheres (line 102) | int32_t Collide_GetSpheres(
function Collide_TestCollision (line 166) | int32_t Collide_TestCollision(ITEM *const item, const ITEM *const lara_i...
function Collide_GetJointAbsPosition (line 203) | void Collide_GetJointAbsPosition(
function Collide_GetCollisionInfo (line 297) | void Collide_GetCollisionInfo(
function Collide_CollideStaticObjects (line 546) | bool Collide_CollideStaticObjects(
function Collide_TestBoundsCollide (line 714) | bool Collide_TestBoundsCollide(
function Collide_DoProperDetection (line 744) | void Collide_DoProperDetection(ITEM *const item, const XYZ_32 old_pos)
function Collide_ShiftItem (line 1153) | void Collide_ShiftItem(ITEM *const item, COLL_INFO *const coll)
FILE: src/trx/game/collision/los.c
function M_TryPushLOSRoom (line 17) | static inline bool M_TryPushLOSRoom(const int16_t room_num)
function M_ResetLOSRooms (line 26) | static inline bool M_ResetLOSRooms(const int16_t room_num)
function M_RoomInLOSRooms (line 32) | static inline bool M_RoomInLOSRooms(const int16_t room_num)
function LOS_CheckItemIntersectSegment (line 54) | bool LOS_CheckItemIntersectSegment(
function LOS_CheckSmashable (line 148) | int32_t LOS_CheckSmashable(
function M_CheckX (line 196) | static int32_t M_CheckX(
function M_CheckZ (line 306) | static int32_t M_CheckZ(
function M_ClipTargetSimple (line 416) | static int32_t M_ClipTargetSimple(
function M_ClipTargetWithSlopes (line 445) | static int32_t M_ClipTargetWithSlopes(
function LOS_Check (line 499) | bool LOS_Check(
FILE: src/trx/game/collision/types.h
type COLL_SIDE (line 6) | typedef struct {
type COLL_TYPE (line 12) | typedef enum {
type COLL_INFO (line 24) | typedef struct {
type SPHERE (line 56) | typedef struct {
type COLL_ITEM (line 61) | typedef struct {
FILE: src/trx/game/console/cmd/clear.c
function COMMAND_RESULT (line 5) | static COMMAND_RESULT M_Entrypoint(const COMMAND_CONTEXT *const ctx)
FILE: src/trx/game/console/cmd/config.c
function CONFIG_OPTION (line 40) | static const CONFIG_OPTION *M_GetOptionFromKey(const char *const key)
function M_TryApplyOptionValue (line 151) | static bool M_TryApplyOptionValue(
function VECTOR (line 193) | static VECTOR *M_GetOptionsFuzzy(const char *const key)
function COMMAND_RESULT (line 218) | static COMMAND_RESULT M_Entrypoint(const COMMAND_CONTEXT *const ctx)
function CONFIG_OPTION (line 299) | const CONFIG_OPTION *Console_Cmd_Config_GetOptionFromTarget(
function COMMAND_RESULT (line 312) | COMMAND_RESULT Console_Cmd_Config_Helper(
function VECTOR (line 358) | VECTOR *Console_Cmd_Config_GetOptionsFromKey(const char *const key)
FILE: src/trx/game/console/cmd/debug.c
type DEBUG_OPTION_ENTRY (line 11) | typedef struct {
function M_InitOptions (line 29) | static void M_InitOptions(void)
function VECTOR (line 37) | static VECTOR *M_BuildMatches(const char *const key)
function M_LogOption (line 57) | static void M_LogOption(const CONFIG_OPTION *const option)
function M_ShowOption (line 66) | static void M_ShowOption(const CONFIG_OPTION *const option)
function M_UpdateOption (line 75) | static bool M_UpdateOption(const CONFIG_OPTION *const option, const bool...
function M_UpdateAll (line 87) | static bool M_UpdateAll(const bool enable)
function M_ShowStatus (line 98) | static void M_ShowStatus(void)
function COMMAND_RESULT (line 105) | static COMMAND_RESULT M_Entrypoint(const COMMAND_CONTEXT *ctx)
FILE: src/trx/game/console/cmd/die.c
function COMMAND_RESULT (line 10) | static COMMAND_RESULT M_Entrypoint(const COMMAND_CONTEXT *const ctx)
FILE: src/trx/game/console/cmd/easy_config.c
type COMMAND_TO_OPTION_MAP (line 6) | typedef struct {
function COMMAND_RESULT (line 22) | static COMMAND_RESULT M_Entrypoint(const COMMAND_CONTEXT *const ctx)
FILE: src/trx/game/console/cmd/end_level.c
function COMMAND_RESULT (line 6) | static COMMAND_RESULT M_Entrypoint(const COMMAND_CONTEXT *const ctx)
FILE: src/trx/game/console/cmd/exit_game.c
function COMMAND_RESULT (line 5) | static COMMAND_RESULT M_Entrypoint(const COMMAND_CONTEXT *const ctx)
FILE: src/trx/game/console/cmd/exit_to_title.c
function COMMAND_RESULT (line 5) | static COMMAND_RESULT M_Entrypoint(const COMMAND_CONTEXT *const ctx)
FILE: src/trx/game/console/cmd/flipmap.c
function COMMAND_RESULT (line 9) | static COMMAND_RESULT M_Entrypoint(const COMMAND_CONTEXT *const ctx)
FILE: src/trx/game/console/cmd/flood.c
function COMMAND_RESULT (line 6) | static COMMAND_RESULT M_Entrypoint(const COMMAND_CONTEXT *const ctx)
FILE: src/trx/game/console/cmd/fly.c
function COMMAND_RESULT (line 8) | static COMMAND_RESULT M_Entrypoint(const COMMAND_CONTEXT *const ctx)
FILE: src/trx/game/console/cmd/give_item.c
function M_CanTargetObjectPickup (line 17) | static bool M_CanTargetObjectPickup(const OBJECT_ID obj_id)
function M_Match (line 25) | static bool M_Match(const COMMAND_CONTEXT *const ctx, const char *const ...
function COMMAND_RESULT (line 31) | static COMMAND_RESULT M_Entrypoint(const COMMAND_CONTEXT *const ctx)
FILE: src/trx/game/console/cmd/give_secret.c
function M_LogInvalid (line 55) | static void M_LogInvalid(const int32_t idx)
function COMMAND_RESULT (line 62) | static COMMAND_RESULT M_TakeSecret(const int32_t idx)
function COMMAND_RESULT (line 74) | static COMMAND_RESULT M_GiveSecret(const int32_t idx)
function COMMAND_RESULT (line 86) | static COMMAND_RESULT M_ListSecrets(void)
function COMMAND_RESULT (line 102) | static COMMAND_RESULT M_GiveAllSecrets(void)
function COMMAND_RESULT (line 110) | static COMMAND_RESULT M_TakeAllSecrets(void)
function COMMAND_RESULT (line 118) | static COMMAND_RESULT M_Entrypoint(const COMMAND_CONTEXT *const ctx)
FILE: src/trx/game/console/cmd/heal.c
function COMMAND_RESULT (line 10) | static COMMAND_RESULT M_Entrypoint(const COMMAND_CONTEXT *const ctx)
FILE: src/trx/game/console/cmd/help.c
function COMMAND_RESULT (line 8) | static COMMAND_RESULT M_ListAllCommands(void)
function COMMAND_RESULT (line 39) | static COMMAND_RESULT M_ShowSpecificCommand(const char *const cmd_name)
function COMMAND_RESULT (line 51) | static COMMAND_RESULT M_Help(const COMMAND_CONTEXT *const ctx)
FILE: src/trx/game/console/cmd/immune.c
function COMMAND_RESULT (line 8) | static COMMAND_RESULT M_Entrypoint(const COMMAND_CONTEXT *const ctx)
FILE: src/trx/game/console/cmd/inf_sprint.c
function COMMAND_RESULT (line 8) | static COMMAND_RESULT M_Entrypoint(const COMMAND_CONTEXT *const ctx)
FILE: src/trx/game/console/cmd/kill.c
function M_CanTargetObjectCreature (line 21) | static bool M_CanTargetObjectCreature(const OBJECT_ID obj_id)
function M_KillSingleEnemyInRange (line 28) | static bool M_KillSingleEnemyInRange(const int32_t max_dist)
function M_KillAllEnemiesInRange (line 53) | static int32_t M_KillAllEnemiesInRange(const int32_t max_dist)
function COMMAND_RESULT (line 72) | static COMMAND_RESULT M_KillAllEnemies(void)
function COMMAND_RESULT (line 99) | static COMMAND_RESULT M_KillNearestEnemies(void)
function COMMAND_RESULT (line 118) | static COMMAND_RESULT M_KillEnemyType(const char *const enemy_name)
function COMMAND_RESULT (line 159) | static COMMAND_RESULT M_Entrypoint(const COMMAND_CONTEXT *const ctx)
FILE: src/trx/game/console/cmd/load_game.c
type M_SLOT_REQUEST (line 11) | typedef struct {
function M_TryParseQuickArg (line 17) | static bool M_TryParseQuickArg(
function M_TryParseLoadArg (line 36) | static bool M_TryParseLoadArg(
function COMMAND_RESULT (line 68) | static COMMAND_RESULT M_ExecuteLoad(const M_SLOT_REQUEST request)
function COMMAND_RESULT (line 113) | static COMMAND_RESULT M_Entrypoint(const COMMAND_CONTEXT *const ctx)
function COMMAND_RESULT (line 122) | static COMMAND_RESULT M_EntrypointQL(const COMMAND_CONTEXT *const ctx)
FILE: src/trx/game/console/cmd/lua.c
function COMMAND_RESULT (line 7) | static COMMAND_RESULT M_Entrypoint(const COMMAND_CONTEXT *ctx)
FILE: src/trx/game/console/cmd/mod.c
function COMMAND_RESULT (line 8) | static COMMAND_RESULT M_Entrypoint(const COMMAND_CONTEXT *const ctx)
FILE: src/trx/game/console/cmd/music.c
function COMMAND_RESULT (line 7) | static COMMAND_RESULT M_Entrypoint(const COMMAND_CONTEXT *const ctx)
FILE: src/trx/game/console/cmd/play_cutscene.c
function COMMAND_RESULT (line 7) | static COMMAND_RESULT M_Entrypoint(const COMMAND_CONTEXT *const ctx)
FILE: src/trx/game/console/cmd/play_demo.c
function COMMAND_RESULT (line 8) | static COMMAND_RESULT M_Entrypoint(const COMMAND_CONTEXT *const ctx)
FILE: src/trx/game/console/cmd/play_gym.c
function COMMAND_RESULT (line 7) | static COMMAND_RESULT M_Entrypoint(const COMMAND_CONTEXT *const ctx)
FILE: src/trx/game/console/cmd/play_level.c
function GF_LEVEL (line 7) | static const GF_LEVEL *M_FindLevel(const char *const user_input)
function COMMAND_RESULT (line 55) | static COMMAND_RESULT M_Entrypoint(const COMMAND_CONTEXT *const ctx)
FILE: src/trx/game/console/cmd/pos.c
function COMMAND_RESULT (line 15) | static COMMAND_RESULT M_Entrypoint(const COMMAND_CONTEXT *const ctx)
FILE: src/trx/game/console/cmd/save_game.c
function M_TryParseQuickKeyword (line 12) | static bool M_TryParseQuickKeyword(const char *const args)
function COMMAND_RESULT (line 19) | static COMMAND_RESULT M_HandleQuickSave(void)
function COMMAND_RESULT (line 32) | static COMMAND_RESULT M_EntrypointQS(const COMMAND_CONTEXT *const ctx)
function COMMAND_RESULT (line 44) | static COMMAND_RESULT M_Entrypoint(const COMMAND_CONTEXT *const ctx)
FILE: src/trx/game/console/cmd/screenshot.c
function COMMAND_RESULT (line 9) | static COMMAND_RESULT M_Entrypoint(const COMMAND_CONTEXT *ctx)
FILE: src/trx/game/console/cmd/set_health.c
function COMMAND_RESULT (line 11) | static COMMAND_RESULT M_Entrypoint(const COMMAND_CONTEXT *const ctx)
FILE: src/trx/game/console/cmd/sfx.c
function COMMAND_RESULT (line 54) | static COMMAND_RESULT M_Entrypoint(const COMMAND_CONTEXT *const ctx)
FILE: src/trx/game/console/cmd/spawn.c
function GAME_VECTOR (line 17) | static GAME_VECTOR M_GetTargetPos(
function M_FindValidTargetPos (line 32) | static bool M_FindValidTargetPos(
function M_CanSpawnObject (line 45) | static bool M_CanSpawnObject(const OBJECT_ID object_id)
function M_ShouldEnableBaddieAI (line 53) | static bool M_ShouldEnableBaddieAI(const OBJECT_ID object_id)
function M_SpawnItem (line 66) | static bool M_SpawnItem(
function COMMAND_RESULT (line 92) | static COMMAND_RESULT M_Entrypoint(const COMMAND_CONTEXT *ctx)
FILE: src/trx/game/console/cmd/speed.c
function COMMAND_RESULT (line 7) | static COMMAND_RESULT M_Entrypoint(const COMMAND_CONTEXT *const ctx)
FILE: src/trx/game/console/cmd/strings.c
function COMMAND_RESULT (line 7) | static COMMAND_RESULT M_Entrypoint(const COMMAND_CONTEXT *const ctx)
FILE: src/trx/game/console/cmd/teleport.c
function M_ObjectCanBePickedUp (line 25) | static bool M_ObjectCanBePickedUp(const OBJECT_ID obj_id)
function M_CanTargetObject (line 39) | static bool M_CanTargetObject(const OBJECT_ID obj_id)
function M_CanTargetItem (line 47) | static bool M_CanTargetItem(
function M_CanTargetEnemyItem (line 87) | static bool M_CanTargetEnemyItem(const ITEM *const item)
function ITEM (line 99) | static const ITEM *M_GetItemToTeleporTo(const char *const user_input)
function ITEM (line 157) | static const ITEM *M_GetHostileEnemyToTeleportTo(void)
function M_IsFloatRound (line 182) | static inline bool M_IsFloatRound(const float num)
function M_AlignLaraToItem (line 187) | static void M_AlignLaraToItem(const ITEM *const item)
function COMMAND_RESULT (line 218) | static COMMAND_RESULT M_TeleportToXYZ(
function COMMAND_RESULT (line 244) | static COMMAND_RESULT M_TeleportToItemNum(const int16_t item_num)
function COMMAND_RESULT (line 277) | static COMMAND_RESULT M_TeleportToRoom(const int16_t room_num)
function COMMAND_RESULT (line 315) | static COMMAND_RESULT M_TeleportToObject(const char *const user_input)
function COMMAND_RESULT (line 357) | static COMMAND_RESULT M_TeleportToEnemy(void)
function M_TryParseTagNumber (line 380) | static bool M_TryParseTagNumber(
function M_TryParseKeywordNumber (line 401) | static bool M_TryParseKeywordNumber(
function COMMAND_RESULT (line 424) | static COMMAND_RESULT M_Entrypoint(const COMMAND_CONTEXT *const ctx)
FILE: src/trx/game/console/cmd/test_text.c
function COMMAND_RESULT (line 6) | static COMMAND_RESULT M_Entrypoint(const COMMAND_CONTEXT *const ctx)
FILE: src/trx/game/console/cmd/trigger.c
type M_TARGET_RESULT (line 13) | typedef enum {
function M_CanTargetObject (line 20) | static bool M_CanTargetObject(const OBJECT_ID object_id)
function M_SortItemNums (line 25) | static void M_SortItemNums(int16_t *const item_nums, const int32_t count)
function M_ApplyTrigger (line 75) | static void M_ApplyTrigger(const int16_t item_num, const bool enable)
function M_TARGET_RESULT (line 108) | static M_TARGET_RESULT M_TargetItemsFromItemNum(
function M_TARGET_RESULT (line 125) | static M_TARGET_RESULT M_TargetItemsFromItemName(
function M_TARGET_RESULT (line 138) | static M_TARGET_RESULT M_TargetItemsFromObjectName(
function M_TARGET_RESULT (line 180) | static M_TARGET_RESULT M_GetTargetItems(
function COMMAND_RESULT (line 197) | static COMMAND_RESULT M_Entrypoint(const COMMAND_CONTEXT *const ctx)
FILE: src/trx/game/console/cmd/weather.c
function COMMAND_RESULT (line 41) | static COMMAND_RESULT M_Entrypoint(const COMMAND_CONTEXT *const ctx)
FILE: src/trx/game/console/cmd/winston.c
function M_TrySummon (line 16) | static bool M_TrySummon(const GAME_VECTOR target_pos, const OBJECT_ID ob...
function COMMAND_RESULT (line 42) | static COMMAND_RESULT M_Entrypoint(const COMMAND_CONTEXT *ctx)
FILE: src/trx/game/console/common.c
function Console_Init (line 21) | void Console_Init(void)
function Console_Shutdown (line 28) | void Console_Shutdown(void)
function Console_Open (line 37) | void Console_Open(void)
function Console_Close (line 47) | void Console_Close(void)
function Console_IsOpened (line 57) | bool Console_IsOpened(void)
function Console_LogEx (line 62) | void Console_LogEx(
function Console_SetVerbose (line 93) | void Console_SetVerbose(const bool verbose)
function Console_IsVerbose (line 98) | bool Console_IsVerbose(void)
function Console_Clear (line 103) | void Console_Clear(void)
function COMMAND_RESULT (line 110) | COMMAND_RESULT Console_Eval(const char *const cmdline)
function Console_Control (line 155) | void Console_Control(void)
function Console_Draw (line 160) | void Console_Draw(void)
FILE: src/trx/game/console/enum.h
type COMMAND_RESULT (line 3) | typedef enum {
FILE: src/trx/game/console/history.c
function M_LoadFromJSON (line 23) | static void M_LoadFromJSON(JSON_VALUE *const doc)
function JSON_VALUE (line 40) | static JSON_VALUE *M_DumpToJSON(void)
function Console_History_Init (line 56) | void Console_History_Init(void)
function Console_History_Shutdown (line 66) | void Console_History_Shutdown(void)
function Console_History_GetLength (line 86) | int32_t Console_History_GetLength(void)
function Console_History_Clear (line 91) | void Console_History_Clear(void)
function Console_History_Append (line 100) | void Console_History_Append(const char *const prompt)
FILE: src/trx/game/console/registry.c
type M_NODE (line 9) | typedef struct M_NODE {
function M_Shutdown (line 16) | __attribute__((destructor)) static void M_Shutdown(void)
function CONSOLE_COMMAND (line 29) | const CONSOLE_COMMAND *Console_Registry_Get(const char *const cmdline)
function Console_Registry_Add (line 44) | void Console_Registry_Add(CONSOLE_COMMAND cmd)
function VECTOR (line 52) | VECTOR *Console_Registry_GetAll(void)
FILE: src/trx/game/console/types.h
type COMMAND_CONTEXT (line 5) | typedef struct {
type CONSOLE_COMMAND (line 11) | typedef struct CONSOLE_COMMAND {
FILE: src/trx/game/creature/alert.c
function Creature_AlertNearbyGuards (line 6) | void Creature_AlertNearbyGuards(const ITEM *const item)
function Creature_AlertAllGuards (line 31) | void Creature_AlertAllGuards(const int16_t item_num)
FILE: src/trx/game/creature/behavior.c
function M_Init (line 13) | __attribute__((constructor)) static void M_Init(void)
function M_Shutdown (line 19) | __attribute__((destructor)) static void M_Shutdown(void)
function Creature_Reset (line 33) | void Creature_Reset(void)
function Creature_AreAlliesHostile (line 40) | bool Creature_AreAlliesHostile(void)
function Creature_SetAlliesHostile (line 45) | void Creature_SetAlliesHostile(bool enable)
function Creature_Hurt (line 53) | void Creature_Hurt(ITEM *const item, const int32_t damage)
function Creature_IsHostile (line 91) | bool Creature_IsHostile(const ITEM *const item)
function Creature_IsAlly (line 112) | bool Creature_IsAlly(const ITEM *const item)
function Creature_IsAllyTargetingEnemy (line 117) | bool Creature_IsAllyTargetingEnemy(const ITEM *const item)
function Creature_AddAlly (line 122) | void Creature_AddAlly(const OBJECT_ID obj_id)
function Creature_AddAllyTargetingEnemy (line 127) | void Creature_AddAllyTargetingEnemy(const OBJECT_ID obj_id)
FILE: src/trx/game/creature/common.c
function M_TestSwitchOrKill (line 53) | static bool M_TestSwitchOrKill(
function M_GetBaddieTarget (line 67) | static void M_GetBaddieTarget(const int16_t item_num, const bool goody)
function ITEM (line 133) | static ITEM *M_ChooseEnemy(const ITEM *const item)
function M_SwitchToWater (line 150) | static bool M_SwitchToWater(
function M_SwitchToLand (line 182) | static bool M_SwitchToLand(
function ITEM (line 219) | const ITEM *M_GetBaddieOverlap(const int16_t item_num)
function M_TestDrowned (line 267) | static bool M_TestDrowned(
function Creature_Initialise (line 287) | void Creature_Initialise(const int16_t item_num)
function Creature_Activate (line 300) | bool Creature_Activate(const int16_t item_num)
function Creature_AIInfo (line 315) | void Creature_AIInfo(ITEM *const item, AI_INFO *const info)
function Creature_EnsureHabitat (line 420) | bool Creature_EnsureHabitat(
function Creature_Mood (line 439) | void Creature_Mood(
function Creature_UpdateMood (line 446) | void Creature_UpdateMood(
function Creature_ApplyMood (line 553) | void Creature_ApplyMood(
function Creature_Turn (line 640) | int16_t Creature_Turn(ITEM *const item, int16_t max_turn)
function Creature_Tilt (line 666) | void Creature_Tilt(ITEM *const item, int16_t angle)
function Creature_Head (line 673) | void Creature_Head(ITEM *const item, const int16_t required)
function Creature_Neck (line 687) | void Creature_Neck(ITEM *const item, const int16_t required)
function Creature_Joint (line 701) | void Creature_Joint(
function Creature_Float (line 716) | void Creature_Float(const int16_t item_num)
function Creature_Underwater (line 737) | void Creature_Underwater(ITEM *const item, const int32_t depth)
function Creature_CanSeeEnemy (line 752) | bool Creature_CanSeeEnemy(const ITEM *const item, const AI_INFO *const i...
function Creature_CanTargetEnemy (line 786) | bool Creature_CanTargetEnemy(const ITEM *const item, const AI_INFO *cons...
function Creature_Collision (line 821) | void Creature_Collision(
function Creature_Animate (line 865) | bool Creature_Animate(
function Creature_SpecialKill (line 1189) | void Creature_SpecialKill(
function Creature_TestBoxDamage (line 1215) | void Creature_TestBoxDamage(const int16_t item_num)
function Creature_Die (line 1242) | void Creature_Die(const int16_t item_num, const bool explode)
function Creature_Vault (line 1302) | int32_t Creature_Vault(
function Creature_Effect (line 1363) | int16_t Creature_Effect(
function Creature_AIGuard (line 1374) | int16_t Creature_AIGuard(CREATURE *const creature)
function M_SameZone (line 1404) | static bool M_SameZone(const CREATURE *const creature, ITEM *const targe...
function Creature_GetAITarget (line 1424) | void Creature_GetAITarget(CREATURE *const creature)
FILE: src/trx/game/creature/enum.h
type MOOD_TYPE (line 3) | typedef enum {
FILE: src/trx/game/creature/shooting.c
function M_CalcShootVectors (line 17) | static void M_CalcShootVectors(
function M_TriggerTR3GunShell (line 40) | static void M_TriggerTR3GunShell(
function M_TriggerTR3GunSmoke (line 70) | static void M_TriggerTR3GunSmoke(
function Creature_Shoot (line 88) | bool Creature_Shoot(
FILE: src/trx/game/creature/types.h
type CREATURE (line 7) | typedef struct CREATURE {
type AI_INFO (line 35) | typedef struct {
type BITE (line 46) | typedef struct {
type CREATURE_GUN (line 51) | typedef struct {
type HYBRID_INFO (line 65) | typedef struct {
FILE: src/trx/game/cutscene.c
type M_LARA_CUTSCENE_STATE (line 32) | typedef struct {
function LARA_GUN_TYPE (line 44) | static LARA_GUN_TYPE M_GetGunEquipmentType(const LARA_MESH mesh)
function M_CaptureLaraCutsceneState (line 53) | static void M_CaptureLaraCutsceneState(void)
function M_CaptureObjectMeshesState (line 64) | static void M_CaptureObjectMeshesState(void)
function M_RestoreObjectMeshesState (line 97) | static void M_RestoreObjectMeshesState(void)
function M_RestoreLaraCutsceneState (line 137) | static void M_RestoreLaraCutsceneState(void)
function M_IsCutsceneActor (line 151) | static bool M_IsCutsceneActor(const ITEM *const item)
function M_ResetActorAnimation (line 157) | static void M_ResetActorAnimation(ITEM *const item)
function M_ResetActorsToStart (line 166) | static void M_ResetActorsToStart(void)
function M_ControlGun (line 179) | static void M_ControlGun(void)
function M_DrawGunFlash (line 223) | static void M_DrawGunFlash(const LARA_MESH hand_mesh)
function M_Control (line 248) | static void M_Control(void)
function M_ReplayActors (line 261) | static void M_ReplayActors(
function M_PlayerControl (line 273) | static void M_PlayerControl(const int16_t item_num)
function M_InitialisePlayer (line 297) | static void M_InitialisePlayer(const int16_t item_num)
function M_Skip (line 330) | static void M_Skip(const int32_t frames)
function Cutscene_Start (line 353) | bool Cutscene_Start(const int32_t level_num)
function Cutscene_End (line 372) | void Cutscene_End(void)
function GF_COMMAND (line 382) | GF_COMMAND Cutscene_Control(void)
function Cutscene_Draw (line 422) | void Cutscene_Draw(void)
function CAMERA_INFO (line 439) | CAMERA_INFO *Cutscene_GetCamera(void)
FILE: src/trx/game/demo.c
type M_PRIV (line 41) | typedef struct {
function M_PrepareConfig (line 54) | static void M_PrepareConfig(M_PRIV *const p)
function M_RestoreConfig (line 66) | static void M_RestoreConfig(M_PRIV *const p)
function Demo_LoadData (line 74) | void Demo_LoadData(VFILE *const file, const size_t size)
function Demo_UpdateInput (line 87) | bool Demo_UpdateInput(void)
function Demo_Start (line 156) | bool Demo_Start(const int32_t level_num)
function Demo_End (line 225) | void Demo_End(void)
function Demo_Pause (line 233) | void Demo_Pause(void)
function Demo_Unpause (line 240) | void Demo_Unpause(void)
function Demo_ChooseLevel (line 251) | int32_t Demo_ChooseLevel(const int32_t demo_num)
function GF_COMMAND (line 264) | GF_COMMAND Demo_Control(void)
function Demo_StopFlashing (line 269) | void Demo_StopFlashing(void)
FILE: src/trx/game/effects/draw.c
function Effect_Draw (line 10) | void Effect_Draw(const int16_t effect_num)
FILE: src/trx/game/effects/manager.c
function M_RemoveActive (line 13) | static void M_RemoveActive(const int16_t effect_num)
function M_RemoveDrawn (line 31) | static void M_RemoveDrawn(const int16_t effect_num)
function Effect_InitialiseArray (line 50) | void Effect_InitialiseArray(void)
function Effect_Control (line 62) | void Effect_Control(void)
function EFFECT (line 76) | EFFECT *Effect_Get(const int16_t effect_num)
function Effect_GetIndex (line 81) | int16_t Effect_GetIndex(const EFFECT *const effect)
function Effect_GetInOrderNum (line 86) | int16_t Effect_GetInOrderNum(const int16_t effect_num)
function Effect_GetActiveNum (line 99) | int16_t Effect_GetActiveNum(void)
function Effect_Create (line 104) | int16_t Effect_Create(const int16_t room_num)
function Effect_Kill (line 126) | void Effect_Kill(const int16_t effect_num)
function Effect_KillAllActive (line 137) | void Effect_KillAllActive(void)
function Effect_UpdateRoom (line 153) | void Effect_UpdateRoom(const int16_t effect_num, const int16_t room_num)
FILE: src/trx/game/effects/types.h
type EFFECT (line 7) | typedef struct {
FILE: src/trx/game/enum.c
function M_Init (line 13) | static __attribute__((constructor)) void M_Init(void)
FILE: src/trx/game/events.c
function GameEvent_Init (line 8) | void GameEvent_Init(void)
function GameEvent_Shutdown (line 13) | void GameEvent_Shutdown(void)
function GameEvent_Subscribe (line 19) | int32_t GameEvent_Subscribe(
function GameEvent_Unsubscribe (line 28) | void GameEvent_Unsubscribe(const int32_t listener_id)
function GameEvent_Fire (line 35) | void GameEvent_Fire(const EVENT event)
FILE: src/trx/game/fader.c
function M_Init (line 8) | static void M_Init(FADER *const fader, FADER_ARGS args)
function Fader_InitTo (line 30) | void Fader_InitTo(
function Fader_InitToHold (line 45) | void Fader_InitToHold(
function Fader_InitFromCurrent (line 60) | void Fader_InitFromCurrent(
function Fader_InitFromCurrentHold (line 74) | void Fader_InitFromCurrentHold(
function Fader_GetCurrentValue (line 89) | float Fader_GetCurrentValue(const FADER *const fader)
function Fader_IsActive (line 104) | bool Fader_IsActive(const FADER *const fader)
FILE: src/trx/game/fader.h
type FADER_ARGS (line 7) | typedef struct {
type FADER (line 18) | typedef struct {
FILE: src/trx/game/fmv.c
type M_SURFACE (line 37) | typedef struct {
type M_RENDER_CONTEXT (line 42) | typedef struct {
function OUTPUT_QUAD_SURFACE_DESC (line 48) | static OUTPUT_QUAD_SURFACE_DESC M_MakeSurfaceDesc(
function M_OpenAudioStream (line 67) | static int32_t M_OpenAudioStream(const char *const file_name)
function M_DeallocateSurface (line 107) | static void M_DeallocateSurface(void *const surface, void *const user_data)
function M_ClearSurface (line 114) | static void M_ClearSurface(void *const surface, void *const user_data)
function M_RenderBegin (line 121) | static void M_RenderBegin(void *const surface, void *const user_data)
function M_DrawUI (line 126) | static void M_DrawUI(void)
function M_GetPauseOverlayOpacity (line 137) | static float M_GetPauseOverlayOpacity(const M_RENDER_CONTEXT *const ctx)
function M_ShouldShowPauseText (line 145) | static bool M_ShouldShowPauseText(const M_RENDER_CONTEXT *const ctx)
function M_RenderEnd (line 157) | static void M_RenderEnd(void *const surface, void *const user_data)
function M_UnlockSurface (line 170) | static void M_UnlockSurface(void *const surface, void *const user_data)
function M_UploadSurface (line 174) | static void M_UploadSurface(void *const surface, void *const user_data)
function M_SetPauseText (line 191) | static void M_SetPauseText(const bool show)
function M_RedrawFrame (line 203) | static void M_RedrawFrame(M_RENDER_CONTEXT *const ctx)
function M_Play (line 220) | static bool M_Play(const char *const file_name)
function FMV_Play (line 318) | bool FMV_Play(const char *const file_path)
function FMV_IsPlaying (line 333) | bool FMV_IsPlaying(void)
FILE: src/trx/game/fx/common.c
function FX_Control (line 12) | void FX_Control(void)
function FX_Draw (line 24) | void FX_Draw(void)
function FX_Reset (line 35) | void FX_Reset(void)
FILE: src/trx/game/fx/explosion_ring.c
function M_RotateZX (line 19) | static void M_RotateZX(
function M_RememberRing (line 37) | static void M_RememberRing(FX_RING *const ring)
function M_InterpolateRing (line 44) | static void M_InterpolateRing(const FX_RING *const ring, FX_RING *const ...
function M_BuildRingCircle (line 56) | static void M_BuildRingCircle(
function M_DrawTexturedRing (line 72) | static void M_DrawTexturedRing(const FX_RING *const ring)
function M_DrawFlatRing (line 121) | static void M_DrawFlatRing(const FX_RING *const ring)
function M_ControlExplosionRings (line 174) | static void M_ControlExplosionRings(void)
function M_ControlSummonRings (line 198) | static void M_ControlSummonRings(void)
function M_ControlKnockBackRings (line 223) | static void M_ControlKnockBackRings(void)
function M_DrawExplosionRings (line 252) | static void M_DrawExplosionRings(const int32_t angle_base)
function M_DrawSummonRings (line 307) | static void M_DrawSummonRings(const int32_t angle_base)
function M_DrawKnockBackRings (line 344) | static void M_DrawKnockBackRings(const int32_t angle_base)
function FX_Ring_Reset (line 380) | void FX_Ring_Reset(void)
function FX_Ring_Sync (line 386) | void FX_Ring_Sync(FX_RING *const ring)
function FX_RING (line 394) | FX_RING *FX_Ring_GetRing(const FX_RING_TYPE type, const int32_t idx)
function FX_RING (line 403) | FX_RING *FX_Ring_PeekRing(const FX_RING_TYPE type, const int32_t idx)
function FX_Ring_Control (line 411) | void FX_Ring_Control(void)
function FX_Ring_SpawnKnockBack (line 426) | void FX_Ring_SpawnKnockBack(const XYZ_32 pos)
function FX_Ring_BounceKnockBack (line 444) | void FX_Ring_BounceKnockBack(void)
function FX_Ring_IsRingActive (line 452) | bool FX_Ring_IsRingActive(const FX_RING_TYPE type)
function FX_Ring_Draw (line 457) | void FX_Ring_Draw(void)
FILE: src/trx/game/fx/explosion_ring.h
type FX_EXPLOSION_VERT (line 8) | typedef struct {
type FX_RING (line 13) | typedef struct {
type FX_RING_TYPE (line 26) | typedef enum {
FILE: src/trx/game/fx/footprint.c
type M_FOOTPRINT (line 22) | typedef struct {
type M_PRIV (line 31) | typedef struct {
function FX_Footprint_Reset (line 54) | void FX_Footprint_Reset(void)
function FX_Footprint_Add (line 60) | void FX_Footprint_Add(const ITEM *const lara_item, const bool is_left_foot)
function M_GetWorldPoint (line 101) | static void M_GetWorldPoint(
function M_GetVertexYOffset (line 113) | static int32_t M_GetVertexYOffset(
function FX_Footprint_Control (line 135) | void FX_Footprint_Control(void)
function FX_Footprint_Draw (line 149) | void FX_Footprint_Draw(void)
FILE: src/trx/game/fx/gun_flash.c
type M_GUN_FLASH (line 18) | typedef struct {
type M_PRIV (line 29) | typedef struct {
function M_GetRandomRoll (line 36) | static int16_t M_GetRandomRoll(void)
function M_GetOwnerItem (line 42) | static bool M_GetOwnerItem(
function M_GetJointPose (line 53) | static void M_GetJointPose(
function FX_GunFlash_Spawn (line 92) | bool FX_GunFlash_Spawn(
function FX_GunFlash_Control (line 114) | void FX_GunFlash_Control(void)
function FX_GunFlash_Draw (line 153) | void FX_GunFlash_Draw(void)
FILE: src/trx/game/fx/laser.c
type M_LASER (line 11) | typedef struct {
type M_PRIV (line 20) | typedef struct {
function M_GetOwnerItem (line 27) | static bool M_GetOwnerItem(const M_LASER *const laser, ITEM **const out_...
function FX_Laser_Spawn (line 37) | bool FX_Laser_Spawn(const ITEM *const owner_item, const CREATURE_GUN *co...
function FX_Laser_Control (line 55) | void FX_Laser_Control(void)
function FX_Laser_Draw (line 76) | void FX_Laser_Draw(void)
FILE: src/trx/game/fx/wake.c
function RGBA_8888 (line 18) | static RGBA_8888 M_GrayFromWakeLife(const int32_t life, const int32_t sh...
function XYZ_32 (line 25) | static XYZ_32 M_GetWakeOrigin(const ITEM *const item, const XZ_32 offset)
function FX_Wake_Reset (line 33) | void FX_Wake_Reset(void)
function FX_Wake_Control (line 42) | void FX_Wake_Control(void)
function FX_WAKE_POINT (line 71) | FX_WAKE_POINT *FX_Wake_GetPoint(const int32_t wake_idx, const int32_t side)
function FX_Wake_GetShade (line 76) | uint8_t FX_Wake_GetShade(void)
function FX_Wake_SetShade (line 81) | void FX_Wake_SetShade(const uint8_t shade)
function FX_Wake_GetStartIndex (line 86) | uint8_t FX_Wake_GetStartIndex(void)
function FX_Wake_AdvanceStartIndex (line 91) | void FX_Wake_AdvanceStartIndex(void)
function FX_Wake_Draw (line 97) | void FX_Wake_Draw(const ITEM *const item)
FILE: src/trx/game/fx/wake.h
type FX_WAKE_POINT (line 5) | typedef struct {
FILE: src/trx/game/fx/water.c
function FX_Water_Reset (line 34) | void FX_Water_Reset(void)
function M_IsRoomUnderwater (line 42) | static bool M_IsRoomUnderwater(const int16_t room_num)
function M_RememberRipple (line 47) | static void M_RememberRipple(FX_WATER_RIPPLE *const ripple)
function M_RememberSplash (line 54) | static void M_RememberSplash(FX_WATER_SPLASH *const splash)
function M_GetUnderwaterBloodColor (line 65) | static bool M_GetUnderwaterBloodColor(
function FX_WATER_RIPPLE (line 83) | FX_WATER_RIPPLE *FX_Water_SetupRipple(
function FX_Water_SetupSplash (line 117) | void FX_Water_SetupSplash(const FX_WATER_SPLASH_SETUP *const setup_)
function FX_Water_Splash (line 270) | void FX_Water_Splash(const ITEM *const item)
function FX_Water_WadeSplash (line 305) | void FX_Water_WadeSplash(
function FX_Water_TriggerUnderwaterBlood (line 358) | void FX_Water_TriggerUnderwaterBlood(const XYZ_32 pos, const int32_t size)
function FX_Water_TriggerUnderwaterBloodD (line 382) | void FX_Water_TriggerUnderwaterBloodD(const XYZ_32 pos, const int32_t size)
function RGBA_8888 (line 406) | static RGBA_8888 M_Gray(int32_t c)
function M_DrawSplash (line 412) | static void M_DrawSplash(
function M_DrawRipple (line 474) | static void M_DrawRipple(
function FX_Water_Draw (line 533) | void FX_Water_Draw(void)
function FX_Water_Control (line 559) | void FX_Water_Control(void)
FILE: src/trx/game/fx/water.h
type FX_WATER_RIPPLE (line 8) | typedef struct {
type FX_WATER_SPLASH_VERT (line 21) | typedef struct {
type FX_WATER_SPLASH (line 37) | typedef struct {
type FX_WATER_SPLASH_SETUP (line 48) | typedef struct {
FILE: src/trx/game/fx/water_particles.c
type M_WATER_PARTICLE (line 29) | typedef struct {
function M_IsEnabled (line 40) | static bool M_IsEnabled(void)
function M_Clear (line 50) | static void M_Clear(void)
function M_GetViewDepth (line 55) | static int64_t M_GetViewDepth(const XYZ_32 pos)
function M_GetFixedScale (line 66) | static float M_GetFixedScale(const float unit)
function M_Spawn (line 77) | static void M_Spawn(M_WATER_PARTICLE *const particle)
function FX_WaterParticles_Reset (line 111) | void FX_WaterParticles_Reset(void)
function FX_WaterParticles_Control (line 116) | void FX_WaterParticles_Control(void)
function FX_WaterParticles_Draw (line 153) | void FX_WaterParticles_Draw(void)
FILE: src/trx/game/fx/weather.c
type M_RAINDROP (line 37) | typedef struct {
type M_SNOWFLAKE (line 47) | typedef struct {
function M_ClearWeather (line 63) | static void M_ClearWeather(void)
function M_GetViewDepth (line 69) | static int64_t M_GetViewDepth(const XYZ_32 pos)
function M_SpawnParticle (line 80) | static bool M_SpawnParticle(XYZ_32 *const pos)
function M_SpawnRainDrop (line 106) | static void M_SpawnRainDrop(M_RAINDROP *const drop)
function M_UpdateRain (line 121) | static void M_UpdateRain(void)
function M_DrawRain (line 183) | static void M_DrawRain(void)
function M_SpawnSnowflake (line 219) | static void M_SpawnSnowflake(M_SNOWFLAKE *const snow)
function M_UpdateSnow (line 236) | static void M_UpdateSnow(void)
function M_DrawSnow (line 317) | static void M_DrawSnow(void)
function FX_Weather_Reset (line 413) | void FX_Weather_Reset(void)
function WEATHER_TYPE (line 418) | WEATHER_TYPE FX_Weather_GetWeather(void)
function FX_Weather_SetWeather (line 423) | void FX_Weather_SetWeather(const WEATHER_TYPE weather_type)
function FX_Weather_Control (line 428) | void FX_Weather_Control(void)
function FX_Weather_Draw (line 441) | void FX_Weather_Draw(void)
FILE: src/trx/game/fx/weather.h
type WEATHER_TYPE (line 5) | typedef enum {
FILE: src/trx/game/game/control.c
function Game_Start (line 41) | bool Game_Start(const GF_LEVEL *const level, const GF_SEQUENCE_CONTEXT s...
function Game_End (line 65) | void Game_End(void)
function GF_COMMAND (line 71) | GF_COMMAND Game_Control(const bool demo_mode)
function Game_ProcessInput (line 236) | void Game_ProcessInput(void)
FILE: src/trx/game/game/draw.c
function Game_Draw (line 7) | void Game_Draw(const bool draw_overlay)
FILE: src/trx/game/game/enum.h
type GAME_BONUS_FLAG (line 3) | typedef enum {
FILE: src/trx/game/game/state.c
function Game_SetIsPlaying (line 15) | void Game_SetIsPlaying(const bool is_playing)
function Game_IsPlaying (line 21) | bool Game_IsPlaying(void)
function GF_LEVEL (line 26) | const GF_LEVEL *Game_GetCurrentLevel(void)
function Game_SetCurrentLevel (line 31) | void Game_SetCurrentLevel(const GF_LEVEL *const level)
function Game_IsInGym (line 36) | bool Game_IsInGym(void)
function Game_IsLoaded (line 42) | bool Game_IsLoaded(void)
function Game_IsPlayable (line 54) | bool Game_IsPlayable(void)
function GAME_BONUS_FLAG (line 75) | GAME_BONUS_FLAG Game_GetBonusFlag(void)
function Game_SetBonusFlag (line 80) | void Game_SetBonusFlag(const GAME_BONUS_FLAG flag)
function Game_IsBonusFlagSet (line 85) | bool Game_IsBonusFlagSet(const GAME_BONUS_FLAG flag)
function Game_SetIsLevelComplete (line 90) | void Game_SetIsLevelComplete(const bool is_complete)
function Game_IsLevelComplete (line 95) | bool Game_IsLevelComplete(void)
FILE: src/trx/game/game_buf.c
function GameBuf_Init (line 8) | void GameBuf_Init(void)
function GameBuf_Reset (line 15) | void GameBuf_Reset(void)
function GameBuf_ResetSingle (line 22) | void GameBuf_ResetSingle(const GAME_BUFFER buffer)
function GameBuf_Shutdown (line 27) | void GameBuf_Shutdown(void)
FILE: src/trx/game/game_buf.h
type GAME_BUFFER (line 13) | typedef enum {
FILE: src/trx/game/game_flow/common.c
function M_SkipLevel (line 10) | static bool M_SkipLevel(const GF_LEVEL *const level)
function M_FreeSequence (line 15) | static void M_FreeSequence(GF_SEQUENCE *const sequence)
function M_FreeInjections (line 20) | static void M_FreeInjections(INJECTION_DATA *const injections)
function M_FreeLevel (line 31) | static void M_FreeLevel(GF_LEVEL *const level)
function M_FreeLevelTable (line 49) | static void M_FreeLevelTable(GF_LEVEL_TABLE *const level_table)
function M_FreeFMVs (line 60) | static void M_FreeFMVs(GAME_FLOW *const gf)
function GF_Init (line 69) | void GF_Init(void)
function GF_Shutdown (line 73) | void GF_Shutdown(void)
function GF_OverrideCommand (line 105) | void GF_OverrideCommand(const GF_COMMAND command)
function GF_COMMAND (line 110) | GF_COMMAND GF_GetOverrideCommand(void)
function GF_LEVEL_TABLE_TYPE (line 115) | GF_LEVEL_TABLE_TYPE GF_GetLevelTableType(const GF_LEVEL_TYPE level_type)
function GF_LEVEL_TABLE (line 138) | const GF_LEVEL_TABLE *GF_GetLevelTable(
function GF_GetLevelCount (line 144) | int32_t GF_GetLevelCount(const GF_LEVEL_TABLE_TYPE level_table_type)
function GF_GetLevelOrdinalNumber (line 158) | int32_t GF_GetLevelOrdinalNumber(
function GF_LEVEL (line 179) | GF_LEVEL *GF_GetLevelByOrdinalNumber(
function GF_LEVEL (line 192) | const GF_LEVEL *GF_GetCurrentLevel(void)
function GF_LEVEL (line 197) | const GF_LEVEL *GF_GetTitleLevel(void)
function GF_LEVEL (line 202) | const GF_LEVEL *GF_GetGymLevel(void)
function GF_LEVEL (line 214) | const GF_LEVEL *GF_GetFirstLevel(void)
function GF_LEVEL (line 227) | const GF_LEVEL *GF_GetLastLevel(void)
function GF_LEVEL (line 241) | const GF_LEVEL *GF_GetLevel(
function GF_LEVEL (line 257) | const GF_LEVEL *GF_GetLevelAfter(const GF_LEVEL *const level)
function GF_LEVEL (line 275) | const GF_LEVEL *GF_GetLevelBefore(const GF_LEVEL *const level)
function GF_SetCurrentLevel (line 293) | void GF_SetCurrentLevel(const GF_LEVEL *const level)
function GF_SetLevelTitle (line 298) | void GF_SetLevelTitle(GF_LEVEL *const level, const char *const title)
FILE: src/trx/game/game_flow/enum.h
type GF_LEVEL_TABLE_TYPE (line 3) | typedef enum {
type GF_LEVEL_TYPE (line 12) | typedef enum {
type GF_SEQUENCE_CONTEXT (line 27) | typedef enum {
type GF_ACTION (line 35) | typedef enum {
type GF_SEQUENCE_EVENT_TYPE (line 52) | typedef enum {
type GF_DEATH_TILE (line 78) | typedef enum {
FILE: src/trx/game/game_flow/inventory.c
function M_CanHaveItem (line 19) | static bool M_CanHaveItem(const OBJECT_ID object_id)
function M_ResumeInfo_HasWeapon (line 33) | static bool M_ResumeInfo_HasWeapon(
function M_ResumeInfo_SetWeapon (line 54) | static void M_ResumeInfo_SetWeapon(
function M_ResumeInfo_AddAmmo (line 76) | static void M_ResumeInfo_AddAmmo(
function M_ResumeInfo_AddItem (line 97) | static void M_ResumeInfo_AddItem(
function M_ModifyResumeInfo_GunOrAmmo (line 119) | static void M_ModifyResumeInfo_GunOrAmmo(
function M_ModifyResumeInfo_Item (line 140) | static void M_ModifyResumeInfo_Item(
function M_CollectNewPickup (line 150) | static void M_CollectNewPickup(const OBJECT_ID object_id)
function M_ModifyInventory_GunOrAmmo (line 156) | static void M_ModifyInventory_GunOrAmmo(
function M_ModifyInventory_Item (line 214) | static void M_ModifyInventory_Item(
function GF_InventoryModifier_Scan (line 236) | void GF_InventoryModifier_Scan(const GF_LEVEL *const level)
function GF_GetSecretRewardCount (line 278) | int32_t GF_GetSecretRewardCount(const GF_LEVEL *const level)
function GF_InventoryModifier_ApplyToResumeInfo (line 296) | void GF_InventoryModifier_ApplyToResumeInfo(const GF_LEVEL *const level)
function GF_InventoryModifier_Apply (line 376) | void GF_InventoryModifier_Apply(
FILE: src/trx/game/game_flow/reader.c
type M_CONTEXT (line 22) | typedef struct {
type M_SEQUENCE_EVENT_HANDLER (line 38) | typedef struct {
function M_ExitWithJSONError (line 89) | static void M_ExitWithJSONError(const M_CONTEXT *const ctx)
function M_ReadObjectID (line 96) | static bool M_ReadObjectID(
function M_SEQUENCE_EVENT_HANDLER (line 114) | static M_SEQUENCE_EVENT_HANDLER *M_GetSequenceEventHandlers(void)
function M_ReadPath (line 125) | static bool M_ReadPath(
function M_LoadSettings (line 196) | static bool M_LoadSettings(
function M_LoadLevelItemDrops (line 260) | static bool M_LoadLevelItemDrops(
function M_CopyRootSettingsIntoLevel (line 313) | static void M_CopyRootSettingsIntoLevel(
function M_ReadModMeta (line 321) | static void M_ReadModMeta(JSON_READ_IO *const io, GF_MOD_META *const meta)
function M_LoadRoot (line 340) | static bool M_LoadRoot(const M_CONTEXT *const ctx)
function M_LoadGlobeEntry (line 398) | static bool M_LoadGlobeEntry(
function M_DECLARE_SEQUENCE_EVENT_HANDLER_FUNC (line 437) | static M_DECLARE_SEQUENCE_EVENT_HANDLER_FUNC(M_HandleIntEvent)
function M_DECLARE_SEQUENCE_EVENT_HANDLER_FUNC (line 448) | static M_DECLARE_SEQUENCE_EVENT_HANDLER_FUNC(M_HandlePictureEvent)
function M_DECLARE_SEQUENCE_EVENT_HANDLER_FUNC (line 484) | static M_DECLARE_SEQUENCE_EVENT_HANDLER_FUNC(M_HandleTotalStatsEvent)
function M_DECLARE_SEQUENCE_EVENT_HANDLER_FUNC (line 507) | static M_DECLARE_SEQUENCE_EVENT_HANDLER_FUNC(M_HandleAddItemEvent)
function M_DECLARE_SEQUENCE_EVENT_HANDLER_FUNC (line 527) | static M_DECLARE_SEQUENCE_EVENT_HANDLER_FUNC(M_HandleGlobeSelectEvent)
function M_LoadArray (line 555) | static bool M_LoadArray(
function M_LoadGlobeSelectEntries (line 580) | static bool M_LoadGlobeSelectEntries(const M_CONTEXT *const ctx)
function M_LoadSequenceEvent (line 590) | static int32_t M_LoadSequenceEvent(
function M_LoadSequence (line 629) | static bool M_LoadSequence(
function M_LoadLevelInjections (line 677) | static bool M_LoadLevelInjections(
function M_LoadLevelSequence (line 729) | static bool M_LoadLevelSequence(
function M_LoadLevel (line 745) | static bool M_LoadLevel(
function M_LoadLevelTable (line 854) | static bool M_LoadLevelTable(
function M_LoadLevels (line 864) | static bool M_LoadLevels(const M_CONTEXT *const ctx)
function M_LoadCutscenes (line 873) | static bool M_LoadCutscenes(const M_CONTEXT *const ctx)
function M_LoadDemos (line 879) | static bool M_LoadDemos(const M_CONTEXT *const ctx)
function M_LoadTitleLevel (line 885) | static bool M_LoadTitleLevel(const M_CONTEXT *const ctx)
function M_LoadFMV (line 897) | static bool M_LoadFMV(
function M_LoadFMVs (line 913) | static bool M_LoadFMVs(const M_CONTEXT *const ctx)
function M_LoadGlobalInjections (line 921) | static bool M_LoadGlobalInjections(const M_CONTEXT *const ctx)
function M_LoadGameFlowDoc (line 944) | static bool M_LoadGameFlowDoc(
function M_LoadGameFlowEx (line 983) | static bool M_LoadGameFlowEx(
function GF_LoadFromFile (line 997) | void GF_LoadFromFile(const char *const path)
function GF_TryLoadFromFile (line 1002) | bool GF_TryLoadFromFile(const char *const path)
function GF_ValidateMod (line 1007) | bool GF_ValidateMod(const char *const mod_name, const char *const path)
function GF_ReadModMeta (line 1017) | bool GF_ReadModMeta(const char *const path, GF_MOD_META *const meta)
FILE: src/trx/game/game_flow/sequencer.c
function GF_COMMAND (line 15) | static GF_COMMAND M_RunEvent(
function M_PreSequenceHook (line 43) | static void M_PreSequenceHook(
function GF_SEQUENCE_CONTEXT (line 55) | static GF_SEQUENCE_CONTEXT M_SwitchSequenceContext(
function GF_LEVEL (line 72) | static const GF_LEVEL *M_GetCanonicalNextLevel(const GF_LEVEL *const level)
function GF_LEVEL (line 78) | static const GF_LEVEL *M_GetLinkedPrevLevel(const GF_LEVEL *const level)
function M_IsLevelDescendantOf (line 90) | static bool M_IsLevelDescendantOf(
function GF_COMMAND (line 117) | GF_COMMAND GF_InterpretSequence(
FILE: src/trx/game/game_flow/sequencer_events.c
function M_FinishLevelBasic (line 66) | static void M_FinishLevelBasic(void)
function GF_LEVEL (line 82) | static const GF_LEVEL *M_GetCanonicalNextLevel(const GF_LEVEL *const level)
function M_GF_HANDLER (line 89) | M_GF_HANDLER(M_HandleExitToTitle)
function M_GF_HANDLER (line 94) | M_GF_HANDLER(M_HandleLevelComplete)
function M_GF_HANDLER (line 120) | M_GF_HANDLER(M_HandlePlayLevel)
function M_GF_HANDLER (line 190) | M_GF_HANDLER(M_HandlePlayCutscene)
function M_GF_HANDLER (line 208) | M_GF_HANDLER(M_HandlePlayFMV)
function M_GF_HANDLER (line 231) | M_GF_HANDLER(M_HandlePlayMusic)
function M_GF_HANDLER (line 241) | M_GF_HANDLER(M_HandlePicture)
function M_GF_HANDLER (line 289) | M_GF_HANDLER(M_HandleInventoryModifier)
function M_GF_HANDLER (line 295) | M_GF_HANDLER(M_HandleLevelStats)
function M_GF_HANDLER (line 314) | M_GF_HANDLER(M_HandleTotalStats)
function M_GF_HANDLER (line 336) | M_GF_HANDLER(M_HandleGlobeSelect)
function M_GF_HANDLER (line 362) | M_GF_HANDLER(M_HandleSetStartAnim)
function M_GF_HANDLER (line 372) | M_GF_HANDLER(M_HandleEnableSunset)
function M_GF_HANDLER (line 381) | M_GF_HANDLER(M_HandleSetupBaconLara)
function M_GF_HANDLER (line 395) | M_GF_HANDLER(M_HandleDisableFloor)
function GF_SEQUENCE_EVENT_HANDLER (line 405) | GF_SEQUENCE_EVENT_HANDLER GF_GetSequenceEventHandler(
FILE: src/trx/game/game_flow/sequencer_events.h
type GF_COMMAND (line 5) | typedef GF_COMMAND (*GF_SEQUENCE_EVENT_HANDLER)(
FILE: src/trx/game/game_flow/sequencer_misc.c
function GF_COMMAND (line 18) | GF_COMMAND GF_RunTitle(void)
function GF_COMMAND (line 29) | GF_COMMAND GF_EnterPhotoMode(void)
function GF_COMMAND (line 37) | GF_COMMAND GF_PauseGame(void)
function GF_COMMAND (line 45) | GF_COMMAND GF_ShowInventory(const INVENTORY_MODE mode)
function GF_ShowInventoryKeys (line 53) | bool GF_ShowInventoryKeys(const OBJECT_ID receptacle_type_id)
function GF_COMMAND (line 72) | GF_COMMAND GF_RunDemo(const int32_t demo_num)
function GF_COMMAND (line 80) | GF_COMMAND GF_RunCutscene(const int32_t cutscene_num, const bool cross_f...
function GF_COMMAND (line 91) | GF_COMMAND GF_RunGame(
function GF_COMMAND (line 100) | GF_COMMAND GF_RunGlobeSelect(const char *const background_path)
function GF_COMMAND (line 110) | GF_COMMAND GF_DoFrontendSequence(void)
function GF_COMMAND (line 149) | GF_COMMAND GF_DoLevelSequence(
function GF_COMMAND (line 173) | GF_COMMAND GF_DoDemoSequence(int32_t demo_num)
function GF_COMMAND (line 187) | GF_COMMAND GF_DoCutsceneSequence(
function GF_COMMAND (line 199) | GF_COMMAND GF_PlayAvailableStory(const SAVEGAME_SLOT_REF slot)
function GF_HasAvailableStory (line 226) | bool GF_HasAvailableStory(const SAVEGAME_SLOT_REF slot)
FILE: src/trx/game/game_flow/types.h
type GF_COMMAND (line 10) | typedef struct GF_COMMAND {
type GF_SEQUENCE_EVENT (line 19) | typedef struct {
type GF_SEQUENCE (line 24) | typedef struct {
type GF_DISPLAY_PICTURE_DATA (line 31) | typedef struct {
type GF_GLOBE_SELECT_DATA (line 40) | typedef struct {
type GF_INV_TYPE (line 44) | typedef enum {
type GF_ADD_ITEM_DATA (line 49) | typedef struct {
type INJECTION_DATA (line 59) | typedef struct {
type GF_FMV (line 64) | typedef struct {
type GF_AMBIENT_DATA (line 70) | typedef struct {
type GF_LEVEL_SETTINGS (line 76) | typedef struct {
type GF_DROP_ITEM_DATA (line 104) | typedef struct {
type GF_LEVEL (line 110) | typedef struct {
type GF_LEVEL_TABLE (line 140) | typedef struct {
type GF_GLOBE_ENTRY (line 145) | typedef struct {
type GF_MOD_META (line 157) | typedef struct {
type GAME_FLOW (line 167) | typedef struct {
FILE: src/trx/game/game_flow/util.c
function M_DisableObject (line 9) | static void M_DisableObject(const OBJECT_ID object_id)
function M_ReplaceObject (line 20) | static void M_ReplaceObject(
function GF_DisableObjectsIfNeeded (line 31) | void GF_DisableObjectsIfNeeded(void)
function GF_BadGetLevelNum (line 59) | int32_t GF_BadGetLevelNum(void)
function GF_BadIsMod (line 64) | bool GF_BadIsMod(const char *const mod)
FILE: src/trx/game/game_strings/entries.c
type M_SLOT (line 8) | typedef struct M_SLOT {
type M_STRING_ENTRY (line 12) | typedef struct {
function GameString_Init (line 20) | void GameString_Init(void)
function GameString_Shutdown (line 25) | void GameString_Shutdown(void)
function GameString_Define (line 30) | void GameString_Define(const char *const key, const char *value)
function GameString_IsKnown (line 47) | bool GameString_IsKnown(const char *const key)
function GameString_Clear (line 68) | void GameString_Clear(void)
FILE: src/trx/game/game_strings/manager.c
type M_FILE_ENTRY (line 15) | typedef struct {
type M_LANG_ENTRY (line 20) | typedef struct {
function M_ClearFileEntries (line 31) | static void M_ClearFileEntries(VECTOR *const files)
function M_ClearLanguageEntries (line 40) | static void M_ClearLanguageEntries(void)
function M_ClearManager (line 55) | static void M_ClearManager(void)
function M_LANG_ENTRY (line 64) | static M_LANG_ENTRY *M_FindLangEntry(const char *const lang)
function M_AddPathForLang (line 76) | static void M_AddPathForLang(
function M_LoadLanguageNames (line 95) | static void M_LoadLanguageNames(void)
function M_ReorderLanguages (line 138) | static void M_ReorderLanguages(void)
function GameStringManager_Init (line 177) | void GameStringManager_Init(void)
function GameStringManager_Shutdown (line 184) | void GameStringManager_Shutdown(void)
function GameStringManager_ClearSourceFiles (line 196) | void GameStringManager_ClearSourceFiles(void)
function GameStringManager_AddSourceFile (line 205) | void GameStringManager_AddSourceFile(
function GameStringManager_DiscoverLanguages (line 219) | void GameStringManager_DiscoverLanguages(void)
function VECTOR (line 279) | VECTOR *GameStringManager_GetAvailableLanguages(void)
function M_ReloadLangRec (line 295) | static bool M_ReloadLangRec(const char *const lang, VECTOR *const visited)
function GameStringManager_ReloadLanguage (line 323) | bool GameStringManager_ReloadLanguage(const char *lang)
function GameStringManager_SubscribeReload (line 359) | int32_t GameStringManager_SubscribeReload(
function GameStringManager_UnsubscribeReload (line 367) | void GameStringManager_UnsubscribeReload(const int32_t listener_id)
FILE: src/trx/game/game_strings/table/common.c
function M_Apply (line 17) | static void M_Apply(const GS_TABLE *const table)
function M_ApplyLevelTitles (line 46) | static void M_ApplyLevelTitles(
function M_ApplyLayer (line 65) | static void M_ApplyLayer(
function GameStringTable_Apply (line 96) | void GameStringTable_Apply(const GF_LEVEL *const level)
function GameStringTable_Init (line 106) | void GameStringTable_Init(void)
function GameStringTable_Shutdown (line 111) | void GameStringTable_Shutdown(void)
function GameStringTable_Load (line 123) | bool GameStringTable_Load(const char *const path, const bool load_levels)
FILE: src/trx/game/game_strings/table/priv.c
function M_FreeTable (line 7) | static void M_FreeTable(GS_TABLE *const gs_table)
function M_FreeLevelsTable (line 42) | static void M_FreeLevelsTable(GS_LEVEL_TABLE *const levels)
function GS_File_Free (line 54) | void GS_File_Free(GS_FILE *const gs_file)
FILE: src/trx/game/game_strings/table/priv.h
type GS_OBJECT_ENTRY (line 8) | typedef struct {
type GS_GAME_STRING_ENTRY (line 14) | typedef struct {
type GS_TABLE (line 19) | typedef struct {
type GS_LEVEL (line 24) | typedef struct {
type GS_LEVEL_TABLE (line 29) | typedef struct {
type GS_FILE (line 34) | typedef struct {
FILE: src/trx/game/game_strings/table/reader.c
type M_STACK_ITEM (line 14) | typedef struct {
function M_AppendGameStringEntry (line 19) | static void M_AppendGameStringEntry(
function M_LoadNestedGameStrings (line 35) | static void M_LoadNestedGameStrings(
function M_LoadTableFromJSON (line 94) | static void M_LoadTableFromJSON(
function M_LoadLevelsFromJSON (line 192) | static void M_LoadLevelsFromJSON(
function GS_FILE (line 240) | GS_FILE *GS_File_CreateFromPath(const char *const path, const bool load_...
FILE: src/trx/game/gun/common.c
function M_IsGunType (line 12) | static bool M_IsGunType(
function M_GetAmmoQuantity (line 18) | static int32_t M_GetAmmoQuantity(
function Gun_AddDynamicLight (line 24) | void Gun_AddDynamicLight(void)
function OBJECT_ID (line 45) | OBJECT_ID Gun_GetLaraAnim(const LARA_GUN_TYPE gun_type)
function OBJECT_ID (line 52) | OBJECT_ID Gun_GetWeaponAnim(const LARA_GUN_TYPE gun_type)
function LARA_GUN_TYPE (line 75) | LARA_GUN_TYPE Gun_GetType(const OBJECT_ID obj_id)
function OBJECT_ID (line 95) | OBJECT_ID Gun_GetGunObject(const LARA_GUN_TYPE gun_type)
function OBJECT_ID (line 115) | OBJECT_ID Gun_GetAmmoObject(const LARA_GUN_TYPE gun_type)
function Gun_GetAmmoInitialQuantity (line 135) | int32_t Gun_GetAmmoInitialQuantity(const LARA_GUN_TYPE gun_type)
function Gun_GetAmmoPickupQuantity (line 140) | int32_t Gun_GetAmmoPickupQuantity(const LARA_GUN_TYPE gun_type)
function Gun_GetAmmoClipCount (line 145) | int32_t Gun_GetAmmoClipCount(const LARA_GUN_TYPE gun_type)
function Gun_GetAmmoShellCount (line 150) | int32_t Gun_GetAmmoShellCount(const LARA_GUN_TYPE gun_type)
function AMMO_INFO (line 155) | AMMO_INFO *Gun_GetAmmoInfo(const LARA_GUN_TYPE gun_type)
function Gun_IsRifleType (line 180) | bool Gun_IsRifleType(const LARA_GUN_TYPE gun_type)
function Gun_SetLaraHandLMesh (line 185) | void Gun_SetLaraHandLMesh(const LARA_GUN_TYPE weapon_type)
function Gun_SetLaraHandRMesh (line 190) | void Gun_SetLaraHandRMesh(const LARA_GUN_TYPE weapon_type)
function Gun_SetLaraBackMesh (line 195) | void Gun_SetLaraBackMesh(const LARA_GUN_TYPE weapon_type)
function Gun_SetLaraHolsterLMesh (line 202) | void Gun_SetLaraHolsterLMesh(const LARA_GUN_TYPE weapon_type)
function Gun_SetLaraHolsterRMesh (line 209) | void Gun_SetLaraHolsterRMesh(const LARA_GUN_TYPE weapon_type)
FILE: src/trx/game/gun/control.c
function M_CheckSmashablesBehindTarget (line 47) | static void M_CheckSmashablesBehindTarget(
function M_IsUsableUnderwater (line 86) | static bool M_IsUsableUnderwater(const LARA_GUN_TYPE gun_type)
function M_IsTooSubmerged (line 91) | static bool M_IsTooSubmerged(const LARA_GUN_TYPE gun_type)
function LARA_GUN_TYPE (line 97) | static LARA_GUN_TYPE M_NeedToQuickDraw(void)
function M_QuickDrawWeapon (line 110) | static bool M_QuickDrawWeapon(void)
function M_CanEquip (line 121) | static bool M_CanEquip(void)
function M_HasWeaponAnim (line 160) | static bool M_HasWeaponAnim(const LARA_GUN_TYPE gun_type)
function M_NeedToDraw (line 166) | static bool M_NeedToDraw(void)
function M_NeedToUndraw (line 175) | static bool M_NeedToUndraw(void)
function M_DecideRequestedWeapon (line 203) | static void M_DecideRequestedWeapon(void)
function M_DrawRequestedWeapon (line 237) | static void M_DrawRequestedWeapon(void)
function M_TryUndrawWeapon (line 270) | static void M_TryUndrawWeapon(void)
function M_UpdateGunState (line 281) | static void M_UpdateGunState(void)
function Gun_Control (line 303) | void Gun_Control(void)
function Gun_EnsureReady (line 456) | void Gun_EnsureReady(void)
function Gun_FireWeapon (line 464) | int32_t Gun_FireWeapon(
FILE: src/trx/game/gun/misc.c
function M_TargetListContains (line 29) | static bool M_TargetListContains(const ITEM *const item, const int16_t c...
type M_TARGET_CONTEXT (line 39) | typedef struct {
function M_ConsiderTarget (line 55) | static void M_ConsiderTarget(M_TARGET_CONTEXT *const ctx, ITEM *const item)
function M_DrawGunGlow (line 121) | static void M_DrawGunGlow(const XYZ_32 offset, const RGB_F color)
function Gun_FindTargetPoint (line 143) | void Gun_FindTargetPoint(const ITEM *const item, GAME_VECTOR *const target)
function Gun_AimWeapon (line 157) | void Gun_AimWeapon(const WEAPON_INFO *const weapon, LARA_ARM *const arm)
function Gun_TargetInfo (line 188) | void Gun_TargetInfo(const WEAPON_INFO *const weapon)
function Gun_InitialiseNewWeapon (line 254) | void Gun_InitialiseNewWeapon(void)
function Gun_DrawFlash (line 307) | void Gun_DrawFlash(
function Gun_UpdateLaraMeshes (line 375) | void Gun_UpdateLaraMeshes(const OBJECT_ID obj_id)
function Gun_HitTarget (line 422) | void Gun_HitTarget(
function Gun_GetNewTarget (line 509) | void Gun_GetNewTarget(const WEAPON_INFO *const weapon)
function Gun_ChangeTarget (line 599) | void Gun_ChangeTarget(const WEAPON_INFO *const weapon)
FILE: src/trx/game/gun/pistols.c
type LARA_PISTOLS_ANIMATION (line 18) | typedef enum {
type M_FRAME_SETUP (line 27) | typedef struct {
function M_EnableFastSound (line 67) | static bool M_EnableFastSound(const LARA_GUN_TYPE weapon_type)
function M_FireSound (line 72) | static void M_FireSound(const SAMPLE_TRX_ID sample_trx_id, const bool al...
function M_FRAME_SETUP (line 84) | static const M_FRAME_SETUP *M_GetSetup(const LARA_GUN_TYPE weapon_type)
function M_SetArmInfo (line 90) | static void M_SetArmInfo(LARA_ARM *const arm, const int32_t frame)
function M_Animate (line 119) | static void M_Animate(const LARA_GUN_TYPE weapon_type)
function Gun_Pistols_Control (line 242) | void Gun_Pistols_Control(const LARA_GUN_TYPE weapon_type)
function Gun_Pistols_Draw (line 300) | void Gun_Pistols_Draw(const LARA_GUN_TYPE weapon_type)
function Gun_Pistols_Undraw (line 320) | void Gun_Pistols_Undraw(const LARA_GUN_TYPE weapon_type)
function Gun_Pistols_Ready (line 389) | void Gun_Pistols_Ready(const LARA_GUN_TYPE weapon_type)
function Gun_Pistols_DrawMeshes (line 418) | void Gun_Pistols_DrawMeshes(const LARA_GUN_TYPE weapon_type)
function Gun_Pistols_UndrawMeshLeft (line 428) | void Gun_Pistols_UndrawMeshLeft(const LARA_GUN_TYPE weapon_type)
function Gun_Pistols_UndrawMeshRight (line 437) | void Gun_Pistols_UndrawMeshRight(const LARA_GUN_TYPE weapon_type)
FILE: src/trx/game/gun/rifle.c
type M_ANIM (line 28) | typedef enum {
function M_SetTR3ProjectileShade (line 44) | static void M_SetTR3ProjectileShade(ITEM *const item)
function M_ANIM (line 56) | static M_ANIM M_GetReadyAnim(const LARA_GUN_TYPE weapon_type)
function M_AnimateGun (line 69) | static void M_AnimateGun(ITEM *const item)
function M_Ready (line 80) | static void M_Ready(const LARA_GUN_TYPE weapon_type)
function M_FireGeneric (line 109) | static void M_FireGeneric(const LARA_GUN_TYPE weapon_type)
function M_FireM16 (line 146) | static void M_FireM16(const bool running, const LARA_GUN_TYPE weapon_type)
function M_FireHarpoon (line 174) | static void M_FireHarpoon(void)
function M_FireGrenade (line 274) | static void M_FireGrenade(void)
function M_FireRocket (line 364) | static void M_FireRocket(void)
function M_Fire (line 451) | static void M_Fire(const LARA_GUN_TYPE weapon_type, const bool running)
function M_PlayMachineGunSound (line 477) | static void M_PlayMachineGunSound(
function M_Animate (line 499) | static void M_Animate(const LARA_GUN_TYPE weapon_type)
function Gun_Rifle_Control (line 612) | void Gun_Rifle_Control(const LARA_GUN_TYPE weapon_type)
function Gun_Rifle_Draw (line 643) | void Gun_Rifle_Draw(const LARA_GUN_TYPE weapon_type)
function Gun_Rifle_Undraw (line 684) | void Gun_Rifle_Undraw(const LARA_GUN_TYPE weapon_type)
function Gun_Rifle_DrawMeshes (line 728) | void Gun_Rifle_DrawMeshes(const LARA_GUN_TYPE weapon_type)
function Gun_Rifle_UndrawMeshes (line 735) | void Gun_Rifle_UndrawMeshes(const LARA_GUN_TYPE weapon_type)
function Gun_Rifle_EnsureReady (line 742) | void Gun_Rifle_EnsureReady(const LARA_GUN_TYPE weapon_type)
FILE: src/trx/game/gun/smashing.c
function GUN_SMASH_POLICY (line 10) | GUN_SMASH_POLICY Gun_GetSmashPolicy(const ITEM *const item)
function Gun_SmashItem (line 24) | void Gun_SmashItem(const int16_t item_num)
function PROJECTILE_HIT (line 54) | PROJECTILE_HIT Gun_SmashItems(
FILE: src/trx/game/gun/smashing.h
type PROJECTILE_HIT (line 5) | typedef enum {
type GUN_SMASH_POLICY (line 11) | typedef enum {
FILE: src/trx/game/gun/smoke.c
function XYZ_32 (line 11) | static XYZ_32 M_GetHandAbsPosition(const LARA_MESH hand, XYZ_32 offset)
function XYZ_32 (line 17) | static XYZ_32 M_GetMuzzleOffset(
function Gun_Smoke_OnFire (line 24) | void Gun_Smoke_OnFire(const LARA_GUN_TYPE weapon_type, const bool is_rig...
function Gun_Smoke_Control (line 80) | void Gun_Smoke_Control(void)
FILE: src/trx/game/gun/types.h
type WEAPON_TYPE (line 7) | typedef enum {
type WEAPON_AMMO_INFO (line 15) | typedef struct {
type WEAPON_INFO (line 21) | typedef struct {
FILE: src/trx/game/gun/vars.c
function M_ReadAngles (line 12) | static void M_ReadAngles(
function M_ReadRGB_F (line 28) | static void M_ReadRGB_F(JSON_VALUE *const value, RGB_F *const target)
function M_ReadXYZ32 (line 44) | static void M_ReadXYZ32(JSON_VALUE *const value, XYZ_32 *const target)
function M_ReadAmmoInfo (line 60) | static void M_ReadAmmoInfo(JSON_OBJECT *const obj, const int32_t type)
function Gun_LoadVars (line 75) | void Gun_LoadVars(const char *const path)
FILE: src/trx/game/gym.c
type M_PRIV (line 21) | typedef struct {
function M_CountAssaultTargets (line 49) | static int32_t M_CountAssaultTargets(void)
function M_ResetAssaultTargets (line 67) | static void M_ResetAssaultTargets(void)
function M_GetBestTime (line 99) | static int32_t M_GetBestTime(void)
function M_StoreCourseTime (line 106) | static bool M_StoreCourseTime(GYM_TRACK_STATS *const stats, const uint32...
function M_IsOnQuadBike (line 131) | static bool M_IsOnQuadBike(void)
function Gym_SetInventoryOpenEnabled (line 137) | void Gym_SetInventoryOpenEnabled(const bool enabled)
function Gym_IsInventoryOpenEnabled (line 143) | bool Gym_IsInventoryOpenEnabled(void)
function Gym_Control (line 152) | void Gym_Control(void)
function M_Assault_Finish (line 183) | static void M_Assault_Finish(void)
function M_Racetrack_Finish (line 240) | static void M_Racetrack_Finish(void)
function GYM_TRACK_TYPE (line 262) | GYM_TRACK_TYPE Gym_TrackManager_GetActiveTrackType(void)
function Gym_TrackManager_HasStats (line 268) | bool Gym_TrackManager_HasStats(const GYM_TRACK_TYPE track)
function GYM_TRACK_STATS (line 280) | const GYM_TRACK_STATS *Gym_TrackManager_GetStats(const GYM_TRACK_TYPE tr...
function Gym_TrackManager_IsTimerDisplay (line 292) | bool Gym_TrackManager_IsTimerDisplay(const GYM_TRACK_TYPE track)
function Gym_TrackManager_IsTimerActive (line 305) | bool Gym_TrackManager_IsTimerActive(const GYM_TRACK_TYPE track)
function Gym_TrackManager_Reset (line 318) | void Gym_TrackManager_Reset(const GYM_TRACK_TYPE track)
function Gym_TrackManager_Start (line 347) | void Gym_TrackManager_Start(const GYM_TRACK_TYPE track)
function Gym_TrackManager_Stop (line 383) | void Gym_TrackManager_Stop(const GYM_TRACK_TYPE track)
function Gym_TrackManager_Finish (line 408) | void Gym_TrackManager_Finish(const GYM_TRACK_TYPE track)
function Gym_TrackManager_AddPenaltySeconds (line 426) | void Gym_TrackManager_AddPenaltySeconds(
function Gym_TrackManager_GetPenaltyDisplayTimer (line 440) | int32_t Gym_TrackManager_GetPenaltyDisplayTimer(const GYM_TRACK_TYPE track)
function Gym_TrackManager_GetPenaltyFrames (line 449) | int32_t Gym_TrackManager_GetPenaltyFrames(const GYM_TRACK_TYPE track)
function Gym_TrackManager_GetTargetPenaltyFrames (line 458) | int32_t Gym_TrackManager_GetTargetPenaltyFrames(const GYM_TRACK_TYPE track)
function Gym_TrackManager_OnPadContact (line 467) | bool Gym_TrackManager_OnPadContact(
function Gym_TrackManager_GetLapTimeDisplayTimer (line 493) | int32_t Gym_TrackManager_GetLapTimeDisplayTimer(const GYM_TRACK_TYPE track)
function Gym_TrackManager_GetLapTime (line 502) | int32_t Gym_TrackManager_GetLapTime(const GYM_TRACK_TYPE track)
function Gym_CanPlayMusicTrack (line 511) | bool Gym_CanPlayMusicTrack(MUSIC_ID *const track_id)
FILE: src/trx/game/gym.h
type GYM_TRACK_TYPE (line 10) | typedef enum {
FILE: src/trx/game/inject/common.c
type M_LOAD_JOB (line 20) | typedef struct {
function M_IsRelevant (line 42) | static bool M_IsRelevant(
function INJECTION_CHUNK (line 98) | static INJECTION_CHUNK M_ReadChunk(const INJECTION *const injection)
function M_InitialiseBlock (line 108) | static void M_InitialiseBlock(
function M_ReadVFile (line 199) | static void M_ReadVFile(
function M_InitialiseInjection (line 258) | static void M_InitialiseInjection(INJECTION *const injection)
function M_LoadFromFile (line 284) | static void M_LoadFromFile(
function M_LoadInjectionJob (line 296) | static void M_LoadInjectionJob(void *const user_data)
function M_IsApplicable (line 302) | static bool M_IsApplicable(const INJECTION *const injection)
function Inject_RegisterTester (line 322) | void Inject_RegisterTester(
function Inject_RegisterHandler (line 329) | void Inject_RegisterHandler(
function Inject_RegisterPaletteMap (line 336) | void Inject_RegisterPaletteMap(const uint16_t *palette_map, const int32_...
function Inject_GetPaletteIndex (line 344) | uint16_t Inject_GetPaletteIndex(const uint16_t index)
function Inject_InitLevel (line 350) | void Inject_InitLevel(const GF_LEVEL *const level, const INJECTION_MODE ...
function Inject_AppendInjection (line 392) | void Inject_AppendInjection(VFILE *const file)
function Inject_AllInjections (line 401) | void Inject_AllInjections(void)
function Inject_Cleanup (line 453) | void Inject_Cleanup(void)
function INJECTION_MESH_META (line 488) | INJECTION_MESH_META Inject_GetRoomMeshMeta(const int32_t room_index)
function Inject_GetDataCount (line 511) | int32_t Inject_GetDataCount(const INJECTION_DATA_TYPE type)
function Inject_GetMaxStaticObject3DId (line 516) | int32_t Inject_GetMaxStaticObject3DId(void)
function Inject_GetMaxStaticObject2DId (line 521) | int32_t Inject_GetMaxStaticObject2DId(void)
function LEVEL_CONTEXT_INFO (line 526) | LEVEL_CONTEXT_INFO Inject_GetCachedInfo(void)
FILE: src/trx/game/inject/data/anims.c
function M_HandleAnimData (line 10) | static void M_HandleAnimData(
function M_CommandEdits (line 101) | static void M_CommandEdits(
FILE: src/trx/game/inject/data/camera.c
function M_ReadVertex (line 5) | static void M_ReadVertex(XYZ_16 *const vertex, VFILE *const file)
function M_HandleCineFrames (line 12) | static void M_HandleCineFrames(
function M_HandleCameraData (line 24) | static void M_HandleCameraData(
FILE: src/trx/game/inject/data/meshes.c
function M_HandleMeshData (line 7) | static void M_HandleMeshData(
FILE: src/trx/game/inject/data/objects.c
function M_ReadBounds16 (line 8) | static void M_ReadBounds16(BOUNDS_16 *const bounds, VFILE *const file)
function M_AlignTextureReferences (line 18) | static void M_AlignTextureReferences(
function M_ReadObject (line 35) | static void M_ReadObject(const INJECTION_CHUNK chunk)
function M_ReadStaticObject3D (line 80) | static void M_ReadStaticObject3D(const INJECTION_CHUNK chunk)
function M_HandleObjectData (line 107) | static void M_HandleObjectData(
FILE: src/trx/game/inject/data/sound.c
function M_HandleSFXData (line 8) | static void M_HandleSFXData(
FILE: src/trx/game/inject/data/textures.c
function M_RemapRGB8 (line 12) | static uint16_t M_RemapRGB8(const RGB_888 rgb)
function M_HandlePalette (line 32) | static void M_HandlePalette(
function M_HandleTexturePages (line 48) | static void M_HandleTexturePages(
function M_HandleSpriteSequences (line 79) | static void M_HandleSpriteSequences(
function M_HandleTextureData (line 113) | static void M_HandleTextureData(
function M_HandleTextureInfo (line 142) | static void M_HandleTextureInfo(
FILE: src/trx/game/inject/editor.c
function M_HandleDataEdits (line 8) | static void M_HandleDataEdits(
function Inject_RegisterEditor (line 28) | void Inject_RegisterEditor(
FILE: src/trx/game/inject/editors/anims.c
function M_FrameEdits (line 6) | static void M_FrameEdits(
function M_FrameReplacements (line 29) | static void M_FrameReplacements(
function M_AnimEdits (line 57) | static void M_AnimEdits(
FILE: src/trx/game/inject/editors/floor_data.c
function M_TriggerTypeChange (line 13) | static void M_TriggerTypeChange(
function M_TriggerParameterChange (line 22) | static void M_TriggerParameterChange(
function M_SetMusicOneShot (line 57) | static void M_SetMusicOneShot(const SECTOR *const sector)
function M_FixGlideCamera (line 72) | static void M_FixGlideCamera(
function M_InsertFloorData (line 115) | static void M_InsertFloorData(
function M_RoomShift (line 145) | static void M_RoomShift(
function M_TriggeredItem (line 192) | static void M_TriggeredItem(const INJECTION *const injection)
function M_RoomProperties (line 240) | static void M_RoomProperties(
function M_SectorOverwrite (line 255) | static void M_SectorOverwrite(
function M_FixZones (line 277) | static void M_FixZones(
function M_SetSectorPortals (line 301) | static void M_SetSectorPortals(
function M_SetSectorClimbability (line 314) | static void M_SetSectorClimbability(
function M_SetSectorTriangulation (line 323) | static void M_SetSectorTriangulation(
function M_FloorDataEdits (line 347) | static void M_FloorDataEdits(
FILE: src/trx/game/inject/editors/items.c
function M_ItemPosEdits (line 6) | static void M_ItemPosEdits(
function M_ItemFlagEdits (line 32) | static void M_ItemFlagEdits(
function M_CameraEdits (line 52) | static void M_CameraEdits(
FILE: src/trx/game/inject/editors/meshes.c
type FACE_EDIT (line 8) | typedef struct {
type VERTEX_EDIT (line 17) | typedef struct {
type MESH_EDIT (line 22) | typedef struct {
function BOUNDS_16 (line 33) | static BOUNDS_16 M_ReadBounds16(VFILE *const file)
function M_ApplyFaceEdit (line 86) | static void M_ApplyFaceEdit(
function M_ApplyMeshEdit (line 98) | static void M_ApplyMeshEdit(const MESH_EDIT *const edit)
function M_MeshEdits (line 190) | static void M_MeshEdits(
function M_Object3DEdits (line 247) | static void M_Object3DEdits(
FILE: src/trx/game/inject/editors/objects.c
function M_ObjectTypeEdits (line 4) | static void M_ObjectTypeEdits(
FILE: src/trx/game/inject/editors/rooms.c
function M_TextureRoomFace (line 28) | static void M_TextureRoomFace(const INJECTION *const injection)
function M_MoveRoomFace (line 80) | static void M_MoveRoomFace(const INJECTION *const injection)
function M_AlterRoomVertex (line 99) | static void M_AlterRoomVertex(const INJECTION *const injection)
function M_SetVertexFlags (line 128) | static void M_SetVertexFlags(const INJECTION *const injection)
function M_RotateRoomFace (line 156) | static void M_RotateRoomFace(const INJECTION *const injection)
function M_AddRoomFace (line 184) | static void M_AddRoomFace(const INJECTION *const injection)
function M_AddRoomVertex (line 236) | static void M_AddRoomVertex(const INJECTION *const injection)
function M_AddRoomStatic2D (line 266) | static void M_AddRoomStatic2D(const INJECTION *const injection)
function M_AddRoomStatic3D (line 297) | static void M_AddRoomStatic3D(const INJECTION *const injection)
function M_EditRoomStatic3D (line 318) | static void M_EditRoomStatic3D(const INJECTION *const injection)
function M_RoomMeshEdits (line 343) | static void M_RoomMeshEdits(
function M_RoomPortalEdits (line 387) | static void M_RoomPortalEdits(
FILE: src/trx/game/inject/editors/textures.c
function M_TextureEdits (line 7) | static void M_TextureEdits(
function M_SpriteEdits (line 43) | static void M_SpriteEdits(
function M_AnimTextureEdits (line 74) | static void M_AnimTextureEdits(
FILE: src/trx/game/inject/enum.h
type INJECTION_MODE (line 4) | typedef enum {
type INJECTION_VERSION (line 9) | typedef enum {
type INJECTION_FILE_TYPE (line 20) | typedef enum {
type INJECTION_TEST_TYPE (line 35) | typedef enum {
type INJECTION_CHUNK_TYPE (line 42) | typedef enum {
type INJECTION_DATA_TYPE (line 54) | typedef enum {
type FACE_TYPE (line 94) | typedef enum {
type FLOOR_EDIT_TYPE (line 101) | typedef enum {
type ROOM_MESH_EDIT_TYPE (line 118) | typedef enum {
type INJECT_OBJECT_TYPE (line 132) | typedef enum {
FILE: src/trx/game/inject/testers/items.c
function M_TestItemMeta (line 5) | static bool M_TestItemMeta(
FILE: src/trx/game/inject/testers/rooms.c
function M_TestRoomCount (line 4) | static bool M_TestRoomCount(
function M_TestRoomMeta (line 11) | static bool M_TestRoomMeta(
FILE: src/trx/game/inject/types.h
type INJECTION_CONTEXT (line 8) | typedef struct {
type INJECTION (line 12) | typedef struct {
type INJECTION_CHUNK (line 20) | typedef struct {
type INJECTION_MESH_META (line 27) | typedef struct {
type INJECTION_OBJECT_INFO (line 36) | typedef struct {
FILE: src/trx/game/inject/utils.c
function INJECTION_OBJECT_INFO (line 5) | INJECTION_OBJECT_INFO Inject_ReadObjectPtr(const INJECTION *const inject...
FILE: src/trx/game/input/backends/base.h
type INPUT_BACKEND_IMPL (line 7) | typedef struct {
FILE: src/trx/game/input/backends/controller.c
type BUTTON_TYPE (line 11) | typedef enum {
type CONTROLLER_MAP (line 16) | typedef struct {
type BUILTIN_CONTROLLER_LAYOUT (line 25) | typedef struct {
type CONTROLLER_BINDING (line 96) | typedef struct {
type CONTROLLER_ROLE_BINDING (line 101) | typedef struct {
function M_ProcessEvent (line 210) | static void M_ProcessEvent(const SDL_Event *const event)
function M_JoyBtn (line 235) | static bool M_JoyBtn(const SDL_GameControllerButton button)
function M_JoyAxis (line 243) | static int16_t M_JoyAxis(const SDL_GameControllerAxis axis)
function M_CheckMap (line 251) | static bool M_CheckMap(const CONTROLLER_MAP *const map)
function M_CheckBinding (line 260) | static bool M_CheckBinding(const CONTROLLER_BINDING *const bind)
function M_GetBindState (line 278) | static bool M_GetBindState(const INPUT_LAYOUT layout, const INPUT_ROLE r...
function CONTROLLER_BINDING (line 294) | static const CONTROLLER_BINDING *M_GetBinding(
function M_MapsEqual (line 300) | static bool M_MapsEqual(
function M_BindingsEqual (line 312) | static bool M_BindingsEqual(
function M_CheckConflict (line 326) | static bool M_CheckConflict(
function M_AssignConflict (line 344) | static void M_AssignConflict(
function M_CheckConflicts (line 350) | static void M_CheckConflicts(const INPUT_LAYOUT layout)
function M_GetAssignedButtonType (line 357) | static int16_t M_GetAssignedButtonType(
function M_GetAssignedBind (line 364) | static int16_t M_GetAssignedBind(
function M_GetAssignedAxisDir (line 379) | static int16_t M_GetAssignedAxisDir(
function M_AssignBinding (line 386) | static void M_AssignBinding(
function M_AssignButton (line 394) | static void M_AssignButton(
function M_AssignAxis (line 405) | static void M_AssignAxis(
function SDL_GameController (line 416) | static SDL_GameController *M_FindController(void)
function M_ResetLayout (line 443) | static void M_ResetLayout(const INPUT_LAYOUT layout)
function M_Discover (line 451) | static void M_Discover(void)
function M_Init (line 460) | static void M_Init(void)
function M_Shutdown (line 493) | static void M_Shutdown(void)
function M_CustomUpdate (line 501) | static bool M_CustomUpdate(INPUT_STATE *const result, const INPUT_LAYOUT...
function M_IsPressed (line 511) | static bool M_IsPressed(const INPUT_LAYOUT layout, const INPUT_ROLE role)
function M_IsRoleConflicted (line 570) | static bool M_IsRoleConflicted(const INPUT_LAYOUT layout, const INPUT_RO...
function M_UnassignRole (line 609) | static void M_UnassignRole(
function M_AssignFromJSONObject (line 616) | static bool M_AssignFromJSONObject(
function M_AssignToJSONObject (line 661) | static bool M_AssignToJSONObject(
function M_MapToPrefixIdx (line 713) | static int32_t M_MapToPrefixIdx(const CONTROLLER_MAP *const map)
function M_IsInputHeld (line 722) | static bool M_IsInputHeld(const CONTROLLER_MAP *const map)
function INPUT_COMBO_BINDING (line 728) | static INPUT_COMBO_BINDING M_GetComboBinding(
function M_ComboKeysEqual (line 739) | static bool M_ComboKeysEqual(const void *const a, const void *const b)
function INPUT_COMBO_BINDING (line 744) | static INPUT_COMBO_BINDING M_ToCombo(const CONTROLLER_BINDING *const b)
function CONTROLLER_BINDING (line 753) | static const CONTROLLER_BINDING *M_GetPressedBinding(
function M_ResolvePrefixDeferral (line 765) | static void M_ResolvePrefixDeferral(
function M_ResolveCombos (line 797) | static void M_ResolveCombos(
function M_CaptureHasMap (line 935) | static bool M_CaptureHasMap(const CONTROLLER_MAP *const map)
function M_ReadAndAssign (line 945) | static bool M_ReadAndAssign(
FILE: src/trx/game/input/backends/internal.c
function M_IsManualCameraInput (line 5) | static bool M_IsManualCameraInput(const INPUT_ROLE role)
function Input_ConflictHelper (line 11) | void Input_ConflictHelper(
FILE: src/trx/game/input/backends/keyboard.c
type BUILTIN_KEYBOARD_LAYOUT (line 14) | typedef struct {
type KEYBOARD_BINDING (line 19) | typedef struct {
type KEYBOARD_ROLE_BINDING (line 24) | typedef struct {
function M_ProcessEvent (line 46) | static void M_ProcessEvent(const SDL_Event *const event)
function M_CheckScancode (line 306) | static bool M_CheckScancode(const SDL_Scancode scancode)
function M_CheckBinding (line 344) | static bool M_CheckBinding(const KEYBOARD_BINDING *const bind)
function M_Key (line 362) | static bool M_Key(const INPUT_LAYOUT layout, const INPUT_ROLE role)
function KEYBOARD_BINDING (line 378) | static const KEYBOARD_BINDING *M_GetBinding(
function M_BindingsEqual (line 384) | static bool M_BindingsEqual(
function M_CheckConflict (line 398) | static bool M_CheckConflict(
function M_AssignConflict (line 416) | static void M_AssignConflict(
function M_CheckConflicts (line 422) | static void M_CheckConflicts(const INPUT_LAYOUT layout)
function M_AssignBinding (line 429) | static void M_AssignBinding(
function M_ResetLayout (line 437) | static void M_ResetLayout(const INPUT_LAYOUT layout)
function BUILTIN_KEYBOARD_LAYOUT (line 445) | static BUILTIN_KEYBOARD_LAYOUT *M_GetBuiltInLayout(const INPUT_ROLE role)
function M_HandleBuiltInDefaults (line 456) | static void M_HandleBuiltInDefaults(void)
function M_Init (line 480) | static void M_Init(void)
function M_CustomUpdate (line 510) | static bool M_CustomUpdate(INPUT_STATE *const result, const INPUT_LAYOUT...
function M_IsPressed (line 520) | static bool M_IsPressed(const INPUT_LAYOUT layout, const INPUT_ROLE role)
function M_IsRoleConflicted (line 525) | static bool M_IsRoleConflicted(const INPUT_LAYOUT layout, const INPUT_RO...
function M_UnassignRole (line 555) | static void M_UnassignRole(
function M_AssignFromJSONObject (line 562) | static bool M_AssignFromJSONObject(
function M_AssignToJSONObject (line 593) | static bool M_AssignToJSONObject(
function INPUT_COMBO_BINDING (line 627) | static INPUT_COMBO_BINDING M_GetComboBinding(
function M_ComboKeysEqual (line 638) | static bool M_ComboKeysEqual(const void *const a, const void *const b)
function INPUT_COMBO_BINDING (line 643) | static INPUT_COMBO_BINDING M_ToCombo(const KEYBOARD_BINDING *const b)
function KEYBOARD_BINDING (line 652) | static const KEYBOARD_BINDING *M_GetPressedBinding(
function M_ResolveCombos (line 668) | static void M_ResolveCombos(
function M_CaptureHasKey (line 810) | static bool M_CaptureHasKey(const SDL_Scancode scancode)
function M_ReadAndAssign (line 820) | static bool M_ReadAndAssign(
FILE: src/trx/game/input/combo.c
function M_IsKeyNonCapturingSustained (line 5) | static bool M_IsKeyNonCapturingSustained(
function Input_ComboIsProperSubset (line 24) | bool Input_ComboIsProperSubset(
function Input_ComboHasLonger (line 47) | bool Input_ComboHasLonger(
function Input_ComboIsStarter (line 68) | bool Input_ComboIsStarter(
function INPUT_ROLE (line 84) | INPUT_ROLE Input_ComboFindDeferrableRole(
function Input_ComboIsKeyImmediate (line 104) | bool Input_ComboIsKeyImmediate(
function Input_ComboStartsWithImmediate (line 123) | bool Input_ComboStartsWithImmediate(
function Input_ComboSustainedHasImmediate (line 135) | bool Input_ComboSustainedHasImmediate(
function Input_ComboCheckConflicts (line 156) | void Input_ComboCheckConflicts(
FILE: src/trx/game/input/combo.h
type INPUT_COMBO_BINDING (line 10) | typedef struct {
type INPUT_COMBO_BINDING (line 17) | typedef INPUT_COMBO_BINDING (*INPUT_COMBO_GET_BINDING)(
FILE: src/trx/game/input/common.c
type M_HOLD_STATE (line 17) | typedef enum {
type M_HOLD_CHECK (line 23) | typedef struct {
function INPUT_BACKEND_IMPL (line 117) | static INPUT_BACKEND_IMPL *M_GetBackend(const INPUT_BACKEND backend)
function M_IsPressed (line 129) | static bool M_IsPressed(const INPUT_STATE input, const INPUT_ROLE role)
function INPUT_STATE (line 143) | static INPUT_STATE M_SetPressed(
function Input_Reset (line 159) | void Input_Reset(void)
function Input_Init (line 173) | void Input_Init(void)
function Input_Shutdown (line 188) | void Input_Shutdown(void)
function Input_Discover (line 199) | void Input_Discover(void)
function Input_IsRoleRebindable (line 209) | bool Input_IsRoleRebindable(const INPUT_ROLE role)
function Input_IsRoleUnbindable (line 214) | bool Input_IsRoleUnbindable(const INPUT_ROLE role)
function Input_IsRoleImmediate (line 219) | bool Input_IsRoleImmediate(const INPUT_ROLE role)
function Input_IsRoleSustained (line 224) | bool Input_IsRoleSustained(const INPUT_ROLE role)
function Input_IsRoleCapturing (line 229) | bool Input_IsRoleCapturing(const INPUT_ROLE role)
function Input_IsPressed (line 234) | bool Input_IsPressed(const INPUT_ROLE role)
function Input_IsPressedDB (line 239) | bool Input_IsPressedDB(const INPUT_ROLE role)
function Input_IsPressedEx (line 244) | bool Input_IsPressedEx(
function Input_IsKeyConflicted (line 251) | bool Input_IsKeyConflicted(
function Input_ReadAndAssignRole (line 258) | bool Input_ReadAndAssignRole(
function Input_UnassignRole (line 277) | void Input_UnassignRole(
function Input_ResetLayout (line 291) | void Input_ResetLayout(const INPUT_BACKEND backend, const INPUT_LAYOUT l...
function Input_EnterListenMode (line 296) | void Input_EnterListenMode(void)
function Input_ExitListenMode (line 301) | void Input_ExitListenMode(void)
function Input_IsInListenMode (line 309) | bool Input_IsInListenMode(void)
function Input_ProcessEvent (line 314) | void Input_ProcessEvent(const SDL_Event *event)
function Input_AssignFromJSONObject (line 324) | bool Input_AssignFromJSONObject(
function Input_AssignToJSONObject (line 403) | bool Input_AssignToJSONObject(
function INPUT_STATE (line 421) | INPUT_STATE Input_GetDebounced(const INPUT_STATE input)
function Input_ParseKeyDesc (line 480) | bool Input_ParseKeyDesc(
function InputState_Clear (line 513) | void InputState_Clear(INPUT_STATE *const state)
function InputState_Copy (line 520) | void InputState_Copy(INPUT_STATE *const dst, const INPUT_STATE src)
function InputState_IsAnyPressed (line 527) | bool InputState_IsAnyPressed(const INPUT_STATE state)
function InputState_GetRole (line 537) | bool InputState_GetRole(const INPUT_STATE state, const INPUT_ROLE role)
function InputState_SetRole (line 542) | void InputState_SetRole(
function InputState_ClearRole (line 548) | void InputState_ClearRole(INPUT_STATE *const state, const INPUT_ROLE role)
FILE: src/trx/game/input/common.h
type INPUT_STATE (line 21) | typedef union {
FILE: src/trx/game/input/update.c
function M_UpdateFromBackend (line 11) | static void M_UpdateFromBackend(
function Input_Update (line 21) | void Input_Update(void)
FILE: src/trx/game/interpolation.c
function M_GetFPS (line 51) | static int32_t M_GetFPS(void)
function XYZ_32 (line 56) | static XYZ_32 M_GetItemMaxDelta(const ITEM *const item)
function XYZ_32 (line 121) | static XYZ_32 M_GetEffectMaxDelta(const EFFECT *const effect)
function M_RememberCamera (line 148) | static void M_RememberCamera(void)
function M_CommitCamera (line 159) | static void M_CommitCamera(void)
function M_InterpolateCamera (line 170) | static void M_InterpolateCamera(const double ratio)
function M_RememberLara (line 181) | static void M_RememberLara(LARA_INFO *const lara)
function M_InterpolateLara (line 198) | static void M_InterpolateLara(const double ratio, LARA_INFO *const lara)
function M_CommitLara (line 215) | static void M_CommitLara(LARA_INFO *const lara)
function M_RememberBraidSegment (line 232) | static void M_RememberBraidSegment(HAIR_SEGMENT *const segment)
function M_InterpolateBraidSegment (line 243) | static void M_InterpolateBraidSegment(
function M_CommitBraidSegment (line 255) | static void M_CommitBraidSegment(HAIR_SEGMENT *const segment)
function M_RememberBraid (line 266) | static void M_RememberBraid(void)
function M_CommitBraid (line 273) | static void M_CommitBraid(void)
function M_InterpolateBraid (line 280) | static void M_InterpolateBraid(const double ratio, ITEM *const lara_item)
function M_RememberItem (line 289) | static void M_RememberItem(ITEM *const item)
function M_CommitItem (line 301) | static void M_CommitItem(ITEM *const item)
function M_InterpolateItem (line 312) | static void M_InterpolateItem(ITEM *const item, const double ratio)
function M_RememberItems (line 324) | static void M_RememberItems(void)
function M_InterpolateItems (line 336) | static void M_InterpolateItems(const double ratio)
function M_RememberEffect (line 355) | static void M_RememberEffect(EFFECT *const effect)
function M_InterpolateEffect (line 366) | static void M_InterpolateEffect(const double ratio, EFFECT *const effect)
function M_RememberEffects (line 378) | static void M_RememberEffects(void)
function M_InterpolateEffects (line 388) | static void M_InterpolateEffects(const double ratio)
function Interpolation_Enable (line 398) | void Interpolation_Enable(void)
function Interpolation_Disable (line 403) | void Interpolation_Disable(void)
function Interpolation_IsEnabled (line 408) | bool Interpolation_IsEnabled(void)
function Interpolation_IsActive (line 413) | bool Interpolation_IsActive(void)
function Interpolation_GetWorldRate (line 418) | double Interpolation_GetWorldRate(void)
function Interpolation_GetCameraRate (line 426) | double Interpolation_GetCameraRate(void)
function Interpolation_GetRate (line 434) | double Interpolation_GetRate(void)
function Interpolation_SetRate (line 439) | void Interpolation_SetRate(double rate)
function Interpolation_Remember (line 444) | void Interpolation_Remember(void)
function Interpolation_Interpolate (line 466) | void Interpolation_Interpolate(void)
function Interpolation_CommitLara (line 507) | void Interpolation_CommitLara(void)
function Interpolation_CommitBraid (line 520) | void Interpolation_CommitBraid(void)
FILE: src/trx/game/inventory.c
function M_GetFlareQuantity (line 14) | static int32_t M_GetFlareQuantity(void)
function INVENTORY_ITEM (line 21) | static INVENTORY_ITEM *M_GetGunInvItem(const LARA_GUN_TYPE gun_type)
function INVENTORY_ITEM (line 41) | static INVENTORY_ITEM *M_GetAmmoInvItem(const LARA_GUN_TYPE gun_type)
function M_IncreaseAmmo (line 61) | static void M_IncreaseAmmo(const LARA_GUN_TYPE gun_type, const int32_t qty)
function RING_TYPE (line 68) | static RING_TYPE M_GetRingType(const INVENTORY_ITEM *const inv_item)
function M_AddGun (line 81) | static void M_AddGun(const LARA_GUN_TYPE gun_type)
function M_AddAmmo (line 98) | static void M_AddAmmo(const LARA_GUN_TYPE gun_type)
function Inv_AddItemNTimes (line 108) | bool Inv_AddItemNTimes(const OBJECT_ID object_id, const int32_t qty)
function OBJECT_ID (line 117) | OBJECT_ID Inv_GetItemOption(const OBJECT_ID object_id)
function OBJECT_ID (line 125) | OBJECT_ID Inv_GetItemPickup(const OBJECT_ID object_id)
function Inv_InsertItem (line 133) | void Inv_InsertItem(INVENTORY_ITEM *const inv_item)
function Inv_InsertItemEx (line 138) | void Inv_InsertItemEx(INVENTORY_ITEM *const inv_item, const int32_t qty)
function Inv_RemoveItem (line 159) | bool Inv_RemoveItem(const OBJECT_ID object_id)
function Inv_RequestItem (line 192) | int32_t Inv_RequestItem(const OBJECT_ID object_id)
function Inv_ClearSelection (line 207) | void Inv_ClearSelection(void)
function Inv_RemoveAllItems (line 213) | void Inv_RemoveAllItems(void)
function Inv_AddItem (line 227) | bool Inv_AddItem(const OBJECT_ID object_id)
function Inv_AddPickup (line 296) | bool Inv_AddPickup(const ITEM *const item)
FILE: src/trx/game/inventory_ring/control.c
function INV_RING (line 43) | INV_RING *InvRing_GetActiveRing(void)
function M_ShowAmmoQuantity (line 48) | static void M_ShowAmmoQuantity(const char *const fmt, const int32_t qty)
function M_RingIsOpen (line 55) | static void M_RingIsOpen(INV_RING *const ring)
function M_RingIsNotOpen (line 60) | static void M_RingIsNotOpen(INV_RING *const ring)
function M_RingNotActive (line 66) | static void M_RingNotActive(
function M_RingActive (line 169) | static void M_RingActive(void)
function M_AnimateInventoryItem (line 175) | static bool M_AnimateInventoryItem(INVENTORY_ITEM *const inv_item)
function GF_COMMAND (line 198) | static GF_COMMAND M_Finish(INV_RING *const ring, const bool apply_changes)
function M_CheckDemoTimer (line 347) | static bool M_CheckDemoTimer(const INV_RING *const ring)
function M_SetupRingSwitchClose (line 364) | static void M_SetupRingSwitchClose(
function M_TransitionToRing (line 371) | static void M_TransitionToRing(
function M_SnapshotRingState (line 385) | static void M_SnapshotRingState(INV_RING *const ring)
function M_SnapshotItemState (line 393) | static void M_SnapshotItemState(INVENTORY_ITEM *const inv_item)
function M_SnapshotFrameState (line 403) | static void M_SnapshotFrameState(INV_RING *const ring)
function GF_COMMAND (line 411) | static GF_COMMAND M_Control(INV_RING *const ring)
function InvRing_RemoveAllText (line 801) | void InvRing_RemoveAllText(void)
function INV_RING (line 808) | INV_RING *InvRing_Open(const INVENTORY_MODE mode)
function InvRing_Close (line 959) | void InvRing_Close(INV_RING *const ring)
function GF_COMMAND (line 983) | GF_COMMAND InvRing_Control(INV_RING *const ring)
function InvRing_IsRingAvailable (line 1026) | bool InvRing_IsRingAvailable(const RING_TYPE ring_type)
function InvRing_IsOptionLockedOut (line 1034) | bool InvRing_IsOptionLockedOut(void)
function INVENTORY_ITEM (line 1039) | INVENTORY_ITEM *InvRing_GetByObjectID(const OBJECT_ID object_id)
FILE: src/trx/game/inventory_ring/draw.c
function XYZ_32 (line 29) | static XYZ_32 M_VectorViewFromWorld(const XYZ_32 v_world)
function M_LerpI16 (line 34) | static int16_t M_LerpI16(
function M_LerpI32 (line 40) | static int32_t M_LerpI32(
function M_LerpAngleI16 (line 46) | static int16_t M_LerpAngleI16(
function M_GlobeSelectPulse01 (line 55) | static float M_GlobeSelectPulse01(const float time)
function M_GlobeSelectApplyLight (line 62) | static void M_GlobeSelectApplyLight(
function M_GetFrames (line 108) | static int32_t M_GetFrames(
function M_DrawItem (line 150) | static void M_DrawItem(
function INVENTORY_ITEM (line 268) | const INVENTORY_ITEM *InvRing_GetInvItem(const OBJECT_ID obj_id)
function InvRing_Draw (line 280) | void InvRing_Draw(INV_RING *const ring)
FILE: src/trx/game/inventory_ring/enum.h
type INVENTORY_MODE (line 3) | typedef enum {
type RING_TYPE (line 14) | typedef enum {
type RING_STATUS (line 22) | typedef enum {
FILE: src/trx/game/inventory_ring/priv.c
type PASS_MESH (line 27) | typedef enum {
function M_DrawExamineHint (line 48) | static void M_DrawExamineHint(void *const user_data)
function M_AdjustRot (line 59) | static void M_AdjustRot(int16_t *const rot, const int16_t dest_rot)
function XYZ_32 (line 72) | static XYZ_32 M_VectorViewFromWorld(const XYZ_32 v_world)
function M_HandleRequestedObject (line 77) | static void M_HandleRequestedObject(INV_RING *const ring)
function M_MotionInit (line 95) | static void M_MotionInit(INV_RING *const ring)
function M_MotionCameraPos (line 118) | static void M_MotionCameraPos(INV_RING *const ring, const int16_t target)
function M_MotionCameraPitch (line 125) | static void M_MotionCameraPitch(INV_RING *const ring, const int16_t target)
function M_MotionRotation (line 133) | static void M_MotionRotation(
function M_MotionRadius (line 141) | static void M_MotionRadius(INV_RING *const ring, const int16_t target)
function M_MotionItemSelect (line 148) | static void M_MotionItemSelect(
function M_MotionItemDeselect (line 163) | static void M_MotionItemDeselect(
function InvRing_AdjustMusicVolume (line 179) | void InvRing_AdjustMusicVolume(const INV_RING *const ring)
function InvRing_SetRequestedObjectID (line 200) | void InvRing_SetRequestedObjectID(const OBJECT_ID obj_id)
function InvRing_InitRing (line 205) | void InvRing_InitRing(
function InvRing_InitInvItem (line 276) | void InvRing_InitInvItem(INVENTORY_ITEM *const inv_item)
function InvRing_GetView (line 299) | void InvRing_GetView(
function InvRing_Light (line 314) | void InvRing_Light(const INV_RING *const ring)
function InvRing_CalcAdders (line 363) | void InvRing_CalcAdders(INV_RING *const ring, const int16_t rotation_dur...
function InvRing_DoMotions (line 370) | void InvRing_DoMotions(INV_RING *const ring)
function InvRing_RotateLeft (line 438) | void InvRing_RotateLeft(INV_RING *const ring)
function InvRing_RotateRight (line 452) | void InvRing_RotateRight(INV_RING *const ring)
function InvRing_SetStatusTransition (line 466) | void InvRing_SetStatusTransition(
function InvRing_SelectMeshes (line 540) | void InvRing_SelectMeshes(INVENTORY_ITEM *const inv_item)
function InvRing_ShowItemName (line 581) | void InvRing_ShowItemName(const INVENTORY_ITEM *const inv_item)
function InvRing_ShowItemQuantity (line 594) | void InvRing_ShowItemQuantity(const char *const fmt, const int32_t qty)
function InvRing_SetButtonHintDrawer (line 601) | void InvRing_SetButtonHintDrawer(void (*draw_func)(void *), void *user_d...
function InvRing_ClearButtonHint (line 607) | void InvRing_ClearButtonHint(void)
function InvRing_ShowExamine (line 612) | void InvRing_ShowExamine(const OBJECT_ID object_id, const bool show)
function InvRing_DrawUI (line 639) | void InvRing_DrawUI(INV_RING *const ring)
function InvRing_RemoveItemTexts (line 662) | void InvRing_RemoveItemTexts(void)
function InvRing_ShowHeader (line 670) | void InvRing_ShowHeader(INV_RING *const ring)
function InvRing_RemoveHeader (line 728) | void InvRing_RemoveHeader(void)
function InvRing_CanExamine (line 737) | bool InvRing_CanExamine(void)
function InvRing_ShowVersionText (line 742) | void InvRing_ShowVersionText(void)
function InvRing_RemoveVersionText (line 747) | void InvRing_RemoveVersionText(void)
function InvRing_UpdateInventoryItem (line 752) | void InvRing_UpdateInventoryItem(
FILE: src/trx/game/inventory_ring/priv.h
type INV_RING_ARROW (line 16) | typedef enum {
FILE: src/trx/game/inventory_ring/types.h
type INVENTORY_SPRITE (line 14) | typedef struct {
type INVENTORY_ITEM_ACTION (line 22) | typedef enum {
type INVENTORY_ITEM (line 27) | typedef struct {
type INV_RING_MOTION (line 61) | typedef struct {
type INV_RING_SOURCE (line 81) | typedef struct {
type INV_RING (line 88) | typedef struct {
FILE: src/trx/game/inventory_ring/vars.c
function M_Init (line 13) | __attribute__((constructor)) static void M_Init(void)
function M_Shutdown (line 18) | __attribute__((destructor)) static void M_Shutdown(void)
function InvRing_LoadVars (line 29) | void InvRing_LoadVars(const char *const path)
FILE: src/trx/game/items/actions/common.c
function ItemAction_GetFXType (line 7) | int16_t ItemAction_GetFXType(void)
function ItemAction_Register (line 12) | void ItemAction_Register(
function ItemAction_Run (line 18) | void ItemAction_Run(const ITEM_TRX_ACTION action_id, ITEM *const item)
function M_RunWithFX (line 26) | static void M_RunWithFX(
function ItemAction_RunDirect (line 34) | void ItemAction_RunDirect(const ITEM_ACTION action_id, ITEM *const item)
function ItemAction_RunDirectWithFX (line 40) | void ItemAction_RunDirectWithFX(
function ItemAction_RunActive (line 47) | void ItemAction_RunActive(void)
FILE: src/trx/game/items/actions/effects.c
function M_ChainBlock (line 9) | static void M_ChainBlock(ITEM *const item)
function M_Flood (line 31) | static void M_Flood(ITEM *const item)
function M_Explosion (line 56) | static void M_Explosion(ITEM *const item)
function M_Earthquake (line 66) | static void M_Earthquake(ITEM *const item)
function M_Flicker (line 86) | static void M_Flicker(ITEM *const item)
function M_FloorShake (line 100) | static void M_FloorShake(ITEM *item)
function M_RaisingBlock (line 120) | static void M_RaisingBlock(ITEM *const item)
function M_PowerUp (line 126) | static void M_PowerUp(ITEM *const item)
function M_Stairs2Slope (line 142) | static void M_Stairs2Slope(ITEM *const item)
function M_DropSand (line 152) | static void M_DropSand(ITEM *const item)
function M_Chandelier (line 171) | static void M_Chandelier(ITEM *const item)
function M_Rubble (line 181) | static void M_Rubble(ITEM *const item)
function M_Piston (line 188) | static void M_Piston(ITEM *const item)
function M_Curtain (line 194) | static void M_Curtain(ITEM *const item)
function M_SetChange (line 200) | static void M_SetChange(ITEM *const item)
function M_Statue (line 206) | static void M_Statue(ITEM *const item)
function M_Boiler (line 212) | static void M_Boiler(ITEM *const item)
function M_CameraShake (line 218) | static void M_CameraShake(ITEM *const item)
function M_LoweringBlock (line 224) | static void M_LoweringBlock(ITEM *const item)
FILE: src/trx/game/items/actions/footprint.c
function M_Footprint (line 4) | static void M_Footprint(ITEM *const item)
FILE: src/trx/game/items/actions/general.c
function M_FinishLevel (line 6) | static void M_FinishLevel(ITEM *const item)
function M_FlipMap (line 11) | static void M_FlipMap(ITEM *const item)
function M_AssaultStart (line 16) | static void M_AssaultStart(ITEM *const item)
function M_AssaultStop (line 22) | static void M_AssaultStop(ITEM *const item)
function M_AssaultReset (line 28) | static void M_AssaultReset(ITEM *const item)
function M_AssaultFinished (line 34) | static void M_AssaultFinished(ITEM *const item)
function M_AssaultPenalty8 (line 40) | static void M_AssaultPenalty8(ITEM *const item)
function M_AssaultPenalty30 (line 46) | static void M_AssaultPenalty30(ITEM *const item)
function M_RacetrackStart (line 52) | static void M_RacetrackStart(ITEM *const item)
function M_RacetrackReset (line 58) | static void M_RacetrackReset(ITEM *const item)
function M_RacetrackFinished (line 64) | static void M_RacetrackFinished(ITEM *const item)
FILE: src/trx/game/items/actions/gym_tr3.c
function M_PlayExerciseTrack (line 9) | static void M_PlayExerciseTrack(
function M_Exercise01 (line 23) | static void M_Exercise01(ITEM *const item)
function M_Exercise02 (line 29) | static void M_Exercise02(ITEM *const item)
function M_Exercise03 (line 35) | static void M_Exercise03(ITEM *const item)
function M_Exercise04 (line 41) | static void M_Exercise04(ITEM *const item)
function M_Exercise05 (line 47) | static void M_Exercise05(ITEM *const item)
function M_Exercise06 (line 53) | static void M_Exercise06(ITEM *const item)
function M_Exercise07 (line 59) | static void M_Exercise07(ITEM *const item)
function M_Exercise08 (line 65) | static void M_Exercise08(ITEM *const item)
function M_Exercise09 (line 71) | static void M_Exercise09(ITEM *const item)
function M_Exercise10 (line 77) | static void M_Exercise10(ITEM *const item)
function M_Exercise11 (line 83) | static void M_Exercise11(ITEM *const item)
function M_Exercise12 (line 89) | static void M_Exercise12(ITEM *const item)
function M_Exercise13 (line 95) | static void M_Exercise13(ITEM *const item)
function M_Exercise14 (line 101) | static void M_Exercise14(ITEM *const item)
function M_Exercise15 (line 107) | static void M_Exercise15(ITEM *const item)
function M_Exercise16 (line 113) | static void M_Exercise16(ITEM *const item)
function M_Exercise17 (line 119) | static void M_Exercise17(ITEM *const item)
function M_Exercise18_SurfaceOnly (line 125) | static void M_Exercise18_SurfaceOnly(ITEM *const item)
function M_Exercise19_Reset (line 141) | static void M_Exercise19_Reset(ITEM *const item)
function M_ResetExercises (line 156) | static void M_ResetExercises(ITEM *const item)
FILE: src/trx/game/items/actions/ids.c
function ITEM_ACTION (line 4) | ITEM_ACTION ItemAction_ToGameID(const ITEM_TRX_ACTION action)
function ITEM_TRX_ACTION (line 13) | ITEM_TRX_ACTION ItemAction_FromGameID(const ITEM_ACTION action)
FILE: src/trx/game/items/actions/ids.h
type ITEM_ACTION (line 5) | typedef enum {
FILE: src/trx/game/items/actions/items.c
function M_Turn180 (line 3) | static void M_Turn180(ITEM *const item)
function M_Turn90 (line 18) | static void M_Turn90(ITEM *const item)
function M_InvisibilityOn (line 27) | static void M_InvisibilityOn(ITEM *const item)
function M_InvisibilityOff (line 34) | static void M_InvisibilityOff(ITEM *const item)
function M_ShadowOn (line 41) | static void M_ShadowOn(ITEM *const item)
function M_ShadowOff (line 48) | static void M_ShadowOff(ITEM *const item)
function M_DynamicLightOn (line 55) | static void M_DynamicLightOn(ITEM *const item)
function M_DynamicLightOff (line 62) | static void M_DynamicLightOff(ITEM *const item)
function M_SwapMeshes (line 69) | static void M_SwapMeshes(ITEM *const item, const OBJECT_ID swap_id)
function M_SwapMeshesWithMeshSwap1 (line 81) | static void M_SwapMeshesWithMeshSwap1(ITEM *const item)
function M_SwapMeshesWithMeshSwap2 (line 90) | static void M_SwapMeshesWithMeshSwap2(ITEM *const item)
function M_SwapMeshesWithMeshSwap3 (line 99) | static void M_SwapMeshesWithMeshSwap3(ITEM *const item)
FILE: src/trx/game/items/actions/lara.c
function M_Normal (line 11) | static void M_Normal(ITEM *const item)
function M_HandsFree (line 26) | static void M_HandsFree(ITEM *const item)
function M_ToggleGun (line 32) | static void M_ToggleGun(
function M_ToggleRightGun (line 51) | static void M_ToggleRightGun(ITEM *const item)
function M_ToggleLeftGun (line 56) | static void M_ToggleLeftGun(ITEM *const item)
function M_ShootRightGun (line 61) | static void M_ShootRightGun(ITEM *const item)
function M_ShootLeftGun (line 70) | static void M_ShootLeftGun(ITEM *const item)
function M_ResetHair (line 79) | static void M_ResetHair(ITEM *const item)
function M_Bubbles (line 84) | static void M_Bubbles(ITEM *const item)
FILE: src/trx/game/items/anim.c
function M_ShouldPlaySFXAlways (line 15) | static bool M_ShouldPlaySFXAlways(
function ANIM (line 40) | ANIM *Item_GetAnim(const ITEM *const item)
function Item_TestAnimEqual (line 45) | bool Item_TestAnimEqual(const ITEM *const item, const int16_t anim_idx)
function Item_TestObjAnimEqual (line 50) | bool Item_TestObjAnimEqual(
function Item_GetRelativeAnim (line 57) | int16_t Item_GetRelativeAnim(const ITEM *const item)
function Item_GetRelativeObjAnim (line 62) | int16_t Item_GetRelativeObjAnim(const ITEM *const item, const OBJECT_ID ...
function Item_GetRelativeFrame (line 67) | int16_t Item_GetRelativeFrame(const ITEM *const item)
function Item_SwitchToAnim (line 72) | void Item_SwitchToAnim(
function Item_SwitchToObjAnim (line 78) | void Item_SwitchToObjAnim(
function Item_TestFrameEqual (line 97) | bool Item_TestFrameEqual(const ITEM *const item, const int16_t frame)
function Item_TestFrameRange (line 105) | bool Item_TestFrameRange(
function ANIM_FRAME (line 113) | ANIM_FRAME *Item_GetBestFrame(const ITEM *const item)
function Item_GetFrames (line 121) | int32_t Item_GetFrames(const ITEM *item, ANIM_FRAME *frames[], int32_t *...
function Item_Animate (line 182) | void Item_Animate(ITEM *const item)
function Item_GetAnimChange (line 282) | bool Item_GetAnimChange(ITEM *const item, const ANIM *const anim)
function Item_PlayAnimSFX (line 310) | void Item_PlayAnimSFX(
FILE: src/trx/game/items/carrier.c
function M_ShouldCenterDrop (line 27) | static bool M_ShouldCenterDrop(const OBJECT_ID obj_id)
function OBJECT_ID (line 41) | static OBJECT_ID M_ConvertDroppedGun(const OBJECT_ID obj_id)
function ITEM (line 50) | static ITEM *M_GetCarrier(const int16_t item_num)
function ITEM (line 76) | static ITEM *M_EnsureCarriedPickupItem(
function M_IsCarrierType (line 98) | static bool M_IsCarrierType(const OBJECT_ID obj_id)
function CARRIED_ITEM (line 112) | static CARRIED_ITEM *M_GetFirstDropItem(const ITEM *const carrier)
function M_AnimateDrop (line 122) | static void M_AnimateDrop(CARRIED_ITEM *const item)
function M_InitialiseDataDrops (line 169) | static void M_InitialiseDataDrops(void)
function M_InitialiseGameFlowDrops (line 221) | static void M_InitialiseGameFlowDrops(const GF_LEVEL *const level)
function Carrier_InitialiseLevel (line 286) | void Carrier_InitialiseLevel(const GF_LEVEL *const level)
function Carrier_GetItemCount (line 296) | int32_t Carrier_GetItemCount(const int16_t item_num)
function Carrier_IsItemCarried (line 315) | bool Carrier_IsItemCarried(const int16_t item_num)
function DROP_STATUS (line 323) | DROP_STATUS Carrier_GetSaveStatus(const CARRIED_ITEM *item)
function Carrier_SyncItem (line 332) | void Carrier_SyncItem(
function Carrier_TestItemDrops (line 371) | void Carrier_TestItemDrops(const int16_t item_num)
function Carrier_AnimateDrops (line 424) | void Carrier_AnimateDrops(void)
FILE: src/trx/game/items/col.c
function Item_GetHeight (line 10) | int16_t Item_GetHeight(const ITEM *const item)
function Item_GetDistance (line 19) | int32_t Item_GetDistance(const ITEM *const item, const XYZ_32 target)
function Item_Translate (line 24) | void Item_Translate(
function Item_Test3DRange (line 34) | bool Item_Test3DRange(
function Item_IsNearby (line 41) | bool Item_IsNearby(
function Item_TestBoundsCollide (line 47) | bool Item_TestBoundsCollide(
function Item_TestStatic3DBoundsCollide (line 64) | bool Item_TestStatic3DBoundsCollide(
function BOUNDS_16 (line 81) | const BOUNDS_16 *Item_GetBoundsAccurate(const ITEM *const item)
function BOUNDS_16 (line 108) | BOUNDS_16 Item_RotateBounds(const ITEM *const item, const int16_t rot_y)
FILE: src/trx/game/items/draw.c
function Item_ControlDraw (line 8) | void Item_ControlDraw(ITEM *const item)
FILE: src/trx/game/items/enum.h
type DROP_STATUS (line 3) | typedef enum {
type ITEM_FLAG (line 12) | typedef enum {
type AI_BITS (line 24) | typedef enum {
type ITEM_STATUS (line 34) | typedef enum {
FILE: src/trx/game/items/manager.c
function M_ItemBoundsIntersectsPortal (line 25) | static inline bool M_ItemBoundsIntersectsPortal(
function Item_InitialiseItems (line 58) | void Item_InitialiseItems(const int32_t num_items)
function ITEM (line 74) | ITEM *Item_Get(const int16_t item_num)
function Item_GetIndex (line 82) | int16_t Item_GetIndex(const ITEM *const item)
function ITEM (line 87) | ITEM *Item_Find(const OBJECT_ID obj_id)
function Item_SetName (line 99) | bool Item_SetName(const int16_t item_num, const char *const name)
function ITEM (line 120) | ITEM *Item_GetByName(const char *const name)
function Item_GetLevelCount (line 135) | int32_t Item_GetLevelCount(void)
function Item_GetTotalCount (line 140) | int32_t Item_GetTotalCount(void)
function Item_GetNextActive (line 145) | int16_t Item_GetNextActive(void)
function Item_Create (line 150) | int16_t Item_Create(void)
function Item_CreateLevelItem (line 161) | int16_t Item_CreateLevelItem(void)
function Item_Spawn (line 170) | int16_t Item_Spawn(const ITEM *const item, const OBJECT_ID obj_id)
function Item_Initialise (line 186) | void Item_Initialise(const int16_t item_num)
function Item_Control (line 277) | void Item_Control(void)
function Item_Kill (line 293) | void Item_Kill(const int16_t item_num)
function Item_KillAllActive (line 318) | void Item_KillAllActive(void)
function Item_RemoveActive (line 340) | void Item_RemoveActive(const int16_t item_num)
function Item_RemoveDrawn (line 364) | void Item_RemoveDrawn(const int16_t item_num)
function Item_ClearKilled (line 395) | void Item_ClearKilled(void)
function Item_AddActive (line 409) | void Item_AddActive(const int16_t item_num)
function Item_UpdateRoom (line 426) | void Item_UpdateRoom(const int16_t item_num, const int16_t room_num)
function Item_GlobalReplace (line 486) | int32_t Item_GlobalReplace(
FILE: src/trx/game/items/types.h
type CARRIED_ITEM (line 8) | typedef struct CARRIED_ITEM {
type TRAP_DATA (line 19) | typedef struct TRAP_DATA TRAP_DATA;
type CREATURE (line 20) | typedef struct CREATURE CREATURE;
type ITEM (line 22) | typedef struct {
FILE: src/trx/game/items/utils.c
function M_UseTR3ExplodingEffects (line 14) | static bool M_UseTR3ExplodingEffects(const ITEM *const item)
function M_IsFloating (line 26) | static bool M_IsFloating(const ITEM *const item)
function Item_IsAlive (line 32) | bool Item_IsAlive(const ITEM *const item)
function Item_IsTargetable (line 45) | bool Item_IsTargetable(const ITEM *const item)
function Item_CanTakeDamage (line 61) | bool Item_CanTakeDamage(const ITEM *const item)
function Item_CanBeProjectileTarget (line 71) | bool Item_CanBeProjectileTarget(const ITEM *const item)
function Item_TakeDamage (line 99) | void Item_TakeDamage(
function Item_IsMeshVisible (line 114) | bool Item_IsMeshVisible(const ITEM *const item, const int32_t mesh_num)
function Item_SetMeshVisibleMask (line 124) | void Item_SetMeshVisibleMask(
function Item_SetMeshVisible (line 134) | void Item_SetMeshVisible(
function Item_ResetMeshBits (line 145) | void Item_ResetMeshBits(ITEM *const item)
function Item_Explode (line 150) | int32_t Item_Explode(
function Item_ShouldSpawnBlood (line 236) | bool Item_ShouldSpawnBlood(const ITEM *const item)
function Item_FindTypeInRoom (line 250) | int16_t Item_FindTypeInRoom(const int16_t room_num, const OBJECT_ID obj_id)
function Item_FindTypeAtPos (line 263) | int16_t Item_FindTypeAtPos(
function Item_IsTriggerActiveRO (line 278) | bool Item_IsTriggerActiveRO(const ITEM *const item)
function Item_IsTriggerActive (line 293) | bool Item_IsTriggerActive(ITEM *const item)
FILE: src/trx/game/items/walkable.c
type M_CANDIDATE_SECTORS (line 14) | typedef struct {
type M_SETUP (line 19) | typedef struct {
function SECTOR (line 28) | static SECTOR *M_GetItemPitSector(const XYZ_32 pos, int16_t room_num)
function M_HasCandidateSector (line 34) | static bool M_HasCandidateSector(
function M_CANDIDATE_SECTORS (line 45) | static M_CANDIDATE_SECTORS M_GetCandidateSectors(
function M_SETUP (line 83) | static M_SETUP *M_GetSetup(const int16_t item_num)
function M_SectorContainsWalkable (line 90) | static bool M_SectorContainsWalkable(
function M_InsertSorted (line 103) | static void M_InsertSorted(WALKABLE **walkables, WALKABLE *const node)
function M_Remove (line 113) | static void M_Remove(
function Walkable_AllocateNodes (line 149) | void Walkable_AllocateNodes(const ITEM *const item, const int32_t footpr...
function Walkable_Add (line 162) | void Walkable_Add(const int16_t item_num, const XYZ_32 pos)
function Walkable_Remove (line 200) | void Walkable_Remove(const int16_t item_num)
function Walkable_Reposition (line 206) | void Walkable_Reposition(
function Walkable_Reset (line 213) | void Walkable_Reset(void)
function Walkable_ResetLevel (line 230) | void Walkable_ResetLevel(void)
function Walkable_Shutdown (line 241) | void Walkable_Shutdown(void)
FILE: src/trx/game/lara/breath.c
function M_CanBreatheVisible (line 13) | static bool M_CanBreatheVisible(const ITEM *const lara_item)
function Lara_Breath_Control (line 49) | void Lara_Breath_Control(const ITEM *const lara_item)
FILE: src/trx/game/lara/cheat.c
function M_GiveAllKeysImpl (line 20) | static void M_GiveAllKeysImpl(void)
function M_GiveAllGunsImpl (line 39) | static void M_GiveAllGunsImpl(const bool ignore_exclusions)
function M_GiveAllMedpacksImpl (line 76) | static void M_GiveAllMedpacksImpl(void)
function M_ReinitialiseGunMeshes (line 85) | static void M_ReinitialiseGunMeshes(void)
function M_ClearHandWeaponMeshes (line 91) | static void M_ClearHandWeaponMeshes(void)
function M_ResetGunStatus (line 99) | static void M_ResetGunStatus(void)
function Lara_Cheat_GiveAllKeys (line 125) | bool Lara_Cheat_GiveAllKeys(void)
function Lara_Cheat_GiveAllGuns (line 138) | bool Lara_Cheat_GiveAllGuns(const bool ignore_exclusions)
function Lara_Cheat_GiveGun (line 151) | bool Lara_Cheat_GiveGun(
function Lara_Cheat_GiveAllItems (line 166) | bool Lara_Cheat_GiveAllItems(void)
function Lara_Cheat_GetStuff (line 181) | void Lara_Cheat_GetStuff(void)
function Lara_Cheat_EndLevel (line 187) | void Lara_Cheat_EndLevel(void)
function Lara_Cheat_KillEnemy (line 193) | bool Lara_Cheat_KillEnemy(const int16_t item_num)
function Lara_Cheat_OpenNearestDoor (line 213) | bool Lara_Cheat_OpenNearestDoor(void)
function Lara_Cheat_EnterFlyMode (line 265) | bool Lara_Cheat_EnterFlyMode(void)
function Lara_Cheat_ExitFlyMode (line 336) | bool Lara_Cheat_ExitFlyMode(void)
function Lara_Cheat_Teleport (line 386) | bool Lara_Cheat_Teleport(XYZ_32 pos, int16_t room_num)
FILE: src/trx/game/lara/cheat_keys.c
type M_CHEAT_STATE (line 12) | typedef enum {
function M_CompleteLevel (line 32) | static void M_CompleteLevel(void)
function M_GiveItems (line 37) | static void M_GiveItems(void)
function M_ExplodeLara (line 78) | static void M_ExplodeLara(void)
function M_ProcessOutcome (line 90) | static bool M_ProcessOutcome(
function LARA_STATE (line 141) | static LARA_STATE M_GetBackstepState(void)
function Lara_Cheat_CheckKeys (line 146) | void Lara_Cheat_CheckKeys(void)
FILE: src/trx/game/lara/col.c
function M_Push (line 15) | static void M_Push(
function Lara_Col_Register (line 98) | void Lara_Col_Register(
function Lara_Col_Update (line 106) | void Lara_Col_Update(ITEM *const item, COLL_INFO *const coll)
function Lara_Col_GetInfo (line 115) | void Lara_Col_GetInfo(const ITEM *const item, COLL_INFO *const coll)
function Lara_Col_Shift (line 124) | void Lara_Col_Shift(COLL_INFO *const coll)
function Lara_Col_MonkeySwingSnap (line 129) | void Lara_Col_MonkeySwingSnap(ITEM *const item)
function Lara_Col_ItemPush (line 139) | void Lara_Col_ItemPush(
function Lara_Col_St
Condensed preview — 1612 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (9,515K chars).
[
{
"path": ".clang-format",
"chars": 447,
"preview": "---\nAlignAfterOpenBracket: AlwaysBreak\nAllowShortFunctionsOnASingleLine: None\nAlwaysBreakAfterReturnType: None\nBasedOnSt"
},
{
"path": ".dockerignore",
"chars": 19,
"preview": "/data\n/test\n/build\n"
},
{
"path": ".editorconfig",
"chars": 188,
"preview": "[*]\ninsert_final_newline = true\ncharset = utf-8\nindent_style = space\nend_of_line = lf\n\n[*.py]\nindent_size = 4\nmax_line_l"
},
{
"path": ".github/CODEOWNERS",
"chars": 39,
"preview": "* @LostArtefacts/dev @LostArtefacts/qa\n"
},
{
"path": ".github/ISSUE_TEMPLATE/bug_report.yml",
"chars": 2987,
"preview": "name: Bug report\ndescription: Report a reproducible problem in TRX\ntitle: \"[Bug] \"\nbody:\n - type: markdown\n attribut"
},
{
"path": ".github/ISSUE_TEMPLATE/config.yml",
"chars": 255,
"preview": "blank_issues_enabled: false\ncontact_links:\n - name: Bug reporting guidelines\n url: https://github.com/LostArtefacts/"
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request.yml",
"chars": 1171,
"preview": "name: Feature request\ndescription: Suggest an improvement, enhancement, or new idea\ntitle: \"[Feature] \"\nbody:\n - type: "
},
{
"path": ".github/actions/prepare_macos_tooling/action.yml",
"chars": 7132,
"preview": "name: Cache TRX MacOS Dependencies\n\ninputs:\n FFMPEG_INSTALL_TMP_ARM64:\n required: false\n default: /opt/local/inst"
},
{
"path": ".github/docker/lint.Dockerfile",
"chars": 1121,
"preview": "FROM python:3.12-slim-bookworm\n\nENV DEBIAN_FRONTEND=noninteractive\n\nRUN apt-get update && apt-get install -y --no-instal"
},
{
"path": ".github/pull_request_template.md",
"chars": 377,
"preview": "#### Checklist\n\n- [ ] I have read the [coding conventions](https://github.com/LostArtefacts/TRX/blob/develop/docs/CONTRI"
},
{
"path": ".github/workflows/build_docker.yml",
"chars": 801,
"preview": "name: Build Docker toolchain\n\non:\n - workflow_dispatch\n\njobs:\n publish_docker_image:\n name: Build Docker toolchain\n"
},
{
"path": ".github/workflows/build_lint_image.yml",
"chars": 1106,
"preview": "name: Build lint image\n\non:\n push:\n branches:\n - main\n - lint\n paths:\n - .github/docker/lint.Docke"
},
{
"path": ".github/workflows/comment_build.yml",
"chars": 6763,
"preview": "name: Post build links to pull request\non:\n workflow_run:\n workflows: ['Create a test build']\n types: [completed]"
},
{
"path": ".github/workflows/job_build.yml",
"chars": 5051,
"preview": "name: Build TRX and the installer\n\non:\n workflow_call:\n inputs:\n platform:\n type: string\n descrip"
},
{
"path": ".github/workflows/job_build_macos.yml",
"chars": 7402,
"preview": "name: Build TRX and the installer (macOS)\n\non:\n workflow_call:\n inputs:\n target:\n type: string\n d"
},
{
"path": ".github/workflows/job_release.yml",
"chars": 3002,
"preview": "name: Create a new release\n\non:\n workflow_call:\n inputs:\n draft:\n type: boolean\n description: \"Dr"
},
{
"path": ".github/workflows/lint.yml",
"chars": 2019,
"preview": "name: Run code linters\n\non:\n - push\n - pull_request\n\njobs:\n lint:\n name: Run code linters\n runs-on: ubuntu-late"
},
{
"path": ".github/workflows/pr_builds.yml",
"chars": 686,
"preview": "name: Create a test build\n\npermissions:\n contents: write\n\non:\n pull_request:\n push:\n branches:\n - '!stable'\n "
},
{
"path": ".github/workflows/prerelease.yml",
"chars": 1378,
"preview": "name: Publish a pre-release\n\npermissions:\n contents: write\n\non:\n push:\n branches:\n - develop\n\njobs:\n package_li"
},
{
"path": ".github/workflows/release.yml",
"chars": 1898,
"preview": "name: Publish a release\n\npermissions:\n contents: write\n\non:\n push:\n branch: stable\n tags:\n - \"trx-*\"\n\n wor"
},
{
"path": ".gitignore",
"chars": 885,
"preview": "*.cache.json\nTR1X.dll\nTR1X.exe\nTR1X.log\nTR2X.dll\nTR2X.exe\nTR2X.log\n\n# Docker builds garbage\n/build\n/.secrets\n/.local\n/wo"
},
{
"path": ".gitmodules",
"chars": 99,
"preview": "[submodule \"libtrx\"]\n\tpath = subprojects/libtrx\n\turl = https://github.com/LostArtefacts/libtrx.git\n"
},
{
"path": ".pre-commit-config.yaml",
"chars": 1061,
"preview": "repos:\n- repo: local\n hooks:\n - id: clang-format\n name: clang-format\n entry: clang-format\n args: [\"-style=fil"
},
{
"path": "BUG_REPORTING.md",
"chars": 1869,
"preview": "# TRX Bug Reporting Guide\n\nThanks for taking the time to report an issue.\n\nGood bug reports help us reproduce problems q"
},
{
"path": "CODE_OF_CONDUCT.md",
"chars": 3829,
"preview": "# TRX Community Guide and Code of Conduct\n\nTRX is a volunteer, maintainer-led open source project. We're happy to have y"
},
{
"path": "COPYING.md",
"chars": 35229,
"preview": "GNU GENERAL PUBLIC LICENSE\n==========================\nVersion 3, 29 June 2007\n==========================\n\n> Copyright (C"
},
{
"path": "README.md",
"chars": 4708,
"preview": "<div align=\"center\">\n<h1>TRX – Tomb Raider I & II: Community Edition</h1>\n\n<p align=\"center\">\n <a href=\"https://lostart"
},
{
"path": "data/common/glyphs/mapping.txt",
"chars": 1250,
"preview": "# This file is used by the tooling in the tools/glyphs/ directory and is\n# crucial for the game's graphical text handlin"
},
{
"path": "data/common/glyphs/mapping_basic_latin.txt",
"chars": 6527,
"preview": "# --------------------------------------------------\n# Unicode Block \"Basic Latin\" (U+0000 to U+007F)\n# ----------------"
},
{
"path": "data/common/glyphs/mapping_combining_diactrics.txt",
"chars": 1117,
"preview": "# --------------------------------------------------\n# Combining diactrics\n# -------------------------------------------"
},
{
"path": "data/common/glyphs/mapping_controller.txt",
"chars": 5022,
"preview": "# --------------------------------------------------\n# Controller button icons\n# ---------------------------------------"
},
{
"path": "data/common/glyphs/mapping_cyrillic.txt",
"chars": 4725,
"preview": "# --------------------------------------------------\n# Unicode Block \"Cyrillic\" (U+0400 to U+04FF)\n# -------------------"
},
{
"path": "data/common/glyphs/mapping_greek_and_coptic.txt",
"chars": 3554,
"preview": "# --------------------------------------------------\n# Unicode Block \"Greek and Coptic\" (U+0370 to U+03FF)\n# -----------"
},
{
"path": "data/common/glyphs/mapping_icons.txt",
"chars": 1579,
"preview": "# --------------------------------------------------\n# Icons\n# --------------------------------------------------\n\"\\\\{bu"
},
{
"path": "data/common/glyphs/mapping_keyboard.txt",
"chars": 12226,
"preview": "# --------------------------------------------------\n# Keyboard button icons\n# -----------------------------------------"
},
{
"path": "data/common/glyphs/mapping_latin-1_supplement.txt",
"chars": 4704,
"preview": "# --------------------------------------------------\n# Unicode Block \"Latin-1 Supplement\" (U+0080 to U+00FF)\n# ---------"
},
{
"path": "data/common/glyphs/mapping_latin_extended-a.txt",
"chars": 6087,
"preview": "# --------------------------------------------------\n# Unicode Block \"Latin Extended-A\" (U+0100 to U+017F)\n# -----------"
},
{
"path": "data/common/glyphs/mapping_latin_extended-b.txt",
"chars": 1476,
"preview": "# --------------------------------------------------\n# Unicode Block \"Latin Extended-B\" (U+0180 to U+024F)\n# -----------"
},
{
"path": "data/common/glyphs/mapping_latin_extended_additional.txt",
"chars": 2609,
"preview": "# --------------------------------------------------\n# Unicode Block \"Latin Extended Additional\" (U+1E00 to U+1EFF)\n# --"
},
{
"path": "data/common/glyphs/mapping_misc.txt",
"chars": 2001,
"preview": "# --------------------------------------------------\n# Unicode Block \"General Punctuation\" (U+2000 to U+206F)\n# --------"
},
{
"path": "data/common/glyphs/mapping_small.txt",
"chars": 717,
"preview": "# --------------------------------------------------\n# Small text\n# --------------------------------------------------\nU"
},
{
"path": "data/scripting/assault_stats.lua",
"chars": 140,
"preview": "local raw = trxc.assault_stats\n\ntrx.assault_stats = {\n add_record = raw.record,\n remove_record = raw.remove,\n list_re"
},
{
"path": "data/scripting/camera.lua",
"chars": 614,
"preview": "local raw = trxc.camera\n\nlocal getters = {\n pos = raw.get_pos,\n room_num = raw.get_room,\n room = function()\n local"
},
{
"path": "data/scripting/catalog.lua",
"chars": 264,
"preview": "local raw = trxc.catalog\n\nlocal catalog = {\n objects = raw.objects,\n flip_effects = raw.flip_effects,\n lara_states = "
},
{
"path": "data/scripting/config.lua",
"chars": 230,
"preview": "local raw = trxc.config\n\nlocal config = {}\n\nfunction config.get(key)\n return raw.get(key)\nend\n\nfunction config.set(key,"
},
{
"path": "data/scripting/console.lua",
"chars": 728,
"preview": "local raw = trxc.console\nlocal LogLevel = trxc.log.LogLevel\n\nlocal log = { LogLevel = LogLevel }\nfunction log.generic(le"
},
{
"path": "data/scripting/creatures.lua",
"chars": 653,
"preview": "local raw = trxc.creatures\n\nlocal creatures = {\n add_ally = raw.add_ally,\n add_ally_target = raw.add_ally_target,\n}\n\nl"
},
{
"path": "data/scripting/events.lua",
"chars": 658,
"preview": "local raw = trxc.events\nlocal types = trxc.events.EventType\n\nlocal Event = {}\nfunction Event.__call(self, callback)\n lo"
},
{
"path": "data/scripting/game.lua",
"chars": 2300,
"preview": "local raw = trxc.game\n\nlocal function make_level(table_type, i)\n return {\n num = raw.get_level_num(table_type, i),\n "
},
{
"path": "data/scripting/items.lua",
"chars": 2962,
"preview": "local raw = trxc.items\n\n-- Item proxy metatable\nlocal getters = {\n pos = raw.get_pos,\n rot = raw.get_rot,\n anim = raw"
},
{
"path": "data/scripting/lara.lua",
"chars": 1235,
"preview": "local raw = trxc.lara\n\nlocal lara = {\n set_extra_equipment = raw.set_extra_equipment,\n clear_equipment = raw.clear_equ"
},
{
"path": "data/scripting/log.lua",
"chars": 465,
"preview": "local raw = trxc.log\nlocal LogLevel = trxc.log.LogLevel\n\nlocal log = { LogLevel = LogLevel }\nfunction log.generic(level,"
},
{
"path": "data/scripting/music.lua",
"chars": 426,
"preview": "local raw = trxc.music\n\nlocal music = {\n PlayMode = raw.PlayMode,\n}\n\nfunction music.get_track()\n return raw.get_track("
},
{
"path": "data/scripting/objects.lua",
"chars": 98,
"preview": "local raw = trxc.objects\n\nlocal objects = {\n swap_mesh = raw.swap_mesh,\n}\n\ntrx.objects = objects\n"
},
{
"path": "data/scripting/rooms.lua",
"chars": 1765,
"preview": "local raw = trxc.rooms\n\n-- Room proxy metatable\nlocal getters = {\n num = function(idx)\n return idx\n end,\n underwat"
},
{
"path": "data/scripting/sound.lua",
"chars": 275,
"preview": "local raw = trxc.sound\n\nlocal sound = {}\n\nfunction sound.is_available(id)\n return raw.is_available(id)\nend\n\nfunction so"
},
{
"path": "data/tomb-11.bdf",
"chars": 10607,
"preview": "STARTFONT 2.1\nFONT -nerdypepper-tomb-medium-r-normal--11-80-100-100-C-50-ISO10646-1\nSIZE 11 75 75\nFONTBOUNDINGBOX 7 10 0"
},
{
"path": "data/tr1/mac/Info.plist",
"chars": 498,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "data/tr2/mac/Info.plist",
"chars": 498,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "data/tr3/glyphs/mapping_basic_latin.txt",
"chars": 4258,
"preview": "# --------------------------------------------------\n# Unicode Block \"Basic Latin\" (U+0000 to U+007F)\n# ----------------"
},
{
"path": "data/tr3/glyphs/mapping_combining_diactrics.txt",
"chars": 852,
"preview": "# --------------------------------------------------\n# Combining diactrics\n# -------------------------------------------"
},
{
"path": "data/tr3/glyphs/mapping_cyrillic.txt",
"chars": 3259,
"preview": "# --------------------------------------------------\n# Unicode Block \"Cyrillic\" (U+0400 to U+04FF)\n# -------------------"
},
{
"path": "data/tr3/glyphs/mapping_greek_and_coptic.txt",
"chars": 2363,
"preview": "# --------------------------------------------------\n# Unicode Block \"Greek and Coptic\" (U+0370 to U+03FF)\n# -----------"
},
{
"path": "data/tr3/glyphs/mapping_latin-1_supplement.txt",
"chars": 3322,
"preview": "# --------------------------------------------------\n# Unicode Block \"Latin-1 Supplement\" (U+0080 to U+00FF)\n# ---------"
},
{
"path": "data/tr3/glyphs/mapping_latin_extended-a.txt",
"chars": 4528,
"preview": "# --------------------------------------------------\n# Unicode Block \"Latin Extended-A\" (U+0100 to U+017F)\n# -----------"
},
{
"path": "data/tr3/glyphs/mapping_latin_extended-b.txt",
"chars": 1210,
"preview": "# --------------------------------------------------\n# Unicode Block \"Latin Extended-B\" (U+0180 to U+024F)\n# -----------"
},
{
"path": "data/tr3/glyphs/mapping_latin_extended_additional.txt",
"chars": 2164,
"preview": "# --------------------------------------------------\n# Unicode Block \"Latin Extended Additional\" (U+1E00 to U+1EFF)\n# --"
},
{
"path": "data/tr3/glyphs/mapping_misc.txt",
"chars": 1541,
"preview": "# --------------------------------------------------\n# Unicode Block \"General Punctuation\" (U+2000 to U+206F)\n# --------"
},
{
"path": "data/tr3/glyphs/mapping_small.txt",
"chars": 548,
"preview": "# --------------------------------------------------\n# Small text\n# --------------------------------------------------\nU"
},
{
"path": "data/tr3/mac/Info.plist",
"chars": 498,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "data/trx/icon.rc",
"chars": 22,
"preview": "id ICON \"{icon_path}\"\n"
},
{
"path": "data/trx/ship/cfg/base_strings-de.json5",
"chars": 121554,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/cfg/base_strings-en-gb.json5",
"chars": 5726,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/cfg/base_strings-fr.json5",
"chars": 126322,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/cfg/base_strings-gd.json5",
"chars": 118371,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/cfg/base_strings-it.json5",
"chars": 120471,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/cfg/base_strings-pl.json5",
"chars": 114487,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/cfg/base_strings-ru.json5",
"chars": 120614,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/cfg/base_strings.json5",
"chars": 109819,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/cfg/outfits.json5",
"chars": 24078,
"preview": "{\n \"outfits\": {\n // TR1 Gym\n \"tr1_gym\" : {\n \"name_gs\": \"dynamic/enums/lara_outfit/tr1_gym\",\n"
},
{
"path": "data/trx/ship/cfg/poses.json5",
"chars": 21679,
"preview": "[\n {\"offset\": [0, -442, 0], \"rots\": [[-2624, 4288, 9984], [7808, 1088, 0], [-15168, 0, 0], "
},
{
"path": "data/trx/ship/cfg/presets/tr1-pc.json5",
"chars": 313,
"preview": "{\n \"name_gs\": \"dynamic/config_presets/tr1_pc\",\n \"config\": {\n \"ui.menu_style\": \"pc\",\n \"ui.enable_smoo"
},
{
"path": "data/trx/ship/cfg/presets/tr1-ps1.json5",
"chars": 315,
"preview": "{\n \"name_gs\": \"dynamic/config_presets/tr1_ps1\",\n \"config\": {\n \"ui.menu_style\": \"ps1\",\n \"ui.enable_sm"
},
{
"path": "data/trx/ship/cfg/presets/tr2-pc.json5",
"chars": 314,
"preview": "{\n \"name_gs\": \"dynamic/config_presets/tr2_pc\",\n \"config\": {\n \"ui.menu_style\": \"pc\",\n \"ui.enable_smoo"
},
{
"path": "data/trx/ship/cfg/presets/tr2-ps1.json5",
"chars": 315,
"preview": "{\n \"name_gs\": \"dynamic/config_presets/tr2_ps1\",\n \"config\": {\n \"ui.menu_style\": \"ps1\",\n \"ui.enable_sm"
},
{
"path": "data/trx/ship/cfg/presets/tr3-pc.json5",
"chars": 362,
"preview": "{\n \"name_gs\": \"dynamic/config_presets/tr3_pc\",\n \"config\": {\n \"ui.menu_style\": \"pc\",\n \"ui.enable_smoo"
},
{
"path": "data/trx/ship/cfg/presets/tr3-ps1.json5",
"chars": 365,
"preview": "{\n \"name_gs\": \"dynamic/config_presets/tr3_ps1\",\n \"config\": {\n \"ui.menu_style\": \"ps1\",\n \"ui.enable_sm"
},
{
"path": "data/trx/ship/cfg/shaders/2d.glsl",
"chars": 4955,
"preview": "#include \"common.glsl\"\n\n#define EFFECT_NONE 0\n#define EFFECT_VIGNETTE 1\n#define EFFECT_WAVE 2\n\n#define WAVE_SPEED_SHORT "
},
{
"path": "data/trx/ship/cfg/shaders/billboard.glsl",
"chars": 1392,
"preview": "#define BILLBOARD_LOCK_NONE 0\n#define BILLBOARD_LOCK_ROLL 1\n#define BILLBOARD_LOCK_ROLL_PITCH 2\n#define B"
},
{
"path": "data/trx/ship/cfg/shaders/common.glsl",
"chars": 1537,
"preview": "#define PI 3.1415926538\n\n#define WALL_L 1024\n#define WIBBLE_SIZE 32\n#define MAX_WIBBLE 2\n\n#define SHADE_NEUTRAL 0"
},
{
"path": "data/trx/ship/cfg/shaders/fbo.glsl",
"chars": 388,
"preview": "#ifdef VERTEX\n\nlayout(location = 0) in vec2 inPosition;\n\nout vec2 vertTexCoords;\n\nvoid main(void) {\n vertTexCoords = "
},
{
"path": "data/trx/ship/cfg/shaders/lights.glsl",
"chars": 8822,
"preview": "#define MAX_LIGHTS 32\n\n#define RLM_NORMAL 0\n#define RLM_FLICKER 1\n#define RLM_GLOW 2\n#define RLM_SUNSET 3\n\nuniform "
},
{
"path": "data/trx/ship/cfg/shaders/meshes.glsl",
"chars": 6482,
"preview": "#include \"common.glsl\"\n\n#ifdef VERTEX\n\nuniform mat4 uMatModel;\nuniform bool uWibbleEffect;\n\n#include \"billboard.glsl\"\n#i"
},
{
"path": "data/trx/ship/cfg/shaders/meshes_tr12.glsl",
"chars": 44,
"preview": "#define TR_VERSION 2\n#include \"meshes.glsl\"\n"
},
{
"path": "data/trx/ship/cfg/shaders/meshes_tr3.glsl",
"chars": 44,
"preview": "#define TR_VERSION 3\n#include \"meshes.glsl\"\n"
},
{
"path": "data/trx/ship/cfg/shaders/ui.glsl",
"chars": 1247,
"preview": "#include \"common.glsl\"\n\n#ifdef VERTEX\n\nlayout(location = 0) in vec4 inPosition;\nlayout(location = 1) in vec3 inUVW;\nlayo"
},
{
"path": "data/trx/ship/cfg/ui.json5",
"chars": 9823,
"preview": "{\n \"bars\": {\n \"tr1_pc\": {\n \"name_gs\": \"dynamic/enums/bar_look/tr1_pc\",\n \"scale\": 1,\n \"style\": \"pc\",\n "
},
{
"path": "data/trx/ship/games/tr1/catalog_item_actions.csv",
"chars": 566,
"preview": "0, ITEM_ACTION_TURN_180\n1, ITEM_ACTION_FLOOR_SHAKE\n2, ITEM_ACTION_LARA_NORMAL\n3, ITEM_ACTION_BUBBLES\n4, ITEM_ACTION_FINI"
},
{
"path": "data/trx/ship/games/tr1/catalog_lara_anims.csv",
"chars": 8920,
"preview": "0, LA_RUN\n1, LA_WALK_FORWARD\n2, LA_WALK_STOP_RIGHT\n3, LA_WALK_STOP_LEFT\n4, LA_WALK_TO_RUN_RIGHT\n5, LA_WALK_TO_RUN_LEFT\n6"
},
{
"path": "data/trx/ship/games/tr1/catalog_lara_states.csv",
"chars": 1690,
"preview": "0, LS_WALK\n1, LS_RUN\n2, LS_STOP\n3, LS_JUMP_FORWARD\n4, LS_POSE\n5, LS_FAST_BACK\n6, LS_TURN_RIGHT\n7, LS_TURN_LEFT\n8, LS_DEA"
},
{
"path": "data/trx/ship/games/tr1/catalog_music.csv",
"chars": 418,
"preview": "0, MX_UNUSED_0\n1, MX_UNUSED_1\n5, MX_UNUSED_2\n13, MX_SECRET\n28, MX_TR1_GYM_HINT_03\n29, MX_TR1_GYM_HINT_04\n37, MX_TR1_G"
},
{
"path": "data/trx/ship/games/tr1/catalog_objects.csv",
"chars": 5543,
"preview": "0, O_LARA\n1, O_LARA_PISTOLS\n2, O_LARA_SHOTGUN\n3, O_LARA_MAGNUMS\n4, O_LARA_UZIS\n5, O_LARA_EXTRA\n6, O_BACON_"
},
{
"path": "data/trx/ship/games/tr1/catalog_samples.csv",
"chars": 1901,
"preview": "0, SFX_LARA_FOOTSTEP\n2, SFX_LARA_NO\n6, SFX_LARA_DRAW\n7, SFX_LARA_HOLSTER\n8, SFX_LARA_PISTOLS\n9, SFX_LARA_REL"
},
{
"path": "data/trx/ship/games/tr1/gameflow.json5",
"chars": 19742,
"preview": "{\n // NOTE: bad changes to this file may result in crashes.\n // Lines starting with double slashes are comments an"
},
{
"path": "data/trx/ship/games/tr1/inv_ring.json5",
"chars": 14323,
"preview": "[\n {\n \"object_id\": \"O_SMALL_MEDIPACK_OPTION\",\n \"frames_total\": 26,\n \"open_frame\": 25,\n \"a"
},
{
"path": "data/trx/ship/games/tr1/scripts/gym.lua",
"chars": 140,
"preview": "trx.events.on_game_start(function(level, is_save)\n trx.lara.holsters_visible = trx.lara.has_pistol_weapon -- TODO: remo"
},
{
"path": "data/trx/ship/games/tr1/strings-de.json5",
"chars": 5897,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/games/tr1/strings-en-gb.json5",
"chars": 138,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/games/tr1/strings-fr.json5",
"chars": 5748,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/games/tr1/strings-gd.json5",
"chars": 5729,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/games/tr1/strings-it.json5",
"chars": 5805,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/games/tr1/strings-pl.json5",
"chars": 5704,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/games/tr1/strings-ru.json5",
"chars": 5690,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/games/tr1/strings.json5",
"chars": 5589,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/games/tr1/weapons.json5",
"chars": 8496,
"preview": "{\n \"LGT_UNARMED\": {\n \"sample_num\": \"SFX_LARA_NO\",\n },\n\n \"LGT_FLARE\": {\n \"ammo\": {\n \"in"
},
{
"path": "data/trx/ship/games/tr1-demo-pc/gameflow.json5",
"chars": 2267,
"preview": "{\n // NOTE: bad changes to this file may result in crashes.\n // Lines starting with double slashes are comments an"
},
{
"path": "data/trx/ship/games/tr1-demo-pc/strings-de.json5",
"chars": 434,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/games/tr1-demo-pc/strings-fr.json5",
"chars": 454,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/games/tr1-demo-pc/strings-gd.json5",
"chars": 423,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/games/tr1-demo-pc/strings-it.json5",
"chars": 427,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/games/tr1-demo-pc/strings-pl.json5",
"chars": 424,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/games/tr1-demo-pc/strings-ru.json5",
"chars": 424,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/games/tr1-demo-pc/strings.json5",
"chars": 418,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/games/tr1-level/gameflow.json5",
"chars": 1058,
"preview": "{\n // This file is used to enable the -l argument support.\n\n \"engine\": 1,\n \"extends\": \"tr1\",\n \"name\": \"TR1 D"
},
{
"path": "data/trx/ship/games/tr1-level/strings-de.json5",
"chars": 193,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/games/tr1-level/strings-fr.json5",
"chars": 208,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/games/tr1-level/strings-gd.json5",
"chars": 197,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/games/tr1-level/strings-it.json5",
"chars": 200,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/games/tr1-level/strings-pl.json5",
"chars": 198,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/games/tr1-level/strings-ru.json5",
"chars": 200,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/games/tr1-level/strings.json5",
"chars": 194,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/games/tr1-ub/gameflow.json5",
"chars": 6642,
"preview": "{\n // NOTE: bad changes to this file may result in crashes.\n // Lines starting with double slashes are comments an"
},
{
"path": "data/trx/ship/games/tr1-ub/strings-de.json5",
"chars": 776,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/games/tr1-ub/strings-fr.json5",
"chars": 748,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/games/tr1-ub/strings-gd.json5",
"chars": 769,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/games/tr1-ub/strings-it.json5",
"chars": 757,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/games/tr1-ub/strings-pl.json5",
"chars": 749,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/games/tr1-ub/strings-ru.json5",
"chars": 756,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/games/tr1-ub/strings.json5",
"chars": 745,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/games/tr2/catalog_item_actions.csv",
"chars": 963,
"preview": "0, ITEM_ACTION_TURN_180\n1, ITEM_ACTION_FLOOR_SHAKE\n2, ITEM_ACTION_LARA_NORMAL\n3, ITEM_ACTION_BUBBLES\n4, ITEM_ACTION_FINI"
},
{
"path": "data/trx/ship/games/tr2/catalog_lara_anims.csv",
"chars": 8920,
"preview": "0, LA_RUN\n1, LA_WALK_FORWARD\n2, LA_WALK_STOP_RIGHT\n3, LA_WALK_STOP_LEFT\n4, LA_WALK_TO_RUN_RIGHT\n5, LA_WALK_TO_RUN_LEFT\n6"
},
{
"path": "data/trx/ship/games/tr2/catalog_lara_states.csv",
"chars": 1690,
"preview": "0, LS_WALK\n1, LS_RUN\n2, LS_STOP\n3, LS_JUMP_FORWARD\n4, LS_POSE\n5, LS_FAST_BACK\n6, LS_TURN_RIGHT\n7, LS_TURN_LEFT\n8, LS_DEA"
},
{
"path": "data/trx/ship/games/tr2/catalog_music.csv",
"chars": 241,
"preview": "43, MX_SECRET\n18, MX_TR2_GYM_HINT_14\n19, MX_TR2_GYM_HINT_15\n20, MX_TR2_GYM_HINT_16\n21, MX_TR2_GYM_HINT_17\n22, MX_TR2_GYM"
},
{
"path": "data/trx/ship/games/tr2/catalog_objects.csv",
"chars": 6712,
"preview": "0, O_LARA\n1, O_LARA_PISTOLS\n2, O_LARA_HAIR\n3, O_LARA_SHOTGUN\n4, O_LARA_AUTOS\n5, O_LARA_UZIS\n6, O_LARA_M16\n"
},
{
"path": "data/trx/ship/games/tr2/catalog_samples.csv",
"chars": 2391,
"preview": "0, SFX_LARA_FOOTSTEP\n2, SFX_LARA_NO\n6, SFX_LARA_DRAW\n7, SFX_LARA_HOLSTER\n8, SFX_LARA_PISTOLS\n9, SFX_LARA_REL"
},
{
"path": "data/trx/ship/games/tr2/gameflow.json5",
"chars": 29002,
"preview": "{\n // NOTE: bad changes to this file may result in crashes.\n // Lines starting with double slashes are comments an"
},
{
"path": "data/trx/ship/games/tr2/inv_ring.json5",
"chars": 14655,
"preview": "[\n {\n \"object_id\": \"O_SMALL_MEDIPACK_OPTION\",\n \"frames_total\": 26,\n \"open_frame\": 25,\n \"a"
},
{
"path": "data/trx/ship/games/tr2/scripts/assault.lua",
"chars": 307,
"preview": "trx.events.on_game_start(function(level, is_save)\n trx.lara.holsters_visible = trx.lara.has_pistol_weapon -- TODO: remo"
},
{
"path": "data/trx/ship/games/tr2/scripts/cut3.lua",
"chars": 272,
"preview": "local suit_change_anim = 7\nlocal outfit_changed = false\n\ntrx.events.after_control(function()\n local lara_item = trx.lar"
},
{
"path": "data/trx/ship/games/tr2/scripts/floating.lua",
"chars": 153,
"preview": "trx.events.after_level_file(function(level)\n trx.objects.swap_mesh(trx.catalog.objects.secret_2_option, trx.catalog.obj"
},
{
"path": "data/trx/ship/games/tr2/scripts/house.lua",
"chars": 268,
"preview": "trx.events.on_game_start(function(level, is_save)\n trx.lara.holsters_visible = trx.lara.has_pistol_weapon\n if trx.lara"
},
{
"path": "data/trx/ship/games/tr2/scripts/level1.lua",
"chars": 165,
"preview": "trx.events.before_level_file(function(level)\n trx.creatures.add_ally(trx.catalog.objects.monk_1)\n trx.creatures.add_al"
},
{
"path": "data/trx/ship/games/tr2/scripts/level3.lua",
"chars": 227,
"preview": "trx.events.before_level_file(function(level)\n trx.creatures.add_ally(trx.catalog.objects.monk_2)\n trx.creatures.add_al"
},
{
"path": "data/trx/ship/games/tr2/scripts/level4.lua",
"chars": 165,
"preview": "trx.events.before_level_file(function(level)\n trx.creatures.add_ally(trx.catalog.objects.monk_2)\n trx.creatures.add_al"
},
{
"path": "data/trx/ship/games/tr2/scripts/monastry.lua",
"chars": 280,
"preview": "trx.events.before_level_file(function(level)\n trx.creatures.add_ally(trx.catalog.objects.monk_1)\n trx.creatures.add_al"
},
{
"path": "data/trx/ship/games/tr2/strings-de.json5",
"chars": 9264,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/games/tr2/strings-en-gb.json5",
"chars": 523,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/games/tr2/strings-fr.json5",
"chars": 10233,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/games/tr2/strings-gd.json5",
"chars": 9351,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/games/tr2/strings-it.json5",
"chars": 9430,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/games/tr2/strings-pl.json5",
"chars": 9172,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/games/tr2/strings.json5",
"chars": 8934,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/games/tr2/weapons.json5",
"chars": 9003,
"preview": "{\n \"LGT_UNARMED\": {\n \"sample_num\": \"SFX_LARA_NO\",\n },\n\n \"LGT_FLARE\": {\n \"ammo\": {\n \"in"
},
{
"path": "data/trx/ship/games/tr2-gm/gameflow.json5",
"chars": 8981,
"preview": "{\n // NOTE: bad changes to this file may result in crashes.\n // Lines starting with double slashes are comments an"
},
{
"path": "data/trx/ship/games/tr2-gm/strings-de.json5",
"chars": 2089,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/games/tr2-gm/strings-fr.json5",
"chars": 2342,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/games/tr2-gm/strings-gd.json5",
"chars": 2128,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/games/tr2-gm/strings-it.json5",
"chars": 2151,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/games/tr2-gm/strings-pl.json5",
"chars": 2085,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/games/tr2-gm/strings.json5",
"chars": 2054,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/games/tr2-level/gameflow.json5",
"chars": 985,
"preview": "{\n // This file is used to enable the -l argument support.\n\n \"engine\": 2,\n \"extends\": \"tr2\",\n \"name\": \"TR2 D"
},
{
"path": "data/trx/ship/games/tr2-level/strings-de.json5",
"chars": 193,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/games/tr2-level/strings-fr.json5",
"chars": 208,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/games/tr2-level/strings-gd.json5",
"chars": 197,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/games/tr2-level/strings-it.json5",
"chars": 200,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/games/tr2-level/strings-pl.json5",
"chars": 198,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/games/tr2-level/strings.json5",
"chars": 194,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/games/tr3/catalog_item_actions.csv",
"chars": 1844,
"preview": "0, ITEM_ACTION_TURN_180\n1, ITEM_ACTION_FLOOR_SHAKE\n2, ITEM_ACTION_LARA_NORMAL\n3, ITEM_ACTION_BUBBLES\n4, ITEM_ACTION_FINI"
},
{
"path": "data/trx/ship/games/tr3/catalog_lara_anims.csv",
"chars": 8920,
"preview": "0, LA_RUN\n1, LA_WALK_FORWARD\n2, LA_WALK_STOP_RIGHT\n3, LA_WALK_STOP_LEFT\n4, LA_WALK_TO_RUN_RIGHT\n5, LA_WALK_TO_RUN_LEFT\n6"
},
{
"path": "data/trx/ship/games/tr3/catalog_lara_states.csv",
"chars": 1690,
"preview": "0, LS_WALK\n1, LS_RUN\n2, LS_STOP\n3, LS_JUMP_FORWARD\n4, LS_POSE\n5, LS_FAST_BACK\n6, LS_TURN_RIGHT\n7, LS_TURN_LEFT\n8, LS_DEA"
},
{
"path": "data/trx/ship/games/tr3/catalog_music.csv",
"chars": 610,
"preview": "12, MX_RIB_THEME\n12, MX_MINE_CART_THEME\n82, MX_TR3_GYM_EXERCISE_07\n83, MX_TR3_GYM_EXERCISE_14\n86, MX_TR3_GYM_EXERCISE_04"
},
{
"path": "data/trx/ship/games/tr3/catalog_objects.csv",
"chars": 9110,
"preview": "0, O_LARA\n1, O_LARA_PISTOLS\n2, O_LARA_HAIR\n3, O_LARA_SHOTGUN\n4, O_LARA_DESERT_EAGLE\n5, O_LARA_UZIS\n6, O_LA"
},
{
"path": "data/trx/ship/games/tr3/catalog_samples.csv",
"chars": 2529,
"preview": "0, SFX_LARA_FOOTSTEP\n2, SFX_LARA_NO\n6, SFX_LARA_DRAW\n7, SFX_LARA_HOLSTER\n8, SFX_LARA_PISTOLS\n9, SFX_LARA_REL"
},
{
"path": "data/trx/ship/games/tr3/gameflow.json5",
"chars": 26187,
"preview": "{\n // NOTE: bad changes to this file may result in crashes.\n // Lines starting with double slashes are comments an"
},
{
"path": "data/trx/ship/games/tr3/inv_ring.json5",
"chars": 16205,
"preview": "[\n {\n \"object_id\": \"O_SMALL_MEDIPACK_OPTION\",\n \"frames_total\": 26,\n \"open_frame\": 25,\n \"a"
},
{
"path": "data/trx/ship/games/tr3/scripts/area51.lua",
"chars": 105,
"preview": "trx.events.before_level_file(function(level)\n trx.creatures.add_ally(trx.catalog.objects.prisoner)\nend)\n"
},
{
"path": "data/trx/ship/games/tr3/scripts/compound.lua",
"chars": 105,
"preview": "trx.events.before_level_file(function(level)\n trx.creatures.add_ally(trx.catalog.objects.prisoner)\nend)\n"
},
{
"path": "data/trx/ship/games/tr3/scripts/crash.lua",
"chars": 113,
"preview": "trx.events.before_level_file(function(level)\n trx.creatures.add_ally(trx.catalog.objects.sthpac_mercenary)\nend)\n"
},
{
"path": "data/trx/ship/games/tr3/scripts/cut8.lua",
"chars": 316,
"preview": "local drink_frame_num = 737\nlocal equipment_set = false\n\ntrx.events.after_control(function()\n local lara_item = trx.lar"
},
{
"path": "data/trx/ship/games/tr3/scripts/jungle.lua",
"chars": 103,
"preview": "trx.events.before_level_file(function(level)\n trx.creatures.add_ally(trx.catalog.objects.monkey)\nend)\n"
},
{
"path": "data/trx/ship/games/tr3/scripts/mines.lua",
"chars": 108,
"preview": "trx.events.before_level_file(function(level)\n trx.creatures.add_ally(trx.catalog.objects.rx_worker_3)\nend)\n"
},
{
"path": "data/trx/ship/games/tr3/scripts/tower.lua",
"chars": 103,
"preview": "trx.events.before_level_file(function(level)\n trx.creatures.add_ally(trx.catalog.objects.punk_1)\nend)\n"
},
{
"path": "data/trx/ship/games/tr3/scripts/zoo.lua",
"chars": 103,
"preview": "trx.events.before_level_file(function(level)\n trx.creatures.add_ally(trx.catalog.objects.monkey)\nend)\n"
},
{
"path": "data/trx/ship/games/tr3/strings-de.json5",
"chars": 8448,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/games/tr3/strings-it.json5",
"chars": 8484,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/games/tr3/strings-pl.json5",
"chars": 8291,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/games/tr3/strings.json5",
"chars": 8044,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
},
{
"path": "data/trx/ship/games/tr3/weapons.json5",
"chars": 10421,
"preview": "{\n \"LGT_UNARMED\": {\n \"sample_num\": \"SFX_LARA_NO\",\n },\n\n \"LGT_FLARE\": {\n \"ammo\": {\n \"in"
},
{
"path": "data/trx/ship/games/tr3-la/gameflow.json5",
"chars": 7636,
"preview": "{\n // NOTE: bad changes to this file may result in crashes.\n // Lines starting with double slashes are comments an"
},
{
"path": "data/trx/ship/games/tr3-la/strings-de.json5",
"chars": 2317,
"preview": "{\n // For usage, refer to the documentation here:\n // https://lostartefacts.dev/trx/docs/stable/game_strings\n \""
}
]
// ... and 1412 more files (download for full content)
About this extraction
This page contains the full source code of the LostArtefacts/TR1X GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1612 files (8.5 MB), approximately 2.3M tokens, and a symbol index with 7493 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.