Exemplo n.º 1
0
        // Spawns 3 bullets (120 degrees apart)
        private static ObjectAction SpawnSatelliteBullet(
            Dictionary <string, DTDanmakuImage> spriteNameToImageDictionary,
            Dictionary <string, EnemyObjectTemplate> enemyObjectTemplates,
            GuidGenerator guidGenerator)
        {
            string singleBulletSpriteName = guidGenerator.NextGuid();

            spriteNameToImageDictionary.Add(singleBulletSpriteName, DTDanmakuImage.OrbiterEnemyBullet);

            long buffer = 100;

            BooleanExpression shouldDestroySingleBullet = BooleanExpression.Or(
                BooleanExpression.GreaterThan(MathExpression.XMillis(), MathExpression.Constant((1000 + buffer) * 1000)),
                BooleanExpression.LessThan(MathExpression.XMillis(), MathExpression.Constant((0 - buffer) * 1000)),
                BooleanExpression.GreaterThan(MathExpression.YMillis(), MathExpression.Constant((700 + buffer) * 1000)),
                BooleanExpression.LessThan(MathExpression.YMillis(), MathExpression.Constant((0 - buffer) * 1000)));

            ObjectAction destroySingleBulletAction = ObjectAction.Condition(
                condition: shouldDestroySingleBullet,
                action: ObjectAction.Destroy());

            DTDanmakuMath.MathExpressionOffset singleBulletOffset = DTDanmakuMath.GetOffset(
                millipixels: MathExpression.Multiply(MathExpression.Constant(100), MathExpression.ElapsedMillisecondsPerIteration()),
                movementDirectionInMillidegrees: MathExpression.Variable("direction"));

            List <ObjectBox> collisionBoxes = new List <ObjectBox>();

            collisionBoxes.Add(new ObjectBox(lowerXMillis: -3000, upperXMillis: 3000, lowerYMillis: -5000, upperYMillis: 5000));
            collisionBoxes.Add(new ObjectBox(lowerXMillis: -5000, upperXMillis: 5000, lowerYMillis: -3000, upperYMillis: 3000));

            EnemyObjectTemplate singleBulletTemplate = EnemyObjectTemplate.EnemyBullet(
                action: ObjectAction.Union(
                    ObjectAction.SetFacingDirection(MathExpression.Variable("direction")),
                    ObjectAction.SetPosition(
                        xMillis: MathExpression.Add(MathExpression.XMillis(), singleBulletOffset.DeltaXInMillipixels),
                        yMillis: MathExpression.Add(MathExpression.YMillis(), singleBulletOffset.DeltaYInMillipixels)),
                    destroySingleBulletAction),
                initialMilliHP: null,
                damageBoxes: null,
                collisionBoxes: collisionBoxes,
                spriteName: singleBulletSpriteName);

            string singleBulletTemplateName = guidGenerator.NextGuid();

            enemyObjectTemplates.Add(singleBulletTemplateName, singleBulletTemplate);

            List <ObjectAction.InitialChildNumericVariableInfo> initialNumericVariables1 = new List <ObjectAction.InitialChildNumericVariableInfo>();

            initialNumericVariables1.Add(new ObjectAction.InitialChildNumericVariableInfo(name: "direction", value: MathExpression.Add(MathExpression.Variable("random offset"), MathExpression.Constant(0))));

            ObjectAction spawnSingleBulletAction1 = ObjectAction.SpawnChild(
                childXMillis: MathExpression.XMillis(),
                childYMillis: MathExpression.YMillis(),
                childObjectTemplateName: singleBulletTemplateName,
                childInitialNumericVariables: initialNumericVariables1,
                childInitialBooleanVariables: null);

            List <ObjectAction.InitialChildNumericVariableInfo> initialNumericVariables2 = new List <ObjectAction.InitialChildNumericVariableInfo>();

            initialNumericVariables2.Add(new ObjectAction.InitialChildNumericVariableInfo(name: "direction", value: MathExpression.Add(MathExpression.Variable("random offset"), MathExpression.Constant(120 * 1000))));

            ObjectAction spawnSingleBulletAction2 = ObjectAction.SpawnChild(
                childXMillis: MathExpression.XMillis(),
                childYMillis: MathExpression.YMillis(),
                childObjectTemplateName: singleBulletTemplateName,
                childInitialNumericVariables: initialNumericVariables2,
                childInitialBooleanVariables: null);

            List <ObjectAction.InitialChildNumericVariableInfo> initialNumericVariables3 = new List <ObjectAction.InitialChildNumericVariableInfo>();

            initialNumericVariables3.Add(new ObjectAction.InitialChildNumericVariableInfo(name: "direction", value: MathExpression.Add(MathExpression.Variable("random offset"), MathExpression.Constant(240 * 1000))));

            ObjectAction spawnSingleBulletAction3 = ObjectAction.SpawnChild(
                childXMillis: MathExpression.XMillis(),
                childYMillis: MathExpression.YMillis(),
                childObjectTemplateName: singleBulletTemplateName,
                childInitialNumericVariables: initialNumericVariables3,
                childInitialBooleanVariables: null);

            EnemyObjectTemplate placeholderTemplate = EnemyObjectTemplate.Placeholder(
                action: ObjectAction.Union(
                    ObjectAction.SetNumericVariable("random offset", MathExpression.RandomInteger(MathExpression.Constant(360 * 1000))),
                    spawnSingleBulletAction1,
                    spawnSingleBulletAction2,
                    spawnSingleBulletAction3,
                    ObjectAction.Destroy()));

            string placeholderTemplateName = guidGenerator.NextGuid();

            enemyObjectTemplates.Add(placeholderTemplateName, placeholderTemplate);

            return(ObjectAction.SpawnChild(
                       childXMillis: MathExpression.XMillis(),
                       childYMillis: MathExpression.YMillis(),
                       childObjectTemplateName: placeholderTemplateName,
                       childInitialNumericVariables: null,
                       childInitialBooleanVariables: null));
        }
Exemplo n.º 2
0
        private static ObjectAction SpawnBullet(
            IMathExpression bulletDirectionInMillidegrees,
            Dictionary <string, DTDanmakuImage> spriteNameToImageDictionary,
            Dictionary <string, EnemyObjectTemplate> enemyObjectTemplates,
            GuidGenerator guidGenerator)
        {
            string bulletSpriteName = guidGenerator.NextGuid();

            spriteNameToImageDictionary.Add(bulletSpriteName, DTDanmakuImage.BarrageEnemyBullet);

            string snapshotBulletDirectionInMillidegreesVariable = guidGenerator.NextGuid();

            ObjectAction snapshotDirectionAction = ObjectActionGenerator.DoOnce(ObjectAction.SetNumericVariable(
                                                                                    snapshotBulletDirectionInMillidegreesVariable,
                                                                                    bulletDirectionInMillidegrees));

            long buffer = 100;

            BooleanExpression shouldDestroy = BooleanExpression.Or(
                BooleanExpression.GreaterThan(MathExpression.XMillis(), MathExpression.Constant((1000 + buffer) * 1000)),
                BooleanExpression.LessThan(MathExpression.XMillis(), MathExpression.Constant((0 - buffer) * 1000)),
                BooleanExpression.GreaterThan(MathExpression.YMillis(), MathExpression.Constant((700 + buffer) * 1000)),
                BooleanExpression.LessThan(MathExpression.YMillis(), MathExpression.Constant((0 - buffer) * 1000)));

            ObjectAction destroyAction = ObjectAction.Condition(
                condition: shouldDestroy,
                action: ObjectAction.Destroy());

            DTDanmakuMath.MathExpressionOffset offset = DTDanmakuMath.GetOffset(
                millipixels: MathExpression.Multiply(MathExpression.Constant(100), MathExpression.ElapsedMillisecondsPerIteration()),
                movementDirectionInMillidegrees: MathExpression.Variable(snapshotBulletDirectionInMillidegreesVariable));

            List <ObjectBox> collisionBoxes = new List <ObjectBox>();

            collisionBoxes.Add(new ObjectBox(lowerXMillis: -3000, upperXMillis: 3000, lowerYMillis: -5000, upperYMillis: 5000));
            collisionBoxes.Add(new ObjectBox(lowerXMillis: -5000, upperXMillis: 5000, lowerYMillis: -3000, upperYMillis: 3000));

            EnemyObjectTemplate bulletTemplate = EnemyObjectTemplate.EnemyBullet(
                action: ObjectAction.Union(
                    snapshotDirectionAction,
                    ObjectAction.SetFacingDirection(MathExpression.Variable(snapshotBulletDirectionInMillidegreesVariable)),
                    ObjectAction.SetPosition(
                        xMillis: MathExpression.Add(MathExpression.XMillis(), offset.DeltaXInMillipixels),
                        yMillis: MathExpression.Add(MathExpression.YMillis(), offset.DeltaYInMillipixels)),
                    destroyAction),
                initialMilliHP: null,
                damageBoxes: null,
                collisionBoxes: collisionBoxes,
                spriteName: bulletSpriteName);

            string templateName = guidGenerator.NextGuid();

            enemyObjectTemplates.Add(templateName, bulletTemplate);

            return(ObjectAction.SpawnChild(
                       childXMillis: MathExpression.XMillis(),
                       childYMillis: MathExpression.Subtract(MathExpression.YMillis(), MathExpression.Constant(25000)),
                       childObjectTemplateName: templateName,
                       childInitialNumericVariables: null,
                       childInitialBooleanVariables: null));
        }
