public new void Execute(CharacterObservable caller, CharacterObservable characterToAttack) { if (caller == null) throw new ArgumentException(); if (characterToAttack == null) throw new ArgumentException(); //On Later commit //if (!(caller is BaseEnemy) && !(characterToAttack is BaseEnemy)) // throw new Exception("Cannot attack team member"); //if (caller is Healer && characterToAttack is BaseEnemy) // throw new Exception("Cannot heal enemies"); //if (caller is BaseEnemy && characterToAttack is BaseEnemy // && !(caller is NormalHealer || caller is HardHealer)) // throw new Exception("No friendly-fire amongst AI"); if (caller.Equals(characterToAttack))//To be tested November 20th 2015 throw new Exception("Cannot harm self"); Target = characterToAttack; if (Target == null) return; //if (caller is NormalHealer || caller is HardHealer && Target is BaseEnemy) //{ // Target.Health.RestoreHealth((int)caller.BaseStats.Power); //} else { var attackStrenght = caller.Stats.GetAttackStrenght(caller, Target); Target.Health.TakeDamageFromCharacter(caller); } Target.Notify(); // Single cal of notify here will either restore health, reduce health or make so that the manager call Death animation and destroy game object IsExecuted = true; }
public void Undo(CharacterObservable caller, CharacterObservable personaeToInteracWith, GameManager gm) { PreviousAction = (ICharacterActionCommand)CommandStack.Pop(); if (PreviousAction is AttackCommand && LastCharacterAttacked != null) { var attackStrenght = caller.Stats.GetAttackStrenght(caller, LastCharacterAttacked); LastCharacterAttacked.Health.RaiseHealth(caller); ((AttackCommand)PreviousAction).IsExecuted = false; return; } if (PreviousAction is DefendCommand) { caller.Stats.DefenseBonusActivated = false; caller.Stats.ResetTemporaryBonus(); ((DefendCommand)PreviousAction).IsExecuted = false; return; } if (PreviousAction is MoveCommand) { //caller.CurrentCoordinates = caller.OldCoordinates; //((MoveCommand)PreviousAction).Execute(caller.CurrentCoordinates); //((MoveCommand)PreviousAction).IsExecuted = false; } PreviousAction.Execute(caller); }
public void Execute(CharacterObservable character, PlayerDirection newDirection) { Receiver.SetUserAction(GameActions.RotateAction); if (character.Direction == newDirection) return; character.Direction = newDirection; MakeCharacterRotate(character); }
//TODO: Move directly inside CommandSequence public void AddObservable(CharacterObservable obs) { if (obs != null) Observable = obs; else throw new ArgumentNullException(); }
//TODO: Update method's signature public void Undo(CharacterObservable caller, CharacterObservable active) { if (!Equals(caller, active)) throw new Exception("Cannot Undo on non-active character"); PreviousAction = (ICharacterActionCommand)CommandStack.Pop(); if (PreviousAction is AttackCommand && LastCharacterAttacked != null) { var attackStrenght = caller.Stats.GetAttackStrenght(caller, LastCharacterAttacked); LastCharacterAttacked.Health.RaiseHealth(caller); LastCharacterAttacked.healthWasRaised = true; LastCharacterAttacked.Notify(); LastCharacterAttacked.healthWasRaised = false; ((AttackCommand)PreviousAction).IsExecuted = false; return; } if (PreviousAction is DefendCommand) { caller.Stats.DefenseBonusActivated = false; caller.Stats.ResetTemporaryBonus(); ((DefendCommand)PreviousAction).IsExecuted = false; return; } //Implementation to come if (PreviousAction is MoveCommand) { //caller.CurrentCoordinates = caller.OldCoordinates; //((MoveCommand)PreviousAction).Execute(caller.CurrentCoordinates); //((MoveCommand)PreviousAction).IsExecuted = false; } if (PreviousAction is RotateCommand) { } }
private void AttackPlayer(CharacterObservable bs) { if (!CanSelfMove()) { return; } if (_selfAsEnemy.IsOfTypeWizard()) { _closestEnemyToAttackSequence.Add(() => WizardAttackPattern(bs)); } else { if (CanAttackWithoutMoving(bs)) { _closestEnemyToAttackSequence.Add(HarmTarget); } else { _closestEnemyToAttackSequence.Add(() => MoveTowardsCharacter(bs)); if (!_isFacingCharacter) { _closestEnemyToAttackSequence.Add(() => LookAtHuman(bs)); } if (CanPerformCloseRangeAttack()) { _closestEnemyToAttackSequence.Add(HarmTarget); } } } }
//IsOfType methods will have to be optimized to a single method in the future by simply passing a params of Type array //Presently, code works this way public static CharacterObservable ConvertAbstractToConcreteSniper(this CharacterObservable observable) { var go = observable.ObservableGameObject; if (!observable.IsOfTypeSniper()) { return(null); } if (observable is Archer) { var archer = go.AddComponent <Archer>(); archer.Health = observable.Health; archer.Stats = observable.Stats; archer.CharacterType = CharacterType.Archer; archer.CharacterRole = CharacterRole.Sniper; archer.Direction = observable.Direction; return(archer); } if (!(observable is NormalArcher)) { return(null); } { var archer = go.AddComponent <NormalArcher>(); archer.Health = observable.Health; archer.Stats = observable.Stats; archer.CharacterType = CharacterType.Archer; archer.CharacterRole = CharacterRole.Sniper; archer.Direction = observable.Direction; return(archer); } }
public void Undo(CharacterObservable caller, CharacterObservable personaeToInteracWith, GameManager gm) { PreviousAction = (ICharacterActionCommand)CommandStack.Pop(); if (PreviousAction is AttackCommand && LastCharacterAttacked != null) { var attackStrenght = caller.Stats.GetAttackStrenght(caller, LastCharacterAttacked); LastCharacterAttacked.Health.RaiseHealth(caller); ((AttackCommand)PreviousAction).IsExecuted = false; return; } if (PreviousAction is DefendCommand) { caller.Stats.DefenseBonusActivated = false; caller.Stats.ResetTemporaryBonus(); ((DefendCommand)PreviousAction).IsExecuted = false; return; } if (PreviousAction is MoveCommand) { //caller.CurrentCoordinates = caller.OldCoordinates; //((MoveCommand)PreviousAction).Execute(caller.CurrentCoordinates); //((MoveCommand)PreviousAction).IsExecuted = false; } PreviousAction.Execute(caller); }
public static void ClearCharacterFromMap(this GameMap gm, CharacterObservable obs) { var firstOrDefault = gm.CellGameMap.SelectMany(x => x).FirstOrDefault(x => x.Equals(obs.CurrentCoordinates)); if (firstOrDefault != null) firstOrDefault.UseByCharacter = false; }
public void RaiseHealth(CharacterObservable observable) { if (!IsDead) { CurrentHealth += (int)observable.Stats.MagicPower; CapHealth(); } }
public void TakeDamageFromCharacter(CharacterObservable observable) { CurrentHealth -= (int)observable.Stats.Power; if (CurrentHealth <= 0) { IsDead = true; } }
public void RaiseHealth(CharacterObservable observable) { if (!IsDead) { CurrentHealth += (int)observable.Stats.MagicPower; CapHealth(); } }
public static IEnumerable<Cell> GetAvailableMoveActions(this GameMap gm, CharacterObservable self) { var coor = self.CurrentCoordinates.gridPosition; return gm.CellGameMap.SelectMany( row => row.Where(cell => Math.Abs(cell.gridPosition.x - (coor.x + 0x1)) < double.Epsilon || Math.Abs(cell.gridPosition.x - (coor.x - 0x1)) < double.Epsilon || Math.Abs(cell.gridPosition.y - (coor.y + 0x1)) < double.Epsilon || Math.Abs(cell.gridPosition.y - (coor.y - 0x1)) < double.Epsilon)); }
public static void ClearCharacterFromMap(this GameMap gm, CharacterObservable obs) { var firstOrDefault = gm.CellGameMap.SelectMany(x => x).FirstOrDefault(x => x.Equals(obs.CurrentCoordinates)); if (firstOrDefault != null) { firstOrDefault.UseByCharacter = false; } }
public override void MoveTowardsCharacter(CharacterObservable character) { var enemyObservable = (EnemyBase)Observable; var start = enemyObservable.CurrentCoordinates; var end = character.CurrentCoordinates; var pathfinder = enemyObservable.PathFinder; pathfinder.FindPath(start, end, enemyObservable.Map.CellGameMap, false); enemyObservable.Animator.SetTrigger("Move"); //need to call move command }
public void Execute(CharacterObservable character, PlayerDirection newDirection) { Receiver.SetUserAction(GameActions.RotateAction); if (character.Direction == newDirection) { return; } character.Direction = newDirection; MakeCharacterRotate(character); }
public override void MoveTowardsCharacter(CharacterObservable character) { var enemyObservable = (EnemyBase)Observable; var start = enemyObservable.CurrentCoordinates; var end = character.CurrentCoordinates; var pathfinder = enemyObservable.PathFinder; pathfinder.FindPath(start, end, enemyObservable.Map.CellGameMap, false); enemyObservable.Animator.SetTrigger("Move"); //need to call move command }
public static IEnumerable <Cell> GetAvailableMoveActions(this GameMap gm, CharacterObservable self) { var coor = self.CurrentCoordinates.gridPosition; return (gm.CellGameMap.SelectMany( row => row.Where(cell => Math.Abs(cell.gridPosition.x - (coor.x + 0x1)) < double.Epsilon || Math.Abs(cell.gridPosition.x - (coor.x - 0x1)) < double.Epsilon || Math.Abs(cell.gridPosition.y - (coor.y + 0x1)) < double.Epsilon || Math.Abs(cell.gridPosition.y - (coor.y - 0x1)) < double.Epsilon))); }
public void AddObservable(CharacterObservable obs) { if (obs != null) { Observable = obs; } else { throw new ArgumentNullException(); } }
public new void Execute(CharacterObservable caller) { if (caller == null) throw new ArgumentException(); if (caller.Stats == null) throw new Exception(); if (caller.Stats.DefenseBonusActivated) return; Receiver.SetUserAction(GameActions.DefendAction); caller.Stats.Defense += caller.Stats.DetermineDefenseBonusForTurn(); caller.Stats.DefenseBonusActivated = true; IsExecuted = true; }
private void WizardAttackPattern(CharacterObservable obs) { if (!_isMoveNeeded) { return; } _closestEnemyToAttackSequence.Add(() => MoveTowardsCharacter(obs)); if (!IsInsideAttackRange(obs)) { return; } _closestEnemyToAttackSequence.Add(HarmTarget); }
private void HarmCharacter(CharacterObservable human) { var isSelfWizardType = Observable.IsOfTypeWizard(); var isDefenseBonusActivated = human.Stats.DefenseBonusActivated; Observable.Animator.SetTrigger(isSelfWizardType ? "Attack" : "Conjuring"); var attackPower = isSelfWizardType ? Observable.Stats.Power + Observable.Stats.MagicPower - CalculateDamageReduction(human) : Observable.Stats.Power - CalculateDamageReduction(human); if (CanDoExtraDamage()) attackPower *= GetIncreaseTemporaryStrength(attackPower); human.Health.TakeDamageFromCharacter((isDefenseBonusActivated ? (attackPower - human.Stats.TemporaryDefenseBonusValue) : attackPower)); human.Animator.SetTrigger(isDefenseBonusActivated ? "Hurt" : "Defense"); human.Notify(); }
public void UpdateObserver(CharacterObservable obs, float strength, bool wasAttacked) { if (wasAttacked) { obs.Health.TakeDamageFromCharacter(strength); //Make sure the Health UI was changed too ! if (obs.Health.IsDead) GameManager.instance.UpdateObserver(obs); } else { obs.Health.RaiseHealth((int)strength); } }
public void Execute(CharacterObservable caller, CharacterObservable interactWith, CommandManager cm, GameManager gm) { if (caller == null) throw new ArgumentException("Caller cannot be null"); if (cm.CommandStack == null) throw new NullReferenceException("Command stack cannot be null in order to perform an undo"); if (cm.CurrentCharater == null && gm.ActivePlayer == null) throw new ArgumentException("The command and game manager can't be null at the same time"); if (cm.CommandStack.Count == 0) throw new Exception("Active player did not select any actions that can be undone"); if (cm != null && gm != null && !cm.CurrentCharater.Equals(gm.ActivePlayer)) throw new Exception("Cannot Undo action of previous player"); cm.Undo(caller, gm.ActivePlayer); }
public void UpdateObserver(CharacterObservable obs, float strength, bool wasAttacked) { if (wasAttacked) { obs.Health.TakeDamageFromCharacter(strength); //Make sure the Health UI was changed too ! if (obs.Health.IsDead) { GameManager.instance.UpdateObserver(obs); } } else { obs.Health.RaiseHealth((int)strength); } }
public void UpdateCommandStack(ICharacterActionCommand cmd) { if (CurrentCharater == null) { throw new NullReferenceException(); } if (!cmd.IsExecuted) { throw new Exception("Cannot update stack if command was not executed!"); } CommandStack.Push(cmd); if (cmd is AttackCommand) { LastCharacterAttacked = ((AttackCommand)cmd).Target; } PreviousAction = cmd; }
private void HarmCharacter(CharacterObservable human) { var isSelfWizardType = Observable.IsOfTypeWizard(); var isDefenseBonusActivated = human.Stats.DefenseBonusActivated; Observable.Animator.SetTrigger(isSelfWizardType ? "Attack" : "Conjuring"); var attackPower = isSelfWizardType ? Observable.Stats.Power + Observable.Stats.MagicPower - CalculateDamageReduction(human) : Observable.Stats.Power - CalculateDamageReduction(human); if (CanDoExtraDamage()) { attackPower *= GetIncreaseTemporaryStrength(attackPower); } human.Health.TakeDamageFromCharacter((isDefenseBonusActivated ? (attackPower - human.Stats.TemporaryDefenseBonusValue) : attackPower)); human.Animator.SetTrigger(isDefenseBonusActivated ? "Hurt" : "Defense"); human.Notify(); }
private void MakeCharacterRotate(CharacterObservable obs) { var dir = obs.Direction; switch (dir) { case PlayerDirection.Down: break; case PlayerDirection.Up: break; case PlayerDirection.Left: break; case PlayerDirection.Right: break; } }
private void MakeCharacterRotate(CharacterObservable obs) { var dir = obs.Direction; switch (dir) { case PlayerDirection.Down: break; case PlayerDirection.Up: break; case PlayerDirection.Left: break; case PlayerDirection.Right: break; } }
public new void Execute(CharacterObservable caller) { if (caller == null) { throw new ArgumentException(); } if (caller.Stats == null) { throw new Exception(); } if (caller.Stats.DefenseBonusActivated) { return; } Receiver.SetUserAction(GameActions.DefendAction); caller.Stats.Defense += caller.Stats.DetermineDefenseBonusForTurn(); caller.Stats.DefenseBonusActivated = true; IsExecuted = true; }
public static bool IsInRange(this GameMap gm, CharacterObservable self, CharacterObservable target) { var mp = self.MovementPoints; var currentPos = self.CurrentCoordinates;//Pos in x, y var row = gm.CellGameMap.ElementAt((int)currentPos.gridPosition.x); var start = gm.CellGameMap.IndexOf(row) - mp; if (start <= 0) start = 0; for (; start < gm.CellGameMap.IndexOf(row) + mp; start++) { var counter = start; for (; counter < 2 * mp + start; counter++) { if (row.ElementAt(counter).gridPosition == target.CurrentCoordinates.gridPosition) return true; } } return false; }
public new void Execute(CharacterObservable caller, CharacterObservable characterToAttack) { if (caller == null) { throw new ArgumentException(); } if (characterToAttack == null) { throw new ArgumentException(); } //On Later commit //if (!(caller is BaseEnemy) && !(characterToAttack is BaseEnemy)) // throw new Exception("Cannot attack team member"); //if (caller is Healer && characterToAttack is BaseEnemy) // throw new Exception("Cannot heal enemies"); //if (caller is BaseEnemy && characterToAttack is BaseEnemy // && !(caller is NormalHealer || caller is HardHealer)) // throw new Exception("No friendly-fire amongst AI"); if (caller.Equals(characterToAttack))//To be tested November 20th 2015 { throw new Exception("Cannot harm self"); } Target = characterToAttack; if (Target == null) { return; } //if (caller is NormalHealer || caller is HardHealer && Target is BaseEnemy) //{ // Target.Health.RestoreHealth((int)caller.BaseStats.Power); //} else { var attackStrenght = caller.Stats.GetAttackStrenght(caller, Target); Target.Health.TakeDamageFromCharacter(caller); } Target.Notify(); // Single cal of notify here will either restore health, reduce health or make so that the manager call Death animation and destroy game object IsExecuted = true; }
//TODO: Update method's signature public void Undo(CharacterObservable caller, CharacterObservable active) { if (!Equals(caller, active)) { throw new Exception("Cannot Undo on non-active character"); } PreviousAction = (ICharacterActionCommand)CommandStack.Pop(); if (PreviousAction is AttackCommand && LastCharacterAttacked != null) { var attackStrenght = caller.Stats.GetAttackStrenght(caller, LastCharacterAttacked); LastCharacterAttacked.Health.RaiseHealth(caller); LastCharacterAttacked.healthWasRaised = true; LastCharacterAttacked.Notify(); LastCharacterAttacked.healthWasRaised = false; ((AttackCommand)PreviousAction).IsExecuted = false; return; } if (PreviousAction is DefendCommand) { caller.Stats.DefenseBonusActivated = false; caller.Stats.ResetTemporaryBonus(); ((DefendCommand)PreviousAction).IsExecuted = false; return; } //Implementation to come if (PreviousAction is MoveCommand) { //caller.CurrentCoordinates = caller.OldCoordinates; //((MoveCommand)PreviousAction).Execute(caller.CurrentCoordinates); //((MoveCommand)PreviousAction).IsExecuted = false; } if (PreviousAction is RotateCommand) { } }
public void Execute(CharacterObservable caller, CharacterObservable interactWith, CommandManager cm, GameManager gm) { if (caller == null) { throw new ArgumentException("Caller cannot be null"); } if (cm.CommandStack == null) { throw new NullReferenceException("Command stack cannot be null in order to perform an undo"); } if (cm.CurrentCharater == null && gm.ActivePlayer == null) { throw new ArgumentException("The command and game manager can't be null at the same time"); } if (cm.CommandStack.Count == 0) { throw new Exception("Active player did not select any actions that can be undone"); } if (cm != null && gm != null && !cm.CurrentCharater.Equals(gm.ActivePlayer)) { throw new Exception("Cannot Undo action of previous player"); } cm.Undo(caller, gm.ActivePlayer); }
public static bool IsInRange(this GameMap gm, CharacterObservable self, CharacterObservable target) { var mp = self.MovementPoints; var currentPos = self.CurrentCoordinates;//Pos in x, y var row = gm.CellGameMap.ElementAt((int)currentPos.gridPosition.x); var start = gm.CellGameMap.IndexOf(row) - mp; if (start <= 0) { start = 0; } for (; start < gm.CellGameMap.IndexOf(row) + mp; start++) { var counter = start; for (; counter < 2 * mp + start; counter++) { if (row.ElementAt(counter).gridPosition == target.CurrentCoordinates.gridPosition) { return(true); } } } return(false); }
public void UpdateObserver(CharacterObservable character) { character.Animator.SetTrigger("Death"); //wait 0.5-1s Destroy(character, 2f); }
public void GoToNextCharacter() { _indexOfCharacters = _indexOfCharacters + 1 < GameCharacters.Count ? _indexOfCharacters + 1 : 0; ActivePlayer = GameCharacters[_indexOfCharacters]; _commandManager.EmptyCommandStack(); }
// Use this for initialization public void Start() { loadMapFromXml(); _indexOfCharacters = 0; ActivePlayer = GameCharacters[_indexOfCharacters]; }
public override void MoveTowardsCharacter(CharacterObservable character) { throw new NotImplementedException(); }
public void GoToNextCharacter() { _indexOfCharacters = _indexOfCharacters + 1 < GameCharacters.Count ? _indexOfCharacters + 1 : 0; ActivePlayer = GameCharacters[_indexOfCharacters]; _commandManager.EmptyCommandStack(); }
public override void SelectTarget(CharacterObservable[] humans) { throw new NotImplementedException(); }
public static bool IsOfTypeWizard(this CharacterObservable obs) { return(obs.CharacterRole.Equals(CharacterRole.Wizard)); }
public static bool IsSubClassOfType(this CharacterObservable obs, Type parentType) { return(obs.GetType().IsInstanceOfType(parentType)); }
public virtual void Execute(CharacterObservable caller, int raiseDefense) { }
public virtual void Execute(CharacterObservable caller, CharacterObservable chracterToInteractWith) { }
public void RotateTowardsCharacter(CharacterObservable character) { throw new NotImplementedException(); }
// Use this for initialization public void Start() { loadMapFromXml(); _indexOfCharacters = 0; ActivePlayer = GameCharacters[_indexOfCharacters]; }
private int CalculateDamageReduction(CharacterObservable human) { return (int)(human.IsOfTypeWizard() ? human.Stats.Defense + human.Stats.MagicResist : human.Stats.Defense); }
public virtual void Execute(CharacterObservable caller) { }
public abstract void MoveTowardsCharacter(CharacterObservable character);
public static bool IsNull(this CharacterObservable obs) { return(obs == null); }
public bool IsFacingCharacter(CharacterObservable self, CharacterObservable target) { return Math.Abs(self.Direction - target.Direction) == 1; }
public static bool IsSubClassOfType(this CharacterObservable obs, params Type[] types) { return(types.Any(t => obs.GetType().IsInstanceOfType(t))); }
public static bool IsOfTypeWarrior(this CharacterObservable obs) { return(obs.CharacterRole.Equals(CharacterRole.Warrior)); }
public static bool IsOfTypeSniper(this CharacterObservable obs) { return(obs.CharacterRole.Equals(CharacterRole.Sniper)); }
public void UpdateObserver(CharacterObservable character) { character.Animator.SetTrigger("Death"); //wait 0.5-1s Destroy(character,2f); }
public static bool IsOfTypeThief(this CharacterObservable obs) { return(obs.CharacterRole.Equals(CharacterRole.Thief)); }
public void UpdateObserver(CharacterObservable character) { throw new NotImplementedException(); }
public void UpdateCommandStack(ICharacterActionCommand cmd) { if (CurrentCharater == null) throw new NullReferenceException(); if (!cmd.IsExecuted) throw new Exception("Cannot update stack if command was not executed!"); CommandStack.Push(cmd); if (cmd is AttackCommand) { LastCharacterAttacked = ((AttackCommand)cmd).Target; } PreviousAction = cmd; }
public void TakeDamageFromCharacter(CharacterObservable observable) { CurrentHealth -= (int)observable.Stats.Power; if (CurrentHealth <= 0) IsDead = true; }