コード例 #1
0
        void Start()
        {
            //var playersToCreate = PlayersState.INSTANCE.GetPlayers();
            var playersToCreate = PlayersState.INSTANCE.PlayerInfos;

            if (playersToCreate.Count == 0)
            {
                Debug.Log("0 Players joined the game");
                return;
            }

            //var spawnPointManager = GameObject.FindObjectOfType<SpawnPointManager>();
            var allPlayerSettings = new List <PlayerSettings>(playersToCreate.Count);

            for (var i = 0; i < playersToCreate.Count; i++)
            {
                var playerMenuSettings = playersToCreate[i];
                allPlayerSettings.Add(
                    AddPlayer(
                        playerMenuSettings.Number,
                        playerMenuSettings.Color,
                        GetNextSpawnPoint()
                        )
                    );
            }
            AFEventManager.INSTANCE.PostEvent(AFEvents.PlayersAllCreated(allPlayerSettings));
        }
コード例 #2
0
        private void CollisionHandler(JCollider thisBody, JCollider otherBody)
        {
            var playerHealth = otherBody.GetComponent <PlayerHealth>();
            var otherColor   = settings.color;

            if (playerHealth != null)
            {
                var playerSettings = otherBody.GetComponent <PlayerSettings>();
                otherColor = playerSettings.color;
                if (playerHealth.DoDamage(settings.Damage))
                {
                    AFEventManager.INSTANCE.PostEvent(AFEvents.Kill(settings.PlayerOwnerNumber, playerSettings.playerNumber));
                }
            }
            else
            {
                Debug.Log("Bullet hit something else..");
            }

            if (playerHealth != null || settings.DestroyOnAnyOverlap)
            {
                Debug.Log("Time to destroy bullet");
                var hitParticles = Instantiate(settings.hitParticlesPrefab, transform.position, transform.rotation);
                var colorModule  = hitParticles.colorOverLifetime;
                colorModule.enabled = true;
                ParticleSystem.MinMaxGradient gradient = new ParticleSystem.MinMaxGradient(settings.color, otherColor);
                var mainModule = hitParticles.main;
                mainModule.startColor = gradient;
                Destroy(gameObject);
            }
        }
コード例 #3
0
        void Update()
        {
            if (!playerInput.InputIsFresh)
            {
                return;
            }

            timeSinceLastFire += Time.deltaTime;

            var tryToDropBomb = UsePlayerInput ? playerInput.input.Fire2 : false;

            if (BombDropped && tryToDropBomb)
            {
                AFEventManager.INSTANCE.PostEvent(AFEvents.BombTrigger(settings.playerNumber, true));
            }
            else if (tryToDropBomb && timeSinceLastFire >= minTimeBetweenFire)
            {
                timeSinceLastFire = 0;

                BombDropped = true;
                var newBomb = Instantiate(bombPrefab, transform.position, transform.rotation);
                newBomb.PlayerOwnerNumber = settings.playerNumber;
                newBomb.color             = settings.color;
            }
        }
コード例 #4
0
        private void HandleGameOver()
        {
            Debug.Log("Game over");

            var winningPlayer = currentRoundScores.SortedByDescendingScores()[0];

            AFEventManager.INSTANCE.PostEvent(AFEvents.GameOver(winningPlayer.PlayerNumber(), winningPlayer.Score(), winningPlayer.PlayerColor()));
        }
コード例 #5
0
        void Update()
        {
            var input = playerInputComponent.input;

            if (!startDelayManager.IsAwaiting && input.JoinLeave)
            {
                AFEventManager.INSTANCE.PostEvent(AFEvents.PauseMenuEnable(playerSettings.playerNumber, playerSettings.color));
            }
        }
コード例 #6
0
        private void TriggerExplosionDueToLifeTime()
        {
            if (AlreadyTriggered)
            {
                return;
            }

            AFEventManager.INSTANCE.PostEvent(AFEvents.BombTrigger(settings.PlayerOwnerNumber, false));
            TriggerExplosion();
        }
コード例 #7
0
 // returns true if player is killed, false otherwise
 public bool DoDamage(int damage)
 {
     healthLeft -= damage;
     if (healthLeft <= 0)
     {
         healthLeft = 0;
         Debug.Log("Player " + settings.playerNumber + " died!");
         AFEventManager.INSTANCE.PostEvent(AFEvents.HealthDamage(settings.playerNumber, damage, healthLeft));
         PlayerDeathManager.instance.RegisterPlayerDeath(settings);
         return(true);
     }
     AFEventManager.INSTANCE.PostEvent(AFEvents.HealthDamage(settings.playerNumber, damage, healthLeft));
     return(false);
 }
