Beispiel #1
0
        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();
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
 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();
 }
Beispiel #4
0
        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();
        }