Implement retire.

This commit is contained in:
yukirij 2024-08-19 01:39:03 -07:00
parent aca4e7acb1
commit 91523a80a1
7 changed files with 70 additions and 43 deletions

View File

@ -279,8 +279,8 @@ pub async fn thread_system(mut app:App, bus:Bus<protocol::QRPacket>)
// - IsLive must have both users connected to the session. // - IsLive must have both users connected to the session.
let mut valid = match request.game_state { let mut valid = match request.game_state {
1 => session.p_dawn.user.is_none() || session.p_dusk.user.is_none(), 1 => !session.game.complete && (session.p_dawn.user.is_none() || session.p_dusk.user.is_none()),
2 => session.p_dawn.user.is_some() && session.p_dusk.user.is_some(), 2 => !session.game.complete && (session.p_dawn.user.is_some() && session.p_dusk.user.is_some()),
3 => session.game.complete, 3 => session.game.complete,
_ => true, _ => true,
}; };
@ -495,18 +495,23 @@ pub async fn thread_system(mut app:App, bus:Bus<protocol::QRPacket>)
}; };
if let Some(session) = app.sessions.get_mut(&request.token) { if let Some(session) = app.sessions.get_mut(&request.token) {
if !session.game.complete { if !session.game.complete && (session.p_dawn.user.is_some() && session.p_dusk.user.is_some()) {
session.game.process(&play).ok(); if (user_id == session.p_dawn.user && session.game.turn & 1 == 0)
|| (user_id == session.p_dusk.user && session.game.turn & 1 == 1) {
for (cid, _) in session.get_connections() {
packets.push(QRPacket::new( session.game.process(&play).ok();
cid, app.filesystem.session_history_push(session.id, play).ok();
QRPacketData::QGamePlay(PacketGamePlay {
status: STATUS_OK, for (cid, _) in session.get_connections() {
turn: session.game.turn, packets.push(QRPacket::new(
play, cid,
}), QRPacketData::QGamePlay(PacketGamePlay {
)); status: STATUS_OK,
turn: session.game.turn,
play,
}),
));
}
} }
} }
} }

View File

