Skip to content

Commit a672aa1

Browse files
committed
Add support for Oblivion Remastered
1 parent a51b102 commit a672aa1

6 files changed

Lines changed: 33 additions & 11 deletions

File tree

ffi/src/constants.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,3 +159,7 @@ pub static LIBLO_GAME_STARFIELD: c_uint = 10;
159159
/// Game code for OpenMW.
160160
#[no_mangle]
161161
pub static LIBLO_GAME_OPENMW: c_uint = 11;
162+
163+
/// Game code for The Elder Scrolls IV: Oblivion Remastered.
164+
#[no_mangle]
165+
pub static LIBLO_GAME_OBLIVION_REMASTERED: c_uint = 12;

ffi/src/handle.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,9 @@ use loadorder::WritableLoadOrder;
3131
use crate::constants::{
3232
LIBLO_ERROR_INVALID_ARGS, LIBLO_ERROR_PANICKED, LIBLO_ERROR_PATH_ENCODE_FAIL,
3333
LIBLO_ERROR_POISONED_THREAD_LOCK, LIBLO_GAME_FNV, LIBLO_GAME_FO3, LIBLO_GAME_FO4,
34-
LIBLO_GAME_FO4VR, LIBLO_GAME_OPENMW, LIBLO_GAME_STARFIELD, LIBLO_GAME_TES3, LIBLO_GAME_TES4,
35-
LIBLO_GAME_TES5, LIBLO_GAME_TES5SE, LIBLO_GAME_TES5VR, LIBLO_OK, LIBLO_WARN_LO_MISMATCH,
34+
LIBLO_GAME_FO4VR, LIBLO_GAME_OBLIVION_REMASTERED, LIBLO_GAME_OPENMW, LIBLO_GAME_STARFIELD,
35+
LIBLO_GAME_TES3, LIBLO_GAME_TES4, LIBLO_GAME_TES5, LIBLO_GAME_TES5SE, LIBLO_GAME_TES5VR,
36+
LIBLO_OK, LIBLO_WARN_LO_MISMATCH,
3637
};
3738
use crate::helpers::{
3839
error, handle_error, to_c_string, to_c_string_array, to_path_buf_vec, to_str,
@@ -62,6 +63,7 @@ fn map_game_id(game_id: u32) -> Result<GameId, u32> {
6263
x if x == LIBLO_GAME_FO4VR => Ok(GameId::Fallout4VR),
6364
x if x == LIBLO_GAME_STARFIELD => Ok(GameId::Starfield),
6465
x if x == LIBLO_GAME_OPENMW => Ok(GameId::OpenMW),
66+
x if x == LIBLO_GAME_OBLIVION_REMASTERED => Ok(GameId::OblivionRemastered),
6567
_ => Err(LIBLO_ERROR_INVALID_ARGS),
6668
}
6769
}

ffi/tests/ffi.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ void test_game_id_values() {
2323
assert(LIBLO_GAME_TES5VR == 9);
2424
assert(LIBLO_GAME_STARFIELD == 10);
2525
assert(LIBLO_GAME_OPENMW == 11);
26+
assert(LIBLO_GAME_OBLIVION_REMASTERED == 12);
2627
}
2728

