/// <summary> /// This would be used to check if a current state change will have to be cancelled. /// For example, suppose the character is attacking and the next state is attack. /// We just want him him to attack every 0.25seconds, we return true to cancel this change of states. /// </summary> /// <param name="playerState"></param> /// <returns></returns> private bool CheckIfAbortState(PlayerStateController.PlayerState newPlayerState) { //todo: doublecheck other states if they need to do something as well bool returner = false; /* switch (newPlayerState) * { * case PlayerStateController.PlayerState.idle: * * break; * case PlayerStateController.PlayerState.walk: * * break; * case PlayerStateController.PlayerState.run: * * break; * case PlayerStateController.PlayerState.crawling: * * break; * * case PlayerStateController.PlayerState.jump: * float nextAllowedJump = * PlayerStateController.stateDelayTimer[(int)PlayerStateController.PlayerState.jump]; * * if (nextAllowedJump < 0.1f || nextAllowedJump > Time.time) * returner = true; * else * returner = false; * break; * * case PlayerStateController.PlayerState.throwItem: * float nextAllowedThrowItem = * PlayerStateController.stateDelayTimer[(int)PlayerStateController.PlayerState.throwItem]; * if (nextAllowedThrowItem > Time.time) * returner = true; * else * returner = false; * break; * * }*/ return(returner); }
/// <summary> /// compare the current state against the new desired playerstate /// </summary> /// <param name="playerState"></param> /// <returns></returns> private bool CheckValidStatePairing(PlayerStateController.PlayerState newPlayerState) { bool returner = false; /* switch (currentState) * { * //any state can talk over from idle * case PlayerStateController.PlayerState.idle: * returner = true; * break; * //any state can take over from walking, crawling and running * case PlayerStateController.PlayerState.run: * returner = true; * break; * case PlayerStateController.PlayerState.walk: * returner = true; * break; * case PlayerStateController.PlayerState.crawling: * returner = true; * break; * * //only state that can take over from a jump is a landing or killing * * case PlayerStateController.PlayerState.jump: * if (newPlayerState == PlayerStateController.PlayerState.landing || * newPlayerState == PlayerStateController.PlayerState.throwItem || * newPlayerState == PlayerStateController.PlayerState.usePotion) * returner = true; * else * returner = false; * break; * //only state that can take over from a fall is a landing or killing * * case PlayerStateController.PlayerState.fall: * if (newPlayerState == PlayerStateController.PlayerState.landing || * newPlayerState == PlayerStateController.PlayerState.throwItem || * newPlayerState == PlayerStateController.PlayerState.usePotion) * returner = true; * else * returner = false; * break; * //only state that can take over from landing is movement or idleness * case PlayerStateController.PlayerState.landing: * if (newPlayerState == PlayerStateController.PlayerState.walk || * newPlayerState == PlayerStateController.PlayerState.run || * newPlayerState == PlayerStateController.PlayerState.crawling || * newPlayerState == PlayerStateController.PlayerState.idle) * returner = true; * else * returner = false; * break; * * //only state that can take over from resurecction is idle * case PlayerStateController.PlayerState.resurrect: * if (newPlayerState == PlayerStateController.PlayerState.idle) * returner = true; * else * returner = false; * break; * case PlayerStateController.PlayerState.throwItem: * returner = true; * break; * case PlayerStateController.PlayerState.usePotion: * returner = true; * break; * * * }*/ return(returner); }
/// <summary> /// OnStateChange is called whenever we make a change tot he player's state from /// anywhere in the game's code /// </summary> /// <param name="playerState"></param> private void OnStateChange(PlayerStateController.PlayerState newPlayerState) { //if the current state are the same, abort. No need to change the state we're in /* if (newPlayerState == currentState) * { * return; * } * * //check if any special conditions that would cause this new state to abort * if (CheckIfAbortState(newPlayerState)) * { * return; * }*/ /* * //check if the current is allowed to transition into this new state. if not, abort. * if (!CheckValidStatePairing(newPlayerState)) * { * return; * } * * //if we're here, then state change is allowed */ switch (newPlayerState) //for all cases, you must activate the text speech bubble { case PlayerStateController.PlayerState.chasing: TextBubbleGameObject.SetActive(true); switch (TargetAgent.tag) { case "RunToOrangeHome": textBubble.ApplyNewImage(ShowTextBubble.imagetype.goHome, ""); break; case "RunToBananaHome": textBubble.ApplyNewImage(ShowTextBubble.imagetype.goHome, ""); break; case "TeamOrangeFlagArea": textBubble.ApplyNewImage(ShowTextBubble.imagetype.goHome, ""); break; case "TeamBananaFlagArea": textBubble.ApplyNewImage(ShowTextBubble.imagetype.goHome, ""); break; case "TeamOrange": if (tag == "TeamOrange") { textBubble.ApplyNewImage(ShowTextBubble.imagetype.untag, ""); } else { textBubble.ApplyNewImage(ShowTextBubble.imagetype.stop, ""); } break; case "TeamBanana": if (tag == "TeamBanana") { textBubble.ApplyNewImage(ShowTextBubble.imagetype.untag, ""); } else { textBubble.ApplyNewImage(ShowTextBubble.imagetype.stop, ""); } break; case "Orange": textBubble.ApplyNewImage(ShowTextBubble.imagetype.chaseFlag, "orange"); break; case "Banana": textBubble.ApplyNewImage(ShowTextBubble.imagetype.chaseFlag, ""); break; } break; case PlayerStateController.PlayerState.idle: TextBubbleGameObject.SetActive(true); textBubble.ApplyNewImage(ShowTextBubble.imagetype.wandering, ""); break; case PlayerStateController.PlayerState.holdingFlag: TextBubbleGameObject.SetActive(true); textBubble.ApplyNewImage(ShowTextBubble.imagetype.goHome, ""); // textBubble.ApplyNewText("I'm holding the flag!"); break; case PlayerStateController.PlayerState.IsTaggedRunningHome: TextBubbleGameObject.SetActive(true); textBubble.ApplyNewImage(ShowTextBubble.imagetype.taggedRunningHome, ""); break; case PlayerStateController.PlayerState.IsTagged: TextBubbleGameObject.SetActive(true); textBubble.ApplyNewImage(ShowTextBubble.imagetype.tagged, ""); break; case PlayerStateController.PlayerState.untagger: TextBubbleGameObject.SetActive(true); textBubble.ApplyNewImage(ShowTextBubble.imagetype.untag, ""); break; } //store the current state as the previous state previousState = currentState; //store new state as the current state currentState = newPlayerState; }