public void EquipWeapon(GameObject WeaponObject)
    {
        GameObject = WeaponObject;
        Animator   = GameObject.GetComponent <Animator>();
        Inputs     = GameObject.GetComponent <WeaponInputs>();
        Common     = new WeaponCommon(this);

        controller = new FSMController <WeaponController, eStates>(this);
        controller.RegisterState(eStates.Idle, new WeaponIdle());
        controller.RegisterState(eStates.Shoot, new WeaponShoot());
        controller.RegisterState(eStates.Reload, new WeaponReload());
        controller.RegisterState(eStates.Recoil, new WeaponRecoil());

        controller.AddMapping(eStates.Idle, eStates.Shoot, eStates.Reload);
        controller.AddMapping(eStates.Shoot, eStates.Recoil);
        controller.AddMapping(eStates.Reload, eStates.Idle, eStates.Shoot);
        controller.AddMapping(eStates.Recoil, eStates.Idle, eStates.Shoot, eStates.Reload);

        controller.SetLogToGUI(true, 2);

        controller.SetState(eStates.Idle);
        Common.Init();

        // sanity checks
        QLogger.Assert(Inputs.magCapacity > 0);
        QLogger.Assert(Inputs.reloadTime > 0 && Inputs.recoilTime > 0 && Inputs.accuracy > 0);
        // if ( Inputs.shotType == eShotType.BURST )
        //     QLogger.Assert ( Inputs.burstBulletCount > 1 );
        QLogger.Assert(Inputs.damage > 0 && Inputs.range > 0);
        QLogger.Assert(Inputs.muzzlePositionAndDirection != null);
    }
示例#2
0
        public override void Initialize(FSMController controller)
        {
            base.Initialize(controller);

            _unit      = Controller.gameObject.GetComponent <Unit>();
            _workPoint = _unit.ExtractPoint;
        }
示例#3
0
    private void Update()
    {
        if (newObjClicked)
        {
            newObjClicked = false;
            hpc           = clickedObject.GetComponent <HPController>();
            fsm           = clickedObject.GetComponent <FSMController>();
        }

        if (hpSlider == null || fsm == null)
        {
            return;
        }

        hpSlider.maxValue = hpc.MaxHp;
        hpSlider.value    = hpc.HP;

        if (fsm.team == HelperFunctions.Team.Cube)
        {
            teamText.text = "Cube";
        }
        else if (fsm.team == HelperFunctions.Team.Sphere)
        {
            teamText.text = "Sphere";
        }
        else if (fsm.team == HelperFunctions.Team.Neutral)
        {
            teamText.text = "Neutral";
        }

        UpdateStateText();
    }
示例#4
0
        private void Awake()
        {
            _commandHandler = GetComponent <CommandHandler>();
            _fsmController  = GetComponent <FSMController>();
            _gold           = new GoldResource();

            Animator = GetComponent <Animator>();
        }
示例#5
0
 public void CheckTrans(FSMController controller)
 {
     for (int i = 0; i < trans.Length; i++)
     {
         if (trans[i].transCheck())
         {
             if (trans[i].TrueState != null)
             {
                 controller.SetNextState(trans[i].TrueState);
                 break;
             }
         }
         else
         {
             if (trans[i].FalseState != null)
             {
                 controller.SetNextState(trans[i].FalseState);
                 break;
             }
         }
     }
 }
示例#6
0
    private void SpawnObject()
    {
        //TODO: Spawn logic
        if (settings.team == HelperFunctions.Team.Neutral)
        {
            return;
        }

        spawnTimer += Time.deltaTime;
        if (settings.team == HelperFunctions.Team.Cube && spawnTimer >= settings.spawnIntervalCube)
        {
            spawnTimer    = 0;
            spawnPoint    = HelperFunctions.GetPointInRange(transform.position, 1f, settings.spawnRadius);
            spawnedObject = SpawnController.SpawnObject(SpawnController.SpawnType.Cube, spawnPoint, Quaternion.identity);
        }
        else if (settings.team == HelperFunctions.Team.Sphere && spawnTimer >= settings.spawnIntervalSphere)
        {
            spawnTimer    = 0;
            spawnPoint    = HelperFunctions.GetPointInRange(transform.position, 1f, settings.spawnRadius);
            spawnedObject = SpawnController.SpawnObject(SpawnController.SpawnType.Sphere, spawnPoint, Quaternion.identity);
        }
        else
        {
            return;
        }

        fsm = spawnedObject.GetComponent <FSMController>();
        if (settings.team == HelperFunctions.Team.Cube && curDefenders < settings.defenceCountCube)
        {
            fsm.SetDefenceTarget(gameObject);
            curDefenders++;
        }
        else if (settings.team == HelperFunctions.Team.Sphere && curDefenders < settings.defenceCountSphere)
        {
            fsm.SetDefenceTarget(gameObject);
            curDefenders++;
        }
    }
    public void Init(GameObject characterObject, iPlayer player)
    {
        GameObject  = characterObject;
        this.player = player;
        Animator    = GameObject.GetComponent <Animator>();
        Inputs      = GameObject.GetComponent <CharacterInputs>();
        Common      = new CharacterCommon(this);

        controller = new FSMController <CharacterController, eStates>(this);
        controller.RegisterState(eStates.Idle, new CharacterIdle());
        controller.RegisterState(eStates.Walk, new CharacterIdleWalk());
        controller.RegisterState(eStates.Jump, new CharacterJump());
        controller.RegisterState(eStates.Falling, new CharacterFalling());

        controller.AddMapping(eStates.Idle, eStates.Jump, eStates.Walk, eStates.Falling);
        controller.AddMapping(eStates.Walk, eStates.Jump, eStates.Idle, eStates.Falling);
        controller.AddMapping(eStates.Jump, eStates.Idle, eStates.Walk, eStates.Falling);
        controller.AddMapping(eStates.Falling, eStates.Idle, eStates.Walk, eStates.Jump);

        controller.SetLogToGUI(true, 1);

        controller.SetState(eStates.Idle);
    }
