void playSfx(AudioClip clip, YoumuSlashBeatMap.TargetBeat.Direction direction, bool varyPitch)
 {
     sfxSource.panStereo = voicePan *
                           (direction == YoumuSlashBeatMap.TargetBeat.Direction.Right ? 1f : -1f);
     sfxSource.pitch = (varyPitch ? MathHelper.randomRangeFromVector(voicePitchRange) : 1f)
                       * timeScale;
     sfxSource.PlayOneShot(clip);
 }
    void attemptSlash(YoumuSlashBeatMap.TargetBeat.Direction direction)
    {
        var hitTarget = timingData.BeatMap.getFirstHittableTarget(timingData.CurrentBeat,
                                                                  hitTimeFudge.x / timingData.BeatDuration, hitTimeFudge.y / timingData.BeatDuration, direction);

        if (hitTarget != null)
        {
            attacking = true;
            direction = hitTarget.HitDirection;
            hitTarget.launchInstance.slash(MathHelper.randomRangeFromVector(sliceAngleRange));
            nextIdleBeat = (int)hitTarget.HitBeat + 1;
            bool facingRight = direction == YoumuSlashBeatMap.TargetBeat.Direction.Right;
            setRigFacingRight(facingRight);
            setIdleFlipped(false);

            rigAnimator.SetTrigger("Attack");
            rigAnimator.ResetTrigger("Idle");

            float facingDirection = (facingRight ? -1f : 1f);
            spriteTrail.resetTrail(spriteTrailStartOffset * facingDirection, facingDirection);
        }
    }
Esempio n. 3
0
 public void playScheduled(YoumuSlashSoundEffect soundEffect, YoumuSlashBeatMap.TargetBeat.Direction direction, float time)
 {
     foreach (var sound in soundEffect.Sounds)
     {
         var newSource = Instantiate(audioSourcePrefab, transform);
         newSource.pitch     = MathHelper.randomRangeFromVector(sound.PitchRange) * timeScale;
         newSource.panStereo = getStereoPan(sound.PanAmount, direction);
         if (sound.PanSpeed != 0f)
         {
             newSource.GetComponent <YoumuSlashMovingAudioSource>().setSpeed(sound.PanSpeed * (direction == YoumuSlashBeatMap.TargetBeat.Direction.Left ? -1f : 1f));
         }
         newSource.clip = sound.Clip;
         if (time <= 0f)
         {
             newSource.Play();
         }
         else
         {
             AudioHelper.playScheduled(newSource, time);
         }
     }
 }
Esempio n. 4
0
 public void play(YoumuSlashSoundEffect soundEffect, YoumuSlashBeatMap.TargetBeat.Direction direction)
 => playScheduled(soundEffect, direction, 0f);
