Esempio n. 1
0
        private static ObjectAction GetPhase2Action(
            Dictionary <string, DTDanmakuImage> spriteNameToImageDictionary,
            Dictionary <string, EnemyObjectTemplate> enemyObjectTemplates,
            GuidGenerator guidGenerator)
        {
            string milliHpVariable = guidGenerator.NextGuid();
            string amountOfDamageTakenVariableName = guidGenerator.NextGuid();

            ObjectAction setInitialDamageTakenAction = ObjectActionGenerator.DoOnce(ObjectAction.SetNumericVariable(amountOfDamageTakenVariableName, MathExpression.Constant(0)));

            ObjectAction setInitialMilliHpVariable = ObjectActionGenerator.DoOnce(ObjectAction.SetNumericVariable(milliHpVariable, MathExpression.MilliHP()));

            ObjectAction setDamageTakenVariableAction = ObjectAction.SetNumericVariable(
                amountOfDamageTakenVariableName,
                MathExpression.Add(
                    MathExpression.Variable(amountOfDamageTakenVariableName),
                    MathExpression.Subtract(MathExpression.Variable(milliHpVariable), MathExpression.MilliHP())));

            ObjectAction setMilliHpVariable = ObjectAction.SetNumericVariable(milliHpVariable, MathExpression.MilliHP());

            long phase2InitialMilliHp = 200 * 1000;

            IMathExpression currentMilliHp = MathExpression.Max(
                MathExpression.Subtract(MathExpression.Constant(phase2InitialMilliHp), MathExpression.Variable(amountOfDamageTakenVariableName)),
                MathExpression.Constant(0));

            ObjectAction displayHpBarAction = ObjectAction.DisplayBossHealthBar(
                healthBarMeterNumber: MathExpression.Constant(2),
                healthBarMilliPercentage: MathExpression.Divide(MathExpression.Multiply(currentMilliHp, MathExpression.Constant(100 * 1000)), MathExpression.Constant(phase2InitialMilliHp)));

            ObjectAction goToPhase3Action = ObjectAction.Condition(
                condition: BooleanExpression.Equal(currentMilliHp, MathExpression.Constant(0)),
                action: ObjectActionGenerator.DoOnce(ObjectAction.SetNumericVariable(CurrentPhaseVariableName, MathExpression.Constant(3))));

            ObjectAction shootBulletAction = Phase2ShootAction(
                spriteNameToImageDictionary: spriteNameToImageDictionary,
                enemyObjectTemplates: enemyObjectTemplates,
                guidGenerator: guidGenerator);

            return(ObjectAction.Union(
                       setInitialDamageTakenAction,
                       setInitialMilliHpVariable,
                       setDamageTakenVariableAction,
                       setMilliHpVariable,
                       displayHpBarAction,
                       GetMoveAction(guidGenerator: guidGenerator),
                       goToPhase3Action,
                       shootBulletAction));
        }
Esempio n. 2
0
        private static ObjectAction GetPhase3Action(
            Dictionary <string, DTDanmakuImage> spriteNameToImageDictionary,
            Dictionary <string, EnemyObjectTemplate> enemyObjectTemplates,
            Dictionary <string, DTDanmakuSound> soundNameToSoundDictionary,
            GuidGenerator guidGenerator)
        {
            string milliHpVariable = guidGenerator.NextGuid();
            string amountOfDamageTakenVariableName = guidGenerator.NextGuid();

            ObjectAction setInitialDamageTakenAction = ObjectActionGenerator.DoOnce(ObjectAction.SetNumericVariable(amountOfDamageTakenVariableName, MathExpression.Constant(0)));

            ObjectAction setInitialMilliHpVariable = ObjectActionGenerator.DoOnce(ObjectAction.SetNumericVariable(milliHpVariable, MathExpression.MilliHP()));

            ObjectAction setDamageTakenVariableAction = ObjectAction.SetNumericVariable(
                amountOfDamageTakenVariableName,
                MathExpression.Add(
                    MathExpression.Variable(amountOfDamageTakenVariableName),
                    MathExpression.Subtract(MathExpression.Variable(milliHpVariable), MathExpression.MilliHP())));

            ObjectAction setMilliHpVariable = ObjectAction.SetNumericVariable(milliHpVariable, MathExpression.MilliHP());

            long phase3InitialMilliHp = 200 * 1000;

            IMathExpression currentMilliHp = MathExpression.Max(
                MathExpression.Subtract(MathExpression.Constant(phase3InitialMilliHp), MathExpression.Variable(amountOfDamageTakenVariableName)),
                MathExpression.Constant(0));

            ObjectAction displayHpBarAction = ObjectAction.DisplayBossHealthBar(
                healthBarMeterNumber: MathExpression.Constant(1),
                healthBarMilliPercentage: MathExpression.Divide(MathExpression.Multiply(currentMilliHp, MathExpression.Constant(100 * 1000)), MathExpression.Constant(phase3InitialMilliHp)));

            string       soundEffectName = guidGenerator.NextGuid();
            ObjectAction playEnemyDeathSoundEffectAction = ObjectAction.PlaySoundEffect(soundEffectName: soundEffectName);

            soundNameToSoundDictionary.Add(soundEffectName, DTDanmakuSound.EnemyDeath);

            DestructionAnimationGenerator.GenerateDestructionAnimationResult generateDestructionAnimationResult = DestructionAnimationGenerator.GenerateDestructionAnimation(
                orderedSprites: new List <DTDanmakuImage>
            {
                DTDanmakuImage.Explosion1,
                DTDanmakuImage.Explosion2,
                DTDanmakuImage.Explosion3,
                DTDanmakuImage.Explosion4,
                DTDanmakuImage.Explosion5,
                DTDanmakuImage.Explosion6,
                DTDanmakuImage.Explosion7,
                DTDanmakuImage.Explosion8,
                DTDanmakuImage.Explosion9
            },
                millisecondsPerSprite: 20,
                guidGenerator: guidGenerator);

            foreach (var entry in generateDestructionAnimationResult.spriteNameToImageDictionary)
            {
                spriteNameToImageDictionary.Add(entry.Key, entry.Value);
            }
            foreach (var entry in generateDestructionAnimationResult.enemyObjectTemplates)
            {
                enemyObjectTemplates.Add(entry.Key, entry.Value);
            }

            ObjectAction destroyBoss = ObjectAction.Union(
                playEnemyDeathSoundEffectAction,
                generateDestructionAnimationResult.objectAction,
                ObjectAction.Destroy());

            ObjectAction destroyAndEndLevelAction = ObjectAction.Condition(
                condition: BooleanExpression.Equal(currentMilliHp, MathExpression.Constant(0)),
                action: ObjectAction.Union(
                    ObjectAction.EndLevel(),
                    destroyBoss));

            ObjectAction shootBulletAction = Phase3ShootAction(
                spriteNameToImageDictionary: spriteNameToImageDictionary,
                enemyObjectTemplates: enemyObjectTemplates,
                guidGenerator: guidGenerator);

            return(ObjectAction.Union(
                       setInitialDamageTakenAction,
                       setInitialMilliHpVariable,
                       setDamageTakenVariableAction,
                       setMilliHpVariable,
                       displayHpBarAction,
                       GetMoveAction(guidGenerator: guidGenerator),
                       destroyAndEndLevelAction,
                       shootBulletAction));
        }