Esempio n. 1
0
        bool Attack()
        {
//			Debug.Log("--------------Attack--------------");
            if (aiConfig.attackLevel == AIAttackLevel.Level_0_Lazy)
            {
                return(false);
            }



            // 攻击,随机派部队数量
            int sendCount = aiConfig.GetAttackSendCount();

//			Debug.Log("攻击,随机派部队数量 sendCount=" + sendCount);
            if (sendCount <= 0)
            {
                return(false);
            }

            // 攻击,生成派兵的建筑
            List <UnitCtl> ownSelectBuilds = new List <UnitCtl>();
            int            index           = 0;

            foreach (UnitCtl build in ownBuilds)
            {
                if (index < sendCount)
                {
                    if (build.hp <= 0)
                    {
                        continue;
                    }
                    if (build.unitData.behit && Random.Range(0f, 1f) > aiConfig.attackBehitRate)
                    {
                        continue;
                    }
                    ownSelectBuilds.Add(build);
                    index++;
                }
                if (index >= sendCount)
                {
                    break;
                }
            }

            // 计算敌人建筑被攻击值
            List <UnitCtl> enemyBuilds = War.scene.GetEnemyBuilds(legionId);

            if (enemyBuilds.Count <= 0)
            {
                return(false);
            }

            foreach (UnitCtl enemyBuild in enemyBuilds)
            {
                float distance = 0;
                foreach (UnitCtl ownBuild in ownSelectBuilds)
                {
                    distance += War.scene.GetBuildDistance(enemyBuild, ownBuild);
                }

                distance /= ownSelectBuilds.Count;
                enemyBuild.unitData.attackScore = enemyBuild.unitData.hp + distance * distanceScoreRate_Attack;

//				Debug.Log(string.Format("<color=grey>id={0}, hp={1}, distance={2}, attackValue={3}</color>", enemyBuild.unitData.id, enemyBuild.unitData.hp, distance, enemyBuild.unitData.attackScore));
            }

            // 排序敌人建筑被攻击值
            enemyBuilds.Sort(delegate(UnitCtl A, UnitCtl B)
            {
                return(Mathf.RoundToInt(A.unitData.attackScore - B.unitData.attackScore));
            });

            // 随机选择敌人建筑
            int enemyIndex = aiConfig.GetAttackTargetIndex();

            if (enemyIndex >= enemyBuilds.Count)
            {
                enemyIndex = enemyBuilds.Count - 1;
            }

//			Debug.Log("随机选择敌人建筑 enemyIndex=" + enemyIndex);

            UnitCtl targetBuild = enemyBuilds[enemyIndex];

            bool isSend = true;

            if (aiConfig.attackLevel == AIAttackLevel.Level_1_Cautious)
            {
                float hp = 0;
                foreach (UnitCtl ownBuild in ownSelectBuilds)
                {
                    hp += ownBuild.unitData.hp * aiConfig.sendArmPercent;
//					Debug.Log("HP" + hp);
                }

                hp     = WarFormula.WD_Solider2Casern_Damage(targetBuild.unitData.def, unitData.legionData.soliderInitData.atk, hp);
                isSend = hp > targetBuild.unitData.hp;
            }


            if (isSend)
            {
//				Debug.Log("<color=blue>攻击</color>");
                foreach (UnitCtl ownBuild in ownSelectBuilds)
                {
//					Debug.LogFormat("<color=blue>ownBuild.hp={0},  aiConfig.sendArmPercent=</color>", ownBuild.hp, aiConfig.sendArmPercent);
                    BSendArming bSendArming = ownBuild.GetComponent <BSendArming>();
                    bSendArming.Send(targetBuild, aiConfig.sendArmPercent);
                }
            }

            return(isSend);
        }
Esempio n. 2
0
 public float GetBuildDistance(UnitCtl a, UnitCtl b)
 {
     return(GetBuildDistance(a.unitData.id, b.unitData.id));
 }
