game browser module
This commit is contained in:
parent
22cdd68184
commit
2c9f8a563e
56
app/src/js/game.ts
Normal file
56
app/src/js/game.ts
Normal file
|
|
@ -0,0 +1,56 @@
|
||||||
|
import { type Message, Context } from "../shared/types.js"
|
||||||
|
import { focusInput } from "./focus.js"
|
||||||
|
import { $ } from "./dom.js"
|
||||||
|
import { randomId } from "../shared/utils.js"
|
||||||
|
import { setStatus, addOutput } from "./scrollback.js"
|
||||||
|
import { browserCommands } from "./commands.js"
|
||||||
|
|
||||||
|
let oldMode = "cinema"
|
||||||
|
|
||||||
|
export async function handleGameStart(msg: Message) {
|
||||||
|
const msgId = msg.id as string
|
||||||
|
const name = msg.data as string
|
||||||
|
const game = await import(`/command/${name}`)
|
||||||
|
const id = randomId()
|
||||||
|
let stopGame = false
|
||||||
|
|
||||||
|
addOutput(msgId, { html: `<canvas id="${id}" class="game active" height="540" width="960" tabindex="0"></canvas>` })
|
||||||
|
|
||||||
|
if (document.body.dataset.mode === "tall") {
|
||||||
|
browserCommands.mode?.()
|
||||||
|
oldMode = "tall"
|
||||||
|
}
|
||||||
|
|
||||||
|
setStatus(msgId, "ok")
|
||||||
|
|
||||||
|
const canvas = $(id) as HTMLCanvasElement
|
||||||
|
const ctx = new Context(canvas.getContext("2d")!)
|
||||||
|
canvas.focus()
|
||||||
|
canvas.addEventListener("keydown", e => {
|
||||||
|
e.preventDefault()
|
||||||
|
|
||||||
|
if (e.key === "Escape" || (e.ctrlKey && e.key === "c")) {
|
||||||
|
stopGame = true
|
||||||
|
if (oldMode === "tall") browserCommands.mode?.()
|
||||||
|
canvas.classList.remove("active")
|
||||||
|
canvas.style.height = canvas.height / 2 + "px"
|
||||||
|
canvas.style.width = canvas.width / 2 + "px"
|
||||||
|
focusInput()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
let last = 0
|
||||||
|
function loop(ts: number) {
|
||||||
|
if (stopGame) return
|
||||||
|
|
||||||
|
const delta = ts - last
|
||||||
|
if (delta >= 1000 / 30) {
|
||||||
|
if (game.update) game.update(delta)
|
||||||
|
if (game.draw) game.draw(ctx)
|
||||||
|
last = ts
|
||||||
|
}
|
||||||
|
requestAnimationFrame(loop)
|
||||||
|
}
|
||||||
|
requestAnimationFrame(loop)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -2,14 +2,12 @@
|
||||||
// The shell runs on the server and processes input, returning output.
|
// The shell runs on the server and processes input, returning output.
|
||||||
|
|
||||||
import type { Message, CommandResult, CommandOutput } from "../shared/types.js"
|
import type { Message, CommandResult, CommandOutput } from "../shared/types.js"
|
||||||
import { Context } from "../shared/types.js"
|
|
||||||
import { addInput, setStatus, addOutput, appendOutput, replaceOutput } from "./scrollback.js"
|
import { addInput, setStatus, addOutput, appendOutput, replaceOutput } from "./scrollback.js"
|
||||||
import { send } from "./websocket.js"
|
import { send } from "./websocket.js"
|
||||||
import { randomId } from "../shared/utils.js"
|
import { randomId } from "../shared/utils.js"
|
||||||
import { addToHistory } from "./history.js"
|
import { addToHistory } from "./history.js"
|
||||||
import { focusInput } from "./focus.js"
|
|
||||||
import { browserCommands, cacheCommands } from "./commands.js"
|
import { browserCommands, cacheCommands } from "./commands.js"
|
||||||
import { $ } from "./dom.js"
|
import { handleGameStart } from "./game.js"
|
||||||
|
|
||||||
export function runCommand(input: string) {
|
export function runCommand(input: string) {
|
||||||
if (!input.trim()) return
|
if (!input.trim()) return
|
||||||
|
|
@ -84,52 +82,3 @@ function handleStreamReplace(msg: Message) {
|
||||||
function handleStreamEnd(_msg: Message) {
|
function handleStreamEnd(_msg: Message) {
|
||||||
}
|
}
|
||||||
|
|
||||||
let oldMode = "cinema"
|
|
||||||
|
|
||||||
async function handleGameStart(msg: Message) {
|
|
||||||
const msgId = msg.id as string
|
|
||||||
const name = msg.data as string
|
|
||||||
const game = await import(`/command/${name}`)
|
|
||||||
const id = randomId()
|
|
||||||
let stopGame = false
|
|
||||||
|
|
||||||
addOutput(msgId, { html: `<canvas id="${id}" class="game active" height="540" width="960" tabindex="0"></canvas>` })
|
|
||||||
|
|
||||||
if (document.body.dataset.mode === "tall") {
|
|
||||||
browserCommands.mode?.()
|
|
||||||
oldMode = "tall"
|
|
||||||
}
|
|
||||||
|
|
||||||
setStatus(msgId, "ok")
|
|
||||||
|
|
||||||
const canvas = $(id) as HTMLCanvasElement
|
|
||||||
const ctx = new Context(canvas.getContext("2d")!)
|
|
||||||
canvas.focus()
|
|
||||||
canvas.addEventListener("keydown", e => {
|
|
||||||
e.preventDefault()
|
|
||||||
|
|
||||||
if (e.key === "Escape" || (e.ctrlKey && e.key === "c")) {
|
|
||||||
stopGame = true
|
|
||||||
if (oldMode === "tall") browserCommands.mode?.()
|
|
||||||
canvas.classList.remove("active")
|
|
||||||
canvas.style.height = canvas.height / 2 + "px"
|
|
||||||
canvas.style.width = canvas.width / 2 + "px"
|
|
||||||
focusInput()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
let last = 0
|
|
||||||
function loop(ts: number) {
|
|
||||||
if (stopGame) return
|
|
||||||
|
|
||||||
const delta = ts - last
|
|
||||||
if (delta >= 1000 / 30) {
|
|
||||||
if (game.update) game.update(delta)
|
|
||||||
if (game.draw) game.draw(ctx)
|
|
||||||
last = ts
|
|
||||||
}
|
|
||||||
requestAnimationFrame(loop)
|
|
||||||
}
|
|
||||||
requestAnimationFrame(loop)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user