예제 #1
0
        private static DiceDto AddDieStr(DiceRoll diceRoll, CardDto cardDto, DndViewer viewer, string dieStr, string dieLabelOverride = null, int targetCharacterId = int.MinValue)
        {
            string      dieBackColorOverride = viewer.DieBackColor;
            string      dieTextColorOverride = viewer.DieTextColor;
            int         parenIndex           = dieStr.IndexOf("(");
            DamageType  damageType           = DamageType.None;
            DieCountsAs dieCountsAs          = DieCountsAs.totalScore;
            string      diePlayerName        = cardDto.Card.UserName;
            double      modifier             = 0;
            double      scaleOverride        = viewer.Reputation + 0.30;
            int         dieOwnerOverride     = int.MinValue;

            if (parenIndex >= 0)
            {
                ProcessDieDetails(diceRoll, targetCharacterId, ref dieStr, ref dieBackColorOverride, ref dieTextColorOverride, parenIndex, ref damageType, ref dieCountsAs, ref modifier, ref diePlayerName, ref scaleOverride, ref dieOwnerOverride);
            }

            string[] dieParts = dieStr.Split('d');
            if (dieParts.Length != 2)
            {
                return(null);
            }

            string dieLabel;

            if (string.IsNullOrWhiteSpace(dieLabelOverride) || dieLabelOverride.Trim() == "\"\"")
            {
                dieLabel = $"{cardDto.Card.UserName}";
            }
            else
            {
                dieLabel = dieLabelOverride.Trim().TrimStart('"').TrimEnd('"');
            }

            int quantity;
            int sides;

            if (!int.TryParse(dieParts[0], out quantity) || !int.TryParse(dieParts[1], out sides))
            {
                return(null);
            }
            DiceDto diceDto = new DiceDto()
            {
                PlayerName  = diePlayerName,
                CreatureId  = dieOwnerOverride,
                Sides       = sides,
                Quantity    = quantity,
                Label       = dieLabel.Replace("target_name", DndUtils.GetFirstName(diePlayerName)),
                Scale       = scaleOverride,
                Modifier    = modifier,
                DamageType  = damageType,
                BackColor   = dieBackColorOverride,
                FontColor   = dieTextColorOverride,
                DieCountsAs = dieCountsAs,
                Data        = cardDto.Card.Guid
            };

            diceRoll.DiceDtos.Add(diceDto);
            return(diceDto);
        }
예제 #2
0
        public static DiceDto D20FromInGameCreature(InGameCreature inGameCreature, DiceRollType diceRollType)
        {
            DieCountsAs dieCountsAs = DieCountsAs.totalScore;
            double      modifier    = 0;
            string      label;

            if (IsSavingThrow(diceRollType))
            {
                dieCountsAs = DieCountsAs.savingThrow;
                label       = $"{inGameCreature.Name}'s Save";
            }
            else
            {
                label = inGameCreature.Name;
            }

            return(AddD20ForCreature(inGameCreature, label, modifier, dieCountsAs));
        }
예제 #3
0
        private static void ProcessDieDetails(DiceRoll diceRoll, int dieOwnerId, ref string dieStr, ref string dieBackColorOverride,
                                              ref string dieTextColorOverride, int parenIndex, ref DamageType damageType, ref DieCountsAs dieCountsAs,
                                              ref double modifier, ref string diePlayerName, ref double scaleOverride, ref int dieOwnerOverride)
        {
            string dieTypeStr = dieStr.Substring(parenIndex).Trim();

            dieStr = dieStr.Substring(0, parenIndex);

            int colonPos = dieTypeStr.IndexOf(':');

            if (colonPos > 0)
            {
                // Die format specifier - "type:detail", e.g., "save:Dexterity" for a Dexterity saving throw.
                string[] dieTypeParts = dieTypeStr.TrimStart('(').TrimEnd(')').Split(':');
                if (dieTypeParts.Length == 2)
                {
                    string rollKindStr = dieTypeParts[0];
                    string rollData    = dieTypeParts[1];
                    if (rollKindStr == "save")
                    {
                        PrepareForSavingThrow(diceRoll, dieOwnerId, rollData, ref dieBackColorOverride, ref dieTextColorOverride, ref modifier, ref diePlayerName, ref scaleOverride, ref dieOwnerOverride);
                        dieCountsAs = DieCountsAs.savingThrow;
                    }
                    else
                    {
                        dieCountsAs = DieCountsAs.totalScore;
                    }
                }
            }
            else
            {
                // Probably just straight damage...
                damageType = DndUtils.ToDamage(dieTypeStr);
                if (damageType != DamageType.None)
                {
                    dieCountsAs = DieCountsAs.damage;
                }
            }
        }
예제 #4
0
 private static DiceDto AddD20ForCreature(InGameCreature inGameCreature, string label, double modifier, DieCountsAs dieCountsAs)
 {
     return(new DiceDto()
     {
         PlayerName = inGameCreature.Name,
         CreatureId = -inGameCreature.Index,
         Sides = 20,
         Quantity = 1,
         Label = label,
         Modifier = modifier,
         DamageType = DamageType.None,
         BackColor = inGameCreature.BackgroundHex,
         FontColor = inGameCreature.ForegroundHex,
         DieCountsAs = dieCountsAs
     });
 }
예제 #5
0
 public static DiceDto AddD20ForCharacter(Character player, string label, double modifier, DieCountsAs dieCountsAs)
 {
     return(new DiceDto()
     {
         PlayerName = player.Name,
         CreatureId = player.IntId,
         Sides = 20,
         Quantity = 1,
         Label = label,
         Modifier = modifier,
         DamageType = DamageType.None,
         BackColor = player.dieBackColor,
         FontColor = player.dieFontColor,
         DieCountsAs = dieCountsAs
     });
 }