示例#1
0
 private void Initialize()
 {
     if (_monsterModel.Size != CreatureSize.None && !String.IsNullOrWhiteSpace(_monsterModel.Type) && !String.IsNullOrWhiteSpace(_monsterModel.Alignment))
     {
         string sizeString = _stringService.GetString(_monsterModel.Size);
         _details = _stringService.CapitalizeWords(sizeString + " " + _monsterModel.Type + ", " + _monsterModel.Alignment);
     }
     else if (_monsterModel.Size != CreatureSize.None && !String.IsNullOrWhiteSpace(_monsterModel.Type))
     {
         string sizeString = _stringService.GetString(_monsterModel.Size);
         _details = _stringService.CapitalizeWords(sizeString + " " + _monsterModel.Type);
     }
     else if (_monsterModel.Size != CreatureSize.None)
     {
         _details = _stringService.GetString(_monsterModel.Size);
     }
     else if (!String.IsNullOrWhiteSpace(_monsterModel.Type))
     {
         _details = _monsterModel.Type;
     }
     else
     {
         _details = "Unknown";
     }
 }
        /// <summary>
        /// Creates an instance of <see cref="MonsterViewModel"/>
        /// </summary>
        public MonsterViewModel(MonsterModel monsterModel)
        {
            _monsterModel = monsterModel;

            _size      = _monsterModel.Size != CreatureSize.None ? _stringService.GetString(_monsterModel.Size) : "Unknown";
            _alignment = !String.IsNullOrWhiteSpace(_monsterModel.Alignment) ? _stringService.CapitalizeWords(_monsterModel.Alignment) : "Unknown";
            _ac        = !String.IsNullOrWhiteSpace(_monsterModel.AC) ? _stringService.CapitalizeWords(_monsterModel.AC) : "Unknown";
            _hp        = !String.IsNullOrWhiteSpace(_monsterModel.HP) ? _monsterModel.HP : "Unknown";
            _type      = !String.IsNullOrWhiteSpace(_monsterModel.Type) ? _stringService.CapitalizeWords(_monsterModel.Type) : "Unknown";

            if (!String.IsNullOrWhiteSpace(_monsterModel.CR))
            {
                string xp = _stringService.CRXPString(_monsterModel.CR);
                if (!String.IsNullOrWhiteSpace(xp))
                {
                    _cr = String.Format("{0} ({1} XP)", _monsterModel.CR, xp);
                }
                else
                {
                    _cr = _monsterModel.CR;
                }
            }
            else
            {
                _cr = "Unknown";
            }

            _passivePerception = _monsterModel.PassivePerception.ToString();
            _speed             = !String.IsNullOrWhiteSpace(_monsterModel.Speed) ? _stringService.CapitalizeWords(_monsterModel.Speed) : "Unknown";

            _strength     = _monsterModel.Strength.ToString();
            _dexterity    = _monsterModel.Dexterity.ToString();
            _constitution = _monsterModel.Constitution.ToString();
            _intelligence = _monsterModel.Intelligence.ToString();
            _wisdom       = _monsterModel.Wisdom.ToString();
            _charisma     = _monsterModel.Charisma.ToString();

            _strengthBonus     = _statService.GetStatBonusString(_monsterModel.Strength);
            _dexterityBonus    = _statService.GetStatBonusString(_monsterModel.Dexterity);
            _constitutionBonus = _statService.GetStatBonusString(_monsterModel.Constitution);
            _intelligenceBonus = _statService.GetStatBonusString(_monsterModel.Intelligence);
            _wisdomBonus       = _statService.GetStatBonusString(_monsterModel.Wisdom);
            _charismaBonus     = _statService.GetStatBonusString(_monsterModel.Charisma);

            _strengthSave     = _monsterModel.Saves.ContainsKey(Ability.Strength) ? _statService.AddPlusOrMinus(_monsterModel.Saves[Ability.Strength]) : _strengthBonus;
            _dexteritySave    = _monsterModel.Saves.ContainsKey(Ability.Dexterity) ? _statService.AddPlusOrMinus(_monsterModel.Saves[Ability.Dexterity]) : _dexterityBonus;
            _constitutionSave = _monsterModel.Saves.ContainsKey(Ability.Constitution) ? _statService.AddPlusOrMinus(_monsterModel.Saves[Ability.Constitution]) : _constitutionBonus;
            _intelligenceSave = _monsterModel.Saves.ContainsKey(Ability.Intelligence) ? _statService.AddPlusOrMinus(_monsterModel.Saves[Ability.Intelligence]) : _intelligenceBonus;
            _wisdomSave       = _monsterModel.Saves.ContainsKey(Ability.Wisdom) ? _statService.AddPlusOrMinus(_monsterModel.Saves[Ability.Wisdom]) : _wisdomBonus;
            _charismaSave     = _monsterModel.Saves.ContainsKey(Ability.Charisma) ? _statService.AddPlusOrMinus(_monsterModel.Saves[Ability.Charisma]) : _charismaBonus;

            foreach (KeyValuePair <Skill, int> skillPair in _monsterModel.Skills)
            {
                string skillString = _stringService.GetString(skillPair.Key);
                string skillRoll   = _statService.AddPlusOrMinus(skillPair.Value);
                _skills[skillString] = skillRoll;
            }

            _vulnerabilities     = !String.IsNullOrWhiteSpace(_monsterModel.Vulnerabilities) ? _stringService.CapitalizeWords(_monsterModel.Vulnerabilities) : "None";
            _resistances         = !String.IsNullOrWhiteSpace(_monsterModel.Resistances) ? _stringService.CapitalizeWords(_monsterModel.Resistances) : "None";
            _immunities          = !String.IsNullOrWhiteSpace(_monsterModel.Immunities) ? _stringService.CapitalizeWords(_monsterModel.Immunities) : "None";
            _conditionImmunities = !String.IsNullOrWhiteSpace(_monsterModel.ConditionImmunities) ? _stringService.CapitalizeWords(_monsterModel.ConditionImmunities) : "None";
            _senses      = !String.IsNullOrWhiteSpace(_monsterModel.Senses) ? _stringService.CapitalizeWords(_monsterModel.Senses) : "None";
            _languages   = _monsterModel.Languages.Count > 0 ? _stringService.CapitalizeWords(String.Join(", ", _monsterModel.Languages)) : "None";
            _environment = !String.IsNullOrWhiteSpace(_monsterModel.Environment) ? _stringService.CapitalizeWords(_monsterModel.Environment) : "Unknown";

            _description = _monsterModel.Description;

            foreach (TraitModel traitModel in _monsterModel.Traits)
            {
                _traits.Add(new TraitViewModel(traitModel));
            }

            foreach (MonsterActionModel monsterAction in _monsterModel.Actions)
            {
                _actions.Add(new MonsterActionViewModel(monsterAction));
            }

            foreach (MonsterActionModel monsterAction in _monsterModel.Reactions)
            {
                _reactions.Add(new MonsterActionViewModel(monsterAction));
            }

            foreach (MonsterActionModel monsterAction in _monsterModel.LegendaryActions)
            {
                _legendaryActions.Add(new MonsterActionViewModel(monsterAction));
            }

            _spellSlots = new List <string>(_monsterModel.SpellSlots);
            while (_spellSlots.Count < 9)
            {
                _spellSlots.Add("0");
            }

            _spells = new List <string>(_monsterModel.Spells);

            _rollAbilityBonusCommand = new RelayCommand(obj => true, obj => RollAbilityBonus((Ability)obj));
            _rollAbilitySaveCommand  = new RelayCommand(obj => true, obj => RollAbilitySave((Ability)obj));
            _rollSkillCommand        = new RelayCommand(obj => true, obj => RollSkill((string)obj));
            _rollAttackToHitCommand  = new RelayCommand(obj => true, obj => RollAttackToHit((MonsterAttackViewModel)obj));
            _rollAttackDamageCommand = new RelayCommand(obj => true, obj => RollAttackDamage((MonsterAttackViewModel)obj));
            _showSpellDialogCommand  = new RelayCommand(obj => true, obj => ShowSpellDialog((string)obj));
        }
        /// <summary>
        /// Creates an instance of <see cref="RandomEncounterDialogViewModel"/>
        /// </summary>
        public RandomEncounterDialogViewModel(List <EncounterCharacterModel> encounterCharacters)
        {
            _encounterCharacters = encounterCharacters;

            foreach (EncounterChallenge encounterChallenge in Enum.GetValues(typeof(EncounterChallenge)))
            {
                if (encounterChallenge != EncounterChallenge.Unknown)
                {
                    _difficultyOptions.Add(new KeyValuePair <EncounterChallenge, string>(encounterChallenge, _stringService.GetString(encounterChallenge)));
                }
            }
            _selectedDifficultyOption = _difficultyOptions.FirstOrDefault();

            _environmentOptions.Add(new KeyValuePair <string, string>(null, "Any Environment"));
            foreach (MonsterModel monster in _compendium.Monsters)
            {
                if (!String.IsNullOrWhiteSpace(monster.Environment))
                {
                    foreach (string environmentSplit in monster.Environment.Split(new char[] { ',' }))
                    {
                        string environment = environmentSplit.Trim();
                        if (!_environmentOptions.Any(x => x.Value.ToLower() == environment.ToLower()))
                        {
                            _environmentOptions.Add(new KeyValuePair <string, string>(environment, _stringService.CapitalizeWords(environment)));
                        }
                    }
                }
            }
            _selectedEnvironmentOption = _environmentOptions.FirstOrDefault();

            _minMonsters = 1;
            _maxMonsters = 10;

            _acceptCommand             = new RelayCommand(obj => true, obj => OnAccept());
            _rejectCommand             = new RelayCommand(obj => true, obj => OnReject());
            _generateMonstersCommand   = new RelayCommand(obj => true, obj => GenerateMonsters());
            _viewMonsterDetailsCommand = new RelayCommand(obj => true, obj => ViewMonsterDetails((EncounterMonsterViewModel)obj));
        }
        private void InitializeFromMonsterModel()
        {
            if (_monsterModel != null)
            {
                Name = _monsterModel.Name;

                string hpString = _monsterModel.HP;
                if (hpString.Contains(" "))
                {
                    hpString = hpString.Split(new char[] { ' ' })[0];
                }
                int hp = 0;
                if (int.TryParse(hpString, out hp))
                {
                    MaxHP = hp;
                }

                PassivePerception = _monsterModel.PassivePerception;

                string acString = _monsterModel.AC;
                if (acString.Contains(" "))
                {
                    acString = acString.Split(new char[] { ' ' })[0];
                }
                int ac = 0;
                if (int.TryParse(acString, out ac))
                {
                    AC = ac;
                }

                InitiativeBonus = _statService.GetStatBonus(_monsterModel.Dexterity);

                _cr = _monsterModel.CR;

                List <MonsterAttackModel> attacks = new List <MonsterAttackModel>();
                foreach (MonsterActionModel monsterActionModel in _monsterModel.Actions)
                {
                    foreach (MonsterAttackModel monsterAttack in monsterActionModel.Attacks)
                    {
                        attacks.Add(monsterAttack);
                    }
                }

                int numberOfAttacks = 1;
                List <KeyValuePair <MonsterAttackModel, int> > multiattacks = new List <KeyValuePair <MonsterAttackModel, int> >();
                foreach (MonsterActionModel monsterActionModel in _monsterModel.Actions)
                {
                    if (monsterActionModel.Name.ToLower().Contains("multiattack") ||
                        monsterActionModel.Name.ToLower().Contains("multi-attack"))
                    {
                        string multiattackText = String.Join(" ", monsterActionModel.TextCollection).ToLower();
                        int    attacksIndex    = multiattackText.IndexOf("attacks");
                        if (attacksIndex != -1)
                        {
                            string upToAttacks = multiattackText.Substring(0, attacksIndex);
                            foreach (string word in upToAttacks.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Reverse())
                            {
                                if (word == "one")
                                {
                                    numberOfAttacks = 1;
                                    break;
                                }
                                else if (word == "two")
                                {
                                    numberOfAttacks = 2;
                                    break;
                                }
                                else if (word == "three")
                                {
                                    numberOfAttacks = 3;
                                    break;
                                }
                                else if (word == "four")
                                {
                                    numberOfAttacks = 4;
                                    break;
                                }
                                else if (word == "five")
                                {
                                    numberOfAttacks = 5;
                                    break;
                                }
                            }
                        }

                        foreach (MonsterAttackModel monsterAttackModel in attacks)
                        {
                            int nameIndex = multiattackText.IndexOf(monsterAttackModel.Name.ToLower());
                            if (nameIndex != -1)
                            {
                                string upToAttackName = multiattackText.Substring(0, nameIndex);
                                foreach (string word in upToAttackName.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Reverse())
                                {
                                    if (word == "one")
                                    {
                                        multiattacks.Add(new KeyValuePair <MonsterAttackModel, int>(monsterAttackModel, 1));
                                        break;
                                    }
                                    else if (word == "two")
                                    {
                                        multiattacks.Add(new KeyValuePair <MonsterAttackModel, int>(monsterAttackModel, 2));
                                        break;
                                    }
                                    else if (word == "three")
                                    {
                                        multiattacks.Add(new KeyValuePair <MonsterAttackModel, int>(monsterAttackModel, 3));
                                        break;
                                    }
                                    else if (word == "four")
                                    {
                                        multiattacks.Add(new KeyValuePair <MonsterAttackModel, int>(monsterAttackModel, 4));
                                        break;
                                    }
                                    else if (word == "five")
                                    {
                                        multiattacks.Add(new KeyValuePair <MonsterAttackModel, int>(monsterAttackModel, 5));
                                        break;
                                    }
                                }
                            }
                        }
                    }
                }

                int averageMultiAttackDamage = 0;
                foreach (KeyValuePair <MonsterAttackModel, int> multiAttackPair in multiattacks)
                {
                    if (attacks.Contains(multiAttackPair.Key))
                    {
                        attacks.Remove(multiAttackPair.Key);
                    }

                    if (!String.IsNullOrEmpty(multiAttackPair.Key.Roll))
                    {
                        (double, double, double)avgMinMax = _diceService.EvaluateExpressionAvgMinMax(multiAttackPair.Key.Roll);
                        averageMultiAttackDamage         += (int)avgMinMax.Item1 * multiAttackPair.Value;
                    }
                }

                int averageSingleAttackDamage      = 0;
                int totalAverageSingleAttackDamage = 0;
                int attacksWithRolls = 0;
                foreach (MonsterAttackModel monsterAttackModel in attacks)
                {
                    if (!String.IsNullOrEmpty(monsterAttackModel.Roll))
                    {
                        (double, double, double)avgMinMax = _diceService.EvaluateExpressionAvgMinMax(monsterAttackModel.Roll);
                        totalAverageSingleAttackDamage   += (int)avgMinMax.Item1;
                        attacksWithRolls++;
                    }
                }
                if (attacksWithRolls > 0)
                {
                    averageSingleAttackDamage = totalAverageSingleAttackDamage / attacksWithRolls;
                }

                int averageSpellDamage      = 0;
                int totalAverageSpellDamage = 0;
                int spellsWithRolls         = 0;
                foreach (string spellName in _monsterModel.Spells)
                {
                    SpellModel spellModel = _compendium.Spells.FirstOrDefault(x => x.Name.ToLower() == spellName.ToLower());
                    if (spellModel != null && spellModel.Rolls.Any())
                    {
                        int maxRoll = 0;
                        foreach (string roll in spellModel.Rolls)
                        {
                            (double, double, double)avgMinMax = _diceService.EvaluateExpressionAvgMinMax(roll);
                            maxRoll = Math.Max((int)avgMinMax.Item1, maxRoll);
                        }
                        totalAverageSpellDamage += maxRoll;
                        spellsWithRolls++;
                    }
                }
                if (spellsWithRolls > 0)
                {
                    averageSpellDamage = totalAverageSpellDamage / spellsWithRolls;
                }

                _averageDamageTurn = Math.Max(Math.Max(averageMultiAttackDamage, averageSingleAttackDamage), averageSpellDamage);

                _damageVulnerabilities = _stringService.CapitalizeWords(_monsterModel.Vulnerabilities);

                _damageResistances = _stringService.CapitalizeWords(_monsterModel.Resistances);

                _damageImmunities = _stringService.CapitalizeWords(_monsterModel.Immunities);

                _conditionImmunities = _stringService.CapitalizeWords(_monsterModel.ConditionImmunities);
            }
            else
            {
                Name = String.Empty;
                PassivePerception  = 0;
                InitiativeBonus    = 0;
                _averageDamageTurn = 0;
                _quantity          = 1;
                _cr = String.Empty;
                _damageVulnerabilities = String.Empty;
                _damageResistances     = String.Empty;
                _damageImmunities      = String.Empty;
                _conditionImmunities   = String.Empty;
            }
        }
        /// <summary>
        /// Creates an instance of <see cref="MonsterSearchInput"/>
        /// </summary>
        public MonsterSearchInput(Compendium compendium, StringService stringService, StatService statService)
        {
            _compendium    = compendium;
            _stringService = stringService;
            _statService   = statService;

            foreach (MonsterSortOption sort in Enum.GetValues(typeof(MonsterSortOption)))
            {
                _sortOptions.Add(new KeyValuePair <MonsterSortOption, string>(sort, sort.ToString().Replace("_", " ")));
            }

            _sizes.Add(new KeyValuePair <CreatureSize, string>(CreatureSize.None, "Any Size"));
            foreach (CreatureSize size in Enum.GetValues(typeof(CreatureSize)))
            {
                if (size != CreatureSize.None)
                {
                    _sizes.Add(new KeyValuePair <CreatureSize, string>(size, _stringService.GetString(size)));
                }
            }

            _alignments.Add(new KeyValuePair <Alignment, string>(Enums.Alignment.None, "Any Alignment"));
            foreach (Alignment alignment in Enum.GetValues(typeof(Alignment)))
            {
                if (alignment != Enums.Alignment.None)
                {
                    _alignments.Add(new KeyValuePair <Alignment, string>(alignment, _stringService.GetString(alignment)));
                }
            }

            foreach (MonsterModel monster in _compendium.Monsters)
            {
                if (!_types.Any(x => x.Value.ToLower() == monster.Type.ToLower()))
                {
                    _types.Add(new KeyValuePair <string, string>(monster.Type, _stringService.CapitalizeWords(monster.Type)));
                }

                int number = 0;
                if (!_crs.Any(x => x.Value == monster.CR) && (monster.CR.Contains("/") || Int32.TryParse(monster.CR, out number)))
                {
                    _crs.Add(new KeyValuePair <string, string>(monster.CR, monster.CR));
                }

                if (!String.IsNullOrWhiteSpace(monster.Environment))
                {
                    foreach (string environmentSplit in monster.Environment.Split(new char[] { ',' }))
                    {
                        string environment = environmentSplit.Trim();
                        if (!_environments.Any(x => x.Value.ToLower() == environment.ToLower()))
                        {
                            _environments.Add(new KeyValuePair <string, string>(environment, _stringService.CapitalizeWords(environment)));
                        }
                    }
                }
            }

            _types = _types.OrderBy(x => x.Value).ToList();
            _types.Insert(0, new KeyValuePair <string, string>(null, "Any Type"));

            _crs = _crs.OrderBy(x => _statService.CRToFloat(x.Value)).ToList();
            _crs.Insert(0, new KeyValuePair <string, string>("-", "Unknown"));
            _crs.Insert(0, new KeyValuePair <string, string>(null, "Any CR"));

            _environments = _environments.OrderBy(x => x.Value).ToList();
            _environments.Insert(0, new KeyValuePair <string, string>(null, "Any Environment"));

            Reset();
        }