Ejemplo n.º 1
0
 //--- Methods ---
 public void Reset(string currentPlaceId)
 {
     Status         = AdventureStatus.New;
     Start          = DateTime.UtcNow;
     End            = null;
     CurrentPlaceId = currentPlaceId;
 }
Ejemplo n.º 2
0
        public void ChangeStatus(string service, string username, AdventureStatus status)
        {
            User user = context.GetModule <UserModule>().GetUser(service, username);

            lock (adventurerlock)
                ChangeStatus(adventurers.FirstOrDefault(a => a.Player == user.ID), status);
        }
Ejemplo n.º 3
0
        void ITimerService.Process(double time)
        {
            toprocess.Clear();
            lock (adventurerlock) {
                adventurers.ForEach(a => a.Cooldown -= time);
                toprocess.AddRange(adventurers.Where(a => a.Cooldown <= 0.0));

                foreach (Adventure adventure in toprocess)
                {
                    AdventureStatus newstatus = adventure.AdventureLogic.ProcessPlayer(adventure.Player);
                    ChangeStatus(adventure, newstatus);
                }
            }
        }
Ejemplo n.º 4
0
        public void ChangeStatus(Adventure adventure, AdventureStatus status, object argument = null)
        {
            if (adventure.AdventureLogic.Status != status)
            {
                switch (status)
                {
                case AdventureStatus.Exploration:
                    adventure.AdventureLogic = explorationlogic;
                    break;

                case AdventureStatus.MonsterBattle:
                    if (argument != null)
                    {
                        MonsterBattleLogic battlelogic = new MonsterBattleLogic(context.GetModule <RPGMessageModule>());
                        battlelogic.Add(new PlayerBattleEntity(context, adventure.Player, adventure, battlelogic));
                        battlelogic.Add(new MonsterBattleEntity(context.GetModule <MonsterModule>().GetMonster((string)argument, context.GetModule <PlayerModule>().GetExistingPlayer(adventure.Player).Level), context, adventure, battlelogic));
                        adventure.AdventureLogic = battlelogic;
                    }
                    else
                    {
                        MonsterBattleLogic battlelogic = new MonsterBattleLogic(context.GetModule <RPGMessageModule>());
                        battlelogic.Add(new PlayerBattleEntity(context, adventure.Player, adventure, battlelogic));
                        battlelogic.Add(new MonsterBattleEntity(context.GetModule <MonsterModule>().GetMonster(context.GetModule <PlayerModule>().GetExistingPlayer(adventure.Player).Level), context, adventure, battlelogic));
                        adventure.AdventureLogic = battlelogic;
                    }
                    break;

                case AdventureStatus.SpiritRealm:
                    context.GetModule <EffectModule>().ClearPlayerEffects(adventure.Player);
                    adventure.AdventureLogic = new SpiritRealmLogic(context);
                    break;
                }
                PlayerStatusChanged?.Invoke(adventure.Player, status);
            }
            adventure.Reset();
        }
Ejemplo n.º 5
0
 //--- Methods ---
 public void Reset(string currentPlaceId)
 {
     Status         = AdventureStatus.New;
     CurrentPlaceId = currentPlaceId;
 }
Ejemplo n.º 6
0
 //--- Methods ---
 public void Reset(string currentPlaceId)
 {
     Status         = AdventureStatus.New;
     CurrentPlaceId = currentPlaceId;
     StartTime      = DateTime.Now;
 }
Ejemplo n.º 7
0
        public AdventureStatus ProcessPlayer(long playerid)
        {
            IBattleEntity attacker;
            IBattleEntity target;

            lock (actors) {
                if (actors.Count < 2)
                {
                    return(AdventureStatus.Exploration);
                }

                foreach (IBattleEntity entity in actors)
                {
                    entity.Refresh();
                }


                attacker = actors[actor];
                actor    = (actor + 1) % actors.Count;
                target   = actors[actor];
            }

            RPGMessageBuilder message = messages?.Create();

            foreach (IBattleEffect effect in attacker.Effects.Where(t => t is IBattleEffect && ((IBattleEffect)t).Type == BattleEffectType.Persistent).Cast <IBattleEffect>())
            {
                EffectResult result = effect.ProcessEffect(attacker, target);
                if (result.Type == EffectResultType.CancelAttack)
                {
                    return(AdventureStatus.MonsterBattle);
                }

                AdventureStatus status = ProcessEffectResult(result, attacker, target, message);
                if (status != AdventureStatus.MonsterBattle)
                {
                    message?.Send();
                    attacker.CleanUp();
                    target.CleanUp();
                    return(status);
                }
            }

            MonsterSkill skill = (attacker as MonsterBattleEntity)?.DetermineSkill();

            if (skill != null)
            {
                skill.Process(attacker, target);
                AdventureStatus status = CheckStatus(attacker, target, message);
                message?.Send();
                return(status);
            }

            float           hitprobability = MathCore.Sigmoid(attacker.Dexterity - target.Dexterity, 1.1f, 0.7f);
            float           dice           = RNG.XORShift64.NextFloat();
            AdventureStatus returnstatus   = AdventureStatus.MonsterBattle;

            if (dice < hitprobability)
            {
                bool hit = true;
                foreach (IBattleEffect effect in target.Effects.Where(t => (t as IBattleEffect)?.Type == BattleEffectType.Defense).Cast <IBattleEffect>())
                {
                    if (effect.ProcessEffect(attacker, target).Type == EffectResultType.CancelAttack)
                    {
                        hit = false;
                        break;
                    }
                }

                if (hit)
                {
                    bool damagecritical = attacker.WeaponOptimum > 0 && RNG.XORShift64.NextFloat() < (float)attacker.Luck / attacker.WeaponOptimum;
                    bool armorcritical  = target.ArmorOptimum > 0 && RNG.XORShift64.NextFloat() < (float)target.Luck / target.ArmorOptimum;

                    int power = damagecritical ? attacker.Power * 2 : attacker.Power;
                    int armor = armorcritical ? target.Defense * 2 : target.Defense;

                    int damage = (int)Math.Max(0, (power - armor) * (0.5f + 0.5f * dice / hitprobability));
                    if (damage <= 0)
                    {
                        message?.BattleActor(target);
                        if (armorcritical)
                        {
                            message?.Bold();
                        }

                        message?.Text(" deflects ").Reset().BattleActor(attacker).Text("'s attack.");
                        target.Hit(0);
                    }
                    else
                    {
                        message?.BattleActor(attacker);
                        if (damagecritical)
                        {
                            message?.Bold();
                        }

                        message?.Text(armorcritical ? " clashes with " : " hits ");
                        message?.Reset().BattleActor(target).Text(" for ").Damage(damage).Text(".");

                        IBattleEffect effect = attacker.Effects.FirstOrDefault(e => e is ShittyWeaponEffect) as IBattleEffect;
                        ProcessEffectResult(effect?.ProcessEffect(attacker, target), attacker, target, message);

                        target.Hit(damage);
                        returnstatus = CheckStatus(attacker, target, message);
                        if (returnstatus == AdventureStatus.MonsterBattle)
                        {
                            if (target is PlayerBattleEntity)
                            {
                                message?.Text(" ").BattleActor(target).Text(" has ").Health(target.HP).Text(" left.");
                            }
                        }
                        else
                        {
                            attacker.CleanUp();
                            target.CleanUp();
                        }
                    }
                }
            }
            else
            {
                message?.BattleActor(attacker).Text(" attacks ").BattleActor(target).Text(" but ").Color(AdventureColors.Miss).Text("misses").Reset().Text(".");
            }

            message?.Send();
            return(returnstatus);
        }