Esempio n. 3
0
        /** 判断该技能是否能应用到某个单位 */
        public bool EnableUse(UnitCtl unit, RelationType unitRelation)
        {
            if (isSettledBuild && unit.unitData.hasHero)
            {
                return(false);
            }


            if (targetBuildType != BuildType.None && unit.unitData.buildType != targetBuildType)
            {
                return(false);
            }

            if (costHP > 0 && unit.unitData.hp < costHP)
            {
                return(false);
            }

            if (costHPPer > 0 && unit.unitData.hp < unit.unitData.GetBuildUplevelRequireHp(costHPPer))
            {
                return(false);
            }

            bool isUplevel = false;

            switch (skillType)
            {
            case SkillType.Build_Uplevel:
                isUplevel = true;
                break;
//			case SkillType.Build_Replace:
//				if(buildId == unit.unitData.buildConfig.id)
//				{
//					isUplevel = true;
//				}
//				break;
            }

            if (isUplevel)
            {
                if (!unit.levelData.GetSkillEnableUpLevel(addBuildMaxLevel))
                {
                    return(false);
                }
            }

            if (skillWarConfig.mainEffectData.target == (int)eSkillWarTargetType.eEffectTargetBuild)
            {
            }
            else if (skillWarConfig.mainEffectData.target == (int)eSkillWarTargetType.eEffectTargetEmptyBuild)
            {
                if (unit.unitData.legionData.colorId == WarColor.Gray)
                {
                    return(false);
                }
            }
            else if (skillWarConfig.mainEffectData.target == (int)eSkillWarTargetType.eEffectTargetHeroBuild)
            {
                if (unit.heroData == null)
                {
                    return(false);
                }
            }



            switch (unitRelation)
            {
            case RelationType.Own:
                return(relation.ROwn());

                break;

            case RelationType.Friendly:
                return(relation.RFriendly());

                break;

            case RelationType.Enemy:
                if (unit.unitData.invincible)
                {
                    return(false);
                }
                return(relation.REnemy());

                break;
            }

            return(false);
        }
Esempio n. 4
0
 /** 建筑升级 */
 public void C_Turret(UnitCtl build, UnitCtl solider)
 {
     War.service.C_SyncTurret_0x826(build.unitData.uid, solider.unitData.uid);
 }
Esempio n. 5
0
 /** 发兵 */
 public void C_SendArm(UnitCtl from, UnitCtl to, int count, int idBegin)
 {
     War.service.C_SyncSendArm_0x820(from.unitData.id, to.unitData.id, count, idBegin);
 }
