public override bool getCrashEvent(GameObject go, GameDirection cidirection) { if ((go is Enemy && go != this) || go is Mushroom) return true; if (cidirection == GameDirection.Top) { switch (turtleMode) { case TurtleMode.Normal: TurtleMode = TurtleMode.Small; break; case TurtleMode.Small: TurtleMode = TurtleMode.SmallRunning; break; case TurtleMode.SmallRunning: TurtleMode = TurtleMode.Small; break; } startSmall = DateTime.Now; World.MGO.Move(MoveType.jumpTop, -1, false, GameInstruction.Nothing); return true; } else if (cidirection == GameDirection.Left || cidirection == GameDirection.Right) { if (turtleMode == TurtleMode.Small) { turtleMode = TurtleMode.SmallRunning; direction = cidirection == GameDirection.Left ? GameDirection.Right : GameDirection.Left; return true; } } return false; }
public override void Check(out Dictionary<string, float> newpos) { base.Check(out newpos); float newtop = newpos["top"]; float newleft = newpos["left"]; // falling? bool falling = GamePhysics.Falling(World.StickyElements, World.MovingElements, World.Enemies, newtop, newleft, this); if (falling) newtop += Globals.ObjFalling * GameAI.FrameFactor; if (turtleMode == TurtleMode.Small && (DateTime.Now - startSmall).Seconds >= 3) { TurtleMode = TurtleMode.Normal; } // direction if (!falling) { float move = 0; switch (turtleMode) { case TurtleMode.Normal: move = Globals.Turtle.Normal * GameAI.FrameFactor; break; case TurtleMode.Small: move = 0; break; case TurtleMode.SmallRunning: move = Globals.Turtle.Fast * GameAI.FrameFactor; break; } if (direction == GameDirection.Right) newleft += move; else newleft -= move; } // check if direction is ok GamePhysics.CrashDetection(this, World.StickyElements, World.MovingElements, getEvent, ref newtop, ref newleft); Enemy crashedInEnemy = GamePhysics.CrashEnemy(this, World.Enemies, getEvent, ref newtop, ref newleft); bool removedEnemy = false; if (turtleMode == TurtleMode.SmallRunning && crashedInEnemy != null && crashedInEnemy.turtleCanRemove) { base.Remove(crashedInEnemy); removedEnemy = true; } // run in standing mgo? GameDirection _direction; if (GamePhysics.SingleCrashDetection(this, World.MGO, out _direction, ref newtop, ref newleft, true) && !getCrashEvent(this, _direction)) World.MGO.getEvent(GameEvent.crashInEnemy, new Dictionary<GameEventArg, object>()); if (newtop != 0) Top += newtop; if (newleft != 0) Left += newleft; if (!falling && (newleft == 0 || (crashedInEnemy != null && !removedEnemy))) { if (turtleMode == TurtleMode.Normal || turtleMode == TurtleMode.SmallRunning) direction = direction == GameDirection.Left ? GameDirection.Right : GameDirection.Left; } // dead? if (Top > World.Settings.LevelHeight) base.Remove(); }