Example #1
0
        public override object Execute(Macro m, List <string> errors)
        {
            if (!R20WSServer.Connected)
            {
                errors.Add(this.Translate("Macro_Error_NoServer"));
                return(null);
            }

            R20WSServer.Send(new CommandPacket()
            {
                Template = Template.Dmg,
                GMRoll   = AppState.Current.TRoll20.MacroToGMMode,
                Data     = new TemplateDataDmg
                {
                    Dmg1     = this.Expressionify(this.Params[0].Execute(m, errors).ToString()),
                    Dmg2     = this.Expressionify(this.Params[1].Execute(m, errors).ToString()),
                    Dmg1Type = this.Params[2].Execute(m, errors).ToString(),
                    Dmg2Type = this.Params[3].Execute(m, errors).ToString(),
                    Range    = this.Params[4].Execute(m, errors).ToString(),
                    Name     = this.Params[5].Execute(m, errors).ToString(),
                    CharName = this.Params[6].Execute(m, errors).ToString()
                }
            });

            return(null);
        }
Example #2
0
        public override object Execute(Macro m, List <string> errors)
        {
            if (!R20WSServer.Connected)
            {
                errors.Add(this.Translate("Macro_Error_NoServer"));
                return(null);
            }

            R20WSServer.Send(new MessagePacket()
            {
                Text = (string)this.Params[0].Execute(m, errors), GMRoll = AppState.Current.TRoll20.MacroToGMMode
            });
            return(null);
        }
        public override object Execute(Macro m, List <string> errors)
        {
            if (!R20WSServer.Connected)
            {
                errors.Add(this.Translate("Macro_Error_NoServer"));
                return(null);
            }

            R20WSServer.Send(new CommandPacket()
            {
                Template = Template.Description, GMRoll = AppState.Current.TRoll20.MacroToGMMode, Data = new TemplateDataDesc {
                    Desc = this.Params[0].Execute(m, errors).ToString()
                }
            });
            return(null);
        }
Example #4
0
        public override object Execute(Macro m, List <string> errors)
        {
            string name = this.Params[0].Execute(m, errors).ToString();

            R20WSServer.Send(new PollPacket()); // Listen call
            R20WSServer.Send(new MessagePacket()
            {
                Text = name, GMRoll = false
            });
            int?i = R20WSServer.AwaitCallback();

            if (!i.HasValue)
            {
                errors.Add(this.Translate("Macro_Error_NoPollR20"));
            }

            return(i ?? 0);
        }
Example #5
0
 private void Button_Click_9(object sender, RoutedEventArgs e)
 {
     if (!this.CheckBox_AsSimpleRoll.IsChecked ?? false)
     {
         this.RollDieSimple($"{ this.IntUD_AdvRollNumDice.Value }d{ this.IntUD_AdvRollSidesDice.Value }{ this.ComboBox_AdvRollMathType.Text }{ this.IntUD_AdvRollMod.Value }");
     }
     else
     {
         R20WSServer.Send(new CommandPacket()
         {
             Template = Roll20.Template.None,
             Data     = new TemplateDataManyRolls()
             {
                 Roll = $"{ this.IntUD_AdvRollNumDice.Value }d{ this.IntUD_AdvRollSidesDice.Value }{ this.ComboBox_AdvRollMathType.Text }{ this.IntUD_AdvRollMod.Value }", GMRoll = this.CB_GMRoll.IsChecked ?? false
             },
             GMRoll = this.CB_GMRoll.IsChecked ?? false
         });
     }
 }