Exemplo n.º 3
0
        private static ObjectAction GetMoveAndSetCanShootVariableAction(
            IMathExpression xMillis,
            GuidGenerator guidGenerator)
        {
            string variableName = guidGenerator.NextGuid();

            ObjectAction initializeVariable = ObjectAction.SetNumericVariable(
                variableName: variableName,
                variableValue: MathExpression.Constant(0));

            ObjectAction incrementVariable = ObjectAction.SetNumericVariable(
                variableName: variableName,
                variableValue: MathExpression.Add(MathExpression.Variable(variableName), MathExpression.ElapsedMillisecondsPerIteration()));

            ObjectAction initializeAndIncrementVariable = ObjectAction.ConditionalNextAction(
                currentAction: initializeVariable,
                condition: BooleanExpression.True(),
                nextAction: incrementVariable);

            ObjectAction teleportToInitialLocation = ObjectAction.SetPosition(
                xMillis: xMillis,
                yMillis: MathExpression.Constant(800 * 1000));

            ObjectAction moveDownSpeed1 = ObjectAction.SetPosition(
                xMillis: MathExpression.XMillis(),
                yMillis: MathExpression.Subtract(MathExpression.YMillis(), MathExpression.Multiply(MathExpression.Constant(100), MathExpression.ElapsedMillisecondsPerIteration())));

            ObjectAction moveDownSpeed2 = ObjectAction.SetPosition(
                xMillis: MathExpression.XMillis(),
                yMillis: MathExpression.Subtract(MathExpression.YMillis(), MathExpression.Multiply(MathExpression.Constant(70), MathExpression.ElapsedMillisecondsPerIteration())));

            ObjectAction moveDownSpeed3 = ObjectAction.SetPosition(
                xMillis: MathExpression.XMillis(),
                yMillis: MathExpression.Subtract(MathExpression.YMillis(), MathExpression.Multiply(MathExpression.Constant(30), MathExpression.ElapsedMillisecondsPerIteration())));

            ObjectAction stopMovement = ObjectAction.Union(
                ObjectActionGenerator.Noop(),
                ObjectActionGenerator.DoOnce(ObjectAction.SetBooleanVariable("can shoot", BooleanExpression.True())));

            ObjectAction moveUpSpeed1 = ObjectAction.Union(
                ObjectActionGenerator.DoOnce(ObjectAction.SetBooleanVariable("can shoot", BooleanExpression.False())),
                ObjectAction.SetPosition(
                    xMillis: MathExpression.XMillis(),
                    yMillis: MathExpression.Add(MathExpression.YMillis(), MathExpression.Multiply(MathExpression.Constant(30), MathExpression.ElapsedMillisecondsPerIteration()))));

            ObjectAction moveUpSpeed2 = ObjectAction.SetPosition(
                xMillis: MathExpression.XMillis(),
                yMillis: MathExpression.Add(MathExpression.YMillis(), MathExpression.Multiply(MathExpression.Constant(70), MathExpression.ElapsedMillisecondsPerIteration())));

            ObjectAction moveUpSpeed3 = ObjectAction.SetPosition(
                xMillis: MathExpression.XMillis(),
                yMillis: MathExpression.Add(MathExpression.YMillis(), MathExpression.Multiply(MathExpression.Constant(100), MathExpression.ElapsedMillisecondsPerIteration())));

            ObjectAction destroyAction = ObjectAction.Condition(
                condition: BooleanExpression.GreaterThanOrEqualTo(MathExpression.YMillis(), MathExpression.Constant(800 * 1000)),
                action: ObjectAction.Destroy());

            return(ObjectAction.Union(
                       ObjectActionGenerator.DoOnce(ObjectAction.SetBooleanVariable("can shoot", BooleanExpression.False())),
                       initializeAndIncrementVariable,
                       ObjectActionGenerator.DoOnce(teleportToInitialLocation),
                       ObjectAction.ConditionalNextAction(
                           currentAction: moveDownSpeed1,
                           condition: BooleanExpression.GreaterThanOrEqualTo(MathExpression.Variable(variableName), MathExpression.Constant(3000)),
                           nextAction: ObjectAction.ConditionalNextAction(
                               currentAction: moveDownSpeed2,
                               condition: BooleanExpression.GreaterThanOrEqualTo(MathExpression.Variable(variableName), MathExpression.Constant(4000)),
                               nextAction: ObjectAction.ConditionalNextAction(
                                   currentAction: moveDownSpeed3,
                                   condition: BooleanExpression.GreaterThanOrEqualTo(MathExpression.Variable(variableName), MathExpression.Constant(5000)),
                                   nextAction: ObjectAction.ConditionalNextAction(
                                       currentAction: stopMovement,
                                       condition: BooleanExpression.GreaterThanOrEqualTo(MathExpression.Variable(variableName), MathExpression.Constant(12000)),
                                       nextAction: ObjectAction.ConditionalNextAction(
                                           currentAction: moveUpSpeed1,
                                           condition: BooleanExpression.GreaterThanOrEqualTo(MathExpression.Variable(variableName), MathExpression.Constant(13000)),
                                           nextAction: ObjectAction.ConditionalNextAction(
                                               currentAction: moveUpSpeed2,
                                               condition: BooleanExpression.GreaterThanOrEqualTo(MathExpression.Variable(variableName), MathExpression.Constant(14000)),
                                               nextAction: ObjectAction.Union(moveUpSpeed3, destroyAction)))))))));
        }
