Remove and save custom tags

This commit is contained in:
AbstractConcept 2022-09-21 16:15:25 -05:00
parent e36ef6a368
commit 2f3f807911
264 changed files with 1118 additions and 498 deletions

View file

@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Reflection;
using UnityEngine;
using UnityEngine.UI;
@ -12,6 +13,11 @@ namespace RimWorldAnimationStudio
{
public List<GameObject> cloneObjects;
public void OnEnable()
{
Initialize();
}
public void Pop()
{
gameObject.SetActive(gameObject.activeSelf == false);
@ -32,5 +38,22 @@ namespace RimWorldAnimationStudio
return cloneObject;
}
public void AddCustomTag(InputField field, ref List<string> tags, ref List<string> customTags)
{
if (field?.text == null || field.text == "")
{ return; }
if (tags.Contains(field.text) || customTags.Contains(field.text))
{ field.text = ""; return; }
customTags.Add(field.text);
ApplicationManager.Instance.SaveCustomArrays();
Initialize(true);
}
public virtual void Initialize(bool addedNewTag = false) { }
}
}

View file

@ -22,9 +22,9 @@ namespace RimWorldAnimationStudio
Transform contentWindow = transform.FindDeepChild("Content");
Reset();
for (int i = 0; i < Workspace.actorLayers.Count; i++)
for (int i = 0; i < Tags.actorLayers.Count; i++)
{
string actorLayer = Workspace.actorLayers[i];
string actorLayer = Tags.actorLayers[i];
Transform _optionToggle = AddCloneObjectToParent(contentWindow).transform;
_optionToggle.Find("Text").GetComponent<Text>().text = actorLayer;

View file

@ -10,66 +10,44 @@ namespace RimWorldAnimationStudio
{
public class SelectBodyDefTypesDialog : DialogBox
{
public void OnEnable()
public override void Initialize(bool addedNewTag = false)
{
Initialize();
}
IEnumerable<string> allTags = Tags.bodyDefTypes.Concat(CustomTags.interactionDefTypes);
string placeHolderText = "Enter new body def type...";
public void AddBodyDefType(InputField field)
{
if (field?.text == null || field.text == "")
{ return; }
if (Workspace.bodyDefTypes.Contains(field.text))
{ field.text = ""; return; }
Workspace.bodyDefTypes.Add(field.text);
Initialize(true);
}
public void Initialize(bool addedNewTag = false)
{
Actor actor = Workspace.animationDef.actors[Workspace.actorID];
foreach (string bodyDefType in actor.bodyDefTypes)
{
if (Workspace.bodyDefTypes.Contains(bodyDefType) == false)
{ Workspace.bodyDefTypes.Add(bodyDefType); }
}
Transform contentWindow = transform.FindDeepChild("Content");
Reset();
for (int i = 0; i < Workspace.bodyDefTypes.Count; i++)
for (int i = 0; i < allTags.Count(); i++)
{
string bodyDefType = Workspace.bodyDefTypes[i];
string tag = allTags.ElementAt(i);
Transform _optionToggle = AddCloneObjectToParent(contentWindow).transform;
_optionToggle.Find("Text").GetComponent<Text>().text = bodyDefType;
_optionToggle.Find("Text").GetComponent<Text>().text = tag;
Toggle toggleComp = _optionToggle.GetComponent<Toggle>();
toggleComp.isOn = actor.bodyDefTypes.Contains(bodyDefType);
toggleComp.onValueChanged.AddListener(delegate {
if (toggleComp.isOn && actor.bodyDefTypes.Contains(bodyDefType) == false)
{ actor.bodyDefTypes.Add(bodyDefType); }
toggleComp.isOn = actor.bodyDefTypes.Contains(tag);
toggleComp.onValueChanged.AddListener(delegate
{
if (toggleComp.isOn && actor.bodyDefTypes.Contains(tag) == false)
{ actor.bodyDefTypes.Add(tag); }
else if (toggleComp.isOn == false && actor.bodyDefTypes.Contains(bodyDefType))
{ actor.bodyDefTypes.Remove(bodyDefType); }
else if (toggleComp.isOn == false && actor.bodyDefTypes.Contains(tag))
{ actor.bodyDefTypes.Remove(tag); }
Workspace.Instance.RecordEvent("Actor bodyDef type");
});
if (addedNewTag && i == Workspace.sexTypes.Count - 1)
if (addedNewTag && i == allTags.Count() - 1)
{ toggleComp.isOn = true; }
}
Transform _optionField = AddCloneObjectToParent(contentWindow, 1).transform;
_optionField.Find("Placeholder").GetComponent<Text>().text = "Enter new body def type...";
_optionField.Find("Placeholder").GetComponent<Text>().text = placeHolderText;
InputField fieldComp = _optionField.GetComponent<InputField>();
fieldComp.onEndEdit.AddListener(delegate { AddBodyDefType(fieldComp); });
fieldComp.onEndEdit.AddListener(delegate { AddCustomTag(fieldComp, ref Tags.bodyDefTypes, ref CustomTags.bodyDefTypes); });
}
public void Reset()

View file

@ -10,69 +10,58 @@ namespace RimWorldAnimationStudio
{
public class SelectBodyPartsDialog : DialogBox
{
public void OnEnable()
public override void Initialize(bool addedNewTag = false)
{
Initialize();
}
IEnumerable<string> allTags = Tags.bodyParts.Concat(CustomTags.interactionDefTypes);
string placeHolderText = "Enter new body part name...";
public void AddBodyPart(InputField field)
{
Debug.Log("Attempting to add new body part");
if (field?.text == null || field.text == "")
{ Debug.LogWarning("Input field is null"); return; }
if (Workspace.bodyParts.Contains(field.text))
{ Debug.LogWarning("Body part is null"); field.text = ""; return; }
Debug.Log("Add new body part: " + field.text);
Workspace.bodyParts.Add(field.text);
Initialize(true);
}
public void Initialize(bool addedNewTag = false)
{
Actor actor = Workspace.animationDef.actors[Workspace.actorID];
foreach (string bodyPart in actor.requiredGenitals)
{
if (Workspace.bodyParts.Contains(bodyPart) == false)
{ Workspace.bodyParts.Add(bodyPart); }
}
Transform contentWindow = transform.FindDeepChild("Content");
Reset();
for (int i = 0; i < Workspace.bodyParts.Count; i++)
Transform _appendageToggle = AddCloneObjectToParent(contentWindow).transform;
_appendageToggle.Find("Text").GetComponent<Text>().text = "Any appendage";
Toggle appendageToggleComp = _appendageToggle.GetComponent<Toggle>();
appendageToggleComp.isOn = actor.isFucking;
appendageToggleComp.onValueChanged.AddListener(delegate { actor.isFucking = appendageToggleComp.isOn; Workspace.Instance.RecordEvent("Actor required body part");});
Transform _orificeToggle = AddCloneObjectToParent(contentWindow).transform;
_orificeToggle.Find("Text").GetComponent<Text>().text = "Any orifice";
Toggle orificeToggleComp = _orificeToggle.GetComponent<Toggle>();
orificeToggleComp.isOn = actor.isFucked;
orificeToggleComp.onValueChanged.AddListener(delegate { actor.isFucked = orificeToggleComp.isOn; Workspace.Instance.RecordEvent("Actor required body part"); });
for (int i = 0; i < allTags.Count(); i++)
{
string bodyPart = Workspace.bodyParts[i];
string tag = allTags.ElementAt(i);
Transform _optionToggle = AddCloneObjectToParent(contentWindow).transform;
_optionToggle.Find("Text").GetComponent<Text>().text = bodyPart;
_optionToggle.Find("Text").GetComponent<Text>().text = tag;
Toggle toggleComp = _optionToggle.GetComponent<Toggle>();
toggleComp.isOn = actor.requiredGenitals.Contains(bodyPart);
toggleComp.onValueChanged.AddListener(delegate {
if (toggleComp.isOn && actor.requiredGenitals.Contains(bodyPart) == false)
{ actor.requiredGenitals.Add(bodyPart); }
toggleComp.isOn = actor.requiredGenitals.Contains(tag);
toggleComp.onValueChanged.AddListener(delegate
{
if (toggleComp.isOn && actor.requiredGenitals.Contains(tag) == false)
{ actor.requiredGenitals.Add(tag); }
else if (toggleComp.isOn == false && actor.requiredGenitals.Contains(bodyPart))
{ actor.requiredGenitals.Remove(bodyPart); }
else if (toggleComp.isOn == false && actor.requiredGenitals.Contains(tag))
{ actor.requiredGenitals.Remove(tag); }
Workspace.Instance.RecordEvent("Actor required body part");
});
if (addedNewTag && i == Workspace.sexTypes.Count - 1)
if (addedNewTag && i == allTags.Count() - 1)
{ toggleComp.isOn = true; }
}
Transform _optionField = AddCloneObjectToParent(contentWindow, 1).transform;
_optionField.Find("Placeholder").GetComponent<Text>().text = "Enter new body part name...";
_optionField.Find("Placeholder").GetComponent<Text>().text = placeHolderText;
InputField fieldComp = _optionField.GetComponent<InputField>();
fieldComp.onEndEdit.AddListener(delegate { AddBodyPart(fieldComp); });
fieldComp.onEndEdit.AddListener(delegate { AddCustomTag(fieldComp, ref Tags.bodyParts, ref CustomTags.bodyParts); });
}
public void Reset()

View file

@ -10,67 +10,44 @@ namespace RimWorldAnimationStudio
{
public class SelectDefNamesDialog : DialogBox
{
public void OnEnable()
public override void Initialize(bool addedNewTag = false)
{
Debug.Log("enabled");
Initialize();
}
IEnumerable<string> allTags = Tags.defNames.Concat(CustomTags.interactionDefTypes);
string placeHolderText = "Enter new def name...";
public void AddDefName(InputField field)
{
if (field?.text == null || field.text == "")
{ return; }
if (Workspace.defNames.Contains(field.text))
{ field.text = ""; return; }
Workspace.defNames.Add(field.text);
Initialize(true);
}
public void Initialize(bool addedNewTag = false)
{
Actor actor = Workspace.animationDef.actors[Workspace.actorID];
foreach (string defName in actor.defNames)
{
if (Workspace.defNames.Contains(defName) == false)
{ Workspace.defNames.Add(defName); }
}
Transform contentWindow = transform.FindDeepChild("Content");
Reset();
for (int i = 0; i < Workspace.defNames.Count; i++)
for (int i = 0; i < allTags.Count(); i++)
{
string defName = Workspace.defNames[i];
string tag = allTags.ElementAt(i);
Transform _optionToggle = AddCloneObjectToParent(contentWindow).transform;
_optionToggle.Find("Text").GetComponent<Text>().text = defName;
_optionToggle.Find("Text").GetComponent<Text>().text = tag;
Toggle toggleComp = _optionToggle.GetComponent<Toggle>();
toggleComp.isOn = actor.defNames.Contains(defName);
toggleComp.onValueChanged.AddListener(delegate {
if (toggleComp.isOn && actor.defNames.Contains(defName) == false)
{ actor.defNames.Add(defName); }
toggleComp.isOn = actor.defNames.Contains(tag);
toggleComp.onValueChanged.AddListener(delegate
{
if (toggleComp.isOn && actor.defNames.Contains(tag) == false)
{ actor.defNames.Add(tag); }
else if (toggleComp.isOn == false && actor.defNames.Contains(defName))
{ actor.defNames.Remove(defName); }
else if (toggleComp.isOn == false && actor.defNames.Contains(tag))
{ actor.defNames.Remove(tag); }
Workspace.Instance.RecordEvent("Actor def name");
});
if (addedNewTag && i == Workspace.sexTypes.Count - 1)
if (addedNewTag && i == allTags.Count() - 1)
{ toggleComp.isOn = true; }
}
Transform _optionField = AddCloneObjectToParent(contentWindow, 1).transform;
_optionField.Find("Placeholder").GetComponent<Text>().text = "Enter new def name...";
_optionField.Find("Placeholder").GetComponent<Text>().text = placeHolderText;
InputField fieldComp = _optionField.GetComponent<InputField>();
fieldComp.onEndEdit.AddListener(delegate { AddDefName(fieldComp); });
fieldComp.onEndEdit.AddListener(delegate { AddCustomTag(fieldComp, ref Tags.defNames, ref CustomTags.defNames); });
}
public void Reset()

View file

@ -10,66 +10,57 @@ namespace RimWorldAnimationStudio
{
public class SelectInteractionDefsDialog : DialogBox
{
public void OnEnable()
public override void Initialize(bool addedNewTag = false)
{
Initialize();
}
IEnumerable<string> allTags = Tags.interactionDefTypes.Concat(CustomTags.interactionDefTypes);
string placeHolderText = "Enter new interaction def type...";
public void AddInteractionDef(InputField field)
{
if (field?.text == null || field.text == "")
{ return; }
if (Workspace.interactionDefTypes.Contains(field.text))
{ field.text = ""; return; }
Workspace.interactionDefTypes.Add(field.text);
Initialize(true);
}
public void Initialize(bool addedNewTag = false)
{
if (Workspace.animationDef == null) return;
foreach (string interactionDefType in Workspace.animationDef.interactionDefTypes)
{
if (Workspace.interactionDefTypes.Contains(interactionDefType) == false)
{ Workspace.interactionDefTypes.Add(interactionDefType); }
}
Transform contentWindow = transform.FindDeepChild("Content");
Reset();
for (int i = 0; i < Workspace.interactionDefTypes.Count; i++)
for (int i = 0; i < allTags.Count(); i++)
{
string interactionDefType = Workspace.interactionDefTypes[i];
string tag = allTags.ElementAt(i);
Transform _optionToggle = AddCloneObjectToParent(contentWindow).transform;
_optionToggle.Find("Text").GetComponent<Text>().text = interactionDefType;
_optionToggle.Find("Text").GetComponent<Text>().text = tag;
Toggle toggleComp = _optionToggle.GetComponent<Toggle>();
toggleComp.isOn = Workspace.animationDef.interactionDefTypes.Contains(interactionDefType);
toggleComp.onValueChanged.AddListener(delegate {
if (toggleComp.isOn && Workspace.animationDef.interactionDefTypes.Contains(interactionDefType) == false)
{ Workspace.animationDef.interactionDefTypes.Add(interactionDefType); }
toggleComp.isOn = Workspace.animationDef.interactionDefTypes.Contains(tag);
toggleComp.onValueChanged.AddListener(delegate
{
if (toggleComp.isOn && Workspace.animationDef.interactionDefTypes.Contains(tag) == false)
{ Workspace.animationDef.interactionDefTypes.Add(tag); }
else if (toggleComp.isOn == false && Workspace.animationDef.interactionDefTypes.Contains(interactionDefType))
{ Workspace.animationDef.interactionDefTypes.Remove(interactionDefType); }
else if (toggleComp.isOn == false && Workspace.animationDef.interactionDefTypes.Contains(tag))
{ Workspace.animationDef.interactionDefTypes.Remove(tag); }
Workspace.Instance.RecordEvent("Animation InteractionDef");
});
if (addedNewTag && i == Workspace.sexTypes.Count - 1)
Button deleteButton = _optionToggle.Find("DeleteButton").GetComponent<Button>();
if (deleteButton != null && CustomTags.interactionDefTypes.Contains(tag))
{
deleteButton.gameObject.SetActive(true);
deleteButton.onClick.AddListener(delegate
{
CustomTags.interactionDefTypes.Remove(tag);
ApplicationManager.Instance.SaveCustomArrays();
Initialize();
});
}
if (addedNewTag && i == allTags.Count() - 1)
{ toggleComp.isOn = true; }
}
Transform _optionField = AddCloneObjectToParent(contentWindow, 1).transform;
_optionField.Find("Placeholder").GetComponent<Text>().text = "Enter new interaction def type...";
_optionField.Find("Placeholder").GetComponent<Text>().text = placeHolderText;
InputField fieldComp = _optionField.GetComponent<InputField>();
fieldComp.onEndEdit.AddListener(delegate { AddInteractionDef(fieldComp); });
fieldComp.onEndEdit.AddListener(delegate { AddCustomTag(fieldComp, ref Tags.interactionDefTypes, ref CustomTags.interactionDefTypes); });
}
public void Reset()

View file

@ -0,0 +1,59 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.UI;
namespace RimWorldAnimationStudio
{
public class SelectRaceDialog : DialogBox
{
public override void Initialize(bool addedNewTag = false)
{
IEnumerable<string> allTags = Tags.defNames.Concat(CustomTags.interactionDefTypes);
string placeHolderText = "Enter new def name...";
Actor actor = Workspace.animationDef.actors[Workspace.actorID];
Transform contentWindow = transform.FindDeepChild("Content");
Reset();
for (int i = 0; i < allTags.Count(); i++)
{
string tag = allTags.ElementAt(i);
Transform _optionToggle = AddCloneObjectToParent(contentWindow).transform;
_optionToggle.Find("Text").GetComponent<Text>().text = tag;
Toggle toggleComp = _optionToggle.GetComponent<Toggle>();
toggleComp.isOn = actor.defNames.Contains(tag);
toggleComp.onValueChanged.AddListener(delegate
{
if (toggleComp.isOn && actor.defNames.Contains(tag) == false)
{ actor.defNames.Add(tag); }
else if (toggleComp.isOn == false && actor.defNames.Contains(tag))
{ actor.defNames.Remove(tag); }
Workspace.Instance.RecordEvent("Actor def name");
});
if (addedNewTag && i == allTags.Count() - 1)
{ toggleComp.isOn = true; }
}
Transform _optionField = AddCloneObjectToParent(contentWindow, 1).transform;
_optionField.Find("Placeholder").GetComponent<Text>().text = placeHolderText;
InputField fieldComp = _optionField.GetComponent<InputField>();
fieldComp.onEndEdit.AddListener(delegate { AddCustomTag(fieldComp, ref Tags.defNames, ref CustomTags.defNames); });
}
public void Reset()
{
Transform contentWindow = transform.FindDeepChild("Content");
RemoveCloneObjectsFromParent(contentWindow);
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 983d00d4d240d6c4780e903708f27c06
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -10,66 +10,45 @@ namespace RimWorldAnimationStudio
{
public class SelectSexTypesDialog : DialogBox
{
public void OnEnable()
public override void Initialize(bool addedNewTag = false)
{
Initialize();
}
IEnumerable<string> allTags = Tags.sexTypes.Concat(CustomTags.interactionDefTypes);
string placeHolderText = "Enter new sex type...";
public void AddSexType(InputField field)
{
if (field?.text == null || field.text == "")
{ return; }
if (Workspace.sexTypes.Contains(field.text))
{ field.text = ""; return; }
Workspace.sexTypes.Add(field.text);
Initialize(true);
}
public void Initialize(bool addedNewTag = false)
{
if (Workspace.animationDef == null) return;
foreach (string sexType in Workspace.animationDef.sexTypes)
{
if (Workspace.sexTypes.Contains(sexType) == false)
{ Workspace.sexTypes.Add(sexType); }
}
Transform contentWindow = transform.FindDeepChild("Content");
Reset();
for (int i = 0; i < Workspace.sexTypes.Count; i++)
for (int i = 0; i < allTags.Count(); i++)
{
string sexType = Workspace.sexTypes[i];
string tag = allTags.ElementAt(i);
Transform _optionToggle = AddCloneObjectToParent(contentWindow).transform;
_optionToggle.Find("Text").GetComponent<Text>().text = sexType;
_optionToggle.Find("Text").GetComponent<Text>().text = tag;
Toggle toggleComp = _optionToggle.GetComponent<Toggle>();
toggleComp.isOn = Workspace.animationDef.sexTypes.Contains(sexType);
toggleComp.onValueChanged.AddListener(delegate {
if (toggleComp.isOn && Workspace.animationDef.sexTypes.Contains(sexType) == false)
{ Workspace.animationDef.sexTypes.Add(sexType); }
toggleComp.isOn = Workspace.animationDef.sexTypes.Contains(tag);
toggleComp.onValueChanged.AddListener(delegate
{
if (toggleComp.isOn && Workspace.animationDef.sexTypes.Contains(tag) == false)
{ Workspace.animationDef.sexTypes.Add(tag); }
else if (toggleComp.isOn == false && Workspace.animationDef.sexTypes.Contains(sexType))
{ Workspace.animationDef.sexTypes.Remove(sexType); }
else if (toggleComp.isOn == false && Workspace.animationDef.sexTypes.Contains(tag))
{ Workspace.animationDef.sexTypes.Remove(tag); }
Workspace.Instance.RecordEvent("Animation sex type");
});
if (addedNewTag && i == Workspace.sexTypes.Count - 1)
if (addedNewTag && i == allTags.Count() - 1)
{ toggleComp.isOn = true; }
}
Transform _optionField = AddCloneObjectToParent(contentWindow, 1).transform;
_optionField.Find("Placeholder").GetComponent<Text>().text = "Enter new sex type...";
_optionField.Find("Placeholder").GetComponent<Text>().text = placeHolderText;
InputField fieldComp = _optionField.GetComponent<InputField>();
fieldComp.onEndEdit.AddListener(delegate { AddSexType(fieldComp); });
fieldComp.onEndEdit.AddListener(delegate { AddCustomTag(fieldComp, ref Tags.sexTypes, ref CustomTags.sexTypes); });
}
public void Reset()

View file

@ -10,73 +10,46 @@ namespace RimWorldAnimationStudio
{
public class SelectSoundDefDialog : DialogBox
{
public void OnEnable()
public override void Initialize(bool addedNewTag = false)
{
Initialize();
}
IEnumerable<string> allTags = Tags.soundDefs.Concat(CustomTags.interactionDefTypes);
string placeHolderText = "Enter new sound def...";
public void AddSoundDef(InputField field)
{
if (field?.text == null || field.text == "")
{ return; }
if (Workspace.soundDefs.Contains(field.text))
{ field.text = ""; return; }
Workspace.soundDefs.Add(field.text);
Initialize(true);
}
public void Initialize(bool addedNewTag = false)
{
if (Workspace.animationDef == null) return;
foreach (AnimationStage stage in Workspace.animationDef.animationStages)
{
foreach (PawnAnimationClip clip in stage.animationClips)
{
foreach (string soundDef in clip.keyframes.Select(x => x.soundEffect))
{
if (Workspace.soundDefs.Contains(soundDef) == false && soundDef != "")
{ Workspace.soundDefs.Add(soundDef); }
}
}
}
Transform contentWindow = transform.FindDeepChild("Content");
Reset();
for (int i = 0; i < Workspace.soundDefs.Count; i++)
for (int i = 0; i < allTags.Count(); i++)
{
string soundDef = Workspace.soundDefs[i];
string tag = allTags.ElementAt(i);
Transform _optionToggle = AddCloneObjectToParent(contentWindow).transform;
_optionToggle.Find("Text").GetComponent<Text>().text = soundDef;
_optionToggle.Find("Text").GetComponent<Text>().text = tag;
Toggle toggleComp = _optionToggle.GetComponent<Toggle>();
toggleComp.isOn = Workspace.animationDef.sexTypes.Contains(soundDef);
toggleComp.onValueChanged.AddListener(delegate {
toggleComp.isOn = Workspace.Instance.GetCurrentPawnKeyframe()?.soundEffect == tag;
toggleComp.onValueChanged.AddListener(delegate
{
PawnKeyframe keyframe = Workspace.Instance.GetCurrentPawnKeyframe();
if (keyframe != null)
{ keyframe.soundEffect = soundDef; }
{ keyframe.soundEffect = tag; }
Workspace.Instance.RecordEvent("Keyframe sound effect");
});
toggleComp.group = contentWindow.GetComponent<ToggleGroup>();
if (addedNewTag && i == Workspace.soundDefs.Count - 1)
if (addedNewTag && i == allTags.Count() - 1)
{ toggleComp.isOn = true; }
}
Transform _optionField = AddCloneObjectToParent(contentWindow, 1).transform;
_optionField.Find("Placeholder").GetComponent<Text>().text = "Enter new sound def...";
_optionField.Find("Placeholder").GetComponent<Text>().text = placeHolderText;
InputField fieldComp = _optionField.GetComponent<InputField>();
fieldComp.onEndEdit.AddListener(delegate { AddSoundDef(fieldComp); });
fieldComp.onEndEdit.AddListener(delegate { AddCustomTag(fieldComp, ref Tags.soundDefs, ref CustomTags.soundDefs); });
}
public void Reset()