示例#8
0
    private void StateAction()
    {
        switch (cState)
        {
        case StateMachine.CombatState.Defend:

            break;

        case StateMachine.CombatState.Attack:
            if (Vector3.Distance(transform.position, targetObject.transform.position) > attackRange)
            {
                if (!AvoidObstacle())
                {
                    RotateObject(targetObject.transform.position);
                }
            }
            else
            {
                if (targetObject == null)
                {
                    cState = StateMachine.CombatState.Idle;
                    mState = StateMachine.MovementState.Wander;
                    break;
                }

                if (targetScript == null)
                {
                    targetScript = targetObject.GetComponent <FSMController>();
                    if (targetScript == null)
                    {
                        targetObject = null;
                        //Debug.LogError("No target script found!");
                        return;
                    }
                }

                //Start attack animation if not running
                targetScript.DealDamage(dps * Time.deltaTime);
            }

            break;

        case StateMachine.CombatState.Death:
            Collider c = GetComponent <BoxCollider>();
            if (c == null)
            {
                GetComponent <SphereCollider>().enabled = false;
            }
            else
            {
                c.enabled = false;
            }

            if (defenceTarget != null)
            {
                defenceTarget.GetComponent <StatueScript>().ReduceDefenderCount();
            }

            isDead = true;
            SpawnController.DestroyObject(gameObject);
            break;

        case StateMachine.CombatState.Capture:

            //TODO: BUG: Still not working
            if (statueScript == null)
            {
                statueScript = targetObject.GetComponent <StatueScript>();
                if (statueScript == null)
                {
                    //Debug.LogError("No target script found!");
                    return;
                }
            }

            if (statueScript.Team == team)
            {
                targetObject = null;
                statueScript = null;
                cState       = StateMachine.CombatState.Idle;
                mState       = StateMachine.MovementState.Wander;
                break;
            }

            if (Vector3.Distance(transform.position, targetObject.transform.position) > 3f)
            {
                RotateObject(targetObject.transform.position);

                //Walk forward with fixed update
            }
            else
            {
                statueScript.DoCapture(team, (int)hpC.MaxHp);
                cState = StateMachine.CombatState.Death;
            }

            break;
        }

        switch (mState)
        {
        case StateMachine.MovementState.Wander:
            //TODO: Check obstacle avoidance, then rotate else wander rotate
            if (!AvoidObstacle())
            {
                if (!wanderActive)
                {
                    break;
                }
                rotateDir = Wander.Direction(rotSpeed, rotateDir, 10);
            }

            break;

        case StateMachine.MovementState.Seek:
            //TODO: Check obstacle avoidance, then rotate or move along path?
            //TODO: Check if enemy is close, then attack or flee
            if (!AvoidObstacle())
            {
                if (defenceTarget != null)
                {
                    RotateObject(defenceTarget.transform.position);
                    break;
                }

                if (targetObject != null)
                {
                    Vector3 disVector = targetObject.transform.position - transform.position;
                    if (HelperFunctions.VectorLength(disVector) < seekRange)
                    {
                        if (cState != StateMachine.CombatState.Capture)
                        {
                            RotateObject(disVector);
                        }
                    }
                }
            }

            break;

        case StateMachine.MovementState.Flee:
            if (!AvoidObstacle())
            {
                Vector3 disVector = (targetObject.transform.position - transform.position);
                if (HelperFunctions.VectorLength(disVector) <= fleeDistance)
                {
                    RotateObject(transform.position - disVector);
                }
            }

            break;

        case StateMachine.MovementState.Interpose:
            if (targetObject == null)
            {
                mState = StateMachine.MovementState.Wander;
                break;
            }

            if (defenceTarget != null)
            {
                Vector3 intercept = ((defenceTarget.transform.position - targetObject.transform.position) / 2) +
                                    targetObject.transform.position;
                RotateObject(intercept);
            }

            break;
        }
    }
示例#9
0
 // Use this for initialization
 void Awake()
 {
     fsmController = GetComponent <FSMController>();
 }
示例#10
0
 //Constructor
 public FSMState_Moving(FSMController FSMControllerRef) : base(FSMControllerRef, GameEnums.FSMInteractionEnum.Moving)
 {
 }
示例#11
0
 //Constructor
 public FSMState_Idle(FSMController FSMControllerRef) : base(FSMControllerRef, GameEnums.FSMInteractionEnum.Idle)
 {
 }
示例#12
0
 //Start
 private void Start()
 {
     _FSMController = new FSMController(this);
 }
示例#13
0
 public override void SetupAI(FSMController cont)
 {
     cont.Setup(ClientFSMFactory.GetInstance().GetState(E_ClientState.IDLE));
 }
示例#14
0
 //Constructor
 public FSMState_ExitOfPortal(FSMController FSMControllerRef) : base(FSMControllerRef, GameEnums.FSMInteractionEnum.ExitOfPortal)
 {
 }
