public NCSContext(NCSScript script, NCSFile file) { this.script = script; this.file = file; // programCounter = 0; // returnStack.Clear(); // returnStack.Add(-1); }
void Test() { // Get NCS file from the user string filePath = EditorUtility.OpenFilePanel("Select NCS file", "", "NCS"); if (filePath == "") { return; } // Load the NCS from a stream using (FileStream stream = File.Open(filePath, FileMode.Open)) { file = new NCSFile(stream); } }
public NCSScript(Stream stream, string name) { // if (actions == null) // { // ReadActions(); // } // We read the NCS file directly from the stream file = new NCSFile(stream); scriptName = name; foreach (NCSOperation op in file.operations) { NCSInstruction instruction = (NCSInstruction)Activator.CreateInstance(op.opType); //Debug.Log(instruction); instruction.Initialize(op.args, this); instructions.Add(instruction); } }
void GetAllNCSFiles() { // Gets every NCS file in the game, including from all // modules files = new List <NCSFile>(); // Load base game files AuroraData data = new AuroraData( Game.KotOR, null ); Dictionary <string, int> baseGameActions = new Dictionary <string, int>(); foreach ((string resref, ResourceType key) in data.keyObject.resourceKeys.Keys) { // Type code for NCS scripts is 2010 if (key == ResourceType.NCS) { Debug.Log(resref); using (Stream stream = data.GetStream(resref, key)) { NCSFile file = new NCSFile(stream); foreach (NCSOperation op in file.operations) { if (op.opcode == 0x05) { // This operation is an action, so we have to find the type and // add it to the list string action = NWScript_Actions.ACTIONS[int.Parse(op.args[1])]; if (!baseGameActions.ContainsKey(action)) { baseGameActions.Add(action, 0); } baseGameActions[action]++; } } } } } Dictionary <string, Dictionary <string, int> > moduleActions = new Dictionary <string, Dictionary <string, int> >(); Debug.Log("Found " + baseGameActions.Count + " actions in base game"); // For each module, load the module data and get all the NCS files // First, get the list of modules string[] modules = Directory.GetFiles( AuroraData.GetPath("modules") ); HashSet <string> moduleNames = new HashSet <string>(); foreach (string module in modules) { string basename = Path.GetFileNameWithoutExtension(module.Replace("_s.rim", "")); moduleNames.Add(basename); } foreach (string module in moduleNames) { if (module != "end_m01aa") { // This is just for testing continue; } data.moduleName = module; data.LoadModuleFromGameFiles(false); Debug.Log("Loaded module " + module); // Now, get all the NCS files Dictionary <string, int> moduleCounts = new Dictionary <string, int>(); // Get all items from the rim, srim, dlg, and mod files // rim file if (data.srim != null) { RIMObject rim = (RIMObject)data.srim; foreach ((string resref, ResourceType key) in rim.resources.Keys) { // Type code for NCS scripts is 2010 if (key == ResourceType.NCS) { Debug.Log(resref); using (Stream stream = data.GetStream(resref, key)) { NCSFile file; try { file = new NCSFile(stream); } catch (Exception e) { Debug.LogWarning("Failed to load script '" + resref + "' from module " + module + ": " + e.Message); continue; } foreach (NCSOperation op in file.operations) { if (op.opcode == 0x05) { // This operation is an action, so we have to find the type and // add it to the list string action = NWScript_Actions.ACTIONS[int.Parse(op.args[1])]; if (!moduleCounts.ContainsKey(action)) { moduleCounts.Add(action, 0); } moduleCounts[action]++; } } } } } } // Save the counts moduleActions.Add(module, moduleCounts); } foreach (string module in moduleNames) { if (!moduleActions.ContainsKey(module)) { continue; } Debug.Log("Module " + module + " has " + moduleActions[module].Count + " actions"); } status = new ProjectStatus() { baseGameActions = baseGameActions, moduleActions = moduleActions }; }