canvas { border: 1px solid black; }
</style>
<body>
-<canvas id="terminal" />
+<p><canvas id="terminal" /></p>
+<p>(running against <a href="https://plomlompom.com/repos/?p=plomrogue2-experiments;a=blob;f=new2/rogue_chat.py">some plomrogue engine experiment</a>)</p>
<script>
"use strict";
let websocket_location = "ws://localhost:8000"
}
return tokens;
},
- parse_position(position_string) {
+ parse_yx(position_string) {
let coordinate_strings = position_string.split(',')
let position = [0, 0];
position[0] = coordinate_strings[0].slice(2);
},
draw_map: function() {
terminal.drawBox(0, 0, terminal.rows, terminal.cols / 2);
+ let map_line = "";
+ let y = 0;
+ for (let i = 0, x = 0; i < game.map.length; i++, x++) {
+ if (x >= game.map_size[1]) {
+ terminal.write(y, 0, map_line);
+ map_line = "";
+ x = 0;
+ y += 1;
+ };
+ map_line += game.map[i];
+ }
+ terminal.write(y, 0, map_line);
for (const t in game.things) {
terminal.write(game.things[t][0], game.things[t][1], '@');
}
terminal.drawBox(terminal.rows - 1, terminal.cols / 2, 1, terminal.cols / 2, 'black');
terminal.write(terminal.rows - 1, terminal.cols / 2, chat.input_line);
},
- log_msg: function(msg) {
- chat.history.unshift(msg);
+ log_msg: function(msg, indent=0) {
+ let line_length = (terminal.cols / 2) - indent;
+ let chunk = "";
+ for (let i = 0, x = 0; i < msg.length; i++, x++) {
+ if (x >= line_length) {
+ chat.history.unshift(' '.repeat(indent) + chunk);
+ chunk = "";
+ x = 0;
+ };
+ chunk += msg[i];
+ }
+ chat.history.unshift(' '.repeat(indent) + chunk);
if (chat.history.length > terminal.rows - 2) {
+
chat.history.pop();
};
this.draw_history();
let game = {
things: {},
- tick: 0
+ tick: 0,
+ map: "",
+ map_size: [1,1]
}
let chat = {
input_line:"",
- history: ["contain whitespace, escape them with \\.",
- "Use double quotes for strings that",
- "Use arrow keys to move your avatar.",
- " QUERY USER TEXT - send TEXT to USER",
- " ALL TEXT - send TEXT to all users",
- " LOGIN USER - register as USER",
- "commands:"]
+ history: ["",
+ " visible ASCII char in the input prompt.",
+ " To write on the map, enter on a single",
+ "",
+ " contain whitespace, escape them with \\.",
+ " Use double quotes for strings that",
+ "",
+ " Use arrow keys to move your avatar.",
+ "",
+ " QUERY USER TEXT - send TEXT to USER",
+ " ALL TEXT - send TEXT to all users",
+ " LOGIN USER - register as USER",
+ " commands:"]
}
terminal.initialize()
chat.input_line = chat.input_line.slice(0, -1);
tui.draw_input_line();
} else if (event.key === 'Enter') {
- websocket.send(chat.input_line);
- chat.input_line = ''
+ if (chat.input_line.length === 1) {
+ websocket.send("TASK:WRITE " + chat.input_line);
+ } else {
+ websocket.send(chat.input_line);
+ }
+ chat.input_line = '';
tui.draw_input_line();
} else if (event.key === 'ArrowLeft') {
websocket.send('TASK:MOVE LEFT');
} else if (event.key === 'ArrowDown') {
websocket.send('TASK:MOVE DOWN');
};
- console.log(event.key);
}, false);
let websocket = new WebSocket(websocket_location);
game.things = {}
game.tick = parseInt(tokens[1]);
} else if (tokens[0] === 'THING_POS') {
- game.things[tokens[1]] = parser.parse_position(tokens[2]);
+ game.things[tokens[1]] = parser.parse_yx(tokens[2]);
+ } else if (tokens[0] === 'MAP') {
+ game.map_size = parser.parse_yx(tokens[1]);
+ game.map = tokens[2]
} else if (tokens[0] === 'GAME_STATE_COMPLETE') {
tui.draw_tick_line();
tui.draw_map();
tui.draw_map();
} else if (tokens[0] === 'LOG') {
- tui.log_msg(' ' + tokens[1]);
+ tui.log_msg(tokens[1], 1);
+ } else if (tokens[0] === 'META') {
+ tui.log_msg(tokens[1]);
} else if (tokens[0] === 'UNHANDLED_INPUT') {
tui.log_msg('unknown command');
+ } else if (tokens[0] === 'ARGUMENT_ERROR') {
+ tui.log_msg('syntax error: ' + tokens[1]);
} else if (tokens[0] === 'GAME_ERROR') {
tui.log_msg('game error: ' + tokens[1]);
- } else if (tokens[0] === 'GAME_ERROR') {
- tui.log_msg('game error: ' + tokens[1]);
+ } else if (tokens[0] === 'PONG') {
+ console.log('PONG');
} else {
tui.log_msg('unhandled input: ' + event.data);
}
}
+
+window.setInterval(function() { websocket.send('PING') }, 30000);
</script>
</body>
</html>