public static int GetEffectiveness(Character attacker, Character target, int attacking, int defending) { int effectiveness = 0; EventEnqueueFunction <ElementEffectEvent> function = (StablePriorityQueue <GameEventPriority, Tuple <GameEventOwner, Character, ElementEffectEvent> > queue, Priority maxPriority, ref Priority nextPriority) => { //start with universal DataManager.Instance.UniversalEvent.AddEventsToQueue(queue, maxPriority, ref nextPriority, DataManager.Instance.UniversalEvent.ElementEffects); //go through all statuses' element matchup methods if (attacker != null) { foreach (PassiveContext effectContext in attacker.IteratePassives(GameEventPriority.USER_PORT_PRIORITY)) { effectContext.AddEventsToQueue <ElementEffectEvent>(queue, maxPriority, ref nextPriority, effectContext.EventData.UserElementEffects); } } if (target != null) { foreach (PassiveContext effectContext in target.IteratePassives(GameEventPriority.TARGET_PORT_PRIORITY)) { effectContext.AddEventsToQueue <ElementEffectEvent>(queue, maxPriority, ref nextPriority, effectContext.EventData.TargetElementEffects); } } }; foreach (Tuple <GameEventOwner, Character, ElementEffectEvent> effect in IterateEvents <ElementEffectEvent>(function)) { effect.Item3.Apply(effect.Item1, effect.Item2, attacking, defending, ref effectiveness); } return(effectiveness); }
public IEnumerator <YieldInstruction> ProcessHit(BattleContext context) { yield return(CoroutineManager.Instance.StartCoroutine(context.Data.Hit(context))); EventEnqueueFunction <BattleEvent> function = (StablePriorityQueue <GameEventPriority, Tuple <GameEventOwner, Character, BattleEvent> > queue, Priority maxPriority, ref Priority nextPriority) => { if (context.ActionType != BattleActionType.Trap) { foreach (PassiveContext effectContext in context.User.IteratePassives(GameEventPriority.USER_PORT_PRIORITY)) { effectContext.AddEventsToQueue <BattleEvent>(queue, maxPriority, ref nextPriority, effectContext.EventData.AfterHittings); } } foreach (PassiveContext effectContext in context.Target.IteratePassives(GameEventPriority.TARGET_PORT_PRIORITY)) { effectContext.AddEventsToQueue(queue, maxPriority, ref nextPriority, effectContext.EventData.AfterBeingHits); } }; foreach (Tuple <GameEventOwner, Character, BattleEvent> effect in IterateEvents <BattleEvent>(function)) { yield return(CoroutineManager.Instance.StartCoroutine(effect.Item3.Apply(effect.Item1, effect.Item2, context))); if (context.CancelState.Cancel) { yield break; } } }
public IEnumerator <YieldInstruction> BeginFloor() { DataManager.Instance.Save.Trail.Add(ZoneManager.Instance.CurrentMap.GetColoredName()); LogMsg(Text.FormatKey("MSG_ENTER_MAP", ActiveTeam.GetDisplayName(), ZoneManager.Instance.CurrentMap.GetColoredName()), true, false); ZoneManager.Instance.CurrentMap.Begun = true; //process player happenings foreach (Character character in ZoneManager.Instance.CurrentMap.IterateCharacters()) { character.Tactic.Initialize(character); } //map starts for map statuses EventEnqueueFunction <SingleCharEvent> function = (StablePriorityQueue <GameEventPriority, EventQueueElement <SingleCharEvent> > queue, Priority maxPriority, ref Priority nextPriority) => { //start with universal DataManager.Instance.UniversalEvent.AddEventsToQueue(queue, maxPriority, ref nextPriority, DataManager.Instance.UniversalEvent.OnMapStarts, null); ZoneManager.Instance.CurrentMap.MapEffect.AddEventsToQueue(queue, maxPriority, ref nextPriority, ZoneManager.Instance.CurrentMap.MapEffect.OnMapStarts, null); foreach (MapStatus mapStatus in ZoneManager.Instance.CurrentMap.Status.Values) { MapStatusData entry = DataManager.Instance.GetMapStatus(mapStatus.ID); mapStatus.AddEventsToQueue <SingleCharEvent>(queue, maxPriority, ref nextPriority, entry.OnMapStarts, null); } int portPriority = 0; foreach (Character character in ZoneManager.Instance.CurrentMap.IterateCharacters()) { if (!character.Dead) { foreach (PassiveContext effectContext in character.IteratePassives(new Priority(portPriority))) { effectContext.AddEventsToQueue(queue, maxPriority, ref nextPriority, effectContext.EventData.OnMapStarts, character); } } portPriority++; } }; foreach (EventQueueElement <SingleCharEvent> effect in IterateEvents <SingleCharEvent>(function)) { yield return(CoroutineManager.Instance.StartCoroutine(effect.Event.Apply(effect.Owner, effect.OwnerChar, effect.TargetChar))); } yield return(CoroutineManager.Instance.StartCoroutine(ZoneManager.Instance.CurrentMap.OnEnter())); LogMsg(Text.DIVIDER_STR); }
public IEnumerator <YieldInstruction> InitActionData(BattleContext context) { EventEnqueueFunction <BattleEvent> function = (StablePriorityQueue <GameEventPriority, Tuple <GameEventOwner, Character, BattleEvent> > queue, Priority maxPriority, ref Priority nextPriority) => { DataManager.Instance.UniversalEvent.AddEventsToQueue(queue, maxPriority, ref nextPriority, DataManager.Instance.UniversalEvent.InitActionData); }; foreach (Tuple <GameEventOwner, Character, BattleEvent> effect in IterateEvents(function)) { yield return(CoroutineManager.Instance.StartCoroutine(effect.Item3.Apply(effect.Item1, effect.Item2, context))); if (context.CancelState.Cancel) { yield break; } } }
public IEnumerator <YieldInstruction> BeginFloor() { ZoneManager.Instance.CurrentMap.Begun = true; //process map-start events (dialogue, map condition announcement, etc) foreach (SingleCharEvent effect in ZoneManager.Instance.CurrentMap.StartEvents) { yield return(CoroutineManager.Instance.StartCoroutine(effect.Apply(null, null, FocusedCharacter))); } foreach (Character character in ActiveTeam.Players) { yield return(CoroutineManager.Instance.StartCoroutine(SpecialIntro(character))); } //process player happenings foreach (Character character in ZoneManager.Instance.CurrentMap.IterateCharacters()) { character.Tactic.Initialize(character); if (!character.Dead) { yield return(CoroutineManager.Instance.StartCoroutine(character.OnMapStart())); } } //map starts for map statuses EventEnqueueFunction <SingleCharEvent> function = (StablePriorityQueue <GameEventPriority, Tuple <GameEventOwner, Character, SingleCharEvent> > queue, Priority maxPriority, ref Priority nextPriority) => { //start with universal DataManager.Instance.UniversalEvent.AddEventsToQueue(queue, maxPriority, ref nextPriority, DataManager.Instance.UniversalEvent.OnMapStarts); foreach (MapStatus mapStatus in ZoneManager.Instance.CurrentMap.Status.Values) { MapStatusData entry = DataManager.Instance.GetMapStatus(mapStatus.ID); mapStatus.AddEventsToQueue <SingleCharEvent>(queue, maxPriority, ref nextPriority, entry.OnMapStarts); } }; foreach (Tuple <GameEventOwner, Character, SingleCharEvent> effect in IterateEvents <SingleCharEvent>(function)) { yield return(CoroutineManager.Instance.StartCoroutine(effect.Item3.Apply(effect.Item1, effect.Item2, null))); } //Notify script engine LuaEngine.Instance.OnDungeonFloorBegin(); }
public IEnumerator <YieldInstruction> BeforeExplosion(BattleContext context) { EventEnqueueFunction <BattleEvent> function = (StablePriorityQueue <GameEventPriority, Tuple <GameEventOwner, Character, BattleEvent> > queue, Priority maxPriority, ref Priority nextPriority) => { DataManager.Instance.UniversalEvent.AddEventsToQueue(queue, maxPriority, ref nextPriority, DataManager.Instance.UniversalEvent.BeforeExplosions); context.Data.AddEventsToQueue <BattleEvent>(queue, maxPriority, ref nextPriority, context.Data.BeforeExplosions); StablePriorityQueue <int, Character> charQueue = new StablePriorityQueue <int, Character>(); foreach (Character character in ZoneManager.Instance.CurrentMap.IterateCharacters()) { if (!character.Dead) { charQueue.Enqueue(-character.Speed, character); } } int portPriority = 0; while (charQueue.Count > 0) { Character character = charQueue.Dequeue(); foreach (PassiveContext effectContext in character.IterateProximityPassives(context.User, context.ExplosionTile, portPriority)) { effectContext.AddEventsToQueue(queue, maxPriority, ref nextPriority, ((ProximityData)effectContext.EventData).BeforeExplosions); } portPriority++; } }; foreach (Tuple <GameEventOwner, Character, BattleEvent> effect in IterateEvents <BattleEvent>(function)) { yield return(CoroutineManager.Instance.StartCoroutine(effect.Item3.Apply(effect.Item1, effect.Item2, context))); if (context.CancelState.Cancel) { yield break; } } }
/// <summary> /// Iterates through all GameEvents gathered by the enqueue function, in order of priority. /// Each individual tier of priority is gathered and processed before searching for the next one. /// This is done so that GameEffects that affect other GameEffects at a further priority can take effect immediately. /// </summary> /// <typeparam name="T"></typeparam> /// <param name="enqueueFunction"></param> /// <returns></returns> public static IEnumerable <Tuple <GameEventOwner, Character, T> > IterateEvents <T>(EventEnqueueFunction <T> enqueueFunction) where T : GameEvent { Priority maxPriority = Priority.Invalid; while (true) { Priority nextPriority = Priority.Invalid; StablePriorityQueue <GameEventPriority, Tuple <GameEventOwner, Character, T> > queue = new StablePriorityQueue <GameEventPriority, Tuple <GameEventOwner, Character, T> >(); enqueueFunction(queue, maxPriority, ref nextPriority); if (queue.Count == 0) { break; } else { while (queue.Count > 0) { Tuple <GameEventOwner, Character, T> effect = queue.Dequeue(); yield return(effect); } maxPriority = nextPriority; } } }
private IEnumerator <YieldInstruction> ProcessMapTurnEnd() { //turn ends for all EventEnqueueFunction <SingleCharEvent> function = (StablePriorityQueue <GameEventPriority, EventQueueElement <SingleCharEvent> > queue, Priority maxPriority, ref Priority nextPriority) => { //start with universal DataManager.Instance.UniversalEvent.AddEventsToQueue(queue, maxPriority, ref nextPriority, DataManager.Instance.UniversalEvent.OnMapTurnEnds, null); ZoneManager.Instance.CurrentMap.MapEffect.AddEventsToQueue(queue, maxPriority, ref nextPriority, ZoneManager.Instance.CurrentMap.MapEffect.OnMapTurnEnds, null); foreach (MapStatus mapStatus in ZoneManager.Instance.CurrentMap.Status.Values) { MapStatusData entry = DataManager.Instance.GetMapStatus(mapStatus.ID); mapStatus.AddEventsToQueue <SingleCharEvent>(queue, maxPriority, ref nextPriority, entry.OnMapTurnEnds, null); } int portPriority = 0; foreach (Character character in ZoneManager.Instance.CurrentMap.IterateCharacters()) { if (!character.Dead) { foreach (PassiveContext effectContext in character.IteratePassives(new Priority(portPriority))) { effectContext.AddEventsToQueue(queue, maxPriority, ref nextPriority, effectContext.EventData.OnMapTurnEnds, character); } } portPriority++; } }; foreach (EventQueueElement <SingleCharEvent> effect in IterateEvents <SingleCharEvent>(function)) { yield return(CoroutineManager.Instance.StartCoroutine(effect.Event.Apply(effect.Owner, effect.OwnerChar, effect.TargetChar))); } ZoneManager.Instance.CurrentMap.MapTurns++; DataManager.Instance.Save.TotalTurns++; //Map Respawns if (ZoneManager.Instance.CurrentMap.RespawnTime > 0 && ZoneManager.Instance.CurrentMap.MapTurns % ZoneManager.Instance.CurrentMap.RespawnTime == 0) { int totalFoes = 0; foreach (Team team in ZoneManager.Instance.CurrentMap.MapTeams) { foreach (Character character in team.Players) { if (!character.Dead) { totalFoes++; } } } if (totalFoes < ZoneManager.Instance.CurrentMap.MaxFoes) { List <Character> respawns = ZoneManager.Instance.CurrentMap.RespawnMob(); foreach (Character respawn in respawns) { respawn.Tactic.Initialize(respawn); if (!respawn.Dead) { yield return(CoroutineManager.Instance.StartCoroutine(respawn.OnMapStart())); ZoneManager.Instance.CurrentMap.UpdateExploration(respawn); } } } } //check EXP because someone could've died yield return(CoroutineManager.Instance.StartCoroutine(CheckEXP())); ////increment time for zone manager //ZoneManager.TimeOfDay prevTime = DataManager.Instance.Save.Time; //ZoneManager.Instance.TimeCycle = (DataManager.Instance.Save.TimeCycle + 1) % (2 * (DataManager.MAJOR_TIME_DUR + DataManager.MINOR_TIME_DUR)); //if (prevTime != DataManager.Instance.Save.Time) //DataManager.Instance.Save.LogMsg(Text.FormatKey("MENU_TIME_OF_DAY", DataManager.Instance.Save.Time)); }