class Ball {
    field int x,y, r, hspeed, vspeed;

    constructor Ball new(int lx, int ly, int lr, int lhspeed, int lvspeed) {
        let x = lx;
        let y = ly;
        let r = lr;

        let hspeed = lhspeed;
        let vspeed = lvspeed;

        return this;
    }

    method void setPos(int lx, int ly) {
        do erase();

        let x = lx;
        let y = ly;

        return;
    }

    method void setSpeed(int lhspeed, int lvspeed) {
        let hspeed = lhspeed;
        let vspeed = lvspeed;

        return;
    }

    method void draw() {
        do Screen.setColor(true);
        do Screen.drawCircle(x,y,r);
        return;
    }

    method void erase() {
        do Screen.setColor(false);
        do Screen.drawCircle(x,y,r);
        return;
    }

    method void update() {
        var int keyPressed, bLeft, bRight, bTop, bBottom;

        let bLeft = getLeft();
        let bRight = getRight();
        let bTop = getTop();
        let bBottom = getBottom();

        do erase();

        // 2 pixel margin on the sides just in case
        if (bLeft < 2 & hspeed < 0) {
            do invertHspeed();
        }
        if (bRight > 508 & hspeed > 0) {
            do invertHspeed();
        }
        if (bTop < 2 & vspeed < 0) {
            do invertVspeed();
        }
        if (bBottom > 250 & vspeed > 0) {
            do invertVspeed();
        }

        let x = x + hspeed;
        let y = y + vspeed;

        do draw();

        return;
    }

    method void invertVspeed() {
        let vspeed = -vspeed;
        return;
    }

    method void invertHspeed() {
        let hspeed = -hspeed;
        return;
    }

    method int getLeft() {
        return x - r;
    }

    method int getRight() {
        return x + r;
    }

    method int getTop() {
        return y - r;
    }

    method int getBottom() {
        return y + r;
    }

    method int getVspeed() {
        return vspeed;
    }
}