Esempio n. 6
0
        protected override void OnUpdate()
        {
            base.OnUpdate();

//			if(!unit.IsMyTeam)
//			{
//				if(isDrawing)
//				{
//					targetUnit = null;
//					isDrawing = false;
//					arrow.SetActive(false);
//				}
//				return;
//			}

            bool enableFrom = War.input.sendArm;

            if (enableFrom)
            {
                enableFrom = Games.Guides.Guide.warConfig.GetEnableSendArmFrom(unit.unitData.uid);
            }

            if (!enableFrom)
            {
                if (isDrawing)
                {
                    targetUnit = null;
                    isDrawing  = false;
                    arrow.SetActive(false);
                }
                return;
            }

            if (Input.GetMouseButtonDown(0))
            {
//				if (EventSystem.current == null || !EventSystem.current.IsPointerOverGameObject())
//				{
                if (IsSelf())
                {
                    isDown           = true;
                    preMousePosition = Input.mousePosition;
                    War.signal.HandDownBuild(unit.unitData.id);
                }
//				}
            }

            if (isDown)
            {
                offset = Input.mousePosition - preMousePosition;
                if (offset.sqrMagnitude > 0.1F)
                {
                    isDown = false;
                    DrawStart();
                }
            }

            if (isDrawing)
            {
                DrawMoveing();
            }

            if (Input.GetMouseButtonUp(0))
            {
                isDown = false;
                War.signal.HandUpBuild(unit.unitData.id);
                if (isDrawing)
                {
                    DrawEnd();
                }
            }
        }
        /** 鼠标--拖动 */
        public void OnDragHandler()
        {
//			Debug.Log("SkillOperateController OnDragHandler _isDrag=" + _isDrag);
            if (!interactable)
            {
                return;
            }
            ClearSelectCacheList();

            rectTransform.anchoredPosition = Input.mousePosition * rate;


            SkillOperateState operateState = SkillOperateState.Drag_Object;

            Ray          ray   = uiCamera.ScreenPointToRay(Input.mousePosition);
            RaycastHit2D hit2D = Physics2D.Raycast(ray.origin, ray.direction);

            if (hit2D.collider != null)
            {
                //如果射线检测到的gameobject为grid,就把当前Panel放在grid节点下
                if (hit2D.collider.gameObject == buttonStateRect)
                {
                    operateState = SkillOperateState.Drag_Button;
                }
            }

            if (data.skillConfig.operate == SkillOperateType.SelectUnit || data.skillConfig.operate == SkillOperateType.SelectCircle)
            {
                scaleNode.localScale = Vector3.one * Mathf.Lerp(1, 0f, operateState == SkillOperateState.Drag_Button ? Mathf.Abs(rectTransform.position.y - initPosition.y) / 2.5f : 1f);
            }
            else
            {
                scaleNode.localScale = Vector3.one * Mathf.Lerp(1, 0.5f, operateState == SkillOperateState.Drag_Button ? Mathf.Abs(rectTransform.position.y - initPosition.y) / 2.5f : 1f);
            }


            skillInfoNode.Visiable = operateState == SkillOperateState.Drag_Object;

            if (bezierArrow.useing)
            {
                if (data.operateState != operateState)
                {
                    bezierArrow.Visiable = operateState == SkillOperateState.Drag_Object;
                }
            }


            data.operateState = operateState;


            bool hasTarget = true;

            if (data.skillConfig.operate == SkillOperateType.SelectUnit)
            {
                hasTarget = data.candidateReceiveCount > 0;
            }
            skillInfoNode.HasTarget = hasTarget;

            bool       isSnap = data.skillConfig.operate == SkillOperateType.SelectUnit;
            RaycastHit hit3d;

            ray = Camera.main.ScreenPointToRay(Input.mousePosition);

            data.candidateEntity = null;

            if (isSnap && War.config.skillSnap && data.operateState == SkillOperateState.Drag_Object)
            {
                if (Physics.Raycast(ray, out hit3d, maxDistance, groundLayer.value))
                {
                    Vector3 hitPoint = hit3d.point.SetY(0F);

                    float   minDistance = float.MaxValue;
                    UnitCtl minEntity   = null;
                    for (int i = 0; i < data.candidateReceiveList.Count; i++)
                    {
                        UnitCtl entity   = data.candidateReceiveList [i];
                        float   distance = Vector3.Distance(hitPoint, entity.transform.position);
                        if (distance < minDistance)
                        {
                            minDistance = distance;
                            minEntity   = entity;
                        }
                    }

                    data.candidateEntity = minEntity;
                }
            }
            else
            {
                if (isSnap)
                {
                    if (Physics.Raycast(ray, out hit3d, maxDistance, unitLayer.value))
                    {
                        UnitCtl entity = hit3d.collider.gameObject.GetComponent <UnitCtl> ();
                        if (entity != null && data.EnableUse(entity))
                        {
                            data.candidateEntity = entity;
                        }
                    }
                }
                else if (data.skillConfig.operate == SkillOperateType.SelectCircle)
                {
                    if (Physics.Raycast(ray, out hit3d, maxDistance, groundLayer.value))
                    {
                        obj.transform.position = hit3d.point.SetY(0F);
                        List <UnitCtl> entityList = War.scene.SearchUnit(obj.transform.position, data.skillConfig.radius, data.skillConfig.unitType, data.legionId, data.skillConfig.relation);


                        for (int i = 0; i < entityList.Count; i++)
                        {
                            AddSelectCache(entityList[i]);
                        }


                        helpPoint.anchoredPosition = Camera.main.WorldToScreenPoint(obj.transform.position) * rate;
                    }
                }
            }

            if (isSnap)
            {
                if (data.candidateEntity != null)
                {
                    rectTransform.anchoredPosition = Camera.main.WorldToScreenPoint(data.candidateEntity.transform.position) * rate;
                    if (obj != null)
                    {
                        obj.transform.position = data.candidateEntity.transform.position;
                    }


                    AddSelectCache(data.candidateEntity);
                }
                else if (obj != null)
                {
                    if (Physics.Raycast(ray, out hit3d, maxDistance, groundLayer.value))
                    {
                        obj.transform.position = hit3d.point.SetY(0F);
                    }
                }

                helpPoint.anchoredPosition = rectTransform.anchoredPosition;
            }
            else
            {
                helpPoint.anchoredPosition = rectTransform.anchoredPosition;
            }



//			if(obj != null)
//			{
//
//				if(isSnap && Physics.Raycast(ray, out hit3d, maxDistance, unitLayer.value))
//				{
//					UnitCtl entity = hit3d.collider.gameObject.GetComponent<UnitCtl>();
//					if(entity != null && data.EnableUse(entity))
//					{
//						obj.transform.position = hit3d.collider.transform.position;
//
//
//						AddSelectCache (entity);
//					}
//
//				}
//				else if(Physics.Raycast(ray, out hit3d, maxDistance, groundLayer.value))
//				{
//					obj.transform.position = hit3d.point.SetY(0F);
//
//
//					List<UnitCtl>  entityList = War.scene.SearchUnit (obj.transform.position, data.skillConfig.radius, data.skillConfig.unitType, data.legionId,  data.skillConfig.relation);
////					List<UnitCtl>  entityList = War.scene.SearchUnit (obj.transform.position, data.skillConfig.radius, 0.USolider(true), data.legionId,  0.REnemy(true));
//
//
//					for(int i = 0; i < entityList.Count; i++)
//					{
//						AddSelectCache (entityList[i]);
//					}
//				}
//
//
//				helpPoint.anchoredPosition = Camera.main.WorldToScreenPoint(obj.transform.position) * rate;
//
//			}
//			else
//			{
//				if(isSnap && Physics.Raycast(ray, out hit3d, maxDistance, unitLayer.value))
//				{
//					UnitCtl entity = hit3d.collider.gameObject.GetComponent<UnitCtl>();
//					if(entity != null && data.EnableUse(entity))
//					{
//						rectTransform.anchoredPosition = Camera.main.WorldToScreenPoint(hit3d.collider.transform.position) * rate;
//						AddSelectCache (entity);
//					}
//				}
//
//				helpPoint.anchoredPosition = rectTransform.anchoredPosition;
//			}


            if (bezierArrow.useing)
            {
                bezierArrow.endAnchor.position = helpPoint.position + new Vector3(0, 0, 5);
            }



            SetSelectCacheListEffect();
        }