@ -131,6 +131,16 @@ pub async fn handle_ws(ws:WebSocketStream<TokioIo<Upgraded>>, args:HttpServiceAr
).ok(); ).ok();
} }
CODE_SESSION_RETIRE => match PacketSessionRetire::decode(&data, &mut index) {
Ok(packet) => {
args.bus.send(
bus_ds,
QRPacket::new(conn_id, QRPacketData::QSessionRetire(packet))
).ok();
}
Err(_) => { println!("error: packet decode failed."); }
}
CODE_GAME_STATE => match PacketGameState::decode(&data, &mut index) { CODE_GAME_STATE => match PacketGameState::decode(&data, &mut index) {
Ok(packet) => { Ok(packet) => {
args.bus.send( args.bus.send(

View File

@ -47,8 +47,8 @@ impl Packet for PacketGamePlay {
{ {
let mut data = 0; let mut data = 0;
data |= self.play.source as u16; data |= self.play.source as u16;
data |= (self.play.from as u16) << 1; data |= (self.play.from as u16) << 4;
data |= (self.play.to as u16) << 7; data |= (self.play.to as u16) << 10;
[ [
pack_u16(self.status), pack_u16(self.status),
pack_u16(self.turn), pack_u16(self.turn),

View File

@ -211,7 +211,7 @@ impl FileSystem {
pub fn session_history_push(&mut self, id:u32, history:Play) -> Result<(),()> pub fn session_history_push(&mut self, id:u32, history:Play) -> Result<(),()>
{ {
let play_data :u16 = (history.source as u16) | ((history.from as u16) << 1) | ((history.to as u16) << 7); let play_data :u16 = (history.source as u16) | ((history.from as u16) << 4) | ((history.to as u16) << 10);
let bucket_index = id & !HANDLE_BUCKET_MASK; let bucket_index = id & !HANDLE_BUCKET_MASK;
let dir_index = id & HANDLE_BUCKET_MASK; let dir_index = id & HANDLE_BUCKET_MASK;
@ -266,9 +266,9 @@ impl FileSystem {
file.read_exact(&mut buffer).map_err(|_| ())?; file.read_exact(&mut buffer).map_err(|_| ())?;
let data = unpack_u16(&buffer, &mut 0); let data = unpack_u16(&buffer, &mut 0);
result.push(Play { result.push(Play {
source:(data & 1) as u8, source:(data & 0xF) as u8,
from:((data >> 1) & 0x3F) as u8, from:((data >> 4) & 0x3F) as u8,
to:((data >> 7) & 0x3F) as u8, to:((data >> 10) & 0x3F) as u8,
}); });
} }

View File

@ -754,13 +754,13 @@ const INTERFACE = {
}, },
uninit() { uninit() {
if(INTERFACE_DATA.online) {
MESSAGE_COMPOSE([
PACK.u16(OpCode.SessionLeave),
]);
}
if(INTERFACE_DATA !== null) { if(INTERFACE_DATA !== null) {
if(INTERFACE_DATA.online) {
MESSAGE_COMPOSE([
PACK.u16(OpCode.SessionLeave),
]);
}
MAIN.removeChild(INTERFACE_DATA.canvas); MAIN.removeChild(INTERFACE_DATA.canvas);
INTERFACE_DATA = null; INTERFACE_DATA = null;
} }
@ -782,6 +782,8 @@ const INTERFACE = {
GAME_DATA.turn = data.turn; GAME_DATA.turn = data.turn;
INTERFACE_DATA.play = data.play; INTERFACE_DATA.play = data.play;
console.log(data.play.source);
if(INTERFACE_DATA.play.source == 2) { if(INTERFACE_DATA.play.source == 2) {
GAME_DATA.state.code = 2; GAME_DATA.state.code = 2;
} }
@ -833,7 +835,7 @@ const INTERFACE = {
retire() { retire() {
if(INTERFACE_DATA.online) { if(INTERFACE_DATA.online) {
MESSAGE_COMPOSE([ MESSAGE_COMPOSE([
OpCode.SessionRetire, PACK.u16(OpCode.SessionRetire),
INTERFACE_DATA.token, INTERFACE_DATA.token,
]); ]);
} }

View File

@ -434,35 +434,45 @@ const SCENES = {
UI.mainmenu(); UI.mainmenu();
let left_buttons = [ ];
UI.mainnav( UI.mainnav(
[ ], left_buttons,
[ [
UI.div([UI.text("0 - 0 of 0")]), UI.div([UI.text("0 - 0 of 0")]),
UI.button("◀", null), UI.button("◀", null),
UI.button("▶", null), UI.button("▶", null),
UI.button("Refresh", null),
] ]
); );
let table = document.createElement("table"); let table = document.createElement("table");
table.setAttribute("id", "content"); table.setAttribute("id", "content");
table.setAttribute("class", "list");
MAIN.appendChild(table); MAIN.appendChild(table);
MAIN.setAttribute("class", "list");
SCENE.refresh(); SCENE.refresh();
return true; return true;
}, },
refresh() { refresh() {
MESSAGE_SESSION_LIST(0, 3, false, false);
}, },
message(code, data) { message(code, data) {
if(code == OpCode.SessionList) { switch(code) {
let table = document.getElementById("content"); case OpCode.SessionList: {
UI.clear(table); let table = document.getElementById("content");
UI.clear(table);
if(data !== null) { if(data !== null) {
table.appendChild(UI.session_table(data.records)); table.appendChild(UI.session_table(data.records));
} }
} break;
case OpCode.SessionCreate:
case OpCode.SessionJoin: {
if(data.status == Status.Ok) {
LOAD(SCENES.Game, data);
}
} break;
} }
}, },
disconnect() { disconnect() {

View File

@ -230,9 +230,9 @@ function MESSAGE(event) {
// Last Play // Last Play
result = UNPACK.u16(bytes, index); result = UNPACK.u16(bytes, index);
index = result.index; index = result.index;
data.play.source = result.data & 1; data.play.source = result.data & 0xF;
data.play.from = (result.data >> 1) & 0x3F; data.play.from = (result.data >> 4) & 0x3F;
data.play.to = (result.data >> 7) & 0x3F; data.play.to = (result.data >> 10) & 0x3F;
// Turn // Turn
result = UNPACK.u16(bytes, index); result = UNPACK.u16(bytes, index);
@ -314,9 +314,9 @@ function MESSAGE(event) {
// Play description // Play description
result = UNPACK.u16(bytes, index); result = UNPACK.u16(bytes, index);
index = result.index; index = result.index;
data.play.source = result.data & 1; data.play.source = result.data & 0xF;
data.play.from = (result.data >> 1) & 0x3F; data.play.from = (result.data >> 4) & 0x3F;
data.play.to = (result.data >> 7) & 0x3F; data.play.to = (result.data >> 10) & 0x3F;
} break; } break;
default: default: