public ResourcesViewModel(IResourceService resourceService) { _resourceService = resourceService; _currentGame = NFSGame.Undetermined; Groups = new ObservableCollection <ResourceGroup>(); Messenger.Default.Register <LoadGameMessage>(this, LoadGame); LoadFileCommand = new RelayCommand <GameFile>(LoadFile); SaveFileCommand = new RelayCommand <GameFile>(SaveFile); ViewTexturePackCommand = new RelayCommand <TexturePackResource>(ViewTexturePack); ViewSolidListCommand = new RelayCommand <SolidListResource>(ViewSolidList); }
/// <summary> /// Load a game directory and build the directory tree. /// </summary> /// <param name="message"></param> private void LoadGame(LoadGameMessage message) { // Reset data _resourceService.PurgeResources(); Groups.Clear(); if (!Directory.Exists(message.Directory)) { throw new FileNotFoundException($"Invalid directory: {message.Directory}"); } foreach (var directory in Directory.EnumerateDirectories(message.Directory)) { Groups.Add(CreateTreeGroup(directory, message.Directory)); } foreach (var file in Directory.EnumerateFiles(message.Directory).OrderBy(k => k)) { var gameFile = new GameFile { Name = file.Replace($"{message.Directory}\\", ""), Extension = Path.GetExtension(file).Replace(".", ""), Resources = new ObservableCollection <GameResource>(), SubGroups = new ObservableCollection <ResourceGroup>(), FullPath = file }; gameFile.Actions = BuildActionList(gameFile); Groups.Add(gameFile); } _currentGame = message.Game; Messenger.Default.Send(new WindowTitleMessage { Title = $"OpenNFS | {message.Directory}" }); Messenger.Default.Send(new ConsoleLogMessage { Level = MessageLevel.Info, Message = $"Loaded game. Detected: {message.Game}" }); }
public void Save(string file, List <BaseModel> models, NFSGame game) { using (var reader = new BinaryReader(File.OpenRead(file))) { using (var writer = new BinaryWriter(File.OpenWrite($"{file}_out"))) { switch (game) { case NFSGame.World: { new WorldFileWriteContainer().Write(reader, writer, models); break; } default: throw new InvalidOperationException($"Unsupported game: {game}"); } } } }
public async Task <List <BaseModel> > Load(string file, string group, NFSGame game) { return(await Task.Run(() => { List <BaseModel> results; using (var reader = File.OpenRead(file)) { switch (game) { case NFSGame.MW: { results = new MWFileReadContainer(new BinaryReader(reader), file, null).Get(); break; } case NFSGame.World: { results = new WorldFileReadContainer(new BinaryReader(reader), file, null).Get(); break; } default: throw new InvalidOperationException($"Unsupported game: {game}"); } } ProcessModels(results, group); return results; })); }
/// <summary> /// Detects and applies process variables for the supported NFS games. /// </summary> private static void GetNFSGame() { Log.Print(NFSScriptLoader.INFO_TAG, "Getting executeable in directory."); _currentNFSGame = NFS.DetectGameExecutableInDirectory; var wrldTick = 0; // ReSharper disable once SwitchStatementMissingSomeCases switch (_currentNFSGame) { case NFSGame.Undetermined: Log.Print(NFSScriptLoader.ERROR_TAG, "A valid NFS executable was not found."); Environment.Exit(1); return; case NFSGame.Carbon: Log.Print(NFSScriptLoader.INFO_TAG, "Need for Speed: Carbon detected."); SetProcessVariables(Process.Start(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, NFS.ImageNames.Carbon))); break; case NFSGame.MW: Log.Print(NFSScriptLoader.INFO_TAG, "Need for Speed: Most Wanted detected."); SetProcessVariables(Process.Start(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, NFS.ImageNames.MWUG))); break; case NFSGame.Underground: Log.Print(NFSScriptLoader.INFO_TAG, "Need for Speed: Underground detected."); SetProcessVariables(Process.Start(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, NFS.ImageNames.MWUG))); break; case NFSGame.Underground2: Log.Print(NFSScriptLoader.INFO_TAG, "Need for Speed: Underground 2 detected."); SetProcessVariables(Process.Start(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, NFS.ImageNames.UG2))); break; case NFSGame.ProStreet: Log.Print(NFSScriptLoader.INFO_TAG, "Need for Speed: ProStreet detected."); SetProcessVariables(Process.Start(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, NFS.ImageNames.UndercoverProStreet))); break; case NFSGame.Undercover: Log.Print(NFSScriptLoader.INFO_TAG, "Need for Speed: Undercover detected."); SetProcessVariables(Process.Start(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, NFS.ImageNames.UndercoverProStreet))); break; case NFSGame.World: Log.Print(NFSScriptLoader.INFO_TAG, "Waiting for game's launch."); while (Process.GetProcessesByName("nfsw").Length == 0 && (wrldTick < 120)) { Thread.Sleep(1000); wrldTick++; } if (Process.GetProcessesByName("nfsw").Length == 0) Environment.Exit(0); else { Log.Print(NFSScriptLoader.INFO_TAG, "Need for Speed: World detected."); SetProcessVariables(Process.GetProcessesByName("nfsw")[0]); } break; default: Log.Print(NFSScriptLoader.ERROR_TAG, "A valid NFS executeable was not found."); Environment.Exit(0); return; } NFSScript.NFSScript.CurrentLoadedNFSGame = _currentNFSGame; }
public static bool IsGameSupported(NFSGame game) { return(game == NFSGame.World); }
/// <summary> /// Detects and applies process variables for the supported NFS games. /// </summary> private static void GetNFSGame() { Log.Print(NFSScriptLoader.INFO_TAG, "Getting executeable in directory."); currentNFSGame = NFS.DetectGameExecutableInDirectory; int wrldTick = 0; switch (currentNFSGame) { case NFSGame.None: Log.Print(NFSScriptLoader.ERROR_TAG, "A valid NFS executeable was not found."); Environment.Exit(0); return; case NFSGame.Carbon: Log.Print(NFSScriptLoader.INFO_TAG, "Need for Speed: Carbon detected."); SetProcessVariables(Process.Start(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, NFS.NFSC_EXE))); break; case NFSGame.MW: Log.Print(NFSScriptLoader.INFO_TAG, "Need for Speed: Most Wanted detected."); SetProcessVariables(Process.Start(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, NFS.SPEED_EXE))); break; case NFSGame.Underground: Log.Print(NFSScriptLoader.INFO_TAG, "Need for Speed: Underground detected."); SetProcessVariables(Process.Start(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, NFS.SPEED_EXE))); break; case NFSGame.Underground2: Log.Print(NFSScriptLoader.INFO_TAG, "Need for Speed: Underground 2 detected."); SetProcessVariables(Process.Start(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, NFS.SPEED2_EXE))); break; case NFSGame.ProStreet: Log.Print(NFSScriptLoader.INFO_TAG, "Need for Speed: ProStreet detected."); SetProcessVariables(Process.Start(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, NFS.NFS_EXE))); break; case NFSGame.Undercover: Log.Print(NFSScriptLoader.INFO_TAG, "Need for Speed: Undercover detected."); SetProcessVariables(Process.Start(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, NFS.NFS_EXE))); break; case NFSGame.World: Log.Print(NFSScriptLoader.INFO_TAG, "Waiting for game's launch."); while (Process.GetProcessesByName("nfsw").Length == 0 && (wrldTick < 120)) { Thread.Sleep(1000); wrldTick++; } if (Process.GetProcessesByName("nfsw").Length == 0) { Environment.Exit(0); } else { Log.Print(NFSScriptLoader.INFO_TAG, "Need for Speed: World detected."); SetProcessVariables(Process.GetProcessesByName("nfsw")[0]); } break; default: Log.Print(NFSScriptLoader.ERROR_TAG, "A valid NFS executeable was not found."); Environment.Exit(0); return; } NFSScript.NFSScript.CurrentLoadedNFSGame = currentNFSGame; }