Exemple #1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="collision"></param>
        private bool OnTriggerCollide(Collider2D collision)
        {
            _untriggeredContacts.Remove(collision);

            if (_beingDestroyed)
            {
                return(true);
            }

            var shooter = (instigator as WeaponEquippable)?.shooter;

            if (shooter == null)
            {
                shooter = instigator as ShooterBehaviour;
            }

            if (shooter != null)
            {
                if (collision.GetComponent <ShooterBehaviour>() == shooter)
                {
                    return(false);
                }
            }

            var bulletReaction = collision.GetComponent <BulletReaction>();
            var tilemapChunk   = collision.GetComponent <TilemapChunk>();

            if (bulletReaction == null && tilemapChunk == null)
            {
                return(false);
            }

            var received = false;

            if (bulletReaction != null)
            {
                var bulletResponse = new BulletResponse(this, collision);
                bulletReaction.SendBulletReceive(bulletResponse);

                received = bulletResponse.received;
            }
            if (tilemapChunk != null)
            {
                received = true;
            }

            if (received)
            {
                _beingDestroyed = true;
                if (_hitAnimation)
                {
                    GameplayStatics.SpawnFireAndForgetAnimation(_hitAnimation, transform.position, Quaternion.identity)
                    .AddComponent <TileObjectRenderer>().additive = 12;
                }
                Destroy(gameObject);
            }

            return(received);
        }
Exemple #2
0
        /// <summary>
        ///
        /// </summary>
        public void BeginDestroy()
        {
            if (_isDestroyed)
            {
                return;
            }

            _isDestroyed = true;
            this.EmitSound(DestroySoundKey);

            if (_destroyAnimation != null)
            {
                GameplayStatics.SpawnFireAndForgetAnimation(_destroyAnimation, transform.position, transform.rotation)
                .AddComponent <TileObjectRenderer>();
            }
            GameplayStatics.ScatterSupply(transform, _supplyCost);

            Destroy(gameObject);
        }
