本文整理汇总了C#中MUDEngine.CharData.PracticeSkill方法的典型用法代码示例。如果您正苦于以下问题:C# CharData.PracticeSkill方法的具体用法?C# CharData.PracticeSkill怎么用?C# CharData.PracticeSkill使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类MUDEngine.CharData
的用法示例。
在下文中一共展示了CharData.PracticeSkill方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: CheckShieldBlock
/// <summary>
/// Checks for block if holding shield.
/// </summary>
/// <param name="ch"></param>
/// <param name="victim"></param>
/// <returns></returns>
static bool CheckShieldBlock( CharData ch, CharData victim )
{
if( !victim.HasSkill( "shield block" ) )
return false;
if( ch.IsAffected( Affect.AFFECT_DAZZLE ) )
return false;
if( !victim.IsAwake() || victim.CurrentPosition < Position.reclining )
return false;
Object obj = Object.GetEquipmentOnCharacter( victim, ObjTemplate.WearLocation.hand_one );
if( !obj || ( obj.ItemType != ObjTemplate.ObjectType.shield ) )
{
if( !( obj = Object.GetEquipmentOnCharacter( victim, ObjTemplate.WearLocation.hand_two ) ) )
return false;
if( obj.ItemType != ObjTemplate.ObjectType.shield )
return false;
}
if( obj.ItemType != ObjTemplate.ObjectType.shield )
{
if( !( obj = Object.GetEquipmentOnCharacter( victim, ObjTemplate.WearLocation.hand_two ) ) )
return false;
if( obj.ItemType != ObjTemplate.ObjectType.shield )
return false;
}
int chance = ch.GetSkillChance("shield block");
victim.PracticeSkill("shield block");
if (MUDMath.NumberPercent() >= ((chance - ch.Level) / 2))
{
return false;
}
switch( MUDMath.NumberRange( 1, 5 ) )
{
case 1:
SocketConnection.Act( "You block $n&n's attack with your shield.", ch, null, victim, SocketConnection.MessageTarget.victim );
SocketConnection.Act( "$N&n blocks your attack with a shield.", ch, null, victim, SocketConnection.MessageTarget.character );
SocketConnection.Act( "$N&n blocks $n&n's attack with a shield.", ch, null, victim, SocketConnection.MessageTarget.room_vict );
break;
case 2:
// If we were really smart we would check to see whether both the shield
// and weapon were made of metal before we gave a sparks message...
SocketConnection.Act( "&+CS&n&+cp&+Car&n&+ck&+Cs&n fly off your shield as you block $n&n's attack.", ch, null, victim, SocketConnection.MessageTarget.victim );
SocketConnection.Act( "$N&n defends against your attack with a shield.", ch, null, victim, SocketConnection.MessageTarget.character );
SocketConnection.Act( "$N&n deflects $n&n's attack with a shield.", ch, null, victim, SocketConnection.MessageTarget.room_vict );
break;
case 3:
SocketConnection.Act("You bring up your shield to block $n&n's attack.", ch, null, victim, SocketConnection.MessageTarget.victim);
SocketConnection.Act("$N&n brings up %s shield to block your attack.", ch, null, victim, SocketConnection.MessageTarget.character);
SocketConnection.Act("$N&n brings up %s shield to blocks $n&n's attack.", ch, null, victim, SocketConnection.MessageTarget.room_vict);
break;
case 4:
SocketConnection.Act("You knock $n&n's attack aside with your shield.", ch, null, victim, SocketConnection.MessageTarget.victim);
SocketConnection.Act("$N&n knocks your attack aside with $S shield.", ch, null, victim, SocketConnection.MessageTarget.character);
SocketConnection.Act("$N&n knocks $n&n's attack aside with $S shield.", ch, null, victim, SocketConnection.MessageTarget.room_vict);
break;
case 5:
SocketConnection.Act("You hear a thud as $n&n's weapon smacks into your shield.", ch, null, victim, SocketConnection.MessageTarget.victim);
SocketConnection.Act("Your weapon smacks into $N&n's shield with a thud.", ch, null, victim, SocketConnection.MessageTarget.character);
SocketConnection.Act("$n&n's weapon smacks into $N&'s shield with a thud.", ch, null, victim, SocketConnection.MessageTarget.room_vict);
break;
default:
break;
}
if( ch.Fighting == null )
SetFighting( ch, victim );
if( victim.Fighting == null )
SetFighting( victim, ch );
return true;
}
示例2: Aware
public static void Aware(CharData ch, string[] str)
{
if( ch == null ) return;
Affect af = new Affect();
if (ch.IsNPC())
return;
if (!ch.HasSkill("awareness"))
{
ch.SendText("Your general obliviousness prevents your use of this skill.\r\n");
return;
}
if (ch.IsAffected(Affect.AFFECT_SKL_AWARE))
{
ch.SendText("You are already about as tense as you can get.\r\n");
return;
}
ch.SendText("You try to become more aware of your surroundings.\r\n");
ch.PracticeSkill("awareness");
af.Value = "awareness";
af.Type = Affect.AffectType.skill;
af.Duration = (ch.Level / 3) + 3;
af.SetBitvector(Affect.AFFECT_SKL_AWARE);
ch.AddAffect(af);
return;
}
示例3: Headbutt
/*
* Modified to up the damage and allow for a
* chance to stun victim or self
* damage = (level) d2, for an average of 75 hp at level 50
* stun damage = (level) d3, for an average of 100 hp at level 50
* Player vs player damage is reduced in damage()
*/
/// <summary>
/// Headbutt. Usable to initiate combat and during combat.
/// </summary>
/// <param name="ch"></param>
/// <param name="str"></param>
public static void Headbutt(CharData ch, string[] str)
{
if( ch == null ) return;
int chance;
int ko;
string text;
/* Check player's level and class, mobs can use this skill */
if ((!ch.HasSkill("headbutt")))
{
ch.SendText("Your skull is much too soft to headbutt anyone.\r\n");
return;
}
if (ch.IsBlind())
{
return;
}
CharData victim = ch.Fighting;
if (str.Length != 0)
{
if (!(victim = ch.GetCharRoom(str[0])) || victim.CurrentPosition == Position.dead)
{
ch.SendText("They are nowhere to be seen.\r\n");
return;
}
}
else
{
if (!victim || victim.CurrentPosition == Position.dead)
{
ch.SendText("You aren't fighting anyone.\r\n");
return;
}
}
/* anti headbutt me code */
if (ch == victim)
{
ch.SendText("You get dizzy as you ponder the mechanics of headbutting yourself.\r\n");
return;
}
if (ch.CurrentPosition < Position.fighting)
{
ch.SendText("You need to stand up to do that.\r\n");
return;
}
/* Check size of ch vs. victim. */
/* If ch is too small. */
/* Made it 2 sizes */
if (ch.CurrentSize - 2 > victim.CurrentSize)
{
SocketConnection.Act("You would crush such a small and delicate being with your mass.", ch, null, victim, SocketConnection.MessageTarget.character);
return;
}
/* Ch 2 or more sizes larger than victim => bad! */
if (ch.CurrentSize + 1 < victim.CurrentSize)
{
SocketConnection.Act("You can't reach their head!", ch, null, victim, SocketConnection.MessageTarget.character);
SocketConnection.Act("$n&n slams $s head into your thigh.", ch, null, victim, SocketConnection.MessageTarget.victim);
SocketConnection.Act("$n&n slams $s head into $N's thigh.", ch, null, victim, SocketConnection.MessageTarget.room_vict);
ch.WaitState((Skill.SkillList["headbutt"].Delay * 9) / 10);
if (victim.Fighting == null)
{
Combat.SetFighting(victim, ch);
}
return;
}
ch.WaitState(MUDMath.FuzzyNumber(Skill.SkillList["headbutt"].Delay));
ch.PracticeSkill("headbutt");
if (!ch.Fighting)
{
Combat.SetFighting(ch, victim);
}
if (!victim.Fighting)
{
Combat.SetFighting(victim, ch);
}
/* Added a PC skill level
*/
//.........这里部分代码省略.........
示例4: DirtToss
//.........这里部分代码省略.........
if (!ch.IsNPC())
{
percent = ((PC)ch).SkillAptitude["dirt toss"];
}
else
{
percent = (ch.Level * 3) / 2 + 25;
}
percent += (ch.Level - victim.Level) * 2;
percent += (ch.GetCurrDex() / 10);
percent -= (victim.GetCurrDex() / 10);
percent -= (victim.GetCurrAgi() / 10);
// Why waste time listing sectors with no modifier?
switch (ch.InRoom.TerrainType)
{
case TerrainType.inside:
case TerrainType.arctic:
case TerrainType.swamp:
percent -= 20;
break;
case TerrainType.city:
case TerrainType.mountain:
percent -= 10;
break;
case TerrainType.plane_of_fire:
case TerrainType.plane_of_air:
case TerrainType.plane_of_water:
case TerrainType.plane_ethereal:
case TerrainType.plane_astral:
case TerrainType.underwater_has_ground:
case TerrainType.underwater_no_ground:
case TerrainType.swimmable_water:
case TerrainType.unswimmable_water:
case TerrainType.air:
case TerrainType.ocean:
case TerrainType.underground_swimmable_water:
case TerrainType.underground_unswimmable_water:
percent = 0;
break;
case TerrainType.field:
percent += 5;
break;
case TerrainType.desert:
percent += 10;
break;
case TerrainType.plane_of_earth:
percent += 15;
break;
default:
break;
}
if (percent > 75)
{
percent = 75;
}
else if (percent < 5)
{
percent = 5;
}
if (percent <= 0)
{
ch.SendText("There isn't any &n&+ydirt&n to kick.\r\n");
return;
}
ch.PracticeSkill("dirt toss");
if (percent < MUDMath.NumberPercent())
{
Affect af = new Affect();
SocketConnection.Act("$n is &+Lblinded&n by the &n&+ydirt&n in $s eyes!", victim, null, null,
SocketConnection.MessageTarget.room);
SocketConnection.Act("$n kicks &n&+ydirt&n into your eyes!", ch, null, victim, SocketConnection.MessageTarget.victim);
victim.SendText("&+LYou can't see a thing!&n\r\n");
af.Value = "dirt toss";
af.Type = Affect.AffectType.skill;
af.Duration = MUDMath.NumberRange(1, 2);
af.AddModifier(Affect.Apply.hitroll, -4);
af.SetBitvector(Affect.AFFECT_BLIND);
victim.AddAffect(af);
}
else
{
ch.SendText("&+LYou kick dirt at your target!&n\r\n");
}
Combat.SetFighting(victim, ch);
ch.WaitState(Skill.SkillList["dirt toss"].Delay);
return;
}
示例5: DoorBash
//.........这里部分代码省略.........
Combat.InflictDamage(ch, ch, (ch.GetMaxHit() / 5), "doorbash", ObjTemplate.WearLocation.none, AttackType.DamageType.pierce);
}
return;
}
if (exit.HasFlag(Exit.ExitFlag.spiked))
{
SocketConnection.Act("You are impaled by spikes protruding from the $d!",
ch, null, exit.Keyword, SocketConnection.MessageTarget.character);
SocketConnection.Act("$n&n is impaled by spikes protruding from the $d!",
ch, null, exit.Keyword, SocketConnection.MessageTarget.room);
Combat.InflictDamage(ch, ch, (ch.GetMaxHit() / 5), "doorbash", ObjTemplate.WearLocation.none, AttackType.DamageType.pierce);
}
if ((ch.GetCurrStr() >= 20) && MUDMath.NumberPercent() < (chance + 4 * (ch.GetCurrStr() - 20)))
{
/* Success */
exit.RemoveFlag(Exit.ExitFlag.closed);
if (exit.HasFlag(Exit.ExitFlag.locked))
{
exit.RemoveFlag(Exit.ExitFlag.locked);
}
exit.AddFlag(Exit.ExitFlag.bashed);
SocketConnection.Act("Crash! You bashed open the $d!",
ch, null, exit.Keyword, SocketConnection.MessageTarget.character);
SocketConnection.Act("$n&n bashes open the $d!",
ch, null, exit.Keyword, SocketConnection.MessageTarget.room);
Combat.InflictDamage(ch, ch, (ch.GetMaxHit() / 30), "doorbash", ObjTemplate.WearLocation.none, AttackType.DamageType.bludgeon);
/* Bash through the other side */
if ((toRoom = Room.GetRoom(exit.IndexNumber)) && (reverseExit = toRoom.GetExit(Exit.ReverseDirection(door)))
&& reverseExit.TargetRoom == ch.InRoom)
{
reverseExit.RemoveFlag(Exit.ExitFlag.closed);
if (reverseExit.HasFlag(Exit.ExitFlag.locked))
{
reverseExit.RemoveFlag(Exit.ExitFlag.locked);
}
reverseExit.AddFlag(Exit.ExitFlag.bashed);
foreach (CharData irch in toRoom.People)
{
SocketConnection.Act("The $d crashes open!",
irch, null, reverseExit.Keyword, SocketConnection.MessageTarget.character);
}
// Have any aggro mobs on the other side come after the player.
foreach (CharData charData in toRoom.People)
{
if (charData != ch && (charData.IsNPC() && !charData.IsAffected( Affect.AFFECT_CHARM))
&& charData.IsAggressive(ch) && charData.IsAwake() && CharData.CanSee(charData, ch)
&& !charData.Fighting)
{
Combat.StartHating(charData, ch);
Combat.StartHunting(charData, ch);
}
}
}
}
else
{
/* Failure */
SocketConnection.Act("OW! You bash against the $d, but it doesn't budge.",
ch, null, exit.Keyword, SocketConnection.MessageTarget.character);
SocketConnection.Act("$n&n bashes against the $d, but it holds strong.",
ch, null, exit.Keyword, SocketConnection.MessageTarget.room);
Combat.InflictDamage(ch, ch, (ch.GetMaxHit() / 10), "doorbash", ObjTemplate.WearLocation.none, AttackType.DamageType.bludgeon);
}
}
/*
* Check for "guards"... anyone bashing a door is considered as
* a potential aggressor, and there's a 25% chance that mobs
* will do unto before being done unto.
* But first...let's make sure ch ain't dead? That'd be a pain.
*/
if (ch.Hitpoints <= 1)
return;
ch.PracticeSkill("doorbash");
foreach (CharData guardChar in ch.InRoom.People)
{
if (guardChar != ch && guardChar.HasActionBit(MobTemplate.ACT_PROTECTOR) && (guardChar.IsNPC() &&
!guardChar.IsAffected( Affect.AFFECT_CHARM)) && guardChar.IsAwake() && CharData.CanSee(guardChar, ch) &&
!guardChar.Fighting && MUDMath.NumberBits(2) == 0)
{
SocketConnection.Act("$n&n is very unhappy about you trying to destroy the door.", guardChar, null, ch, SocketConnection.MessageTarget.victim);
guardChar.AttackCharacter(ch);
}
}
return;
}
示例6: Untangle
/// <summary>
/// Try to free someone who has been bound.
/// </summary>
/// <param name="ch"></param>
/// <param name="str"></param>
public static void Untangle(CharData ch, string[] str)
{
if( ch == null ) return;
CharData victim;
if (!ch.IsNPC() && !ch.HasSkill("untangle"))
{
ch.SendText("You aren't nimble enough.\r\n");
return;
}
if (str.Length == 0)
{
victim = ch;
}
else
{
victim = ch.GetCharRoom(str[0]);
if (victim == null)
{
ch.SendText("They aren't here.\r\n");
return;
}
}
if (!victim.HasAffect( Affect.AffectType.skill, "capture"))
{
ch.SendText("There's nothing to untangle.\r\n");
return;
}
if ((ch.IsNPC() && !ch.IsAffected( Affect.AFFECT_CHARM)) || (!ch.IsNPC()
&& MUDMath.NumberPercent() < ((PC)ch).SkillAptitude["untangle"]))
{
victim.AffectStrip( Affect.AffectType.skill, "capture");
if (victim != ch)
{
SocketConnection.Act("You untangle $N&n.", ch, null, victim, SocketConnection.MessageTarget.character);
SocketConnection.Act("$n&n untangles you.", ch, null, victim, SocketConnection.MessageTarget.victim);
SocketConnection.Act("$n&n untangles $n&n.", ch, null, victim, SocketConnection.MessageTarget.everyone_but_victim);
}
else
{
ch.SendText("You untangle yourself.\r\n");
SocketConnection.Act("$n&n untangles $mself.", ch, null, null, SocketConnection.MessageTarget.room);
}
ch.PracticeSkill("untangle");
return;
}
}
示例7: Zap
/// <summary>
/// Zap a wand, using its spell power.
/// </summary>
/// <param name="ch"></param>
/// <param name="str"></param>
public static void Zap(CharData ch, string[] str)
{
if( ch == null ) return;
Object wand = null;
Object obj = null;
CharData victim;
int level;
if (str.Length == 0 && ch.Fighting == null)
{
ch.SendText("Zap whom or what?\r\n");
return;
}
if (!String.IsNullOrEmpty(str[0]) && !(wand = ch.GetObjWear(str[0])))
{
if (!(wand = Object.GetEquipmentOnCharacter(ch, ObjTemplate.WearLocation.hand_one)))
{
ch.SendText("You hold nothing in your hand.\r\n");
return;
}
}
else /* Wand was first argument.. arg is now second argument. */
if (wand.ItemType != ObjTemplate.ObjectType.wand)
{
ch.SendText("You can zap only with a wand.\r\n");
return;
}
level = wand.Level;
if (String.IsNullOrEmpty(str[0]))
{
if (ch.Fighting != null)
{
victim = ch.Fighting;
}
else
{
ch.SendText("Zap whom or what?\r\n");
return;
}
}
else
{
if (((victim = ch.GetCharRoom(str[0])) == null)
&& (obj = ch.GetObjHere(str[0])) == null)
{
ch.SendText("You can't find your _targetType.\r\n");
return;
}
}
if (ch.IsNPC() && !ch.IsFreewilled())
{
SocketConnection.Act("You try to zap $p&n, but you have no free will.",
ch, wand, null, SocketConnection.MessageTarget.character);
SocketConnection.Act("$n&n tries to zap $p&n, but has no free will.",
ch, wand, null, SocketConnection.MessageTarget.room);
return;
}
String spellName = SpellNumberToTextMap.GetSpellNameFromNumber(wand.Values[3]);
if (String.IsNullOrEmpty(spellName))
{
ch.SendText("You try to zap, but your wand fizzles.\r\n");
Log.Error("Zap: Spell number " + wand.Values[3] + " not found in SpellNumberToTextMap for object " + wand.ObjIndexNumber + ".");
return;
}
Spell spell = StringLookup.SpellLookup(spellName);
if (!spell)
{
ch.SendText("You try to zap, but your wand fizzles.\r\n");
Log.Error("Zap: Spell '" + spellName + "' not found for object " + wand.ObjIndexNumber + ". Check that it exists in the spells file.");
return;
}
ch.PracticeSkill("wands");
if (wand.Values[2] > 0)
{
if (victim != null)
{
if (victim == ch)
{
SocketConnection.Act("You zap yourself with $p&n.", ch, wand, null, SocketConnection.MessageTarget.character);
SocketConnection.Act("$n&n zaps $mself with $p&n.", ch, wand, null, SocketConnection.MessageTarget.room);
}
else
{
SocketConnection.Act("You zap $N&n with $p&n.", ch, wand, victim, SocketConnection.MessageTarget.character);
SocketConnection.Act("$n&n zaps $N&n with $p&n.", ch, wand, victim, SocketConnection.MessageTarget.room);
}
}
//.........这里部分代码省略.........
示例8: Pick
/// <summary>
/// Pick a lock.
/// </summary>
/// <param name="ch"></param>
/// <param name="str"></param>
public static void Pick(CharData ch, string[] str)
{
if( ch == null ) return;
Object obj;
Exit.Direction door;
if (str.Length == 0)
{
ch.SendText("Pick what, your nose?\r\n");
return;
}
if (ch.Riding)
{
ch.SendText("You can't do that while mounted.\r\n");
return;
}
ch.WaitState(Skill.SkillList["pick lock"].Delay);
// Look for guards or other mobs who could be "in the way".
foreach (CharData charData in ch.InRoom.People)
{
if (charData.IsNPC() && charData.IsAwake() && ch.Level + 5 < charData.Level)
{
SocketConnection.Act("$N&n is standing too close to the lock.", ch, null, charData, SocketConnection.MessageTarget.character);
return;
}
}
// Check skill roll for player, make sure mob isn't charmed.
if ((!ch.IsNPC() && MUDMath.NumberPercent() > ((PC)ch).SkillAptitude["pick lock"])
|| (ch.IsNPC() && ch.IsAffected( Affect.AFFECT_CHARM)))
{
ch.PracticeSkill("pick lock");
ch.SendText("You failed.\r\n");
return;
}
if ((door = Movement.FindDoor(ch, str[0])) >= 0)
{
/* 'pick door' */
Exit reverseExit;
Room toRoom;
Exit exit = ch.InRoom.GetExit(door);
if (!exit.HasFlag(Exit.ExitFlag.closed))
{
ch.SendText("It's not closed.\r\n");
return;
}
if (exit.Key < 0)
{
ch.SendText("It can't be picked.\r\n");
return;
}
if (!exit.HasFlag(Exit.ExitFlag.locked))
{
ch.SendText("It's already unlocked.\r\n");
return;
}
if (exit.HasFlag(Exit.ExitFlag.pickproof))
{
ch.SendText("You failed.\r\n");
return;
}
exit.RemoveFlag(Exit.ExitFlag.locked);
ch.SendText("*Click*\r\n");
SocketConnection.Act("$n&n picks the $d.", ch, null, exit.Keyword, SocketConnection.MessageTarget.room);
/* pick the other side */
if ((toRoom = Room.GetRoom(exit.IndexNumber)) && (reverseExit = toRoom.GetExit(Exit.ReverseDirection(door)))
&& reverseExit.TargetRoom == ch.InRoom)
{
reverseExit.RemoveFlag(Exit.ExitFlag.locked);
}
return;
}
if ((obj = ch.GetObjHere(str[0])))
{
/* 'pick portal' */
if (obj.ItemType == ObjTemplate.ObjectType.portal)
{
if (!Macros.IsSet(obj.Values[3], ObjTemplate.PORTAL_CLOSED))
{
ch.SendText("It's not closed.\r\n");
return;
}
if (obj.Values[4] < 0)
{
ch.SendText("It can't be unlocked.\r\n");
return;
//.........这里部分代码省略.........
示例9: Bodyslam
/// <summary>
/// Bodyslam an opponent. Can only be used to initiate combat.
/// </summary>
/// <param name="ch"></param>
/// <param name="str"></param>
public static void Bodyslam(CharData ch, string[] str)
{
if( ch == null ) return;
CharData victim;
/* Check player's level and class, mobs can use this skill */
if (!ch.HasInnate(Race.RACE_BODYSLAM))
{
ch.SendText("You don't feel massive enough to manhandle that.\r\n");
return;
}
if (ch.IsBlind())
{
return;
}
if (ch.Riding)
{
ch.SendText("You can't do that while mounted.\r\n");
return;
}
if (str.Length != 0)
{
if (!(victim = ch.GetCharRoom(str[0])) || victim.CurrentPosition == Position.dead)
{
ch.SendText("They aren't here.\r\n");
return;
}
}
else
{
ch.SendText("Bodyslam who?\r\n");
return;
}
// Added size restrictions -- Xangis
if (victim.CurrentSize > ch.CurrentSize)
{
if (ch.HasInnate(Race.RACE_SLAM_LARGER))
{
// allowing centaurs to slam one size up if it's an ogre
if (victim.CurrentSize > (ch.CurrentSize + 1))
{
ch.SendText("You can't bodyslam something that much bigger than you.\r\n");
return;
}
}
else
{
ch.SendText("You can't bodyslam something bigger than you.\r\n");
return;
}
}
if ((ch.CurrentSize > victim.CurrentSize) && ((ch.CurrentSize - victim.CurrentSize) > 3))
{
ch.SendText("They're too small to slam.\r\n");
return;
}
/* Bodyslam self? Ok! */
if (ch == victim)
{
ch.SendText("You slam yourself to the ground!\r\n");
SocketConnection.Act("$n&n throws $mself to the ground in a fit of clumsiness.",
ch, null, victim, SocketConnection.MessageTarget.room_vict);
ch.WaitState((Skill.SkillList["bodyslam"].Delay / 2));
ch.CurrentPosition = Position.reclining;
Combat.InflictDamage(ch, ch, MUDMath.NumberRange(1, 6), "bodyslam", ObjTemplate.WearLocation.none, AttackType.DamageType.bludgeon);
return;
}
ch.WaitState(Skill.SkillList["bodyslam"].Delay);
ch.PracticeSkill("bodyslam");
int chance = (ch.Level * 3) / 2 + 15;
chance += ch.GetCurrAgi() - victim.GetCurrAgi();
chance -= (victim.Level - ch.Level);
switch (victim.CurrentPosition)
{
case Position.dead:
return;
case Position.mortally_wounded:
chance += 15;
break;
case Position.incapacitated:
chance += 10;
break;
case Position.unconscious:
chance += 5;
break;
case Position.stunned:
//.........这里部分代码省略.........
示例10: Kick
/// <summary>
/// Kick someone.
/// </summary>
/// <param name="ch"></param>
/// <param name="str"></param>
public static void Kick(CharData ch, string[] str)
{
if( ch == null ) return;
int chance;
int wallkickchance;
/* Check player's level and class, allow mobs to do this too */
if ((!ch.HasSkill("kick")))
{
ch.SendText("You'd better leave the martial arts to fighters.\r\n");
return;
}
if (ch.IsBlind() && !ch.Fighting)
{
return;
}
CharData victim = ch.Fighting;
if (str.Length != 0)
{
victim = ch.GetCharRoom(str[0]);
if (!victim || victim.CurrentPosition == Position.dead)
{
ch.SendText("They aren't here.\r\n");
return;
}
}
else
{
if (!victim || victim.CurrentPosition == Position.dead)
{
ch.SendText("You aren't fighting anyone.\r\n");
return;
}
}
if (victim == ch)
{
ch.SendText("You kick yourself for being a dummy.\r\n");
return;
}
ch.WaitState(MUDMath.FuzzyNumber(Skill.SkillList["kick"].Delay));
if (!ch.IsNPC())
{
chance = ((PC)ch).SkillAptitude["kick"];
ch.PracticeSkill("kick");
}
else
{
chance = ch.Level * 3 / 2 + 20;
}
// It's much harder to kick really tiny things; imagine trying to kick
// a fly.
if (ch.CurrentSize > victim.CurrentSize + 5)
{
chance -= (ch.CurrentSize - victim.CurrentSize) * 5;
}
// It's harder to kick things that move faster than you.
chance += ((ch.GetCurrAgi() - victim.GetCurrAgi()) / 5);
// Huge bonus against incapacitated and mortally wounded foes.
if (victim.CurrentPosition <= Position.incapacitated)
{
chance += 50;
}
// Damned high penalty for kicking blind
if (ch.IsAffected(Affect.AFFECT_BLIND) && !victim.IsAffected(Affect.AFFECT_BLIND))
{
chance /= 10;
}
if (ch.IsAffected(Affect.AFFECT_BLIND) && victim.IsAffected(Affect.AFFECT_BLIND))
{
chance /= 4;
}
// If the victim is two or more sizes smaller than the kicker give them a chance
// to be kicked into a wall or out of the room.
//
// Chance of 5% per size class difference, no maximum
// (wall/room kick is 50% at a difference of 10 sizes)
if (victim.CurrentSize - 1 >= ch.CurrentSize)
{
wallkickchance = 0;
}
else
{
wallkickchance = ((ch.CurrentSize - victim.CurrentSize) * 5) - 5;
}
//.........这里部分代码省略.........
示例11: Meditate
/// <summary>
/// Meditate command.
/// </summary>
/// <param name="ch"></param>
/// <param name="str"></param>
public static void Meditate(CharData ch, string[] str)
{
if( ch == null ) return;
if (ch.IsNPC())
return;
if (!ch.HasSkill("meditate"))
{
ch.SendText("You don't know how to meditate.\r\n");
return;
}
if (ch.HasActionBit(PC.PLAYER_MEDITATING))
{
ch.RemoveActionBit(PC.PLAYER_MEDITATING);
ch.SendText("You stop meditating.\r\n");
}
if (ch.CurrentPosition != Position.resting)
{
ch.SendText("You must be resting in order to meditate.\r\n");
return;
}
if (ch.Fighting != null)
{
ch.SendText("Meditation during battle leads to permenant inner peace.\r\n");
return;
}
ch.SetActionBit(PC.PLAYER_MEDITATING);
ch.WaitState(Skill.SkillList["meditate"].Delay);
ch.PracticeSkill("meditate");
ch.SendText("You start meditating...\r\n");
return;
}
示例12: CombatRound
//.........这里部分代码省略.........
case 4:
if( Object.GetEquipmentOnCharacter( ch, ObjTemplate.WearLocation.hand_four ) )
SingleAttack(ch, victim, skill, ObjTemplate.WearLocation.hand_four);
break;
}
}
else
{
SingleAttack(ch, victim, skill, ObjTemplate.WearLocation.hand_one);
if( MUDMath.NumberPercent() < ch.Level / 2 )
{
SingleAttack(ch, victim, skill, ObjTemplate.WearLocation.hand_one);
}
}
}
// Don't hurt a corpse.
if( victim.CurrentPosition == Position.dead || victim.Hitpoints < -10 )
{
StopFighting( ch, false );
{
return true;
}
}
// For NPCs we assume they have max skill value for their level.
// When checking combat skills we only prDescriptor.actice them on a successful
// check in order to make them go up slower. If they go up too slow
// we can always practice them before they check.
chance = ch.GetAttackChance(2);
if( MUDMath.NumberPercent() < chance )
{
ch.PracticeSkill( "second attack" );
SingleAttack(ch, victim, skill, ObjTemplate.WearLocation.hand_one);
if( ch.Fighting != victim )
{
return false;
}
}
// Check for Thri-Kreen arm #3
if( ch.GetRace() == Race.RACE_THRIKREEN && ( wield = Object.GetEquipmentOnCharacter( ch, ObjTemplate.WearLocation.hand_three ) ) )
{
if( wield.HasWearFlag( ObjTemplate.WEARABLE_WIELD ) )
{
if( ch.IsNPC() )
{
if( !ch.HasSkill( "second attack" ))
{
chance = ch.Level / 5; // Up to 10% chance of third arm for psis and
}
// other miscellaneous thris
else
{
chance = ((ch.Level - Skill.SkillList["second attack"].ClassAvailability[(int)ch.CharacterClass.ClassNumber]) * 2 + 25);
}
}
else
{
if (((PC)ch).SkillAptitude.ContainsKey("second attack"))
{
chance = ((PC)ch).SkillAptitude["second attack"];
}
else
{
示例13: CheckTumble
/// <summary>
/// Check tumble skill to see whether an attack is avoided.
/// </summary>
/// <param name="ch"></param>
/// <returns></returns>
public static bool CheckTumble( CharData ch )
{
if (ch == null) return false;
int chance;
if( !ch.HasSkill( "tumble" ) )
return false;
if( ch.IsNPC() )
chance = ch.Level / 2 + 8;
else
chance = ( (PC)ch ).SkillAptitude[ "tumble" ] / 3;
chance += ch.GetCurrAgi() / 15;
ch.PracticeSkill( "tumble" );
if( MUDMath.NumberPercent() >= chance )
return false;
return true;
}
示例14: CheckDodge
/// <summary>
/// Checks whether the victim is able to dodge the attacker's swing.
/// </summary>
/// <param name="ch"></param>
/// <param name="victim"></param>
/// <returns></returns>
public static bool CheckDodge( CharData ch, CharData victim )
{
if( !victim.IsAwake() || victim.CurrentPosition < Position.reclining )
return false;
if (ch.IsAffected(Affect.AFFECT_DAZZLE))
return false;
if( !victim.HasSkill( "dodge" ) )
return false;
int chance = victim.GetSkillChance("dodge");
// Size difference bonus for dodge for halflings - they get 2% dodge
// bonus per size difference between them and the attacker. -- Xangis
// Drow get a flat 15% bonus.
if( victim.GetRace() == Race.RACE_HALFLING )
{
if( ch.CurrentSize > victim.CurrentSize )
{
chance += 3 * ( ch.CurrentSize - victim.CurrentSize );
}
}
else if( victim.HasInnate( Race.RACE_GOOD_DODGE ) )
{
chance += 8;
}
else if( victim.HasInnate( Race.RACE_BAD_DODGE ) )
{
chance -= 3;
}
// Bashed mobs/creatures have a hard time dodging
if( victim.CurrentPosition < Position.fighting )
{
chance -= 25;
}
// Leap is 16% max at level 50. Considering crappy thri hitpoints it's necessary.
if( victim.GetRace() == Race.RACE_THRIKREEN && MUDMath.NumberPercent() <= ( victim.Level / 3 ) )
{
SocketConnection.Act( "$N&n leaps over your attack.", ch, null, victim, SocketConnection.MessageTarget.character );
SocketConnection.Act( "You leap over $n&n's attack.", ch, null, victim, SocketConnection.MessageTarget.victim );
SocketConnection.Act( "$N&n leaps over $n&n's attack.", ch, null, victim, SocketConnection.MessageTarget.room_vict );
return true;
}
victim.PracticeSkill( "dodge" );
if( MUDMath.NumberPercent() >= chance - ch.Level )
return false;
switch( MUDMath.NumberRange( 1, 2 ) )
{
case 1:
SocketConnection.Act( "$N&n dodges your attack.", ch, null, victim, SocketConnection.MessageTarget.character );
SocketConnection.Act( "You dodge $n&n's attack.", ch, null, victim, SocketConnection.MessageTarget.victim );
SocketConnection.Act( "$N&n dodges $n&n's attack.", ch, null, victim, SocketConnection.MessageTarget.room_vict );
break;
case 2:
SocketConnection.Act( "$N&n sidesteps your attack.", ch, null, victim, SocketConnection.MessageTarget.character );
SocketConnection.Act( "You narrowly dodge $n&n's attack.", ch, null, victim, SocketConnection.MessageTarget.victim );
SocketConnection.Act( "$N&n avoids $n&n's attack.", ch, null, victim, SocketConnection.MessageTarget.room_vict );
break;
default:
break;
}
if( ch.Fighting == null )
SetFighting( ch, victim );
if( victim.Fighting == null )
SetFighting( victim, ch );
return true;
}
示例15: TrackCommand
//.........这里部分代码省略.........
if (ch.FlightLevel != 0)
{
ch.SendText("You find tracks on the _ground_!\r\n");
return;
}
if (ch.InRoom.IsWater())
{
ch.SendText("You can't track through water.\r\n");
return;
}
if (ch.CurrentPosition != Position.standing)
{
if (ch.CurrentPosition == Position.fighting)
ch.SendText("You're too busy fighting .\r\n");
else
ch.SendText("You must be standing to track!\r\n");
return;
}
/* only imps can hunt to different areas */
bool area = (ch.GetTrust() < Limits.LEVEL_OVERLORD);
if (area)
{
victim = ch.GetCharInArea(str[0]);
}
else
{
victim = ch.GetCharWorld(str[0]);
}
if (!victim || (!victim.IsNPC() && (ch.IsRacewar(victim)) && !ch.IsImmortal()))
{
ch.SendText("You can't find a trail of anyone like that.\r\n");
return;
}
if (ch.InRoom == victim.InRoom)
{
SocketConnection.Act("You're already in $N&n's room!", ch, null, victim, SocketConnection.MessageTarget.character);
return;
}
/*
* Deduct some movement.
*/
if (ch.CurrentMoves > 2)
{
ch.CurrentMoves -= 3;
}
else
{
ch.SendText("You're too exhausted to hunt anyone!\r\n");
return;
}
SocketConnection.Act("$n carefully sniffs the air.", ch, null, null, SocketConnection.MessageTarget.room);
ch.WaitState(Skill.SkillList["track"].Delay);
Exit.Direction direction = Track.FindPath(ch.InRoom.IndexNumber, victim.InRoom.IndexNumber, ch, -40000, area);
if (direction == Exit.Direction.invalid)
{
SocketConnection.Act("You can't sense $N&n's trail from here.",
ch, null, victim, SocketConnection.MessageTarget.character);
return;
}
/*
* Give a random direction if the player misses the die roll.
*/
if ((ch.IsNPC() && MUDMath.NumberPercent() > 75) /* NPC @ 25% */
|| (!ch.IsNPC() && MUDMath.NumberPercent() > /* PC @ norm */
((PC)ch).SkillAptitude["track"]))
{
do
{
direction = Database.RandomDoor();
}
while (!(ch.InRoom.ExitData[(int)direction]) || !(ch.InRoom.ExitData[(int)direction].TargetRoom));
}
ch.PracticeSkill("track");
/*
* Display the results of the search.
*/
ch.SetAffectBit(Affect.AFFECT_TRACK);
string buf = String.Format("You sense $N&n's trail {0} from here...", direction.ToString());
SocketConnection.Act(buf, ch, null, victim, SocketConnection.MessageTarget.character);
if (ch.CurrentPosition == Position.standing)
{
ch.Move(direction);
}
Combat.StartHunting(ch, victim);
return;
}