public async Task <ActionResult <GameAction> > PostGameAction([FromBody] DiceRequest diceRequest) { Dice rolledDice = _diceService.GenerateDiceAction(diceRequest.Dice); var currentCharacter = _context .Characters .Include(character => character.Characteristics) .First(character => character.Id == diceRequest.CharacterId); var characteristic = currentCharacter.Characteristics[diceRequest.Characteristic]; var diceAction = new DiceAction() { Bonuses = "", CharacterId = diceRequest.CharacterId, Result = rolledDice.Result, RolledDice = rolledDice.Max, CharacteristicValue = characteristic, Characteristic = diceRequest.Characteristic, RoomId = diceRequest.RoomId }; _context.Actions.Add(diceAction); await _context.SaveChangesAsync(); return(CreatedAtAction("GetGameAction", new { id = diceAction.Id }, diceAction)); }
private void ResignButton_Click(object sender, RoutedEventArgs e) { if (Master) { GameHost.SetMasterAsync(User, Opponent); DiceAction.SetWaiter(); } if (Opponent == Player.autoPlayer.ToString()) { DiceAction.SetMaster(); } }
public void CallDice(Player __owner, Transform obj, Vector3 distance) { // 주사위 사용중이면 중단 if (action != DiceAction.Wait) { if (actionProgress != ActionProgress.Ready) { return; } } // 주사위 소유권자 지정 owner = __owner; //dice = owner.dice; Debug.LogWarning("주사위 :: 소유자 = " + owner.name); // 주사위 개수가 부족하면 중단 if (dice.count < 1) { Debug.Log("주사위 개수 부족 :: " + dice.count); // 액션 설정 action = DiceAction.Finish; actionProgress = ActionProgress.Working; //Debug.Break(); return; } // 굴림 시작 dice.isRolling = true; // 액션 설정 action = DiceAction.Wait; actionProgress = ActionProgress.Start; // 오브젝트 이동 Vector3 pos = new Vector3(obj.position.x, obj.position.y, obj.position.z); pos += distance; transform.position = pos; // 주사위 부착 //transform.parent = obj; // 오브젝트 활성 transform.GetComponent <MeshRenderer>().enabled = true; //gameObject.SetActive(true); }
public Backgammon(string user, string opponent, bool master) { User = user; Opponent = opponent; Master = master; IndexCollSelected = -5; ChatHost = ClientInstances.Instance.Chat.ChatHost; GameHost = ClientInstances.Instance.Chat.GameHost; rand = new Random(); DiceAction = new DiceAction(this); CheckerLogic = new СheckerLogic(this); Timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(10) }; UIInitialization uIInitialization = new UIInitialization(this); //Event Registration Timer.Tick += Timer_Tick; checkBoxLeftDice.Checked += CheckBoxLeftDice_Checked; checkBoxRightDice.Checked += CheckBoxRightDice_Checked; if (Master) { DiceAction.SetMaster(); } else { DiceAction.SetWaiter(); if (Opponent == Player.autoPlayer.ToString()) { rollButton.IsEnabled = true; rollButton.Content = "Start"; rollButton.Click -= RollButton_Click; rollButton.Click += StartButton_Click; resignButton.IsEnabled = false; topResighButton.IsEnabled = false; } } Closed += Backgammon_Closed; Show(); GameHost.GetGameTable(User, Opponent); }
/// <summary> /// 주사위의 눈을 가져오고 초기화 진행 /// </summary> /// <returns></returns> public int UseDice() { int result = 0; // 인풋 초기화 doForceClick = false; doForceClickUp = false; // 주사위 남았으면 추가 진행 if (dice.count > 1) { Debug.Log("주사위 굴림 :: 다시 시작"); // 다시 처음으로 초기화 action = DiceAction.Wait; actionProgress = ActionProgress.Start; // 시간 관련값 리셋 rotAccel = 0f; elapsedTime = 0f; } else { Debug.Log("주사위 굴림 :: 종료"); // 굴림 종료 dice.isRolling = false; dice.isRolled = true; // 결과값 백업 result = dice.value; // 초기화 시작 ResetDice(); // 시점 변경 cm.CamMoveTo(cm.controller.cam, CameraManager.CamAngle.Top); } return(result); }
/// <summary> /// 강제 초기화 수행 /// </summary> public void ResetDice() { // 주사위 소유권 초기화 owner = null; //dice = null; // 액션상태 초기화 action = DiceAction.Wait; actionProgress = ActionProgress.Ready; // AI 관련 초기화 if (owner != null) { owner.ai.mainGame.dice.Ready(); } doForceClick = false; doForceClickUp = false; // 시간 관련값 리셋 rotAccel = 0f; elapsedTime = 0f; // 중력 비활성화 transform.GetComponent <Rigidbody>().isKinematic = true; transform.GetComponent <Rigidbody>().useGravity = false; // 주사위 부착 해제 transform.parent = transform.root; // 안보이도록 땅속에 숨김 transform.position = new Vector3(0, -10, 0); // 오브젝트 비활성 transform.GetComponent <MeshRenderer>().enabled = false; //gameObject.SetActive(false); }
void ActUpdate() { if (action == DiceAction.Wait) { if (actionProgress == ActionProgress.Ready) { // 스킵 //actionProgress = ActionProgress.Start; } else if (actionProgress == ActionProgress.Start) { isTimeCountWork = true; // AI 관련 초기화 if (owner != null) { owner.ai.mainGame.dice.Ready(); } doForceClick = false; doForceClickUp = false; // 스킵 actionProgress = ActionProgress.Working; } else if (actionProgress == ActionProgress.Working) { // 시점 변경 cm.CamMoveTo(owner.avatar.transform, CameraManager.CamAngle.Middle); // 스킵 actionProgress = ActionProgress.Finish; } else if (actionProgress == ActionProgress.Finish) { // 스킵 actionProgress = ActionProgress.Ready; action = DiceAction.Hovering; } return; } else if (action == DiceAction.Hovering) { if (actionProgress == ActionProgress.Ready) { // 회전 가속 초기화 rotAccel = 1.0f; // 주사위 페이드 인 구현 예정 =============== // 스킵 actionProgress = ActionProgress.Start; } else if (actionProgress == ActionProgress.Start) { // 스킵 actionProgress = ActionProgress.Working; return; } else if (actionProgress == ActionProgress.Working) { // 오토 플레이 if (owner.isAutoPlay) { // AI 초도 작동 if (!owner.ai.mainGame.dice.isStart) { //AI 활성화 owner.ai.mainGame.dice.Work(); } } // 강제 클릭처리된 경우 if (doForceClick || doForceClickUp) { // 꾹 눌렀을때 if (doForceClick) { // 가속도 if (rotAccel < rotAccelMax) { rotAccel += 0.1f + Time.deltaTime * 5.0f + rotAccel * Time.deltaTime * 0.5f; } else if (rotAccel > rotAccelMax) { rotAccel = rotAccelMax; } } // 클릭 종료될 때 else if (doForceClickUp) { //Debug.Break(); actionProgress = ActionProgress.Finish; } } // 턴 제어자일 경우 else if (Player.me == Turn.now) { // 입력 가능 상태일 경우 if (!isInputBlock) { // UI 클릭 아닐 경우 if (UnityEngine.EventSystems.EventSystem.current.currentSelectedGameObject == null) { // 꾹 눌렀을때 if (Input.GetMouseButton(0)) { // 가속도 if (rotAccel < rotAccelMax) { rotAccel += 0.1f + Time.deltaTime * 5.0f + rotAccel * Time.deltaTime * 0.5f; } else if (rotAccel > rotAccelMax) { rotAccel = rotAccelMax; } } // 클릭 종료될 때 else if (Input.GetMouseButtonUp(0)) { //Debug.Break(); actionProgress = ActionProgress.Finish; } } } } // 최소, 최대 높이 보정 Tool.HeightLimit(transform, minHeight, maxHeight); // 스핀 Tool.Spin(transform, rotSpeed); // 사용 중단 if (false) { // 시간 제한 if (elapsedTime > 15.0f) { actionProgress = ActionProgress.Finish; Debug.Log("호버링 타임 오버"); } // 시간 카운트 if (isTimeCountWork) { elapsedTime += Time.deltaTime; } } } else if (actionProgress == ActionProgress.Finish) { // 시간 초기화 elapsedTime = 0f; // 스킵 actionProgress = ActionProgress.Ready; action = DiceAction.Rising; } return; } else if (action == DiceAction.Rising) { // 스핀 Tool.Spin(transform, rotSpeed); // 회전 가속도 - 한계치까지 if (rotAccel < rotAccelMax) { rotAccel += 1f + Time.deltaTime * 5.0f + rotAccel * Time.deltaTime * 0.5f; } else if (rotAccel > rotAccelMax) { rotAccel = rotAccelMax; } if (actionProgress == ActionProgress.Ready) { // 중력 활성화 transform.GetComponent <Rigidbody>().useGravity = true; // 스킵 actionProgress = ActionProgress.Start; } else if (actionProgress == ActionProgress.Start) { // 시점 변경 cm.CamMoveTo(owner.avatar.transform, CameraManager.CamAngle.Top); // 상승 처리 transform.GetComponent <Rigidbody>().isKinematic = false; transform.GetComponent <Rigidbody>().AddForce(Vector3.up * 50f * transform.GetComponent <Rigidbody>().mass, ForceMode.Impulse); // 좌표 저장 //_posSpeed = transform.position.y; // 스킵 actionProgress = ActionProgress.Working; } else if (actionProgress == ActionProgress.Working) { // 상승 인식 if (transform.GetComponent <Rigidbody>().velocity.y > 0) { // 상승 마감 actionProgress = ActionProgress.Finish; } } else if (actionProgress == ActionProgress.Finish) { // 스킵 actionProgress = ActionProgress.Ready; action = DiceAction.Spinning; } return; } else if (action == DiceAction.Spinning) { // 스핀 Tool.Spin(transform, rotSpeed); // 회전 가속도 - 한계치까지 if (rotAccel < rotAccelMax) { rotAccel += 1f + Time.deltaTime * 5.0f + rotAccel * Time.deltaTime * 0.5f; } else if (rotAccel > rotAccelMax) { rotAccel = rotAccelMax; } if (actionProgress == ActionProgress.Ready) { // 스킵 actionProgress = ActionProgress.Start; } else if (actionProgress == ActionProgress.Start) { // 주사위 값 설정 dice.Rolling(); Debug.Log("주사위 값 :: " + dice.value); // 스킵 actionProgress = ActionProgress.Working; } else if (actionProgress == ActionProgress.Working) { // 가속 중지하고 다음으로 if (rotAccel == rotAccelMax) { actionProgress = ActionProgress.Finish; } } else if (actionProgress == ActionProgress.Finish) { // 스킵 actionProgress = ActionProgress.Ready; action = DiceAction.Landing; } return; } else if (action == DiceAction.Landing) { if (actionProgress == ActionProgress.Ready) { // 스킵 actionProgress = ActionProgress.Start; } else if (actionProgress == ActionProgress.Start) { // 스킵 actionProgress = ActionProgress.Working; } else if (actionProgress == ActionProgress.Working) { // 스핀 Tool.Spin(transform, rotSpeed); // 회전 감속 if (rotAccel > 0.0f) { rotAccel -= Time.deltaTime * 5.0f - rotAccel * Time.deltaTime * 0.5f; } else if (rotAccel < 0.0f) { rotAccel = 0.0f; } // 하강 인식 if (transform.GetComponent <Rigidbody>().velocity.y < 0) { if (transform.position.y <= minHeight) { // 중력 비활성화 transform.GetComponent <Rigidbody>().isKinematic = true; transform.GetComponent <Rigidbody>().useGravity = false; // 최소, 최대 높이 보정 Tool.HeightLimit(transform, minHeight, maxHeight); // 하강 마감 actionProgress = ActionProgress.Finish; } } } else if (actionProgress == ActionProgress.Finish) { // 스킵 actionProgress = ActionProgress.Ready; action = DiceAction.Finish; } return; } else if (action == DiceAction.Finish) { if (actionProgress == ActionProgress.Ready) { // 시간 카운터 리셋 elapsedTime = 0f; // 스킵 actionProgress = ActionProgress.Start; } else if (actionProgress == ActionProgress.Start) { // 눈에 따른 각도 지정 Quaternion lastRot; if (dice.value == 1) { lastRot = eye1; } else if (dice.value == 2) { lastRot = eye2; } else if (dice.value == 3) { lastRot = eye3; } else if (dice.value == 4) { lastRot = eye4; } else if (dice.value == 5) { lastRot = eye5; } else //(dice.value == 6) { lastRot = eye6; } // 최종 회전 처리 if ( Mathf.Abs(transform.rotation.x) != Mathf.Abs(lastRot.x) && Mathf.Abs(transform.rotation.y) != Mathf.Abs(lastRot.y) && Mathf.Abs(transform.rotation.z) != Mathf.Abs(lastRot.z) && Mathf.Abs(transform.rotation.w) != Mathf.Abs(lastRot.w) ) { // 회전량 계산 (선형 보간) transform.rotation = Quaternion.Lerp(transform.rotation, lastRot, Time.deltaTime * Mathf.Abs(_rotSpeed - rotAccel)); } // 최동 회전 완료시 스킵 else { // 보정 transform.rotation = lastRot; actionProgress = ActionProgress.Working; } } else if (actionProgress == ActionProgress.Working) { if (dice.value == 1) { Tool.SpinZ(transform, _rotSpeed); } else if (dice.value == 2) { Tool.SpinY(transform, _rotSpeed); } else if (dice.value == 3) { Tool.SpinY(transform, _rotSpeed); } else if (dice.value == 4) { Tool.SpinY(transform, _rotSpeed); } else if (dice.value == 5) { Tool.SpinY(transform, _rotSpeed); } else // (dice.value == 6) { Tool.SpinZ(transform, _rotSpeed); } // 시간 경과 시 넘김 if (elapsedTime > 3.0f) { elapsedTime = 0f; actionProgress = ActionProgress.Finish; } // 시간 카운트 elapsedTime += Time.deltaTime; } else if (actionProgress == ActionProgress.Finish) { } return; } }