Commit baffcd9b authored by Chunchi Che's avatar Chunchi Che Committed by GitHub

Merge pull request #9 from DarkNeos/dev

Dev
parents af753793 04484ceb
Subproject commit a54ddaec084aaf70a779f5a876d2e8554905625c Subproject commit 1ca09b1d90b55e2c155f83781c8b2a5d2ee30a04
...@@ -4,7 +4,6 @@ import JoinRoom from "./JoinRoom"; ...@@ -4,7 +4,6 @@ import JoinRoom from "./JoinRoom";
import WaitRoom from "./WaitRoom"; import WaitRoom from "./WaitRoom";
import ThreeJs from "./ThreeJs"; import ThreeJs from "./ThreeJs";
import { Routes, Route } from "react-router-dom"; import { Routes, Route } from "react-router-dom";
import Card from "./Card";
function App() { function App() {
return ( return (
...@@ -12,7 +11,6 @@ function App() { ...@@ -12,7 +11,6 @@ function App() {
<Route path="/" element={<JoinRoom />} /> <Route path="/" element={<JoinRoom />} />
<Route path="/:player/:passWd/:ip" element={<WaitRoom />} /> <Route path="/:player/:passWd/:ip" element={<WaitRoom />} />
<Route path="/three.js" element={<ThreeJs />} /> <Route path="/three.js" element={<ThreeJs />} />
<Route path="/card" element={<Card />} />
</Routes> </Routes>
); );
} }
......
import axios from "axios"; import axios from "axios";
import React, { useState, useEffect } from "react";
export default function Card() { export interface IDeck {
const [data, setData] = useState<IDeck>({});
useEffect(() => {
const fetchCards = async () => {
const res = await axios.get<IDeck>("http://localhost:3030/deck/hero.ydk");
setData(res.data);
};
fetchCards();
}, []);
const mainCards = (data.main || []).map((item, index) => (
<li key={index}>{item}</li>
));
const extraCards = (data.extra || []).map((item, index) => (
<li key={index}>{item}</li>
));
const sideCards = (data.side || []).map((item, index) => (
<li key={index}>{item}</li>
));
return (
<ul>
<li>
main
<ul>{mainCards}</ul>
</li>
<li>
extra
<ul>{extraCards}</ul>
</li>
<li>
side
<ul>{sideCards}</ul>
</li>
</ul>
);
}
interface IDeck {
main?: number[]; main?: number[];
extra?: number[]; extra?: number[];
side?: number[]; side?: number[];
} }
export async function fetchDeck(deck: string): Promise<IDeck> {
const res = await axios.get<IDeck>("http://localhost:3030/deck/" + deck);
return res.data;
}
import React, { useRef, useEffect, useState } from "react"; import React, { useRef, useEffect, useState } from "react";
import { useParams } from "react-router-dom"; import { useParams } from "react-router-dom";
import { ygopro } from "./api/idl/ocgcore"; import { ygopro } from "./api/idl/ocgcore";
import { fetchDeck, IDeck } from "./Card";
export default function WaitRoom() { export default function WaitRoom() {
const params = useParams<{ const params = useParams<{
...@@ -9,8 +10,9 @@ export default function WaitRoom() { ...@@ -9,8 +10,9 @@ export default function WaitRoom() {
ip?: string; ip?: string;
}>(); }>();
const [joined, setJoined] = useState<string>("false"); const [joined, setJoined] = useState<boolean>(false);
const [chat, setChat] = useState<string>(""); const [chat, setChat] = useState<string>("");
const [choseDeck, setChoseDeck] = useState<boolean>(false);
const ws = useRef<WebSocket | null>(null); const ws = useRef<WebSocket | null>(null);
...@@ -49,10 +51,8 @@ export default function WaitRoom() { ...@@ -49,10 +51,8 @@ export default function WaitRoom() {
switch (pb.msg) { switch (pb.msg) {
case "stoc_join_game": { case "stoc_join_game": {
const msg = pb.stoc_join_game; const msg = pb.stoc_join_game;
// todo
console.log("joinGame msg=" + msg); setJoined(true);
setJoined("true");
break; break;
} }
case "stoc_chat": { case "stoc_chat": {
...@@ -76,9 +76,31 @@ export default function WaitRoom() { ...@@ -76,9 +76,31 @@ export default function WaitRoom() {
}; };
}, [ws]); }, [ws]);
const handleChoseDeck = async () => {
if (ws.current) {
const deck = await fetchDeck("hero.ydk");
sendUpdateDeck(ws.current, deck);
setChoseDeck(true);
}
};
const handleChoseReady = () => {
if (ws.current) {
sendHsReady(ws.current);
}
};
return ( return (
<div> <div>
<p>joined: {joined}</p> <p>joined: {joined ? "true" : "false"}</p>
<button disabled={!joined} onClick={handleChoseDeck}>
choose hero.ydk
</button>
<button disabled={!choseDeck} onClick={handleChoseReady}>
ready
</button>
<p>chat: {chat}</p> <p>chat: {chat}</p>
</div> </div>
); );
...@@ -105,3 +127,23 @@ function sendJoinGame(ws: WebSocket, version: number, passWd: string) { ...@@ -105,3 +127,23 @@ function sendJoinGame(ws: WebSocket, version: number, passWd: string) {
ws.send(joinGame.serialize()); ws.send(joinGame.serialize());
} }
function sendUpdateDeck(ws: WebSocket, deck: IDeck) {
const updateDeck = new ygopro.YgoCtosMsg({
ctos_update_deck: new ygopro.CtosUpdateDeck({
main: deck.main,
extra: deck.extra,
side: deck.side
})
});
ws.send(updateDeck.serialize());
}
function sendHsReady(ws: WebSocket) {
const hasReady = new ygopro.YgoCtosMsg({
ctos_hs_ready: new ygopro.CtosHsReady({})
});
ws.send(hasReady.serialize());
}
...@@ -6,19 +6,27 @@ ...@@ -6,19 +6,27 @@
import * as pb_1 from "google-protobuf"; import * as pb_1 from "google-protobuf";
export namespace ygopro { export namespace ygopro {
export class YgoCtosMsg extends pb_1.Message { export class YgoCtosMsg extends pb_1.Message {
#one_of_decls: number[][] = [[1, 2, 3]]; #one_of_decls: number[][] = [[1, 2, 3, 4]];
constructor(data?: any[] | ({} & (({ constructor(data?: any[] | ({} & (({
ctos_player_info?: CtosPlayerInfo; ctos_player_info?: CtosPlayerInfo;
ctos_join_game?: never; ctos_join_game?: never;
ctos_update_deck?: never; ctos_update_deck?: never;
ctos_hs_ready?: never;
} | { } | {
ctos_player_info?: never; ctos_player_info?: never;
ctos_join_game?: CtosJoinGame; ctos_join_game?: CtosJoinGame;
ctos_update_deck?: never; ctos_update_deck?: never;
ctos_hs_ready?: never;
} | { } | {
ctos_player_info?: never; ctos_player_info?: never;
ctos_join_game?: never; ctos_join_game?: never;
ctos_update_deck?: CtosUpdateDeck; ctos_update_deck?: CtosUpdateDeck;
ctos_hs_ready?: never;
} | {
ctos_player_info?: never;
ctos_join_game?: never;
ctos_update_deck?: never;
ctos_hs_ready?: CtosHsReady;
})))) { })))) {
super(); super();
pb_1.Message.initialize(this, Array.isArray(data) ? data : [], 0, -1, [], this.#one_of_decls); pb_1.Message.initialize(this, Array.isArray(data) ? data : [], 0, -1, [], this.#one_of_decls);
...@@ -32,6 +40,9 @@ export namespace ygopro { ...@@ -32,6 +40,9 @@ export namespace ygopro {
if ("ctos_update_deck" in data && data.ctos_update_deck != undefined) { if ("ctos_update_deck" in data && data.ctos_update_deck != undefined) {
this.ctos_update_deck = data.ctos_update_deck; this.ctos_update_deck = data.ctos_update_deck;
} }
if ("ctos_hs_ready" in data && data.ctos_hs_ready != undefined) {
this.ctos_hs_ready = data.ctos_hs_ready;
}
} }
} }
get ctos_player_info() { get ctos_player_info() {
...@@ -61,21 +72,32 @@ export namespace ygopro { ...@@ -61,21 +72,32 @@ export namespace ygopro {
get has_ctos_update_deck() { get has_ctos_update_deck() {
return pb_1.Message.getField(this, 3) != null; return pb_1.Message.getField(this, 3) != null;
} }
get ctos_hs_ready() {
return pb_1.Message.getWrapperField(this, CtosHsReady, 4) as CtosHsReady;
}
set ctos_hs_ready(value: CtosHsReady) {
pb_1.Message.setOneofWrapperField(this, 4, this.#one_of_decls[0], value);
}
get has_ctos_hs_ready() {
return pb_1.Message.getField(this, 4) != null;
}
get msg() { get msg() {
const cases: { const cases: {
[index: number]: "none" | "ctos_player_info" | "ctos_join_game" | "ctos_update_deck"; [index: number]: "none" | "ctos_player_info" | "ctos_join_game" | "ctos_update_deck" | "ctos_hs_ready";
} = { } = {
0: "none", 0: "none",
1: "ctos_player_info", 1: "ctos_player_info",
2: "ctos_join_game", 2: "ctos_join_game",
3: "ctos_update_deck" 3: "ctos_update_deck",
4: "ctos_hs_ready"
}; };
return cases[pb_1.Message.computeOneofCase(this, [1, 2, 3])]; return cases[pb_1.Message.computeOneofCase(this, [1, 2, 3, 4])];
} }
static fromObject(data: { static fromObject(data: {
ctos_player_info?: ReturnType<typeof CtosPlayerInfo.prototype.toObject>; ctos_player_info?: ReturnType<typeof CtosPlayerInfo.prototype.toObject>;
ctos_join_game?: ReturnType<typeof CtosJoinGame.prototype.toObject>; ctos_join_game?: ReturnType<typeof CtosJoinGame.prototype.toObject>;
ctos_update_deck?: ReturnType<typeof CtosUpdateDeck.prototype.toObject>; ctos_update_deck?: ReturnType<typeof CtosUpdateDeck.prototype.toObject>;
ctos_hs_ready?: ReturnType<typeof CtosHsReady.prototype.toObject>;
}): YgoCtosMsg { }): YgoCtosMsg {
const message = new YgoCtosMsg({}); const message = new YgoCtosMsg({});
if (data.ctos_player_info != null) { if (data.ctos_player_info != null) {
...@@ -87,6 +109,9 @@ export namespace ygopro { ...@@ -87,6 +109,9 @@ export namespace ygopro {
if (data.ctos_update_deck != null) { if (data.ctos_update_deck != null) {
message.ctos_update_deck = CtosUpdateDeck.fromObject(data.ctos_update_deck); message.ctos_update_deck = CtosUpdateDeck.fromObject(data.ctos_update_deck);
} }
if (data.ctos_hs_ready != null) {
message.ctos_hs_ready = CtosHsReady.fromObject(data.ctos_hs_ready);
}
return message; return message;
} }
toObject() { toObject() {
...@@ -94,6 +119,7 @@ export namespace ygopro { ...@@ -94,6 +119,7 @@ export namespace ygopro {
ctos_player_info?: ReturnType<typeof CtosPlayerInfo.prototype.toObject>; ctos_player_info?: ReturnType<typeof CtosPlayerInfo.prototype.toObject>;
ctos_join_game?: ReturnType<typeof CtosJoinGame.prototype.toObject>; ctos_join_game?: ReturnType<typeof CtosJoinGame.prototype.toObject>;
ctos_update_deck?: ReturnType<typeof CtosUpdateDeck.prototype.toObject>; ctos_update_deck?: ReturnType<typeof CtosUpdateDeck.prototype.toObject>;
ctos_hs_ready?: ReturnType<typeof CtosHsReady.prototype.toObject>;
} = {}; } = {};
if (this.ctos_player_info != null) { if (this.ctos_player_info != null) {
data.ctos_player_info = this.ctos_player_info.toObject(); data.ctos_player_info = this.ctos_player_info.toObject();
...@@ -104,6 +130,9 @@ export namespace ygopro { ...@@ -104,6 +130,9 @@ export namespace ygopro {
if (this.ctos_update_deck != null) { if (this.ctos_update_deck != null) {
data.ctos_update_deck = this.ctos_update_deck.toObject(); data.ctos_update_deck = this.ctos_update_deck.toObject();
} }
if (this.ctos_hs_ready != null) {
data.ctos_hs_ready = this.ctos_hs_ready.toObject();
}
return data; return data;
} }
serialize(): Uint8Array; serialize(): Uint8Array;
...@@ -116,6 +145,8 @@ export namespace ygopro { ...@@ -116,6 +145,8 @@ export namespace ygopro {
writer.writeMessage(2, this.ctos_join_game, () => this.ctos_join_game.serialize(writer)); writer.writeMessage(2, this.ctos_join_game, () => this.ctos_join_game.serialize(writer));
if (this.has_ctos_update_deck) if (this.has_ctos_update_deck)
writer.writeMessage(3, this.ctos_update_deck, () => this.ctos_update_deck.serialize(writer)); writer.writeMessage(3, this.ctos_update_deck, () => this.ctos_update_deck.serialize(writer));
if (this.has_ctos_hs_ready)
writer.writeMessage(4, this.ctos_hs_ready, () => this.ctos_hs_ready.serialize(writer));
if (!w) if (!w)
return writer.getResultBuffer(); return writer.getResultBuffer();
} }
...@@ -134,6 +165,9 @@ export namespace ygopro { ...@@ -134,6 +165,9 @@ export namespace ygopro {
case 3: case 3:
reader.readMessage(message.ctos_update_deck, () => message.ctos_update_deck = CtosUpdateDeck.deserialize(reader)); reader.readMessage(message.ctos_update_deck, () => message.ctos_update_deck = CtosUpdateDeck.deserialize(reader));
break; break;
case 4:
reader.readMessage(message.ctos_hs_ready, () => message.ctos_hs_ready = CtosHsReady.deserialize(reader));
break;
default: reader.skipField(); default: reader.skipField();
} }
} }
...@@ -614,6 +648,46 @@ export namespace ygopro { ...@@ -614,6 +648,46 @@ export namespace ygopro {
return CtosUpdateDeck.deserialize(bytes); return CtosUpdateDeck.deserialize(bytes);
} }
} }
export class CtosHsReady extends pb_1.Message {
#one_of_decls: number[][] = [];
constructor(data?: any[] | {}) {
super();
pb_1.Message.initialize(this, Array.isArray(data) ? data : [], 0, -1, [], this.#one_of_decls);
if (!Array.isArray(data) && typeof data == "object") { }
}
static fromObject(data: {}): CtosHsReady {
const message = new CtosHsReady({});
return message;
}
toObject() {
const data: {} = {};
return data;
}
serialize(): Uint8Array;
serialize(w: pb_1.BinaryWriter): void;
serialize(w?: pb_1.BinaryWriter): Uint8Array | void {
const writer = w || new pb_1.BinaryWriter();
if (!w)
return writer.getResultBuffer();
}
static deserialize(bytes: Uint8Array | pb_1.BinaryReader): CtosHsReady {
const reader = bytes instanceof pb_1.BinaryReader ? bytes : new pb_1.BinaryReader(bytes), message = new CtosHsReady();
while (reader.nextField()) {
if (reader.isEndGroup())
break;
switch (reader.getFieldNumber()) {
default: reader.skipField();
}
}
return message;
}
serializeBinary(): Uint8Array {
return this.serialize();
}
static deserializeBinary(bytes: Uint8Array): CtosHsReady {
return CtosHsReady.deserialize(bytes);
}
}
export class StocJoinGame extends pb_1.Message { export class StocJoinGame extends pb_1.Message {
#one_of_decls: number[][] = []; #one_of_decls: number[][] = [];
constructor(data?: any[] | { constructor(data?: any[] | {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment