// Returns true if player still has at least one life remaining // Returns false if game over public bool DestroyPlayer( List <EnemyObject> enemyObjects, long elapsedMillisecondsPerIteration, IDTDeterministicRandom rng) { if (this.isDead) { throw new Exception(); } long playerXMillis = this.xMillis; long playerYMillis = this.yMillis; EnemyObjectTemplate template = EnemyObjectTemplate.Placeholder(action: ObjectAction.ConditionalNextAction( currentAction: this.playerDeathSpawnDestructionAnimationAction, condition: BooleanExpression.True(), nextAction: ObjectAction.Destroy())); enemyObjects.Add(new EnemyObject( template: template, initialXMillis: playerXMillis, initialYMillis: playerYMillis, playerXMillis: playerXMillis, playerYMillis: playerYMillis, elapsedMillisecondsPerIteration: elapsedMillisecondsPerIteration, isPlayerDestroyed: true, parent: null, initialNumericVariables: null, initialBooleanVariables: null, rng: rng)); this.isDead = true; if (this.numLivesLeft > 0) { this.numLivesLeft = this.numLivesLeft - 1; this.respawnTimeRemainingMillis = 750; return(true); } else { return(false); } }
private static EnemyObject CreateActionExecutor( long millisecondsToWait, ObjectAction action, long elapsedMillisecondsPerIteration, IDTDeterministicRandom rng, GuidGenerator guidGenerator) { return(new EnemyObject( template: EnemyObjectTemplate.Placeholder( action: ObjectActionGenerator.Delay( action: ObjectAction.Union(action, ObjectAction.Destroy()), milliseconds: millisecondsToWait, guidGenerator: guidGenerator)), initialXMillis: 0, initialYMillis: 0, playerXMillis: 0, playerYMillis: 0, elapsedMillisecondsPerIteration: elapsedMillisecondsPerIteration, isPlayerDestroyed: false, parent: null, initialNumericVariables: null, initialBooleanVariables: null, rng: rng)); }
// Spawns 12 bullets (30 degrees apart) private static ObjectAction SpawnSatelliteBullet( Dictionary <string, DTDanmakuImage> spriteNameToImageDictionary, Dictionary <string, EnemyObjectTemplate> enemyObjectTemplates, GuidGenerator guidGenerator) { string singleBulletSpriteName = guidGenerator.NextGuid(); spriteNameToImageDictionary.Add(singleBulletSpriteName, DTDanmakuImage.EliteOrbiterEnemyBullet); 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(30 * 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(60 * 1000)))); ObjectAction spawnSingleBulletAction3 = ObjectAction.SpawnChild( childXMillis: MathExpression.XMillis(), childYMillis: MathExpression.YMillis(), childObjectTemplateName: singleBulletTemplateName, childInitialNumericVariables: initialNumericVariables3, childInitialBooleanVariables: null); List <ObjectAction.InitialChildNumericVariableInfo> initialNumericVariables4 = new List <ObjectAction.InitialChildNumericVariableInfo>(); initialNumericVariables4.Add(new ObjectAction.InitialChildNumericVariableInfo(name: "direction", value: MathExpression.Add(MathExpression.Variable("random offset"), MathExpression.Constant(90 * 1000)))); ObjectAction spawnSingleBulletAction4 = ObjectAction.SpawnChild( childXMillis: MathExpression.XMillis(), childYMillis: MathExpression.YMillis(), childObjectTemplateName: singleBulletTemplateName, childInitialNumericVariables: initialNumericVariables4, childInitialBooleanVariables: null); List <ObjectAction.InitialChildNumericVariableInfo> initialNumericVariables5 = new List <ObjectAction.InitialChildNumericVariableInfo>(); initialNumericVariables5.Add(new ObjectAction.InitialChildNumericVariableInfo(name: "direction", value: MathExpression.Add(MathExpression.Variable("random offset"), MathExpression.Constant(120 * 1000)))); ObjectAction spawnSingleBulletAction5 = ObjectAction.SpawnChild( childXMillis: MathExpression.XMillis(), childYMillis: MathExpression.YMillis(), childObjectTemplateName: singleBulletTemplateName, childInitialNumericVariables: initialNumericVariables5, childInitialBooleanVariables: null); List <ObjectAction.InitialChildNumericVariableInfo> initialNumericVariables6 = new List <ObjectAction.InitialChildNumericVariableInfo>(); initialNumericVariables6.Add(new ObjectAction.InitialChildNumericVariableInfo(name: "direction", value: MathExpression.Add(MathExpression.Variable("random offset"), MathExpression.Constant(150 * 1000)))); ObjectAction spawnSingleBulletAction6 = ObjectAction.SpawnChild( childXMillis: MathExpression.XMillis(), childYMillis: MathExpression.YMillis(), childObjectTemplateName: singleBulletTemplateName, childInitialNumericVariables: initialNumericVariables6, childInitialBooleanVariables: null); List <ObjectAction.InitialChildNumericVariableInfo> initialNumericVariables7 = new List <ObjectAction.InitialChildNumericVariableInfo>(); initialNumericVariables7.Add(new ObjectAction.InitialChildNumericVariableInfo(name: "direction", value: MathExpression.Add(MathExpression.Variable("random offset"), MathExpression.Constant(180 * 1000)))); ObjectAction spawnSingleBulletAction7 = ObjectAction.SpawnChild( childXMillis: MathExpression.XMillis(), childYMillis: MathExpression.YMillis(), childObjectTemplateName: singleBulletTemplateName, childInitialNumericVariables: initialNumericVariables7, childInitialBooleanVariables: null); List <ObjectAction.InitialChildNumericVariableInfo> initialNumericVariables8 = new List <ObjectAction.InitialChildNumericVariableInfo>(); initialNumericVariables8.Add(new ObjectAction.InitialChildNumericVariableInfo(name: "direction", value: MathExpression.Add(MathExpression.Variable("random offset"), MathExpression.Constant(210 * 1000)))); ObjectAction spawnSingleBulletAction8 = ObjectAction.SpawnChild( childXMillis: MathExpression.XMillis(), childYMillis: MathExpression.YMillis(), childObjectTemplateName: singleBulletTemplateName, childInitialNumericVariables: initialNumericVariables8, childInitialBooleanVariables: null); List <ObjectAction.InitialChildNumericVariableInfo> initialNumericVariables9 = new List <ObjectAction.InitialChildNumericVariableInfo>(); initialNumericVariables9.Add(new ObjectAction.InitialChildNumericVariableInfo(name: "direction", value: MathExpression.Add(MathExpression.Variable("random offset"), MathExpression.Constant(240 * 1000)))); ObjectAction spawnSingleBulletAction9 = ObjectAction.SpawnChild( childXMillis: MathExpression.XMillis(), childYMillis: MathExpression.YMillis(), childObjectTemplateName: singleBulletTemplateName, childInitialNumericVariables: initialNumericVariables9, childInitialBooleanVariables: null); List <ObjectAction.InitialChildNumericVariableInfo> initialNumericVariables10 = new List <ObjectAction.InitialChildNumericVariableInfo>(); initialNumericVariables10.Add(new ObjectAction.InitialChildNumericVariableInfo(name: "direction", value: MathExpression.Add(MathExpression.Variable("random offset"), MathExpression.Constant(270 * 1000)))); ObjectAction spawnSingleBulletAction10 = ObjectAction.SpawnChild( childXMillis: MathExpression.XMillis(), childYMillis: MathExpression.YMillis(), childObjectTemplateName: singleBulletTemplateName, childInitialNumericVariables: initialNumericVariables10, childInitialBooleanVariables: null); List <ObjectAction.InitialChildNumericVariableInfo> initialNumericVariables11 = new List <ObjectAction.InitialChildNumericVariableInfo>(); initialNumericVariables11.Add(new ObjectAction.InitialChildNumericVariableInfo(name: "direction", value: MathExpression.Add(MathExpression.Variable("random offset"), MathExpression.Constant(300 * 1000)))); ObjectAction spawnSingleBulletAction11 = ObjectAction.SpawnChild( childXMillis: MathExpression.XMillis(), childYMillis: MathExpression.YMillis(), childObjectTemplateName: singleBulletTemplateName, childInitialNumericVariables: initialNumericVariables11, childInitialBooleanVariables: null); List <ObjectAction.InitialChildNumericVariableInfo> initialNumericVariables12 = new List <ObjectAction.InitialChildNumericVariableInfo>(); initialNumericVariables12.Add(new ObjectAction.InitialChildNumericVariableInfo(name: "direction", value: MathExpression.Add(MathExpression.Variable("random offset"), MathExpression.Constant(330 * 1000)))); ObjectAction spawnSingleBulletAction12 = ObjectAction.SpawnChild( childXMillis: MathExpression.XMillis(), childYMillis: MathExpression.YMillis(), childObjectTemplateName: singleBulletTemplateName, childInitialNumericVariables: initialNumericVariables12, childInitialBooleanVariables: null); List <ObjectAction> actionList = new List <ObjectAction>(); actionList.Add(ObjectAction.SetNumericVariable("random offset", MathExpression.RandomInteger(MathExpression.Constant(360 * 1000)))); actionList.Add(spawnSingleBulletAction1); actionList.Add(spawnSingleBulletAction2); actionList.Add(spawnSingleBulletAction3); actionList.Add(spawnSingleBulletAction4); actionList.Add(spawnSingleBulletAction5); actionList.Add(spawnSingleBulletAction6); actionList.Add(spawnSingleBulletAction7); actionList.Add(spawnSingleBulletAction8); actionList.Add(spawnSingleBulletAction9); actionList.Add(spawnSingleBulletAction10); actionList.Add(spawnSingleBulletAction11); actionList.Add(spawnSingleBulletAction12); actionList.Add(ObjectAction.Destroy()); EnemyObjectTemplate placeholderTemplate = EnemyObjectTemplate.Placeholder( action: ObjectAction.Union(actionList)); string placeholderTemplateName = guidGenerator.NextGuid(); enemyObjectTemplates.Add(placeholderTemplateName, placeholderTemplate); return(ObjectAction.SpawnChild( childXMillis: MathExpression.XMillis(), childYMillis: MathExpression.YMillis(), childObjectTemplateName: placeholderTemplateName, childInitialNumericVariables: null, childInitialBooleanVariables: null)); }