コード例 #1
0
    public void StartBattle()
    {
        totalCombatants = PlayerCombatants.Count + EnemyCombatants.Count;

        turnState     = BattleTurnState.Attacking;
        battleEnabled = true;
        enableGuiControl();

        // ignore collision with other battlers
        Physics2D.IgnoreLayerCollision(10, 10, true);

        // let the enemies go first, if necessary

        if (!EnemiesGoFirst)
        {
            currentTurn = 0;
        }
        else
        {
            currentTurn = PlayerCombatants.Count;
        }

        // reset input delay counter
        elapsedTime = 0;

        //notify any listeners that the battle started
        if (OnBattleEvent != null)
        {
            OnBattleEvent(BattleEvent.Started);
        }
    }
コード例 #2
0
ファイル: BattleController.cs プロジェクト: metanymie/jga
	public void StartBattle() {
		totalCombatants = PlayerCombatants.Count + EnemyCombatants.Count;

		turnState = BattleTurnState.Attacking;
		battleEnabled = true;
		enableGuiControl();

		// ignore collision with other battlers
		Physics2D.IgnoreLayerCollision(10, 10, true); 

		// let the enemies go first, if necessary

		if(!EnemiesGoFirst) {
			currentTurn = 0;
		} else {
			currentTurn = PlayerCombatants.Count;
		}

		// reset input delay counter
		elapsedTime = 0;

		//notify any listeners that the battle started
		if(OnBattleEvent != null) {
			OnBattleEvent(BattleEvent.Started);
		}

	}
コード例 #3
0
    public override void OnGUI()
    {
        base.OnGUI();

        // if the battle has started...
        if (battleEnabled)
        {
            // enforce 16:9 aspect ratio
            GUILayout.BeginArea(AspectUtility.screenRect);

            // draw the player combatants' data
            drawPlayerInfo();

            if (isPlayerTurn())
            {
                PlayerCombatant currentPlayer = (PlayerCombatant)PlayerCombatants[currentTurn];

                switch (turnState)
                {
                case BattleTurnState.Attacking:
                    selectedAttack = getSelectedAttack();

                    if (selectedAttack != null)
                    {
                        currentButtonSelection = 0;
                        turnState = BattleTurnState.Targeting;
                    }

                    checkKeyControlFocus();

                    break;

                case BattleTurnState.Targeting:
                    selectedTarget = getSelectedTarget(selectedAttack);

                    if (selectedTarget != null)
                    {
                        currentButtonSelection = 0;
                        currentPlayer.Attack(selectedAttack, selectedTarget);
                        currentPlayer.IncrementTurnCounter();

                        turnState = BattleTurnState.WaitingForAnimation;
                    }

                    checkKeyControlFocus();

                    break;

                case BattleTurnState.WaitingForAnimation:

                    // has the player's animation finished?
                    if (!PlayerCombatants[currentTurn].AnimationInProgress)
                    {
                        turnState = BattleTurnState.TurnComplete;
                    }

                    break;
                }
            }
            else                 // otherwise it is an enemy's turn
            {
                EnemyCombatant currentEnemy =
                    (EnemyCombatant)EnemyCombatants[currentTurn - PlayerCombatants.Count];

                switch (turnState)
                {
                case BattleTurnState.Attacking:
                    if (!currentEnemy.isSleeping)
                    {
                        currentEnemy.AutoAttack(PlayerCombatants);
                    }

                    currentEnemy.IncrementTurnCounter();
                    turnState = BattleTurnState.WaitingForAnimation;

                    break;

                case BattleTurnState.WaitingForAnimation:
                    // if the enemy attack has finished...
                    if (Event.current.type == EventType.Repaint && !currentEnemy.AnimationInProgress)
                    {
                        turnState = BattleTurnState.TurnComplete;
                    }

                    break;
                }
            }

            if (turnState == BattleTurnState.TurnComplete)
            {
                // if the turn has completed, check if anyone won
                checkForVictory();

                // reset turn state
                turnState = BattleTurnState.Attacking;

                //...and then increment the turn.
                incrementTurn();

                // notify registered listeners of the turn change
                // note: this is not inside incrementTurn due to recursion
                if (OnBattleEvent != null)
                {
                    OnBattleEvent(BattleEvent.TurnChange);
                }
            }

            GUILayout.EndArea();
        }
    }
コード例 #4
0
    private BattleCombatant getSelectedTarget(PlayerAttack chosenAttack)
    {
        BattleCombatant chosenTarget       = null;
        bool            targetingCancelled = false;

        List <BattleCombatant> availableTargets;

        //used for the keyboard controls
        List <BattleCombatant> attackableTargets = new List <BattleCombatant>();

        if (chosenAttack.Type == AttackType.Heal)
        {
            // if it's a healing move, then target the current combatant
            // but also offer revivals to dead combatants
            availableTargets = new List <BattleCombatant>();
            availableTargets.Add((BattleCombatant)PlayerCombatants[currentTurn]);
            availableTargets.AddRange(PlayerCombatants.FindAll((BattleCombatant c) => c.HitPoints == 0));
        }
        else
        {
            // if it's an attack/status move, show the list of enemies
            availableTargets = EnemyCombatants.FindAll((BattleCombatant c) => c.participatingInBattle);
        }

        int areaHeight = scalePx(120 + 30 * availableTargets.Count);

        GUILayout.BeginArea(new Rect(0, 0, scalePx(330), areaHeight), guiSkin.customStyles [0]);
        GUILayout.Label("<b>" + chosenAttack.Name + "</b>");

        GUILayout.Label(chosenAttack.Description, guiSkin.customStyles[2]);

        GUILayout.Label("SELECT TARGET", guiSkin.customStyles [3]);
        BattleCombatant availableTarget;
        string          status;

        int currentButtonNum = 0;

        for (int i = 0; i < availableTargets.Count; i++)
        {
            availableTarget = availableTargets [i];
            status          = ((int)Mathf.Round(availableTarget.HitPoints / (float)availableTarget.MaxHitPoints * 100)) + "%";

            bool isTargetable = true;

            if (availableTarget.HitPoints == 0 ||
                availableTarget.isShielded ||
                (chosenAttack.Type == AttackType.Damage && availableTarget.immuneToDamage) ||
                (chosenAttack.Type == AttackType.Heal && availableTarget.HitPoints == availableTarget.MaxHitPoints))
            {
                isTargetable = false;

                if (availableTarget.isShielded)
                {
                    status = "Shielded";
                }
                else if (availableTarget.immuneToDamage)
                {
                    status = "Immune";
                }
                else if (availableTarget.HitPoints == 0 && chosenAttack.Type == AttackType.Heal)
                {
                    status       = "Revive";
                    isTargetable = true;
                }
            }

            if (availableTarget.isSleeping)
            {
                status += ", Sleeping";
            }

            if (isTargetable)
            {
                attackableTargets.Add(availableTarget);
            }

            // grey out the button if the target is already dead
            if (!isTargetable)
            {
                GUI.enabled = false;
            }
            else
            {
                GUI.SetNextControlName(currentButtonNum.ToString());
                currentButtonNum++;
            }



            if (GUILayout.Button("<b>" + availableTarget.getName() + "</b> (" + status + ")"))
            {
                chosenTarget = availableTarget;
            }

            // now highlight the selected target
            foreach (BattleCombatant t in availableTargets)
            {
                SpriteRenderer r = t.GetComponent <SpriteRenderer>();

                if (r != null)
                {
                    r.color = new Color(1, 1, 1, 0.5f);
                }
            }

            if (currentButtonSelection < attackableTargets.Count)
            {
                SpriteRenderer r = attackableTargets[currentButtonSelection].GetComponent <SpriteRenderer>();

                if (r != null)
                {
                    r.color = new Color(1, 1, 1, 1f);
                }
            }

            // if the target is dead, undo the greyout state we enabled above
            if (!isTargetable)
            {
                GUI.enabled = true;
            }
        }

        GUI.SetNextControlName(currentButtonNum.ToString());

        if (GUILayout.Button("Cancel", GUILayout.ExpandWidth(false)))
        {
            targetingCancelled = true;

            //set the turn state back to attacking, which will take effect on the next loop
            turnState = BattleTurnState.Attacking;
            currentButtonSelection = 0;
        }

        numberOfButtonsVisible = currentButtonNum + 1;

        GUILayout.EndArea();

        // unity doesn't count gamepad presses as "clicks", so we need to fake it:
        if (Event.current.keyCode == KeyCode.Space)
        {
            buttonKeyDown = true;
        }
        else if (input1IsDown && buttonKeyDown == false)
        {
            if (currentButtonSelection == attackableTargets.Count)
            {
                // if the cancel button is selected
                targetingCancelled = true;
                turnState          = BattleTurnState.Attacking;
            }
            else
            {
                chosenTarget = attackableTargets[currentButtonSelection];
            }

            buttonKeyDown          = true;
            currentButtonSelection = 0;
        }
        else
        {
            buttonKeyDown = false;
        }

        //now check for the escape key
        if (input2IsDown)
        {
            targetingCancelled     = true;
            turnState              = BattleTurnState.Attacking;
            currentButtonSelection = 0;
        }

        if (chosenTarget != null || targetingCancelled)
        {
            foreach (BattleCombatant t in availableTargets)
            {
                SpriteRenderer r = t.GetComponent <SpriteRenderer>();

                if (r != null)
                {
                    r.color = new Color(1, 1, 1, 1f);
                }
            }
        }

        return(chosenTarget);
    }
