public override void Process(IBattleEntity attacker, IBattleEntity target) { float hitprobability = MathCore.Sigmoid(attacker.Dexterity - target.Dexterity, 1.1f, GetCenter()); if (RNG.XORShift64.NextFloat() < hitprobability) { long playerid = (target as PlayerBattleEntity)?.PlayerID ?? 0; int gold = Level * 50 + RNG.XORShift64.NextInt(attacker.Level * 15); gold = Math.Min(gold, context.GetModule <PlayerModule>().GetPlayerGold(playerid)); if (gold == 0) { context.GetModule <RPGMessageModule>().Create().BattleActor(attacker).Text(" looks at ").BattleActor(target).Text(" unable to grasp how someone can enter a battle without any ").Gold(0).Text(".").Send(); } else { context.GetModule <PlayerModule>().UpdateGold(playerid, -gold); context.GetModule <RPGMessageModule>().Create().BattleActor(attacker).Text(" steals ").Gold(gold).Text(" from ").BattleActor(target).Text(", throwing it into the next hole while laughing maniacally.").Send(); } } else { context.GetModule <RPGMessageModule>().Create().BattleActor(attacker).Text(" fails to steal ").Gold(0).Text(" from ").BattleActor(target).Text(".").Send(); } }
public override void Process(IBattleEntity attacker, IBattleEntity target) { float hitprobability = MathCore.Sigmoid(GetModifiedDexterity(attacker) - target.Dexterity, 1.1f, 0.7f); context.GetModule <RPGMessageModule>().Create().BattleActor(attacker).Text(" tries to bite ").BattleActor(target).Text(".").Send(); if (RNG.XORShift64.NextFloat() < hitprobability) { target.AddEffect(new PoisonEffect(target, context.GetModule <AdventureModule>(), context.GetModule <RPGMessageModule>()) { Level = Level, Time = 30.0 + 160.0 * Level }); } }
public override void Process(IBattleEntity attacker, IBattleEntity target) { float hitprobability = MathCore.Sigmoid(GetModifiedDexterity(attacker) - target.Dexterity, 1.1f, 0.68f); RPGMessageBuilder message = context.GetModule <RPGMessageModule>().Create().BattleActor(attacker).Text(" tries to bite ").BattleActor(target); if (RNG.XORShift64.NextFloat() < hitprobability) { int hp = Math.Min(target.HP, (int)(target.MaxHP * (0.1 + 0.05 * Level))); message.Text(", sucks on him and heals").Health(attacker.Heal(hp)).Text("."); target.Hit(hp); } else { message.Text(" but fails miserably."); } message.Send(); }
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); }