Пример #1
0
        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);
        }
Пример #2
0
        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;
                }
            }
        }
Пример #3
0
        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);
        }
Пример #4
0
        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;
                }
            }
        }
Пример #5
0
        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();
        }
Пример #6
0
        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;
                }
            }
        }
Пример #7
0
        /// <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;
                }
            }
        }
Пример #8
0
        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));
        }