public List <Encounters> FillEncounters(IEntryCollection entryCollection, string name)
        {
            List <Encounters> encounters = new List <Encounters>();

            foreach (IEntry entryitem in entryCollection)
            {
                Encounters         ptEncounters      = new Encounters();
                IEncounter         entryEncounter    = entryitem.AsEncounter;
                IEntryRelationship entryRelationItem = entryEncounter.EntryRelationship.FirstOrDefault();
                if (entryRelationItem != null)
                {
                    IObservation observation = entryRelationItem.AsObservation;
                    IIVL_TS      efftime     = observation.EffectiveTime;
                    if (efftime == null)
                    {
                        throw new InvalidOperationException();
                    }
                    IANY   observationvalue = observation.Value.FirstOrDefault();
                    ICD    str      = (ICD)observationvalue;
                    string location = observation.Participant.Count > 0 ? observation.Participant[0].ParticipantRole.AsPlayingEntity.Name[0].Text : null;
                    ptEncounters.Code = str.Code;
                    ptEncounters.EncounterDescription = str.DisplayName;
                    ptEncounters.PerformerName        = name;
                    //ptEncounters.EncounterDate = efftime != null ? efftime.Low != null ? efftime.Low.Value != null ? new DateTime?(Convert.ToDateTime(efftime.Low.AsDateTime)) : null : null : efftime.Value != null ? new DateTime?(Convert.ToDateTime(efftime.AsDateTime)) : null;
                }
                encounters.Add(ptEncounters);
            }

            return(encounters);
        }
Esempio n. 2
0
        public virtual async Task <GridTargetAction> GetNextActionAsync(IEncounter encounter)
        {
            GridTargetAction action = null;

            if (CanAttack)
            {
                action = Actions.Count > 0 ? Actions.Dequeue() :(GridTargetAction)await Intelligence.GetNextActionAsync(encounter);

                if (TargetPreference != null && encounter.Dead.Contains(TargetPreference))
                {
                    TargetPreference = null;
                }


                if (TargetPreference != null && (action.TargetType == TargetTypes.Enemy &&
                                                 !action.TargetEntities.Any()))
                {
                    action.TargetEntities.Add(TargetPreference);
                }


                LastAction = DateTime.Now;
            }

            return(action);
        }
Esempio n. 3
0
 public IEncounter CreateNewEncounter()
 {
     player = CharacterFactory.CreatePlayerCharacter();
     monster = CharacterFactory.CreateMonster();
     encounter = new Encounter(player, monster);
     return encounter;
 }
Esempio n. 4
0
        private Task HandleRemoveEncounter(IEncounter encounter)
        {
            encounter.ActionExecuted -= Encounter_ActionExecuted;
            encounter.Ended          -= Encounter_Ended;

            return(Task.CompletedTask);
        }
Esempio n. 5
0
        public TimeSpan GetEncounterDuration(IEncounter encounter)
        {
            // TODO: This should be a method on Encounter
            var phases = encounter.GetPhases().ToArray();
            var start  = phases.Min(x => x.StartTime);
            var end    = phases.Max(x => x.EndTime);

            return(new TimeSpan(0, 0, 0, 0, (int)(end - start)));
        }