示例#15
0
    private void StateCheck()
    {
        switch (cState)
        {
        case StateMachine.CombatState.Idle:
            if (defenceTarget == null)
            {
                cState = StateMachine.CombatState.Lookout;
            }
            else
            {
                cState = StateMachine.CombatState.Defend;
            }
            break;

        case StateMachine.CombatState.Lookout:
            //TODO: Check if enemies is close
            FindClosestEnemy();
            //If no objects close, mState wander and break
            if (targetObject == null)
            {
                mState = StateMachine.MovementState.Wander;
                break;
            }

            //Target object is now filtered to never be a friendly unit
            if (targetObject.CompareTag(cubeTag) || targetObject.CompareTag(sphereTag))
            {
                cState = StateMachine.CombatState.Attack;
            }
            else if (targetObject.CompareTag(statueTag))
            {
                mState = StateMachine.MovementState.Seek;
                cState = StateMachine.CombatState.Capture;
            }
            else if (targetObject.CompareTag(destroyerTag))
            {
                cState = StateMachine.CombatState.Lookout;
                mState = StateMachine.MovementState.Flee;
            }
            break;

        case StateMachine.CombatState.Attack:
            //TODO: Check if enemy is dead, or im dead
            mState = StateMachine.MovementState.Seek;
            if (hpC.HP <= 0)
            {
                cState       = StateMachine.CombatState.Death;
                targetObject = null;
            }
            else if (targetObject == null)                       //TODO: This might be a bug if the script is disabled
            {
                targetScript = null;
                FindClosestEnemy();
                if (targetObject == null)
                {
                    cState = StateMachine.CombatState.Idle;
                    break;
                }
            }

            if (Vector3.Distance(transform.position, targetObject.transform.position) > (attackRange * 1.5f))
            {
                targetObject = null;
                cState       = StateMachine.CombatState.Idle;
                mState       = StateMachine.MovementState.Wander;
            }
            break;

        case StateMachine.CombatState.Defend:
            //TODO: Check if enemy is close, then attack
            if (!defenceTarget.activeInHierarchy)
            {
                cState = StateMachine.CombatState.Lookout;
                mState = StateMachine.MovementState.Wander;
                break;
            }
            if (targetObjectDistance <= defendRange)
            {
                cState = StateMachine.CombatState.Attack;
                mState = StateMachine.MovementState.Seek;
            }
            else
            {
                //targetObject = defenceTarget;
            }
            break;

        case StateMachine.CombatState.Capture:
            if (targetObject == null)
            {
                cState = StateMachine.CombatState.Lookout;
            }
            break;
        }
    }
示例#16
0
 //Constructor
 public FSMState_PickupItem(FSMController FSMControllerRef) : base(FSMControllerRef, GameEnums.FSMInteractionEnum.PickupItem)
 {
 }
示例#17
0
 //Constructor
 public FSMState_ActivateItem(FSMController FSMControllerRef) : base(FSMControllerRef, GameEnums.FSMInteractionEnum.ActivateItem)
 {
 }
示例#18
0
 //Constructor
 public FSMState_UseLadder(FSMController FSMControllerRef) : base(FSMControllerRef, GameEnums.FSMInteractionEnum.UseLadder)
 {
 }
示例#19
0
 public override void SetupAI(FSMController cont)
 {
     cont.Setup(HunterFSMFactory.GetInstance().GetState(E_HunterState.IDLE));
 }
示例#20
0
 //Constructor
 public FSMState(FSMController FSMControllerRef, GameEnums.FSMInteractionEnum interactionType)
 {
     this.FSMControllerRef = FSMControllerRef;
     this.interactionType  = interactionType;
 }
