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); }
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); }
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); }
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 }); } }
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); }
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 } }); } } }
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 } }); } } } }
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); }
private void RollDieSimple(string die) => R20WSServer.Roll(die, die, "Simple Roll", null, this.CB_GMRoll.IsChecked ?? false);
private void Button_Click_1(object sender, RoutedEventArgs e) { this.Button_Click(sender, e); R20WSServer.CreateServer(); }
private void Button_Click_34(object sender, RoutedEventArgs e) => R20WSServer.CloseServer();