// Playable Character // // If not controlled by the player, its AI is to move left and // right and is able to pick up keys, press buttons and generally // get up to mischief. var playerSpeed = 4, direction = "right"; function main() { Self.SetMobile(true); // Needed to activate most objects Self.SetInventory(true); // Can pick up keys and items (automatic) Self.SetGravity(true); // Is pulled down by gravity Self.SetHitbox(0, 0, 32, 52); setupAnimations(); // Are we the player character? if (Self.IsPlayer()) { return playerControls(); } return ai() } function setupAnimations() { Self.AddAnimation("walk-left", 200, ["stand-left", "walk-left-1", "walk-left-2", "walk-left-3", "walk-left-2", "walk-left-1"]); Self.AddAnimation("walk-right", 200, ["stand-right", "walk-right-1", "walk-right-2", "walk-right-3", "walk-right-2", "walk-right-1"]); } // Player controls function playerControls() { Events.OnKeypress(function (ev) { if (ev.Right) { if (!Self.IsAnimating()) { Self.PlayAnimation("walk-right", null); } } else if (ev.Left) { if (!Self.IsAnimating()) { Self.PlayAnimation("walk-left", null); } } else { Self.StopAnimation(); } }) } // AI controls. The AI is very simple: // walk to the right until you hit an obstacle, // then walk to the left until you hit an obstacle, // and repeat. // It will automatically pickup keys and interact with things // as it passes because it HasInventory and IsMobile. function ai() { // Sample our X position every few frames and detect if we've hit a solid wall. var sampleTick = 0; var sampleRate = 5; var lastSampledX = 0; setInterval(function () { if (sampleTick % sampleRate === 0) { var curX = Self.Position().X; var delta = Math.abs(curX - lastSampledX); if (delta < 5) { direction = direction === "right" ? "left" : "right"; } lastSampledX = curX; } sampleTick++; var Vx = parseFloat(playerSpeed * (direction === "left" ? -1 : 1)); Self.SetVelocity(Vector(Vx, 0.0)); if (!Self.IsAnimating()) { Self.PlayAnimation("walk-" + direction, null); } }, 100); }