示例#21
0
    private void StateAction()
    {
        switch (cState)
        {
        case StateMachine.CombatState.Defend:
            //TODO: - wander om ikke i range, seek om utenfor range, interpose om destroyer kommer, angripe om enemy kommer
            if (Vector3.Distance(transform.position, defenceTarget.transform.position) > defendRange)
            {
                if (RotateObject(defenceTarget.transform.position, 3))
                {
                    //speed = 0.1f;
                }
                mState = StateMachine.MovementState.Seek;
            }                    /*
                                  * if (targetObject.CompareTag()) //hvordan se at det er en kule når man er firkant?
                                  * {
                                  * cState = StateMachine.CombatState.Attack;
                                  * mState = StateMachine.MovementState.Seek;
                                  * }*/
            if (targetObject.CompareTag(destroyerTag))
            {
                mState = StateMachine.MovementState.Interpose;
            }
            else
            {
                mState = StateMachine.MovementState.Idle;
            }
            break;

        case StateMachine.CombatState.Attack:
            if (Vector3.Distance(transform.position, targetObject.transform.position) > attackRange)
            {
                if (!AvoidObstacle())
                {
                    RotateObject(targetObject.transform.position, 3);
                }
            }
            else
            {
                if (targetObject == null)
                {
                    cState = StateMachine.CombatState.Idle;
                    mState = StateMachine.MovementState.Wander;
                    break;
                }
                if (targetScript == null)
                {
                    targetScript = targetObject.GetComponent <FSMController>();
                    if (targetScript == null)
                    {
                        Debug.LogError("No target script found!");
                        return;
                    }
                }
                //Start attack animation if not running
                targetScript.DealDamage(dps * Time.deltaTime);
            }
            break;

        case StateMachine.CombatState.Death:
            Collider c = GetComponent <BoxCollider>();
            if (c == null)
            {
                GetComponent <SphereCollider>().enabled = false;
            }
            else
            {
                c.enabled = false;
            }

            if (defenceTarget != null)
            {
                defenceTarget.GetComponent <StatueScript>().ReduceDefenderCount();
            }
            //Start death animaiton
            isDead = true;
            Destroy(gameObject);
            break;

        case StateMachine.CombatState.Capture:

            if (statueScript == null)
            {
                statueScript = targetObject.GetComponent <StatueScript>();
                if (statueScript == null)
                {
                    Debug.LogError("No target script found!");
                    return;
                }
            }
            if (statueScript.Team == team)
            {
                targetObject = null;
                statueScript = null;
                cState       = StateMachine.CombatState.Idle;
                mState       = StateMachine.MovementState.Wander;
                break;
            }

            if (Vector3.Distance(transform.position, targetObject.transform.position) > 3f)
            {
                RotateObject(targetObject.transform.position, 3);

                //Walk forward with fixed update
            }
            else
            {
                statueScript.DoCapture(team, (int)hpC.MaxHp);
                cState = StateMachine.CombatState.Death;
            }
            break;
        }

        switch (mState)
        {
        case StateMachine.MovementState.Wander:
            //TODO: Check obstacle avoidance, then rotate else wander rotate
            if (!AvoidObstacle())
            {
                if (!wanderActive)
                {
                    break;
                }
                rotateDir = Wander.Direction(rotSpeed, rotateDir, 10);
            }
            break;

        case StateMachine.MovementState.Seek:
            //TODO: Check obstacle avoidance, then rotate or move along path?
            //TODO: Check if enemy is close, then attack or flee
            if (!AvoidObstacle())
            {
                if (defenceTarget != null)
                {
                    RotateObject(defenceTarget.transform.position, 4);
                    break;
                }
                Vector3 disVector = targetObject.transform.position - transform.position;
                if (HelperFunctions.VectorLength(disVector) < seekRange)
                {
                    if (cState != StateMachine.CombatState.Capture)
                    {
                        RotateObject(disVector, 1.5f);
                    }
                }
            }
            break;

        case StateMachine.MovementState.Flee:
            //TODO: Check distance to enemies close, move away or resume
            if (!AvoidObstacle())
            {
                //From target to self, important to calculate target direction to flee to
                Vector3 disVector = (targetObject.transform.position - transform.position);
                if (HelperFunctions.VectorLength(disVector) <= fleeDistance)
                {
                    RotateObject(transform.position - disVector, 4);
                }
            }
            break;

        case StateMachine.MovementState.Interpose:
            if (defenceTarget != null)
            {
                Vector3 intercept = ((defenceTarget.transform.position - targetObject.transform.position) / 2);
                RotateObject(intercept + defenceTarget.transform.position, 4);
            }
            break;
        }
    }
示例#22
0
 public virtual void SetupAI(FSMController cont)
 {
 }
示例#23
0
 protected FSMState(FSMController controller, string id)
 {
     this.controller = controller;
     Id = id;
 }
示例#24
0
 //Constructor
 public FSMState_Victory(FSMController FSMControllerRef) : base(FSMControllerRef, GameEnums.FSMInteractionEnum.Victory)
 {
 }