From f77b019b3d5dacb6f5af88825a15b695b3c3625d Mon Sep 17 00:00:00 2001 From: t510599 Date: Fri, 1 Jun 2018 01:44:47 +0800 Subject: [PATCH] finished game webpage --- web/cards.html | 125 ++++++++ web/gameCore.js | 696 ++++++++++++++++++++++++++++++++++++++++++++ web/gameUI.css | 88 ++++++ web/index.html | 81 ++++++ web/lose.png | Bin 0 -> 62346 bytes web/menu.js | 92 ++++++ web/stringFormat.js | 4 + web/won.png | Bin 0 -> 62445 bytes web/ws.js | 44 +++ 9 files changed, 1130 insertions(+) create mode 100644 web/cards.html create mode 100644 web/gameCore.js create mode 100644 web/gameUI.css create mode 100644 web/index.html create mode 100644 web/lose.png create mode 100644 web/menu.js create mode 100644 web/stringFormat.js create mode 100644 web/won.png create mode 100644 web/ws.js diff --git a/web/cards.html b/web/cards.html new file mode 100644 index 0000000..7a0fe50 --- /dev/null +++ b/web/cards.html @@ -0,0 +1,125 @@ + + + + + + 災厄之悲歌 + + + + + + + + +
+ +
+ +
+
+
+
== 等待中 ==
+
+
+
--
+
+
+ 清新 +
+
+ + + + +
+
+ 手牌 -- +
+
+ 牌組 -- +
+
+
+ + +
+
+
房號
+
00000
+
+
Turn 0
+
等待中
+ +
+ + +
+
+
+
===
+
+
+
--
+
+
+ 清新 +
+
+ + + + +
+
+ 手牌 -- +
+
+ 牌組 -- +
+
+
+
+ + +
+ +
+ +
+
+
+ + +
+ + +
+ + + +
+
+ +
+ +
+ +
+
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/web/gameCore.js b/web/gameCore.js new file mode 100644 index 0000000..6dd4776 --- /dev/null +++ b/web/gameCore.js @@ -0,0 +1,696 @@ +/* System Variable */ +var time,timer; +var MouseOn = false; +var now = null; // to store whose turn is this. value: "player" or "enemy" +var socketReady = false; +var lock = true; +var debugMode = true; +var dialogDisplay = false; +var curName = ""; +var eneName = ""; +var drawID = ""; +var poisonDamage = ""; +var tradeChoose = ""; +var handCards = []; + +/* DOM Objects */ +var cardContainer = $('.cards.container')[0]; +var dialog = $('#modal'); +var grid = $('#grid')[0]; +var column = $('.column'); +var log = $('#log')[0]; +var gameStatus = $('#status'); +var turn = $('#turn')[0]; +var roomNum = $('.statistic > .value')[0]; + +var enemy = $('#enemy'); +var myself = $('#myself'); + +/* text */ +// cards +var cards = {'1': '攻擊', '2': '防禦', '3': '治癒', '4': '補給', '5': '強奪', '6': '奇襲', '7': '交易', '8': '洞悉', '9': '妙策', '10': '掃射', '11': '加護', '12': '劇毒', '13': '詛咒', '14': '反制', '15': '狂亂', '16': '逆轉'}; +var cardsDescription = {"1":"對敵方造成兩點傷害","2":"回復一點生命
被動:抵擋攻擊類卡片","3":"回復兩點生命","4":"抽取兩張手牌","5":"從敵方手牌中選擇一張加入自己的手牌","6":"對敵方造成兩點傷害,並使其隨機損失一張手牌","7":"選取一張手牌與敵方交換","8":"抽取三張手牌
被動:抵擋攻擊類卡片,並抽取一張手牌、抵擋強奪的效果","9":"從牌庫中隨機挑出三張卡片,選擇一張加入手牌","10":"對敵方造成零~五點傷害","11":"回復三點生命,並解除中毒","12":"使敵方中毒:每個回合,玩家會損失一點生命","13":"使其損失四點生命,並隨機損失一張手牌","14":"使敵方生命減半
被動:抵擋攻擊類卡片,並反彈其傷害和效果","15":"回復三點生命,並對敵方造成三點傷害","16":"使自己與敵方的生命交換"} + +var characters = {'1': '安', '2': '圭月', '3': '梅', '4': '小兔', '5': '銀', '6': '正作', '7': 'W', '8': '桑德', '9': '海爾', '10': '雪村'}; + +// templates +var cardTemplate = `
{{ name }}
{{ id }}
{{ description }}
`; +var listCardTemplate = `
{{ name }}
{{ description }}
`; +var logTemplate = `
{{ content }}
`; +var logDivider = `
{{ player }} Turn {{ turn }}
`; + +// messages +var messages = { + "attack": "{} 攻擊 {}", + "damaged": "{} 受到{}點傷害", + "defended": "{} 防禦成功", + "defend": "{} 沒什麼可以防禦的,回復一點生命", + "heal": "{} 回復兩點生命", + "supply": "{} 增加兩張手牌", + "rob": "{} 正在對 {} 行搶", + "cantRob": "{}沒有搶到任何東西", + "robbed": "{} 搶到了 {}", + "surprise": "{} 發動奇襲", + "surprised": "{} 受到{}點傷害,而且掉了一張手牌", + "surNoCard": "{} 受到{}點傷害", + "trade": "{} 想與 {} 進行交易", + "tradeChoose": "{} 選擇了 {}", + "tradeNoCard": "{} 沒有卡片可以交易", + "awared": "{} 洞悉了 {} 的{},並抽取了一張手牌", + "aware": "{} 增加三張手牌", + "plan": "{} 有個妙策", + "sweep": "{} 對 {} 進行掃射,威力是 {}", + "bless": "{} 獲得加護,身上的毒素一掃而空,並回復三點生命,還抽取了兩張手牌", + "poison": "{} 在食物下毒,{}中毒了", + "curse": "{} 詛咒了 {},使其損失四點生命,並掉了一張手牌", + "curseNoCard": "{} 詛咒了 {},使其損失四點生命", + "countered": "{} 反制了 {} 的攻擊,反彈了{}點傷害", + "counteredSur": "{} 反制了 {} 的攻擊,反彈了{}點傷害,並使其掉了一張手牌", + "counter": "{} 反制了敵手,使 {} 生命值減半了!", + "chaos": "{} 進入狂亂模式,回復三點生命,並對 {} 造成三點傷害", + "reverse": "{} 一口氣逆轉了情勢", + "noCard": "你抽到了死神", + "poisonDamaged": "{} 受到了劇毒的侵蝕,損失{}點生命", + "surrender": "{}投降", + "firstAttack": "{}先攻", + "win": "{}獲勝", + "draw": "{}抽到了{}", + "drawEne": "{}抽了一張卡片", + "use": "{}使用了{}", + "eneDisconn": "因敵方斷線,所以{}獲勝" +}; +/* text end */ + +// handler +function wsHandler(dataJson) { + if (debugMode) { // debugging data + rawLog(dataJson); + } + // define the current player and update player status + if (dataJson.now === "player") { + now = "player"; + gameUpdate(dataJson); + $('#skip').removeClass('disabled'); + } else if (dataJson.now === "enemy") { + now = "enemy"; + gameUpdate(dataJson); + $('#skip').addClass('disabled'); + } + /* special cases */ + if (dataJson.toString().match(/^[0-9]{1,5}$/)) { // contains only number => room id + id = dataJson.toString(); + gameUpdate({ "room": id }); + return null; + } + if (dataJson.room) { // game start + curName = dataJson['cur']; + eneName = dataJson['ene']; + setPlayerName(curName); + setEnemyName(eneName); + $('#enemy .icon').css('opacity','1'); // show enemy avatar + return null; + } + if (dataJson.action) { // time for users to do more action! + // Received: {"msg": "rob", "data": ["W", "\u96ea\u6751"], "action": "toRob", "value": {"enemy_card": ["5", "5", "5", "5", "5", "5", "5", "5", "5", "5", "5", "5", "5", "5", "5"]}} + statusInitialize(); + lock = false; + switch (dataJson.action) { + case "toDefend": + askGuard(dataJson.value); + break; + case "toRob": + chooseRob(dataJson.value['enemy_card']); + break; + case "toBeRobbed": + askDefendRob(); + break; + case "toTrade": + if (dataJson.value) { + chooseTrade(dataJson.value['hand']) + } else { + chooseTrade(handCards,tradeChoose); + } + break; + case "toAdd": + choosePlan(dataJson.value['cards']); + break; + default: + break; + } + } + + // normal situation + if (dataJson.msg) { + switch (dataJson.msg) { + case "draw": + drawID = dataJson.data[1]; // card ID + break; + case "use": + useID = dataJson.data[1]; // card ID + dataJson.data[1] = cards[useID]; // edit data + Log(dataJson); + break; + case "robbed": + robbedCard = dataJson.data[1]; // card ID + LogPlayerChoose("robbed",robbedCard); + break; + case "tradeChoose": + tradeChoose = dataJson.data[1]; // card ID + LogPlayerChoose("tradeChoose",tradeChoose); + break; + case "poisonDamaged": + poisonDamage = dataJson.data[1]; // posion level + break; + case "win": + if (dataJson.data[0] === "player") { + playerWin(); + dataJson.data[0] = '你'; + Log(dataJson); + } else if (dataJson.data[0] === "enemy") { + playerLose(); + } + break; + case "eneDisconn": + playerWin(); + Log(dataJson); + break; + default: + Log(dataJson); + break; + } + } + +} + +function wsOnClose() { + console.log("Disconnected"); + ts('.snackbar').snackbar({ + content: '已中斷連線', + }); + statusInitialize(); + gameStatus.html('連線已中斷'); + gameStatus.addClass('warning'); + $('#skip').addClass('disabled'); + $('#giveup').addClass('disabled'); + unsetCardListener(); + socketReady = false; +} + +function wsOnOpen(status) { + console.log("Connected! Status:" + status); + ts('.snackbar').snackbar({ + content: '連線成功!' + }); + socketReady = true; +} + +function wsOnError(except) { + ts('.snackbar').snackbar({ + content: '連線失敗!', + action: '重試', + actionEmphasis: 'negative', + onAction: () => { + init(); + } + }); + console.log(except); +} // https://stackoverflow.com/questions/25779831/how-to-catch-websocket-connection-to-ws-xxxnn-failed-connection-closed-be + +// listener +function setCardListener() { + $('.cards.container a.ts.card').each((i,e) => { + $(e).click(function() { + useCard(this.dataset.id); + }); + }); +} + +function unsetCardListener() { + $('.cards.container a.ts.card').each((i,e) => { + $(e).off("click"); + }); +} + +function setModalCardListListener() { + $('#modal .ts.list .item').each((i,e) => { + $(e).click(function() { + useCard(this.dataset.id); + modalClose(); + }); + }); +} + +function setModalSkipButtonListener() { + $('#modal #modalSkipBtn').click(function() { + send(0); + modalClose(); + }); +} + +$('#skip').click(function() { + if (!$(this).hasClass('disabled')) { + send(0); + } +}); + +$('#giveup').click(function() { + quit(); +}); + +function resultListener() { + $('#returnIndex').click(function() { + location.href = './index.html'; + }); + $('#restart').click(function() { + location.reload(); + }); + $('#close').click(function() { + modalClose(); + }); +} + +// log +log.addEventListener("mouseover", function() { MouseOn = true; }); // if mouse is over the div, don't scroll to bottom +log.addEventListener("mouseleave", function() { MouseOn = false; }); + +function Log(msgJson) { + var node = logTemplate; + if(now === "player") { // to distinguish if this is self log or enemy log + node = node.replace("{{ isSelf }}","right"); + } else if (now === "enemy") { + node = node.replace("{{ isSelf }}",""); + } + + node = node.replace("{{ content }}",messages[msgJson['msg']].format(msgJson['data'])); + log.insertAdjacentHTML("beforeend",node); // insert to log + if (!MouseOn) { // if mouse isn't over the div, scroll to bottom + log.scrollTop = log.scrollHeight; // scroll to bottom + } +} + +function LogPlayerDraw() { + var node = logTemplate.replace("{{ isSelf }}","right"); + node = node.replace("{{ content }}",messages['draw'].format([curName,cards[drawID]])); // msgJson['data'][0] player name, msgJson['data'][1] card id + log.insertAdjacentHTML("beforeend",node); // insert to log + if (!MouseOn) { // if mouse isn't over the div, scroll to bottom + log.scrollTop = log.scrollHeight; // scroll to bottom + } + drawID = ""; +} + +function LogPlayerChoose(type,dataID) { + var node = logTemplate.replace("{{ isSelf }}","right"); + var tmpName = ""; + if(now === "player") { // to distinguish if this is self log or enemy log + node = node.replace("{{ isSelf }}","right"); + tmpName = curName; + } else if (now === "enemy") { + node = node.replace("{{ isSelf }}",""); + tmpName = eneName; + } + node = node.replace("{{ content }}",messages[type].format([tmpName,cards[dataID]])); // msgJson['data'][0] player name, msgJson['data'][1] card id + log.insertAdjacentHTML("beforeend",node); // insert to log + if (!MouseOn) { // if mouse isn't over the div, scroll to bottom + log.scrollTop = log.scrollHeight; // scroll to bottom + } +} + +function LogPlayerPoisonDamaged() { + var node = logTemplate; + var tmpName = ""; + if(now === "player") { // to distinguish if this is self log or enemy log + node = node.replace("{{ isSelf }}","right"); + tmpName = curName; + } else if (now === "enemy") { + node = node.replace("{{ isSelf }}",""); + tmpName = eneName; + } + node = node.replace("{{ content }}",messages['poisonDamaged'].format([tmpName,poisonDamage])); // msgJson['data'][0] player name, msgJson['data'][1] card id + log.insertAdjacentHTML("beforeend",node); // insert to log + if (!MouseOn) { // if mouse isn't over the div, scroll to bottom + log.scrollTop = log.scrollHeight; // scroll to bottom + } + poisonDamage = ""; +} + +function rawLog(msg) { + console.log(JSON.stringify(msg)); + if (!MouseOn) { // if mouse isn't over the div, scroll to bottom + log.scrollTop = log.scrollHeight; // scroll to bottom + } +} + +function logTurn(playerName,playerTurn) { + var node = logDivider; + node = node.replace("{{ player }}",playerName); + node = node.replace("{{ turn }}",playerTurn); + log.insertAdjacentHTML("beforeend",node); // insert to log + if (!MouseOn) { // if mouse isn't over the div, scroll to bottom + log.scrollTop = log.scrollHeight; // scroll to bottom + } +} + +// game status updater +function gameUpdate(data) { + if (data.room) { + roomNum.innerHTML = data.room.padStart(5,'0'); + } else if (data.now) { + if (data.now === "player") { + turn.innerHTML = curName+" Turn "+data.player.turn; + logTurn(curName,data.player.turn); + if (drawID !== "") { + LogPlayerDraw(data); + } + statusInitialize(); + lock = false; // unlock the cards + gameStatus.addClass('primary'); + gameStatus.html('輪到你出牌'); + timerSetup(28); + } else if (data.now === "enemy") { + turn.innerHTML = eneName+" Turn "+data.enemy.turn; + logTurn(eneName,data.enemy.turn); + statusInitialize(); + gameStatus.html('等待對手出牌'); + } + if (poisonDamage !== "") { + LogPlayerPoisonDamaged(); + } + playerUpdate(data['player']); + enemyUpdate(data['enemy']); + modalClose(); + } +} + +function statusInitialize() { + gameStatus.removeClass('info negative warning pulsing primary inverted'); // initailize the status + timerInitialize(); +} + +// player status updater +function setPlayerName(name) { + var selfNameHeader = $('#myself > .profile > .name > .header'); + selfNameHeader.html(name); +} + +function setEnemyName(name) { + var eneNameHeader = $('#enemy > .profile > .name > .header'); + eneNameHeader.html(name); +} + +function playerUpdate(data) { + handCards = data['hand']; + setCard(data['hand']); + var selfHand = $('#selfHand'); // 手牌數 + var selfDeck = $('#selfDeck'); + var selfLifeBar = $('#myself > .profile > .life.progress > .bar'); + var selfLifeText = selfLifeBar.children(); + var selfStatus = $('#myself > .profile > .status'); + var barWidth = (parseInt(data['life'])/20)*100 // % + selfHand.html(data['hand'].length); + selfDeck.html(data['deck_left']); + selfLifeBar.css('width',barWidth+'%'); + selfLifeBar.attr('data-life',data['life']); + selfLifeText.html(data['life']); + if (parseInt(data['poison']) > 0){ + selfStatus.html('

中毒 lv.'+data['poison']+'

'); + selfLifeBar.addClass('poison'); + } else if (parseInt(data['poison']) == 0) { + if (selfLifeBar.hasClass('poison')) { + selfLifeBar.removeClass('poison'); + } + selfStatus.html('清新'); + } + + if (parseInt(data['life']) <= 0) { // dead + if (selfLifeBar.hasClass('poison')) { + selfLifeBar.removeClass('poison'); + } + selfLifeBar.addClass('negative'); + } +} + +function enemyUpdate(data) { + var eneHand = $('#eneHand'); // 手牌數 + var eneDeck = $('#eneDeck'); + var eneLifeBar = $('#enemy > .profile > .life.progress > .bar'); + var eneLifeText = eneLifeBar.children(); + var eneStatus = $('#enemy > .profile > .status'); + var barWidth = (parseInt(data['life'])/20)*100 // % + eneHand.html(data['hand']); + eneDeck.html(data['deck_left']); + eneLifeBar.css('width',barWidth+'%'); + eneLifeBar.attr('data-life',data['life']); + eneLifeText.html(data['life']); + if (parseInt(data['poison']) > 0){ + eneStatus.html('

中毒 lv.'+data['poison']+'

'); + eneLifeBar.addClass('poison'); + } else if (parseInt(data['poison']) == 0) { + if (eneLifeBar.hasClass('poison')) { + eneLifeBar.removeClass('poison'); + } + eneStatus.html('清新'); + } + + if (parseInt(data['life']) <= 0) { // dead + if (eneLifeBar.hasClass('poison')) { + eneLifeBar.removeClass('poison'); + } + eneLifeBar.addClass('negative'); + } + +} + +// card +function useCard(id) { + if (!lock) { + statusInitialize(); + send(id); + lock = true; + } +} + +function setCard(cardsArray) { + $(cardContainer).empty(); + var node = ""; + cardsArray.forEach((id) => { + var tmp = cardTemplate; + tmp = tmp.replace(/{{ id }}/g,id).replace("{{ name }}",cards[id]).replace("{{ description }}",cardsDescription[id]); + node += tmp; + }); + $(cardContainer).append(node); + setCardListener(); + resize(); // special case +} + +// modals +function chooseRob(data) { + var list = `
`; + data.forEach((id) => { + var tmp = listCardTemplate; + tmp = tmp.replace('disabled','').replace('{{ id }}',id).replace("{{ name }}",cards[id]).replace("{{ description }}",cardsDescription[id]); + list+=tmp; + }); + list+='
'; + dialog.children(".header").html('請問要搶哪張?'); + dialog.children(".content").html(list); + dialog.children(".actions").html(''); + setModalCardListListener(); + modalOpen(); +} + +function chooseTrade(data,tradeID=null) { + console.log(tradeChoose); + if (tradeID) { + var text = "

對手選擇了"+cards[tradeID]+"

"; + } else { + var text = "

選擇一張卡與對手交換

"; + } + var list = `
`; + data.forEach((id) => { + var tmp = listCardTemplate; + tmp = tmp.replace('disabled','').replace('{{ id }}',id).replace("{{ name }}",cards[id]).replace("{{ description }}",cardsDescription[id]); + list+=tmp; + }); + list+='
'; + dialog.children(".header").html('交易') + dialog.children(".content").html(text+list); + dialog.children(".actions").html(''); + setModalCardListListener(); + modalOpen(); + tradeChoose = ""; // reset value +} + +function choosePlan(data) { + var text = `

