},
}
+class Thing {
+ constructor(yx) {
+ this.position = yx;
+ }
+}
+
let server = {
init: function(url) {
this.url = url;
game.portals = {};
game.turn = parseInt(tokens[1]);
} else if (tokens[0] === 'THING_POS') {
- game.things[tokens[1]] = parser.parse_yx(tokens[2]);
+ game.get_thing(tokens[1], true).position = parser.parse_yx(tokens[2]);
+ } else if (tokens[0] === 'THING_NAME') {
+ game.get_thing(tokens[1], true).name_ = tokens[2];
} else if (tokens[0] === 'MAP') {
game.map_size = parser.parse_yx(tokens[1]);
game.map = tokens[2]
if (tui.mode == mode_study) {
explorer.query_info();
}
- let player_position = [0,0];
- for (const thing_id in game.things) {
- if (game.player_id == thing_id) {
- let t = game.things[thing_id];
- player_position = t;
- }
- }
- if (player_position in game.portals) {
- tui.teleport_target = game.portals[player_position];
+ let t = game.get_thing(game.player_id);
+ if (t.position in game.portals) {
+ tui.teleport_target = game.portals[t.position];
tui.switch_mode(mode_teleport);
return;
}
let mode_study = new Mode('check map tiles for messages', false, true);
let mode_edit = new Mode('write ASCII char to map tile', false, false);
let mode_teleport = new Mode('teleport away?');
+let mode_portal = new Mode('add portal to map tile', true, true);
let tui = {
mode: mode_waiting_for_server,
},
switch_mode: function(mode, keep_pos=false) {
if (mode == mode_study && !keep_pos) {
- explorer.position = game.things[game.player_id];
+ explorer.position = game.things[game.player_id].position;
}
this.mode = mode;
this.empty_input();
if (mode == mode_annotate && explorer.position in explorer.info_db) {
let info = explorer.info_db[explorer.position];
if (info != "(none)") {
- this.inputEl.value = explorer.info_db[explorer.position];
+ this.inputEl.value = info;
this.recalc_input_lines();
}
+ }
+ if (mode == mode_portal && explorer.position in game.portals) {
+ let portal = game.portals[explorer.position]
+ this.inputEl.value = portal;
+ this.recalc_input_lines();
} else if (mode == mode_teleport) {
- tui.log_msg("Type Y or y to affirm teleportation, any other key to abort.");
- tui.log_msg("target: " + tui.teleport_target);
+ tui.log_msg("@ May teleport to: " + tui.teleport_target);
+ tui.log_msg("@ Type Y or y to affirm, other keys to abort.");
}
this.full_refresh();
},
},
log_msg: function(msg) {
this.log.push(msg);
- while (this.log.length > terminal.rows * 4) {
+ while (this.log.length > 100) {
this.log.shift();
};
this.full_refresh();
Math.floor(game.map_size[1] / 2)];
for (const thing_id in game.things) {
let t = game.things[thing_id];
- map_lines[t[0]][t[1]] = '@';
+ map_lines[t.position[0]][t.position[1]] = '@';
if (game.player_id == thing_id) {
- center_pos = t;
+ center_pos = t.position;
}
};
if (tui.mode.shows_info) {
this.player_id = -1;
this.portals = {};
},
+ get_thing: function(id_, create_if_not_found=false) {
+ if (id_ in game.things) {
+ return game.things[id_];
+ } else if (create_if_not_found) {
+ let t = new Thing([0,0]);
+ game.things[id_] = t;
+ return t;
+ };
+ }
}
game.init();
},
get_info: function() {
let info = "";
+ let position_i = this.position[0] * game.map_size[1] + this.position[1];
+ info += "TERRAIN: " + game.map[position_i] + "\n";
+ for (let t_id in game.things) {
+ let t = game.things[t_id];
+ if (t.position[0] == this.position[0] && t.position[1] == this.position[1]) {
+ info += "PLAYER @";
+ if (t.name_) {
+ info += ": " + t.name_;
+ }
+ info += "\n";
+ }
+ }
if (this.position in game.portals) {
info += "PORTAL: " + game.portals[this.position] + "\n";
}
msg = " "; // triggers annotation deletion
}
server.send(["ANNOTATE", unparser.to_yx(explorer.position), msg]);
+ },
+ set_portal: function(msg) {
+ if (msg.length == 0) {
+ msg = " "; // triggers portal deletion
+ }
+ server.send(["PORTAL", unparser.to_yx(explorer.position), msg]);
}
}
if (['Y', 'y'].includes(tui.inputEl.value[0])) {
server.reconnect_to(tui.teleport_target);
} else {
+ tui.log_msg("@ teleportation aborted");
tui.switch_mode(mode_play);
}
}
if (tui.mode == mode_login && event.key == 'Enter') {
server.send(['LOGIN', tui.inputEl.value]);
tui.switch_mode(mode_login);
+ } else if (tui.mode == mode_portal && event.key == 'Enter') {
+ explorer.set_portal(tui.inputEl.value);
+ tui.switch_mode(mode_study, true);
} else if (tui.mode == mode_annotate && event.key == 'Enter') {
explorer.annotate(tui.inputEl.value);
tui.switch_mode(mode_study, true);
tui.switch_mode(mode_chat);
} else if (event.key == 'p') {
tui.switch_mode(mode_play);
+ } else if (event.key === 'P') {
+ event.preventDefault();
+ tui.switch_mode(mode_portal);
} else if (event.key === tui.key_left) {
explorer.move('left');
} else if (event.key === tui.key_right) {