Example #6
0
        public override object Execute(Macro m, List <string> errors)
        {
            if (!R20WSServer.Connected)
            {
                errors.Add(this.Translate("Macro_Error_NoServer"));
                return(null);
            }

            if (this.TryGetSpellLink(m, (string)this.Params[0].Execute(m, errors), out _))
            {
                R20WSServer.Send(new CommandPacket
                {
                    Template = Template.Spell,
                    GMRoll   = AppState.Current.TRoll20.MacroToGMMode,
                    Data     = new TemplateDataSpell
                    {
                        Name               = this.Params[0].Execute(m, errors).ToString(),
                        SchoolLevel        = $"{ this.Params[1].Execute(m, errors) } { this.Params[2].Execute(m, errors) }",
                        CastingTime        = this.Params[4].Execute(m, errors).ToString(),
                        Range              = this.Params[5].Execute(m, errors).ToString(),
                        Target             = this.Params[6].Execute(m, errors).ToString(),
                        Verbal             = (bool)this.Params[7].Execute(m, errors) ? "1" : "0",
                        Somatic            = (bool)this.Params[8].Execute(m, errors) ? "1" : "0",
                        Material           = (bool)this.Params[9].Execute(m, errors) ? "1" : "0",
                        Duration           = this.Params[12].Execute(m, errors).ToString(),
                        Desc               = this.Params[13].Execute(m, errors).ToString(),
                        Ritual             = (bool)this.Params[3].Execute(m, errors) ? "1" : "0",
                        Concentration      = (bool)this.Params[10].Execute(m, errors) ? "1" : "0",
                        MaterialComponents = this.Params[11].Execute(m, errors).ToString(),
                        CharName           = AppState.Current.State.General.Name
                    }
                });
            }

            errors.Add(this.Translate("Macro_Error_NoLink"));
            return(null);
        }
        public override object Execute(Macro m, List <string> errors)
        {
            if (!R20WSServer.Connected)
            {
                errors.Add(this.Translate("Macro_Error_NoServer"));
                return(null);
            }

            if (this.TryGetSpellLink(m, (string)this.Params[0].Execute(m, errors), out Spell s))
            {
                R20WSServer.Send(new CommandPacket
                {
                    Template = Template.Spell,
                    GMRoll   = AppState.Current.TRoll20.MacroToGMMode,
                    Data     = new TemplateDataSpell
                    {
                        Name          = s.Name,
                        SchoolLevel   = $"{ s.School } { s.Level }",
                        CastingTime   = s.CastTime,
                        Range         = s.Range,
                        Target        = s.Target,
                        Verbal        = s.PropertyVerbal ? "1" : "0",
                        Somatic       = s.PropertySomatic ? "1" : "0",
                        Material      = s.PropertyMaterial ? "1" : "0",
                        Duration      = s.Duration,
                        Desc          = s.Description,
                        Ritual        = s.PropertyRitual ? "1" : "0",
                        Concentration = s.PropertyConcentration ? "1" : "0",
                        CharName      = AppState.Current.State.General.Name
                    }
                });
            }

            errors.Add(this.Translate("Macro_Error_NoLink"));
            return(null);
        }
