From 569e165690297e7e7689cfdcd6f20afa26c30216 Mon Sep 17 00:00:00 2001 From: BinarySandia04 Date: Tue, 6 Aug 2024 23:02:18 +0200 Subject: [PATCH] Mas cosas --- client/package-lock.json | 7 + client/package.json | 1 + .../delapouite/perspective-dice-six-svg.svg | 7 + client/public/img/d20.png | Bin 0 -> 18906 bytes client/public/img/dd-dice-512.webp | Bin 0 -> 17210 bytes client/src/assets/base.css | 5 +- client/src/assets/main.css | 7 + client/src/services/Dragonroll.js | 61 +++++++- client/src/services/Windows.js | 14 +- client/src/views/managers/GameManager.vue | 37 ++++- client/src/views/managers/TileMap.vue | 6 +- client/src/views/managers/WindowManager.vue | 8 +- client/src/views/partials/ChatComponent.vue | 146 ++++++++++++++++++ client/src/views/partials/MessageChunk.vue | 61 ++++++++ .../src/views/partials/MessageComponent.vue | 65 ++++++++ client/src/views/partials/game/IconButton.vue | 20 ++- .../campaigns/CampaignPreviewWindow.vue | 43 +++++- client/src/views/windows/game/ChatWindow.vue | 38 +++++ client/src/views/windows/game/DiceWindow.vue | 140 +++++++++++++++++ server/io/campaign.js | 7 +- 20 files changed, 652 insertions(+), 21 deletions(-) create mode 100644 client/public/icons/game-icons/000000/delapouite/perspective-dice-six-svg.svg create mode 100644 client/public/img/d20.png create mode 100644 client/public/img/dd-dice-512.webp create mode 100644 client/src/views/partials/ChatComponent.vue create mode 100644 client/src/views/partials/MessageChunk.vue create mode 100644 client/src/views/partials/MessageComponent.vue create mode 100644 client/src/views/windows/game/ChatWindow.vue create mode 100644 client/src/views/windows/game/DiceWindow.vue diff --git a/client/package-lock.json b/client/package-lock.json index 6bb6e06c..c8c99b4e 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -11,6 +11,7 @@ "@kangc/v-md-editor": "^2.3.17", "axios": "^1.5.1", "babel-plugin-prismjs": "^2.1.0", + "dice-notation-js": "^1.0.3", "ef-infinite-canvas": "^0.6.6", "form-data": "^4.0.0", "jquery": "^3.7.1", @@ -5102,6 +5103,12 @@ "dev": true, "license": "MIT" }, + "node_modules/dice-notation-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dice-notation-js/-/dice-notation-js-1.0.3.tgz", + "integrity": "sha512-K02a/w3kjRp4QPYE3+qlXnQRVw9n00IIJHYtrxAryIIC112SP36YKo2Z9CR/f+ZKzj+YKJmCeTKnMIc4+crG5g==", + "license": "MIT" + }, "node_modules/dir-glob": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", diff --git a/client/package.json b/client/package.json index cae4980c..1d49981f 100644 --- a/client/package.json +++ b/client/package.json @@ -12,6 +12,7 @@ "@kangc/v-md-editor": "^2.3.17", "axios": "^1.5.1", "babel-plugin-prismjs": "^2.1.0", + "dice-notation-js": "^1.0.3", "ef-infinite-canvas": "^0.6.6", "form-data": "^4.0.0", "jquery": "^3.7.1", diff --git a/client/public/icons/game-icons/000000/delapouite/perspective-dice-six-svg.svg b/client/public/icons/game-icons/000000/delapouite/perspective-dice-six-svg.svg new file mode 100644 index 00000000..3efaf6a1 --- /dev/null +++ b/client/public/icons/game-icons/000000/delapouite/perspective-dice-six-svg.svg @@ -0,0 +1,7 @@ + + perspective-dice-six-svg + + + \ No newline at end of file diff --git a/client/public/img/d20.png b/client/public/img/d20.png new file mode 100644 index 0000000000000000000000000000000000000000..b0fd421a64080c97432b1d089a4332da89696623 GIT binary patch literal 18906 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 literal 0 HcmV?d00001 diff --git a/client/public/img/dd-dice-512.webp b/client/public/img/dd-dice-512.webp new file mode 100644 index 0000000000000000000000000000000000000000..628281928b176bc274f12e7d67ea7722a6be9b58 GIT binary patch literal 17210 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 literal 0 HcmV?d00001 diff --git a/client/src/assets/base.css b/client/src/assets/base.css index 3a4c1127..388ad274 100644 --- a/client/src/assets/base.css +++ b/client/src/assets/base.css @@ -22,7 +22,7 @@ --c-black-muter: #585858; - --c-black-blurred: #222222cc; + --c-black-blurred: #222222; --c-indigo: #2c3e50; @@ -96,6 +96,9 @@ --chat-background: var(--c-blacker); --text-disabled: #7e7e7e; + --color-chat-other: #1d1d1d; + --color-roll-dice-chat: #665750; + --color-hover: var() } } diff --git a/client/src/assets/main.css b/client/src/assets/main.css index 0c819d44..29c747f3 100644 --- a/client/src/assets/main.css +++ b/client/src/assets/main.css @@ -67,6 +67,13 @@ a { background-color: var(--c-button-green-hover); } +.btn-red { + background-color: var(--c-button-red); +} +.btn-red:hover { + background-color: var(--c-button-red-hover); +} + hr { border: 0; height: 1px; diff --git a/client/src/services/Dragonroll.js b/client/src/services/Dragonroll.js index b4118e1c..4ff24302 100644 --- a/client/src/services/Dragonroll.js +++ b/client/src/services/Dragonroll.js @@ -4,6 +4,7 @@ import { io } from "socket.io-client"; import Api from '@/services/Api' import { backendUrl } from './BackendURL'; import { GetUser } from './User'; +import { ExitGame } from './Game'; let emitter; @@ -25,7 +26,24 @@ let GetPlayerList = () => { return players; }; let GetCampaign = () => { return currentCampaign; }; let GetClient = () => { return currentPlayer; }; +let chatMessageId = 0; +const chat = ref([ + /* { + id: 1, + author: "66ae8aea3e78bb669e25010d", + chunks: [ + { + id: 1, + type: "text", + content: "Hola test" + } + ] + } */ +]); +let GetChatRef = () => chat; + socket.on('update-players', data => { + console.log(data); players.value = []; Object.keys(data).forEach((key) => { players.value.push(data[key]); @@ -33,22 +51,60 @@ socket.on('update-players', data => { }); }) -function DisplayCampaign(data){ +socket.on('message', (data) => { + // Add new chat message, ? + if(chat.value.length > 0) if(chat.value[chat.value.length - 1].author == data.author){ + chat.value[chat.value.length - 1].chunkSize += 1; + chat.value[chat.value.length - 1].chunks.push({ + id: chat.value[chat.value.length - 1].chunkSize, + type: data.type ? data.type : 'text', + content: data.content + }); + return; + } + + chatMessageId += 1; + chat.value.push({ + id: chatMessageId, + author: data.author, + chunkSize: 1, + chunks: [ + { + id: 1, + type: data.type ? data.type : 'text', + content: data.content + } + ] + }); +}); + +function SendMessage(data){ + socket.emit('message', data); +} + +function DisplayCampaign(data = currentCampaign){ ClearAll(); CreateWindow('campaign_preview', {campaign: data}); } function ConnectToCampaign(campaign){ currentCampaign = campaign; + chat.value = []; + socket.emit('enter', GetUser(), currentCampaign._id); } function Disconnect(){ socket.emit('exit'); + ExitGame(); + currentCampaign = null; + currentPlayer = null; + chat.value = []; } function GetPlayer(player_campaign){ + console.log(players.value); let index = players.value.findIndex((p) => {return p._id == player_campaign}); if(index != -1) return players.value[index]; } @@ -66,4 +122,7 @@ export { GetClient, GetPlayerList, GetPlayer, + + GetChatRef, + SendMessage }; \ No newline at end of file diff --git a/client/src/services/Windows.js b/client/src/services/Windows.js index 56369183..ab70af77 100644 --- a/client/src/services/Windows.js +++ b/client/src/services/Windows.js @@ -12,7 +12,9 @@ const windows = { campaign_list: ref([]), new_campaign: ref([]), join_campaign: ref([]), - campaign_preview: ref([]) + campaign_preview: ref([]), + chat: ref([]), + dice_menu: ref([]), }; const defValues = { @@ -66,6 +68,16 @@ const defValues = { ClearWindow('campaign_preview'); CreateWindow('campaign_list'); } + }, + 'chat': { + id: 'chat', + title: 'Chat', + close: true + }, + 'dice_menu': { + id: 'dice_menu', + title: 'Dice roll', + close: true } } diff --git a/client/src/views/managers/GameManager.vue b/client/src/views/managers/GameManager.vue index 15166845..98c86356 100644 --- a/client/src/views/managers/GameManager.vue +++ b/client/src/views/managers/GameManager.vue @@ -4,12 +4,26 @@ import { InGameRef } from '../../services/Game'; import IconButton from '../partials/game/IconButton.vue'; import { AddSound } from '../../services/Sound'; import TileMap from './TileMap.vue'; +import { DisplayCampaign, GetCampaign } from '../../services/Dragonroll'; +import { ClearAll, CreateWindow } from '../../services/Windows'; const game = ref(null); const in_game = InGameRef(); +function OpenCampaignPreview(){ + CreateWindow('campaign_preview', {campaign: GetCampaign(), style: 'compact', hide_start: true, back: undefined, close: true}); +} + +function OpenChat(){ + CreateWindow('chat'); +} + +function OpenDiceMenu(){ + CreateWindow('dice_menu'); +} + watch(game, () => { - if(game){ + if(game.value && in_game.value){ AddSound(game.value); } }); @@ -22,12 +36,14 @@ watch(game, () => {
- + - +
- + + +
@@ -44,5 +60,18 @@ watch(game, () => { display: flex; flex-direction: column; z-index: 1; + + user-select: none; +} + +.horizontal-button { + position: absolute; + top: 10px; + right: 10px; + display: flex; + flex-direction: row; + z-index: 1; + + user-select: none; } \ No newline at end of file diff --git a/client/src/views/managers/TileMap.vue b/client/src/views/managers/TileMap.vue index 5ff612f6..22604236 100644 --- a/client/src/views/managers/TileMap.vue +++ b/client/src/views/managers/TileMap.vue @@ -115,12 +115,16 @@ onMounted(() => { offsetY = oldOffsetY + ((event.clientY - startY) * (1 / scale)); draw(); - console.log("x: " + offsetX + ", y: " + offsetY); + // console.log("x: " + offsetX + ", y: " + offsetY); }); tilemap.addEventListener("mouseup", () => mouseDown = false); addEventListener("resize", draw) + + offsetX = window.innerWidth / 2; + offsetY = window.innerHeight / 2; + draw(); }); diff --git a/client/src/views/managers/WindowManager.vue b/client/src/views/managers/WindowManager.vue index 5896dc50..2b7ac576 100644 --- a/client/src/views/managers/WindowManager.vue +++ b/client/src/views/managers/WindowManager.vue @@ -15,6 +15,8 @@ import CampaignListWindow from '../windows/campaigns/CampaignListWindow.vue' import NewCampaignWindow from '../windows/campaigns/NewCampaignWindow.vue' import JoinCampaignWindow from '../windows/campaigns/JoinCampaignWindow.vue' import CampaignPreviewWindow from '@/views/windows/campaigns/CampaignPreviewWindow.vue' +import ChatWindow from '../windows/game/ChatWindow.vue' +import DiceWindow from '../windows/game/DiceWindow.vue' // Gestionem ventanas const reload = ReloadRef(); @@ -32,6 +34,8 @@ const campaign_list = windows.campaign_list; const new_campaign = windows.new_campaign; const join_campaign = windows.join_campaign; const campaign_preview = windows.campaign_preview; +const chat = windows.chat; +const dice_menu = windows.dice_menu; @@ -48,6 +52,8 @@ const campaign_preview = windows.campaign_preview; + + @@ -57,7 +63,7 @@ const campaign_preview = windows.campaign_preview; .window-wrapper { background-color: var(--window-background); - backdrop-filter: blur(10px); + /* backdrop-filter: blur(10px); */ position: fixed; diff --git a/client/src/views/partials/ChatComponent.vue b/client/src/views/partials/ChatComponent.vue new file mode 100644 index 00000000..38b84b08 --- /dev/null +++ b/client/src/views/partials/ChatComponent.vue @@ -0,0 +1,146 @@ + + + + + diff --git a/client/src/views/partials/MessageChunk.vue b/client/src/views/partials/MessageChunk.vue new file mode 100644 index 00000000..3ee32aab --- /dev/null +++ b/client/src/views/partials/MessageChunk.vue @@ -0,0 +1,61 @@ + + + + + \ No newline at end of file diff --git a/client/src/views/partials/MessageComponent.vue b/client/src/views/partials/MessageComponent.vue new file mode 100644 index 00000000..ca6705f7 --- /dev/null +++ b/client/src/views/partials/MessageComponent.vue @@ -0,0 +1,65 @@ + + + + + diff --git a/client/src/views/partials/game/IconButton.vue b/client/src/views/partials/game/IconButton.vue index e4f34d78..5f88a9a4 100644 --- a/client/src/views/partials/game/IconButton.vue +++ b/client/src/views/partials/game/IconButton.vue @@ -1,13 +1,16 @@ @@ -16,6 +19,12 @@ let icon = props.icon; .icon-button { height: 32px; width: 32px; + + &.big { + height: 42px; + width: 42px; + } + background-color: var(--color-background-soft); border-radius: 6px; display: flex; @@ -34,4 +43,9 @@ let icon = props.icon; height: 24px; width: 24px; } + +.big { + height: 38px; + width: 38px; +} \ No newline at end of file diff --git a/client/src/views/windows/campaigns/CampaignPreviewWindow.vue b/client/src/views/windows/campaigns/CampaignPreviewWindow.vue index fe7aff9b..fd3b3159 100644 --- a/client/src/views/windows/campaigns/CampaignPreviewWindow.vue +++ b/client/src/views/windows/campaigns/CampaignPreviewWindow.vue @@ -4,23 +4,39 @@ import { SetupHandle, SetSize, SetPosition, ResetPosition } from '@/services/Win import WindowHandle from '@/views/partials/WindowHandle.vue'; import PlayerList from '../../partials/PlayerList.vue'; -import { DisplayToast, GetCampaign, GetClient } from '../../../services/Dragonroll'; +import { Disconnect, DisplayToast, GetCampaign, GetClient } from '../../../services/Dragonroll'; import CampaignBookList from '../../partials/books/CampaignBookList.vue'; -import { ClearWindow } from '../../../services/Windows'; +import { ClearAll, ClearWindow, CreateWindow } from '../../../services/Windows'; import { LaunchGame } from '../../../services/Game'; +import { AddSound } from '../../../services/Sound'; +import ChatComponent from '../../partials/ChatComponent.vue'; const handle = ref(null); const props = defineProps(['data']); const data = props.data; +const hide_start = ref(false); +const hide_chat = ref(false); + +const container = ref(null); + let id = data.id; onMounted(() => { SetupHandle(id, handle); - SetSize(id, {x: 1200, y: 750}); + + if(data.style == 'compact') { + SetSize(id, {x: 800, y: 750}); + hide_chat.value = true; + } else { + SetSize(id, {x: 1200, y: 750}); + } + ResetPosition(id, "center"); - console.log(data); + hide_start.value = data.hide_start; + + AddSound(container.value) }); function CopyCode(){ @@ -33,6 +49,12 @@ function Launch(){ LaunchGame(); } +function Exit(){ + Disconnect(); + ClearAll(); + CreateWindow('campaign_list'); +} + @@ -43,7 +65,7 @@ function Launch(){ -
+

Players

@@ -61,11 +83,12 @@ function Launch(){
- + +
-
-

Chat

+
+
@@ -115,6 +138,10 @@ function Launch(){ display: grid; grid-template-columns: 3fr 5fr 4fr; + + &.campaign-preview-compact { + grid-template-columns: 2fr 3fr; + } } .campaign-preview-column { diff --git a/client/src/views/windows/game/ChatWindow.vue b/client/src/views/windows/game/ChatWindow.vue new file mode 100644 index 00000000..2e2e3021 --- /dev/null +++ b/client/src/views/windows/game/ChatWindow.vue @@ -0,0 +1,38 @@ + + + + + + + diff --git a/client/src/views/windows/game/DiceWindow.vue b/client/src/views/windows/game/DiceWindow.vue new file mode 100644 index 00000000..2a3fa56c --- /dev/null +++ b/client/src/views/windows/game/DiceWindow.vue @@ -0,0 +1,140 @@ + + + + + + + diff --git a/server/io/campaign.js b/server/io/campaign.js index 55da8ec6..d490f68e 100644 --- a/server/io/campaign.js +++ b/server/io/campaign.js @@ -33,7 +33,8 @@ module.exports = io => { socket.campaign = campaignId; if(!sessions[campaignId]) sessions[campaignId] = { - players: await GetOfflinePlayers(campaignId) + players: await GetOfflinePlayers(campaignId), + chat: [] }; @@ -55,5 +56,9 @@ module.exports = io => { console.log(socket.user.username + " ha salido!") }); + + socket.on('message', (data) => { + io.to(socket.campaign).emit('message', data); + }) }); } \ No newline at end of file