public async Task DiceTimesTestAsync(int side, int sample) { string send_msg = "Result (" + sample + " sample[s])\n"; int sides = side; int sumples = sample; Dictionary <int, int> res = new Dictionary <int, int>(); for (int i = 1; i <= sides; i++) { res[i] = 0; } for (int i = 0; i < sumples; i++) { res[RandomManager.Rand(sides)]++; } for (int i = 1; i <= sides; i++) { send_msg += i + ": " + res[i] + "\n"; } await Context.Channel.SendMessageAsync(send_msg); }
private static string NRXRoll(ISocketMessageChannel channel, int value, int sides, int critical = 10, bool Negative = false) { critical = Math.Max(Math.Min(critical, sides), 2); string ret_str = ""; // 一回目 List <int> res = new List <int>(); for (int i = 0; i < value; i++) { res.Add(RandomManager.Rand(sides, false)); } int critical_value = res.Count(n => n >= critical); int ctimes = 0; int last_max = 0; res.Sort(); ret_str += value + "DX" + (critical != 10 ? ("@" + critical) : "") + " -> "; // 2回目以降 while (res.Count > 0) { if (critical_value > 0) { ctimes++; } ret_str += GenerateDiceRollString(res, res.Count, isCritical: true, critical: critical); last_max = res.Max(); res.Clear(); for (int i = 0; i < critical_value; i++) { res.Add(RandomManager.Rand(sides, false)); } critical_value = res.Count(n => n >= critical); res.Sort(); ret_str += " -> "; } int dice_res = ctimes * sides + last_max; ret_str += dice_res; RandomManager.DiceResultHistory.Add(dice_res); return(ret_str); }
public static async Task Create(SocketUserMessage msg) { StorePrmInfos(); string send_msg = msg.Author.Mention + "\nType : CoC\n"; foreach (var v in _prmInfo) { for (int i = 0; i < v.Value.Item1; i++) { RandomManager.Rand(6); } _prmResult[v.Key] = RandomManager.DiceResultHistory.Sum() + v.Value.Item2; send_msg += v.Key + " : " + _prmResult[v.Key] + " (["; for (int i = 0; i < v.Value.Item1; i++) { send_msg += RandomManager.DiceResultHistory[i]; if (i != v.Value.Item1 - 1) { send_msg += ", "; } else { send_msg += "]"; } } if (v.Value.Item2 != 0) { send_msg += " + " + v.Value.Item2; } send_msg += ")\n"; RandomManager.ClearHistory(); } send_msg += "\n"; send_msg += "HP : " + (_prmResult["CON"] + _prmResult["SIZ"]) / 2 + " ((CON + SIZ) / 2)\n"; send_msg += "MP : " + _prmResult["POW"] + " (POW)\n"; send_msg += "SAN : " + _prmResult["POW"] * 5 + " (POW * 5)\n"; send_msg += "ダメボ : " + CalcDamageBonus(_prmResult["STR"] + _prmResult["SIZ"]) + "\n"; send_msg += "アイデア : " + _prmResult["INT"] * 5 + " (INT * 5)\n"; send_msg += "知識 : " + _prmResult["EDU"] * 5 + " (EDU * 5)\n"; send_msg += "幸運 : " + _prmResult["POW"] * 5 + " (POW * 5)"; await msg.Channel.SendMessageAsync(send_msg); }
private static string NDXRoll(ISocketMessageChannel channel, int value, int sides, bool Negative = false) { // 戻り文字列初期化 string ret_str = ""; // 戻り文字列生成 List <int> res = new List <int>(); for (int i = 0; i < value; i++) { res.Add(RandomManager.Rand(sides, true, Negative)); } ret_str += value + "D" + sides + " -> "; ret_str += GenerateDiceRollString(res, res.Count); ret_str += " -> " + res.Sum(val => (Int64)val); return(ret_str); }
public static async Task Execute(SocketUserMessage msg) { string dice_area = msg.Content.Replace("&", "&"); if (dice_area[0] != '&') { return; } // 全角文字を半角文字に、スペースの除去 dice_area = ConvertAsciiAndNoSpace.Convert(dice_area); if (Regex.IsMatch(msg.ToString(), @"(?i)^&help$")) { await msg.Channel.SendMessageAsync( "実は本当のプレフィックスは `%` です。\n" + "コマンドは現在、`%help` `%version(ver)` `%git` `%calc` があります。" ); return; } ProcessTaarget["+"] = ProcessTaargetAdd; ProcessTaarget["-"] = ProcessTaargetSub; ProcessTaarget["*"] = ProcessTaargetMul; ProcessTaarget["/"] = ProcessTaargetDiv; string send_msg = msg.Author.Mention + '\n'; Match per_check = Regex.Match(dice_area, @"(?i)^&\s*(percent|per|p)"); Match tar = Regex.Match(dice_area, @"(?i)(?<=^&\s*(percent|per|p)\s*)(?<minus>\-*)(?<val>\d+)"); int finaly_tar = 0; if (per_check.Length != 0) { MatchCollection tar_fixs = Regex.Matches(dice_area, @"(?i)(?<=\d+\s*)(?<ope>(\+|\-|\*|/))(?<val>\d+)"); dice_area = "1d100 tar="; if (tar.Length != 0) { finaly_tar = int.Parse(tar.Groups["val"].Value); if (tar.Groups["minus"].Value == "-") { finaly_tar = -finaly_tar; } foreach (Match m in tar_fixs) { ProcessTaarget[m.Groups["ope"].Value](ref finaly_tar, int.Parse(m.Groups["val"].Value)); } dice_area += finaly_tar.ToString(); } } ISocketMessageChannel channel = msg.Channel; RandomManager.ClearHistory(); // キャラクリの位置 Match create_coc_match = Regex.Match(dice_area, @"(?i)coc"); if (create_coc_match.Success) { await CharacterCreateCoC.Create(msg); } MatchCollection dices = Regex.Matches(dice_area, @"(?i)(?<sign>(\+|\-|))(?<value>\d+)(?<type>(d|r))(?<sides>\d+)((\[|@)(?<critical>\d+)(\]|))?"); MatchCollection fixes = Regex.Matches(dice_area, @"(?i)(?<fix>(\+|\-)\d+)(?=(\+|\-|$))"); MatchCollection dxs = Regex.Matches(dice_area, @"(?i)(?<sign>(\+|\-|))(?<value>\d+)dx((\[|@)(?<critical>\d+)(\]|))?"); Match target_match = Regex.Match(dice_area, @"(?i)(target|tar|trg|tgt)=(?<minus>\-*)(?<target>\d+)"); if (target_match.Success) { int tar_val = int.Parse(target_match.Groups["minus"].Value + target_match.Groups["target"].Value); send_msg += "Target -> " + tar_val + "\n"; if (tar_val <= 0) { await CocJudgeImageOutput.AutoFailAsync(msg); return; } else if (tar_val >= 100) { await CocJudgeImageOutput.AutoSuccessAsync(msg); return; } } int d, r; d = r = 0; // 数値がおかしくないかの確認 foreach (Match m in dices) { if (Int64.Parse(m.Groups["value"].Value) > 10_000) { await channel.SendMessageAsync(msg.Author.Mention + "\nパソコンを破壊する気...?"); return; } if (Int64.Parse(m.Groups["sides"].Value) > 1_000_000_000) { await channel.SendMessageAsync(msg.Author.Mention + "\nんん...流石に面の数が多すぎるかな..."); return; } } foreach (Match m in dices) { string res = ""; if (m.Groups["type"].Value.ToLower() == "d") { res += NDXRoll(channel, int.Parse(m.Groups["value"].Value), int.Parse(m.Groups["sides"].Value), m.Groups["sign"].ToString() == "-"); d++; } else if (m.Groups["type"].Value.ToLower() == "r") { if (m.Groups["critical"].Value == "") { res += NRXRoll(channel, int.Parse(m.Groups["value"].Value), int.Parse(m.Groups["sides"].Value)); } else { res += NRXRoll(channel, int.Parse(m.Groups["value"].Value), int.Parse(m.Groups["sides"].Value), int.Parse(m.Groups["critical"].Value)); } r++; } if (res.EndsWith("failed")) { return; } else { send_msg += res + '\n'; } } foreach (Match m in dxs) { string res = ""; if (m.Groups["critical"].Value == "") { res += NRXRoll(channel, int.Parse(m.Groups["value"].Value), 10); } else { res += NRXRoll(channel, int.Parse(m.Groups["value"].Value), 10, int.Parse(m.Groups["critical"].Value)); } if (res.EndsWith("failed")) { return; } else { send_msg += res + '\n'; } r++; } if (d + r == 0) { return; } int fix_sum = 0; foreach (Match m in fixes) { fix_sum += int.Parse(m.Groups["fix"].Value); } send_msg += "\nResult: " + RandomManager.DiceResultHistory.Sum(val => (Int64)val); if (fixes.Count != 0) { send_msg += ' ' + fix_sum.ToString("+ #;- #") + " -> " + (RandomManager.DiceResultHistory.Sum() + fix_sum); } if (target_match.Success) { string target = target_match.Groups["target"].Value; //if (5 >= (RandomManager.DiceResultHistory.Sum() + fix_sum) && int.Parse(target) >= (RandomManager.DiceResultHistory.Sum() + fix_sum)) //{ // send_msg += " _**__Critical!!!__**_"; //} //else if(int.Parse(target) >= (RandomManager.DiceResultHistory.Sum() + fix_sum)) //{ // send_msg += " **Success**"; //} //else if(95 >= (RandomManager.DiceResultHistory.Sum() + fix_sum)) //{ // send_msg += " **Fail**"; //} //else //{ // send_msg += " _**__Famble...__**_"; //} await CocJudgeImageOutput.PutCocPDiceImageAsync(msg, RandomManager.DiceResultHistory.Sum() + fix_sum, int.Parse(target)); RandomManager.ClearHistory(); return; } if (send_msg.Length > 2000) { await TooLongStringAsync(msg, send_msg); return; } await msg.Channel.SendMessageAsync(send_msg); }