Exemple #3
0
        /// <summary>
        ///
        /// </summary>
        private void Update()
        {
            if (_updateCount % frequency == 0)
            {
                var index = _updateCount / frequency;

                if (index >= explosions.Count)
                {
                    Destroy(gameObject);
                    return;
                }

                foreach (var pos in explosions[index])
                {
                    GameplayStatics.SpawnFireAndForgetAnimation(explosionAnimation, pos, Quaternion.identity)
                    .GetComponent <SpriteRenderer>().sortingLayerID = SortingLayerHelper.GetSortingLayerValue(StaticSortingLayer.Default);
                }
            }

            ++_updateCount;
        }
        /// <summary>
        ///
        /// </summary>
        /// <returns></returns>
        private IEnumerator TriggerExplosions()
        {
            this.EmitSound(ShipDamageSoundKey);
            CameraShakeManager.instance.Shake(_lastShipHitGameCameraShake);

            yield return(new WaitForSeconds(2f));

            var halfWidth          = GameConstants.SceneWidth / 2.0f;
            var halfHeight         = GameConstants.SceneHeight / 2.0f;
            var explosionSoundSkip = 0;

            do
            {
                var pos   = new Vector2(Random.Range(halfWidth * -1.0f, halfWidth), Random.Range(halfHeight * -1.0f, halfHeight));
                var index = Random.Range(0, _endGameExplosionAnimations.Count);

                GameplayStatics.SpawnFireAndForgetAnimation(_endGameExplosionAnimations[index], pos, Quaternion.identity)
                .GetComponent <SpriteRenderer>().sortingLayerID = SortingLayerHelper.GetSortingLayerValue(StaticSortingLayer.Default);

                explosionSoundSkip++;

                if (explosionSoundSkip > 5)
                {
                    this.EmitSound(ShipExplosionSoundKey, false);
                    explosionSoundSkip = 0;
                }

                CameraShakeManager.instance.Shake(_endGameCameraShake);

                if (_endGameExplosionRandomIntervalMax > _endGameExplosionIntervalMin)
                {
                    _endGameExplosionRandomIntervalMin -= _endGameExplosionDecrementValue;
                    _endGameExplosionRandomIntervalMax -= _endGameExplosionDecrementValue;
                }

                yield return(new WaitForSeconds(Random.Range(_endGameExplosionRandomIntervalMin, _endGameExplosionRandomIntervalMax)));
            } while (true);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="startPoint"></param>
        /// <param name="direction"></param>
        /// <param name="originalShot"></param>
        private void DoRay(Vector2 startPoint, Vector2 direction, bool originalShot)
        {
            var rebounced = false;

            var raycastHit = Physics2D.Raycast(startPoint, direction, GameConstants.SceneWidth, LayerMask.GetMask(SolidLayerName, CharacterLayerName));

            if (raycastHit.collider != null)
            {
                var damageComponent = raycastHit.collider.GetComponent <DamageComponent>();
                if (damageComponent != null)
                {
                    var opponent    = damageComponent as Character;
                    var takeDamages = opponent == null;

                    if (opponent != null)
                    {
                        if (opponent.GetComponent <InvincilityBuff>() != null)
                        {
                            takeDamages = false;
                        }
                        else
                        {
                            var dashState = opponent.gameplayStateHandler as CharacterGameplayState_Dash;
                            if (dashState != null)
                            {
                                takeDamages = false;
                                if (dashState.isActive)
                                {
                                    rebounced = true;
                                    var bounceDirection = direction * -1.0f;
                                    dashState.dashDeflectAbility.SpawnDeflectAnimation(dashState, opponent.transform);
                                    DoRay((Vector2)opponent.transform.position + bounceDirection * (GameConstants.HalfTileSize + 1.0f), bounceDirection, false);
                                }
                            }
                            else
                            {
                                opponent.Push(character.targetOrientation, 2000.0f, 0.1f);
                                takeDamages = true;
                            }
                        }
                    }

                    if (takeDamages)
                    {
                        damageComponent.TakeDamages(new DamageInfo
                        {
                            provider   = this,
                            damages    = (int)weaponDescriptor.damages,
                            damageType = weaponDescriptor.damageType,
                        });

                        if (opponent != null && opponent.resources.health <= 0)
                        {
                            SpawnHeadshot(opponent.transform);
                        }
                    }
                }
            }

            this.EmitSound(weaponDescriptor.fireSounds, true);
            DoKnockbackSequence();

            AddHeat(weaponDescriptor.heatPerShot);
            elapsedSinceLastFire = 0.0f;

            // Spawn fire effect.
            if (originalShot && weaponDescriptor.fireEffectPrefab != null)
            {
                Instantiate(weaponDescriptor.fireEffectPrefab, startPoint, muzzleTransform.rotation);
            }

            if (weaponDescriptor.shotTrailRenderer != null)
            {
                var shotTrail = Instantiate(weaponDescriptor.shotTrailRenderer, startPoint, muzzleTransform.rotation);
                shotTrail.transform.DOMove(raycastHit.point, 0.1f);
            }

            if (!rebounced && weaponDescriptor.impactAnimation != null)
            {
                GameplayStatics.SpawnFireAndForgetAnimation(weaponDescriptor.impactAnimation, raycastHit.point, Quaternion.identity);
            }
        }
Exemple #6
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="dashState"></param>
 /// <param name="transform"></param>
 public void SpawnDeflectAnimation(CharacterGameplayState_Dash dashState, Transform transform)
 {
     dashState.character.EmitSound(DeflectSoundKey);
     GameplayStatics.SpawnFireAndForgetAnimation(abilityData.deflectAnimation, transform.position, transform.rotation, dashState.character.transform);
 }
        /// <summary>
        ///
        /// </summary>
        private IEnumerator Spawn()
        {
            if (!canSpawn)
            {
                yield break;
            }

            if (_firstSpawn)
            {
                _firstSpawn = false;
                FirstSpawn();
            }

            _playerSpawnParticleSystem.Play();

            yield return(new WaitForSeconds(_spawnDelay));

            _playerSpawnParticleSystem.Stop();

            var animation = GameplayStatics.SpawnFireAndForgetAnimation(_playerSpawnAnimation, transform.position, Quaternion.identity);

            yield return(new WaitForSeconds(_materializationDelay));

            character = Instantiate(_characterPrefab, transform.position + spawnOffset, transform.rotation).GetComponent <Character>();
            var hitFlash = character.GetComponent <HitFlash>();

            hitFlash?.Flash(1.0f, 0.4f, 1f);
            var playerParams = GameModeParams.instance.playerParams[playerIndex - 1];

            character.GetComponent <GameplayTeam>().teamIndex    = teamIndex;
            character.GetComponent <CharacterResources>().supply = _supply;

            character.spawner             = this;
            character.characterDescriptor = playerParams.selectedCharacter;
            character.skinDescriptor      = playerParams.selectedSkin;
            character.name = $"Character_{playerParams.selectedSkin.name}";
            character.SetConstructsFromLoadout(playerParams.loadout);

            character.TryAddBuff <InvincilityBuff>(1.0f);
            character.SetWeapon(0, _defaultWeapon);
            character.Orientate(_orientation, _orientation);

            var playerIdBehaviour = Instantiate(_playerIdSpritePrefab, transform.position + _playerIdSpritePrefab.transform.position, Quaternion.identity, character.transform)
                                    .GetComponent <CharacterPlayerIdBehaviour>();

            if (playerParams.isAiControlled)
            {
                playerIdBehaviour.playerIndex = -1;
            }
            else
            {
                playerIdBehaviour.playerIndex = playerIndex;
            }
            playerIdBehaviour.color = character.characterDescriptor.mainColor;

            this.EmitSound(PlayerSpawnSoundKey);

            var additiveArmor = GameMode.instance.highestScore - score;

            if (additiveArmor > 0)
            {
                var powerUp = new ArmorPowerUp();
                powerUp.powerUpData = _armorPowerUpData;
                powerUp.Apply(character, additiveArmor);
            }

            GameMode.instance.OnCharacterSpawned(character);

            if (playerParams.isAiControlled)
            {
                var behaviourManager = new GameObject(nameof(AIBehaviourManager)).AddComponent <AIBehaviourManager>();
                behaviourManager.gameObject.layer = LayerMask.NameToLayer("CharacterAI");
                behaviourManager.GetComponent <AINavigationController>().navMesh = _navMesh;
                behaviourManager.transform.SetParent(character.transform);
            }
            else
            {
                var characterInput = character.gameObject.AddComponent <CharacterInput>();
                characterInput.userIndex           = playerParams.controllerIndex;
                characterInput.vibrationMultiplier = playerParams.vibrationMultiplier;
            }
        }