예제 #1
0
    public override void PhysicsLogic(Fighter fighter)
    {
        switch (directive)
        {
        case Act.ATTACK:
            if (target)
            {
                Vector2 dif   = target.transform.position - transform.position;
                float   angle = Angle(dif) - 90f;

                if (dif.magnitude > maxDistance)
                {
                    fighter.Move(1);
                }
                else if (dif.magnitude < minDistance)
                {
                    fighter.Move(-1);
                }
                else
                {
                    fighter.Move(0);
                }

                if (Vector3.Distance(fighter.transform.position, target.transform.position) < attackRange && (angleBetween < minAttackAngle || fighter.CanBeAimed()))
                {
                    Vector3 inaccuracy = new Vector3(MathHelper.Rand(-attackInaccuracy, attackInaccuracy), MathHelper.Rand(-attackInaccuracy, attackInaccuracy));
                    angle += MathHelper.Rand(-attackInaccuracy, attackInaccuracy);

                    fighter.Aim(fighter.ReadyToFire() ? target.transform.position + inaccuracy : target.transform.position);
                    fighter.Fire();
                }

                foreach (Ship ship in Ship.ships)
                {
                    if (ship && Vector2.Distance(transform.position, ship.transform.position) < followRange && ship.shipID != fighter.shipID && (target == null || ship.shipID != target.shipID))
                    {
                        angle -= Vector2.SignedAngle(ship.transform.position, transform.position) / Mathf.Clamp(1f, (ship.transform.position - transform.position).sqrMagnitude, followRange);
                    }
                }

                RotateTowards(fighter, angle);
            }
            break;

        case Act.CHASE:
            if (target)
            {
                RotateTowards(fighter, Angle(target.transform.position - transform.position) - 90f);
                if (angleBetween < minAttackAngle)
                {
                    fighter.Move(1);
                }
            }
            break;

        case Act.EVADE:
            if (target)
            {
                RotateTowards(fighter, Angle(target.transform.position - transform.position) + 90f);
                fighter.Move(1);
            }
            break;

        case Act.WANDER:
            fighter.Move(speed);

            if (!changingDirection)
            {
                speed = MathHelper.Rand(0.25f, 1f);
                StartCoroutine(ChangeDirection(fighter));
            }
            break;
        }
    }
예제 #2
0
    public override void PhysicsLogic(Fighter fighter)
    {
        if (!DosMenu.isMenuOpen)
        {
            fighter.Move(Input.GetAxis("Vertical"), -Input.GetAxis("Horizontal"));

            if (fighter.module != null)
            {
                switch (fighter.module.GetModuleType())
                {
                case ShipModule.ModuleType.ACTIVE:
                    if (Input.GetKeyDown(KeyCode.Space))
                    {
                        fighter.module.OnActivate(fighter);
                    }
                    else
                    {
                        fighter.module.DuringNoUse(fighter);
                    }
                    break;

                case ShipModule.ModuleType.HELD:
                    if (Input.GetKey(KeyCode.Space))
                    {
                        if (fighter.module.isActive)
                        {
                            fighter.module.DuringUse(fighter);
                        }
                        else
                        {
                            fighter.module.isActive = true;
                            fighter.module.OnActivate(fighter);
                        }
                    }
                    else if (fighter.module.isActive)
                    {
                        fighter.module.isActive = false;
                        fighter.module.OnDeactivate(fighter);
                    }
                    else
                    {
                        fighter.module.DuringNoUse(fighter);
                    }
                    break;

                case ShipModule.ModuleType.TOGGLE:
                    if (Input.GetKeyDown(KeyCode.Space))
                    {
                        if (fighter.module.isActive)
                        {
                            fighter.module.isActive = false;
                            fighter.module.OnDeactivate(fighter);
                        }
                        else
                        {
                            fighter.module.isActive = true;
                            fighter.module.OnActivate(fighter);
                        }
                    }

                    if (fighter.module.isActive)
                    {
                        fighter.module.DuringUse(fighter);
                    }
                    else
                    {
                        fighter.module.DuringNoUse(fighter);
                    }
                    break;
                }
            }

            fighter.Aim(Camera.main.ScreenToWorldPoint(Input.mousePosition));
            if (Input.GetMouseButton(0))
            {
                fighter.Fire();
            }
        }
    }