private void revertChange(ChangeListTree.ChangeData change) { GameData.TripleInt tripleInt; GameData.Item item = this.tree.GetItem(change); ChangeListTree.TreeNode parent = change.Parent; bool flag = false; switch (change.Type) { case ChangeListTree.ChangeType.NAME: { item.Name = item.OriginalName; break; } case ChangeListTree.ChangeType.VALUE: { if (change.OldValue != null) { item[change.Key] = change.OldValue; } else { item.Remove(change.Key); } item.refreshState(); break; } case ChangeListTree.ChangeType.NEWREF: { item.removeReference(change.Section, change.Key); break; } case ChangeListTree.ChangeType.MODREF: { tripleInt = item.OriginalValue(change.Section, change.Key); item.setReferenceValue(change.Section, change.Key, tripleInt); break; } case ChangeListTree.ChangeType.DELREF: { tripleInt = item.OriginalValue(change.Section, change.Key); item.addReference(change.Section, change.Key, new int?(tripleInt.v0), new int?(tripleInt.v1), new int?(tripleInt.v2)); break; } case ChangeListTree.ChangeType.NEWINST: { item.removeInstance(change.Key); break; } case ChangeListTree.ChangeType.MODINST: { item.getInstance(change.Key).revert(); break; } case ChangeListTree.ChangeType.INSTVALUE: { item.getInstance(change.Section)[change.Key] = change.OldValue; if (change.Parent.Children.Count != 1) { break; } change = change.Parent as ChangeListTree.ChangeData; break; } case ChangeListTree.ChangeType.INVALIDREF: { flag = true; break; } } if (!flag) { this.tree.Remove(change); } if (item.getState() == GameData.State.ORIGINAL) { this.tree.Remove(change.Parent.Parent ?? change.Parent); } this.nav.refreshState(item); this.nav.HasChanges = true; }
private void mergeButton_Click(object sender, EventArgs e) { string str; GameData.TripleInt referenceValue; int num = 0; this.Cursor = Cursors.WaitCursor; foreach (ChangeListTree.TreeNode node in this.tree.Nodes) { if (!node.Checked) { continue; } GameData.Item item = this.tree.GetItem(node); GameData.Item newValue = this.gameData.getItem(item.stringID); if (item.getState() == GameData.State.OWNED || newValue == null) { this.gameData.items.Add(item.stringID, item); item.resolveReferences(this.gameData); item.changeOwner(this.gameData.activeFileName); num++; } else if (item.getState() != GameData.State.REMOVED) { foreach (ChangeListTree.TreeNode child in node.Children) { if (!child.Checked) { continue; } ChangeListTree.ChangeData changeDatum = child as ChangeListTree.ChangeData; switch (changeDatum.Type) { case ChangeListTree.ChangeType.NAME: { newValue.Name = changeDatum.NewValue.ToString(); break; } case ChangeListTree.ChangeType.VALUE: { newValue[changeDatum.Key] = changeDatum.NewValue; break; } case ChangeListTree.ChangeType.NEWREF: case ChangeListTree.ChangeType.INVALIDREF: { referenceValue = item.getReferenceValue(changeDatum.Section, changeDatum.Key); newValue.addReference(changeDatum.Section, changeDatum.Key, new int?(referenceValue.v0), new int?(referenceValue.v1), new int?(referenceValue.v2)); break; } case ChangeListTree.ChangeType.MODREF: { referenceValue = item.getReferenceValue(changeDatum.Section, changeDatum.Key); newValue.setReferenceValue(changeDatum.Section, changeDatum.Key, referenceValue); break; } case ChangeListTree.ChangeType.DELREF: { newValue.removeReference(changeDatum.Section, changeDatum.Key); break; } case ChangeListTree.ChangeType.NEWINST: { GameData.Instance instance = item.getInstance(changeDatum.Key); GameData.Instance instance1 = newValue.addInstance(changeDatum.Key, instance); using (IEnumerator <KeyValuePair <string, GameData.TripleInt> > enumerator = instance.referenceData("states", false).GetEnumerator()) { while (enumerator.MoveNext()) { KeyValuePair <string, GameData.TripleInt> current = enumerator.Current; int?nullable = null; int?nullable1 = nullable; nullable = null; int?nullable2 = nullable; nullable = null; instance1.addReference("states", current.Key, nullable1, nullable2, nullable); } break; } break; } case ChangeListTree.ChangeType.MODINST: { if (item.getInstance(changeDatum.Key).getState() != GameData.State.REMOVED) { foreach (ChangeListTree.TreeNode treeNode in child.Children) { if (!treeNode.Checked) { continue; } ChangeListTree.ChangeData changeDatum1 = treeNode as ChangeListTree.ChangeData; if (changeDatum1.Type != ChangeListTree.ChangeType.INSTVALUE) { continue; } newValue.getInstance(changeDatum1.Section)[changeDatum1.Key] = changeDatum1.NewValue; num++; } num--; break; } else { newValue.removeInstance(changeDatum.Key); break; } } case ChangeListTree.ChangeType.INSTVALUE: { newValue.getInstance(changeDatum.Section)[changeDatum.Key] = changeDatum.NewValue; break; } } num++; } } else { if (newValue == null) { continue; } this.gameData.deleteItem(newValue); num++; } } foreach (ChangeListTree.TreeNode node1 in this.tree.Nodes) { if (!node1.Checked) { continue; } GameData.Item item1 = this.gameData.getItem(this.tree.GetItem(node1).stringID); if (item1 == null) { continue; } item1.resolveReferences(this.gameData); } if (num != 0) { str = (num != 1 ? string.Concat(num, " changes merged") : "1 change merged"); } else { str = "No changes detected"; } if (this.leveldata.Checked) { string str1 = string.Concat(Directory.GetParent(this.currentMod), "/leveldata"); string str2 = string.Concat(MergeDialog.nav.ModPath, "leveldata"); if (MergeDialog.nav.ModPath == MergeDialog.nav.BasePath) { str2 = string.Concat(MergeDialog.nav.ModPath, "/newland/leveldata/"); if (!MergeDialog.nav.ActiveFile.EndsWith("gamedata.base")) { FileInfo fileInfo = new FileInfo(MergeDialog.nav.ActiveFile); str2 = string.Concat(str2, fileInfo.Name.Substring(0, fileInfo.Name.Length - fileInfo.Extension.Length)); } } string str3 = MergeDialog.mergeLevelData(str1, str2); if (str3.Length > 0) { str = string.Concat(str, "\n\n", str3); } } this.Cursor = Cursors.Default; MessageBox.Show(str, "合并", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); }