/// <summary> /// Gets a bitwise <c>int</c> containing flags for fields that have /// changed. /// </summary> /// <param name="race">a <c>Race</c> <c>struct</c></param> /// <param name="racechanged">a <c>RaceChanged</c> <c>struct</c></param> /// <returns>bitwise <c>int</c> containing flags for fields that have /// changed</returns> internal static int RaceDiffer(Race race, RaceChanged racechanged) { int differ = control_Racial.bit_clean; if (race.flags != racechanged.flags) { differ |= control_Racial.bit_flags; } if (race.feat1 != racechanged.feat1) { differ |= control_Racial.bit_feat1; } if (race.feat2 != racechanged.feat2) { differ |= control_Racial.bit_feat2; } if (race.feat3 != racechanged.feat3) { differ |= control_Racial.bit_feat3; } if (race.feat4 != racechanged.feat4) { differ |= control_Racial.bit_feat4; } if (race.feat5 != racechanged.feat5) { differ |= control_Racial.bit_feat5; } return(differ); }
/// <summary> /// Handles the GlobalApply it. Applies all altered data to their /// <c>structs</c>. /// </summary> /// <param name="sender"> /// <list type="bullet"> /// <item><c><see cref="it_ApplyGlobal"/></c></item> /// <item><c><see cref="it_Save"/></c></item> /// <item><c><see cref="it_Saveas"/></c></item> /// </list></param> /// <param name="e"></param> /// <remarks>See <c><see cref="Click_apply()">Click_apply()</see></c> to /// apply altered data to only the selected <c>struct</c>.</remarks> void Click_applyGlobal(object sender, EventArgs e) { SetTitleText(); // TitleText will be written again (properly) by Write2daFile() if saved. it_ApplyGlobal.Enabled = false; int total; switch (Type) { case Type2da.Spells: { Spell spell; total = Spells.Count; for (int id = 0; id != total; ++id) { spell = Spells[id]; if (spell.differ != control_Spells.bit_clean) { spell.differ = control_Spells.bit_clean; spell.isChanged = true; // this flag will be cleared by Write2daFile() SpellChanged spellchanged = SpellsChanged[id]; spell.spellinfo = spellchanged.spellinfo; spell.targetinfo = spellchanged.targetinfo; spell.effectweight = spellchanged.effectweight; spell.effecttypes = spellchanged.effecttypes; spell.damageinfo = spellchanged.damageinfo; spell.savetype = spellchanged.savetype; spell.savedctype = spellchanged.savedctype; Spells[id] = spell; SpellsChanged.Remove(id); if (id == Id) // is currently selected tree-node { HenchControl.SetResetColor(DefaultForeColor); AfterSelect_node(null, null); // refresh all displayed data for the current spell jic } Tree.Nodes[id].ForeColor = Color.Blue; } } break; } case Type2da.Racial: { Race race; total = Races.Count; for (int id = 0; id != total; ++id) { race = Races[id]; if (race.differ != control_Racial.bit_clean) { race.differ = control_Racial.bit_clean; race.isChanged = true; // this flag will be cleared by Write2daFile() RaceChanged racechanged = RacesChanged[id]; race.flags = racechanged.flags; race.feat1 = racechanged.feat1; race.feat2 = racechanged.feat2; race.feat3 = racechanged.feat3; race.feat4 = racechanged.feat4; race.feat5 = racechanged.feat5; Races[id] = race; RacesChanged.Remove(id); if (id == Id) // is currently selected tree-node { HenchControl.SetResetColor(DefaultForeColor); AfterSelect_node(null, null); // refresh all displayed data for the current race jic } Tree.Nodes[id].ForeColor = Color.Blue; } } break; } case Type2da.Classes: { Class @class; total = Classes.Count; for (int id = 0; id != total; ++id) { @class = Classes[id]; if (@class.differ != control_Classes.bit_clean) { @class.differ = control_Classes.bit_clean; @class.isChanged = true; // this flag will be cleared by Write2daFile() ClassChanged classchanged = ClassesChanged[id]; @class.flags = classchanged.flags; @class.feat1 = classchanged.feat1; @class.feat2 = classchanged.feat2; @class.feat3 = classchanged.feat3; @class.feat4 = classchanged.feat4; @class.feat5 = classchanged.feat5; @class.feat6 = classchanged.feat6; @class.feat7 = classchanged.feat7; @class.feat8 = classchanged.feat8; @class.feat9 = classchanged.feat9; @class.feat10 = classchanged.feat10; @class.feat11 = classchanged.feat11; Classes[id] = @class; ClassesChanged.Remove(id); if (id == Id) // is currently selected tree-node { HenchControl.SetResetColor(DefaultForeColor); AfterSelect_node(null, null); // refresh all displayed data for the current class jic } Tree.Nodes[id].ForeColor = Color.Blue; } } break; } } }
/// <summary> /// Fills displayed fields w/ data from the race's Id. /// </summary> internal override void SelectId() { RacialFlags_text.Clear(); // clear the info-fields to force TextChanged events -> RacialFeat1_text.Clear(); RacialFeat2_text.Clear(); RacialFeat3_text.Clear(); RacialFeat4_text.Clear(); RacialFeat5_text.Clear(); Race race = he.Races[he.Id]; bool dirty = (race.differ != bit_clean); RaceChanged racechanged; if (dirty) { racechanged = he.RacesChanged[he.Id]; } else { racechanged = new RaceChanged(); // not used. } int val = race.flags; RacialFlags_reset.Text = val.ToString(); if (dirty) { val = racechanged.flags; } RacialFlags_text.Text = val.ToString(); val = race.feat1; RacialFeat1_reset.Text = val.ToString(); if (dirty) { val = racechanged.feat1; } RacialFeat1_text.Text = val.ToString(); val = race.feat2; RacialFeat2_reset.Text = val.ToString(); if (dirty) { val = racechanged.feat2; } RacialFeat2_text.Text = val.ToString(); val = race.feat3; RacialFeat3_reset.Text = val.ToString(); if (dirty) { val = racechanged.feat3; } RacialFeat3_text.Text = val.ToString(); val = race.feat4; RacialFeat4_reset.Text = val.ToString(); if (dirty) { val = racechanged.feat4; } RacialFeat4_text.Text = val.ToString(); val = race.feat5; RacialFeat5_reset.Text = val.ToString(); if (dirty) { val = racechanged.feat5; } RacialFeat5_text.Text = val.ToString(); }
/// <summary> /// Handler for the "apply changed data to currently selected /// spell/race/class" button. /// </summary> /// <param name="sender">bu_Apply</param> /// <param name="e"></param> /// <remarks>See /// <c><see cref="Click_applyGlobal()">Click_applyGlobal()</see></c> to /// apply all altered data globally.</remarks> void Click_apply(object sender, EventArgs e) { SetTitleText(); switch (Type) { case Type2da.Spells: { Spell spell = Spells[Id]; if (spell.differ != control_Spells.bit_clean) { spell.differ = control_Spells.bit_clean; spell.isChanged = true; SpellChanged spellchanged = SpellsChanged[Id]; spell.spellinfo = spellchanged.spellinfo; spell.targetinfo = spellchanged.targetinfo; spell.effectweight = spellchanged.effectweight; spell.effecttypes = spellchanged.effecttypes; spell.damageinfo = spellchanged.damageinfo; spell.savetype = spellchanged.savetype; spell.savedctype = spellchanged.savedctype; Spells[Id] = spell; SpellsChanged.Remove(Id); HenchControl.SetResetColor(DefaultForeColor); AfterSelect_node(null, null); // refresh all displayed data for the current spell jic } if (Spells[Id].isChanged) // this goes outside the SpellsChanged check above because uh color goes screwy if not. { Tree.SelectedNode.ForeColor = Color.Blue; } else // I doubt this ever *needs* to run ... but safety. { Tree.SelectedNode.ForeColor = DefaultForeColor; } break; } case Type2da.Racial: { Race race = Races[Id]; if (race.differ != control_Racial.bit_clean) { race.differ = control_Racial.bit_clean; race.isChanged = true; RaceChanged racechanged = RacesChanged[Id]; race.flags = racechanged.flags; race.feat1 = racechanged.feat1; race.feat2 = racechanged.feat2; race.feat3 = racechanged.feat3; race.feat4 = racechanged.feat4; race.feat5 = racechanged.feat5; Races[Id] = race; RacesChanged.Remove(Id); HenchControl.SetResetColor(DefaultForeColor); AfterSelect_node(null, null); // refresh all displayed data for the current node jic } if (Races[Id].isChanged) // this goes outside the RacesChanged check above because uh color goes screwy if not. { Tree.SelectedNode.ForeColor = Color.Blue; } else // I doubt this ever *needs* to run ... but safety. { Tree.SelectedNode.ForeColor = DefaultForeColor; } break; } case Type2da.Classes: { Class @class = Classes[Id]; if (@class.differ != control_Classes.bit_clean) { @class.differ = control_Classes.bit_clean; @class.isChanged = true; ClassChanged classchanged = ClassesChanged[Id]; @class.flags = classchanged.flags; @class.feat1 = classchanged.feat1; @class.feat2 = classchanged.feat2; @class.feat3 = classchanged.feat3; @class.feat4 = classchanged.feat4; @class.feat5 = classchanged.feat5; @class.feat6 = classchanged.feat6; @class.feat7 = classchanged.feat7; @class.feat8 = classchanged.feat8; @class.feat9 = classchanged.feat9; @class.feat10 = classchanged.feat10; @class.feat11 = classchanged.feat11; Classes[Id] = @class; ClassesChanged.Remove(Id); HenchControl.SetResetColor(DefaultForeColor); AfterSelect_node(null, null); // refresh all displayed data for the current node jic } if (Classes[Id].isChanged) // this goes outside the ClassesChanged check above because uh color goes screwy if not. { Tree.SelectedNode.ForeColor = Color.Blue; } else // I doubt this ever *needs* to run ... but safety. { Tree.SelectedNode.ForeColor = DefaultForeColor; } break; } } }
/// <summary> /// This funct is used only for /// <c><see cref="Click_clearCoreAiVersion()">Click_clearCoreAiVersion()</see></c>. /// </summary> /// <param name="str"></param> /// <param name="all"></param> /// <remarks>Used to be a helper for <c>Click_setCoreAiVersion()</c>.</remarks> void SetInfoVersion_racial(string str, bool all) { // NOTE: This will iterate through all changed races even // if an invalid version # is input via the dialog since it // inserts the default version even if there is no other // data in the racialflags-int. Race race; RaceChanged racechanged; int racialflags0, racialflags, differ; bool dirty; int ver = (Int32.Parse(str) << HENCH_SPELL_INFO_VERSION_SHIFT); // the return from the dialog. int total = Races.Count; for (int id = 0; id != total; ++id) { race = Races[id]; if (dirty = ((race.differ & control_Racial.bit_flags) != 0)) { racialflags0 = RacesChanged[id].flags; } else if (all || race.isChanged) { racialflags0 = race.flags; } else { continue; // ignore clean racial-structs if !all } if ((racialflags0 & hc.HENCH_SPELL_INFO_VERSION_MASK) != ver) { if (!BypassInfoVersion) { racialflags = ((racialflags0 & ~hc.HENCH_SPELL_INFO_VERSION_MASK) | ver); } else { racialflags = (racialflags0 & ~hc.HENCH_SPELL_INFO_VERSION_MASK); // wipe version info for TonyAI 2.3+ } if (id == Id) { HenchControl.SetMasterText(racialflags.ToString()); // firing the TextChanged event takes care of it. } else { if (dirty) { racechanged = RacesChanged[id]; } else { racechanged = new RaceChanged(); racechanged.feat1 = race.feat1; racechanged.feat2 = race.feat2; racechanged.feat3 = race.feat3; racechanged.feat4 = race.feat4; racechanged.feat5 = race.feat5; } racechanged.flags = racialflags; // check it differ = control_Racial.RaceDiffer(race, racechanged); race.differ = differ; Races[id] = race; Color color; if (differ != control_Racial.bit_clean) { RacesChanged[id] = racechanged; color = Color.Crimson; } else { RacesChanged.Remove(id); if (race.isChanged) { color = Color.Blue; } else { color = DefaultForeColor; } } Tree.Nodes[id].ForeColor = color; } } } }
/// <summary> /// Handles <c>TextChanged</c> event on the Racial pages. /// </summary> /// <param name="sender"> /// <list type="bullet"> /// <item><c><see cref="RacialFlags_text"/></c></item> /// <item><c><see cref="RacialFeat1_text"/></c></item> /// <item><c><see cref="RacialFeat2_text"/></c></item> /// <item><c><see cref="RacialFeat3_text"/></c></item> /// <item><c><see cref="RacialFeat4_text"/></c></item> /// <item><c><see cref="RacialFeat5_text"/></c></item> /// </list></param> /// <param name="e"></param> void TextChanged_racial(object sender, EventArgs e) { // NOTE: TextChanged needs to fire when HenchSpells loads in order // to set the checkboxes and dropdown-fields. // // 'BypassDiffer' is set true since this does not need to go through // creating and deleting each SpellChanged-struct (since nothing has // changed yet OnLoad of the 2da-file). // // 'BypassDiffer' is also set true by AfterSelect_node() since the // Spell-structs already contain proper diff-data. int val; if (Int32.TryParse((sender as TextBox).Text, out val)) { Button bu; TextBox tb_hex, tb_bin; int bit; bool isFlags = (sender == RacialFlags_text); if (isFlags) { // if (InfoVersionChange_racial(ref val)) // TonyAI 2.3+ allow racial InfoVersion to be 0. // { // RacialFlags_text.Text = val.ToString(); // return; // refire this funct. // } bu = RacialFlags_reset; tb_hex = RacialFlags_hex; tb_bin = RacialFlags_bin; bit = bit_flags; } else if (sender == RacialFeat1_text) { bu = RacialFeat1_reset; tb_hex = RacialFeat1_hex; tb_bin = RacialFeat1_bin; bit = bit_feat1; } else if (sender == RacialFeat2_text) { bu = RacialFeat2_reset; tb_hex = RacialFeat2_hex; tb_bin = RacialFeat2_bin; bit = bit_feat2; } else if (sender == RacialFeat3_text) { bu = RacialFeat3_reset; tb_hex = RacialFeat3_hex; tb_bin = RacialFeat3_bin; bit = bit_feat3; } else if (sender == RacialFeat4_text) { bu = RacialFeat4_reset; tb_hex = RacialFeat4_hex; tb_bin = RacialFeat4_bin; bit = bit_feat4; } else // sender == RacialFeat5_text { bu = RacialFeat5_reset; tb_hex = RacialFeat5_hex; tb_bin = RacialFeat5_bin; bit = bit_feat5; } if (!he.BypassDiffer) { Race race = he.Races[he.Id]; RaceChanged racechanged; if (race.differ != bit_clean) { racechanged = he.RacesChanged[he.Id]; } else { racechanged = new RaceChanged(); racechanged.flags = race.flags; racechanged.feat1 = race.feat1; racechanged.feat2 = race.feat2; racechanged.feat3 = race.feat3; racechanged.feat4 = race.feat4; racechanged.feat5 = race.feat5; } if (isFlags) { racechanged.flags = val; } else if (sender == RacialFeat1_text) { racechanged.feat1 = val; } else if (sender == RacialFeat2_text) { racechanged.feat2 = val; } else if (sender == RacialFeat3_text) { racechanged.feat3 = val; } else if (sender == RacialFeat4_text) { racechanged.feat4 = val; } else // sender == RacialFeat5_text { racechanged.feat5 = val; } // check it race.differ = RaceDiffer(race, racechanged); he.Races[he.Id] = race; Color color; if (race.differ != bit_clean) { he.RacesChanged[he.Id] = racechanged; color = Color.Crimson; } else { he.RacesChanged.Remove(he.Id); if (race.isChanged) { color = Color.Blue; } else { color = DefaultForeColor; } } _he.SetNodeColor(color); } he.PrintCurrent(val, tb_hex, tb_bin); int differ = he.Races[he.Id].differ; if ((differ & bit) != 0) { bu.ForeColor = Color.Crimson; } else { bu.ForeColor = DefaultForeColor; } if (isFlags) { state_RacialFlags(val); // PrintInfoVersion_race(val); } else { state_RacialFeats(sender as Control); } _he.EnableApplys(differ != bit_clean); } // else TODO: error dialog here. }