Exemplo n.º 4
0
        public static GenerateEnemiesResult GenerateEnemies(
            long elapsedMillisecondsPerIteration,
            IDTDeterministicRandom rng,
            GuidGenerator guidGenerator)
        {
            List <EnemyObject> enemyObjects = new List <EnemyObject>();
            Dictionary <string, DTDanmakuImage>      spriteNameToImageDictionary = new Dictionary <string, DTDanmakuImage>();
            Dictionary <string, EnemyObjectTemplate> enemyObjectTemplates        = new Dictionary <string, EnemyObjectTemplate>();
            Dictionary <string, DTDanmakuSound>      soundNameToSoundDictionary  = new Dictionary <string, DTDanmakuSound>();

            ObjectAction spawnWave1Enemy = GenerateWave1Enemy(
                spriteNameToImageDictionary: spriteNameToImageDictionary,
                enemyObjectTemplates: enemyObjectTemplates,
                soundNameToSoundDictionary: soundNameToSoundDictionary,
                guidGenerator: guidGenerator);

            ObjectAction spawnWave2Enemy = GenerateWave2Enemy(
                spriteNameToImageDictionary: spriteNameToImageDictionary,
                enemyObjectTemplates: enemyObjectTemplates,
                soundNameToSoundDictionary: soundNameToSoundDictionary,
                guidGenerator: guidGenerator);

            ObjectAction spawnWave3Enemy = GenerateWave3Enemy(
                spriteNameToImageDictionary: spriteNameToImageDictionary,
                enemyObjectTemplates: enemyObjectTemplates,
                soundNameToSoundDictionary: soundNameToSoundDictionary,
                guidGenerator: guidGenerator);

            ObjectAction spawnWave4Enemy = GenerateWave4Enemy(
                spriteNameToImageDictionary: spriteNameToImageDictionary,
                enemyObjectTemplates: enemyObjectTemplates,
                soundNameToSoundDictionary: soundNameToSoundDictionary,
                guidGenerator: guidGenerator);

            ObjectAction spawnSniperEnemy = SniperEnemyGenerator.SpawnSniperEnemy(
                spriteNameToImageDictionary: spriteNameToImageDictionary,
                enemyObjectTemplates: enemyObjectTemplates,
                soundNameToSoundDictionary: soundNameToSoundDictionary,
                guidGenerator: guidGenerator);

            ObjectAction spawnEliteSniperEnemy = EliteSniperEnemyGenerator.SpawnEliteSniperEnemy(
                spriteNameToImageDictionary: spriteNameToImageDictionary,
                enemyObjectTemplates: enemyObjectTemplates,
                soundNameToSoundDictionary: soundNameToSoundDictionary,
                guidGenerator: guidGenerator);

            ObjectAction spawnOrbiterEnemy = OrbiterEnemyGenerator.SpawnOrbiterEnemy(
                xMillis: MathExpression.Add(MathExpression.Constant(300 * 1000), MathExpression.RandomInteger(400 * 1000)),
                spriteNameToImageDictionary: spriteNameToImageDictionary,
                enemyObjectTemplates: enemyObjectTemplates,
                soundNameToSoundDictionary: soundNameToSoundDictionary,
                guidGenerator: guidGenerator);

            ObjectAction spawnEliteOrbiterEnemy = EliteOrbiterEnemyGenerator.SpawnEliteOrbiterEnemy(
                xMillis: MathExpression.Add(MathExpression.Constant(300 * 1000), MathExpression.RandomInteger(400 * 1000)),
                spriteNameToImageDictionary: spriteNameToImageDictionary,
                enemyObjectTemplates: enemyObjectTemplates,
                soundNameToSoundDictionary: soundNameToSoundDictionary,
                guidGenerator: guidGenerator);

            ObjectAction spawnBarrageEnemy = BarrageEnemyGenerator.SpawnBarrageEnemy(
                xMillis: MathExpression.Add(MathExpression.Constant(300 * 1000), MathExpression.RandomInteger(400 * 1000)),
                spriteNameToImageDictionary: spriteNameToImageDictionary,
                enemyObjectTemplates: enemyObjectTemplates,
                soundNameToSoundDictionary: soundNameToSoundDictionary,
                guidGenerator: guidGenerator);

            ObjectAction spawnEliteBarrageEnemy = EliteBarrageEnemyGenerator.SpawnEliteBarrageEnemy(
                xMillis: MathExpression.Add(MathExpression.Constant(300 * 1000), MathExpression.RandomInteger(400 * 1000)),
                spriteNameToImageDictionary: spriteNameToImageDictionary,
                enemyObjectTemplates: enemyObjectTemplates,
                soundNameToSoundDictionary: soundNameToSoundDictionary,
                guidGenerator: guidGenerator);

            ObjectAction spawnBoss = BossEnemyGenerator.SpawnBossEnemy(
                spriteNameToImageDictionary: spriteNameToImageDictionary,
                enemyObjectTemplates: enemyObjectTemplates,
                soundNameToSoundDictionary: soundNameToSoundDictionary,
                guidGenerator: guidGenerator);

            for (int i = 0; i < 10; i++)
            {
                enemyObjects.Add(CreateActionExecutor(
                                     millisecondsToWait: 1000 * i,
                                     action: spawnWave1Enemy,
                                     elapsedMillisecondsPerIteration: elapsedMillisecondsPerIteration,
                                     rng: rng,
                                     guidGenerator: guidGenerator));
            }

            for (int i = 0; i < 10; i++)
            {
                enemyObjects.Add(CreateActionExecutor(
                                     millisecondsToWait: 3000 + 1000 * i,
                                     action: spawnWave2Enemy,
                                     elapsedMillisecondsPerIteration: elapsedMillisecondsPerIteration,
                                     rng: rng,
                                     guidGenerator: guidGenerator));
            }

            for (int i = 0; i < 6; i++)
            {
                enemyObjects.Add(CreateActionExecutor(
                                     millisecondsToWait: 16000 + 1000 * i,
                                     action: spawnSniperEnemy,
                                     elapsedMillisecondsPerIteration: elapsedMillisecondsPerIteration,
                                     rng: rng,
                                     guidGenerator: guidGenerator));
            }

            for (int i = 0; i < 6; i++)
            {
                enemyObjects.Add(CreateActionExecutor(
                                     millisecondsToWait: 20000 + 6000 * i,
                                     action: spawnOrbiterEnemy,
                                     elapsedMillisecondsPerIteration: elapsedMillisecondsPerIteration,
                                     rng: rng,
                                     guidGenerator: guidGenerator));
            }

            for (int i = 0; i < 6; i++)
            {
                enemyObjects.Add(CreateActionExecutor(
                                     millisecondsToWait: 23000 + 1500 * i,
                                     action: spawnWave3Enemy,
                                     elapsedMillisecondsPerIteration: elapsedMillisecondsPerIteration,
                                     rng: rng,
                                     guidGenerator: guidGenerator));
            }

            for (int i = 0; i < 6; i++)
            {
                enemyObjects.Add(CreateActionExecutor(
                                     millisecondsToWait: 25500 + 1500 * i,
                                     action: spawnWave4Enemy,
                                     elapsedMillisecondsPerIteration: elapsedMillisecondsPerIteration,
                                     rng: rng,
                                     guidGenerator: guidGenerator));
            }

            for (int i = 0; i < 4; i++)
            {
                enemyObjects.Add(CreateActionExecutor(
                                     millisecondsToWait: 29000 + 1700 * i,
                                     action: spawnBarrageEnemy,
                                     elapsedMillisecondsPerIteration: elapsedMillisecondsPerIteration,
                                     rng: rng,
                                     guidGenerator: guidGenerator));
            }

            for (int i = 0; i < 7; i++)
            {
                enemyObjects.Add(CreateActionExecutor(
                                     millisecondsToWait: 33000 + 1250 * i,
                                     action: spawnEliteSniperEnemy,
                                     elapsedMillisecondsPerIteration: elapsedMillisecondsPerIteration,
                                     rng: rng,
                                     guidGenerator: guidGenerator));
            }

            for (int i = 0; i < 4; i++)
            {
                enemyObjects.Add(CreateActionExecutor(
                                     millisecondsToWait: 38000 + 2100 * i,
                                     action: spawnEliteBarrageEnemy,
                                     elapsedMillisecondsPerIteration: elapsedMillisecondsPerIteration,
                                     rng: rng,
                                     guidGenerator: guidGenerator));
            }

            for (int i = 0; i < 8; i++)
            {
                enemyObjects.Add(CreateActionExecutor(
                                     millisecondsToWait: 43000 + 500 * i,
                                     action: spawnSniperEnemy,
                                     elapsedMillisecondsPerIteration: elapsedMillisecondsPerIteration,
                                     rng: rng,
                                     guidGenerator: guidGenerator));
            }

            for (int i = 0; i < 8; i++)
            {
                enemyObjects.Add(CreateActionExecutor(
                                     millisecondsToWait: 43250 + 500 * i,
                                     action: spawnEliteSniperEnemy,
                                     elapsedMillisecondsPerIteration: elapsedMillisecondsPerIteration,
                                     rng: rng,
                                     guidGenerator: guidGenerator));
            }

            for (int i = 0; i < 2; i++)
            {
                enemyObjects.Add(CreateActionExecutor(
                                     millisecondsToWait: 56000 + 6000 * i,
                                     action: spawnEliteOrbiterEnemy,
                                     elapsedMillisecondsPerIteration: elapsedMillisecondsPerIteration,
                                     rng: rng,
                                     guidGenerator: guidGenerator));
            }

            enemyObjects.Add(CreateActionExecutor(
                                 millisecondsToWait: 82000,
                                 action: spawnBoss,
                                 elapsedMillisecondsPerIteration: elapsedMillisecondsPerIteration,
                                 rng: rng,
                                 guidGenerator: guidGenerator));

            return(new GenerateEnemiesResult(
                       enemyObjects: enemyObjects,
                       spriteNameToImageDictionary: spriteNameToImageDictionary,
                       enemyObjectTemplates: enemyObjectTemplates,
                       soundNameToSoundDictionary: soundNameToSoundDictionary));
        }