コード例 #8
0
        void HandlePlayerKilledEvent(KilledEventPayload payload)
        {
            var killerScore = currentRoundScores.GetScoreForPlayer <UndeadScore>(payload.playerNumberOfKiller);
            var killedScore = currentRoundScores.GetScoreForPlayer <UndeadScore>(payload.playerNumberOfKilledPlayer);

            if (killerScore.Undead && killedScore.Undead)
            {
                // Undead player killed another undead player.
                // This is uninteresting. Won't generate a Scoring event
                return;
            }

            if (payload.playerNumberOfKilledPlayer == payload.playerNumberOfKiller)
            {
                // Player killed itself, should become undead. Won't generate a Scoring event
                killedScore.Undead = true;
                MakeUndead(PlayerFetcher.FindPlayerByPlayerNumber(killedScore.PlayerNumber()));
            }
            else
            {
                // Player killed another player. Will generate a Scoring event
                var scoreForKillV2 = killerScore.Undead ? UndeadKillPoints : AliveKillPoints;
                killerScore.IncreaseScoreBy(scoreForKillV2);

                if (!killedScore.Undead)
                {
                    killedScore.Undead = true;
                    MakeUndead(PlayerFetcher.FindPlayerByPlayerNumber(killedScore.PlayerNumber()));
                }
                AFEventManager.INSTANCE.PostEvent(AFEvents.Score(payload.playerNumberOfKiller, killerScore.Score(), killerScore.Score()));
            }
            killedScore.Deaths++;

            if (currentRoundScores.DoTrueForAllCheck(score => ((UndeadScore)score).Undead))
            {
                if (IsEntireGameOver())
                {
                    Debug.Log("Game over, all players are undead!");
                    var winningScoreForRound = currentRoundScores.SortedByDescendingScores()[0];
                    AFEventManager.INSTANCE.PostEvent(AFEvents.GameOver(winningScoreForRound.PlayerNumber(), winningScoreForRound.Score(), winningScoreForRound.PlayerColor()));
                }
                else
                {
                    Debug.Log("Round over, all players are undead!");
                    var winningScore = currentRoundScores.SortedByDescendingScores()[0];
                    AFEventManager.INSTANCE.PostEvent(AFEvents.RoundOver(winningScore.PlayerNumber(), winningScore.Score(), winningScore.PlayerColor()));
                }
            }
        }
コード例 #9
0
        public bool HandleEvent(AFEvent afEvent)
        {
            switch (afEvent.type)
            {
            case AFEventType.KILLED:
            {
                HandlePlayerKilledEvent((KilledEventPayload)afEvent.payload);
                return(true);
            }

            case AFEventType.PLAYERS_ALL_CREATED:
            {
                var payload = (PlayersAllCreatedPayload)afEvent.payload;
                HandleGameStart(payload.AllPlayers);
                return(true);
            }

            case AFEventType.COUNT_DOWN_FINISHED:
            {
                var payload = (CountDownFinishedPayload)afEvent.payload;
                if (!payload.TimerName.Equals(RoundTimerName))
                {
                    break;
                }
                countDownTimerInstance.StopTimer();
                if (IsEntireGameOver())
                {
                    Debug.Log("Game over, time ran out!");
                    var winningScore = currentRoundScores.SortedByDescendingScores()[0];
                    AFEventManager.INSTANCE.PostEvent(AFEvents.GameOver(winningScore.PlayerNumber(), winningScore.Score(), winningScore.PlayerColor()));
                }
                else
                {
                    Debug.Log("Round over, time ran out!");
                    var winningScore = currentRoundScores.SortedByDescendingScores()[0];
                    AFEventManager.INSTANCE.PostEvent(AFEvents.RoundOver(winningScore.PlayerNumber(), winningScore.Score(), winningScore.PlayerColor()));
                }
                break;
            }

            case AFEventType.GAME_START:
            {
                countDownTimerInstance.StartTimer();
                break;
            }
            }
            return(false);
        }
コード例 #10
0
        private void ReEnablePlayer(PlayerSettings playerSettings)
        {
            playerSettings.GetComponent <PlayerHealth>().ResetHealth();
            var playerHealth = playerSettings.GetComponent <PlayerHealth>();

            playerHealth.ResetHealth();
            AFEventManager.INSTANCE.PostEvent(AFEvents.Respawn(playerSettings.playerNumber, playerHealth.HealthLeft));

            EnableOrDisablePlayer(playerSettings, true);

            var newSpawnPoint = spawnPointManager.GetNextSpawnPoint();
            var pTransform    = playerSettings.transform;

            pTransform.position = newSpawnPoint.position;
            pTransform.rotation = newSpawnPoint.rotation;
        }
コード例 #11
0
        private void AddUIForAllPlayers(List <PlayerSettings> players)
        {
            var width = entireMenuBarUIArea.rect.width / players.Count;

            for (var i = 0; i < players.Count; i++)
            {
                var player = players[i];
                var uiPlayerElementInstance = Instantiate(uiPlayerElementPrefab, entireMenuBarUIArea);
                uiPlayerElementInstance.BackgroundColor = new Color(player.color.r, player.color.g, player.color.b, uiPlayerElementInstance.BackgroundColor.a);
                uiPlayerElementInstance.PlayerNumber    = player.playerNumber;
                uiPlayerElementInstance.Position        = new Vector3(i * width + 0.5f * width, 0f, 0f);
                uiPlayerElementInstance.health          = player.MaxHealth;
                playerToUiElement.Add(player.playerNumber, uiPlayerElementInstance);

                AFEventManager.INSTANCE.PostEvent(AFEvents.PlayerMenuBarUICreated(player.playerNumber));
            }
        }
