From 634dde2a3b21451d7357e7717b9aaa5235800426 Mon Sep 17 00:00:00 2001 From: Thayol Date: Sun, 19 Jan 2025 21:43:27 +0900 Subject: [PATCH] use auto-incremented IDs instead of UUIDs --- public/client.js | 15 +++++-- src/ability.js | 5 ++- src/buff.js | 6 ++- src/entity.js | 6 ++- src/game.js | 4 +- src/index.js | 106 ++++------------------------------------------ src/level.js | 87 ++++++++++++++++++++++++++++++++++++- src/projectile.js | 4 +- src/terrain.js | 4 +- 9 files changed, 127 insertions(+), 110 deletions(-) diff --git a/public/client.js b/public/client.js index 2042003..96f08e9 100644 --- a/public/client.js +++ b/public/client.js @@ -47,7 +47,12 @@ const entities = {} const projectiles = {} const positionTweens = {} const terrains = {} -let state = { abilities: [], entities: [], terrains: [], projectiles: [] } +var state = { abilities: [], entities: [], terrains: [], projectiles: [] } + +global.entities = entities +global.projectiles = projectiles +global.terrains = terrains +global.state = state const geometry = new THREE.PlaneGeometry(0, 0) const material = new THREE.MeshToonMaterial({ color: 0x115011 }) @@ -67,7 +72,7 @@ global.renderer = renderer global.camera = camera global.scene = scene -const tweenDuration = 33 +var tweenDuration = 1 const keysDown = {} const mouse = {} @@ -179,6 +184,10 @@ function connectWebSocket() { state.byteSize = new Blob([event.data]).size const stateUpdates = JSON.parse(event.data) + if (stateUpdates.tickRate != null) { + tweenDuration = 1000 / stateUpdates.tickRate + } + if (stateUpdates.width != null && stateUpdates.height != null) { state.width = stateUpdates.width state.height = stateUpdates.height @@ -253,8 +262,6 @@ function connectWebSocket() { } } - // console.log(state) - if (state.width != null && state.height != null && (ground.geometry.attributes.width != state.width || ground.geometry.attributes.height != state.height)) { ground.geometry = new THREE.PlaneGeometry(state.width / 100, state.height / 100) ground.position.set(state.width / 200, state.height / 200, 0) diff --git a/src/ability.js b/src/ability.js index 9823fb5..826e48d 100644 --- a/src/ability.js +++ b/src/ability.js @@ -4,7 +4,10 @@ import Projectile from './projectile.js' // Three classes: Blade, Armor, Charm export default class Ability { - id = crypto.randomUUID() + id = `ability-${Ability.nextId()}` + static nextId() { return this.#nextUniqueId++ } + static #nextUniqueId = 0 + name = 'Ability' castTime = 0 diff --git a/src/buff.js b/src/buff.js index 9c19565..1d09e64 100644 --- a/src/buff.js +++ b/src/buff.js @@ -1,6 +1,10 @@ export default class Buff { - id = crypto.randomUUID() + id = `ability-${Buff.nextId()}` + static nextId() { return this.#nextUniqueId++ } + static #nextUniqueId = 0 + name = 'Buff' + duration = 0 #effect = () => {} diff --git a/src/entity.js b/src/entity.js index dbe6e60..f996312 100644 --- a/src/entity.js +++ b/src/entity.js @@ -6,7 +6,10 @@ import Team from './team.js' import Buff from './buff.js' export default class Entity { - id = crypto.randomUUID() + id = `entity-${Entity.nextId()}` + static nextId() { return this.#nextUniqueId++ } + static #nextUniqueId = 0 + abilities = {} bbox = new Float32Array(4) buffs = [] @@ -36,6 +39,7 @@ export default class Entity { #noPathfindingUntil = 0 #spawnPosition = new Vector2() + static collider(x, y, radius) { return new SAT.Circle(new SAT.Vector(x, y), radius) } diff --git a/src/game.js b/src/game.js index 3e63bfc..a967824 100644 --- a/src/game.js +++ b/src/game.js @@ -11,12 +11,12 @@ export default class Game { averageTick = 0 currentTick = 0 entities = [] - height = 10000 * 1.6 + height = 1000 projectiles = [] secondToSlowestTick = 0 terrains = [] tickRate = 30 - width = 10000 * 1.6 + width = 1000 #behindMs = 0 #currentTiming = 0 diff --git a/src/index.js b/src/index.js index 9f05838..45470b4 100644 --- a/src/index.js +++ b/src/index.js @@ -1,23 +1,21 @@ import { Vector2 } from 'three' import { WebSocketExpress } from 'websocket-express' -import Entity from './entity.js' import express from 'express' import Game from './game.js' -import Team from './team.js' -import Template from './template.js' -import Terrain from './terrain.js' -import Level from './level.js' +import { Dungeon, Ravine } from './level.js' const app = new WebSocketExpress() const port = 1280 const game = new Game() -app.use('/', express.static('public')) +app.use(express.urlencoded({ extended: true })) + app.use('/three/', express.static('node_modules/three')) app.use('/@tweenjs/', express.static('node_modules/@tweenjs')) app.use('/stats.js/', express.static('node_modules/stats.js')) + +app.use('/', express.static('public')) app.use('/tools/', express.static('tools')) -app.use(express.urlencoded({ extended: true })) app.ws('/ws', async (req, res) => { const websocket = await res.accept() @@ -30,6 +28,7 @@ app.ws('/ws', async (req, res) => { }) websocket.on('message', (rawData) => { + let delay = 0 const message = JSON.parse(rawData) const entity = message.id != null ? game.entities.find((e) => e.id == message.id) : null if (entity == null) { @@ -40,11 +39,6 @@ app.ws('/ws', async (req, res) => { console.log(message) } - let delay = 0 - // if(message.id == '1') { - // delay = 45 - // } - if (message.action == 'attack') { setTimeout(() => entity.attackAction(new Vector2(message.x, message.y)), delay) } @@ -67,95 +61,11 @@ app.ws('/ws', async (req, res) => { }) }) -function laneScenario() { - const player1 = new Entity(Template.player({ - id: '1', - spawnPosition: new Vector2(500, 150), - team: Team.blue, - })) - game.spawnEntity(player1) - player1.attackAction(new Vector2(500, 150)) - - // const player2 = new Entity(Template.player({ - // id: '2', - // spawnPosition: new Vector2(1600, 1800), - // team: Team.red, - // })) - // game.spawnEntity(player2) - // player2.attackAction(new Vector2(1600, 1800)) - - const gameLogic = function gameLogic() { - const game = this - - const midRoute = [ - new Vector2(1544, 1572), - new Vector2(2748, 2792), - new Vector2(3628, 3688), - new Vector2(4992, 5000), - new Vector2(6272, 6188), - new Vector2(7252, 7200), - new Vector2(8436, 8408), - ].map((p) => p.multiplyScalar(1.6)) - - const topRoute = [ - new Vector2(868, 1740), - new Vector2(856, 3480), - new Vector2(808, 5944), - new Vector2(816, 7256), - new Vector2(976, 7772), - new Vector2(1388, 8384), - new Vector2(1948, 8940), - new Vector2(2392, 9152), - new Vector2(4168, 9196), - new Vector2(6548, 9168), - new Vector2(8288, 9176), - ].map((p) => p.multiplyScalar(1.6)) - - const botRoute = [ - new Vector2(1704, 812), - new Vector2(3460, 828), - new Vector2(5804, 768), - new Vector2(7332, 844), - new Vector2(8052, 1100), - new Vector2(8528, 1516), - new Vector2(9080, 2208), - new Vector2(9224, 2620), - new Vector2(9172, 4344), - new Vector2(9136, 6752), - new Vector2(9136, 8248), - ].map((p) => p.multiplyScalar(1.6)) - - if (game.entities.length < 100) { - if ([(0 * game.tickRate), (1 * game.tickRate), (2 * game.tickRate)].includes(game.currentTick % (30 * game.tickRate))) { - game.spawnEntity(new Entity(Template.minion(Team.blue, { ranged: false, route: topRoute }))) - game.spawnEntity(new Entity(Template.minion(Team.blue, { ranged: false, route: midRoute }))) - game.spawnEntity(new Entity(Template.minion(Team.blue, { ranged: false, route: botRoute }))) - - game.spawnEntity(new Entity(Template.minion(Team.red, { ranged: false, route: topRoute.toReversed() }))) - game.spawnEntity(new Entity(Template.minion(Team.red, { ranged: false, route: midRoute.toReversed() }))) - game.spawnEntity(new Entity(Template.minion(Team.red, { ranged: false, route: botRoute.toReversed() }))) - } - - if ([(3 * game.tickRate), (4 * game.tickRate), (5 * game.tickRate)].includes(game.currentTick % (30 * game.tickRate))) { - game.spawnEntity(new Entity(Template.minion(Team.blue, { ranged: true, route: topRoute }))) - game.spawnEntity(new Entity(Template.minion(Team.blue, { ranged: true, route: midRoute }))) - game.spawnEntity(new Entity(Template.minion(Team.blue, { ranged: true, route: botRoute }))) - - game.spawnEntity(new Entity(Template.minion(Team.red, { ranged: true, route: topRoute.toReversed() }))) - game.spawnEntity(new Entity(Template.minion(Team.red, { ranged: true, route: midRoute.toReversed() }))) - game.spawnEntity(new Entity(Template.minion(Team.red, { ranged: true, route: botRoute.toReversed() }))) - } - } - - } - game.logic = gameLogic -} - app.listen(port, () => { console.log(`Server started! Visit http://localhost:${port}`) - Level.terrains.map((points) => new Terrain(points.map((p) => p.multiplyScalar(1.6)))).forEach((terrain) => game.addTerrain(terrain)) - laneScenario() + // Dungeon.scenario(game) + Ravine.scenario(game) game.start() }) diff --git a/src/level.js b/src/level.js index fa498c6..402befc 100644 --- a/src/level.js +++ b/src/level.js @@ -1,6 +1,91 @@ import { Vector2 } from 'three' +import Team from './team.js' +import Template from './template.js' +import Terrain from './terrain.js' +import Entity from './entity.js' + +export class Dungeon { + +} + +export class Ravine { + static scenario(game) { + game.width = 10000 * 1.6 + game.height = 10000 * 1.6 + this.terrains.map((points) => new Terrain(points.map((p) => p.multiplyScalar(1.6)))).forEach((terrain) => game.addTerrain(terrain)) + game.logic = this.logic.bind(game) + + const player1 = new Entity(Template.player({ + id: '1', + spawnPosition: new Vector2(500, 150), + team: Team.blue, + })) + game.spawnEntity(player1) + } + static logic() { + const game = this + + const midRoute = [ + new Vector2(1544, 1572), + new Vector2(2748, 2792), + new Vector2(3628, 3688), + new Vector2(4992, 5000), + new Vector2(6272, 6188), + new Vector2(7252, 7200), + new Vector2(8436, 8408), + ].map((p) => p.multiplyScalar(1.6)) + + const topRoute = [ + new Vector2(868, 1740), + new Vector2(856, 3480), + new Vector2(808, 5944), + new Vector2(816, 7256), + new Vector2(976, 7772), + new Vector2(1388, 8384), + new Vector2(1948, 8940), + new Vector2(2392, 9152), + new Vector2(4168, 9196), + new Vector2(6548, 9168), + new Vector2(8288, 9176), + ].map((p) => p.multiplyScalar(1.6)) + + const botRoute = [ + new Vector2(1704, 812), + new Vector2(3460, 828), + new Vector2(5804, 768), + new Vector2(7332, 844), + new Vector2(8052, 1100), + new Vector2(8528, 1516), + new Vector2(9080, 2208), + new Vector2(9224, 2620), + new Vector2(9172, 4344), + new Vector2(9136, 6752), + new Vector2(9136, 8248), + ].map((p) => p.multiplyScalar(1.6)) + + if (game.entities.length < 100) { + if ([(0 * game.tickRate), (1 * game.tickRate), (2 * game.tickRate)].includes(game.currentTick % (30 * game.tickRate))) { + game.spawnEntity(new Entity(Template.minion(Team.blue, { ranged: false, route: topRoute }))) + game.spawnEntity(new Entity(Template.minion(Team.blue, { ranged: false, route: midRoute }))) + game.spawnEntity(new Entity(Template.minion(Team.blue, { ranged: false, route: botRoute }))) + + game.spawnEntity(new Entity(Template.minion(Team.red, { ranged: false, route: topRoute.toReversed() }))) + game.spawnEntity(new Entity(Template.minion(Team.red, { ranged: false, route: midRoute.toReversed() }))) + game.spawnEntity(new Entity(Template.minion(Team.red, { ranged: false, route: botRoute.toReversed() }))) + } + + if ([(3 * game.tickRate), (4 * game.tickRate), (5 * game.tickRate)].includes(game.currentTick % (30 * game.tickRate))) { + game.spawnEntity(new Entity(Template.minion(Team.blue, { ranged: true, route: topRoute }))) + game.spawnEntity(new Entity(Template.minion(Team.blue, { ranged: true, route: midRoute }))) + game.spawnEntity(new Entity(Template.minion(Team.blue, { ranged: true, route: botRoute }))) + + game.spawnEntity(new Entity(Template.minion(Team.red, { ranged: true, route: topRoute.toReversed() }))) + game.spawnEntity(new Entity(Template.minion(Team.red, { ranged: true, route: midRoute.toReversed() }))) + game.spawnEntity(new Entity(Template.minion(Team.red, { ranged: true, route: botRoute.toReversed() }))) + } + } + } -export default class Map { static terrains = [ // // top base gate west wall // [ diff --git a/src/projectile.js b/src/projectile.js index 6a09eeb..811685d 100644 --- a/src/projectile.js +++ b/src/projectile.js @@ -4,7 +4,9 @@ import SATX from './satx.js' import Entity from './entity.js' export default class Projectile { - id = crypto.randomUUID() + id = `projectile-${Projectile.nextId()}` + static nextId() { return this.#nextUniqueId++ } + static #nextUniqueId = 0 bbox = new Float32Array(4) height = 50 diff --git a/src/terrain.js b/src/terrain.js index 09f30b7..2f22de7 100644 --- a/src/terrain.js +++ b/src/terrain.js @@ -2,7 +2,9 @@ import { Shape, ShapeUtils, Vector2 } from 'three' import SAT from 'sat' export default class Terrain { - id = crypto.randomUUID() + id = `terrain-${Terrain.nextId()}` + static nextId() { return this.#nextUniqueId++ } + static #nextUniqueId = 0 bbox = new Float32Array(4) position = new Vector2()