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}"
            });
        }
Example #3
0
        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}");
                    }
                }
            }
        }
Example #4
0
        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;
            }));
        }
Example #5
0
        /// <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;
        }
Example #6
0
 public static bool IsGameSupported(NFSGame game)
 {
     return(game == NFSGame.World);
 }
Example #7
0
        /// <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;
        }