private static void BerzerkMovement(Turn gameLogTurn, int distance, Combatant active, int speedNotFiring, int speedFiring, int direction, int enemyPos, int oldPos) { if (distance > 0) { // run to enemy! gameLogTurn.Movement.Add(new Phase { Actor = active.Template, Message = active.Name + " runs towards the enemy in blind fury!", Relevance = Relevance.Medium, Icon = moveIcon}); var movement = speedNotFiring*direction; int newPos = active.Position + (movement <= distance ? movement : distance); if (newPos == enemyPos) { gameLogTurn.Movement.Add(new Phase { Actor = active.Template, Message = active.Name + " enters close combat!", Relevance = Relevance.High, Icon = chargeIcon }); active.Melee = true; } if (speedFiring <= Math.Abs(oldPos - newPos)) active.CanFire = true; else active.CanFire = false; active.Position = newPos; } else { gameLogTurn.Movement.Add(new Phase { Actor = active.Template, Message = active.Name + " hurls himself into the melee!", Relevance = Relevance.Medium, Icon = chargeIcon }); active.CanFire = true; } }
public static AttributeTableModel Map(Combatant combatant, bool mindsetable = false) { var table = new AttributeTableModel(); table.TableColumns = AddCombatantColumns(combatant is Leader, mindsetable); table.TableRows.Add(AddCombatantRow(combatant, mindsetable)); return table; }
private string RecruitCombatant(Identity identity, Combatant combatant) { using (var transaction = NhSession.BeginTransaction()) { identity.Gang.AddCombatant(combatant); NhSession.Save(combatant); NhSession.Save(identity.Gang); transaction.Commit(); } return "A " + combatant.CombatantType.ToString().ToLower() + " has been recruited for your gang"; }
private static TableRow AddCombatantRow(Combatant combatant, bool mindset) { var tabletype = TableTypeEnum.Combatant; var values = new List<string>() { combatant.Template.CombatantType.ToString(), combatant.Name, combatant.Hp.ToString(), combatant.Template.StartingPower.ToString(), combatant.Template.Speed.ToString(), combatant.Weapon.Name }; if (mindset) { values.Add(combatant.Mindset.ToString()); } else if (combatant is Leader) { var ldr = combatant as Leader; tabletype = TableTypeEnum.Leader; values.AddRange(new List<String> { ldr.Agi.ToString(), ldr.Str.ToString(), ldr.End.ToString(), ldr.LeaderExp.ToString() }); } return new TableRow() { TableValues = values, Id = combatant.Id, Cost = combatant.Template.Cost, TableType = tabletype}; }
private static void NoMovement(Turn gameLogTurn, int distance, Combatant active) { if (distance == 0) { gameLogTurn.Movement.Add(new Phase { Actor = active.Template, Message = active.Name + " gets ready to duke it out in close combat.", Icon = chargeIcon, Relevance = Relevance.Medium }); } else { gameLogTurn.Movement.Add(new Phase { Actor = active.Template, Message = active.Name + " has the enemy in his sights, and prepares to fire.", Icon = aimIcon, Relevance = Relevance.Medium }); } active.CanFire = true; }
private int retreat(int distance, int enemyPos, int direction, int speedFiring, int speedNotFiring, Combatant fighter, Turn gameLogTurn) { int newPos = 0; if (distance * direction < fighter.Weapon.MinRange) { //Run back; we are within minrange if (distance * direction >= fighter.Weapon.MinRange - speedFiring) { gameLogTurn.Movement.Add(new Phase { Actor = fighter.Template, Message = fighter.Name + " backs up in order to bring his weapon to bear.", Icon = moveIcon, Relevance = Relevance.Medium }); newPos = fighter.Position - speedFiring * direction; fighter.CanFire = true; } else { gameLogTurn.Movement.Add(new Phase { Actor = fighter.Template, Message = fighter.Name + " retreats quickly to get back in optimal weapon range.", Icon = moveIcon, Relevance = Relevance.Medium }); newPos = fighter.Position - speedFiring * direction; if ((int)fighter.Weapon.Speed > 2) fighter.CanFire = true; else fighter.CanFire = false; } } else if (distance * direction < fighter.Weapon.MaxRange) { //Take a single step back; we are not at to maxrange newPos = speedFiring > 0 ? fighter.Position - direction : fighter.Position; gameLogTurn.Movement.Add(new Phase { Actor = fighter.Template, Message = fighter.Name + " takes a step back to aim his " + fighter.Weapon.Name, Icon = aimIcon, Relevance = Relevance.Medium }); fighter.CanFire = true; } if (distance == 0) { gameLogTurn.Movement.Add(new Phase { Actor = fighter.Template, Message = fighter.Name + " cannot escape the swirling melee!", Relevance = Relevance.High }); newPos = fighter.Position; } return newPos; }
private void NormalMovement(Turn gameLogTurn, int distance, int direction, Combatant active, int enemyPos, int speedFiring, int speedNotFiring) { if (distance*direction > ((active.Weapon.MinRange + active.Weapon.MaxRange)/2)) { // run thoughtfully to enemy! int newPos = move(distance, enemyPos, direction, speedFiring, speedNotFiring, active, gameLogTurn); active.Position = newPos; } else { if (distance*direction < ((active.Weapon.MinRange + active.Weapon.MaxRange)/2)) { active.Position = retreat(distance, enemyPos, direction, speedFiring, speedNotFiring, active, gameLogTurn); } else { NoMovement(gameLogTurn, distance, active); } } }
private int move(int distance, int enemyPos, int direction, int speedFiring, int speedNotFiring, Combatant fighter, Turn gameLogTurn) { var isZombie = (int)fighter.Template.CombatantType > 10 && (int)fighter.Template.CombatantType < 15; var moveIconSpec = isZombie ? zombie2Icon : moveIcon; int newPos = 0; if (distance * direction <= fighter.Weapon.MaxRange + speedFiring) { if ((int)fighter.Weapon.Speed < 2) { if (distance * direction <= fighter.Position + fighter.Weapon.MaxRange) { gameLogTurn.Movement.Add(new Phase { Actor = fighter.Template, Message = fighter.Name + " aims his " + fighter.Weapon.Name + " and prepares for the kickback.", Icon = aimIcon, Relevance = Relevance.Medium }); fighter.CanFire = true; } else { gameLogTurn.Movement.Add(new Phase { Actor = fighter.Template, Message = fighter.Name + " shoulders his " + fighter.Weapon.Name + " and moves to get in range.", Icon = moveIconSpec, Relevance = Relevance.Medium }); newPos = fighter.Position + runDistance(distance, speedNotFiring, direction, fighter.Weapon.MinRange); fighter.CanFire = false; } } else { gameLogTurn.Movement.Add(new Phase { Actor = fighter.Template, Message = fighter.Name + " runs towards the enemy and brings up his weapon.", Icon = moveIconSpec, Relevance = Relevance.Medium }); newPos = fighter.Position + runDistance(distance, speedFiring, direction, fighter.Weapon.MinRange); fighter.CanFire = true; } } else { newPos = fighter.Position + speedNotFiring * direction; gameLogTurn.Movement.Add(new Phase { Actor = fighter.Template, Message = fighter.Name + " hurries towards the enemy in order to get into weapon range", Icon = moveIconSpec, Relevance = Relevance.Medium }); if ((int)fighter.Weapon.Speed > 2) fighter.CanFire = true; else fighter.CanFire = false; } if (newPos == enemyPos) { gameLogTurn.Movement.Add(new Phase { Actor = fighter.Template, Message = fighter.Name + " enters close combat!", Icon = chargeIcon, Relevance = Relevance.High }); } return newPos; }
private void DefensiveMovement(Turn gameLogTurn, int distance, int direction, Combatant active, int enemyPos, int speedFiring, int speedNotFiring) { if (distance*direction > active.Weapon.MaxRange) { // run *carefully* to enemy! int newPos = move(distance, enemyPos, direction, speedFiring, speedNotFiring, active, gameLogTurn); active.Position = newPos; } else { if (distance*direction < active.Position + active.Weapon.MaxRange) { active.Position = retreat(distance, enemyPos, direction, speedFiring, speedNotFiring, active, gameLogTurn); } else { NoMovement(gameLogTurn, distance, active); } } }
private void AggresiveMovement(Turn gameLogTurn, int distance, int direction, Combatant active, int enemyPos, int speedFiring, int speedNotFiring, int oldPos) { if (distance*direction > active.Weapon.MinRange) { // run to enemy! int newPos = move(distance, enemyPos, direction, speedFiring, speedNotFiring, active, gameLogTurn); active.Position = newPos; } else { int newPos = oldPos; if (distance*direction < active.Weapon.MinRange) { newPos = retreat(distance, enemyPos, direction, speedFiring, speedNotFiring, active, gameLogTurn); } else { NoMovement(gameLogTurn, distance, active); } active.Position = newPos; } }