private void editEncounterXp(object sender, RoutedEventArgs e) { XpRow selected = (XpRow)this.xpList.SelectedItem; if (selected == null) { return; } int encounterXp = selected.xp - selected.xpAdjust; XpWindow xw = new XpWindow(selected.character, encounterXp, selected.xpAdjust); xw.ShowDialog(); if (!xw.isValid()) { return; } selected.xp = encounterXp + xw.xpAdjust; selected.xpAdjust = xw.xpAdjust; ///// // //figure out selected.notes, .err, and .errMsg, as well as potential need to truncate xp and xpAdjust // ///// this.xpList.Items.Refresh(); }
private void encounterXpNotes(object sender, RoutedEventArgs e) { XpRow selected = (XpRow)this.xpList.SelectedItem; if ((selected == null) || (selected.errMsg.Length <= 0)) { return; } String severity = "Notice"; switch (selected.err) { case XpError.Failure: severity = "Error"; break; case XpError.ELTooHigh: severity = "Warning"; break; } MessageBox.Show(selected.errMsg, severity); }
private void adjustEncounterXp(object sender, RoutedEventArgs e) { foreach (XpRow r in this.xpList.Items) { if ((this.partyXpBox.Value < 0) && (r.err == XpError.OverLevel)) { if (r.xp + r.unspentXp < r.level * 1000) { r.err = XpError.Success; r.notes = "?"; r.errMsg = "XP award for " + r.character + " had been truncated due to over-leveling; other errors may have been overshadowed"; } } int encounterXp = r.xp - r.xpAdjust; r.xp += (int)this.partyXpBox.Value; r.xpAdjust += (int)this.partyXpBox.Value; if (r.xp >= this.overLevelThreshold(r.level)) { r.xp = this.overLevelThreshold(r.level) - 1; r.xpAdjust = r.xp - encounterXp; if ((r.err != XpError.Failure) && (r.err != XpError.OverLevel)) { r.err = XpError.OverLevel; r.notes = "*"; r.errMsg = "XP award for " + r.character + " was more than two levels' worth; truncated to 1XP below second level-up"; } } else if (r.xp + r.unspentXp >= r.level * 1000) { r.notes = "L"; r.errMsg = "XP award for " + r.character + " is sufficient to gain a level"; } else if (r.xp + r.unspentXp < 0) { r.notes = "D"; r.errMsg = "XP loss for " + r.character + " is sufficient to lose a level"; } else if ((r.notes == "L") || (r.notes == "D")) { r.notes = ""; r.errMsg = ""; } } if (this.xpList.Items.Count <= 0) { // special case for generating XP without a combat encounter foreach (CharacterRow c in this.partyList.Items) { if (!c.present) { continue; } XpRow r = new XpRow { character = c.name, level = c.level, unspentXp = c.unspentXp, xp = (int)this.partyXpBox.Value, xpAdjust = (int)this.partyXpBox.Value, notes = "", err = XpError.Success, errMsg = "" }; if (r.xp >= this.overLevelThreshold(r.level)) { r.xp = this.overLevelThreshold(r.level) - 1; r.xpAdjust = r.xp; r.err = XpError.OverLevel; r.notes = "*"; r.errMsg = "XP award for " + r.character + " was more than two levels' worth; truncated to 1XP below second level-up"; } else if (r.xp + c.unspentXp >= c.level * 1000) { r.notes = "L"; r.errMsg = "XP award for " + c.name + " is sufficient to gain a level"; } else if (r.xp + c.unspentXp < 0) { r.notes = "D"; r.errMsg = "XP award for " + c.name + " is sufficient to lose a level"; } else if ((r.notes == "L") || (r.notes == "D")) { r.notes = ""; r.errMsg = ""; } this.xpList.Items.Add(r); } } this.partyXpBox.Value = 0; this.xpList.Items.Refresh(); }
private void calculateEncounterXp(object sender, RoutedEventArgs e) { this.xpList.Items.Clear(); int partySize = 0; foreach (CharacterRow c in this.partyList.Items) { if (c.present) { partySize += 1; } } if (partySize <= 0) { MessageBox.Show("Party is empty; add characters to calculate encounter XP", "Error"); return; } foreach (CharacterRow c in this.partyList.Items) { if (!c.present) { continue; } XpError err, worstErr = XpError.Success; int xp = 0; foreach (OpponentRow o in this.opponentList.Items) { if ((o.cr < 1) || (c.level < 1) || (o.count < 1)) { err = XpError.Failure; continue; } xp += this.calculateXp(o.cr, c.level, partySize, out err) * o.count; switch (worstErr) { case XpError.Failure: break; case XpError.ELTooHigh: if (err == XpError.Failure) { worstErr = err; } break; case XpError.ELTooLow: if ((err == XpError.Failure) || (err == XpError.ELTooHigh)) { worstErr = err; } break; default: if (err != XpError.Success) { worstErr = err; } break; } } if (xp >= this.overLevelThreshold(c.level) - c.unspentXp) { if (worstErr != XpError.Failure) { worstErr = XpError.OverLevel; } xp = this.overLevelThreshold(c.level) - c.unspentXp - 1; } String notes = "", errMsg = ""; switch (worstErr) { case XpError.Failure: notes = "X"; errMsg = "One or more opponents was invalid; unable to calculate XP"; break; case XpError.ELTooLow: notes = "-"; errMsg = "At least one opponent was more than 7 levels below " + c.name; errMsg += "; no XP was awarded for that opponent"; break; case XpError.ELTooHigh: notes = "+"; errMsg = "At least one opponent was more than 7 levels above " + c.name; errMsg += "; consider alternate XP award"; break; case XpError.OverLevel: notes = "*"; errMsg = "XP award for " + c.name + " was more than two levels' worth; truncated to 1XP below second level-up"; break; case XpError.Success: if (xp + c.unspentXp >= c.level * 1000) { notes = "L"; errMsg = "XP award for " + c.name + " is sufficient to gain a level"; } break; } XpRow r = new XpRow { character = c.name, level = c.level, unspentXp = c.unspentXp, xp = xp, xpAdjust = 0, notes = notes, err = worstErr, errMsg = errMsg }; this.xpList.Items.Add(r); } this.xpList.Items.Refresh(); }