private VTile GetNearestNode(MCharacter target, List <VTile> tiles) { if (mCharacter.Mission == Mission.defensive) { return(tiles.Find(t => t.CoordinateX == mCharacter.CoordinateX && t.CoordinateY == mCharacter.CoordinateY)); } if (cBattlefield.tilesManager.CurrentMovingTiles.Count == 1) { return(cBattlefield.tilesManager.CurrentMovingTiles[0]); } tiles.Sort((a, b) => { bool aNotRoad = System.Array.Exists(mBaseMap.Characters, c => c.Hp > 0 && !c.IsHide && c.CoordinateX == a.CoordinateX && c.CoordinateY == a.CoordinateY); if (aNotRoad) { return(1); } bool aCanAttack = cBattlefield.charactersManager.IsInSkillDistance(target.CoordinateX, target.CoordinateY, a.CoordinateX, a.CoordinateY, mCharacter); bool bCanAttack = cBattlefield.charactersManager.IsInSkillDistance(target.CoordinateX, target.CoordinateY, b.CoordinateX, b.CoordinateY, mCharacter); if (aCanAttack && !bCanAttack) { return(-1); } else if (!aCanAttack && bCanAttack) { return(1); } else if (aCanAttack && bCanAttack) { bool aCanCounter = cBattlefield.calculateManager.CanCounterAttack(mCharacter, target, a.CoordinateX, a.CoordinateY, target.CoordinateX, target.CoordinateY); bool bCanCounter = cBattlefield.calculateManager.CanCounterAttack(mCharacter, target, b.CoordinateX, b.CoordinateY, target.CoordinateX, target.CoordinateY); if (aCanCounter && !bCanCounter) { return(1); } else if (!aCanCounter && bCanCounter) { return(-1); } else if (aCanCounter && bCanCounter) { //地形优势 float aTileAid = mCharacter.TileAid(a); float bTileAid = mCharacter.TileAid(b); if (aTileAid < bTileAid) { return(-1); } else if (aTileAid > bTileAid) { return(1); } } } int aDistance = cBattlefield.mapSearch.GetDistance(mCharacter.CoordinateX, mCharacter.CoordinateY, a.CoordinateX, a.CoordinateY); int bDistance = cBattlefield.mapSearch.GetDistance(mCharacter.CoordinateX, mCharacter.CoordinateY, b.CoordinateX, b.CoordinateY); return(aDistance - bDistance); }); return(cBattlefield.tilesManager.CurrentMovingTiles[0]); }
/// <summary> /// 攻击命中 /// 技巧+速度*2 /// </summary> /// <returns><c>true</c>, if hitrate was attacked, <c>false</c> otherwise.</returns> /// <param name="attackCharacter">Attack character.</param> /// <param name="targetCharacter">Target character.</param> public bool AttackHitrate(MCharacter attackCharacter, MCharacter targetCharacter) { /* TODO:: * //游戏教学时100%命中 * if (Global.SUser.self.IsTutorial) * { * return true; * }*/ //技能100%命中 if (attackCharacter.isForceHit) { return(true); } //获取地形辅助 float tileAid = attackCharacter.TileAid(Global.mapSearch.GetTile(attackCharacter.coordinate)); float targetTileAid = attackCharacter.TileAid(Global.mapSearch.GetTile(targetCharacter.coordinate)); int attackValue = (int)((attackCharacter.ability.knowledge + attackCharacter.ability.speed * 2) * tileAid); int targetValue = (int)((targetCharacter.ability.knowledge + targetCharacter.ability.speed * 2) * targetTileAid); int r; if (attackValue > 2 * targetValue) { r = 100; } else if (attackValue > targetValue) { r = (attackValue - targetValue) * 10 / targetValue + 90; } else if (attackValue > targetValue * 0.5) { r = (attackValue - targetValue / 2) * 30 / (targetValue / 2) + 60; } else { r = (attackValue - targetValue / 3) * 30 / (targetValue / 3) + 30; } int randValue = UnityEngine.Random.Range(0, 100); if (randValue <= r) { return(true); } return(false); }
/// <summary> /// 攻击命中 /// 技巧+速度*2 /// </summary> /// <returns><c>true</c>, if hitrate was attacked, <c>false</c> otherwise.</returns> /// <param name="attackCharacter">Attack character.</param> /// <param name="targetCharacter">Target character.</param> public bool AttackHitrate(MCharacter attackCharacter, MCharacter targetCharacter) { //游戏教学时100%命中 if (Global.SUser.self.IsTutorial) { return(true); } //技能100%命中 if (attackCharacter.IsForceHit) { return(true); } //获取地形辅助 float tileAid = attackCharacter.TileAid(cBattlefield.mapSearch.GetTile(attackCharacter.CoordinateX, attackCharacter.CoordinateY)); float targetTileAid = attackCharacter.TileAid(cBattlefield.mapSearch.GetTile(targetCharacter.CoordinateX, targetCharacter.CoordinateY)); int attackValue = (int)((attackCharacter.Ability.Knowledge + attackCharacter.Ability.Speed * 2) * tileAid); int targetValue = (int)((targetCharacter.Ability.Knowledge + targetCharacter.Ability.Speed * 2) * targetTileAid); int r; if (attackValue > 2 * targetValue) { r = 100; } else if (attackValue > targetValue) { r = (attackValue - targetValue) * 10 / targetValue + 90; } else if (attackValue > targetValue * 0.5) { r = (attackValue - targetValue / 2) * 30 / (targetValue / 2) + 60; } else { r = (attackValue - targetValue / 3) * 30 / (targetValue / 3) + 30; } int randValue = Random.Range(0, 100); if (randValue <= r) { return(true); } return(false); }
/// <summary> /// 攻击伤害=技能*0.3+攻击力-防御力*2 /// </summary> /// <param name="attackCharacter">Attack character.</param> /// <param name="targetCharacter">Target character.</param> public int Hert(MCharacter attackCharacter, MCharacter targetCharacter, VTile tile = null, VTile targetTile = null) { //获取地形辅助 float tileAid = attackCharacter.TileAid(tile); float targetTileAid = targetCharacter.TileAid(targetTile); MSkill skill = attackCharacter.CurrentSkill; App.Model.Master.MSkill skillMaster = skill.Master; if (tile == null) { tile = cBattlefield.mapSearch.GetTile(attackCharacter.CoordinateX, attackCharacter.CoordinateY); } if (targetTile == null) { targetTile = cBattlefield.mapSearch.GetTile(targetCharacter.CoordinateX, targetCharacter.CoordinateY); } float attack = System.Array.Exists(skillMaster.types, s => s == SkillType.attack) ? attackCharacter.Ability.PhysicalAttack : attackCharacter.Ability.MagicAttack; //地形辅助 attack *= tileAid; if (attackCharacter.IsPike && targetCharacter.IsKnife) { //枪剑类克制刀类 attack *= 1.2f; } else if (attackCharacter.IsKnife && targetCharacter.IsAx) { //刀类克制斧类 attack *= 1.2f; } else if (attackCharacter.IsAx && targetCharacter.IsPike) { //斧类克制枪剑类 attack *= 1.2f; } float defense = System.Array.Exists(skillMaster.types, s => s == SkillType.attack) ? targetCharacter.Ability.PhysicalDefense : targetCharacter.Ability.MagicDefense; //地形辅助 defense *= targetTileAid; if (attackCharacter.IsLongWeapon && targetCharacter.IsShortWeapon) { //长兵器克制短兵器 defense *= 0.8f; } else if (attackCharacter.IsShortWeapon && targetCharacter.IsArcheryWeapon) { //短兵器克制远程兵器 defense *= 0.8f; } else if (attackCharacter.IsArcheryWeapon && targetCharacter.IsLongWeapon) { //远程类兵器克制长兵器 defense *= 0.8f; } App.Model.Master.MTile mTile = TileCacher.Instance.Get(targetTile.TileId); //地形对技能威力的影响 int five_elements = (int)skillMaster.five_elements; float skillStrength = skillMaster.strength * mTile.strategys[five_elements]; //抗性对技能威力的影响 int resistance = targetCharacter.Master.resistances[five_elements]; if (resistance > 0) { skillStrength *= ((100 - resistance) * 0.01f); } float result = skillStrength * 0.3f + attack - defense; //Debug.LogError("result="+result + ", skillMaster.strength="+skillMaster.strength +", attack=" + attack+", defense="+defense); if (attackCharacter.MoveType == MoveType.cavalry && targetCharacter.MoveType == MoveType.infantry && !targetCharacter.IsArcheryWeapon) { //骑兵克制近身步兵 result *= 1.2f; } else if (attackCharacter.IsArcheryWeapon && targetCharacter.MoveType == MoveType.cavalry && !targetCharacter.IsArcheryWeapon) { //远程类克制近身类骑兵 result *= 1.2f; } else if (attackCharacter.MoveType == MoveType.infantry && targetCharacter.WeaponType != WeaponType.archery && targetCharacter.IsArcheryWeapon) { //近身步兵克制远程类 result *= 1.2f; } if (targetCharacter.MoveType == MoveType.cavalry && skillMaster.effect.special == App.Model.Master.SkillEffectSpecial.horse_hert) { //对骑兵技能伤害加成 result *= (1f + skillMaster.effect.special_value * 0.01f); } else if (skillMaster.effect.special == App.Model.Master.SkillEffectSpecial.move_and_attack && attackCharacter.roadLength > 0) { //移动攻击 result *= (1f + attackCharacter.roadLength * skillMaster.effect.special_value * 0.01f); } result = result > 1 ? result : 1; result = result > targetCharacter.Hp ? targetCharacter.Hp : result; return((int)result); }
private void FindAttackTarget() { BattleCalculateManager calculateManager = Global.battleManager.calculateManager; BattleTilesManager tilesManager = Global.battleManager.tilesManager; BattleCharactersManager charactersManager = Global.charactersManager; attackTarget = null; targetTile = null; if (mCharacter.currentSkill == null) { return; } float tileAid = 0; foreach (MCharacter character in charactersManager.mCharacters) { if (character.hp == 0 || character.isHide) { continue; } if (charactersManager.IsSameBelong(mCharacter.belong, character.belong)) { continue; } VTile vTile = GetNearestNode(character, tilesManager.currentMovingTiles); //可否攻击 bool canAttack = charactersManager.IsInSkillDistance(character.coordinate, vTile.coordinate, mCharacter); if (!canAttack) { continue; } if (attackTarget == null) { attackTarget = character; targetTile = vTile; tileAid = 0; continue; } //是否可杀死 bool aCanKill = calculateManager.Hert(mCharacter, attackTarget, targetTile) - attackTarget.hp >= 0; if (aCanKill) { continue; } bool bCanKill = calculateManager.Hert(mCharacter, character, targetTile) - character.hp >= 0; if (!aCanKill && bCanKill) { attackTarget = character; targetTile = vTile; tileAid = 0; continue; } //是否反击 bool aCanCounter = calculateManager.CanCounterAttack(mCharacter, attackTarget, targetTile.coordinate, attackTarget.coordinate); bool bCanCounter = calculateManager.CanCounterAttack(mCharacter, character, vTile.coordinate, character.coordinate); if (!aCanCounter && bCanCounter) { continue; } else if (aCanCounter && !bCanCounter) { attackTarget = character; targetTile = vTile; tileAid = 0; continue; } //地形优势 float aTileAid = tileAid; if (Global.IsFloatZero(aTileAid)) { aTileAid = attackTarget.TileAid(targetTile); } float bTileAid = character.TileAid(vTile); if (aTileAid > bTileAid) { attackTarget = character; targetTile = vTile; tileAid = bTileAid; continue; } } }
private VTile GetNearestNode(MCharacter target, List <VTile> tiles) { BattleCalculateManager calculateManager = Global.battleManager.calculateManager; BattleCharactersManager charactersManager = Global.charactersManager; TileMap mapSearch = Global.mapSearch; Debug.LogError("GetNearestNode tiles = " + tiles.Count); if (mCharacter.mission == Mission.defensive) { return(tiles.Find(t => t.coordinate.Equals(mCharacter.coordinate))); } if (tiles.Count == 1) { return(tiles[0]); } tiles.Sort((a, b) => { bool aNotRoad = charactersManager.mCharacters.Exists((c) => { return(c.hp > 0 && !c.isHide && c.coordinate.Equals(a.coordinate)); }); if (aNotRoad) { return(1); } bool aCanAttack = charactersManager.IsInSkillDistance(target.coordinate, a.coordinate, mCharacter); bool bCanAttack = charactersManager.IsInSkillDistance(target.coordinate, b.coordinate, mCharacter); if (aCanAttack && !bCanAttack) { return(-1); } else if (!aCanAttack && bCanAttack) { return(1); } else if (aCanAttack && bCanAttack) { bool aCanCounter = calculateManager.CanCounterAttack(mCharacter, target, a.coordinate, target.coordinate); bool bCanCounter = calculateManager.CanCounterAttack(mCharacter, target, b.coordinate, target.coordinate); if (aCanCounter && !bCanCounter) { return(1); } else if (!aCanCounter && bCanCounter) { return(-1); } else if (aCanCounter && bCanCounter) { //地形优势 float aTileAid = mCharacter.TileAid(a); float bTileAid = mCharacter.TileAid(b); if (aTileAid < bTileAid) { return(-1); } else if (aTileAid > bTileAid) { return(1); } } } int aDistance = mapSearch.GetDistance(mCharacter.coordinate, a.coordinate); int bDistance = mapSearch.GetDistance(mCharacter.coordinate, b.coordinate); return(aDistance - bDistance); }); return(tiles[0]); }
private void FindAttackTarget() { attackTarget = null; targetTile = null; if (mCharacter.CurrentSkill == null) { return; } float tileAid = 0; foreach (MCharacter character in mBaseMap.Characters) { if (character.Hp == 0 || character.IsHide) { continue; } if (cBattlefield.charactersManager.IsSameBelong(mCharacter.Belong, character.Belong)) { continue; } VTile vTile = GetNearestNode(character, cBattlefield.tilesManager.CurrentMovingTiles); //可否攻击 bool canAttack = cBattlefield.charactersManager.IsInSkillDistance(character.CoordinateX, character.CoordinateY, vTile.CoordinateX, vTile.CoordinateY, mCharacter); if (!canAttack) { continue; } if (attackTarget == null) { attackTarget = character; targetTile = vTile; tileAid = 0; continue; } //是否可杀死 bool aCanKill = cBattlefield.calculateManager.Hert(mCharacter, attackTarget, targetTile) - attackTarget.Hp >= 0; if (aCanKill) { continue; } bool bCanKill = cBattlefield.calculateManager.Hert(mCharacter, character, targetTile) - character.Hp >= 0; if (!aCanKill && bCanKill) { attackTarget = character; targetTile = vTile; tileAid = 0; continue; } //是否反击 bool aCanCounter = cBattlefield.calculateManager.CanCounterAttack(mCharacter, attackTarget, targetTile.CoordinateX, targetTile.CoordinateY, attackTarget.CoordinateX, attackTarget.CoordinateY); bool bCanCounter = cBattlefield.calculateManager.CanCounterAttack(mCharacter, character, vTile.CoordinateX, vTile.CoordinateY, character.CoordinateX, character.CoordinateY); if (!aCanCounter && bCanCounter) { continue; } else if (aCanCounter && !bCanCounter) { attackTarget = character; targetTile = vTile; tileAid = 0; continue; } //地形优势 float aTileAid = tileAid; if (aTileAid == 0) { aTileAid = attackTarget.TileAid(targetTile); } float bTileAid = character.TileAid(vTile); if (aTileAid > bTileAid) { attackTarget = character; targetTile = vTile; tileAid = bTileAid; continue; } } }