請從三張卡中選擇一張加入手牌

`; + var list = `
`; + data.forEach((id) => { + var tmp = listCardTemplate; + tmp = tmp.replace('disabled','').replace('{{ id }}',id).replace("{{ name }}",cards[id]).replace("{{ description }}",cardsDescription[id]); // not need to be disabled + list+=tmp; + }); + list+='
'; + dialog.children(".header").html('妙策'); + dialog.children(".content").html(text+list); + dialog.children(".actions").html(''); + setModalCardListListener(); + modalOpen(); +} + +function askGuard(data) { + var attackType = data['type']; + var attackName = {"attack": "攻擊","surprise": "奇襲","sweep": "掃射"}; + var damage = data['damage']; + var text = `對手使用了 `+attackName[attackType]+`,傷害為 `+damage; + var list = `
`; + handCards.forEach((id) => { + var tmp = listCardTemplate; + tmp = tmp.replace('{{ id }}',id).replace("{{ name }}",cards[id]).replace("{{ description }}",cardsDescription[id]); + list+=tmp; + }); + list+='
'; + dialog.children(".header").html('防禦'); + dialog.children(".content").html(text+list); + dialog.children(".actions").html(''); + setModalCardListListener(); + setModalSkipButtonListener(); + $('#modal .ts.list .item').each((i,e) => { + if (e.dataset.id == "2" || e.dataset.id == "8" || e.dataset.id == "14") { + $(e).removeClass('disabled'); + } + }); + modalOpen(); +} + +function askDefendRob() { + var list = `
`; + handCards.forEach((id) => { + var tmp = listCardTemplate; + tmp = tmp.replace('{{ id }}',id).replace("{{ name }}",cards[id]).replace("{{ description }}",cardsDescription[id]); + list+=tmp; + }); + list+='
'; + dialog.children(".header").html('防禦強奪'); + dialog.children(".content").html(list); + dialog.children(".actions").html(''); + setModalCardListListener(); + setModalSkipButtonListener(); + $('#modal .ts.list .item').each((i,e) => { + if (e.dataset.id == "8") { + $(e).removeClass('disabled'); + } + }); + modalOpen(); +} + +function playerWin() { + dialog.children(".header").html('你贏了!'); + dialog.children(".content").html('

'+eneName+'

'+curName+'

'); + dialog.children(".actions").html(''); + timerInitialize(); // also remember to stop the timer + modalOpen(); + resultListener(); +} + +function playerLose() { + dialog.children(".header").html('你輸爆了,SAD'); + dialog.children(".content").html('

'+eneName+'

'+curName+'

'); + dialog.children(".actions").html(''); + timerInitialize(); // also remember to stop the timer + modalOpen(); + resultListener(); +} + +function modalClose() { + if (dialogDisplay) { + ts('#modal').modal('hide'); + console.log('close'); + dialogDisplay = false; + } +} + +function modalOpen() { + if (!dialogDisplay) { + ts('#modal').modal('show'); + console.log('open'); + dialogDisplay = true; + } +} + +// countdown timer for each turn +function timing() { + if (time == 0) { + clearInterval(timer); // unset the timer + gameStatus.removeClass('warning pulsing'); + gameStatus.addClass('negative'); + gameStatus.text('時間到!'); + return null; + } + if (time <= 5) { + if(!gameStatus.hasClass('pulsing')) { + gameStatus.addClass('pulsing'); // pulsing animation + } + gameStatus.removeClass('info'); + gameStatus.addClass('warning'); + gameStatus.text('輪到你出牌 '+time); + } else if (time <= 10) { + if(!gameStatus.hasClass('pulsing')) { + gameStatus.addClass('pulsing'); // pulsing animation + } + gameStatus.text('輪到你出牌 '+time); + } else { + gameStatus.removeClass('negative pulsing'); + gameStatus.addClass('info'); + gameStatus.text('輪到你出牌'); + } + time--; +} + +function timerSetup(t) { + time = t; + timer = setInterval(timing,1000); +} + +function timerInitialize() { + clearInterval(timer); + gameStatus.addClass('inverted'); + gameStatus.html('等待中'); +} + +// resize +function resize() { + var h = cardContainer.offsetHeight; + grid.style.height='calc(100vh - ' + h + 'px)'; + column.css('height','calc(100vh - ' + h + 'px)'); +} + +resize(); +window.addEventListener("resize",resize); + +// game initailize +$(document).ready(() => { + var roomID = localStorage.getItem('room'); + var characterID = localStorage.getItem('character'); + if(!roomID || !characterID){ + roomID = "n"; + characterID = "1"; // default charactor + } + setPlayerName(characters[characterID]); + init(); + var retry = setInterval(() => { + if(socketReady) { // send the charactor id and room id until the connected + send(characterID); + send(roomID); + clearInterval(retry); + } + }, 300); // try every 0.3s +}); + +/* https://stackoverflow.com/questions/11700927/horizontal-scrolling-with-mouse-wheel-in-a-div */ +function scrollHorizontally(e) { + e = window.event || e; + var delta = Math.max(-1, Math.min(1, (e.wheelDelta || -e.detail))); + cardContainer.scrollLeft -= (delta*40); // Multiplied by 40 + e.preventDefault(); +} +cardContainer.addEventListener("mousewheel", scrollHorizontally, false); +cardContainer.addEventListener("DOMMouseScroll", scrollHorizontally, false); //Firefox \ No newline at end of file diff --git a/web/gameUI.css b/web/gameUI.css new file mode 100644 index 0000000..fbccbc2 --- /dev/null +++ b/web/gameUI.css @@ -0,0 +1,88 @@ +.cards.container > .ts.card { + width: 220px !important; + display: inline-flex !important; + white-space: normal; + margin-left: 8px; + margin-top: 5px; + margin-bottom: 0; +} +.cards.container > .ts.card:first-child { + margin-left: 0; +} +.cards.container { + overflow-x: scroll; + white-space: nowrap; + min-height: 140px; + width: 100%; + padding : 0 8px; + background-color: rgb(250,250,250); +} +body,html { + height: 100%; + width: 100%; + overflow: hidden; +} +label { + background-color: black; + color: white; + opacity: 0.6; + position: absolute; + top: 0; + left: 0; + padding: 5px 10px; + z-index: 10; +} +.grid,.column { + height: unset; + padding: 0 !important; + margin: 0 !important; +} +.speeches { + overflow-y: scroll; + height: 100%; + padding: 10px 5px; + box-sizing: border-box; + border-left: 1px solid rgba(0,0,0,0.2); + border-bottom: 1px solid rgba(0,0,0,0.2); + background-color: #efeef1; +} +#game,#myself,#enemy { + display: flex; + justify-content: center; + align-items: center; +} +#game > *,#enemy > *,#myself > * { + margin: auto; +} +.ts.progress .bar { + min-width: 20px; +} +.poison { + color: purple !important; +} +.poison.bar { + background-color: purple !important; +} +.bar { + transition: width .5s ease-in-out; +} +.modal .list{ + max-height: 60vh; + overflow-y: scroll; +} +.modal .content img { + width: 100%; +} +p.result.name { + position: absolute; + font-size:50px; + top: calc(50% - 25px); + margin: 0; + line-height: 50px; +} +p.result.enemy.name { + left: 1.5em; +} +p.result.player.name { + right: 1.5em; +} \ No newline at end of file diff --git a/web/index.html b/web/index.html new file mode 100644 index 0000000..adf6324 --- /dev/null +++ b/web/index.html @@ -0,0 +1,81 @@ + + + + + + 災厄之悲歌 + + + + + + + + +
+

災厄之悲歌

+ + + + + + + \ No newline at end of file diff --git a/web/lose.png b/web/lose.png new file mode 100644 index 0000000000000000000000000000000000000000..899afc1bf00a5c987756e5249abb7006c090ea9f GIT binary patch literal 62346 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 j|D?C)H { + btn.classList.remove('fadeInDown'); + btn.style.animationDelay = "0s"; + btn.classList.add('fadeOutUp'); + setTimeout(() => {displayCharacter();},800) +}); + +var characterMenu = document.querySelector('.ts.centered.menu'); +var characters = Array.from(characterMenu.children); +characterMenu.addEventListener('click', (e) => { + var id = e.target.dataset.id; + console.log("charactor:"+id); + if(id) { + characters.forEach(e => { + e.classList.remove('active'); + }); + characterID = id; + e.target.classList.add('active'); + } +}); + +var nextBtn = document.querySelector('#next'); +nextBtn.addEventListener('click',() => { displayRoom() }); + +var firstStep = document.querySelector('#firstStep'); +firstStep.addEventListener('click',() => { displayCharacter() }); + +var roomNum = document.querySelector('#roomNum'); +var roomBtn = document.querySelector('#roomBtn'); +roomBtn.addEventListener('click',() => { + if(roomNum.value != null && 0 <= parseInt(roomNum.value) && 99999 >= parseInt(roomNum.value)){ + console.log('room:'+roomNum.value) + roomID = roomNum.value; + setter(); + location.href = './cards.html'; + } else { + console.log("room number error"); + } +}); + +var randomBtn = document.querySelector('#random'); +randomBtn.addEventListener('click',() => { + roomID = "n" + setter(); + location.href = './cards.html'; +}); + +// animation +var steps = document.querySelector('.ts.steps'); +var step = document.querySelectorAll('.ts.steps .step'); +var container = document.querySelector('.ts.fluid.container'); +var title = document.querySelector('h1'); +var characterDialog = document.querySelector('#character'); +var roomDialog = document.querySelector('#room'); + +function displayCharacter() { + btn.style.display = "none"; + steps.style.display = "flex"; + container.classList.remove('title'); + container.classList.remove('fluid'); + container.classList.add('dialog'); + characterDialog.style.display = "block"; + roomDialog.style.display = "none"; + characterDialog.classList.add('animated'); + characterDialog.classList.add('fadeIn'); + title.style.marginTop = "1em"; + step[0].classList.add('active'); + step[0].classList.remove('completed'); + step[1].classList.remove('active'); +} + +function displayRoom() { + step[0].classList.remove('active'); + step[0].classList.add('completed'); + step[1].classList.add('active'); + characterDialog.style.display = "none"; + roomDialog.style.display = "block"; + roomDialog.classList.add('animated'); + roomDialog.classList.add('fadeIn'); +} \ No newline at end of file diff --git a/web/stringFormat.js b/web/stringFormat.js new file mode 100644 index 0000000..51398b8 --- /dev/null +++ b/web/stringFormat.js @@ -0,0 +1,4 @@ +/* https://stackoverflow.com/questions/610406/javascript-equivalent-to-printf-string-format */ +String.prototype.format = function(array) { + return array.reduce((p,c) => p.replace('{}',c), this); +}; \ No newline at end of file diff --git a/web/won.png b/web/won.png new file mode 100644 index 0000000000000000000000000000000000000000..19c49b602b0be0f852357071b2383d5b3a89a300 GIT binary patch literal 62445 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 Qn)=DpP;Oz4bCc%iAI}w#-v9sr literal 0 HcmV?d00001 diff --git a/web/ws.js b/web/ws.js new file mode 100644 index 0000000..0fe0d37 --- /dev/null +++ b/web/ws.js @@ -0,0 +1,44 @@ +var socket; // create object + +function init(host="wss://api.stoneapp.tech:8787"){ + socket = new WebSocket(host); + console.log("Initializing connection..."); + + socket.onopen = function() { + wsOnOpen(this.readyState); + } + + socket.onclose = function() { + wsOnClose(); + } + + socket.onmessage = function(msg) { + var dataJson; + try { + dataJson = JSON.parse(msg.data); + } catch(except) { + console.log(msg.data); + return null; + } + wsHandler(dataJson); + } + + socket.onerror = function(except) { + wsOnError(except); + } +} + +function quit() { + if(socket != null){ + socket.close(); + socket = null; + } +} + +function send(msg) { + try { + socket.send(msg); + } catch(ex) { + console.log(ex); + } +} \ No newline at end of file