public List<Fighter> RemixTargets(Fighter caster, List<Fighter> targets) { List<Fighter> remixedTargets = new List<Fighter>(); foreach (Fighter target in targets) { if (Enemies && caster.Team != target.Team) { remixedTargets.Add(target); continue; } if (Allies && caster.ID != target.ID && caster.Team == target.Team) { remixedTargets.Add(target); continue; } if (Launcher && caster.ID == target.ID) { remixedTargets.Add(target); continue; } } if (AddLauncher && !remixedTargets.Contains(caster)) remixedTargets.Add(caster); return remixedTargets; }
public override void PlayerLeave(Fighter fighter) { switch (State) { case FightState.STARTING: if (fighter.IsLeader) { fighter.Left = true; FightEnd(GetEnnemyTeam(fighter.Team), fighter.Team); } else { fighter.Team.FighterLeave(fighter); fighter.Character.State.InFight = false; fighter.Character.Fight = null; fighter.Character.Fighter = null; Send(FormatFighterDestroy(fighter)); Map.Send(FormatFlagFighterDestroy(fighter)); fighter.Character.NClient.Send(FormatLeave()); } break; case FightState.PLAYING: if (CurrentFighter == fighter) TurnEnd(); fighter.Left = true; if (GetWinners() != null) { FightEnd(GetEnnemyTeam(fighter.Team), fighter.Team); } else { fighter.Buffs.Debuff(); fighter.Character.State.InFight = false; fighter.Character.Fight = null; fighter.Character.Fighter = null; Send(FormatFighterDestroy(fighter)); fighter.Character.NClient.Send(FormatLeave()); } break; } }
public void PlayerFightReady(Fighter fighter, bool ready) { if (myState != FightState.STARTING) return; fighter.FightReady = ready; Send(FormatFightReady(fighter)); if (IsAllFightReady()) FightStart(); }
public abstract void PlayerLeave(Fighter fighter);
public void FighterJoin(Fighter Fighter, bool isLeader = false) { Fighter.Team = this; Fighter.Cell = GetAvailablePlace(); if (isLeader) { myLeader = Fighter; myCell = Fighter.Character.MapCell; } myFighters.Add(Fighter); }
public void LaunchSpell(Fighter fighter, CharacterSpell spell, int cellID) { if (myState != FightState.PLAYING) return; Fighter firstTarget = GetAliveFighters().FirstOrDefault(x => x.Cell == cellID); int targetID = firstTarget == null ? -1 : firstTarget.ID; if (!CanLaunchSpell(fighter, spell, cellID, targetID)) return; fighter.AP -= spell.LevelModel.Cost; bool isEchec = false; if (spell.LevelModel.EC != 0) { int echecRate = spell.LevelModel.EC - fighter.Stats.GetStat(StatEnum.EchecCritic).Total; if (echecRate < 2) echecRate = 2; if (Basic.Rand(1, echecRate) == 1) isEchec = true; } if (isEchec) { Send("GA;302;" + fighter.ID + ';' + spell.ID); } else { fighter.SpellController.OnLaunchSpell(spell, targetID); Send("GA;300;" + fighter.ID + ';' + spell.ID + ',' + cellID + ',' + spell.Model.Sprite + ',' + spell.Level + ',' + spell.Model.SpriteInfos); bool isCritic = false; if (spell.LevelModel.CC != 0 & spell.LevelModel.CriticalEffects.Count > 0) { int criticRate = spell.LevelModel.CC - fighter.Stats.GetStat(StatEnum.DamageCritic).Total; if (criticRate < 2) criticRate = 2; if (Basic.Rand(1, criticRate) == 1) isCritic = true; } if (isCritic) Send("GA;301;" + fighter.ID + ';' + spell.ID); List<EffectSpell> effects = isCritic ? spell.LevelModel.CriticalEffects : spell.LevelModel.Effects; List<Fighter> targets = new List<Fighter>(); foreach (int cell in CellZone.GetCells(myMap, cellID, fighter.Cell, spell.LevelModel.Type)) { Fighter target = GetAliveFighters().FirstOrDefault(x => x.Cell == cell); if (target != null) targets.Add(target); } int actualChance = 0; foreach (EffectSpell effect in effects) { if (effect.Chance > 0) { if (Basic.Rand(1, 100) > effect.Chance + actualChance) { actualChance += effect.Chance; continue; } actualChance -= 100; } targets.RemoveAll(x => x.Dead); EffectProcessor.ApplyEffect(new EffectCast ((EffectEnum)effect.ID, spell.ID, cellID, effect.Value, effect.Value2, effect.Value3, effect.Chance, effect.Round, (spell.LevelModel.MinRP == 1 & spell.LevelModel.MaxRP == 1), fighter, effect.Target.RemixTargets(fighter, targets))); } } Send("GA;102;" + fighter.ID + ';' + fighter.ID + ",-" + spell.LevelModel.Cost); if (GetWinners() != null) FightEnd(GetWinners(), GetEnnemyTeam(GetWinners())); else if (isEchec & spell.LevelModel.isECEndTurn) TurnEnd(); }
public void Toggle(Fighter fighter, ToggleType toggle) { if (!fighter.IsLeader) return; bool isToggle = !fighter.Team.IsToggle(toggle); fighter.Team.Toggle(toggle, isToggle); if (myState == FightState.STARTING) myMap.Send(FormatFlagOption(toggle, fighter.Team)); switch (toggle) { case ToggleType.LOCK: if (isToggle) fighter.Team.Send("Im095"); else fighter.Team.Send("Im096"); break; case ToggleType.HELP: if (isToggle) fighter.Team.Send("Im0103"); else fighter.Team.Send("Im0104"); break; case ToggleType.PARTY: if (isToggle) { KickNoParty(fighter.Team); fighter.Team.Send("Im093"); } else { fighter.Team.Send("Im094"); } break; case ToggleType.SPECTATOR: if (isToggle) { KickSpectator(); fighter.Team.Send("Im040"); } else { fighter.Team.Send("Im039"); } break; } }
private void NextFighter() { do { if (myCurrentFighter == null || myCurrentFighter == myTurnFighters.LastOrDefault()) myCurrentFighter = myTurnFighters[0]; else myCurrentFighter = myTurnFighters[myTurnFighters.IndexOf(myCurrentFighter) + 1]; } while (myCurrentFighter.Dead); }
public string FormatFighterShow(Fighter fighter) { return new StringBuilder("GM|+").Append(fighter.GetPattern()).ToString(); }
public void PlayerTurnReady(Fighter fighter) { if (myState != FightState.WAITING) return; fighter.TurnReady = true; fighter.Character.NClient.Send("BN"); if (IsAllTurnReady()) TurnStart(); }
public string FormatFighterDestroy(Fighter fighter) { return new StringBuilder("GM|-").Append(fighter.ID).ToString(); }
public string FormatFighterShow(Fighter[] fighters) { StringBuilder builder = new StringBuilder("GM"); foreach (Fighter fighter in fighters) builder.Append("|+").Append(fighter.GetPattern()); return builder.ToString(); }
public void FightInit(Fighter attacker, Fighter defender) { FighterJoin(attacker, 0, true); FighterJoin(defender, 1, true); myMap.Send(FormatFlagShow()); myMap.Send(myMap.FormatFightCount()); myMap.Send(FormatFlagFighterShow(myTeam1.Leader)); myMap.Send(FormatFlagFighterShow(myTeam2.Leader)); myStartTimeOut = Environment.TickCount + StartTime(); }
public void FighterJoin(Fighter fighter, int team, bool isLeader = false) { switch (fighter.Type) { case FighterType.CHARACTER: fighter.Character.GetMap().DelPlayer(fighter.Character); fighter.Character.State.InFight = true; switch (team) { case 0: myTeam1.FighterJoin(fighter, isLeader); break; case 1: myTeam2.FighterJoin(fighter, isLeader); break; } Send(FormatFighterShow(fighter), fighter); if (!isLeader) myMap.Send(FormatFlagFighterShow(fighter)); fighter.Character.NClient.Send(FormatJoinInformation()); fighter.Character.NClient.Send(FormatJoinPlaces(team)); fighter.Character.NClient.Send(FormatFighterShow(GetFighters())); foreach (Fighter forFighter in GetFighters()) if (forFighter.FightReady) fighter.Character.NClient.Send(FormatFightReady(forFighter)); break; } }
public bool CanLaunchSpell(Fighter fighter, CharacterSpell spell, int spellCell, long target) { if (fighter != myCurrentFighter) return false; //if (!myMap.RushablesCells.Contains(spellCell)) // return false; if (fighter.AP < spell.LevelModel.Cost) return false; int distance = Pathfinding.GetDistanceBetween(myMap, fighter.Cell, spellCell); int maxPO = spell.LevelModel.MaxRP + (spell.LevelModel.isAlterablePO ? fighter.Stats.GetStat(StatEnum.PO).Total : 0); if (maxPO < spell.LevelModel.MinRP) maxPO = spell.LevelModel.MinRP; if (distance > maxPO || distance < spell.LevelModel.MinRP) return false; return fighter.SpellController.CanLaunchSpell(spell, target); }
public void PlayerPlace(Fighter fighter, int cell) { if (myState != FightState.STARTING) return; if (fighter.FightReady) return; if (!fighter.Team.IsAvailablePlace(cell)) return; fighter.Cell = cell; Send(FormatPlace(fighter)); }
public string FormatFightReady(Fighter fighter) { return new StringBuilder("GR").Append(fighter.FightReady ? "1" : "0").Append(fighter.ID).ToString(); }
public void PlayerTurnPass(Fighter fighter) { if (myState != FightState.PLAYING) return; if (myCurrentFighter != fighter) return; TurnEnd(); }
public string FormatFlagFighter(Fighter[] fighters) { StringBuilder builder = new StringBuilder("Gt"); builder.Append(fighters[0].Team.Leader.ID); foreach (Fighter fighter in fighters) builder.Append("|+").Append(fighter.ID).Append(";").Append(fighter.Name).Append(";").Append(fighter.Level); return builder.ToString(); }
public void Send(string packet, Fighter except = null) { foreach (Fighter fighter in GetFighters()) if (fighter != except & fighter.Type == FighterType.CHARACTER && fighter.Character.State.InFight) fighter.Character.NClient.Send(packet); foreach (Character spectator in mySpectators) spectator.NClient.Send(packet); }
public int CalculDodgeAPMP(Fighter caster, int lostPoint, bool IsMP = false) { int realLostPoint = 0; int dodgeCaster; int dodgeTarget; if (!IsMP) { dodgeCaster = caster.Stats.GetStat(StatEnum.EsquivePA).Total + 1; dodgeTarget = Stats.GetStat(StatEnum.EsquivePA).Total + 1; } else { dodgeCaster = caster.Stats.GetStat(StatEnum.EsquivePM).Total; dodgeTarget = Stats.GetStat(StatEnum.EsquivePM).Total; } if (dodgeTarget <= 0) dodgeTarget = 1; for (int i = 0; i < lostPoint; i++) { int actualPoint = (!IsMP ? AP : MP) - realLostPoint; int percentLastPoint = actualPoint / (!IsMP ? AP : MP); double chance = 0.5 * (dodgeCaster / dodgeTarget) * percentLastPoint; double percentChance = chance * 100; if (percentChance > 100) percentChance = 90; if (percentChance < 10) percentChance = 10; if (Utilities.Basic.Rand(0, 99) < percentChance) realLostPoint++; } return realLostPoint; }
public bool TryMove(Fighter fighter, Pathfinding path) { if (myState != FightState.PLAYING) return false; if (myCurrentFighter != fighter) return false; int length = path.GetLength(); if (length > fighter.MP) return false; fighter.MP -= length; Send("GA;129;" + fighter.ID + ';' + fighter.ID + ",-" + length); fighter.Buffs.OnMoveEnd(); return true; }
public string FormatPlace(Fighter fighter) { return new StringBuilder("GIC|").Append(fighter.ID).Append(";").Append(fighter.Cell).Append(";1").ToString(); }
public string FormatFlagFighterShow(Fighter fighter) { return new StringBuilder("Gt").Append(fighter.Team.Leader.ID).Append("|+").Append(fighter.ID).Append(";").Append(fighter.Name).Append(";").Append(fighter.Level).ToString(); }
public void FighterLeave(Fighter Fighter) { myFighters.Remove(Fighter); }