Exemplo n.º 5
0
        public static GenerateDestructionAnimationResult GenerateDestructionAnimation(
            List <DTDanmakuImage> orderedSprites,
            long millisecondsPerSprite,
            GuidGenerator guidGenerator)
        {
            Dictionary <string, DTDanmakuImage>      spriteNameToImageDictionary = new Dictionary <string, DTDanmakuImage>();
            Dictionary <string, EnemyObjectTemplate> enemyObjectTemplates        = new Dictionary <string, EnemyObjectTemplate>();

            ObjectAction incrementElapsedTimeVariable = ObjectAction.SetNumericVariable(
                variableName: elapsedTimeInMillisVariableName,
                variableValue: MathExpression.Add(
                    leftSide: MathExpression.Variable(variableName: elapsedTimeInMillisVariableName),
                    rightSide: MathExpression.ElapsedMillisecondsPerIteration()));

            long startMilliseconds = 0;
            List <ObjectAction> actionsToUnionTogether = new List <ObjectAction>();

            actionsToUnionTogether.Add(incrementElapsedTimeVariable);
            for (int i = 0; i < orderedSprites.Count; i++)
            {
                DTDanmakuImage image      = orderedSprites[i];
                string         spriteName = guidGenerator.NextGuid();
                string         childObjectTemplateName = guidGenerator.NextGuid();

                Tuple <ObjectAction, EnemyObjectTemplate> result = SpawnOneDestructionSpriteImage(
                    startMilliseconds: startMilliseconds,
                    endMilliseconds: startMilliseconds + millisecondsPerSprite,
                    childObjectTemplateName: childObjectTemplateName,
                    spriteName: spriteName,
                    isLast: i == orderedSprites.Count - 1);
                startMilliseconds += millisecondsPerSprite;

                actionsToUnionTogether.Add(result.Item1);
                spriteNameToImageDictionary.Add(spriteName, image);
                enemyObjectTemplates.Add(childObjectTemplateName, result.Item2);
            }

            string placeholderObjectTemplateName = guidGenerator.NextGuid();

            List <ObjectAction.InitialChildNumericVariableInfo> initialChildNumericVariables = new List <ObjectAction.InitialChildNumericVariableInfo>();

            initialChildNumericVariables.Add(new ObjectAction.InitialChildNumericVariableInfo(elapsedTimeInMillisVariableName, MathExpression.Constant(0)));
            ObjectAction action = ObjectAction.SpawnChild(
                childXMillis: MathExpression.XMillis(),
                childYMillis: MathExpression.YMillis(),
                childObjectTemplateName: placeholderObjectTemplateName,
                childInitialNumericVariables: initialChildNumericVariables,
                childInitialBooleanVariables: null);

            EnemyObjectTemplate placeholderObjectTemplate = EnemyObjectTemplate.Enemy(
                action: ObjectAction.Union(actionsToUnionTogether),
                initialMilliHP: null,
                damageBoxes: null,
                collisionBoxes: null,
                spriteName: null);

            enemyObjectTemplates.Add(placeholderObjectTemplateName, placeholderObjectTemplate);

            return(new GenerateDestructionAnimationResult(
                       objectAction: action,
                       spriteNameToImageDictionary: spriteNameToImageDictionary,
                       enemyObjectTemplates: enemyObjectTemplates));
        }