コード例 #5
0
ファイル: BattleController.cs プロジェクト: metanymie/jga
	public override void OnGUI () {
		base.OnGUI();

		// if the battle has started...
		if(battleEnabled) {


			// enforce 16:9 aspect ratio
			GUILayout.BeginArea(AspectUtility.screenRect);
			
			// draw the player combatants' data
			drawPlayerInfo();

			if(isPlayerTurn()) {
				PlayerCombatant currentPlayer = (PlayerCombatant)PlayerCombatants[currentTurn];

				switch(turnState) {
				case BattleTurnState.Attacking: 	
					selectedAttack = getSelectedAttack();

					if(selectedAttack != null) {
						currentButtonSelection = 0;
						turnState = BattleTurnState.Targeting;
					}

					checkKeyControlFocus();
					
					break;
				case BattleTurnState.Targeting:
					selectedTarget = getSelectedTarget(selectedAttack);

					if(selectedTarget != null) {
						currentButtonSelection = 0;
						currentPlayer.Attack (selectedAttack, selectedTarget);
						currentPlayer.IncrementTurnCounter();

						turnState = BattleTurnState.WaitingForAnimation;
					}

					checkKeyControlFocus();
					
					break;
				case BattleTurnState.WaitingForAnimation:

					// has the player's animation finished?
					if(!PlayerCombatants[currentTurn].AnimationInProgress) {
						turnState = BattleTurnState.TurnComplete;
					}

					break;
				}

			} else { // otherwise it is an enemy's turn
				EnemyCombatant currentEnemy =
					(EnemyCombatant)EnemyCombatants[currentTurn - PlayerCombatants.Count];

				switch(turnState) {
				case BattleTurnState.Attacking:
					if(!currentEnemy.isSleeping) {
						currentEnemy.AutoAttack(PlayerCombatants);
					}

					currentEnemy.IncrementTurnCounter();
					turnState = BattleTurnState.WaitingForAnimation;
					
					break;
				case BattleTurnState.WaitingForAnimation:
					// if the enemy attack has finished...
					if(Event.current.type == EventType.Repaint && !currentEnemy.AnimationInProgress) {
						turnState = BattleTurnState.TurnComplete;
					}
					
					break;
				}
			}

			if(turnState == BattleTurnState.TurnComplete) {

				// if the turn has completed, check if anyone won
				checkForVictory();

				// reset turn state
				turnState = BattleTurnState.Attacking;

				//...and then increment the turn.
				incrementTurn();

				// notify registered listeners of the turn change
				// note: this is not inside incrementTurn due to recursion
				if(OnBattleEvent != null) {
					OnBattleEvent(BattleEvent.TurnChange);
				}

			}

			GUILayout.EndArea();
		}
	}