Esempio n. 8
0
        IEnumerator buildHurtOtherTimer(EffectParameter effectInfo)
        {
            UnitCtl unit = gameObject.GetComponent <UnitCtl>();

            effectInfo.waitTime = 9999;

            int timerCount = 0;

            //SkillWarConf skillWarConf = War.model.GetSkillWarConf(skillParameter.skillId);
            while (true)
            {
                try
                {
                    if (effectInfo.effect.buffAnimPath != "temp")
                    {
                        GameObject effectPrefab = WarRes.GetPrefab(effectInfo.effect.buffAnimPath);
                        GameObject effectAnim   = GameObject.Instantiate <GameObject>(effectPrefab);
                        effectAnim.transform.position = unit.transform.position;
                    }
                }
                catch (Exception e)
                {
                    if (Application.isEditor)
                    {
                        Debug.LogError(e);
                    }
                    break;
                }

                yield return(new WaitForSeconds(effectInfo.effect.time));

                try
                {
                    //DamageVO damageVo = War.skillWarManager.GetDamageParameter(effectInfo.value, false, DamageType.ATTACK, unit, effectInfo.caster);
                    // unit.Damage(damageVo);
                    UnitCtl unitEnemy = War.skillWarManager.GetEnemyBuildNearest(unit, effectInfo);
                    if (unitEnemy != null)
                    {
                        War.skillWarManager.sendSkillAnim(unit.transform.position, unitEnemy, effectInfo.effect.animPathStart, 5.0f, 1.0f);
                        StartCoroutine(buildHurt(unitEnemy, effectInfo));
                    }
                    Debug.Log(string.Format("<color=yellow> buildHurtOtherTimer all= effectid:{0}  </color>",
                                            effectInfo.effect.id));
                    timerCount++;
                    if (timerCount >= effectInfo.waitTime)
                    {
                        break;
                    }
                }
                catch (Exception e)
                {
                    if (Application.isEditor)
                    {
                        Debug.LogError(e);
                    }
                    break;
                }
            }

            effectInfo.waitTime = 0;
            CleanList();
            Debug.Log(string.Format("<color=white> buildHurtOtherTimer done=</color>"));
        }
Esempio n. 9
0
        /** 添加经验--箭塔攻击 */
        public virtual void AddExp_SoliderTurret(float num, UnitCtl unit)
        {
            float exp = num * LegionLevelSoliderExpConfig.SoliderTurretExp;

            AddExp(exp);
        }
