public void Test1(List <MTimeScale> timeScales, MBoard board) { // InMemoryDBを使うオプションを作成 var options = new DbContextOptionsBuilder <ApplicationDbContext>() .UseInMemoryDatabase(databaseName: "Test1") .Options; CandleMaker data = null; using (var dbContext = new ApplicationDbContext(options)) // InMemoryDBを使うオプション設定を渡す { // インスタンス作成 data = CandleMaker.MakeGeneration(Logger, dbContext, timeScales, board); } // 名前の確認 data.TimeScale.DisplayName.Is("1分"); // この時間足データの場合、一番親の子(2代目)が2つあること data.Children.Count.Is(2); // 約数があって一番大きい秒数の子が親から辿れること // 表示名が正しく設定されていること data.Children[0].Children[0].Children[0].Children[0].Children[0].Children[0].Children[0].Children[0].TimeScale.DisplayName.Is("1日"); }
public async Task <IActionResult> WritePost(MBoard input) { using (var db = new MySqlDapperHelper()) { db.BeginTransaction(); try { input.CONTENTS = new Ganss.XSS.HtmlSanitizer().Sanitize(input.CONTENTS); input.REG_UID = _login.U_ID; //USER의 고유 ID를 Claim에 저장하고 가져오는 방법???? input.REG_USERNAME = _login.USER_NAME; input.REG_IP = HttpContext.Connection.GetRemoteIpAddress(); await input.Insert(db); db.Commit(); } catch (Exception ex) { db.Rollback(); return(Json(new { msg = ex.Message })); } return(Json(new { msg = "OK" })); } }
/// <summary> /// 親または子を作成するコンストラクタ /// </summary> /// <param name="logger">ロガー</param> /// <param name="dbContext">DB接続</param> /// <param name="timeScales">時間足リスト、時間が短い順</param> /// <param name="board">板情報</param> CandleMaker(ILogger logger, ApplicationDbContext dbContext, MTimeScale timeScale, MBoard board) { logger.LogInformation($"CandleMaker親子作成:{board.Name} {timeScale.DisplayName}"); Logger = logger; Children = new List <CandleMaker>(); DbContext = dbContext; CandleList = new List <Candle>(); TimeScale = timeScale; Board = board; }
internal override void PlayExplodeAnimation(GridCell gCell, float delay, Action completeCallBack) { if (!gCell || explodePrefab == null) { completeCallBack?.Invoke(); } // Debug.Log(name + "play explode animation"); TweenSeq anim = new TweenSeq(); if (delay > 0) { anim.Add((callBack) => { SimpleTween.Value(gameObject, 0, 1, delay).AddCompleteCallBack(callBack); }); } anim.Add((callBack) => { SimpleTween.Value(gameObject, 1, 1.5f, 0.2f).SetOnUpdate((float val) => { transform.localScale = gCell.transform.lossyScale * val; }).AddCompleteCallBack(callBack); }); anim.Add((callBack) => // scale in, explode prefab { SimpleTween.Value(gameObject, 1.5f, 1.0f, 0.15f).SetOnUpdate((float val) => { transform.localScale = gCell.transform.lossyScale * val; }).AddCompleteCallBack(callBack); GameObject g = Instantiate(explodePrefab); g.transform.position = transform.position; g.transform.localScale = transform.localScale * 1.50f; }); anim.Add((callBack) => // explode wave { MBoard.ExplodeWave(0, transform.position, 5, null); callBack(); }); anim.Add((callBack) => // sound { MSound.PlayClip(0, explodeClip); callBack(); }); anim.Add((callBack) => // delay { delayAction(gameObject, 0, callBack); }); anim.Add((callBack) => { completeCallBack?.Invoke(); callBack(); }); anim.Start(); }
public void Pause_Click() { if (MGui) { MGui.ShowPause(() => { if (MBoard) { MBoard.Pause(); } }, null); } }
public async Task <IActionResult> List(int p) { if (p < 1) { p = 1; } ViewData["page"] = p; ViewData["total_count"] = await MBoard.GetCountAsync("GENERAL"); var model = await MBoard.GetListAsync("GENERAL", p); return(View(model)); }
private void ShowLevelData(bool rebuild) { GCSet.Clean(); LCSet.Clean(GOSet); Debug.Log("Show level data: " + BubblesPlayer.CurrentLevel); if (rebuild) { MBoard.CreateGameBoard(false); } LevelButtonsRefresh(); if (editModeText) { editModeText.text = "EDIT MODE" + '\n' + "Level " + (BubblesPlayer.CurrentLevel + 1); } }
/// <summary> /// Tickerを受信するWebSocketを追加する /// 受信時のイベントを登録する /// 後の処理はCandleMakerに任せる /// </summary> /// <param name="myWebSocket">Tickerを受信するWebSocket</param> /// <param name="board">MBoard</param> /// <param name="timeScales">時間足リスト、時間が短い順</param> public void AddWebSocket(MyWebSocket myWebSocket, MBoard board, List <MTimeScale> timeScales) { // ローソク作成クラスを作成する var candleMaker = CandleMaker.MakeGeneration(Logger, DbContext, timeScales, board); // 受信時のイベント設定 if (board.Name.StartsWith(SystemConstants.BoardPrefixBitflyer)) { // BFの場合 myWebSocket.GetMessage += (obj, e) => { var textEvent = e as TextEventArgs; var ticker = JsonConvert.DeserializeObject <LightningTicker>(textEvent.Text); // tickerをこのWSに対応したローソク作成クラスの一番親に送る candleMaker.Update(new Ticker(ticker)); }; } // リストに追加 CandleMakers.Add(board.Name, candleMaker); WebSockets.Add(board.Name, myWebSocket); }
public async Task <IActionResult> ContentsView(int seq, int p) //View()는 메소드로 쓸수 없음 route 로 처리 { ViewData["page"] = p; var model = await MBoard.GetAsync("GENERAL", seq); if (!(model.REG_UID == _login?.U_ID)) { //HttpContext.Connection.Id //동일 세션의 중복 ViewCount를 막기위해 쿠키를 써봄 var cookieId = "BOARD_GENERAL"; if (Request.Cookies.ContainsKey(cookieId) == false) { Response.Cookies.Append(cookieId, $"[{seq}]", new Microsoft.AspNetCore.Http.CookieOptions() { HttpOnly = true }); _ = model.AddViewCount(); } else { var list = JsonConvert.DeserializeObject <List <int> >(Request.Cookies[cookieId]); if (list.Any(x => x == seq) == false) { _ = model.AddViewCount(); list.Add(seq); Response.Cookies.Append(cookieId, JsonConvert.SerializeObject(list), new Microsoft.AspNetCore.Http.CookieOptions() { HttpOnly = true }); } } } return(View(model)); }
internal override void PlayExplodeAnimation(GridCell gCell, float delay, Action completeCallBack) { if (!gCell || explodePrefab == null || OData == null) { completeCallBack?.Invoke(); } Debug.Log(name + ": play explode animation"); TweenSeq anim = new TweenSeq(); pT = new ParallelTween(); anim.Add((callBack) => // delay { delayAction(gameObject, delay, callBack); }); anim.Add((callBack) => // scale out { SimpleTween.Value(gameObject, 1, 1.5f, 0.2f).SetOnUpdate((float val) => { transform.localScale = gCell.transform.lossyScale * val; }).AddCompleteCallBack(callBack); }); anim.Add((callBack) => // scale in explode prefab { SimpleTween.Value(gameObject, 1.5f, 1.0f, 0.15f).SetOnUpdate((float val) => { transform.localScale = gCell.transform.lossyScale * val; }).AddCompleteCallBack(callBack); GameObject g = Instantiate(explodePrefab); g.transform.position = transform.position; g.transform.localScale = transform.localScale * .50f; }); anim.Add((callBack) => // explode wave { MBoard.ExplodeWave(0, transform.position, 5, null); callBack(); }); anim.Add((callBack) => // sound { MSound.PlayClip(0, explodeClip); callBack(); }); eArea = GetArea(gCell); // trails ParallelTween pT1 = new ParallelTween(); float incDelay = 0f; foreach (var item in eArea.Cells) { incDelay += 0.0f; float t = incDelay; pT1.Add((cB) => { delayAction(item.gameObject, t, () => // delay tween { Vector2 relativePos = (item.transform.position - gCell.transform.position).normalized; Quaternion rotation = Quaternion.FromToRotation(new Vector2(-1, 0), relativePos); // Debug.Log("Dir: " +(item.transform.position - gCell.transform.position) + " : " + rotation.eulerAngles ); GameObject cb = Instantiate(OData.additAnimPrefab, transform.position, rotation); cb.transform.localScale = transform.lossyScale * 1.0f; SimpleTween.Move(cb, cb.transform.position, item.transform.position, 0.2f).AddCompleteCallBack(cB).SetEase(EaseAnim.EaseOutSine); }); }); } anim.Add((callBack) => { pT1.Start(callBack); }); anim.Add((callBack) => // create bombs { foreach (var item in eArea.Cells) { BombDir bd = BombDir.Radial; DynamicClickBombObject r = DynamicClickBombObject.Create(item, GOSet.GetDynamicClickBombObject(bd, 0), false, false, MBoard.TargetCollectEventHandler); r.transform.parent = null; r.SetToFront(true); pT.Add((cB) => { ExplodeBomb(r, item, 0.5f, cB); }); } callBack(); }); anim.Add((callBack) => // delay { delayAction(gameObject, 0, callBack); }); anim.Add((callBack) => { completeCallBack?.Invoke(); callBack(); }); anim.Start(); }
internal override void PlayExplodeAnimation(GridCell gCell, float delay, Action completeCallBack) { if (!gCell || explodePrefab == null) { completeCallBack?.Invoke(); } // Debug.Log(name + "play explode animation"); TweenSeq anim = new TweenSeq(); pT = new ParallelTween(); rockets = new List <DynamicClickBombObject>(); anim.Add((callBack) => // delay { delayAction(gameObject, delay, callBack); }); anim.Add((callBack) => { SimpleTween.Value(gameObject, 1, 1.5f, 0.2f).SetOnUpdate((float val) => { transform.localScale = gCell.transform.lossyScale * val; }).AddCompleteCallBack(callBack); }); anim.Add((callBack) => // scale in and explode prefab { SimpleTween.Value(gameObject, 1.5f, 1.0f, 0.15f).SetOnUpdate((float val) => { transform.localScale = gCell.transform.lossyScale * val; }).AddCompleteCallBack(callBack); GameObject g = Instantiate(explodePrefab); g.transform.position = transform.position; g.transform.localScale = transform.localScale * .50f; }); anim.Add((callBack) => // create rockets { DynamicClickBombObject r1 = DynamicClickBombObject.Create(gCell, GOSet.GetDynamicClickBombObject(BombDir.Horizontal, 0), false, false, MBoard.TargetCollectEventHandler); r1.transform.parent = null; r1.SetToFront(true); pT.Add((cB) => { ExplodeRocket(r1, gCell, 0, cB); }); rockets.Add(r1); DynamicClickBombObject r2 = DynamicClickBombObject.Create(gCell, GOSet.GetDynamicClickBombObject(BombDir.Vertical, 0), false, false, MBoard.TargetCollectEventHandler); r2.transform.parent = null; r2.SetToFront(true); pT.Add((cB) => { ExplodeRocket(r2, gCell, 0, cB); }); rockets.Add(r2); callBack(); }); anim.Add((callBack) => // explode wave { MBoard.ExplodeWave(0, transform.position, 5, null); callBack(); }); anim.Add((callBack) => { MSound.PlayClip(0, explodeClip); callBack(); }); anim.Add((callBack) => // delay { delayAction(gameObject, 0, callBack); }); anim.Add((callBack) => { completeCallBack?.Invoke(); callBack(); }); anim.Start(); }
/// <summary> /// 親子関係を付けてCandleMakerインスタンスを作成する /// 親に約数が無い秒数の時間足は捨てられる /// 外からはコンストラクタではなく、このメソッドで作成する /// </summary> /// <param name="logger">ロガー</param> /// <param name="dbContext">DB接続</param> /// <param name="timeScales">時間足リスト、時間が短い順</param> /// <param name="board">MBoard</param> /// <returns>親子関係付きCandleMakerインスタンス</returns> public static CandleMaker MakeGeneration(ILogger logger, ApplicationDbContext dbContext, List <MTimeScale> timeScales, MBoard board) { logger.LogInformation($"CandleMaker作成:{board.Name}"); // 元のリストに影響を与えないよう、コピーして使用する var execList = new List <MTimeScale>(timeScales); // 一番親の要素 CandleMaker result = null; // まだ親が見つかっていない子要素はここに保持する List <CandleMaker> children = new List <CandleMaker>(); // 要素が無くなるまで繰り返す while (execList.Count > 0) { // 最後から1つ取り出す var longest = execList.Last(); execList.Remove(longest); // インスタンス作成し、一旦親に設定する result = new CandleMaker(logger, dbContext, longest, board); // 取り出したものが親か確認する List <CandleMaker> delList = new List <CandleMaker>(); foreach (var item in children) { if (item.TimeScale.SecondsValue % result.TimeScale.SecondsValue == 0) { // 約数ならば親に設定、子ども候補から削除 logger.LogDebug($"親子関係設定:{result.TimeScale.DisplayName} <- {item.TimeScale.DisplayName}"); result.Children.Add(item); delList.Add(item); } } foreach (var item in delList) { children.Remove(item); } // 子ども候補にも入れる children.Add(result); } return(result); }
public void Map_Click() { MBoard.Pause(); CloseWindow(); SceneLoader.Instance.LoadScene(0); }
public override void ApplyToGrid(GridCell gCell, BoosterObjectData bData, Action completeCallBack) { if (!gCell.IsMatchable) { Booster.ActiveBooster.DeActivateBooster(); completeCallBack?.Invoke(); return; } Booster b = Booster.ActiveBooster; b.AddCount(-1); ParallelTween par0 = new ParallelTween(); TweenSeq bTS = new TweenSeq(); CellsGroup area = GetArea(gCell); //move activeBooster float dist = Vector3.Distance(transform.position, gCell.transform.position); bTS.Add((callBack) => { SetToFront(true); SimpleTween.Move(gameObject, transform.position, gCell.transform.position, dist / speed).AddCompleteCallBack(() => { ValuesTween(gameObject, new float[] { 1, 1.3f, 1 }, 0.3f, (val) => { transform.localScale = gCell.transform.lossyScale * val; }, callBack); MSound.PlayClip(0, bData.privateClip); }).SetEase(EaseAnim.EaseInSine); }); bTS.Add((callBack) => // explode wave { MBoard.ExplodeWave(0, transform.position, 5, null); callBack(); }); bTS.Add((callBack) => { GameObject g = Instantiate(explodePrefab); g.transform.position = transform.position; g.transform.localScale = transform.localScale * 1.0f; callBack(); }); bTS.Add((callBack) => { Destroy(b.SceneObject, 0.1f); callBack(); }); //apply effect for each cell parallel float delay = 0.0f; foreach (var c in area.Cells) { if (!c.IsDisabled && !c.Blocked) { float d = delay; float distance = Vector2.Distance(c.transform.position, gCell.transform.position); d = distance / 15f + delay; par0.Add((callBack) => { delayAction(gameObject, d, () => { Creator.InstantiateAnimPrefab(bData.animPrefab, c.transform, c.transform.position, SortingOrder.BoosterToFront + 2, true, null); callBack(); } ); }); } } delay = 0.15f; foreach (GridCell mc in area.Cells) //parallel explode all cells { float t = 0; float distance = Vector2.Distance(mc.transform.position, gCell.transform.position); t = distance / 15f; par0.Add((callBack) => { GridCell.ExplodeCell(mc, t, false, false, true, callBack); }); } bTS.Add((callback) => { par0.Start(() => { callback(); }); }); bTS.Add((callback) => { Booster.ActiveBooster.DeActivateBooster(); completeCallBack?.Invoke(); callback(); }); bTS.Start(); }
internal override void PlayExplodeAnimation(GridCell gCell, float delay, Action completeCallBack) { if (!gCell || OData == null) { completeCallBack?.Invoke(); } Row <GridCell> r = gCell.GRow; Column <GridCell> c = gCell.GColumn; // Debug.Log(gCell); TweenSeq anim = new TweenSeq(); GameObject g = null; anim.Add((callBack) => { delayAction(gameObject, delay, callBack); }); anim.Add((callBack) => // explode wave { MBoard.ExplodeWave(0, transform.position, 5, null); callBack(); }); anim.Add((callBack) => //sound { MSound.PlayClip(0, OData.privateClip); callBack(); }); if (OData.bombType == BombDir.Horizontal || OData.bombType == BombDir.Vertical) { anim.Add((callBack) => { g = Instantiate(OData.explodeAnimPrefab); g.transform.position = transform.position; g.transform.localScale = transform.localScale * 1.2f; callBack(); }); } else if (OData.bombType == BombDir.Radial) { anim.Add((callBack) => { g = Instantiate(OData.explodeAnimPrefab); g.transform.position = transform.position; g.transform.localScale = transform.localScale * 1.0f; callBack(); }); } else if (OData.bombType == BombDir.Color) { anim.Add((callBack) => // scale out { SetToFront(true); SimpleTween.Value(gameObject, 1, 1.5f, 0.15f).SetOnUpdate((float val) => { transform.localScale = gCell.transform.lossyScale * val; }).AddCompleteCallBack(callBack); }); anim.Add((callBack) => // scale in { SimpleTween.Value(gameObject, 1.5f, 1.0f, 0.15f).SetOnUpdate((float val) => { transform.localScale = gCell.transform.lossyScale * val; }).AddCompleteCallBack(callBack); g = Instantiate(OData.explodeAnimPrefab); g.transform.position = transform.position; g.transform.localScale = transform.localScale * 1.0f; }); CellsGroup eArea = GetArea(gCell); ParallelTween pT = new ParallelTween(); float incDelay = 0f; foreach (var item in eArea.Cells) { incDelay += 0.05f; float t = incDelay; pT.Add((cB) => { delayAction(item.gameObject, t, () => // delay tween { Vector2 relativePos = (item.transform.position - gCell.transform.position).normalized; Quaternion rotation = Quaternion.FromToRotation(new Vector2(-1, 0), relativePos); // Debug.Log("Dir: " +(item.transform.position - gCell.transform.position) + " : " + rotation.eulerAngles ); GameObject cb = Instantiate(OData.additAnimPrefab, transform.position, rotation); cb.transform.localScale = transform.lossyScale * 1.0f; SimpleTween.Move(cb, cb.transform.position, item.transform.position, 0.2f).AddCompleteCallBack(cB).SetEase(EaseAnim.EaseOutSine); }); }); } anim.Add((callBack) => { pT.Start(callBack); }); } anim.Add((callBack) => { // Debug.Log("anim complete"); TargetCollectEvent?.Invoke(GetID()); completeCallBack?.Invoke(); callBack(); }); anim.Start(); }
public void Exit_Click() { MBoard.Pause(); CloseWindow(); MGui.ShowQuit(); }
public override bool ActivateApply(Booster b) { MBoard.MixGrid(null); MSound.PlayClip(0.2f, b.bData.privateClip); return(true); }
public void Resume_Click() { MBoard.Pause(); CloseWindow(); }
/// <summary> /// DB確認して、データが無ければ初期データを入れる /// これは1か所でやらないとダメ /// 外部キーを含むデータを先に登録すると、そのキーの空データが登録されてしまうので /// 外部キーデータの登録が先になるように登録順を工夫する必要もあることに注意 /// </summary> /// <returns></returns> private async Task InitializeDatabaseAsync() { // DB確認して、データが無ければ初期データを入れる if (DbContext.MCurrencies.ToList().Count == 0) { Logger.LogInformation("通貨データがありません。初期値を登録します。"); var array = new List <string[]>(); var section = Configuration.GetSection("DefaultParameters"); section.Bind("MCurrency", array); foreach (var item in array) { var data = new MCurrency { MCurrencyId = int.Parse(item[0]), Name = item[1], DisplayName = item[2] }; DbContext.MCurrencies.Add(data); } await DbContext.SaveChangesAsync(SystemConstants.SystemName); } if (DbContext.MBoards.ToList().Count == 0) { Logger.LogInformation("板データがありません。初期値を登録します。"); var array = new List <string[]>(); var section = Configuration.GetSection("DefaultParameters"); section.Bind("MBoard", array); foreach (var item in array) { var data = new MBoard { MBoardId = int.Parse(item[0]), Name = item[1], DisplayName = item[2], MCurrency1 = new MCurrency { MCurrencyId = int.Parse(item[3]) }, MCurrency2 = new MCurrency { MCurrencyId = int.Parse(item[4]) } }; DbContext.MBoards.Add(data); } await DbContext.SaveChangesAsync(SystemConstants.SystemName); } if (DbContext.MTimeScales.ToList().Count == 0) { Logger.LogInformation("時間足データがありません。初期値を登録します。"); var array = new List <string[]>(); var section = Configuration.GetSection("DefaultParameters"); section.Bind("MTimeScale", array); foreach (var item in array) { var data = new MTimeScale { Id = int.Parse(item[0]), DisplayName = item[1], SecondsValue = int.Parse(item[2]) }; DbContext.MTimeScales.Add(data); } await DbContext.SaveChangesAsync(SystemConstants.SystemName); } if (DbContext.MWebSockets.ToList().Count == 0) { Logger.LogInformation("WebSocketデータがありません。初期値を登録します。"); var array = new List <string[]>(); var section = Configuration.GetSection("DefaultParameters"); section.Bind("MWebSocket", array); foreach (var item in array) { var data = new MWebSocket { Id = int.Parse(item[0]), MBoard = new MBoard { MBoardId = int.Parse(item[1]) }, Category = int.Parse(item[2]), EndPoint = item[3], ChannelName = item[4], IsEnabled = int.Parse(item[5]) == 1 }; DbContext.MWebSockets.Add(data); } DbContext.SaveChanges(SystemConstants.SystemName); } }