コード例 #6
0
ファイル: BattleController.cs プロジェクト: metanymie/jga
	private BattleCombatant getSelectedTarget (PlayerAttack chosenAttack) {
		BattleCombatant chosenTarget = null;
		bool targetingCancelled = false;

		List<BattleCombatant> availableTargets;

		//used for the keyboard controls
		List<BattleCombatant> attackableTargets = new List<BattleCombatant>();
		
		if (chosenAttack.Type == AttackType.Heal) {
			// if it's a healing move, then target the current combatant
			// but also offer revivals to dead combatants
			availableTargets = new List<BattleCombatant>();
			availableTargets.Add((BattleCombatant)PlayerCombatants[currentTurn]);
			availableTargets.AddRange(PlayerCombatants.FindAll((BattleCombatant c) => c.HitPoints == 0));
			
		} else {
			// if it's an attack/status move, show the list of enemies
			availableTargets = EnemyCombatants.FindAll((BattleCombatant c) => c.participatingInBattle);
		}

		int areaHeight = scalePx (120 + 30 * availableTargets.Count);

		GUILayout.BeginArea (new Rect (0, 0, scalePx (330), areaHeight), guiSkin.customStyles [0]);
		GUILayout.Label ("<b>" + chosenAttack.Name + "</b>");

		GUILayout.Label (chosenAttack.Description, guiSkin.customStyles[2]);

		GUILayout.Label ("SELECT TARGET", guiSkin.customStyles [3]);
		BattleCombatant availableTarget;
		string status;

		int currentButtonNum = 0;

		for (int i = 0; i < availableTargets.Count; i++) {

			availableTarget = availableTargets [i];
			status = ((int)Mathf.Round (availableTarget.HitPoints / (float)availableTarget.MaxHitPoints * 100)) + "%";

			bool isTargetable = true;

			if(availableTarget.HitPoints == 0 ||
			   availableTarget.isShielded ||
			   (chosenAttack.Type == AttackType.Damage && availableTarget.immuneToDamage) ||
			   (chosenAttack.Type == AttackType.Heal && availableTarget.HitPoints == availableTarget.MaxHitPoints)) {
				isTargetable = false;

				if(availableTarget.isShielded) {
					status = "Shielded";
				} else if(availableTarget.immuneToDamage) {
					status = "Immune";
				} else if(availableTarget.HitPoints == 0 && chosenAttack.Type == AttackType.Heal) {
					status = "Revive";
					isTargetable = true;
				}
			}

			if(availableTarget.isSleeping) {
				status += ", Sleeping";
			}

			if(isTargetable) {
				attackableTargets.Add(availableTarget);
			}

			// grey out the button if the target is already dead
			if (!isTargetable) {
				GUI.enabled = false;
			} else {
				GUI.SetNextControlName (currentButtonNum.ToString());
				currentButtonNum++;
			}



			if (GUILayout.Button ("<b>" + availableTarget.getName() + "</b> (" + status + ")")) {

				chosenTarget = availableTarget;
			}

			// now highlight the selected target
			foreach(BattleCombatant t in availableTargets) {
				SpriteRenderer r = t.GetComponent<SpriteRenderer>();

				if(r != null) {
					r.color = new Color (1, 1, 1, 0.5f);
				}
			}

			if (currentButtonSelection < attackableTargets.Count) {
				SpriteRenderer r = attackableTargets[currentButtonSelection].GetComponent<SpriteRenderer>();

				if(r != null) {
					r.color = new Color (1, 1, 1, 1f);
				}
			}

			// if the target is dead, undo the greyout state we enabled above
			if (!isTargetable)
				GUI.enabled = true;
		}

		GUI.SetNextControlName (currentButtonNum.ToString());

		if (GUILayout.Button ("Cancel", GUILayout.ExpandWidth (false))) {
			targetingCancelled = true;
			
			//set the turn state back to attacking, which will take effect on the next loop
			turnState = BattleTurnState.Attacking;
			currentButtonSelection = 0;
		}

		numberOfButtonsVisible = currentButtonNum + 1;

		GUILayout.EndArea();

		// unity doesn't count gamepad presses as "clicks", so we need to fake it:
		if(Event.current.keyCode == KeyCode.Space) {
			buttonKeyDown = true;
		} else if(input1IsDown && buttonKeyDown == false ) {
			if(currentButtonSelection == attackableTargets.Count) {
				// if the cancel button is selected
				targetingCancelled = true;
				turnState = BattleTurnState.Attacking;
				
			} else {
				chosenTarget = attackableTargets[currentButtonSelection];
			}
			
			buttonKeyDown = true;
			currentButtonSelection = 0;
		} else {
			buttonKeyDown = false;
		}

		//now check for the escape key
		if(input2IsDown) {
			targetingCancelled = true;
			turnState = BattleTurnState.Attacking;
			currentButtonSelection = 0;
		}

		if(chosenTarget != null || targetingCancelled) {
			foreach(BattleCombatant t in availableTargets) {
				SpriteRenderer r = t.GetComponent<SpriteRenderer>();
				
				if(r != null) {
					r.color = new Color (1, 1, 1, 1f);
				}
			}
		}

		return chosenTarget;
	}