Source: world_api/obstacles.js

require("./../rur.js");
require("./../translator.js");
require("./../utils/key_exist.js");
require("./../utils/validator.js");
require("./../recorder/record_frame.js");
require("./artefact.js");

/** @function add_obstacle
 * @memberof RUR
 * @instance
 * @summary This function sets a named "thing" as an obstacle at that location
 *
 * @param {string} name The name of a the "thing" representing the obstacle.
 *
 * @param {integer} x  Position: `1 <= x <= max_x`
 * @param {integer} y  Position: `1 <= y <= max_y`
 *
 * @throws Will throw an error if `(x, y)` is not a valid location.
 * @throws Will throw an error if `name` is not a known thing.
 * @throws Will throw an error if there is already such a named obstacle at that location,
 * unless this is done from code in the Onload editor in which case the
 * a message is written to the browser's console and the request is ignored.
 *
 */
RUR.add_obstacle = function (name, x, y) {
    "use strict";
    var args;
    if (RUR.is_obstacle(name, x, y)) {
        if (RUR.state.evaluating_onload) {
            console.log("Ignoring request to add obstacle " + name);
            return;
        } else {
            throw new RUR.ReeborgError(RUR.translate("There is already such an obstacle here: ") + name);
        }
    }
    args = {name: RUR.translate_to_english(name), x:x, y:y, type:"obstacles",
            valid_names: RUR.KNOWN_THINGS};
    RUR._add_artefact(args);
    RUR.record_frame("RUR.add_obstacle", args);
};


/** @function remove_obstacle
 * @memberof RUR
 * @instance
 * @summary This function removes an obstacle at a location.
 *
 *
 * @param {integer} x  Position: `1 <= x <= max_x`
 * @param {integer} y  Position: `1 <= y <= max_y`
 *
 * @throws Will throw an error if `(x, y)` is not a valid location.
 * @throws Will throw an error if `name` is not a known thing.
 * @throws Will throw an error if there is no obstacle to remove
 *        at that location
 *
 */
RUR.remove_obstacle = function (name, x, y) {
    "use strict";
    var args;
    if (!RUR.is_obstacle(name, x, y)) {
        if (RUR.state.evaluating_onload) {
            throw new RUR.ReeborgError(RUR.translate("There is no such an obstacle here: ") + name);
        }
    }
    args= {x:x, y:y, type:"obstacles", name:RUR.translate_to_english(name), valid_names: RUR.KNOWN_THINGS};
    RUR._remove_artefact(args);
    RUR.record_frame("RUR.remove_obstacle", args);
};


/** @function is_obstacle
 * @memberof RUR
 * @instance
 * @summary This function returns `true/True` if a named obstacle is present
 * at a given location, `false/False` otherwise
 *
 * @param {string} name The name of the obstacle
 * @param {integer} x  Position: `1 <= x <= max_x`
 * @param {integer} y  Position: `1 <= y <= max_y`
 *
 * @throws Will throw an error if `(x, y)` is not a valid location.
 *
 */

RUR.is_obstacle = function (name, x, y) {
    "use strict";
    var args={name:RUR.translate_to_english(name), x:x, y:y, type:"obstacles"};
    if (RUR._get_nb_artefact(args) > 0) {
        return true;
    } else {
        return false;
    }
};


/** @function get_obstacles
 * @memberof RUR
 * @instance
 * @summary This function gets the obstacles at given location and return
 * their names in an array/list.
 *
 * @param {integer} x  Position: `1 <= x <= max_x`
 * @param {integer} y  Position: `1 <= y <= max_y`
 *
 * @return {list} A list of strings representing the name of the obstacles.
 *
 * @throws Will throw an error if `(x, y)` is not a valid location.
 *
 */

RUR.get_obstacles = function (x, y) {
    "use strict";
    var i, obstacles, result = [], args = {x:x, y:y, type:"obstacles"};
    obstacles = RUR._get_artefacts(args);
    if (obstacles === null) {
        return [];
    }
    for(i=0; i < obstacles.length; i++) {
        result.push(RUR.translate(obstacles[i]))
    }
    return result;
};

/** @function is_solid_obstacle
 * @memberof RUR
 * @instance
 * @summary This function returns `true/True` if a solid obstacle is present
 * at a given location, `false/False` otherwise
 *
 * @param {integer} x  Position: `1 <= x <= max_x`
 * @param {integer} y  Position: `1 <= y <= max_y`
 *
 * @throws Will throw an error if `(x, y)` is not a valid location.
 *
 */

RUR.is_solid_obstacle = function (x, y) {
    "use strict";
    var obs, obstacles = RUR.get_obstacles(x, y);
    if (obstacles === null) {
        return false;
    }
    for (obs of obstacles) {
        if (RUR.THINGS[RUR.translate_to_english(obs)].solid) {
            return true;
        }
    }
    return false;
};