Esempio n. 10
0
        IEnumerator effectBuildCantSendTimer(EffectParameter effectParameter, AttachPropData attachPropData, UnitCtl unit)
        {
            yield return(new WaitForSeconds(effectParameter.value));

            if (effectParameter.effect.type == (int)eSKillWarEffectType.eEffectReduceSpeedTo)//修改材质
            {
                unit.unitAgent.BackMaterial(WarMaterialsType.stateFreeze);
            }
            unit.unitData.RevokeProps(attachPropData, true);

            effectParameter.waitTime = 0;
            CleanList();
            Debug.Log(string.Format("<color=yellow> effectBuildCantSendTimer </color>"));
        }
Esempio n. 11
0
 public virtual void OnRelease()
 {
     unit = null;
 }
Esempio n. 12
0
        /** 判断该技能是否能应用到某个单位 */
        public bool EnableUse(UnitCtl unit, RelationType unitRelation)
        {
            if (isSettledBuild && unit.heroData != null)
            {
                return(false);
            }


            if (targetBuildType != BuildType.None && unit.unitData.buildType != targetBuildType)
            {
                return(false);
            }

            if (costHP > 0 && unit.unitData.hp < costHP)
            {
                return(false);
            }

            if (costHPPer > 0 && unit.unitData.hp < unit.unitData.GetBuildUplevelRequireHp(costHPPer))
            {
                return(false);
            }

            bool isUplevel = false;

            switch (skillType)
            {
            case SkillType.Build_Uplevel:
                isUplevel = true;
                break;
//			case SkillType.Build_Replace:
//				if(buildId == unit.unitData.buildConfig.id)
//				{
//					isUplevel = true;
//				}
//				break;
            }

            if (isUplevel)
            {
                if (!unit.levelData.GetSkillEnableUpLevel(addBuildMaxLevel))
                {
                    return(false);
                }
            }

            switch (unitRelation)
            {
            case RelationType.Own:
                return(relation.ROwn());

                break;

            case RelationType.Friendly:
                return(relation.RFriendly());

                break;

            case RelationType.Enemy:
                if (unit.unitData.invincible)
                {
                    return(false);
                }
                return(relation.REnemy());

                break;
            }

            return(false);
        }
Esempio n. 13
0
        public bool SearchCirclePosition(float radius, int legionId, int relation, out Vector3 result)
        {
            List <UnitCtl> soliderList = War.scene.soliderList;


            List <Vector3> pointTotals  = new List <Vector3>();
            List <Vector3> pointCenters = new List <Vector3>();
            List <int>     pointCounts  = new List <int>();

            float distance = radius * 2;

            for (int i = 0; i < soliderList.Count; i++)
            {
                UnitCtl entity = soliderList[i];

                RelationType relationType = entity.unitData.GetRelation(legionId);
                if (relation.RValue(relationType) == false)
                {
                    continue;
                }


                Vector3 pos        = entity.transform.position;
                bool    hasContain = false;
                for (int index = 0; index < pointCenters.Count; index++)
                {
                    Vector3 center = pointCenters[index];
                    if (Vector3.Distance(center, pos) <= distance)
                    {
                        pointTotals[index] += pos;
                        pointCounts[index] += 1;
                        pointCenters[index] = pointTotals[index] / pointCounts[index];
                        hasContain          = true;
                        break;
                    }
                }

                if (hasContain == false)
                {
                    pointTotals.Add(pos.Clone());
                    pointCenters.Add(pos.Clone());
                    pointCounts.Add(1);
                }
            }

            int maxIndex = -1;
            int maxCount = -1;

            for (int index = 0; index < pointCounts.Count; index++)
            {
                if (maxCount < pointCounts[index])
                {
                    maxCount = pointCounts[index];
                    maxIndex = index;
                }
            }

            if (maxIndex != -1)
            {
                result = pointCenters[maxIndex];

//				War.skillUse.selectCircleView.transform.position = result;
//				War.skillUse.selectCircleView.Radius = radius;
//				War.skillUse.selectCircleView.gameObject.SetActive(true);
                return(true);
            }

            result = Vector3.zero;


            return(false);
        }
Esempio n. 14
0
 virtual public void S_Send(UnitCtl target, int count, int idBegin)
 {
     ExeSend(target, count, idBegin);
 }