mirror of
https://github.com/Abdess/retroarch_system.git
synced 2026-04-13 04:12:33 -05:00
Remove 30 phantom shapes[2-v].dat entries. shapeFile[34] in lvlmast.c maps to newsh?.shp (enemy sprites), NOT shapes?.dat (level tilesets). Only 5 shapes exist: ), W, X, Y, Z — the characters actually referenced by level data. Verified against trapexit/libretro-opentyrian source. Cross-ref: 54 -> 24.
375 lines
12 KiB
YAML
375 lines
12 KiB
YAML
emulator: OpenTyrian
|
|
type: libretro
|
|
core_classification: game_engine
|
|
source: "https://github.com/trapexit/libretro-opentyrian"
|
|
upstream: "https://github.com/opentyrian/opentyrian"
|
|
profiled_date: "2026-03-24"
|
|
core_version: "1.0.0.6"
|
|
display_name: "Tyrian (OpenTyrian)"
|
|
cores: [opentyrian, tyrian]
|
|
systems: [tyrian]
|
|
verification: existence
|
|
|
|
notes: |
|
|
OpenTyrian is a source port of the DOS vertical scrolling shooter Tyrian,
|
|
ported to libretro. It loads the Tyrian 2.1 freeware game data directly.
|
|
Tyrian 1.x, 2.0, and Tyrian 2000 data files are NOT compatible.
|
|
|
|
The core's .info file sets supports_no_game = true. The core locates the
|
|
data directory by probing for tyrian1.lvl in several paths (file.c:33-58):
|
|
1. custom_data_dir (set via --data= CLI argument, params.c:120)
|
|
2. TYRIAN_DIR (compile-time constant, Makefile:5-8)
|
|
3. "data" (relative subdirectory)
|
|
4. "." (current working directory)
|
|
The first path containing tyrian1.lvl wins.
|
|
|
|
On startup (opentyr.c:270-388), the core:
|
|
- Scans for episodes by checking tyrian1.lvl through tyrian5.lvl
|
|
(episodes.c:270-277)
|
|
- Loads palette data from palette.dat (palette.c:45)
|
|
- Loads main shape tables from tyrian.shp (sprite.c:669-722, 12 sprite
|
|
banks packed in one file: fonts, interface, option sprites, game sprites,
|
|
weapon sprites, etc.)
|
|
- Loads sound effects from tyrian.snd and voice samples from voices.snd
|
|
(nortsong.c:112-134, opentyr.c:333)
|
|
- Loads music from music.mus (loudness.c:196)
|
|
- Loads help/item data from tyrian.hdt (helptext.c:184, episodes.c:60)
|
|
- Loads picture data from tyrian.pic (picload.c:32)
|
|
- Loads credits from tyrian.cdt (mainint.c:2002)
|
|
|
|
Each episode loads additional files dynamically (episodes.c:261-263):
|
|
- tyrianN.lvl (level data, N=1-5)
|
|
- levelsN.dat (episode level definitions)
|
|
- cubetxtN.dat (datacube text for story mode)
|
|
|
|
The game engine also loads shape files on demand:
|
|
- shapesX.dat where X is a character read from the level file (5 used: ), W, X, Y, Z)
|
|
(lvlmast.c:23-27, tyrian2.c:3079). Characters used:
|
|
2,4,7,8,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,5,#,V,0,@,3,^,9
|
|
- newshX.shp loaded via JE_loadCompShapes (sprite.c:469-481) using the
|
|
same character set plus '~' for destruct mode (destruct.c:569) and
|
|
'1' for arrow/mouse cursor sprites (mainint.c:493,884,1462) and
|
|
'6' for explosion sprites (tyrian2.c:771)
|
|
|
|
Additional optional files:
|
|
- tyrianc.shp and voicesc.snd for Christmas mode (opentyr.c:301-309)
|
|
- tyrend.anm for ending animation (tyrian2.c:2473)
|
|
- tshp2.pcx loaded during gameplay (tyrian2.c:2757, pcxload.c:25)
|
|
- estsc.shp for ending sequence sprites (mainint.c:1995)
|
|
- demo.1 through demo.5 for demo playback (mainint.c:1781-1786)
|
|
|
|
All filenames must be lowercase on case-sensitive filesystems. The repo
|
|
includes lower-script.sh for batch renaming.
|
|
|
|
The Tyrian 2.1 freeware data is available at:
|
|
https://camanis.net/tyrian/tyrian21.zip
|
|
|
|
No separate BIOS or firmware is needed. The freeware game data set is the
|
|
sole system requirement.
|
|
|
|
files:
|
|
# -----------------------------------------------------------
|
|
# Core data files (required, loaded unconditionally at init)
|
|
# -----------------------------------------------------------
|
|
- name: "tyrian.shp"
|
|
category: game_data
|
|
system: tyrian
|
|
description: "Main shape tables (12 sprite banks: fonts, interface, options, game sprites)"
|
|
required: true
|
|
source_ref: "sprite.c:669-722 (JE_loadMainShapeTables)"
|
|
|
|
- name: "palette.dat"
|
|
category: game_data
|
|
system: tyrian
|
|
description: "Color palette data (all palettes used by the game)"
|
|
required: true
|
|
source_ref: "palette.c:45 (JE_loadPals)"
|
|
|
|
- name: "tyrian.hdt"
|
|
category: game_data
|
|
system: tyrian
|
|
description: "Help and item data (weapons, ships, shields, enemies, help text)"
|
|
required: true
|
|
source_ref: "episodes.c:60 (JE_loadItemDat), helptext.c:184 (JE_loadHelpText)"
|
|
|
|
- name: "tyrian.pic"
|
|
category: game_data
|
|
system: tyrian
|
|
description: "Picture data (menu backgrounds, cutscene images)"
|
|
required: true
|
|
source_ref: "picload.c:32 (JE_loadPic)"
|
|
|
|
- name: "tyrian.cdt"
|
|
category: game_data
|
|
system: tyrian
|
|
description: "Credits text (encrypted pascal strings)"
|
|
required: true
|
|
source_ref: "mainint.c:2002 (JE_drawCredits)"
|
|
|
|
- name: "tyrian.snd"
|
|
category: game_data
|
|
system: tyrian
|
|
description: "Sound effects"
|
|
required: true
|
|
source_ref: "nortsong.c:112, opentyr.c:333 (JE_loadSndFile)"
|
|
|
|
- name: "voices.snd"
|
|
category: game_data
|
|
system: tyrian
|
|
description: "Voice samples"
|
|
required: true
|
|
source_ref: "nortsong.c:134, opentyr.c:333 (JE_loadSndFile)"
|
|
|
|
- name: "music.mus"
|
|
category: game_data
|
|
system: tyrian
|
|
description: "Music data (all game tracks)"
|
|
required: true
|
|
source_ref: "loudness.c:196 (load_music)"
|
|
|
|
# -----------------------------------------------------------
|
|
# Episode level files (episode 1 required, 2-5 optional)
|
|
# -----------------------------------------------------------
|
|
- name: "tyrian1.lvl"
|
|
category: game_data
|
|
system: tyrian
|
|
description: "Episode 1 level data (also used as data directory detection marker)"
|
|
required: true
|
|
source_ref: "file.c:51 (data_dir probe), episodes.c:274 (JE_scanForEpisodes)"
|
|
|
|
- name: "levels1.dat"
|
|
category: game_data
|
|
system: tyrian
|
|
description: "Episode 1 level definitions"
|
|
required: true
|
|
source_ref: "episodes.c:263 (JE_initEpisode), tyrian2.c:2434"
|
|
|
|
- name: "cubetxt1.dat"
|
|
category: game_data
|
|
system: tyrian
|
|
description: "Episode 1 datacube text (in-game story lore)"
|
|
required: true
|
|
source_ref: "episodes.c:262 (JE_initEpisode), game_menu.c:1723"
|
|
|
|
- name: "tyrian2.lvl"
|
|
category: game_data
|
|
system: tyrian
|
|
description: "Episode 2 level data"
|
|
required: false
|
|
source_ref: "episodes.c:274"
|
|
|
|
- name: "levels2.dat"
|
|
category: game_data
|
|
system: tyrian
|
|
description: "Episode 2 level definitions"
|
|
required: false
|
|
source_ref: "episodes.c:263"
|
|
|
|
- name: "cubetxt2.dat"
|
|
category: game_data
|
|
system: tyrian
|
|
description: "Episode 2 datacube text"
|
|
required: false
|
|
source_ref: "episodes.c:262"
|
|
|
|
- name: "tyrian3.lvl"
|
|
category: game_data
|
|
system: tyrian
|
|
description: "Episode 3 level data"
|
|
required: false
|
|
source_ref: "episodes.c:274"
|
|
|
|
- name: "levels3.dat"
|
|
category: game_data
|
|
system: tyrian
|
|
description: "Episode 3 level definitions"
|
|
required: false
|
|
source_ref: "episodes.c:263"
|
|
|
|
- name: "cubetxt3.dat"
|
|
category: game_data
|
|
system: tyrian
|
|
description: "Episode 3 datacube text"
|
|
required: false
|
|
source_ref: "episodes.c:262"
|
|
|
|
- name: "tyrian4.lvl"
|
|
category: game_data
|
|
system: tyrian
|
|
description: "Episode 4 level data"
|
|
required: false
|
|
source_ref: "episodes.c:274"
|
|
|
|
- name: "levels4.dat"
|
|
category: game_data
|
|
system: tyrian
|
|
description: "Episode 4 level definitions"
|
|
required: false
|
|
source_ref: "episodes.c:263"
|
|
|
|
- name: "cubetxt4.dat"
|
|
category: game_data
|
|
system: tyrian
|
|
description: "Episode 4 datacube text"
|
|
required: false
|
|
source_ref: "episodes.c:262"
|
|
|
|
- name: "tyrian5.lvl"
|
|
category: game_data
|
|
system: tyrian
|
|
description: "Episode 5 level data"
|
|
required: false
|
|
source_ref: "episodes.c:274"
|
|
|
|
- name: "levels5.dat"
|
|
category: game_data
|
|
system: tyrian
|
|
description: "Episode 5 level definitions"
|
|
required: false
|
|
source_ref: "episodes.c:263"
|
|
|
|
- name: "cubetxt5.dat"
|
|
category: game_data
|
|
system: tyrian
|
|
description: "Episode 5 datacube text"
|
|
required: false
|
|
source_ref: "episodes.c:262"
|
|
|
|
# -----------------------------------------------------------
|
|
# Level tileset shapes (loaded per-level from .lvl data)
|
|
# The level file specifies a character via fgetc() at tyrian2.c:3039,
|
|
# which maps to shapes{char}.dat at tyrian2.c:3079.
|
|
# Only 5 characters are used by actual levels: ), W, X, Y, Z.
|
|
# Note: shapeFile[34] in lvlmast.c is a DIFFERENT mechanism —
|
|
# it maps indices to characters for newsh?.shp (enemy sprites),
|
|
# NOT for shapes?.dat (level tilesets).
|
|
# -----------------------------------------------------------
|
|
- name: "shapes).dat"
|
|
category: game_data
|
|
system: tyrian
|
|
required: true
|
|
source_ref: "tyrian2.c:3039-3079"
|
|
|
|
- name: "shapesw.dat"
|
|
category: game_data
|
|
system: tyrian
|
|
required: true
|
|
source_ref: "tyrian2.c:3039-3079"
|
|
|
|
- name: "shapesx.dat"
|
|
category: game_data
|
|
system: tyrian
|
|
required: true
|
|
source_ref: "tyrian2.c:3039-3079"
|
|
|
|
- name: "shapesy.dat"
|
|
category: game_data
|
|
system: tyrian
|
|
required: true
|
|
source_ref: "tyrian2.c:3039-3079"
|
|
|
|
- name: "shapesz.dat"
|
|
category: game_data
|
|
system: tyrian
|
|
required: true
|
|
source_ref: "tyrian2.c:3039-3079"
|
|
|
|
# -----------------------------------------------------------
|
|
# Compressed shape files (newshX.shp, loaded per-level)
|
|
# shapeFile[34] in lvlmast.c maps indices to characters for
|
|
# these files via JE_loadCompShapes (sprite.c:469).
|
|
# -----------------------------------------------------------
|
|
- name: "newsh1.shp"
|
|
category: game_data
|
|
system: tyrian
|
|
description: "Compressed sprites (arrows, mouse cursor)"
|
|
required: false
|
|
source_ref: "mainint.c:493,884,1462 (JE_loadCompShapes '1')"
|
|
|
|
- name: "newsh6.shp"
|
|
category: game_data
|
|
system: tyrian
|
|
description: "Compressed sprites (explosions)"
|
|
required: false
|
|
source_ref: "tyrian2.c:771 (JE_loadCompShapes '6')"
|
|
|
|
- name: "newsh~.shp"
|
|
category: game_data
|
|
system: tyrian
|
|
description: "Compressed sprites (destruct mode)"
|
|
required: false
|
|
source_ref: "destruct.c:569 (JE_loadCompShapes '~')"
|
|
|
|
# -----------------------------------------------------------
|
|
# Optional / special mode files
|
|
# -----------------------------------------------------------
|
|
- name: "tyrianc.shp"
|
|
category: game_data
|
|
system: tyrian
|
|
description: "Christmas mode shape tables (replaces tyrian.shp at Xmas)"
|
|
required: false
|
|
source_ref: "opentyr.c:301-309"
|
|
|
|
- name: "voicesc.snd"
|
|
category: game_data
|
|
system: tyrian
|
|
description: "Christmas mode voice samples (replaces voices.snd at Xmas)"
|
|
required: false
|
|
source_ref: "opentyr.c:301,333"
|
|
|
|
- name: "tyrend.anm"
|
|
category: game_data
|
|
system: tyrian
|
|
description: "Ending animation sequence"
|
|
required: false
|
|
source_ref: "tyrian2.c:2473 (JE_playAnim)"
|
|
|
|
- name: "tshp2.pcx"
|
|
category: game_data
|
|
system: tyrian
|
|
description: "Additional ship graphics (PCX image)"
|
|
required: false
|
|
source_ref: "tyrian2.c:2757, pcxload.c:25-29"
|
|
|
|
- name: "estsc.shp"
|
|
category: game_data
|
|
system: tyrian
|
|
description: "Ending sequence character sprites"
|
|
required: false
|
|
source_ref: "mainint.c:1995 (load_sprites_file EXTRA_SHAPES)"
|
|
|
|
- name: "demo.1"
|
|
category: game_data
|
|
system: tyrian
|
|
description: "Demo replay file 1"
|
|
required: false
|
|
source_ref: "mainint.c:1781-1786"
|
|
|
|
- name: "demo.2"
|
|
category: game_data
|
|
system: tyrian
|
|
description: "Demo replay file 2"
|
|
required: false
|
|
source_ref: "mainint.c:1781-1786"
|
|
|
|
- name: "demo.3"
|
|
category: game_data
|
|
system: tyrian
|
|
description: "Demo replay file 3"
|
|
required: false
|
|
source_ref: "mainint.c:1781-1786"
|
|
|
|
- name: "demo.4"
|
|
category: game_data
|
|
system: tyrian
|
|
description: "Demo replay file 4"
|
|
required: false
|
|
source_ref: "mainint.c:1781-1786"
|
|
|
|
- name: "demo.5"
|
|
category: game_data
|
|
system: tyrian
|
|
description: "Demo replay file 5"
|
|
required: false
|
|
source_ref: "mainint.c:1781-1786"
|