Example #8
0
        private void RunSpellRoll20(object sender, RoutedEventArgs e)
        {
            if (!(sender is Spell s))
            {
                ListView collection = this.GetSpellCollection(this.TabControl_Spellbook.SelectedIndex);
                s = collection.SelectedItems.Count > 0 ? (Spell)collection.SelectedItems[0] : null;
            }

            if (s.Integration == null || !R20WSServer.Connected)
            {
                return;
            }

            ChangeValueWindow cvw = new ChangeValueWindow();

            cvw.DUD_Value.Value   = s.Level;
            cvw.DUD_Value.Minimum = s.Level;
            cvw.DUD_Value.Maximum = 9;
            cvw.DUD_Value.Step    = 1;
            cvw.Title             = MainWindow.Translate("Window_CastAs_Title");
            cvw.ShowDialog();
            int aLvl = (int)cvw.DUD_Value.Value;

            if (s.Integration.ShowSpellDescription)
            {
                R20WSServer.Send(new CommandPacket
                {
                    GMRoll   = false,
                    Template = Roll20.Template.Spell,
                    Data     = new TemplateDataSpell
                    {
                        CastingTime   = s.CastTime,
                        CharName      = AppState.Current.State.General.Name,
                        Concentration = s.PropertyConcentration ? "1" : "0",
                        Desc          = s.Description,
                        Duration      = s.Duration,
                        Material      = s.PropertyMaterial ? "1" : "0",
                        Name          = s.Name,
                        Range         = s.Range,
                        Ritual        = s.PropertyRitual ? "1" : "0",
                        SchoolLevel   = $"{ s.School } { s.Level }",
                        Somatic       = s.PropertySomatic ? "1" : "0",
                        Verbal        = s.PropertyVerbal ? "1" : "0",
                        Target        = s.Target
                    }
                });
            }

            string hitString    = "";
            string saveText     = "";
            string damageString = "";
            string critString   = "";

            if (s.Integration.HitDie.NumDice.GetForLevel(aLvl, s.Level) > 0) // Have a hit effect
            {
                hitString = $"[[[[{s.Integration.HitDie.NumDice.GetForLevel(aLvl, s.Level)}d{s.Integration.HitDie.DieSide.GetForLevel(aLvl, s.Level)}]][{s.Integration.HitDie.NumDice.GetForLevel(aLvl, s.Level)}d{s.Integration.HitDie.DieSide.GetForLevel(aLvl, s.Level)}]";
                if (s.Integration.HitConstant.GetForLevel(aLvl, s.Level) > 0)
                {
                    hitString += $"+{s.Integration.HitConstant.GetForLevel(aLvl, s.Level)}";
                }

                if (s.Integration.HitIncludeProfficiency)
                {
                    hitString += $"+{AppState.Current.State.General.ProfficiencyBonus}[{MainWindow.Translate("General_PBonus")}]";
                }

                if (s.Integration.HitIncludeSpellcastingAbility)
                {
                    hitString += $"+{AppState.Current.State.Spellbook.SpellAttackBonus}[{MainWindow.Translate("General_SBonus")}]";
                }

                if (s.Integration.HitIncludeStr)
                {
                    hitString += $"+{AppState.Current.State.General.StatModStr}[{MainWindow.Translate("General_Str")}]";
                }

                if (s.Integration.HitIncludeDex)
                {
                    hitString += $"+{AppState.Current.State.General.StatModDex}[{MainWindow.Translate("General_Dex")}]";
                }

                if (s.Integration.HitIncludeCon)
                {
                    hitString += $"+{AppState.Current.State.General.StatModCon}[{MainWindow.Translate("General_Con")}]";
                }

                if (s.Integration.HitIncludeWis)
                {
                    hitString += $"+{AppState.Current.State.General.StatModWis}[{MainWindow.Translate("General_Wis")}]";
                }

                if (s.Integration.HitIncludeCha)
                {
                    hitString += $"+{AppState.Current.State.General.StatModCha}[{MainWindow.Translate("General_Cha")}]";
                }

                if (s.Integration.HitIncludeInt)
                {
                    hitString += $"+{AppState.Current.State.General.StatModInt}[{MainWindow.Translate("General_Int")}]";
                }

                hitString += "]]";
            }

            if (s.Integration.Damage.Count > 0)
            {
                damageString = "[[";
                critString   = "[[";
                for (int i = 0; i < s.Integration.Damage.Count; i++)
                {
                    ScalableDamageLine dl = s.Integration.Damage[i];
                    if (dl.Die.NumDice.GetForLevel(aLvl, s.Level) > 0 && dl.ConstantNumber.GetForLevel(aLvl, s.Level) != 0)
                    {
                        damageString += $"[[[[{dl.Die.NumDice.GetForLevel(aLvl, s.Level)}d{dl.Die.DieSide.GetForLevel(aLvl, s.Level)}]][{dl.Die.NumDice.GetForLevel(aLvl, s.Level)}d{dl.Die.DieSide.GetForLevel(aLvl, s.Level)}] + {dl.ConstantNumber.GetForLevel(aLvl, s.Level)}]][{dl.Label}]";
                        critString   += $"[[{dl.Die.NumDice.GetForLevel(aLvl, s.Level)}d{dl.Die.DieSide.GetForLevel(aLvl, s.Level)}]][{dl.Die.NumDice.GetForLevel(aLvl, s.Level)}d{dl.Die.DieSide.GetForLevel(aLvl, s.Level)} {dl.Label}]";
                    }
                    else
                    {
                        if (dl.Die.DieSide.GetForLevel(aLvl, s.Level) > 0)
                        {
                            damageString += $"[[{dl.Die.NumDice.GetForLevel(aLvl, s.Level)}d{dl.Die.DieSide.GetForLevel(aLvl, s.Level)}]][{dl.Die.NumDice.GetForLevel(aLvl, s.Level)}d{dl.Die.DieSide.GetForLevel(aLvl, s.Level)} {dl.Label}]";
                            critString   += $"[[{dl.Die.NumDice.GetForLevel(aLvl, s.Level)}d{dl.Die.DieSide.GetForLevel(aLvl, s.Level)}]][{dl.Die.NumDice.GetForLevel(aLvl, s.Level)}d{dl.Die.DieSide.GetForLevel(aLvl, s.Level)} {dl.Label}]";
                        }
                        else
                        {
                            damageString += $"{dl.ConstantNumber.GetForLevel(aLvl, s.Level)}[{dl.Label}]";
                        }
                    }

                    if (i != s.Integration.Damage.Count - 1)
                    {
                        damageString += "+";
                        critString   += "+";
                    }
                }

                while (critString[critString.Length - 1] == '+')
                {
                    critString = critString.Substring(0, critString.Length - 1);
                }

                critString += "]]";
                if (s.Integration.DamageIncludeProfficiency)
                {
                    damageString += $"+{AppState.Current.State.General.StatModStr}[{MainWindow.Translate("General_PBonus")}]";
                }

                if (s.Integration.DamageIncludeSpellcastingAbility)
                {
                    damageString += $"+{AppState.Current.State.General.StatModStr}[{MainWindow.Translate("General_SBonus")}]";
                }

                if (s.Integration.DamageIncludeStr)
                {
                    damageString += $"+{AppState.Current.State.General.StatModStr}[{MainWindow.Translate("General_Str")}]";
                }

                if (s.Integration.DamageIncludeDex)
                {
                    damageString += $"+{AppState.Current.State.General.StatModDex}[{MainWindow.Translate("General_Dex")}]";
                }

                if (s.Integration.DamageIncludeCon)
                {
                    damageString += $"+{AppState.Current.State.General.StatModCon}[{MainWindow.Translate("General_Con")}]";
                }

                if (s.Integration.DamageIncludeWis)
                {
                    damageString += $"+{AppState.Current.State.General.StatModWis}[{MainWindow.Translate("General_Wis")}]";
                }

                if (s.Integration.DamageIncludeCha)
                {
                    damageString += $"+{AppState.Current.State.General.StatModCha}[{MainWindow.Translate("General_Cha")}]";
                }

                if (s.Integration.DamageIncludeInt)
                {
                    damageString += $"+{AppState.Current.State.General.StatModInt}[{MainWindow.Translate("General_Int")}]";
                }

                damageString += "]]";
            }

            if (s.Integration.HitIsSpellSave)
            {
                saveText  = "[[";
                saveText += AppState.Current.State.Spellbook.SpellSaveDC + "[" + MainWindow.Translate("Generic_Save") + "]";
                int a = s.Integration.SaveConstant.GetForLevel(aLvl, s.Level);
                if (a != 0)
                {
                    saveText += $"+{a}[{MainWindow.Translate("Generic_Bonus")}]";
                }

                saveText += "]]";
            }

            // Start sending data.
            // Main priority goes to save
            if (!string.IsNullOrEmpty(saveText))             // Have save DC
            {
                if (!string.IsNullOrEmpty(hitString))        // Have both save AND hit
                {
                    if (!string.IsNullOrEmpty(damageString)) // Have damage too
                    {
                        R20WSServer.Send(new CommandPacket
                        {
                            GMRoll   = false,
                            Template = Roll20.Template.AtkDmg,
                            Data     = new TemplateDataAtkSaveDmg
                            {
                                CharName = AppState.Current.State.General.Name,
                                Crit     = critString,
                                Dmg      = damageString,
                                Name     = s.Name,
                                R1       = hitString,
                                R2       = hitString,
                                Range    = s.Range,
                                SaveAttr = s.Integration.SaveAttr,
                                SaveDC   = saveText,
                                SaveDesc = string.Empty
                            }
                        });
                    }
                    else // Only save + hit?
                    {
                        R20WSServer.Send(new CommandPacket
                        {
                            GMRoll   = false,
                            Template = Roll20.Template.AtkDmg,
                            Data     = new TemplateDataAtkSaveDmg
                            {
                                CharName = AppState.Current.State.General.Name,
                                Crit     = critString,
                                Dmg      = string.Empty, // Should result in no damage section output
                                Name     = s.Name,
                                R1       = hitString,
                                R2       = hitString,
                                Range    = s.Range,
                                SaveAttr = s.Integration.SaveAttr,
                                SaveDC   = saveText,
                                SaveDesc = string.Empty
                            }
                        });
                    }
                }
                else // No hit
                {
                    if (!string.IsNullOrEmpty(damageString)) // Have damage too
                    {
                        R20WSServer.Send(new CommandPacket
                        {
                            GMRoll   = false,
                            Template = Roll20.Template.AtkDmg,
                            Data     = new TemplateDataAtkSaveDmg
                            {
                                CharName = AppState.Current.State.General.Name,
                                Crit     = critString,
                                Dmg      = damageString,
                                Name     = s.Name,
                                R1       = string.Empty,
                                R2       = string.Empty,
                                Range    = s.Range,
                                SaveAttr = s.Integration.SaveAttr,
                                SaveDC   = saveText,
                                SaveDesc = string.Empty
                            }
                        });
                    }
                    else // Only have save
                    {
                        R20WSServer.Send(new CommandPacket
                        {
                            GMRoll   = false,
                            Template = Roll20.Template.AtkDmg,
                            Data     = new TemplateDataAtkSaveDmg
                            {
                                CharName = AppState.Current.State.General.Name,
                                Crit     = string.Empty,
                                Dmg      = string.Empty,
                                Name     = s.Name,
                                R1       = string.Empty,
                                R2       = string.Empty,
                                Range    = s.Range,
                                SaveAttr = s.Integration.SaveAttr,
                                SaveDC   = saveText,
                                SaveDesc = string.Empty
                            }
                        });
                    }
                }
            }
            else // Do not have a save
            {
                if (!string.IsNullOrEmpty(hitString)) // Have hit
                {
                    if (!string.IsNullOrEmpty(damageString)) // Have default hit + damage
                    {
                        R20WSServer.Send(new CommandPacket
                        {
                            GMRoll   = false,
                            Template = Roll20.Template.AtkDmg,
                            Data     = new TemplateDataAtkDmg
                            {
                                CharName = AppState.Current.State.General.Name,
                                Crit     = critString,
                                Dmg      = damageString,
                                Name     = s.Name,
                                R1       = hitString,
                                R2       = hitString,
                                Range    = s.Range
                            }
                        });
                    }
                    else // Only have hit?
                    {
                        R20WSServer.Send(new CommandPacket
                        {
                            GMRoll   = false,
                            Template = Roll20.Template.AtkDmg,
                            Data     = new TemplateDataAtkDmg
                            {
                                CharName = AppState.Current.State.General.Name,
                                Crit     = string.Empty,
                                Dmg      = string.Empty,
                                Name     = s.Name,
                                R1       = hitString,
                                R2       = hitString,
                                Range    = s.Range
                            }
                        });
                    }
                }
                else // Only have damage?
                {
                    R20WSServer.Send(new CommandPacket
                    {
                        GMRoll   = false,
                        Template = Roll20.Template.AtkDmg,
                        Data     = new TemplateDataAtkDmg
                        {
                            CharName = AppState.Current.State.General.Name,
                            Crit     = critString,
                            Dmg      = damageString,
                            Name     = s.Name,
                            R1       = string.Empty,
                            R2       = string.Empty,
                            Range    = s.Range
                        }
                    });
                }
            }
        }