Esempio n. 5
0
 float getStereoPan(float panAmount, YoumuSlashBeatMap.TargetBeat.Direction direction) =>
 panAmount * (direction == YoumuSlashBeatMap.TargetBeat.Direction.Left ? -1f : 1f);
    void attemptSlash(YoumuSlashBeatMap.TargetBeat.Direction direction)
    {
        var  hitTarget = getFirstHittableTarget(direction);
        bool isHit     = hitTarget != null;

        if (holdAttack && !isHit && attacking)    //No slash if holdAttack is true and this slash attack is a miss and we're still attacking
        {
            return;
        }
        if (slashCooldownTimer > 0f && //No slash if cooldown timer isn't reached and attack is a miss
            (!isHit || !attackWasSuccess))       //Or if last attack was a miss
        {
            return;
        }
        else if (isHit)   //For force direction (auto-slash)
        {
            direction = hitTarget.HitDirection;
        }

        //From here below slash is confirmed
        attackWasSuccess       = isHit;
        slashCooldownTimer     = slashCooldown;
        noteMissReactionQueued = false;
        lastAttackTime         = Time.time;
        if (!(onAttack == null))
        {
            onAttack(hitTarget);
        }

        //Do animation stuff
        rigAnimator.SetBool("IsAttacking", true);
        bool reAttacking = attacking == true && direction == lastSliceDirection;

        rigAnimator.SetBool("ReAttack", reAttacking);
        lastSliceDirection = direction;
        bool attackingUp = (!attackedUp && attacking);

        if (hitTarget != null && hitTarget.ForceUp)
        {
            attackingUp = true;
        }
        rigAnimator.SetBool("AttackUp", attackingUp);
        attackedUp = attackingUp;
        rigAnimator.SetBool("AttackMissed", !isHit);
        disableNoteMissReaction();

        attacking = true;
        if (!isHit)
        {
            triggerMiss();
        }

        bool facingRight = direction == YoumuSlashBeatMap.TargetBeat.Direction.Right;

        setRigFacingRight(facingRight);
        setIdleFlipped(false);
        rigAnimator.SetTrigger("Attack");
        rigAnimator.ResetTrigger("Idle");
        rigAnimator.SetBool("Tense", false);
        untenseBeat = -1;
        rigAnimator.SetBool("LookBack", false);
        rigAnimator.SetTrigger("ResetLook");
        float facingDirection = (isRigFacingRight() ? -1f : 1f);

        spriteTrail.resetTrail(spriteTrailStartOffset * facingDirection);

        rigAnimator.SetBool("Scream", false);
        holdAttack = false;
        if (isHit)
        {
            //Hit successful
            hitTarget.launchInstance.slash(MathHelper.randomRangeFromVector(sliceAngleRange), slashAnimationEffectTime);
            nextIdleBeat = (int)hitTarget.HitBeat + 1;
            if (upsetResetHits > 0)
            {
                upsetResetHits--;
                if (upsetResetHits == 0)
                {
                    rigAnimator.SetBool("Upset", false);
                }
            }

            switch (hitTarget.HitEffect)
            {
            case (YoumuSlashBeatMap.TargetBeat.Effect.Scream):
                rigAnimator.SetBool("Scream", true);
                nextIdleBeat++;
                MicrogameController.instance.playSFX(screamClip);
                holdAttack = true;
                break;

            default:
                MicrogameController.instance.playSFX(hitVoiceClip, pitchMult: Random.Range(.95f, 1.05f));
                break;
            }
        }
        else
        {
            //Missed
            MicrogameController.instance.playSFX(hitVoiceClip, pitchMult: Random.Range(.95f, 1.05f));
        }

        spriteTrail.EnableSpawn = isHit ? (!reAttacking) : false;
    }
 YoumuSlashBeatMap.TargetBeat getFirstHittableTarget(YoumuSlashBeatMap.TargetBeat.Direction direction)
 {
     return(timingData.BeatMap.getFirstHittableTarget(timingData.CurrentBeat,
                                                      hitTimeFudge.x / timingData.BeatDuration, hitTimeFudge.y / timingData.BeatDuration, direction));
 }
    void attemptSlash(YoumuSlashBeatMap.TargetBeat.Direction direction)
    {
        var  hitTarget = getFirstHittableTarget(direction, true);
        bool isHit     = hitTarget != null;

        if (Time.frameCount == lastSlashFrame)    //Return if slashed already this frame
        {
            return;
        }
        if (holdAttack && !isHit && attacking)    //No slash if holdAttack is true and this slash attack is a miss and we're still attacking
        {
            return;
        }
        if (slashCooldownTimer > 0f && //No slash if cooldown timer isn't reached and attack is a miss
            (!isHit || !attackWasSuccess))       //Or if last attack was a miss
        {
            return;
        }
        else if (isHit)   //For force direction (auto-slash)
        {
            direction = hitTarget.HitDirection;
        }

        //From here below slash attempt is confirmed
        lastSlashFrame         = Time.frameCount;
        attackWasSuccess       = isHit;
        slashCooldownTimer     = slashCooldown;
        noteMissReactionQueued = false;
        lastAttackTime         = Time.time;
        if (!(onAttack == null))
        {
            onAttack(hitTarget);
        }
        if (!attackWasSuccess && emptySwingsDepleteHealth)
        {
            noteMissReactionQueued = true;
        }

        //Do animation stuff
        rigAnimator.SetBool("IsAttacking", true);
        bool reAttacking = attacking == true && direction == lastSliceDirection;

        rigAnimator.SetBool("ReAttack", reAttacking);
        lastSliceDirection = direction;
        bool attackingUp = (!attackedUp && attacking);

        if (hitTarget != null && hitTarget.TypeData.ForceUp)
        {
            attackingUp = true;
        }
        rigAnimator.SetBool("AttackUp", attackingUp);
        attackedUp = attackingUp;
        rigAnimator.SetBool("AttackMissed", !isHit);
        disableNoteMissReaction();

        attacking = true;
        if (!isHit)
        {
            triggerMiss(emptySwingsDepleteHealth);
        }

        bool facingRight = direction == YoumuSlashBeatMap.TargetBeat.Direction.Right;

        setRigFacingRight(facingRight);
        setIdleFlipped(false);
        rigAnimator.SetTrigger("Attack");
        rigAnimator.ResetTrigger("Idle");
        rigAnimator.SetBool("Tense", false);
        untenseBeat = -1;
        rigAnimator.SetBool("LookBack", false);
        rigAnimator.SetTrigger("ResetLook");
        float facingDirection = (isRigFacingRight() ? -1f : 1f);


        rigAnimator.SetBool("Scream", false);
        holdAttack = false;
        if (isHit)
        {
            //Hit successful
            var offset = AutoSlash ? 0f
                : timingData.PreciseBeat - hitTarget.HitBeat;
            hitTarget.launchInstance.slash(MathHelper.randomRangeFromVector(sliceAngleRange), slashAnimationEffectTime, offset);
            nextIdleBeat = (int)hitTarget.HitBeat + 1;
            if (upsetResetHits > 0)
            {
                upsetResetHits--;
                if (upsetResetHits == 0)
                {
                    rigAnimator.SetBool("Upset", false);
                }
            }

            switch (hitTarget.TypeData.HitEffect)
            {
            case (YoumuSlashTargetType.Effect.Scream):
                rigAnimator.SetBool("Scream", true);
                nextIdleBeat++;
                playSfx(screamClip, direction, false);
                holdAttack = true;
                break;

            default:
                playSfx(getRandomHitClip(), direction, true);
                break;
            }
            if (!reAttacking)
            {
                spriteTrail.resetTrail(spriteTrailStartOffset * facingDirection, offset);
            }

            checkForGameplayEnd(hitTarget);
        }
        else
        {
            //Missed
            playSfx(getRandomHitClip(), direction, true);
            spriteTrail.resetTrail(spriteTrailStartOffset * facingDirection, 0f);
        }

        spriteTrail.EnableSpawn = isHit;// ? (!reAttacking) : false;
    }