Esempio n. 6
0
        /// <summary>
        /// Return what the current actor should do given the current state of the encounter.
        /// </summary>
        /// <param name="actor"></param>
        /// <param name="encounter"></param>
        /// <returns></returns>
        public static IActionDecision DecideAction(this IActor actor, IEncounter encounter)
        {
            var chosenOpponent = encounter.Factions
                                 .Where(f => !f.Participants.SelectMany(p => p).Contains(actor))
                                 .SelectMany(f => f.Participants)
                                 .SelectMany(p => p)
                                 .FirstOrDefault(a => a.HitPoints.CurrentHitPoints > 0);

            if (chosenOpponent == null)
            {
                return(default);
Esempio n. 7
0
    public void ProcessEncounter()
    {
        switch (CurrentLevelSet.Type)
        {
        case LevelType.Battle:
            BattleEncounter();
            return;

        case LevelType.Exit:
            State = GameState.Exit;
            break;

        case LevelType.BranchingPath:
            break;

        case LevelType.SafeZone:
            break;

        case LevelType.TreasureChest:
            break;

        case LevelType.Mimic:
            break;

        case LevelType.MagicFountain:
            break;

        case LevelType.StorageRoom:
            break;

        case LevelType.Shop:
            break;

        case LevelType.Character:
            State = GameState.Character;
            break;

        case LevelType.Trap:
            break;

        default:
            break;
        }

        IEncounter encounter = CurrentLevelSet.encounterObjects.GetComponentInChildren <IEncounter>();

        encounter.Encounter();
    }
 public Control GetView(IEncounter encounter)
 {
     if (encounter is Fight)
     {
         return new FightView(encounter as Fight, window);
     }
     else if (encounter is Treasure)
     {
         return new TreasureView(encounter as Treasure, window);
     }
     else if (encounter is Merchant)
     {
         return new MerchantView(encounter as Merchant, window);
     }
     throw new Exception("Encounter type not recognized!");
 }
Esempio n. 9
0
        public Task <ICombatAction> GetNextActionAsync(IEncounter encounter)
        {
            var defaultAttack = new GridTargetAction()
            {
                Id = _defaultAction.Id, Name = _defaultAction.Name, Element = _defaultAction.Element, TargetType = _defaultAction.TargetType, Modifiers = _defaultAction.Modifiers.Select(m => (IActionModifier) new GridActionModifier()
                {
                    Name = m.Name, TargetType = m.TargetType, ModifierType = m.ModifierType, Min = m.Min, Max = m.Max
                }).ToList()
            };

            // no intelligence right now..just set a command to find any enemy and dmg the health

            // mod this with stats eventually

            return(Task.FromResult((ICombatAction)defaultAttack));
        }
Esempio n. 10
0
        private async Task HandleNewEncounter(IEncounter encounter)
        {
            encounter.ActionExecuted += Encounter_ActionExecuted;
            encounter.Ended          += Encounter_Ended;

            var map = ((GridPlayer)encounter.Combatants.First().Key).Map;

            await Game.Network.SendViewCommandsToMapAsync(map,
                                                          MudLikeViewBuilder.Start()
                                                          .AddOperation(
                                                              MudLikeOperationBuilder.Start($"enc_{encounter.Id}")
                                                              .StartContainer($"enc_{encounter.Id}")
                                                              .AddTextLine("Combat Starting")
                                                              .EndContainer($"enc_{encounter.Id}")
                                                              .Build()
                                                              )
                                                          .Build());
        }
Esempio n. 11
0
 public virtual Task SetDefaultTargetAsync(IEncounter encounter)
 {
     return(Task.CompletedTask);
 }
Esempio n. 12
0
        public override Task SetDefaultTargetAsync(IEncounter encounter)
        {
            var gridEncounter = (GridEncounter)encounter;

            switch (TargetType)
            {
            case TargetTypes.Self:
                TargetEntities.Add(SourceEntity);
                break;

            case TargetTypes.Enemy:
                foreach (var factionName in gridEncounter.Factions.Keys.ToList())
                {
                    var faction = gridEncounter.Factions[factionName];
                    if (!faction.Contains(SourceEntity))
                    {
                        TargetEntities.Add((GridEntity)faction.FirstOrDefault(e => !encounter.Dead.Contains(e)));
                        break;
                    }
                }
                break;

            case TargetTypes.EnemyArea:
                foreach (var factionName in gridEncounter.Factions.Keys.ToList())
                {
                    var faction = gridEncounter.Factions[factionName];
                    if (!faction.Contains(SourceEntity))
                    {
                        foreach (var target in faction)
                        {
                            TargetEntities.Add((GridEntity)target);
                        }
                    }
                }
                break;

            case TargetTypes.Friend:
                foreach (var factionName in gridEncounter.Factions.Keys.ToList())
                {
                    var faction = gridEncounter.Factions[factionName];
                    if (faction.Contains(SourceEntity))
                    {
                        TargetEntities.Add((GridEntity)faction.FirstOrDefault(e => !encounter.Dead.Contains(e)));
                        break;
                    }
                }
                break;

            case TargetTypes.FriendArea:
                foreach (var factionName in gridEncounter.Factions.Keys.ToList())
                {
                    var faction = gridEncounter.Factions[factionName];
                    if (faction.Contains(SourceEntity))
                    {
                        foreach (var target in faction)
                        {
                            TargetEntities.Add((GridEntity)target);
                        }
                    }
                }
                break;
            }

            return(Task.CompletedTask);
        }
Esempio n. 13
0
 private Task EncounterEnded(IEncounter encounter, EncounterEndings endingType)
 {
     _logger.LogInformation("Encounter ended");
     return(RemoveEncounterAsync((GridEncounter)encounter));
 }
Esempio n. 14
0
        public Dictionary <string, ArrayList> GetDataCollection(ISection sections, PatientClinicalInformation ptInformation)
        {
            Dictionary <string, ArrayList> componententries = new Dictionary <string, ArrayList>();
            IEntryCollection           entries     = sections.Entry;
            IStrucDocText              sectiontext = sections.Text;
            IStrucDocElementCollection textitem    = sectiontext.Items;

            if (entries.Count() > 0)
            {
                int count = 0;
                foreach (IEntry singlerecord in entries)
                {
                    itemAct       = singlerecord.AsAct;
                    itemEncounter = singlerecord.AsEncounter;
                    itemSubstanceAdministration = singlerecord.AsSubstanceAdministration;
                    observation = singlerecord.AsObservation;
                    organizer   = singlerecord.AsOrganizer;
                    procedure   = singlerecord.AsProcedure;
                    //if(sections.Code.Code== "18776-5")
                    // {

                    // }
                    ArrayList arrayList = new ArrayList();
                    if (itemAct != null)
                    {
                        entryRelationship = itemAct.EntryRelationship;
                        IIVL_TS efftime = itemAct.EffectiveTime;
                        if (efftime != null && efftime.Low != null)
                        {
                            if (efftime.Low.Value != null)
                            {
                                arrayList.Add(efftime.Low.AsDateTime.ToString());
                            }
                            else
                            {
                                arrayList.Add("null");
                            }
                        }
                        else
                        {
                            arrayList.Add("null");
                        }
                        if (entryRelationship != null && entryRelationship.Count > 0)
                        {
                            observation = entryRelationship.Select(o => o.AsObservation).FirstOrDefault();
                            if (observation != null)
                            {
                                if (observation.Participant.Count() > 0)
                                {
                                    string participent = observation.Participant.Select(p => p.ParticipantRole).FirstOrDefault().AsPlayingEntity.Name.FirstOrDefault().Text;
                                    arrayList.Add(participent);
                                }

                                entity = observation.EntryRelationship;
                                foreach (IEntryRelationship singlentity in entity)
                                {
                                    IObservation entityobservation = singlentity.AsObservation;
                                    IANY         observationvalue  = entityobservation.Value.FirstOrDefault();
                                    if (observationvalue != null)
                                    {
                                        var    obj     = observationvalue.GetType();
                                        string objname = obj.Name;
                                        switch (objname)
                                        {
                                        default:
                                            ICD strcd = (ICD)observationvalue;
                                            arrayList.Add(strcd.Code);
                                            arrayList.Add(strcd.DisplayName);
                                            break;

                                        case "PQ":
                                            IPQ strpq = (IPQ)observationvalue;
                                            arrayList.Add(strpq.Value.ToString() + " " + strpq.Unit.ToString());
                                            break;
                                        }
                                    }
                                }

                                componententries.Add(count.ToString(), arrayList);
                                count++;
                            }
                        }
                        else
                        {
                            arrayList.Add(itemAct.Text.Text);
                            componententries.Add(count.ToString(), arrayList);
                            count++;
                        }
                    }
                    else if (itemEncounter != null)
                    {
                        entryRelationship = itemEncounter.EntryRelationship;
                        if ((entryRelationship.Select(t => t.TypeCode).FirstOrDefault().ToString()) == "RSON")
                        {
                            observation = entryRelationship.Select(o => o.AsObservation).FirstOrDefault();
                            IIVL_TS efftime          = observation.EffectiveTime;
                            IANY    observationvalue = observation.Value.FirstOrDefault();
                            ICD     str = (ICD)observationvalue;
                            arrayList.Add(str.DisplayName);
                            arrayList.Add(ptInformation.ptClinicInformation.ClinicName);
                            if (efftime.Low != null)
                            {
                                arrayList.Add(efftime.Low.AsDateTime);
                            }
                            else
                            {
                                arrayList.Add(null);
                            }
                            arrayList.Add(str.Code);
                        }

                        componententries.Add(count.ToString(), arrayList);
                        count++;
                    }
                    else if (itemSubstanceAdministration != null)
                    {
                        consumable          = itemSubstanceAdministration.Consumable;
                        manufacturedProduct = consumable.ManufacturedProduct;
                        material            = manufacturedProduct.AsMaterial;
                        arrayList.Add(material.Code.Code);
                        arrayList.Add(itemSubstanceAdministration.StatusCode.Code.ToString());
                        ISXCM_TSCollection efftime = itemSubstanceAdministration.EffectiveTime;
                        if (efftime.Count > 1)
                        {
                            foreach (IVL_TS daterange in efftime)
                            {
                                string startdatetime = daterange.Low != null ? daterange.Low.Value != null?daterange.Low.AsDateTime.ToString() : "null" : "null";

                                string EndDAtetime = daterange.High != null ? daterange.High.Value != null?daterange.High.AsDateTime.ToString() : "null" : "null";

                                arrayList.Add(startdatetime);
                                arrayList.Add(EndDAtetime);
                                break;
                            }
                        }
                        else
                        {
                            arrayList.Add(efftime[0].AsDateTime.ToString());
                        }

                        arrayList.Add(material.Code.DisplayName);
                        if (itemSubstanceAdministration.DoseQuantity != null)
                        {
                            arrayList.Add(itemSubstanceAdministration.DoseQuantity.Value.ToString() + " " + itemSubstanceAdministration.DoseQuantity.Unit.ToString());
                        }
                        else
                        {
                            arrayList.Add("NA");
                        }
                        if (manufacturedProduct.ManufacturerOrganization != null)
                        {
                            arrayList.Add(manufacturedProduct.ManufacturerOrganization.Name.ToString());
                        }
                        else
                        {
                            arrayList.Add("NA");
                        }

                        componententries.Add(count.ToString(), arrayList);
                        count++;
                    }
                    else if (observation != null)
                    {
                        if (observation.Value.Count > 0)
                        {
                            IANY observationvalue = observation.Value.FirstOrDefault();
                            ICD  str = (ICD)observationvalue;
                            arrayList.Add(str.Code);
                            arrayList.Add(str.DisplayName);
                            IIVL_TS efftime = observation.EffectiveTime;
                            if (efftime != null && efftime.Low != null)
                            {
                                if (efftime.Low.Value != null)
                                {
                                    arrayList.Add(efftime.Low.AsDateTime.ToString());
                                }
                                else
                                {
                                    arrayList.Add("null");
                                }
                            }
                            else
                            {
                                arrayList.Add("null");
                            }
                        }
                        else
                        {
                            arrayList.Add(null);
                            arrayList.Add(null);
                            arrayList.Add(null);
                        }

                        componententries.Add(count.ToString(), arrayList);
                        count++;
                    }
                    else if (organizer != null)
                    {
                        IComponent4Collection orgComponent = organizer.Component;

                        foreach (IComponent4 objItem in orgComponent)
                        {
                            IObservation orgObservation = objItem.AsObservation;
                            arrayList.Add(orgObservation.Code.DisplayName);
                            if (orgObservation.Value != null)
                            {
                                IANY   observationvalue = orgObservation.Value.FirstOrDefault();
                                var    obj     = observationvalue.GetType();
                                string objname = obj.Name;

                                switch (objname)
                                {
                                default:
                                    ICD strcd = (ICD)observationvalue;
                                    arrayList.Add(strcd.Code);
                                    arrayList.Add(strcd.DisplayName);
                                    break;

                                case "PQ":
                                    IPQ strpq = (IPQ)observationvalue;
                                    arrayList.Add(strpq.Value.ToString() + " " + strpq.Unit.ToString());
                                    break;
                                }
                                //IPQ str = (IPQ)observationvalue;
                                //arrayList.Add(str.Value.ToString() + " " + str.Unit.ToString());
                            }
                            IIVL_TS efftime = orgObservation.EffectiveTime;
                            if (efftime != null && efftime.Low != null)
                            {
                                if (efftime.Low.Value != null)
                                {
                                    arrayList.Add(efftime.Low.AsDateTime.ToString());
                                }
                                else
                                {
                                    arrayList.Add("null");
                                }
                            }
                            else
                            {
                                arrayList.Add("null");
                            }
                            if (orgObservation.ReferenceRange != null)
                            {
                                if (orgObservation.ReferenceRange.Count > 0)
                                {
                                    arrayList.Add(orgObservation.ReferenceRange[0].ObservationRange.Text.Text);
                                }
                                else
                                {
                                    arrayList.Add("NA");
                                }
                            }
                        }
                        arrayList.Add(organizer.Code.Code);
                        componententries.Add(count.ToString(), arrayList);
                        count++;
                    }
                    else if (procedure != null)
                    {
                        if (procedure.Code != null)
                        {
                            arrayList.Add(procedure.Code.Code);
                            arrayList.Add(procedure.Code.DisplayName);
                        }
                        else
                        {
                            arrayList.Add(null);
                            arrayList.Add(null);
                        }
                        componententries.Add(count.ToString(), arrayList);
                        count++;
                    }
                }
            }

            return(componententries);
        }
        private static void resetLearningHelper()
        {
            if (learningHelperClass != null)
            {
                try
                {
                    learningHelperClass.endEncounter();
                    inController = false;
                    learningHelperClass.onEndEncounter();
                    inController = true;
                }
                catch (Exception e2)
                {
                    inController = true;
                    debug("learningHelper processChatLine", getEngineVsEncounter(learningHelperClass), e2);
                }
                learningHelperClass = null;
            }

            try
            {
                refreshIgnoreMobsList();

                // Start learning helper for a new encounter
                LearningHelper abc = new LearningHelper();
                setupNewClass((IEncounter)abc);
                learningHelperClass = abc;
                debug("LearningHelper started", DBMErrorLevel.Trace);
            }
            catch (Exception e2)
            {
                debug("learningHelper setupNewClass", getEngineVsEncounter(learningHelperClass), e2);
            }
        }
        public static void endEncounter()
        {
            try
            {
                if (learningHelperClass != null)
                {
                    try
                    {
                        learningHelperClass.endEncounter();
                        learningHelperClass.onEndEncounter();
                    }
                    catch (Exception e2)
                    {
                        debug("learningHelper endEncounter", getEngineVsEncounter(learningHelperClass), e2);
                    }
                    learningHelperClass = null;
                }

                if (implementationClass != null)
                {
                    debug("endEncounter removed " + handleRemoveEntryName + "(" + handleRemoveEntry + ")", DBMErrorLevel.Trace);
                    try
                    {
                        inController = false;
                        implementationClass.endEncounter();
                        implementationClass.onEndEncounter();
                        inController = true;
                    }
                    catch (Exception e2)
                    {
                        debug("endEncounter", getEngineVsEncounter(implementationClass), e2);
                        inController = true;
                    }
                    implementationClass = null;
                }
                _agroList.Clear();
                _enmityCached.Clear();
                _mobCached.Clear();
                encounterStarted = false;
                endEncounterAt = DateTime.MaxValue;
            }
            catch (Exception ex2)
            {
                debug("endEncounter error: ", DBMErrorLevel.EngineErrors, ex2);
            }
        }
Esempio n. 17
0
 public int CompareTo(IEncounter other)
 {
     return(EncounterIndex.CompareTo(other.EncounterIndex));
 }
Esempio n. 18
0
 public void StartEncounter(IEncounter encounter)
 {
     this.encounter = encounter;
     UpdateModel();
     UpdateEventLog();
 }
        static void checkForNewAgro()
        {
            List<uint> diff = null;

            try
            {
                // Check for new entries in the enmity list
                diff = playerEntity.EnmityEntries.Select(x => x.ID).Except(_enmityCached.Select(y => y.ID)).ToList();

                if (diff.Any())
                {
                    // loop through the new enmity entries

                    foreach (uint ID in diff)
                    {
                        ActorEntity currentEntity = null;
                        if (_mobCached.ContainsKey(ID))
                        {
                            currentEntity = _mobCached[ID];
                        }
                        else if (_mobList.ContainsKey(ID))
                        {
                            currentEntity = _mobList[ID];
                        }

                        if (currentEntity != null)
                        {
                            if (currentEntity.IsValid && currentEntity.HPCurrent > 0) // && currentEntity.ClaimedByID != 0 && currentEntity.ClaimedByID < 0xE0000000)
                            {
                                if (!_agroList.Any() && implementationClass == null && learningHelperClass == null)
                                {
                                    // This is the first enmity entry we found. Start the encounter timer.
                                    started = DateTime.Now;
                                }

                                // make sure it's our own copy so it won't mysteriously disappear or change without our knowledge
                                currentEntity = cloneActorEntity(currentEntity);

                                if (_agroList.Any())
                                {
                                    firstAgro = DateTime.Now;
                                }

                                _agroList.Add(currentEntity);
                                endEncounterAt = DateTime.MaxValue;


                                if (implementationClass != null)
                                {
                                    // send the new mobs to the encounter script
                                    try
                                    {
                                        debug("Agroed Mob: " + currentEntity.Name, DBMErrorLevel.Trace);
                                        inController = false;
                                        implementationClass.onMobAgro(currentEntity);
                                        inController = true;
                                    }
                                    catch (Exception e2)
                                    {
                                        debug("onMobAgro", getEngineVsEncounter(implementationClass), e2);
                                        inController = true;
                                    }
                                    try
                                    {
                                        implementationClass.bossCheck(currentEntity);
                                    }
                                    catch (Exception e2)
                                    {
                                        debug("bossCheck", getEngineVsEncounter(implementationClass), e2);
                                    }

                                }
                                else
                                {
                                    if (useTestEncounter)
                                    {
                                        IEncounter inst = (IEncounter)(new TestEncounter());
                                        implementationClass = inst;

                                        setupNewClass(inst);


                                        debug("TestEncounter started", DBMErrorLevel.Trace);
                                        debug("Agroed Mob: " + currentEntity.Name, DBMErrorLevel.Trace);
                                    }
                                    else
                                    {
                                        // No encounter script loaded. Lets see if we have one that matches this mob
                                        Regex rgx = new Regex("[^a-zA-Z0-9 -]");
                                        string mobName = rgx.Replace(currentEntity.Name, "");

                                        string dir = getScriptsDirectory();

                                        checkRecompile(currentEntity.Name);

                                        if (encounters.ContainsKey(mobName))
                                        {
                                            IEncounter inst = findEntryPoint(encounters[mobName]);
                                            implementationClass = inst;

                                            if (implementationClass != null)
                                            {
                                                setupNewClass(inst);

                                                debug("Encounter started (" + dir + @"\" + mobName + ".cs)", DBMErrorLevel.Trace);
                                                debug("Agroed Mob: " + currentEntity.Name, DBMErrorLevel.Trace);

                                                resetLearningHelper();
                                            }
                                            else
                                            {
                                                debug("Couldn't find entry point in class: " + dir + @"\" + mobName + ".cs", DBMErrorLevel.EngineErrors);
                                            }
                                        }
                                    }
                                }


                                if (learningHelperClass != null)
                                {
                                    // send the new mobs to the learning helper
                                    try
                                    {
                                        learningHelperClass.onMobAgro(currentEntity);
                                    }
                                    catch (Exception e2)
                                    {
                                        debug("learningHelper onMobAgro", getEngineVsEncounter(learningHelperClass), e2);
                                    }
                                    try
                                    {
                                        learningHelperClass.bossCheck(currentEntity);
                                    }
                                    catch (Exception e2)
                                    {
                                        debug("learningHelper bossCheck", getEngineVsEncounter(learningHelperClass), e2);
                                    }
                                }
                                else
                                {
                                    refreshIgnoreMobsList();

                                    // Start learning helper for a new encounter
                                    LearningHelper abc = new LearningHelper();
                                    setupNewClass((IEncounter)abc);
                                    learningHelperClass = abc;
                                    debug("LearningHelper started (" + currentEntity.Name + ")", DBMErrorLevel.Trace);
                                }

                            }
                            else
                            {
                                debug("New agro invalid: IsValid: " + currentEntity.IsValid + ", HPCurrent: " + currentEntity.HPCurrent + ", ClaimedByID: " + currentEntity.ClaimedByID, DBMErrorLevel.Notice);
                            }
                        }
                        else
                        {
                            debug("New agro not found (ID: " + ID + ")", DBMErrorLevel.Notice);
                        }
                    }
                }
            }
            catch (Exception e2)
            {
                debug("updateData check for new agro", DBMErrorLevel.EngineErrors, e2);
            }
        }
        public static void compileScripts()
        {
            try
            {
                string dir = getScriptsDirectory();

                DirectoryInfo di = new DirectoryInfo(dir);

                FileInfo[] files = di.GetFiles("*.cs");

                if (implementationClass != null)
                {
                    endEncounter();
                    implementationClass = null;
                }



                foreach (FileInfo fi in files)
                {
                    if (File.Exists(fi.FullName))
                    {
                        string key = Path.GetFileNameWithoutExtension(fi.FullName);

                        if (!encounters.ContainsKey(key) || fi.LastWriteTimeUtc != classModified[key])
                        {
                            try
                            {
                                Assembly tmpAssembly = loadAssemblyFile(fi.FullName);

                                if (tmpAssembly != null)
                                {
                                    encounters[key] = tmpAssembly;
                                    classModified[key] = fi.LastWriteTimeUtc;

                                    debug("Compiled (" + fi.FullName + ".cs)", DBMErrorLevel.Notice);
                                }
                            }
                            catch (Exception e)
                            {
                                debug("Compile error (" + fi.FullName + "): ", DBMErrorLevel.EncounterErrors, e);
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                debug("Error compiling scripts", DBMErrorLevel.EngineErrors, ex);
            }
        }
 private static DBMErrorLevel getEngineVsEncounter(IEncounter controller)
 {
     try
     {
         if (controller == null)
         {
             return DBMErrorLevel.EngineErrors;
         }
         return (controller.inController() ? DBMErrorLevel.EngineErrors : DBMErrorLevel.EncounterErrors);
     }
     catch (Exception ex2)
     {
         debug("getEngineVsEncounter error: ", DBMErrorLevel.EngineErrors, ex2);
     }
     return DBMErrorLevel.EngineErrors;
 }
Esempio n. 22
0
        private async Task Encounter_ActionExecuted(IEncounter encounter, ICombatAction action)
        {
            // this whole thing can be optimized to send way smaller replacement segments later

            var combatView = MudLikeOperationBuilder.Start($"enc_{encounter.Id}")
                             .StartContainer($"enc_{encounter.Id}")
                             .AddTextLine("");

            var gridEncounter = (GridEncounter)encounter;
            var entityAction  = (GridTargetAction)action;

            //var dmgDone = encounter.ActionLog.Select((a) => (ICombatAction<GridEntity>)a)
            //      .GroupBy(a => new { a.SourceEntity })
            //      .Select(a => new { Attacker = a.Key.SourceEntity, Damage = a.Sum(s => s.DamageDone) })
            //  .ToList();

            //var dmgTaken = encounter.ActionLog.Select((a) => (GridSingleTargetAction)a)
            //                            .GroupBy(a => new { a.TargetEntity })
            //                            .Select(a => new { Attacked = a.Key.TargetEntity, Damage = a.Sum(s => s.DamageDone) })
            //                        .ToList();

            foreach (var factionName in gridEncounter.Factions.Keys)
            {
                var factionEntities = gridEncounter.Factions[factionName];


                foreach (var entity in factionEntities)
                {
                    combatView
                    .AddText(entity.Name, (entity.IsAlive && !encounter.Dead.Contains(entity) ? TextColor.Normal : TextColor.Red));
                    if (entity.IsAlive && !encounter.Dead.Contains(entity))
                    {
                        combatView
                        .AddText($" {entity.Stats.FirstOrDefault(s => s.Name == "health")?.Value}", TextColor.Green)
                        .AddText($" {entity.Stats.FirstOrDefault(s => s.Name == "mana")?.Value}", TextColor.Blue)
                        .AddText($" {entity.Stats.FirstOrDefault(s => s.Name == "stamina")?.Value}", TextColor.Yellow)
                        ;
                    }
                    else
                    {
                        combatView.AddText(" Dead", TextColor.Red, TextSize.Small);
                    }

                    //var entityDmgDone = dmgDone.FirstOrDefault(d => d.Attacker == entity);
                    //if (entityDmgDone != null)
                    //{
                    //    combatView
                    //        .AddText($" Dmg {entityDmgDone.Damage}", TextColor.Teal);
                    //    ;
                    //}
                    //var entityDmgTaken = dmgTaken.FirstOrDefault(d => d.Attacked == entity);
                    //if (entityDmgTaken != null)
                    //{
                    //    combatView
                    //        .AddText($" Taken {entityDmgTaken.Damage}", TextColor.Teal);
                    //    ;
                    //}

                    combatView.AddLineBreak();
                }

                combatView.AddTextLine("---------------------------");
            }


            // add last X actions
            var actions = encounter.ActionLog.OrderByDescending(a => a.ExecutedTime).Take(10).OrderBy(a => a.ExecutedTime).ToList();

            actions.ForEach((a) => a.AppendToOperation(combatView));

            combatView.EndContainer($"enc_{encounter.Id}");

            var view = MudLikeViewBuilder.Start()
                       .AddOperation(combatView.Build()
                                     ).Build();


            if (entityAction.TargetEntities.Contains(entityAction.SourceEntity) || entityAction.TargetEntities.Count == 0)
            {
                await Game.Network.SendViewCommandsToMapAsync(entityAction.SourceEntity.Map, view);
            }
            else
            {
                var maps = new List <IMap>()
                {
                    entityAction.SourceEntity.Map
                };
                maps.AddRange(entityAction.TargetEntities.Where(t => t.Map != entityAction.SourceEntity.Map).Select(t => t.Map).Distinct());

                maps.ForEach(async m => await Game.Network.SendViewCommandsToMapAsync(m, view));
            }
        }
Esempio n. 23
0
 public LevelSceneData(string sceneName, IEncounter encounter, PlayerController player)
 {
     SceneName      = sceneName;
     this.encounter = encounter;
     this.player    = player;
 }
Esempio n. 24
0
        private async Task Encounter_Ended(IEncounter encounter, EncounterEndings ending)
        {
            encounter.ActionExecuted -= Encounter_ActionExecuted;
            encounter.Ended          -= Encounter_Ended;

            if (ending == EncounterEndings.Expired)
            {
                return;
            }

            var gridEncounter = (GridEncounter)encounter;


            // allocate experience to winners

            var factionInfo = gridEncounter.Factions.Select(f => new
            {
                FactionName     = f.Key,
                FactionEntities = f.Value,
                isWinner        = f.Value.Count(e => !gridEncounter.Dead.Contains(e)) > 0,
                AverageLevel    = f.Value.Average(e => e.Stats.FirstOrDefault(s => s.Name == "level")?.Value).GetValueOrDefault(0),
                MinLevel        = f.Value.Min(e => e.Stats.FirstOrDefault(s => s.Name == "level")?.Value).GetValueOrDefault(0),
                MaxLevel        = f.Value.Max(e => e.Stats.FirstOrDefault(s => s.Name == "level")?.Value).GetValueOrDefault(0)
            }).ToList();


            // this would need updated to support more than 2 factions properly
            var winners = factionInfo.FirstOrDefault(f => f.isWinner);
            var losers  = factionInfo.FirstOrDefault(f => !f.isWinner);

            var cancelExperience = false;

            if (winners.MinLevel < winners.MaxLevel - 5)
            {
                cancelExperience = true;
            }


            var experienceScaler = 1 + (losers.AverageLevel - winners.AverageLevel) * 0.2;
            var experience       = (3 * losers.AverageLevel) * experienceScaler;

            if (!cancelExperience)
            {
                foreach (var winner in winners.FactionEntities)
                {
                    // players and monsters both gain experience the same for now
                    var experienceStat = (BasicStat)winner.Stats.FirstOrDefault(s => s.Name == "experience");
                    await experienceStat?.ApplyAsync(Convert.ToInt32(experience));

                    if (experienceStat != null)
                    {
                        // check if leveled
                        if (experienceStat.Value == experienceStat.Base)
                        {
                            var levelStat = winner.Stats.FirstOrDefault(s => s.Name == "level");
                            await levelStat?.ApplyAsync(1);

                            await experienceStat.RebaseAsync(Convert.ToInt32(experienceStat.Base * 1.5), 0);

                            // fill stats
                            var vitalStats = new List <string>()
                            {
                                "health", "mana", "stamina"
                            };
                            foreach (BasicStat stat in winner.Stats.Where(s => vitalStats.Contains(s.Name)).ToList())
                            {
                                await stat.Fill();
                            }
                        }
                    }
                }
            }



            foreach (var faction in factionInfo)
            {
                var players = faction.FactionEntities.Where(e => e.IsPlayer()).Select(e => e).Distinct();

                if (!players.Any())
                {
                    continue;
                }

                var combatView = MudLikeOperationBuilder.Start($"enc_{encounter.Id}")
                                 .StartContainer($"enc_{encounter.Id}").AddLineBreak();

                foreach (var entity in faction.FactionEntities)
                {
                    var experienceStat = entity.Stats.FirstOrDefault(s => s.Name == "experience");

                    combatView
                    .AddText(entity.Name, (entity.IsAlive && !encounter.Dead.Contains(entity) ? TextColor.Normal : TextColor.Red));
                    if (entity.IsAlive && !encounter.Dead.Contains(entity))
                    {
                        combatView
                        .AddText($" {entity.Stats.FirstOrDefault(s => s.Name == "health")?.Value}", TextColor.Green)
                        .AddText($" {entity.Stats.FirstOrDefault(s => s.Name == "mana")?.Value}", TextColor.Blue)
                        .AddText($" {entity.Stats.FirstOrDefault(s => s.Name == "stamina")?.Value}", TextColor.Yellow)
                        .AddText($" Lv {experienceStat.Value}/{experienceStat.Base}", TextColor.Yellow)
                        ;
                    }
                    else
                    {
                        combatView.AddText(" Dead", TextColor.Red, TextSize.Small);
                    }

                    combatView.AddLineBreak();
                }


                if (faction.isWinner)
                {
                    combatView.AddTextLine($"You earned {experience} experience");
                }
                else
                {
                    combatView.AddTextLine($"You lost the encounter.");
                }

                combatView.EndContainer($"enc_{encounter.Id}");


                var view = MudLikeViewBuilder.Start().AddOperation(combatView.Build()).Build();

                await Game.Network.SendViewCommandsToPlayersAsync(players.Cast <IPlayer>(), view);
            }
        }
        public Task <ICombatAction> GetNextActionAsync(IEncounter encounter)
        {
            GridTargetAction selectedAction = null;


            // what do we want to know in our generic intel?


            // randomly cast a buff? keeping it simple for now just healing and dmg

            // healing

            var hpstat = Entity.Stats.FirstOrDefault(s => s.Name == "health");

            if (hpstat != null)
            {
                if (hpstat.Value < hpstat.Base / 2)
                {
                    var potentialActions = _actionsHeal.Where(action => Entity.CurrentStatsAtLeast(action.Modifiers.Where(m => m.TargetType == ModifierTargetTypes.Caster && m.Min < 0))).ToList();


                    if (potentialActions.Count() > 0)
                    {
                        // how much hp do we need? find the closest heal ...add some factoring of heal to mana cost effeciency later

                        var hpNeeded    = hpstat.Base - hpstat.Value;
                        var differences = potentialActions.Select(action => new { Action = action, Difference = Math.Abs(hpNeeded - action.Modifiers.FirstOrDefault(m => m.Name == "health").Value) });
                        selectedAction = differences.OrderBy(d => d.Difference).FirstOrDefault().Action;
                    }
                }
            }

            // damage
            if (selectedAction == null)
            {
                // pick the hardest hitting health stat we can afford to cast
                // AI cheat boost here by knowing the randomization result of the modifier..
                var potentialActions = _actionsDmg.OrderByDescending(action => Math.Abs(action.Modifiers.FirstOrDefault(m => m.Name == "health").Value));
                foreach (var action in potentialActions)
                {
                    if (_random.Next(1, 101) > 50)
                    {
                        continue;
                    }


                    var consumerMods = action.Modifiers.Where(m => m.TargetType == ModifierTargetTypes.Caster && m.Min < 0).ToList();
                    // can we meet all requirements?

                    var affordable = Entity.CurrentStatsAtLeast(consumerMods);
                    if (affordable)
                    {
                        selectedAction = action;
                        break;
                    }
                }
            }

            // randomly skip the ability altogether to add some feel of variety
            if (_random.Next(1, 101) > 50)
            {
                selectedAction = null;
            }


            if (selectedAction == null && Entity.CurrentStatsAtLeast(_defaultAction.Modifiers.Where(m => m.TargetType == ModifierTargetTypes.Caster)))
            {
                selectedAction = _defaultAction;
            }

            if (selectedAction == null)
            {
                return(Task.FromResult((ICombatAction)null));
            }

            var actionCopy = new GridTargetAction()
            {
                Element = selectedAction.Element, Modifiers = selectedAction.Modifiers.Select(m => (IActionModifier) new GridActionModifier()
                {
                    Name = m.Name, TargetType = m.TargetType, ModifierType = m.ModifierType, Min = m.Min, Max = m.Max
                }).ToList(), Id = selectedAction.Id, Name = selectedAction.Name, TargetType = selectedAction.TargetType
            };


            return(Task.FromResult((ICombatAction)actionCopy));
        }
        public static void setupNewClass(IEncounter inst)
        {
            try
            {
                encounterStarted = true;
                try
                {
                    inController = false;
                    inst.onStartEncounter();
                    inController = true;
                }
                catch (Exception e2)
                {
                    debug("onStartEncounter", getEngineVsEncounter(inst), e2);
                    inController = true;
                }

                try
                {
                    inst.setPhase(1);
                }
                catch (Exception e2)
                {
                    debug("setPhase", getEngineVsEncounter(inst), e2);
                }


                foreach (ActorEntity tmpEnt in _agroList)
                {
                    try
                    {
                        inController = false;
                        inst.onMobAgro(tmpEnt);
                        inController = true;
                    }
                    catch (Exception e2)
                    {
                        debug("onMobAgro", getEngineVsEncounter(inst), e2);
                        inController = true;
                    }
                    try
                    {
                        inst.bossCheck(tmpEnt);
                    }
                    catch (Exception e2)
                    {
                        debug("bossCheck", getEngineVsEncounter(inst), e2);
                    }
                }

                foreach (var KVP in _mobCached)
                {
                    ActorEntity tmpEnt = KVP.Value;
                    try
                    {
                        if (inst == implementationClass)
                        {
                            debug("Added Mob (Setup): " + tmpEnt.Name + " ID: " + tmpEnt.ID + " NPCID1: " + tmpEnt.NPCID1 + " NPCID2: " + tmpEnt.NPCID2, DBMErrorLevel.Trace);
                        }
                        inController = false;
                        inst.onMobAdded(tmpEnt);
                        inController = true;
                    }
                    catch (Exception e2)
                    {
                        debug("onMobAdded", getEngineVsEncounter(inst), e2);
                    }
                }
            }
            catch (Exception ex2)
            {
                debug("setupNewClass error: ", DBMErrorLevel.EngineErrors, ex2);
            }
        }