From 389f325618d8778fb72a177c044f3f7a033aa523 Mon Sep 17 00:00:00 2001 From: Sergiotarxz Date: Sun, 14 Jan 2024 22:02:49 +0100 Subject: [PATCH] Adding initial support for conquering nodes. --- js-src/conquer/index.ts | 15 +++- js-src/conquer/interface/node-view.ts | 70 ++++++++++++++++++- js-src/conquer/map-node.ts | 19 ++++- lib/BurguillosInfo.pm | 1 + lib/BurguillosInfo/Controller/ConquerNode.pm | 27 +++++++ .../Schema/Result/ConquerNode.pm | 56 ++++++++++----- .../Schema/Result/ConquerTeam.pm | 1 + public/js/bundle.js | 6 +- 8 files changed, 166 insertions(+), 29 deletions(-) diff --git a/js-src/conquer/index.ts b/js-src/conquer/index.ts index 75fef9c..63c4c4d 100644 --- a/js-src/conquer/index.ts +++ b/js-src/conquer/index.ts @@ -24,6 +24,7 @@ import NewNodeUI from '@burguillosinfo/conquer/interface/new-node' import NewTeamUI from '@burguillosinfo/conquer/interface/new-team' import WebSocket from '@burguillosinfo/conquer/websocket' import JsonSerializer from '@burguillosinfo/conquer/serializer'; +import ConquerUser from '@burguillosinfo/conquer/user' type StylesInterface = Record @@ -433,13 +434,21 @@ export default class Conquer { if (this.currentPositionFeature === null) { return } + const user = await ConquerUser.getSelfUser() + let color = 'white'; + if (user !== null) { + const team = await user.getTeam(); + if (team !== null) { + color = team.getColor(); + } + } const styles: StylesInterface = { currentPositionFeature: new Style({ image: new CircleStyle({ radius: 14, - fill: new Fill({color: 'white'}), + fill: new Fill({color: color}), stroke: new Stroke({ - color: 'blue', + color: 'beige', width: 2, }) }) @@ -447,7 +456,7 @@ export default class Conquer { }; const features = [this.currentPositionFeature] for (const key in this.getServerNodes()) { - styles[key] = this.getServerNodes()[key].getStyle() + styles[key] = await this.getServerNodes()[key].getStyle() features.push(this.getServerNodes()[key].getFeature()) } const vectorLayer = new VectorLayer({ diff --git a/js-src/conquer/interface/node-view.ts b/js-src/conquer/interface/node-view.ts index a1fc80b..1c088e6 100644 --- a/js-src/conquer/interface/node-view.ts +++ b/js-src/conquer/interface/node-view.ts @@ -63,6 +63,7 @@ export default class NodeView extends AbstractTopBarInterface { + (this.node.isNear() ? 'Estas cerca y puedes interactuar con este sitio.' : 'Estás demasiado lejos para hacer nada aquí.'); + this.populateTeamData(); if (this.node.isNear()) { await this.runIfNear(); } @@ -70,22 +71,87 @@ export default class NodeView extends AbstractTopBarInterface { mainNode.classList.remove('conquer-display-none') } + private async populateTeamData() { + const element = document.createElement('p'); + const team = await this.node.getTeam(); + (() => { + if (team === null) { + element.innerText = 'El nodo no pertenece a ningún equipo todavía.'; + return; + } + const spanText = document.createElement('span'); + spanText.innerText = 'Equipo: '; + element.append(spanText); + const spanCircle = document.createElement('span'); + spanCircle.classList.add('conquer-team-circle'); + spanCircle.style.backgroundColor = team.getColor(); + element.append(spanCircle); + const spanTeamName = document.createElement('span'); + spanTeamName.style.color = team.getColor(); + spanTeamName.innerText = ' ' + team.getName(); + element.append(spanTeamName); + })(); + this.getView().append(element); + } + private async runIfNear(): Promise { - const team = await this.user.getTeam(); - if (team === null) { + const userTeam = await this.user.getTeam(); + const nodeTeam = await this.node.getTeam(); + if (userTeam === null) { const paragraphNoTeam = document.createElement('p'); paragraphNoTeam.innerText = 'Parece que no has seleccionado equipo aun,' + ' pulsa el botón de seleccionar equipo para comenzar tu aventura,' + ' si quieres cambiar de equipo en el futuro puedes hacerlo sin problemas.'; this.getView().append(paragraphNoTeam); } + const selectTeamButton = document.createElement('button'); selectTeamButton.innerText = 'Seleccionar equipo'; selectTeamButton.addEventListener('click', () => { this.runCallbacks('open-select-team'); this.runCallbacks('close'); }); + this.getView().append(selectTeamButton); + if (await this.isOpposingNode()) { + const conquerForTeamButton = document.createElement('button'); + conquerForTeamButton.innerText = 'Conquistar'; + conquerForTeamButton.addEventListener('click', () => { + this.conquerThisNodeForTeam(); + }); + this.getView().append(conquerForTeamButton); + } + } + + private async conquerThisNodeForTeam() { + const urlNode = new URL('/conquer/node/' + this.node.getUUID() + '/try-conquer', + window.location.protocol + '//' + + window.location.hostname + ':' + + window.location.port) + const response = await fetch(urlNode, { + method: 'POST', + }); + this.runCallbacks('update-nodes'); + this.runCallbacks('close'); + } + + private async isOpposingNode(): Promise { + const userTeam = await this.user.getTeam(); + const nodeTeam = await this.node.getTeam(); + if (userTeam === null) { + return false; + } + if (nodeTeam === null) { + return true; + } + if (nodeTeam.getUUID() !== userTeam.getUUID()) { + return true; + } + return false; + } + + private async isNodeFree(): Promise { + return await this.node.getTeam() === null; } } diff --git a/js-src/conquer/map-node.ts b/js-src/conquer/map-node.ts index d510806..3b2893e 100644 --- a/js-src/conquer/map-node.ts +++ b/js-src/conquer/map-node.ts @@ -9,6 +9,7 @@ import InterfaceManager from '@burguillosinfo/conquer/interface-manager' import NodeView from '@burguillosinfo/conquer/interface/node-view' import JsonSerializer from '@burguillosinfo/conquer/serializer'; import SelectTeamUI from '@burguillosinfo/conquer/interface/select-team'; +import ConquerTeam from '@burguillosinfo/conquer/team'; @JsonObject() export default class MapNode { @@ -24,9 +25,18 @@ export default class MapNode { @JsonProperty() private description: string, @JsonProperty() private kind: string, @JsonProperty() private is_near: boolean, + @JsonProperty() private team: string, ) { } + public async getTeam(): Promise { + if (this.team === null) { + return null; + } + return ConquerTeam.getTeam(this.team); + } + + public async fetch(): Promise { const urlNode = new URL('/conquer/node/' + this.uuid, window.location.protocol + '//' + window.location.hostname + ':' + window.location.port) const response = await fetch(urlNode); @@ -125,11 +135,16 @@ export default class MapNode { return this.feature; } - public getStyle(): Style { + public async getStyle(): Promise