private void SetupTrolls() { Remove(coroutine); coroutine = null; Remove(dashListener); dashListener = null; Level level = Scene as Level; int modifier = ((!trollFixed ? TrollLandModule.Session.DeathCountForLevel(level.Session.Level) : 0) + trollOffset) % 3; trollBehavior = (TrollBehaviors)modifier; switch (trollBehavior) { default: case TrollBehaviors.ZipMover: Add(coroutine = new Coroutine(ZipMoverSequence())); break; case TrollBehaviors.FallBlock: Add(coroutine = new Coroutine(FallBlockSequence())); break; case TrollBehaviors.SwapBlock: Add(dashListener = new DashListener() { OnDash = OnDash }); break; } }
public TimeEnt(Vector2 pos) : base(pos) { base.Depth = -8500; base.Collider = new Circle(10f, 0f, 2f); base.Add(new PlayerCollider(new Action <Player>(this.OnPlayer), null, null)); base.Add(this.sprite = GFX.SpriteBank.Create("booster")); base.Add(this.dashListener = new DashListener()); this.dashListener.OnDash = new Action <Vector2>(this.OnPlayerDashed); }
public GenericCustomBooster(EntityData data, Vector2 offset) : base(data.Position + offset) { Depth = -8500; Collider = new Circle(10f, 0f, 2f); sprite = new Sprite(GFX.Game, data.Attr("directory", "objects/FrostHelper/blueBooster/")) { Visible = true }; sprite.CenterOrigin(); sprite.Justify = new Vector2(0.5f, 0.5f); sprite.AddLoop("loop", "booster", 0.1f, 0, 1, 2, 3, 4); sprite.AddLoop("inside", "booster", 0.1f, 5, 6, 7, 8); sprite.AddLoop("spin", "booster", 0.06f, 18, 19, 20, 21, 22, 23, 24, 25); sprite.Add("pop", "booster", 0.08f, 9, 10, 11, 12, 13, 14, 15, 16, 17); sprite.Play("loop", false); Add(sprite); Add(new PlayerCollider(new Action <Player>(OnPlayer), null, null)); Add(light = new VertexLight(Color.White, 1f, 16, 32)); Add(bloom = new BloomPoint(0.1f, 16f)); Add(wiggler = Wiggler.Create(0.5f, 4f, delegate(float f) { sprite.Scale = Vector2.One * (1f + f * 0.25f); }, false, false)); Add(dashRoutine = new Coroutine(false)); Add(dashListener = new DashListener()); dashListener.OnDash = new Action <Vector2>(OnPlayerDashed); Add(new MirrorReflection()); Add(loopingSfx = new SoundSource()); Red = data.Bool("red", false); particleType = Red ? Booster.P_BurstRed : Booster.P_Burst; RespawnTime = data.Float("respawnTime", 1f); BoostTime = data.Float("boostTime", 0.3f); ParticleColor = ColorHelper.GetColor(data.Attr("particleColor", "Yellow")); reappearSfx = data.Attr("reappearSfx", "event:/game/04_cliffside/greenbooster_reappear"); enterSfx = data.Attr("enterSfx", "event:/game/04_cliffside/greenbooster_enter"); boostSfx = data.Attr("boostSfx", "event:/game/04_cliffside/greenbooster_dash"); endSfx = data.Attr("releaseSfx", "event:/game/04_cliffside/greenbooster_end"); }
public MoveSwapBlock(EntityData data, Vector2 offset) : base(data.Position + offset, data.Width, data.Height, data.Nodes[0] + offset, Themes.Normal) { swapBlockData = new DynData <SwapBlock>(this); Theme = Themes.Moon; // base() gets Normal for the block texture, then we set to Moon to remove the path background doesReturn = data.Bool("returns", true); freezeOnSwap = data.Bool("freezeOnSwap", true); // Replaces SwapBlock.OnDash with MoveSwapBlock.OnDash if this block doesn't return DashListener listener = Get <DashListener>(); Action <Vector2> orig_OnDash = listener.OnDash; listener.OnDash = (dir) => { if (State == MovementState.Breaking) { return; } else if (doesReturn) { orig_OnDash(dir); } else { OnDash(dir); } }; // We use some local variable to temporarily store private SwapBlock fields for less reflection start = Position; end = data.Nodes[0] + offset; difference = end - start; // Structs are value types startingRect = swapBlockData.Get <Rectangle>("moveRect"); swapBlockData["maxForwardSpeed"] = maxForwardSpeed = 360f * data.Float("swapSpeedMultiplier", 1f) / Vector2.Distance(start, end); startPosition = Position; // Replace/Add SwapBlock textures middleCardinal = GFX.Game["objects/CommunalHelper/moveSwapBlock/midBlockCardinal"]; middleDiagonal = GFX.Game["objects/CommunalHelper/moveSwapBlock/midBlockDiagonal"]; Add(middleArrow = new Image(middleCardinal)); middleArrow.CenterOrigin(); Remove(swapBlockData.Get <Sprite>("middleGreen"), swapBlockData.Get <Sprite>("middleRed")); swapBlockData["middleGreen"] = middleGreen = CommunalHelperModule.SpriteBank.Create("swapBlockLight"); swapBlockData["middleRed"] = middleRed = CommunalHelperModule.SpriteBank.Create("swapBlockLightRed"); Add(middleGreen, middleRed); Add(middleOrange = new Image(GFX.Game["objects/CommunalHelper/moveSwapBlock/midBlockOrange"])); middleOrange.CenterOrigin(); canSteer = data.Bool("canSteer", false); maxMoveSpeed = data.Float("moveSpeed", 60f); moveAcceleration = data.Float("moveAcceleration", Accel); MoveDirection = data.Enum("direction", Directions.Left); homeAngle = targetAngle = angle = MoveDirection.Angle(); angleSteerSign = angle > 0f ? -1 : 1; int tilesX = (int)Width / 8; int tilesY = (int)Height / 8; MTexture buttonTexture = GFX.Game["objects/moveBlock/button"]; MTexture buttonPressedTexture = GFX.Game["objects/CommunalHelper/moveSwapBlock/buttonPressed"]; if (canSteer && (MoveDirection == Directions.Left || MoveDirection == Directions.Right)) { for (int x = 0; x < tilesX; x++) { int offsetX = (x != 0) ? ((x < tilesX - 1) ? 1 : 2) : 0; AddImage(buttonTexture.GetSubtexture(offsetX * 8, 0, 8, 8), new Vector2(x * 8, -4f), 0f, new Vector2(1f, 1f), topButton); AddImage(buttonPressedTexture.GetSubtexture(offsetX * 8, 0, 8, 8), new Vector2(x * 8, -4f), 0f, new Vector2(1f, 1f), topButton); } } else if (canSteer && (MoveDirection == Directions.Up || MoveDirection == Directions.Down)) { for (int y = 0; y < tilesY; y++) { int offsetY = (y != 0) ? ((y < tilesY - 1) ? 1 : 2) : 0; AddImage(buttonTexture.GetSubtexture(offsetY * 8, 0, 8, 8), new Vector2(-4f, y * 8), (float)Math.PI / 2f, new Vector2(1f, -1f), leftButton); AddImage(buttonPressedTexture.GetSubtexture(offsetY * 8, 0, 8, 8), new Vector2(-4f, y * 8), (float)Math.PI / 2f, new Vector2(1f, -1f), leftButton); AddImage(buttonTexture.GetSubtexture(offsetY * 8, 0, 8, 8), new Vector2((tilesX - 1) * 8 + 4, y * 8), (float)Math.PI / 2f, new Vector2(1f, 1f), rightButton); AddImage(buttonPressedTexture.GetSubtexture(offsetY * 8, 0, 8, 8), new Vector2((tilesX - 1) * 8 + 4, y * 8), (float)Math.PI / 2f, new Vector2(1f, 1f), rightButton); } } UpdateColors(); debrisTextures = new Chooser <MTexture>(); foreach (MTexture debris in GFX.Game.GetAtlasSubtextures("objects/CommunalHelper/moveSwapBlock/debris")) { debrisTextures.Add(debris, 1); } debrisTextures.Add(GFX.Game["objects/CommunalHelper/moveSwapBlock/debrisRed00"], 0.3f); debrisTextures.Add(GFX.Game["objects/CommunalHelper/moveSwapBlock/debrisGreen00"], 0.05f); Add(moveBlockSfx = new SoundSource()); Add(new Coroutine(Controller())); Add(new MoveBlockRedirectable(new DynamicData(this)) { Get_Speed = () => moveSpeed, Get_TargetSpeed = () => targetMoveSpeed, Get_MoveSfx = () => moveBlockSfx, Get_Direction = () => MoveDirection, Set_Direction = dir => MoveDirection = dir, }); }