From 7c9930e0b6fda5968e40ec445b061ae0848c2e26 Mon Sep 17 00:00:00 2001 From: Nicole O'Connor Date: Wed, 1 Feb 2023 14:52:56 -0800 Subject: [PATCH] it's a presentable stub now! --- app/index.wsgi | 6 ++--- app/pylocal/tick.py | 8 ++++++ scratch.ipynb | 50 ++++++++++++++++++++++++++++++++++ static/js/seagull.js | 64 +++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 123 insertions(+), 5 deletions(-) create mode 100644 app/pylocal/tick.py create mode 100644 scratch.ipynb diff --git a/app/index.wsgi b/app/index.wsgi index 4e101bc..8536120 100644 --- a/app/index.wsgi +++ b/app/index.wsgi @@ -3,12 +3,10 @@ import gevent.monkey gevent.monkey.patch_all() -import logging - import flask from gevent.pywsgi import WSGIServer -from pylocal import core +from pylocal import core, tick @core.app.route("/") def index(): @@ -18,5 +16,5 @@ def index(): if __name__ == "__main__": #core.app.run("0.0.0.0", 1337) - http_server = WSGIServer(('', 80), core.app, log=logging.getLogger(name="gevent")) + http_server = WSGIServer(('', 80), core.app) http_server.serve_forever() \ No newline at end of file diff --git a/app/pylocal/tick.py b/app/pylocal/tick.py new file mode 100644 index 0000000..7d7335c --- /dev/null +++ b/app/pylocal/tick.py @@ -0,0 +1,8 @@ +import json +import random + +from . import core + +@core.app.route("/tick") +def tick(): + return random.choices([json.dumps({"code": 200, "event_type": 0}), json.dumps({"code": 200, "event_type": 1, "log": "The server chose a flavor text event, which hasn't been fully implemented yet."})], weights=[16, 1])[0] \ No newline at end of file diff --git a/scratch.ipynb b/scratch.ipynb new file mode 100644 index 0000000..cf734b6 --- /dev/null +++ b/scratch.ipynb @@ -0,0 +1,50 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "otl-hga.net\n" + ] + } + ], + "source": [ + "domain_components = \"seagull.mercenary.otl-hga.net\".split(\".\")\n", + "base_domain = \".\".join(domain_components[-2:])\n", + "print(base_domain)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.9 (main, Dec 7 2022, 00:00:00) [GCC 12.2.1 20221121 (Red Hat 12.2.1-4)]" + }, + "orig_nbformat": 4, + "vscode": { + "interpreter": { + "hash": "767d51c1340bd893661ea55ea3124f6de3c7a262a8b4abca0554b478b1e2ff90" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/static/js/seagull.js b/static/js/seagull.js index 091d14f..cc828b2 100644 --- a/static/js/seagull.js +++ b/static/js/seagull.js @@ -1,12 +1,28 @@ +const sleep = ms => new Promise(r => setTimeout(r, ms)); // sleep(int ms) + var page_elements = {}; +var gamestate = {}; + +const gamestate_default = { + "tick": 1, + "name": "Nameless" +}; + +function prepare_gamestate() { + var gamestate_loaded = window.localStorage.getItem("gamestate"); + + if (gamestate_loaded == null) { gamestate = structuredClone(gamestate_default); } + else { gamestate = JSON.parse(gamestate_loaded); } +} + function record_log(text) { const div_logrow = document.createElement("div"); div_logrow.className = "log-line"; const div_logtick = document.createElement("div"); div_logtick.className = "log-tick" - div_logtick.innerHTML = "Day 69"; + div_logtick.innerHTML = "Day " + gamestate["tick"]; div_logrow.append(div_logtick); const div_logmsg = document.createElement("div"); @@ -17,14 +33,58 @@ function record_log(text) { page_elements["div_log"].append(div_logrow); } +function save_game() { + window.localStorage.setItem("gamestate", JSON.stringify(gamestate)); + record_log("Game saved."); +} + +var tick_meter_running = true; + +async function game_tick() { + gamestate["tick"] += 1; + page_elements["lbl_tick"].innerHTML = gamestate["tick"]; + var tickdata = await fetch("/tick") + .then(res => { + json = res.json() + console.log(json) + return json + }) + .catch(e => { throw e; }); + console.log(JSON.stringify(tickdata)); + + if (tickdata["code"] != 200) { + console.error("Non-200 tick code: " + tickdata["code"]); + return; + } + + if (tickdata["event_type"] == 0) { + //sleep(12000); + //game_tick(); + } else if (tickdata["event_type"] == 1) { + // Flavor event - no gameplay effect, but occasionally says something fun. + record_log(tickdata["log"]); + //await sleep(12000); + //game_tick(); + } +} + document.addEventListener("DOMContentLoaded", function (ev) { page_elements["div_log"] = document.querySelector("#main-log"); page_elements["div_name"] = document.querySelector("#side-seagull-name"); page_elements["div_name_editor"] = document.querySelector("#side-seagull-name-editor"); page_elements["lbl_name"] = document.querySelector("#lbl-seagull-name"); page_elements["edt_name"] = document.querySelector("#edt-seagull-name"); + page_elements["lbl_tick"] = document.querySelector("#main-day-counter"); + + prepare_gamestate(); record_log("It works!"); + page_elements["lbl_name"].innerHTML = gamestate["name"]; + page_elements["lbl_tick"].innerHTML = gamestate["tick"]; + + const interval = setInterval(() => { + if (tick_meter_running) { game_tick(); } + }, 1200); }); function change_seagull_name() { @@ -35,6 +95,8 @@ function change_seagull_name() { function confirm_seagull_name() { const new_name = page_elements["edt_name"].value; page_elements["lbl_name"].innerHTML = new_name; + gamestate["name"] = new_name; + save_game(); page_elements["div_name"].style.display = "block"; page_elements["div_name_editor"].style.display = "none";