2829
void test_lo_get_version() {

src/enums.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,13 +46,14 @@ pub enum GameId {
4646
SkyrimVR,
4747
Starfield,
4848
OpenMW,
49+
OblivionRemastered,
4950
}
5051

5152
impl GameId {
5253
pub fn to_esplugin_id(self) -> esplugin::GameId {
5354
match self {
5455
GameId::Morrowind | GameId::OpenMW => esplugin::GameId::Morrowind,
55-
GameId::Oblivion => esplugin::GameId::Oblivion,
56+
GameId::Oblivion | GameId::OblivionRemastered => esplugin::GameId::Oblivion,
5657
GameId::Skyrim => esplugin::GameId::Skyrim,
5758
GameId::SkyrimSE | GameId::SkyrimVR => esplugin::GameId::SkyrimSE,
5859
GameId::Fallout3 => esplugin::GameId::Fallout3,

src/game_settings.rs

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,8 @@ const MS_FO4_VAULT_TEC_PATH: &str = "../../Fallout 4- Vault-Tec Workshop (PC)/Co
107107

108108
const PLUGINS_TXT: &str = "Plugins.txt";
109109

110+
const OBLIVION_REMASTERED_RELATIVE_DATA_PATH: &str = "OblivionRemastered/Content/Dev/ObvData/Data";
111+
110112
impl GameSettings {
111113
pub fn new(game_id: GameId, game_path: &Path) -> Result<GameSettings, Error> {
112114
let local_path = local_path(game_id, game_path)?.unwrap_or_default();
@@ -130,7 +132,7 @@ impl GameSettings {
130132
my_games_path: PathBuf,
131133
) -> Result<GameSettings, Error> {
132134
let plugins_file_path = plugins_file_path(game_id, game_path, local_path)?;
133-
let load_order_path = load_order_path(game_id, local_path);
135+
let load_order_path = load_order_path(game_id, local_path, &plugins_file_path);
134136
let plugins_directory = plugins_directory(game_id, game_path, local_path)?;
135137
let additional_plugins_directories =
136138
additional_plugins_directories(game_id, game_path, &my_games_path)?;
@@ -167,7 +169,7 @@ impl GameSettings {
167169
GameId::Morrowind | GameId::Oblivion | GameId::Fallout3 | GameId::FalloutNV => {
168170
LoadOrderMethod::Timestamp
169171
}
170-
GameId::Skyrim => LoadOrderMethod::Textfile,
172+
GameId::Skyrim | GameId::OblivionRemastered => LoadOrderMethod::Textfile,
171173
GameId::SkyrimSE
172174
| GameId::SkyrimVR
173175
| GameId::Fallout4
@@ -189,7 +191,7 @@ impl GameSettings {
189191
pub fn master_file(&self) -> &'static str {
190192
match self.id {
191193
GameId::Morrowind | GameId::OpenMW => "Morrowind.esm",
192-
GameId::Oblivion => "Oblivion.esm",
194+
GameId::Oblivion | GameId::OblivionRemastered => "Oblivion.esm",
193195
GameId::Skyrim | GameId::SkyrimSE | GameId::SkyrimVR => "Skyrim.esm",
194196
GameId::Fallout3 => "Fallout3.esm",
195197
GameId::FalloutNV => "FalloutNV.esm",
@@ -356,7 +358,7 @@ fn local_path(game_id: GameId, game_path: &Path) -> Result<Option<PathBuf>, Erro
356358
// The local path can vary depending on where the game was bought from.
357359
fn appdata_folder_name(game_id: GameId, game_path: &Path) -> Option<&'static str> {
358360
match game_id {
359-
GameId::Morrowind | GameId::OpenMW => None,
361+
GameId::Morrowind | GameId::OpenMW | GameId::OblivionRemastered => None,
360362
GameId::Oblivion => Some("Oblivion"),
361363
GameId::Skyrim => Some(skyrim_appdata_folder_name(game_path)),
362364
GameId::SkyrimSE => Some(skyrim_se_appdata_folder_name(game_path)),
@@ -444,6 +446,7 @@ fn my_games_path(
444446
fn my_games_folder_name(game_id: GameId, game_path: &Path) -> Option<&'static str> {
445447
match game_id {
446448
GameId::OpenMW => Some("OpenMW"),
449+
GameId::OblivionRemastered => Some("Oblivion Remastered"),
447450
GameId::Skyrim => Some(skyrim_my_games_folder_name(game_path)),
448451
// For all other games the name is the same as the AppData\Local folder name.
449452
_ => appdata_folder_name(game_id, game_path),
@@ -461,11 +464,12 @@ fn skyrim_my_games_folder_name(game_path: &Path) -> &'static str {
461464
fn is_microsoft_store_install(game_id: GameId, game_path: &Path) -> bool {
462465
const APPX_MANIFEST: &str = "appxmanifest.xml";
463466

467+
// TODO: Oblivion Remastered - path to manifest is C:\XboxGames\The Elder Scrolls IV- Oblivion Remastered\Content\,
464468
match game_id {
465469
GameId::Morrowind | GameId::Oblivion | GameId::Fallout3 | GameId::FalloutNV => game_path
466470
.parent()
467471
.is_some_and(|parent| parent.join(APPX_MANIFEST).exists()),
468-
GameId::SkyrimSE | GameId::Fallout4 | GameId::Starfield => {
472+
GameId::SkyrimSE | GameId::Fallout4 | GameId::Starfield | GameId::OblivionRemastered => {
469473
game_path.join(APPX_MANIFEST).exists()
470474
}
471475
_ => false,
@@ -501,6 +505,7 @@ fn plugins_directory(
501505
match game_id {
502506
GameId::OpenMW => openmw_config::resources_vfs_path(game_path, local_path),
503507
GameId::Morrowind => Ok(game_path.join("Data Files")),
508+
GameId::OblivionRemastered => Ok(game_path.join(OBLIVION_REMASTERED_RELATIVE_DATA_PATH)),
504509
_ => Ok(game_path.join("Data")),
505510
}
506511
}
@@ -529,9 +534,15 @@ fn additional_plugins_directories(
529534
}
530535
}
531536

532-
fn load_order_path(game_id: GameId, local_path: &Path) -> Option<PathBuf> {
537+
fn load_order_path(
538+
game_id: GameId,
539+
local_path: &Path,
540+
plugins_file_path: &Path,
541+
) -> Option<PathBuf> {
542+
const LOADORDER_TXT: &str = "loadorder.txt";
533543
match game_id {
534-
GameId::Skyrim => Some(local_path.join("loadorder.txt")),
544+
GameId::Skyrim => Some(local_path.join(LOADORDER_TXT)),
545+
GameId::OblivionRemastered => plugins_file_path.parent().map(|p| p.join(LOADORDER_TXT)),
535546
_ => None,
536547
}
537548
}
@@ -545,6 +556,9 @@ fn plugins_file_path(
545556
GameId::OpenMW => Ok(local_path.join("openmw.cfg")),
546557
GameId::Morrowind => Ok(game_path.join("Morrowind.ini")),
547558
GameId::Oblivion => oblivion_plugins_file_path(game_path, local_path),
559+
GameId::OblivionRemastered => Ok(game_path
560+
.join(OBLIVION_REMASTERED_RELATIVE_DATA_PATH)
561+
.join(PLUGINS_TXT)),
548562
// Although the launchers for Fallout 3, Fallout NV and Skyrim all create plugins.txt, the
549563
// games themselves read Plugins.txt.
550564
_ => Ok(local_path.join(PLUGINS_TXT)),

src/ini.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ pub(crate) fn test_files(
125125
my_games_path: &Path,
126126
) -> Result<Vec<String>, Error> {
127127
match game_id {
128-
GameId::Morrowind | GameId::OpenMW => Ok(Vec::new()),
128+
GameId::Morrowind | GameId::OpenMW | GameId::OblivionRemastered => Ok(Vec::new()),
129129
GameId::Oblivion => {
130130
let ini_path = game_path.join("Oblivion.ini");
131131

0 commit comments

Comments
 (0)