Exemplo n.º 6
0
        public GameLogic(
            int fps,
            IDTDeterministicRandom rng,
            GuidGenerator guidGenerator,
            int soundVolume,
            bool debugMode)
        {
            this.fps = fps;
            this.elapsedTimeMillis = 0;
            long elapsedMillisPerFrame = 1000 / this.fps;

            this.soundVolume = soundVolume;

            this.debugMode = debugMode;

            this.rng = rng;
            this.rng.Reset();

            this.spriteNameToImageDictionary = new Dictionary <string, DTDanmakuImage>();
            this.enemyObjectTemplates        = new Dictionary <string, EnemyObjectTemplate>();
            this.soundNameToSoundDictionary  = new Dictionary <string, DTDanmakuSound>();

            List <DTDanmakuImage> playerDeadExplosionSprites = new List <DTDanmakuImage>();

            playerDeadExplosionSprites.Add(DTDanmakuImage.Explosion1);
            playerDeadExplosionSprites.Add(DTDanmakuImage.Explosion2);
            playerDeadExplosionSprites.Add(DTDanmakuImage.Explosion3);
            playerDeadExplosionSprites.Add(DTDanmakuImage.Explosion4);
            playerDeadExplosionSprites.Add(DTDanmakuImage.Explosion5);
            playerDeadExplosionSprites.Add(DTDanmakuImage.Explosion6);
            playerDeadExplosionSprites.Add(DTDanmakuImage.Explosion7);
            playerDeadExplosionSprites.Add(DTDanmakuImage.Explosion8);
            playerDeadExplosionSprites.Add(DTDanmakuImage.Explosion9);
            DestructionAnimationGenerator.GenerateDestructionAnimationResult playerDeadDestructionAnimationResult = DestructionAnimationGenerator.GenerateDestructionAnimation(
                orderedSprites: playerDeadExplosionSprites,
                millisecondsPerSprite: 200,
                guidGenerator: guidGenerator);
            foreach (var entry in playerDeadDestructionAnimationResult.spriteNameToImageDictionary)
            {
                this.spriteNameToImageDictionary.Add(entry.Key, entry.Value);
            }
            foreach (var entry in playerDeadDestructionAnimationResult.enemyObjectTemplates)
            {
                this.enemyObjectTemplates.Add(entry.Key, entry.Value);
            }

            this.player        = new Player(playerDeadDestructionAnimationResult.objectAction);
            this.playerBullets = new List <PlayerBullet>();
            this.powerUps      = new List <PowerUp>();

            GenerateEnemiesResult enemies = GenerateEnemiesForLevel.GenerateEnemies(
                elapsedMillisecondsPerIteration: elapsedMillisPerFrame,
                rng: rng,
                guidGenerator: guidGenerator);

            this.enemyObjects = enemies.enemyObjects;

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

            this.gameOverCountdownInMillis      = null;
            this.levelFinishedCountdownInMillis = null;

            this.shouldPlayPlayerShootSound       = false;
            this.playerShootSoundCooldownInMillis = 0;

            this.soundsThatNeedToBePlayed = new List <DTDanmakuSound>();

            this.bossHealthBar = new BossHealthBar();

            /*
             *      Note that since these debug things bypass regular game logic, they may break other stuff or crash the program
             *      (Should be used for debugging / development only)
             */
            if (this.debugMode)
            {
                this.player.numLivesLeft = 200;
            }

            this.debug_renderHitboxes = false;
        }