// Thief

function main() {
    Self.SetMobile(true);
    Self.SetGravity(true);
    Self.SetInventory(true);
    Self.SetHitbox(0, 0, 32, 58);
    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"]);

    // All thieves can steal items.
    stealable();

    // Controlled by the player character?
    if (Self.IsPlayer()) {
        return playable();
    }
    return ai();
}

// Common "steal" power between playable and A.I. thieves.
function stealable() {
    // Steals your items.
    Events.OnCollide((e) => {
        let victim = e.Actor;
        if (!e.Settled) {
            return;
        }

        // Thieves don't steal from Thieves (unless controlled by the player).
        if (!Self.IsPlayer() && victim.Drawing.Doodad.Filename === "thief.doodad") {
            return;
        }

        // Steal inventory
        let stolen = 0;
        if (victim.HasInventory()) {
            let myInventory = Self.Inventory(),
                theirInventory = victim.Inventory();

            for (let key in theirInventory) {
                if (!theirInventory.hasOwnProperty(key)) {
                    continue;
                }

                let value = theirInventory[key];
                if (value > 0 || myInventory[key] === undefined) {
                    victim.RemoveItem(key, value);
                    Self.AddItem(key, value);
                    stolen += (value === 0 ? 1 : value);
                }
            }

            // If the player lost their items, notify them.
            if (victim.IsPlayer() && stolen > 0) {
                Flash("Watch out for thieves! %d item%s stolen!", parseInt(stolen), stolen === 1 ? ' was' : 's were');
            }

            // If the Thief IS the player, notify your earnings.
            if (Self.IsPlayer() && stolen > 0) {
                Flash("Awesome! Stole %d item%s from the %s!", parseInt(stolen), stolen === 1 ? '' : 's', e.Actor.Drawing.Doodad.Title);
            }
        }
    });
}

// Enemy Doodad AI: walks back and forth, changing direction
// when it encounters and obstacle.
function ai() {
    // Walks back and forth.
    let Vx = Vy = 0.0,
        playerSpeed = 4,
        direction = "right",
        lastDirection = "right",
        lastSampledX = 0,
        sampleTick = 0,
        sampleRate = 2;

    setInterval(() => {
        if (sampleTick % sampleRate === 0) {
            let curX = Self.Position().X,
                delta = Math.abs(curX - lastSampledX);
            if (delta < 5) {
                direction = direction === "right" ? "left" : "right";
            }
            lastSampledX = curX;
        }
        sampleTick++;

        Vx = parseFloat(playerSpeed * (direction === "left" ? -1 : 1));
        Self.SetVelocity(Vector(Vx, Vy));

        // If we changed directions, stop animating now so we can
        // turn around quickly without moonwalking.
        if (direction !== lastDirection) {
            Self.StopAnimation();
        }

        if (!Self.IsAnimating()) {
            Self.PlayAnimation("walk-" + direction, null);
        }

        lastDirection = direction;
    }, 100);
}

// If under control of the player character.
function playable() {
    Events.OnKeypress((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();
            animating = false;
        }
    })
}
