public override void OnDestroy() { base.OnDestroy(); _skill = null; _message = null; GameMessage.StopListen <SkillMessage>(OnSkillSelected); }
public void EmoteAction(Player player, Player target, Room room, SkillMessage emote) { if (target.ConnectionId == player.ConnectionId) { _writer.WriteLine( $"<p>{ReplacePlaceholders(emote.Hit.ToPlayer, target, true)}</p>", target.ConnectionId); } else { _writer.WriteLine( $"<p>{ReplacePlaceholders(emote.Hit.ToPlayer, target, false)}</p>", player.ConnectionId); } if (!string.IsNullOrEmpty(emote.Hit.ToTarget)) { _writer.WriteLine( $"<p>{emote.Hit.ToTarget}</p>", target.ConnectionId); } foreach (var pc in room.Players) { if (pc.ConnectionId.Equals(player.ConnectionId) || pc.ConnectionId.Equals(target.ConnectionId)) { continue; } _writer.WriteLine($"<p>{ReplacePlaceholders(emote.Hit.ToRoom, target, false)}</p>", pc.ConnectionId); } }
public int Slash(Player player, Player target, Room room, string obj) { if (player.Equipped.Wielded == null) { _writer.WriteLine("Slash with what?", player.ConnectionId); } var weaponDam = player.Equipped.Wielded?.Damage.Maximum ?? 1 * 2; var str = player.Attributes.Attribute[EffectLocation.Strength]; var damage = weaponDam + _dice.Roll(1, 2, 10) + str / 5; /*dexterity check */ var chance = 50; chance += player.Attributes.Attribute[EffectLocation.Dexterity]; chance -= target.Attributes.Attribute[EffectLocation.Dexterity]; if (player.Affects.Haste) { chance += 10; } if (target.Affects.Haste) { chance -= 25; } /* level check */ chance += player.Level - target.Level; /* TODO: terrain check, can't dirt kick underwater *taps head* */ /* Check if player is flying/floating then fail dirt kick */ if (_dice.Roll(1, 1, 100) < chance) { _skillManager.DamagePlayer("slash", damage, player, target, room); player.Lag += 1; _skillManager.updateCombat(player, target, room); } else { var skillMessageMiss = new SkillMessage() { Hit = { ToPlayer = $"You try to slash {target.Name} and miss.", ToRoom = $"{player.Name} tries to slash {target.Name} but {target.Name} easily avoids it.", ToTarget = $"{player.Name} tries to slash you but misses." } }; _skillManager.EmoteAction(player, target, room, skillMessageMiss); } return(damage); }
public int Trip(Player player, Player target, Room room) { var str = player.Attributes.Attribute[EffectLocation.Strength]; var damage = _dice.Roll(1, 1, 4) + str / 5; var skillMessage = new SkillMessage() { Hit = { ToPlayer = $"You trip {target.Name} and {target.Name} goes down!", ToRoom = $"{player.Name} trips {target.Name} and {target.Name} goes down!", ToTarget = $"{player.Name} trips you and you go down!" }, Miss = { ToPlayer = $"You trip {target.Name} and {target.Name} goes down!", ToRoom = $"{player.Name} trips {target.Name} and {target.Name} goes down!", ToTarget = $"{player.Name} trips you and you go down!" } }; if (target.Lag == 0) { _skillManager.EmoteAction(player, target, room, skillMessage); _skillManager.DamagePlayer("trip", damage, player, target, room); player.Lag += 1; target.Lag += 2; target.Status = CharacterStatus.Status.Stunned; _skillManager.updateCombat(player, target, room); } else { player.Lag += 1; var skillMessageMiss = new SkillMessage() { Hit = { ToPlayer = $"You try to trip {target.Name} and miss.", ToRoom = $"{player.Name} tries to trip {target.Name} but {target.Name} easily avoids it.", ToTarget = $"{player.Name} tries to trip you but fails." }, Miss = { ToPlayer = $"You try to trip {target.Name} and miss.", ToRoom = $"{player.Name} tries to trip {target.Name} but {target.Name} easily avoids it.", ToTarget = $"{player.Name} tries to trip you but fails." } }; _skillManager.EmoteAction(player, target, room, skillMessageMiss); } return(damage); }
private void OnSkillSelected(SkillMessage value) { Outline.enabled = _skill.Index == value.Index; if (Outline.enabled) { SetState(value.State); } }
public int UpperCut(Player player, Player target, Room room, string obj) { var str = player.Attributes.Attribute[EffectLocation.Strength]; var damage = _dice.Roll(1, 1, 6) + str / 5; _skillManager.DamagePlayer("uppercut", damage, player, target, room); var helmet = target.Equipped.Head; var chance = _dice.Roll(1, 1, 100); if (helmet != null) { if (chance <= 15) { room.Items.Add(helmet); target.Equipped.Head = null; var skillMessage = new SkillMessage() { Hit = { ToPlayer = $"Your uppercut knocks{helmet.Name.ToLower()} off {target.Name}'s head.", ToRoom = $"{player.Name} knocks {helmet.Name.ToLower()} off {target.Name}'s head.", ToTarget = $"{player.Name} knocks {helmet.Name.ToLower()} off your head." } }; _skillManager.EmoteAction(player, target, room, skillMessage); } } else { if (chance <= 15) { var skillMessage = new SkillMessage() { Hit = { ToPlayer = $"Your uppercut stuns {target.Name}.", ToRoom = $"{player.Name}'s uppercut stuns {target.Name}.", ToTarget = $"{player.Name}'s uppercut stuns you!" } }; _skillManager.EmoteAction(player, target, room, skillMessage); target.Lag += 2; } } player.Lag += 1; _skillManager.updateCombat(player, target, room); return(damage); }
public int Mount(Player player, Player target, Room room) { if (!string.IsNullOrEmpty(player.Mounted.Name)) { _writer.WriteLine($"You are already riding a mount called {player.Mounted.Name}", player.ConnectionId); return(0); } if (!string.IsNullOrEmpty(target.Mounted.MountedBy) && target.Mounted.MountedBy != player.Name) { _writer.WriteLine($"This mount is ridden by {target.Mounted.MountedBy}", player.ConnectionId); return(0); } if (!string.IsNullOrEmpty(player.Mounted.Name) && target.Name != player.Mounted.Name) { _writer.WriteLine($"You must dismount {player.Mounted.Name} first.", player.ConnectionId); return(0); } if (!target.Mounted.IsMount) { _writer.WriteLine($"{target.Name} is not a mount.", player.ConnectionId); return(0); } var skillMessage = new SkillMessage() { Hit = { ToPlayer = $"You jump upon {target.Name}.", ToRoom = $"{player.Name} jumps upon {target.Name}.", ToTarget = $"" } }; target.Mounted.MountedBy = player.Name; player.Mounted.Name = target.Name; player.Pets.Add(target); _skillManager.EmoteAction(player, target, room, skillMessage); _updateClientUi.UpdateScore(player); return(0); }
public void CauseAffect() { var action = new SkillMessage(_writer); if (_skillTarget.Skill.Effect.Modifier.PositiveEffect) { _skillTarget.Target.Attributes.Attribute[_skillTarget.Skill.Effect.Location] += _value; } else { _skillTarget.Target.Attributes.Attribute[_skillTarget.Skill.Effect.Location] -= _value; } }
public void CureLightWounds(Player player, Player target, Room room) { var casterLevel = player.Level > 10 ? 5 : player.Level; var value = _dice.Roll(1, 1, 4) + 1 + casterLevel / 4; var skillMessage = new SkillMessage() { NoEffect = new Messages() { ToPlayer = "#target# is at full health." }, Hit = new Messages() { ToPlayer = "#target# looks better!", ToTarget = "You feel better.", ToRoom = "#target# looks better!" }, Death = new Messages(), Miss = new Messages() }; var skillMessageNoEffect = new SkillMessage() { NoEffect = new Messages(), Hit = new Messages() { ToPlayer = "#target# is at full health.", ToTarget = "You are at full health.", ToRoom = "#target# is at full health." }, Death = new Messages(), Miss = new Messages() }; var hasAffcted = _skillManager.AffectPlayerAttributes("Cure light wounds", EffectLocation.Hitpoints, value, player, target, room, skillMessage.NoEffect.ToPlayer); if (hasAffcted) { _skillManager.EmoteAction(player, target, room, skillMessage); _skillManager.UpdateClientUI(target); } else { _skillManager.EmoteAction(player, target, room, skillMessageNoEffect); _skillManager.UpdateClientUI(target); } _skillManager.UpdateClientUI(player); }
private void OnSkillMessage(SkillMessage value) { _message.Index = value.Index; if (_unit.Skills.ContainsKey(value.Index)) { UnlockButton.interactable = false; ChooseButton.interactable = true; } else { UnlockButton.interactable = true; ChooseButton.interactable = false; } }
public void EmoteEffectWearOffAction(Player player, Room room, SkillMessage emote) { foreach (var pc in room.Players) { if (pc.ConnectionId.Equals(player.ConnectionId)) { _writer.WriteLine($"<p>{emote.EffectWearOff.ToPlayer}</p>", pc.ConnectionId); continue; } _writer.WriteLine($"<p>{ReplacePlaceholders(emote.EffectWearOff.ToRoom, player, false)}</p>", pc.ConnectionId); } }
public void CauseAffect() { var action = new SkillMessage(_writer); action.DisplayActionToUser(_skillTarget.Skill.LevelBasedMessages, _skillTarget.Skill.SkillAction, _skillTarget.Origin.Level); if (_skillTarget.Skill.Effect.Modifier.PositiveEffect) { _skillTarget.Target.Attributes.Attribute[_skillTarget.Skill.Effect.Location] += _value; } else { _skillTarget.Target.Attributes.Attribute[_skillTarget.Skill.Effect.Location] -= _value; } }
public int WarCry(Player player, Player target, Room room) { if (player.Affects.Custom.FirstOrDefault(x => x.Name.Equals("War Cry")) != null) { _writer.WriteLine("You are already affected by War Cry.", player.ConnectionId); return(0); } var skillMessage = new SkillMessage() { Hit = { ToPlayer = $"You scream a loud war cry.", ToRoom = $"{player.Name} screams a loud war cry.", ToTarget = $"" } }; _skillManager.EmoteAction(player, target, room, skillMessage); var affect = new Affect() { Duration = player.Level + player.Level / 5, Modifier = new Modifier() { DamRoll = 3, Armour = -2 }, Affects = DefineSpell.SpellAffect.Berserk, Name = "War Cry" }; player.Affects.Custom.Add(affect); Helpers.ApplyAffects(affect, player); _updateClientUi.UpdateScore(player); _updateClientUi.UpdateMoves(player); _updateClientUi.UpdateHP(player); _updateClientUi.UpdateAffects(player); _updateClientUi.UpdateExp(player); return(0); }
public void Bless(Player player, Player target, Room room, bool wearOff) { var skillMessage = new SkillMessage() { NoEffect = new Messages(), Hit = new Messages() { ToPlayer = "You lay the blessing of your god upon #target#", ToTarget = "A powerful blessing is laid upon you.", ToRoom = "#caster# beams as a powerful blessing is laid upon #target#." }, Death = new Messages(), Miss = new Messages(), EffectWearOff = new Messages() { ToPlayer = "The blessing fades away.", ToRoom = "#target#'s blessing fades away." } }; var affect = target.Affects.Custom.FirstOrDefault(x => x.Name.Equals("Bless", StringComparison.CurrentCultureIgnoreCase)); if (wearOff) { target.ArmorRating.Armour -= 20; target.Attributes.Attribute[EffectLocation.DamageRoll] -= 20; target.Affects.Custom.Remove(affect); _skillManager.EmoteEffectWearOffAction(player, room, skillMessage); _updateClientUi.UpdateAffects(player); _updateClientUi.UpdateScore(player); return; } var skill = new AllSpells().Armour(); target = _skillManager.GetValidTarget(player, target, skill.ValidTargets); //create emote effectWear off message _skillManager.EmoteAction(player, target, room, skillMessage); if (affect == null) { var newAffect = new Affect() { Modifier = new Modifier() { Armour = 10, DamRoll = 10, }, Benefits = "Affects armour by 20\r\n Affects Dam by 10", Affects = DefineSpell.SpellAffect.ArmorClass, Duration = player.Level + player.Attributes.Attribute[EffectLocation.Intelligence] / 2, Name = "Bless", }; target.Affects.Custom.Add(newAffect); Helpers.ApplyAffects(newAffect, target); } else { affect.Duration = player.Level + player.Attributes.Attribute[EffectLocation.Intelligence] / 2; } _updateClientUi.UpdateAffects(target); _updateClientUi.UpdateScore(target); _updateClientUi.UpdateScore(player); }
public int Disarm(Player player, Player target, Room room, string obj) { if (string.IsNullOrEmpty(player.Target)) { _writer.WriteLine("You are not fighting anyone.", player.ConnectionId); return(0); } if (player.Equipped.Wielded == null) { _writer.WriteLine("You must wield a weapon to disarm.", player.ConnectionId); return(0); } if (target.Equipped.Wielded == null) { _writer.WriteLine("Your opponent is not wielding a weapon.", player.ConnectionId); return(0); } var playerWeaponSkill = Helpers.GetWeaponSkill(player.Equipped.Wielded, player); var targetWeaponSkill = Helpers.GetWeaponSkill(target.Equipped.Wielded, target); var playerSkillOfTargetsWeapon = Helpers.GetWeaponSkill(target.Equipped.Wielded, player); var chance = playerWeaponSkill; chance += (playerSkillOfTargetsWeapon - targetWeaponSkill) / 2; /* dex vs. strength */ chance += player.Attributes.Attribute[EffectLocation.Dexterity]; chance -= target.Attributes.Attribute[EffectLocation.Strength]; chance += (player.Level - target.Level) * 2; if (player.Affects.Haste) { chance += 10; } if (target.Affects.Haste) { chance -= 25; } var hasGrip = target.Skills.FirstOrDefault(x => x.SkillName.Equals("grip", StringComparison.CurrentCultureIgnoreCase)); var gripChance = _dice.Roll(1, 1, 100); if (hasGrip != null) { if (gripChance <= hasGrip.Proficiency) { chance -= 20; } else { _gain.GainSkillExperience(target, hasGrip.Level * 100, hasGrip, _dice.Roll(1, 1, 5)); } } if (_dice.Roll(1, 1, 100) < chance) { if ((target.Equipped.Wielded.ItemFlag & Item.Item.ItemFlags.Noremove) != 0) { var skillMessageNoRemove = new SkillMessage() { Hit = { ToPlayer = $"{target.Name}'s weapon won't budge!", ToRoom = $"{player.Name} tries to disarm {target.Name}, but fails.", ToTarget = $"{player.Name} tries to disarm you, but your weapon won't budge!" } }; _skillManager.EmoteAction(player, target, room, skillMessageNoRemove); return(0); } var skillMessage = new SkillMessage() { Hit = { ToPlayer = $"You disarm {target.Name}!", ToRoom = $"{player.Name} disarms {target.Name}!", ToTarget = $"{player.Name} DISARMS you and sends your weapon flying!" } }; _skillManager.EmoteAction(player, target, room, skillMessage); room.Items.Add(target.Equipped.Wielded); target.Equipped.Wielded = null; } else { var skillMessage = new SkillMessage() { Hit = { ToPlayer = $"You fail to disarm {target.Name}.", ToRoom = $"{player.Name} tries to disarm {target.Name}, but fails.", ToTarget = $"{player.Name} tries to disarm you, but fails." } }; _skillManager.EmoteAction(player, target, room, skillMessage); } player.Lag += 1; return(0); }
public void Armor(Player player, Player target, Room room, bool wearOff) { var skillMessage = new SkillMessage() { NoEffect = new Messages() { ToPlayer = "A protective white light engulfs #target#." }, Hit = new Messages() { ToPlayer = "#target# is engulfed by a protective white light.", ToTarget = "You feel protected.", ToRoom = "A protective white light engulfs #target#." }, Death = new Messages(), Miss = new Messages(), EffectWearOff = new Messages() { ToPlayer = "Your protective white light fades away.", ToRoom = "#target#'s protective white light fades away." } }; var affect = target.Affects.Custom.FirstOrDefault(x => x.Name.Equals("Armour", StringComparison.CurrentCultureIgnoreCase)); if (wearOff) { player.ArmorRating.Armour -= 20; target.Affects.Custom.Remove(affect); _skillManager.EmoteEffectWearOffAction(player, room, skillMessage); _updateClientUi.UpdateAffects(player); _updateClientUi.UpdateScore(player); return; } var skill = new AllSpells().Armour(); target = _skillManager.GetValidTarget(player, target, skill.ValidTargets); //create emote effectWear off message _skillManager.EmoteAction(player, target, room, skillMessage); if (affect == null) { var newAffect = new Affect() { Modifier = new Modifier() { Armour = 20 }, Benefits = "Affects armour by 20", Affects = DefineSpell.SpellAffect.ArmorClass, Duration = player.Level + player.Attributes.Attribute[EffectLocation.Intelligence] / 2, Name = "Armour", }; target.Affects.Custom.Add(newAffect); Helpers.ApplyAffects(newAffect, target); } else { affect.Duration = player.Level + player.Attributes.Attribute[EffectLocation.Intelligence] / 2; } _updateClientUi.UpdateAffects(target); _updateClientUi.UpdateScore(target); _updateClientUi.UpdateScore(player); }
public int ShieldBash(Player player, Player target, Room room, string obj) { if (player.Equipped.Shield == null) { _writer.WriteLine("You need a shield before you can bash", player.ConnectionId); return(0); } /*dexterity check */ var chance = 50; chance += player.Attributes.Attribute[EffectLocation.Strength]; chance -= target.Attributes.Attribute[EffectLocation.Dexterity]; if (player.Affects.Haste) { chance += 10; } if (target.Affects.Haste) { chance -= 25; } if (target.Weight > player.Weight) { chance -= 10; } else { chance += 5; } if (target.Equipped.Shield != null) { chance += 15; } /* level check */ chance += player.Level - target.Level; var weaponDam = player.Equipped.Shield != null ? player.Equipped.Shield.ArmourRating.Armour : 1 * 2; var str = player.Attributes.Attribute[EffectLocation.Strength]; var damage = _dice.Roll(3, 1, 6) + str / 5 + weaponDam; if (_dice.Roll(1, 1, 100) < chance) { var skillMessage = new SkillMessage() { Hit = { ToPlayer = $"You lift your shield and smash it at {target.Name}", ToRoom = $"{player.Name} lifts {Helpers.GetPronoun(player.Gender)} shield and smashes it at {target.Name}!", ToTarget = $"{player.Name} lifts {Helpers.GetPronoun(player.Gender)} shield and smashes it at you!" } }; _skillManager.EmoteAction(player, target, room, skillMessage); _skillManager.DamagePlayer("shield bash", damage, player, target, room); target.Lag += 3; } else { var skillMessage = new SkillMessage() { Hit = { ToPlayer = $"You lift your shield and swing it at {target.Name} but miss.", ToRoom = $"{player.Name} lifts {Helpers.GetPronoun(player.Gender)} shield and swings it at {target.Name} but misses.", ToTarget = $"{player.Name} lifts {Helpers.GetPronoun(player.Gender)} shield and swings it at you but you avoid it easily." } }; _skillManager.EmoteAction(player, target, room, skillMessage); player.Lag += 2; } player.Lag += 1; _skillManager.updateCombat(player, target, room); return(0); }
public int DirtKick(Player player, Player target, Room room, string obj) { if (target.Affects.Blind) { _writer.WriteLine($"{target.Name} has already been blinded.", player.ConnectionId); } /*dexterity check */ var chance = 50; chance += player.Attributes.Attribute[EffectLocation.Dexterity]; chance -= target.Attributes.Attribute[EffectLocation.Dexterity] / 2; if (player.Affects.Haste) { chance += 10; } if (target.Affects.Haste) { chance -= 25; } /* level check */ chance += player.Level - target.Level; /* TODO: terrain check, can't dirt kick underwater *taps head* */ /* Check if player is flying/floating then fail dirt kick */ if (_dice.Roll(1, 1, 100) < chance) { var skillMessage = new SkillMessage() { Hit = { ToPlayer = $"You kick dirt in {target.Name}'s eyes!", ToRoom = $"{player.Name} kicks dirt into {target.Name}'s eyes!", ToTarget = $"{player.Name} kicks dirt into your eyes!" } }; _skillManager.EmoteAction(player, target, room, skillMessage); _writer.WriteLine("You can't see a thing!", target.ConnectionId); target.Affects.Blind = true; var affect = new Affect() { Duration = 2, Modifier = new Modifier() { Dexterity = -4, HitRoll = -4 }, Affects = DefineSpell.SpellAffect.Blind, Name = "Blindness from dirt kick" }; target.Affects.Custom.Add(affect); Helpers.ApplyAffects(affect, target); } else { var skillMessage = new SkillMessage() { Hit = { ToPlayer = $"You kick dirt but {target.Name} shuts his eyes in time.", ToRoom = $"{player.Name} tries to kick dirt in {target.Name} eyes.", ToTarget = $"{player.Name} tries to kick dirt into your eyes." } }; _skillManager.EmoteAction(player, target, room, skillMessage); } player.Lag += 1; _skillManager.updateCombat(player, target, room); _updateClientUi.UpdateScore(player); _updateClientUi.UpdateMoves(player); _updateClientUi.UpdateHP(player); _updateClientUi.UpdateAffects(target); _updateClientUi.UpdateExp(player); return(0); }
public int Lunge(Player player, Player target, Room room, string obj) { /*dexterity check */ var chance = 50; chance += player.Attributes.Attribute[EffectLocation.Strength]; chance -= target.Attributes.Attribute[EffectLocation.Dexterity]; if (player.Affects.Haste) { chance += 10; } if (target.Affects.Haste) { chance -= 25; } /* level check */ chance += player.Level - target.Level; var weaponDam = player.Equipped.Wielded != null ? player.Equipped.Wielded.Damage.Maximum : 1 * 2; var str = player.Attributes.Attribute[EffectLocation.Strength]; var damage = _dice.Roll(3, 1, 6) + str / 5 + weaponDam; if (_dice.Roll(1, 1, 100) < chance) { var skillMessage = new SkillMessage() { Hit = { ToPlayer = $"You lunge at {target.Name}", ToRoom = $"{player.Name} lunges at {target.Name}!", ToTarget = $"{player.Name} lunges at you!" } }; player.Lag += 1; _skillManager.EmoteAction(player, target, room, skillMessage); _skillManager.DamagePlayer("lunge", damage, player, target, room); } else { var skillMessage = new SkillMessage() { Hit = { ToPlayer = $"You lunge at {target.Name} but miss.", ToRoom = $"{player.Name} lunges at {target.Name} but misses.", ToTarget = $"{player.Name}lunges at you but you avoid it easily." } }; _skillManager.EmoteAction(player, target, room, skillMessage); player.Lag += 2; } _skillManager.updateCombat(player, target, room); return(0); }
public int Rescue(Player player, Player target, Room room, string obj) { if (target == null) { _writer.WriteLine("Rescue whom?", player.ConnectionId); return(0); } if (player.Followers.FirstOrDefault(x => x.Name.Equals(target.Name)) == null) { _writer.WriteLine("You can only rescue those in your group.", player.ConnectionId); return(0); } if ((target.Status & CharacterStatus.Status.Fighting) == 0) { _writer.WriteLine($"{target.Name} is not fighting right now.", player.ConnectionId); return(0); } if (target == player) { _writer.WriteLine("What about fleeing instead?", player.ConnectionId); return(0); } var foundSkill = player.Skills .FirstOrDefault(x => x.SkillName.Equals("Rescue", StringComparison.CurrentCultureIgnoreCase)); var chance = foundSkill .Proficiency; if (_dice.Roll(1, 1, 100) < chance) { player.Target = target.Target; target.Target = string.Empty; target.Status = CharacterStatus.Status.Standing; var findTarget = Helpers.FindMob(Helpers.findNth($"{player.Target}"), room) ?? Helpers.FindPlayer(Helpers.findNth($"{player.Target}"), room); findTarget.Target = player.Name; var skillMessage = new SkillMessage() { Hit = { ToPlayer = $"You rescue {target.Name}!", ToRoom = $"{player.Name} rescues {target.Name}!", ToTarget = $"{player.Name} rescues you!" } }; _skillManager.EmoteAction(player, target, room, skillMessage); _skillManager.updateCombat(player, findTarget, room); return(0); } var increase = _dice.Roll(1, 1, 5); _gain.GainExperiencePoints(player, 100 * foundSkill.Level / 4, false); _updateClientUi.UpdateExp(player); _writer.WriteLine( $"<p class='improve'>You learn from your mistakes and gain {100 * foundSkill.Level / 4} experience points.</p>" + $"<p class='improve'>Your knowledge of {foundSkill.SkillName} increases by {increase}%.</p>", player.ConnectionId, 0); return(0); }
public int HamString(Player player, Player target, Room room, string obj) { /*dexterity check */ var chance = 50; chance += player.Attributes.Attribute[EffectLocation.Strength]; chance -= target.Attributes.Attribute[EffectLocation.Dexterity]; if (player.Affects.Haste) { chance += 10; } if (target.Affects.Haste) { chance -= 25; } /* level check */ chance += player.Level - target.Level; var weaponDam = player.Equipped.Wielded != null ? player.Equipped.Wielded.Damage.Maximum : 1 * 2; var str = player.Attributes.Attribute[EffectLocation.Strength]; var damage = _dice.Roll(2, 1, 6) + str / 5 + weaponDam; if (_dice.Roll(1, 1, 100) < chance) { var skillMessage = new SkillMessage() { Hit = { ToPlayer = $"You slash the back of {target.Name}'s legs.", ToRoom = $"{player.Name} slashes the back of {target.Name}'s legs!", ToTarget = $"{player.Name} slashes the back of your legs!" } }; _skillManager.EmoteAction(player, target, room, skillMessage); _skillManager.DamagePlayer("hamstring slash", damage, player, target, room); target.Attributes.Attribute[EffectLocation.Moves] -= target.Attributes.Attribute[EffectLocation.Moves] / 2; if (target.Attributes.Attribute[EffectLocation.Moves] < 0) { target.Attributes.Attribute[EffectLocation.Moves] = 0; } } else { var skillMessage = new SkillMessage() { Hit = { ToPlayer = $"You try to slash the back of {target.Name}'s legs but miss.", ToRoom = $"{player.Name} tries to slash the back of {target.Name}'s legs. but misses", ToTarget = $"{player.Name} tries to slash the back of your legs but misses." } }; _skillManager.EmoteAction(player, target, room, skillMessage); player.Lag += 3; } player.Lag += 2; _skillManager.updateCombat(player, target, room); return(0); }
public int Berserk(Player player, Player target, Room room) { if (player.Affects.Berserk) { _writer.WriteLine("You get a little madder", player.ConnectionId); return(0); } if (player.Attributes.Attribute[EffectLocation.Moves] < 50) { _writer.WriteLine("You can't get up enough energy.", player.ConnectionId); return(0); } /* below 50% of hp helps, above hurts */ var foundSkill = player.Skills .FirstOrDefault(x => x.SkillName.Equals("Berserk", StringComparison.CurrentCultureIgnoreCase)); if (foundSkill != null) { var chance = foundSkill .Proficiency; chance += (player.Status & CharacterStatus.Status.Fighting) != 0 ? 10 : 1; var hpPercent = 100 * player.Attributes.Attribute[EffectLocation.Hitpoints] / player.MaxAttributes.Attribute[EffectLocation.Hitpoints]; chance += 25 - hpPercent / 2; if (_dice.Roll(1, 1, 100) < chance) { target.Affects.Berserk = true; var affect = new Affect() { Duration = 4 + player.Level / 5, Modifier = new Modifier() { DamRoll = 4 + player.Level / 5, HitRoll = 4 + player.Level / 8, Armour = 4 + player.Level / 5 }, Affects = DefineSpell.SpellAffect.Berserk, Name = "Berserk" }; target.Affects.Custom.Add(affect); Helpers.ApplyAffects(affect, player); player.Attributes.Attribute[EffectLocation.Moves] = player.Attributes.Attribute[EffectLocation.Moves] /= 2; player.Attributes.Attribute[EffectLocation.Hitpoints] += player.Level * 2; var skillMessage = new SkillMessage() { Hit = { ToPlayer = "Your pulse races as you are consumed by rage!", ToRoom = $"{player.Name} gets a wild look in {Helpers.GetPronoun(player.Gender)} eyes.", ToTarget = "" } }; _skillManager.EmoteAction(player, target, room, skillMessage); } else { _writer.WriteLine("Your pulse speeds up, but nothing happens", target.ConnectionId); player.Attributes.Attribute[EffectLocation.Moves] = player.Attributes.Attribute[EffectLocation.Moves] /= 4; var increase = _dice.Roll(1, 1, 5); foundSkill.Proficiency += increase; _gain.GainExperiencePoints(player, 100 * foundSkill.Level / 4, false); _updateClientUi.UpdateExp(player); _writer.WriteLine( $"<p class='improve'>You learn from your mistakes and gain {100 * foundSkill.Level / 4} experience points.</p>" + $"<p class='improve'>Your knowledge of {foundSkill.SkillName} increases by {increase}%.</p>", player.ConnectionId, 0); } } player.Lag += 1; _updateClientUi.UpdateScore(player); _updateClientUi.UpdateMoves(player); _updateClientUi.UpdateHP(player); _updateClientUi.UpdateAffects(player); _updateClientUi.UpdateExp(player); return(0); }