Example #9
0
        public static void RunItemsRoll20Integration(InventoryItem ii)
        {
            SimpleItemIntegration sii = ii.Integration;

            if (sii != null)
            {
                // Determine integration type
                if (sii.HitDieSide <= 0)       // No hit die
                {
                    if (sii.Damage.Count == 0) // No damage, description
                    {
                        R20WSServer.Send(new CommandPacket
                        {
                            GMRoll   = false,
                            Template = Roll20.Template.Description,
                            Data     = new TemplateDataDesc
                            {
                                Desc = "** " + ii.Name + " **\n" + ii.Description
                            }
                        });
                    }
                    else // Have damage, but no hit die
                    {
                        string damageString = "[[";
                        for (int i = 0; i < sii.Damage.Count; i++)
                        {
                            DamageLine dl = sii.Damage[i];
                            if (dl.DieSide > 0 && dl.ConstantNumber != 0)
                            {
                                damageString += $"[[[[{dl.NumDice}d{dl.DieSide}]] + {dl.ConstantNumber}]][{dl.Label}]";
                            }
                            else
                            {
                                if (dl.DieSide > 0)
                                {
                                    damageString += $"[[{dl.NumDice}d{dl.DieSide}]][{dl.Label}]";
                                }
                                else
                                {
                                    damageString += $"{dl.ConstantNumber}[{dl.Label}]";
                                }
                            }

                            if (i != sii.Damage.Count - 1)
                            {
                                damageString += "+";
                            }
                        }

                        if (sii.DamageIncludeStr)
                        {
                            damageString += $"+{AppState.Current.State.General.StatModStr}[{MainWindow.Translate("General_Str")}]";
                        }

                        if (sii.DamageIncludeDex)
                        {
                            damageString += $"+{AppState.Current.State.General.StatModDex}[{MainWindow.Translate("General_Dex")}]";
                        }

                        if (sii.DamageIncludeCon)
                        {
                            damageString += $"+{AppState.Current.State.General.StatModCon}[{MainWindow.Translate("General_Con")}]";
                        }

                        if (sii.DamageIncludeWis)
                        {
                            damageString += $"+{AppState.Current.State.General.StatModWis}[{MainWindow.Translate("General_Wis")}]";
                        }

                        if (sii.DamageIncludeCha)
                        {
                            damageString += $"+{AppState.Current.State.General.StatModCha}[{MainWindow.Translate("General_Cha")}]";
                        }

                        if (sii.DamageIncludeInt)
                        {
                            damageString += $"+{AppState.Current.State.General.StatModInt}[{MainWindow.Translate("General_Int")}]";
                        }

                        damageString += "]]";
                        R20WSServer.Send(new CommandPacket
                        {
                            GMRoll   = false,
                            Template = Roll20.Template.Dmg,
                            Data     = new TemplateDataDmg
                            {
                                CharName = AppState.Current.State.General.Name,
                                Name     = ii.Name,
                                Dmg1     = damageString,
                                Dmg2     = damageString
                            }
                        });
                    }
                }
                else // Have hit die
                {
                    string hitString = $"[[[[1d{sii.HitDieSide}]][1d{sii.HitDieSide}]";
                    if (sii.HitConstant > 0)
                    {
                        hitString += $"+{sii.HitConstant}";
                    }

                    if (sii.HitIncludeProfficiency)
                    {
                        hitString += $"+{AppState.Current.State.General.ProfficiencyBonus}[{MainWindow.Translate("General_PBonus")}]";
                    }

                    if (sii.HitIncludeStr)
                    {
                        hitString += $"+{AppState.Current.State.General.StatModStr}[{MainWindow.Translate("General_Str")}]";
                    }

                    if (sii.HitIncludeDex)
                    {
                        hitString += $"+{AppState.Current.State.General.StatModDex}[{MainWindow.Translate("General_Dex")}]";
                    }

                    if (sii.HitIncludeCon)
                    {
                        hitString += $"+{AppState.Current.State.General.StatModCon}[{MainWindow.Translate("General_Con")}]";
                    }

                    if (sii.HitIncludeWis)
                    {
                        hitString += $"+{AppState.Current.State.General.StatModWis}[{MainWindow.Translate("General_Wis")}]";
                    }

                    if (sii.HitIncludeCha)
                    {
                        hitString += $"+{AppState.Current.State.General.StatModCha}[{MainWindow.Translate("General_Cha")}]";
                    }

                    if (sii.HitIncludeInt)
                    {
                        hitString += $"+{AppState.Current.State.General.StatModInt}[{MainWindow.Translate("General_Int")}]";
                    }

                    hitString += "]]";
                    if (sii.Damage.Count == 0) // Have no damage die
                    {
                        R20WSServer.Send(new CommandPacket
                        {
                            GMRoll   = false,
                            Template = Roll20.Template.Simple,
                            Data     = new TemplateDataSimple
                            {
                                CharName = AppState.Current.State.General.Name,
                                Name     = ii.Name,
                                R1       = hitString,
                                R2       = hitString
                            }
                        });
                    }
                    else // Have damage die
                    {
                        string damageString = "[[";
                        string critString   = "[[";
                        for (int i = 0; i < sii.Damage.Count; i++)
                        {
                            DamageLine dl = sii.Damage[i];
                            if (dl.DieSide > 0 && dl.ConstantNumber != 0)
                            {
                                damageString += $"[[[[{dl.NumDice}d{dl.DieSide}]][{dl.NumDice}d{dl.DieSide}] + {dl.ConstantNumber}]][{dl.Label}]";
                                critString   += $"[[{dl.NumDice}d{dl.DieSide}]][{dl.NumDice}d{dl.DieSide} {dl.Label}]";
                            }
                            else
                            {
                                if (dl.DieSide > 0)
                                {
                                    damageString += $"[[{dl.NumDice}d{dl.DieSide}]][{dl.NumDice}d{dl.DieSide} {dl.Label}]";
                                    critString   += $"[[{dl.NumDice}d{dl.DieSide}]][{dl.NumDice}d{dl.DieSide} {dl.Label}]";
                                }
                                else
                                {
                                    damageString += $"{dl.ConstantNumber}[{dl.Label}]";
                                }
                            }

                            if (i != sii.Damage.Count - 1)
                            {
                                damageString += "+";
                                critString   += "+";
                            }
                        }

                        while (critString[critString.Length - 1] == '+')
                        {
                            critString = critString.Substring(0, critString.Length - 1);
                        }

                        critString += "]]";
                        if (sii.DamageIncludeStr)
                        {
                            damageString += $"+{AppState.Current.State.General.StatModStr}[{MainWindow.Translate("General_Str")}]";
                        }

                        if (sii.DamageIncludeDex)
                        {
                            damageString += $"+{AppState.Current.State.General.StatModDex}[{MainWindow.Translate("General_Dex")}]";
                        }

                        if (sii.DamageIncludeCon)
                        {
                            damageString += $"+{AppState.Current.State.General.StatModCon}[{MainWindow.Translate("General_Con")}]";
                        }

                        if (sii.DamageIncludeWis)
                        {
                            damageString += $"+{AppState.Current.State.General.StatModWis}[{MainWindow.Translate("General_Wis")}]";
                        }

                        if (sii.DamageIncludeCha)
                        {
                            damageString += $"+{AppState.Current.State.General.StatModCha}[{MainWindow.Translate("General_Cha")}]";
                        }

                        if (sii.DamageIncludeInt)
                        {
                            damageString += $"+{AppState.Current.State.General.StatModInt}[{MainWindow.Translate("General_Int")}]";
                        }

                        damageString += "]]";
                        R20WSServer.Send(new CommandPacket
                        {
                            GMRoll   = false,
                            Template = Roll20.Template.AtkDmg,
                            Data     = new TemplateDataAtkDmg
                            {
                                CharName = AppState.Current.State.General.Name,
                                Crit     = critString,
                                Dmg      = damageString,
                                R1       = hitString,
                                R2       = hitString,
                                Name     = ii.Name
                            }
                        });
                    }
                }
            }
        }
Example #10
0
        private void RollDieStat(string statname, int stat)
        {
            string die = "1d20" + (stat < 0 ? "-" : "+") + Math.Abs(stat).ToString();

            R20WSServer.Roll(die, die, "Save/Skill Check", statname, this.CB_GMRoll.IsChecked ?? false);
        }
Example #11
0
 private void RollDieSimple(string die) => R20WSServer.Roll(die, die, "Simple Roll", null, this.CB_GMRoll.IsChecked ?? false);
Example #12
0
 private void Button_Click_1(object sender, RoutedEventArgs e)
 {
     this.Button_Click(sender, e);
     R20WSServer.CreateServer();
 }
Example #13
0
 private void Button_Click_34(object sender, RoutedEventArgs e) => R20WSServer.CloseServer();