コード例 #12
0
        public void TriggerExplosion()
        {
            if (AlreadyTriggered)
            {
                return;
            }

            AlreadyTriggered = true;

            var colliders            = colliderManager.FindOverlaps(collider);
            var playerCollidersCount = 0;

            for (var i = 0; i < colliders.Count; i++)
            {
                var playerSettings = colliders[i].GetComponent <PlayerSettings>();
                var playerHealth   = colliders[i].GetComponent <PlayerHealth>();
                var playerPhysics  = colliders[i].GetComponent <PlayerPhysics>();

                if (playerSettings != null && playerHealth != null && playerPhysics != null)
                {
                    playerCollidersCount++;
                    var explosionDirection       = (playerSettings.transform.position - transform.position);
                    var distance                 = explosionDirection.magnitude;
                    var centerDistanceMultiplier = 1f - distance / settings.BlastRadius;
                    var blastDamage              = Mathf.Max(1, Mathf.RoundToInt(settings.BlastDamage * centerDistanceMultiplier));
                    var blastDamageMultiplier    = settings.BlastDamage / settings.MaxBlastDamageSetting;
                    var resultingSpeed           = playerPhysics.Speed * playerPhysics.MovementDirection + explosionDirection.normalized * settings.BlastAcceleration * settings.BlastAccelerationDuration * centerDistanceMultiplier * blastDamageMultiplier;
                    playerPhysics.Speed             = resultingSpeed.magnitude;
                    playerPhysics.MovementDirection = resultingSpeed.normalized;

                    if (playerHealth.DoDamage(blastDamage))
                    {
                        AFEventManager.INSTANCE.PostEvent(AFEvents.Kill(settings.PlayerOwnerNumber, playerSettings.playerNumber));
                    }
                }
            }

            AFEventManager.INSTANCE.RemoveListener(this);
            var explosionParticles  = Instantiate(explosionParticlesPrefab, transform.position, transform.rotation);
            var particlesMainModule = explosionParticles.main;

            particlesMainModule.startColor = settings.color;
            Destroy(gameObject);
        }
コード例 #13
0
        public void AttachWeapon(Weapon weaponPrefab, WeaponUpgradePath upgradePath)
        {
            var weaponInstance = Instantiate(weaponPrefab, transform);

            weaponInstance.bulletColor  = settings.color;
            weaponInstance.PlayerNumber = settings.playerNumber;

            if (activeWeaponInstance != null)
            {
                Destroy(activeWeaponInstance.gameObject);
            }
            activeWeaponInstance    = weaponInstance;
            ActiveWeaponUpgradePath = upgradePath;

            AFEventManager.INSTANCE.PostEvent(AFEvents.WeaponUpgrade(
                                                  settings.playerNumber,
                                                  upgradePath.UpgradeProgress,
                                                  upgradePath.UpgradeColor
                                                  ));
        }
コード例 #14
0
        private bool HandleKilledEvent(KilledEventPayload payload)
        {
            if (payload.playerNumberOfKiller == payload.playerNumberOfKilledPlayer)
            {
                // Player killed itself, no score event generated for this...
                return(false);
            }

            var playerScore = currentRoundScores.GetScoreForPlayer <SimpleScore>(payload.playerNumberOfKiller);
            var newScore    = playerScore.IncreaseScoreBy(1);

            AFEventManager.INSTANCE.PostEvent(AFEvents.Score(payload.playerNumberOfKiller, newScore, maxScore));
            if (newScore == maxScore)
            {
                countDownTimerInstance.StopTimer();
                HandleGameOver();
            }

            //if (playerScores.ContainsKey(payload.playerNumberOfKiller))
            //{
            //    var oldScore = playerScores[payload.playerNumberOfKiller];
            //    var newScore = oldScore + 1;
            //    playerScores[payload.playerNumberOfKiller] = newScore;
            //    AFEventManager.INSTANCE.PostEvent(AFEvents.Score(payload.playerNumberOfKiller, newScore, maxScore));

            //    if (newScore == maxScore)
            //    {
            //        countDownTimerInstance.StopTimer();
            //        HandleGameOver();
            //    }
            //}
            //else
            //{
            //    playerScores.Remove(payload.playerNumberOfKilledPlayer);
            //}

            return(false);
        }
コード例 #15
0
 void NotifyCountDownFinished()
 {
     timeLeft = 0;
     UpdateText();
     AFEventManager.INSTANCE.PostEvent(AFEvents.ContDownOver(TimerName));
 }
コード例 #16
0
 void NotifyGameCanStart()
 {
     AFEventManager.INSTANCE.PostEvent(AFEvents.GameStart());
 }