private static ObjectAction GetSatelliteShootAction( Dictionary <string, DTDanmakuImage> spriteNameToImageDictionary, Dictionary <string, EnemyObjectTemplate> enemyObjectTemplates, GuidGenerator guidGenerator) { IMathExpression initialShootCooldownInMillis = MathExpression.RandomInteger(6000); IMathExpression shootCooldownInMillis = MathExpression.Add(5000, MathExpression.RandomInteger(1000)); string cooldownVariableName = guidGenerator.NextGuid(); ObjectAction initialStartCooldownAction = ObjectAction.SetNumericVariable(cooldownVariableName, initialShootCooldownInMillis); ObjectAction startCooldownAction = ObjectAction.SetNumericVariable(cooldownVariableName, shootCooldownInMillis); ObjectAction decrementCooldownAction = ObjectAction.SetNumericVariable(cooldownVariableName, MathExpression.Subtract(MathExpression.Variable(cooldownVariableName), MathExpression.ElapsedMillisecondsPerIteration())); ObjectAction createBulletAction = SpawnSatelliteBullet( spriteNameToImageDictionary: spriteNameToImageDictionary, enemyObjectTemplates: enemyObjectTemplates, guidGenerator: guidGenerator); var createBulletWhenCooldownFinishedAction = ObjectAction.Condition( condition: BooleanExpression.LessThanOrEqualTo(MathExpression.Variable(cooldownVariableName), MathExpression.Constant(0)), action: ObjectAction.Union(startCooldownAction, createBulletAction)); return(ObjectAction.ConditionalNextAction( currentAction: initialStartCooldownAction, condition: BooleanExpression.True(), nextAction: ObjectAction.Union(decrementCooldownAction, createBulletWhenCooldownFinishedAction))); }
public static ObjectAction DestroyWhenHpIsZeroAndMaybeDropPowerUp( long chanceToDropPowerUpInMilliPercent, // ranges from 0 (meaning 0%) to 100,000 (meaning 100%) Dictionary <string, DTDanmakuImage> spriteNameToImageDictionary, Dictionary <string, EnemyObjectTemplate> enemyObjectTemplates, Dictionary <string, DTDanmakuSound> soundNameToSoundDictionary, GuidGenerator guidGenerator) { string soundEffectName = guidGenerator.NextGuid(); BooleanExpression isHpZero = BooleanExpression.LessThanOrEqualTo( MathExpression.MilliHP(), MathExpression.Constant(0)); 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 possiblySpawnPowerUpAction = ObjectAction.Condition( condition: BooleanExpression.LessThan( MathExpression.RandomInteger(MathExpression.Constant(100 * 1000)), MathExpression.Constant(chanceToDropPowerUpInMilliPercent)), action: ObjectAction.SpawnPowerUp()); return(ObjectAction.Condition( condition: isHpZero, action: ObjectAction.Union( playEnemyDeathSoundEffectAction, generateDestructionAnimationResult.objectAction, possiblySpawnPowerUpAction, ObjectAction.Destroy()))); }
private static ObjectAction GetShootBulletAction( Dictionary <string, DTDanmakuImage> spriteNameToImageDictionary, Dictionary <string, EnemyObjectTemplate> enemyObjectTemplates, GuidGenerator guidGenerator) { IMathExpression initialShootCooldownInMillis = MathExpression.RandomInteger(2750); IMathExpression shootCooldownInMillis = MathExpression.Add(1750, MathExpression.RandomInteger(1000)); string cooldownVariableName = guidGenerator.NextGuid(); string childObjectTemplateName = guidGenerator.NextGuid(); string enemyBulletSpriteName = guidGenerator.NextGuid(); IMathExpression facingAngleInMillidegrees = DTDanmakuMath.GetMovementDirectionInMillidegrees( currentX: MathExpression.XMillis(), currentY: MathExpression.YMillis(), desiredX: MathExpression.PlayerXMillis(), desiredY: MathExpression.Min(MathExpression.PlayerYMillis(), 300 * 1000)); DTDanmakuMath.MathExpressionOffset deltaXAndY = DTDanmakuMath.GetOffset( millipixels: MathExpression.Constant(40000), movementDirectionInMillidegrees: facingAngleInMillidegrees); ObjectAction initialStartCooldownAction = ObjectAction.SetNumericVariable(cooldownVariableName, initialShootCooldownInMillis); ObjectAction startCooldownAction = ObjectAction.SetNumericVariable(cooldownVariableName, shootCooldownInMillis); ObjectAction decrementCooldownAction = ObjectAction.SetNumericVariable(cooldownVariableName, MathExpression.Subtract(MathExpression.Variable(cooldownVariableName), MathExpression.ElapsedMillisecondsPerIteration())); ObjectAction createBulletAction = ObjectAction.SpawnChild( childXMillis: MathExpression.Add(MathExpression.XMillis(), deltaXAndY.DeltaXInMillipixels), childYMillis: MathExpression.Add(MathExpression.YMillis(), deltaXAndY.DeltaYInMillipixels), childObjectTemplateName: childObjectTemplateName, childInitialNumericVariables: null, childInitialBooleanVariables: null); List <ObjectBox> collisionBoxes = new List <ObjectBox>(); collisionBoxes.Add(new ObjectBox(lowerXMillis: -4000, upperXMillis: 4000, lowerYMillis: -4000, upperYMillis: 4000)); enemyObjectTemplates.Add(childObjectTemplateName, EnemyObjectTemplate.EnemyBullet( action: ObjectAction.Union(GetBulletMovementAction(guidGenerator: guidGenerator), GetBulletAnimationAction(guidGenerator: guidGenerator)), initialMilliHP: null, damageBoxes: null, collisionBoxes: collisionBoxes, spriteName: enemyBulletSpriteName)); spriteNameToImageDictionary.Add(enemyBulletSpriteName, DTDanmakuImage.EliteSniperEnemyBullet); var createBulletWhenCooldownFinishedAction = ObjectAction.Condition( condition: BooleanExpression.LessThanOrEqualTo(MathExpression.Variable(cooldownVariableName), MathExpression.Constant(0)), action: ObjectAction.Union(startCooldownAction, createBulletAction)); return(ObjectAction.ConditionalNextAction( currentAction: initialStartCooldownAction, condition: BooleanExpression.True(), nextAction: ObjectAction.Union(decrementCooldownAction, createBulletWhenCooldownFinishedAction))); }
public static ObjectAction ShootBulletStraightDownAction( IMathExpression initialShootCooldownInMillis, IMathExpression shootCooldownInMillis, // Where the bullet should spawn (relative to the enemy shooting the bullet) long xOffset, long yOffset, long bulletSpeedInPixelsPerSecond, Dictionary <string, DTDanmakuImage> spriteNameToImageDictionary, Dictionary <string, EnemyObjectTemplate> enemyObjectTemplates, GuidGenerator guidGenerator) { string cooldownVariableName = guidGenerator.NextGuid(); string childObjectTemplateName = guidGenerator.NextGuid(); string enemyBulletSpriteName = guidGenerator.NextGuid(); ObjectAction initialStartCooldownAction = ObjectAction.SetNumericVariable(cooldownVariableName, initialShootCooldownInMillis); ObjectAction startCooldownAction = ObjectAction.SetNumericVariable(cooldownVariableName, shootCooldownInMillis); ObjectAction decrementCooldownAction = ObjectAction.SetNumericVariable(cooldownVariableName, MathExpression.Subtract(MathExpression.Variable(cooldownVariableName), MathExpression.ElapsedMillisecondsPerIteration())); ObjectAction createBulletAction = ObjectAction.SpawnChild( childXMillis: MathExpression.Add(MathExpression.XMillis(), MathExpression.Constant(xOffset)), childYMillis: MathExpression.Add(MathExpression.YMillis(), MathExpression.Constant(yOffset)), childObjectTemplateName: childObjectTemplateName, childInitialNumericVariables: null, childInitialBooleanVariables: null); List <ObjectBox> collisionBoxes = new List <ObjectBox>(); collisionBoxes.Add(new ObjectBox(lowerXMillis: -3000, upperXMillis: 3000, lowerYMillis: -23000, upperYMillis: 23000)); enemyObjectTemplates.Add(childObjectTemplateName, EnemyObjectTemplate.EnemyBullet( action: BulletStraightDownAction(bulletSpeedInPixelsPerSecond: bulletSpeedInPixelsPerSecond), initialMilliHP: null, damageBoxes: null, collisionBoxes: collisionBoxes, spriteName: enemyBulletSpriteName)); spriteNameToImageDictionary.Add(enemyBulletSpriteName, DTDanmakuImage.EnemyBullet); var createBulletWhenCooldownFinishedAction = ObjectAction.Condition( condition: BooleanExpression.LessThanOrEqualTo(MathExpression.Variable(cooldownVariableName), MathExpression.Constant(0)), action: ObjectAction.Union(startCooldownAction, createBulletAction)); return(ObjectAction.ConditionalNextAction( currentAction: initialStartCooldownAction, condition: BooleanExpression.True(), nextAction: ObjectAction.Union(decrementCooldownAction, createBulletWhenCooldownFinishedAction))); }
private static ObjectAction Phase3ShootAction( Dictionary <string, DTDanmakuImage> spriteNameToImageDictionary, Dictionary <string, EnemyObjectTemplate> enemyObjectTemplates, GuidGenerator guidGenerator) { string angleVariable = guidGenerator.NextGuid(); string shootCooldownVariable = guidGenerator.NextGuid(); ObjectAction initializeAngleVariable = ObjectActionGenerator.DoOnce( ObjectAction.SetNumericVariable(angleVariable, MathExpression.Constant(0))); ObjectAction updateAngleVariableAction = ObjectAction.Union( ObjectAction.SetNumericVariable( angleVariable, MathExpression.Add(MathExpression.Variable(angleVariable), MathExpression.Multiply(MathExpression.Constant(431), MathExpression.ElapsedMillisecondsPerIteration()))), ObjectAction.Condition( condition: BooleanExpression.GreaterThan(MathExpression.Variable(angleVariable), MathExpression.Constant(360 * 1000)), action: ObjectAction.SetNumericVariable(angleVariable, MathExpression.Subtract(MathExpression.Variable(angleVariable), MathExpression.Constant(360 * 1000)))), ObjectAction.Condition( condition: BooleanExpression.GreaterThan(MathExpression.Variable(angleVariable), MathExpression.Constant(360 * 1000)), action: ObjectAction.SetNumericVariable(angleVariable, MathExpression.Constant(0)))); ObjectAction createBulletAction1 = SpawnPhase3Bullet( bulletDirectionInMillidegrees: MathExpression.Multiply(MathExpression.ParentVariable(angleVariable), MathExpression.Constant(1)), spriteNameToImageDictionary: spriteNameToImageDictionary, enemyObjectTemplates: enemyObjectTemplates, guidGenerator: guidGenerator); ObjectAction createBulletAction2 = SpawnPhase3Bullet( bulletDirectionInMillidegrees: MathExpression.Multiply(MathExpression.ParentVariable(angleVariable), MathExpression.Constant(-1)), spriteNameToImageDictionary: spriteNameToImageDictionary, enemyObjectTemplates: enemyObjectTemplates, guidGenerator: guidGenerator); IMathExpression shootCooldownInMillis = MathExpression.Constant(20); ObjectAction startCooldownAction = ObjectAction.SetNumericVariable(shootCooldownVariable, shootCooldownInMillis); ObjectAction decrementCooldownAction = ObjectAction.SetNumericVariable(shootCooldownVariable, MathExpression.Subtract(MathExpression.Variable(shootCooldownVariable), MathExpression.ElapsedMillisecondsPerIteration())); ObjectAction createBulletWhenCooldownFinishedAction = ObjectAction.Condition( condition: BooleanExpression.LessThanOrEqualTo(MathExpression.Variable(shootCooldownVariable), MathExpression.Constant(0)), action: ObjectAction.Union(startCooldownAction, createBulletAction1, createBulletAction2)); return(ObjectAction.Union( initializeAngleVariable, updateAngleVariableAction, ObjectActionGenerator.DoOnce(ObjectAction.SetNumericVariable(shootCooldownVariable, MathExpression.Constant(1000))), decrementCooldownAction, createBulletWhenCooldownFinishedAction)); }
public static ObjectAction BulletStraightDownAction( long bulletSpeedInPixelsPerSecond) { var enemyBulletMovementAction = ObjectAction.SetPosition( xMillis: MathExpression.XMillis(), yMillis: MathExpression.Add( MathExpression.YMillis(), MathExpression.Multiply( MathExpression.Constant(-bulletSpeedInPixelsPerSecond), MathExpression.ElapsedMillisecondsPerIteration()))); var enemyBulletDestroyAction = ObjectAction.Condition( condition: BooleanExpression.LessThanOrEqualTo(MathExpression.YMillis(), MathExpression.Constant(-700 * 1000)), action: ObjectAction.Destroy()); return(ObjectAction.Union(enemyBulletMovementAction, enemyBulletDestroyAction)); }
private static ObjectAction GetMoveAction(IMathExpression xMillis) { ObjectAction teleportToInitialLocation = ObjectAction.SetPosition( xMillis: xMillis, yMillis: MathExpression.Constant(900 * 1000)); ObjectAction moveDown = ObjectAction.SetPosition( xMillis: MathExpression.XMillis(), yMillis: MathExpression.Subtract(MathExpression.YMillis(), MathExpression.Multiply(MathExpression.Constant(35), MathExpression.ElapsedMillisecondsPerIteration()))); ObjectAction destroyAction = ObjectAction.Condition( condition: BooleanExpression.LessThanOrEqualTo(MathExpression.YMillis(), -200 * 1000), action: ObjectAction.Destroy()); return(ObjectAction.Union( ObjectActionGenerator.DoOnce(teleportToInitialLocation), moveDown, destroyAction)); }
private static ObjectAction GetMoveAction_Phase0() { ObjectAction teleportToInitialLocation = ObjectActionGenerator.DoOnce( ObjectAction.SetPosition( xMillis: MathExpression.Constant(500 * 1000), yMillis: MathExpression.Constant(850 * 1000))); ObjectAction moveAction = ObjectAction.Union( ObjectAction.StrafeMove(moveToXMillis: MathExpression.XMillis(), moveToYMillis: MathExpression.Constant(0)), ObjectAction.SetSpeed(MathExpression.Constant(20))); BooleanExpression shouldStopMoving = BooleanExpression.LessThanOrEqualTo( MathExpression.YMillis(), MathExpression.Constant(500 * 1000)); ObjectAction stopMovingAction = ObjectAction.SetSpeed(MathExpression.Constant(0)); ObjectAction setPhaseAction = ObjectAction.SetNumericVariable(CurrentPhaseVariableName, MathExpression.Constant(1)); return(ObjectAction.ConditionalNextAction( currentAction: ObjectAction.Union(teleportToInitialLocation, moveAction), condition: shouldStopMoving, nextAction: ObjectActionGenerator.DoOnce(ObjectAction.Union(stopMovingAction, setPhaseAction)))); }
private static Tuple <ObjectAction, BooleanExpression> MoveToSpecifiedLocations_Helper( long startingXMillis, long startingYMillis, long endingXMillis, long endingYMillis, long speedInPixelsPerSecond, bool shouldStrafe, GuidGenerator guidGenerator) { string variableName = guidGenerator.NextGuid(); string variableName2 = guidGenerator.NextGuid(); long?direction = DTDanmakuMath.GetMovementDirectionInMillidegrees( currentX: startingXMillis, currentY: startingYMillis, desiredX: endingXMillis, desiredY: endingYMillis); if (direction == null) { throw new Exception(); } DTDanmakuMath.Offset offset = DTDanmakuMath.GetOffset( speedInMillipixelsPerMillisecond: speedInPixelsPerSecond, // millipixels/millisecond is equivalent to pixels/second movementDirectionInMillidegrees: direction.Value, elapsedMillisecondsPerIteration: 1000); // Use the 1000 to help prevent rounding issues ObjectAction moveAction = ObjectAction.SetPosition( xMillis: MathExpression.Add(MathExpression.XMillis(), MathExpression.Divide(MathExpression.Multiply(MathExpression.Constant(offset.DeltaXInMillipixels), MathExpression.ElapsedMillisecondsPerIteration()), MathExpression.Constant(1000))), yMillis: MathExpression.Add(MathExpression.YMillis(), MathExpression.Divide(MathExpression.Multiply(MathExpression.Constant(offset.DeltaYInMillipixels), MathExpression.ElapsedMillisecondsPerIteration()), MathExpression.Constant(1000)))); ObjectAction setDirectionAction = shouldStrafe ? ObjectAction.SetFacingDirection(facingDirectionInMillidegrees: MathExpression.Constant(180 * 1000)) : ObjectAction.SetFacingDirection(facingDirectionInMillidegrees: MathExpression.Constant(direction.Value)); IMathExpression deltaX = MathExpression.AbsoluteValue(MathExpression.Subtract(MathExpression.XMillis(), MathExpression.Constant(endingXMillis))); IMathExpression deltaY = MathExpression.AbsoluteValue(MathExpression.Subtract(MathExpression.YMillis(), MathExpression.Constant(endingYMillis))); IMathExpression totalDelta = MathExpression.Add(deltaX, deltaY); ObjectAction setDeltaToVariable = ObjectAction.Union( ObjectAction.SetNumericVariable(variableName: variableName2, variableValue: MathExpression.Variable(variableName)), ObjectAction.SetNumericVariable(variableName: variableName, variableValue: totalDelta)); BooleanExpression reachedDestination = BooleanExpression.And( BooleanExpression.LessThanOrEqualTo( MathExpression.Variable(variableName2), MathExpression.Variable(variableName)), BooleanExpression.And( BooleanExpression.GreaterThanOrEqualTo(MathExpression.Variable(variableName), MathExpression.Constant(0)), BooleanExpression.GreaterThanOrEqualTo(MathExpression.Variable(variableName2), MathExpression.Constant(0)) )); ObjectAction initializeVariables = ObjectAction.Union( ObjectAction.SetNumericVariable(variableName: variableName, variableValue: MathExpression.Constant(-1)), ObjectAction.SetNumericVariable(variableName: variableName2, variableValue: MathExpression.Constant(-1))); return(new Tuple <ObjectAction, BooleanExpression>( ObjectAction.Union( moveAction, setDirectionAction, ObjectAction.ConditionalNextAction( currentAction: initializeVariables, condition: BooleanExpression.True(), nextAction: setDeltaToVariable)), reachedDestination)); }
private static ObjectAction GetMoveAction( GuidGenerator guidGenerator) { string movementCooldownVariable = guidGenerator.NextGuid(); ObjectAction setMovementCooldownAction = ObjectAction.SetNumericVariable( movementCooldownVariable, MathExpression.Add(MathExpression.Constant(500), MathExpression.RandomInteger(5000))); ObjectAction decrementMovementCooldownAction = ObjectAction.SetNumericVariable( movementCooldownVariable, MathExpression.Subtract(MathExpression.Variable(movementCooldownVariable), MathExpression.ElapsedMillisecondsPerIteration())); BooleanExpression shouldChangeMovement = BooleanExpression.LessThanOrEqualTo( MathExpression.Variable(movementCooldownVariable), MathExpression.Constant(0)); IMathExpression randomMilliAngle = MathExpression.RandomInteger(MathExpression.Constant(360 * 1000)); string angleVariable = guidGenerator.NextGuid(); ObjectAction writeNewAngleToVariable = ObjectAction.SetNumericVariable( angleVariable, randomMilliAngle); ObjectAction normalizeAngleVariable = ObjectAction.Union( ObjectAction.Condition( condition: BooleanExpression.LessThan(MathExpression.Variable(angleVariable), MathExpression.Constant(0)), action: ObjectAction.SetNumericVariable(angleVariable, MathExpression.Add(MathExpression.Variable(angleVariable), MathExpression.Constant(360 * 1000)))), ObjectAction.Condition( condition: BooleanExpression.GreaterThanOrEqualTo(MathExpression.Variable(angleVariable), MathExpression.Constant(360 * 1000)), action: ObjectAction.SetNumericVariable(angleVariable, MathExpression.Subtract(MathExpression.Variable(angleVariable), MathExpression.Constant(360 * 1000))))); BooleanExpression tooCloseToLeftEdge = BooleanExpression.LessThanOrEqualTo( MathExpression.XMillis(), MathExpression.Constant(200 * 1000)); ObjectAction updateAngleVariableLeft = ObjectAction.Condition( condition: BooleanExpression.And(tooCloseToLeftEdge, BooleanExpression.And( BooleanExpression.GreaterThanOrEqualTo(MathExpression.Variable(angleVariable), MathExpression.Constant(180 * 1000)), BooleanExpression.LessThanOrEqualTo(MathExpression.Variable(angleVariable), MathExpression.Constant(360 * 1000)))), action: ObjectAction.SetNumericVariable( angleVariable, MathExpression.Multiply(MathExpression.Variable(angleVariable), MathExpression.Constant(-1)))); BooleanExpression tooCloseToRightEdge = BooleanExpression.GreaterThanOrEqualTo( MathExpression.XMillis(), MathExpression.Constant(800 * 1000)); ObjectAction updateAngleVariableRight = ObjectAction.Condition( condition: BooleanExpression.And(tooCloseToRightEdge, BooleanExpression.And( BooleanExpression.GreaterThanOrEqualTo(MathExpression.Variable(angleVariable), MathExpression.Constant(0 * 1000)), BooleanExpression.LessThanOrEqualTo(MathExpression.Variable(angleVariable), MathExpression.Constant(180 * 1000)))), action: ObjectAction.SetNumericVariable( angleVariable, MathExpression.Multiply(MathExpression.Variable(angleVariable), MathExpression.Constant(-1)))); BooleanExpression tooCloseToTopEdge = BooleanExpression.GreaterThanOrEqualTo( MathExpression.YMillis(), MathExpression.Constant(600 * 1000)); ObjectAction updateAngleVariableTop = ObjectAction.Condition( condition: BooleanExpression.And(tooCloseToTopEdge, BooleanExpression.Or( BooleanExpression.GreaterThanOrEqualTo(MathExpression.Variable(angleVariable), MathExpression.Constant(270 * 1000)), BooleanExpression.LessThanOrEqualTo(MathExpression.Variable(angleVariable), MathExpression.Constant(90 * 1000)))), action: ObjectAction.SetNumericVariable( angleVariable, MathExpression.Subtract( MathExpression.Multiply(MathExpression.Add(MathExpression.Variable(angleVariable), MathExpression.Constant(90 * 1000)), MathExpression.Constant(-1)), MathExpression.Constant(90 * 1000)))); BooleanExpression tooCloseToBottomEdge = BooleanExpression.LessThanOrEqualTo( MathExpression.YMillis(), MathExpression.Constant(400 * 1000)); ObjectAction updateAngleVariableBottom = ObjectAction.Condition( condition: BooleanExpression.And(tooCloseToBottomEdge, BooleanExpression.And( BooleanExpression.GreaterThanOrEqualTo(MathExpression.Variable(angleVariable), MathExpression.Constant(90 * 1000)), BooleanExpression.LessThanOrEqualTo(MathExpression.Variable(angleVariable), MathExpression.Constant(270 * 1000)))), action: ObjectAction.SetNumericVariable( angleVariable, MathExpression.Subtract( MathExpression.Multiply(MathExpression.Add(MathExpression.Variable(angleVariable), MathExpression.Constant(90 * 1000)), MathExpression.Constant(-1)), MathExpression.Constant(90 * 1000)))); string angleSnapshotVariable = guidGenerator.NextGuid(); ObjectAction initializeAngleSnapshotVariable = ObjectActionGenerator.DoOnce( ObjectAction.SetNumericVariable(angleSnapshotVariable, MathExpression.RandomInteger(360 * 1000))); DTDanmakuMath.MathExpressionOffset offset = DTDanmakuMath.GetOffset( millipixels: MathExpression.Multiply(MathExpression.Constant(80), MathExpression.ElapsedMillisecondsPerIteration()), movementDirectionInMillidegrees: MathExpression.Variable(angleSnapshotVariable)); ObjectAction updatePositionAction = ObjectAction.SetPosition( xMillis: MathExpression.Add(MathExpression.XMillis(), offset.DeltaXInMillipixels), yMillis: MathExpression.Add(MathExpression.YMillis(), offset.DeltaYInMillipixels)); ObjectAction updatePositionWhenCooldownIsZero = ObjectAction.Condition( condition: shouldChangeMovement, action: ObjectAction.Union( ObjectAction.SetNumericVariable(angleSnapshotVariable, MathExpression.Variable(angleVariable)), setMovementCooldownAction)); ObjectAction immediateMoveWhenTooClose = ObjectAction.Condition( condition: BooleanExpression.Or(tooCloseToLeftEdge, tooCloseToRightEdge, tooCloseToTopEdge, tooCloseToBottomEdge), action: ObjectAction.SetNumericVariable(movementCooldownVariable, MathExpression.Constant(0))); List <ObjectAction> actionList = new List <ObjectAction>(); actionList.Add(initializeAngleSnapshotVariable); actionList.Add(ObjectActionGenerator.DoOnce(setMovementCooldownAction)); actionList.Add(decrementMovementCooldownAction); actionList.Add(writeNewAngleToVariable); actionList.Add(updateAngleVariableLeft); actionList.Add(normalizeAngleVariable); actionList.Add(updateAngleVariableRight); actionList.Add(normalizeAngleVariable); actionList.Add(updateAngleVariableTop); actionList.Add(normalizeAngleVariable); actionList.Add(normalizeAngleVariable); actionList.Add(updateAngleVariableBottom); actionList.Add(normalizeAngleVariable); actionList.Add(normalizeAngleVariable); actionList.Add(updatePositionWhenCooldownIsZero); actionList.Add(updatePositionAction); actionList.Add(immediateMoveWhenTooClose); return(ObjectAction.Union(actionList)); }
private static ObjectAction Phase1ShootAction( Dictionary <string, DTDanmakuImage> spriteNameToImageDictionary, Dictionary <string, EnemyObjectTemplate> enemyObjectTemplates, GuidGenerator guidGenerator) { string singleBulletSpriteName = guidGenerator.NextGuid(); spriteNameToImageDictionary.Add(singleBulletSpriteName, DTDanmakuImage.BossPhase1EnemyBullet); 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.Variable("speed"), 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> spawnBulletActions = new List <ObjectAction>(); string randomOffsetVariable = guidGenerator.NextGuid(); for (int i = 0; i < 36; i++) { List <ObjectAction.InitialChildNumericVariableInfo> initialNumericVariables = new List <ObjectAction.InitialChildNumericVariableInfo>(); initialNumericVariables.Add( new ObjectAction.InitialChildNumericVariableInfo( name: "direction", value: MathExpression.Add(MathExpression.Variable(randomOffsetVariable), MathExpression.Constant(i * 10 * 1000)))); initialNumericVariables.Add( new ObjectAction.InitialChildNumericVariableInfo( name: "speed", value: MathExpression.Add(MathExpression.Constant(100), MathExpression.RandomInteger(100)))); spawnBulletActions.Add(ObjectAction.SpawnChild( childXMillis: MathExpression.XMillis(), childYMillis: MathExpression.Add(MathExpression.YMillis(), MathExpression.Constant(-60000)), childObjectTemplateName: singleBulletTemplateName, childInitialNumericVariables: initialNumericVariables, childInitialBooleanVariables: null)); } List <ObjectAction> actionList = new List <ObjectAction>(); actionList.Add(ObjectAction.SetNumericVariable(randomOffsetVariable, MathExpression.RandomInteger(MathExpression.Constant(360 * 1000)))); foreach (ObjectAction spawnBulletAction in spawnBulletActions) { actionList.Add(spawnBulletAction); } ObjectAction shootBulletAction = ObjectAction.Union(actionList); string shootCooldown = guidGenerator.NextGuid(); ObjectAction initializeShootCooldown = ObjectAction.SetNumericVariable( variableName: shootCooldown, variableValue: MathExpression.Constant(2000)); ObjectAction decrementShootCooldown = ObjectAction.SetNumericVariable( variableName: shootCooldown, variableValue: MathExpression.Subtract(MathExpression.Variable(shootCooldown), MathExpression.ElapsedMillisecondsPerIteration())); ObjectAction shootWhenCooldownIsZero = ObjectAction.Condition( condition: BooleanExpression.LessThanOrEqualTo(MathExpression.Variable(shootCooldown), MathExpression.Constant(0)), action: ObjectAction.Union(initializeShootCooldown, shootBulletAction)); return(ObjectAction.Union( ObjectActionGenerator.DoOnce(initializeShootCooldown), decrementShootCooldown, shootWhenCooldownIsZero)); }
public static BooleanExpression LessThanOrEqualTo(long leftSide, IMathExpression rightSide) { return(BooleanExpression.LessThanOrEqualTo(MathExpression.Constant(leftSide), rightSide)); }
public static BooleanExpression LessThanOrEqualTo(IMathExpression leftSide, long rightSide) { return(BooleanExpression.LessThanOrEqualTo(leftSide, MathExpression.Constant(rightSide))); }