Commit 19653d6a authored by Chunchi Che's avatar Chunchi Che

Merge branch 'feat/replay' into 'main'

Feat/replay

See merge request mycard/Neos!244
parents f15b790f d31f77a7
Pipeline #22627 passed with stages
in 14 minutes and 11 seconds
Subproject commit 2b7892f461be231b95ccc3c13512359177f3bb98 Subproject commit 30f4ea7acd79b9cb18a358548520ca939e22dc5f
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
"cardImgUrl":"https://cdn02.moecube.com:444/images/ygopro-images-zh-CN", "cardImgUrl":"https://cdn02.moecube.com:444/images/ygopro-images-zh-CN",
"cardsDbUrl":"https://cdn02.moecube.com:444/ygopro-database/zh-CN/cards.cdb", "cardsDbUrl":"https://cdn02.moecube.com:444/ygopro-database/zh-CN/cards.cdb",
"stringsUrl":"https://cdn02.moecube.com:444/ygopro-database/zh-CN/strings.conf", "stringsUrl":"https://cdn02.moecube.com:444/ygopro-database/zh-CN/strings.conf",
"replayUrl":"replay.neos.moe",
"chainALL":false, "chainALL":false,
"streamInterval":20, "streamInterval":20,
"startDelay":1000, "startDelay":1000,
...@@ -68,6 +69,9 @@ ...@@ -68,6 +69,9 @@
164, 164,
165, 165,
170, 170,
180 180,
230,
231,
236
] ]
} }
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
"cardImgUrl":"https://cdn02.moecube.com:444/images/ygopro-images-zh-CN", "cardImgUrl":"https://cdn02.moecube.com:444/images/ygopro-images-zh-CN",
"cardsDbUrl":"https://cdn02.moecube.com:444/ygopro-database/zh-CN/cards.cdb", "cardsDbUrl":"https://cdn02.moecube.com:444/ygopro-database/zh-CN/cards.cdb",
"stringsUrl":"https://cdn02.moecube.com:444/ygopro-database/zh-CN/strings.conf", "stringsUrl":"https://cdn02.moecube.com:444/ygopro-database/zh-CN/strings.conf",
"replayUrl":"replay.neos.moe",
"chainALL":false, "chainALL":false,
"streamInterval":20, "streamInterval":20,
"startDelay":1000, "startDelay":1000,
...@@ -68,6 +69,9 @@ ...@@ -68,6 +69,9 @@
164, 164,
165, 165,
170, 170,
180 180,
230,
231,
236
] ]
} }
/** /**
* Generated by the protoc-gen-ts. DO NOT EDIT! * Generated by the protoc-gen-ts. DO NOT EDIT!
* compiler version: 3.21.9 * compiler version: 3.21.5
* source: idl/ocgcore.proto * source: idl/ocgcore.proto
* git: https://github.com/thesayyn/protoc-gen-ts */ * git: https://github.com/thesayyn/protoc-gen-ts */
import * as pb_1 from "google-protobuf"; import * as pb_1 from "google-protobuf";
...@@ -4511,7 +4511,7 @@ export namespace ygopro { ...@@ -4511,7 +4511,7 @@ export namespace ygopro {
} }
} }
export class StocGameMessage extends pb_1.Message { export class StocGameMessage extends pb_1.Message {
#one_of_decls: number[][] = [[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53]]; #one_of_decls: number[][] = [[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54]];
constructor(data?: any[] | ({} & (({ constructor(data?: any[] | ({} & (({
start?: StocGameMessage.MsgStart; start?: StocGameMessage.MsgStart;
draw?: never; draw?: never;
...@@ -4566,6 +4566,7 @@ export namespace ygopro { ...@@ -4566,6 +4566,7 @@ export namespace ygopro {
rock_paper_scissors?: never; rock_paper_scissors?: never;
hand_res?: never; hand_res?: never;
swap_grave_deck?: never; swap_grave_deck?: never;
sibyl_name?: never;
} | { } | {
start?: never; start?: never;
draw?: StocGameMessage.MsgDraw; draw?: StocGameMessage.MsgDraw;
...@@ -4620,6 +4621,7 @@ export namespace ygopro { ...@@ -4620,6 +4621,7 @@ export namespace ygopro {
rock_paper_scissors?: never; rock_paper_scissors?: never;
hand_res?: never; hand_res?: never;
swap_grave_deck?: never; swap_grave_deck?: never;
sibyl_name?: never;
} | { } | {
start?: never; start?: never;
draw?: never; draw?: never;
...@@ -4674,6 +4676,7 @@ export namespace ygopro { ...@@ -4674,6 +4676,7 @@ export namespace ygopro {
rock_paper_scissors?: never; rock_paper_scissors?: never;
hand_res?: never; hand_res?: never;
swap_grave_deck?: never; swap_grave_deck?: never;
sibyl_name?: never;
} | { } | {
start?: never; start?: never;
draw?: never; draw?: never;
...@@ -4728,6 +4731,7 @@ export namespace ygopro { ...@@ -4728,6 +4731,7 @@ export namespace ygopro {
rock_paper_scissors?: never; rock_paper_scissors?: never;
hand_res?: never; hand_res?: never;
swap_grave_deck?: never; swap_grave_deck?: never;
sibyl_name?: never;
} | { } | {
start?: never; start?: never;
draw?: never; draw?: never;
...@@ -4782,6 +4786,7 @@ export namespace ygopro { ...@@ -4782,6 +4786,7 @@ export namespace ygopro {
rock_paper_scissors?: never; rock_paper_scissors?: never;
hand_res?: never; hand_res?: never;
swap_grave_deck?: never; swap_grave_deck?: never;
sibyl_name?: never;
} | { } | {
start?: never; start?: never;
draw?: never; draw?: never;
...@@ -4836,6 +4841,7 @@ export namespace ygopro { ...@@ -4836,6 +4841,7 @@ export namespace ygopro {
rock_paper_scissors?: never; rock_paper_scissors?: never;
hand_res?: never; hand_res?: never;
swap_grave_deck?: never; swap_grave_deck?: never;
sibyl_name?: never;
} | { } | {
start?: never; start?: never;
draw?: never; draw?: never;
...@@ -4890,6 +4896,7 @@ export namespace ygopro { ...@@ -4890,6 +4896,7 @@ export namespace ygopro {
rock_paper_scissors?: never; rock_paper_scissors?: never;
hand_res?: never; hand_res?: never;
swap_grave_deck?: never; swap_grave_deck?: never;
sibyl_name?: never;
} | { } | {
start?: never; start?: never;
draw?: never; draw?: never;
...@@ -4944,6 +4951,7 @@ export namespace ygopro { ...@@ -4944,6 +4951,7 @@ export namespace ygopro {
rock_paper_scissors?: never; rock_paper_scissors?: never;
hand_res?: never; hand_res?: never;
swap_grave_deck?: never; swap_grave_deck?: never;
sibyl_name?: never;
} | { } | {
start?: never; start?: never;
draw?: never; draw?: never;
...@@ -4998,6 +5006,7 @@ export namespace ygopro { ...@@ -4998,6 +5006,7 @@ export namespace ygopro {
rock_paper_scissors?: never; rock_paper_scissors?: never;
hand_res?: never; hand_res?: never;
swap_grave_deck?: never; swap_grave_deck?: never;
sibyl_name?: never;
} | { } | {
start?: never; start?: never;
draw?: never; draw?: never;
...@@ -5052,6 +5061,7 @@ export namespace ygopro { ...@@ -5052,6 +5061,7 @@ export namespace ygopro {
rock_paper_scissors?: never; rock_paper_scissors?: never;
hand_res?: never; hand_res?: never;
swap_grave_deck?: never; swap_grave_deck?: never;
sibyl_name?: never;
} | { } | {
start?: never; start?: never;
draw?: never; draw?: never;
...@@ -5106,6 +5116,7 @@ export namespace ygopro { ...@@ -5106,6 +5116,7 @@ export namespace ygopro {
rock_paper_scissors?: never; rock_paper_scissors?: never;
hand_res?: never; hand_res?: never;
swap_grave_deck?: never; swap_grave_deck?: never;
sibyl_name?: never;
} | { } | {
start?: never; start?: never;
draw?: never; draw?: never;
...@@ -5160,6 +5171,7 @@ export namespace ygopro { ...@@ -5160,6 +5171,7 @@ export namespace ygopro {
rock_paper_scissors?: never; rock_paper_scissors?: never;
hand_res?: never; hand_res?: never;
swap_grave_deck?: never; swap_grave_deck?: never;
sibyl_name?: never;
} | { } | {
start?: never; start?: never;
draw?: never; draw?: never;
...@@ -5214,6 +5226,7 @@ export namespace ygopro { ...@@ -5214,6 +5226,7 @@ export namespace ygopro {
rock_paper_scissors?: never; rock_paper_scissors?: never;
hand_res?: never; hand_res?: never;
swap_grave_deck?: never; swap_grave_deck?: never;
sibyl_name?: never;
} | { } | {
start?: never; start?: never;
draw?: never; draw?: never;
...@@ -5268,6 +5281,7 @@ export namespace ygopro { ...@@ -5268,6 +5281,7 @@ export namespace ygopro {
rock_paper_scissors?: never; rock_paper_scissors?: never;
hand_res?: never; hand_res?: never;
swap_grave_deck?: never; swap_grave_deck?: never;
sibyl_name?: never;
} | { } | {
start?: never; start?: never;
draw?: never; draw?: never;
...@@ -5322,6 +5336,7 @@ export namespace ygopro { ...@@ -5322,6 +5336,7 @@ export namespace ygopro {
rock_paper_scissors?: never; rock_paper_scissors?: never;
hand_res?: never; hand_res?: never;
swap_grave_deck?: never; swap_grave_deck?: never;
sibyl_name?: never;
} | { } | {
start?: never; start?: never;
draw?: never; draw?: never;
...@@ -5376,6 +5391,7 @@ export namespace ygopro { ...@@ -5376,6 +5391,7 @@ export namespace ygopro {
rock_paper_scissors?: never; rock_paper_scissors?: never;
hand_res?: never; hand_res?: never;
swap_grave_deck?: never; swap_grave_deck?: never;
sibyl_name?: never;
} | { } | {
start?: never; start?: never;
draw?: never; draw?: never;
...@@ -5430,6 +5446,7 @@ export namespace ygopro { ...@@ -5430,6 +5446,7 @@ export namespace ygopro {
rock_paper_scissors?: never; rock_paper_scissors?: never;
hand_res?: never; hand_res?: never;
swap_grave_deck?: never; swap_grave_deck?: never;
sibyl_name?: never;
} | { } | {
start?: never; start?: never;
draw?: never; draw?: never;
...@@ -5484,6 +5501,7 @@ export namespace ygopro { ...@@ -5484,6 +5501,7 @@ export namespace ygopro {
rock_paper_scissors?: never; rock_paper_scissors?: never;
hand_res?: never; hand_res?: never;
swap_grave_deck?: never; swap_grave_deck?: never;
sibyl_name?: never;
} | { } | {
start?: never; start?: never;
draw?: never; draw?: never;
...@@ -5538,6 +5556,7 @@ export namespace ygopro { ...@@ -5538,6 +5556,7 @@ export namespace ygopro {
rock_paper_scissors?: never; rock_paper_scissors?: never;
hand_res?: never; hand_res?: never;
swap_grave_deck?: never; swap_grave_deck?: never;
sibyl_name?: never;
} | { } | {
start?: never; start?: never;
draw?: never; draw?: never;
...@@ -5592,6 +5611,7 @@ export namespace ygopro { ...@@ -5592,6 +5611,7 @@ export namespace ygopro {
rock_paper_scissors?: never; rock_paper_scissors?: never;
hand_res?: never; hand_res?: never;
swap_grave_deck?: never; swap_grave_deck?: never;
sibyl_name?: never;
} | { } | {
start?: never; start?: never;
draw?: never; draw?: never;
...@@ -5646,6 +5666,7 @@ export namespace ygopro { ...@@ -5646,6 +5666,7 @@ export namespace ygopro {
rock_paper_scissors?: never; rock_paper_scissors?: never;
hand_res?: never; hand_res?: never;
swap_grave_deck?: never; swap_grave_deck?: never;
sibyl_name?: never;
} | { } | {
start?: never; start?: never;
draw?: never; draw?: never;
...@@ -5700,6 +5721,7 @@ export namespace ygopro { ...@@ -5700,6 +5721,7 @@ export namespace ygopro {
rock_paper_scissors?: never; rock_paper_scissors?: never;
hand_res?: never; hand_res?: never;
swap_grave_deck?: never; swap_grave_deck?: never;
sibyl_name?: never;
} | { } | {
start?: never; start?: never;
draw?: never; draw?: never;
...@@ -5754,6 +5776,7 @@ export namespace ygopro { ...@@ -5754,6 +5776,7 @@ export namespace ygopro {
rock_paper_scissors?: never; rock_paper_scissors?: never;
hand_res?: never; hand_res?: never;
swap_grave_deck?: never; swap_grave_deck?: never;
sibyl_name?: never;
} | { } | {
start?: never; start?: never;
draw?: never; draw?: never;
...@@ -5808,6 +5831,7 @@ export namespace ygopro { ...@@ -5808,6 +5831,7 @@ export namespace ygopro {
rock_paper_scissors?: never; rock_paper_scissors?: never;
hand_res?: never; hand_res?: never;
swap_grave_deck?: never; swap_grave_deck?: never;
sibyl_name?: never;
} | { } | {
start?: never; start?: never;
draw?: never; draw?: never;
...@@ -5862,6 +5886,7 @@ export namespace ygopro { ...@@ -5862,6 +5886,7 @@ export namespace ygopro {
rock_paper_scissors?: never; rock_paper_scissors?: never;
hand_res?: never; hand_res?: never;
swap_grave_deck?: never; swap_grave_deck?: never;
sibyl_name?: never;
} | { } | {
start?: never; start?: never;
draw?: never; draw?: never;
...@@ -5916,6 +5941,7 @@ export namespace ygopro { ...@@ -5916,6 +5941,7 @@ export namespace ygopro {
rock_paper_scissors?: never; rock_paper_scissors?: never;
hand_res?: never; hand_res?: never;
swap_grave_deck?: never; swap_grave_deck?: never;
sibyl_name?: never;
} | { } | {
start?: never; start?: never;
draw?: never; draw?: never;
...@@ -5970,6 +5996,7 @@ export namespace ygopro { ...@@ -5970,6 +5996,7 @@ export namespace ygopro {
rock_paper_scissors?: never; rock_paper_scissors?: never;
hand_res?: never; hand_res?: never;
swap_grave_deck?: never; swap_grave_deck?: never;
sibyl_name?: never;
} | { } | {
start?: never; start?: never;
draw?: never; draw?: never;
...@@ -6024,6 +6051,7 @@ export namespace ygopro { ...@@ -6024,6 +6051,7 @@ export namespace ygopro {
rock_paper_scissors?: never; rock_paper_scissors?: never;
hand_res?: never; hand_res?: never;
swap_grave_deck?: never; swap_grave_deck?: never;
sibyl_name?: never;
} | { } | {
start?: never; start?: never;
draw?: never; draw?: never;
...@@ -6078,6 +6106,7 @@ export namespace ygopro { ...@@ -6078,6 +6106,7 @@ export namespace ygopro {
rock_paper_scissors?: never; rock_paper_scissors?: never;
hand_res?: never; hand_res?: never;
swap_grave_deck?: never; swap_grave_deck?: never;
sibyl_name?: never;
} | { } | {
start?: never; start?: never;
draw?: never; draw?: never;
...@@ -6132,6 +6161,7 @@ export namespace ygopro { ...@@ -6132,6 +6161,7 @@ export namespace ygopro {
rock_paper_scissors?: never; rock_paper_scissors?: never;
hand_res?: never; hand_res?: never;
swap_grave_deck?: never; swap_grave_deck?: never;
sibyl_name?: never;
} | { } | {
start?: never; start?: never;
draw?: never; draw?: never;
...@@ -6186,6 +6216,7 @@ export namespace ygopro { ...@@ -6186,6 +6216,7 @@ export namespace ygopro {
rock_paper_scissors?: never; rock_paper_scissors?: never;
hand_res?: never; hand_res?: never;
swap_grave_deck?: never; swap_grave_deck?: never;
sibyl_name?: never;
} | { } | {
start?: never; start?: never;
draw?: never; draw?: never;
...@@ -6240,6 +6271,7 @@ export namespace ygopro { ...@@ -6240,6 +6271,7 @@ export namespace ygopro {
rock_paper_scissors?: never; rock_paper_scissors?: never;
hand_res?: never; hand_res?: never;
swap_grave_deck?: never; swap_grave_deck?: never;
sibyl_name?: never;
} | { } | {
start?: never; start?: never;
draw?: never; draw?: never;
...@@ -6294,6 +6326,7 @@ export namespace ygopro { ...@@ -6294,6 +6326,7 @@ export namespace ygopro {
rock_paper_scissors?: never; rock_paper_scissors?: never;
hand_res?: never; hand_res?: never;
swap_grave_deck?: never; swap_grave_deck?: never;
sibyl_name?: never;
} | { } | {
start?: never; start?: never;
draw?: never; draw?: never;
...@@ -6348,6 +6381,7 @@ export namespace ygopro { ...@@ -6348,6 +6381,7 @@ export namespace ygopro {
rock_paper_scissors?: never; rock_paper_scissors?: never;
hand_res?: never; hand_res?: never;
swap_grave_deck?: never; swap_grave_deck?: never;
sibyl_name?: never;
} | { } | {
start?: never; start?: never;
draw?: never; draw?: never;
...@@ -6402,6 +6436,7 @@ export namespace ygopro { ...@@ -6402,6 +6436,7 @@ export namespace ygopro {
rock_paper_scissors?: never; rock_paper_scissors?: never;
hand_res?: never; hand_res?: never;
swap_grave_deck?: never; swap_grave_deck?: never;
sibyl_name?: never;
} | { } | {
start?: never; start?: never;
draw?: never; draw?: never;
...@@ -6456,6 +6491,7 @@ export namespace ygopro { ...@@ -6456,6 +6491,7 @@ export namespace ygopro {
rock_paper_scissors?: never; rock_paper_scissors?: never;
hand_res?: never; hand_res?: never;
swap_grave_deck?: never; swap_grave_deck?: never;
sibyl_name?: never;
} | { } | {
start?: never; start?: never;
draw?: never; draw?: never;
...@@ -6510,6 +6546,7 @@ export namespace ygopro { ...@@ -6510,6 +6546,7 @@ export namespace ygopro {
rock_paper_scissors?: never; rock_paper_scissors?: never;
hand_res?: never; hand_res?: never;
swap_grave_deck?: never; swap_grave_deck?: never;
sibyl_name?: never;
} | { } | {
start?: never; start?: never;
draw?: never; draw?: never;
...@@ -6564,6 +6601,7 @@ export namespace ygopro { ...@@ -6564,6 +6601,7 @@ export namespace ygopro {
rock_paper_scissors?: never; rock_paper_scissors?: never;
hand_res?: never; hand_res?: never;
swap_grave_deck?: never; swap_grave_deck?: never;
sibyl_name?: never;
} | { } | {
start?: never; start?: never;
draw?: never; draw?: never;
...@@ -6618,6 +6656,7 @@ export namespace ygopro { ...@@ -6618,6 +6656,7 @@ export namespace ygopro {
rock_paper_scissors?: never; rock_paper_scissors?: never;
hand_res?: never; hand_res?: never;
swap_grave_deck?: never; swap_grave_deck?: never;
sibyl_name?: never;
} | { } | {
start?: never; start?: never;
draw?: never; draw?: never;
...@@ -6672,6 +6711,7 @@ export namespace ygopro { ...@@ -6672,6 +6711,7 @@ export namespace ygopro {
rock_paper_scissors?: never; rock_paper_scissors?: never;
hand_res?: never; hand_res?: never;
swap_grave_deck?: never; swap_grave_deck?: never;
sibyl_name?: never;
} | { } | {
start?: never; start?: never;
draw?: never; draw?: never;
...@@ -6726,6 +6766,7 @@ export namespace ygopro { ...@@ -6726,6 +6766,7 @@ export namespace ygopro {
rock_paper_scissors?: never; rock_paper_scissors?: never;
hand_res?: never; hand_res?: never;
swap_grave_deck?: never; swap_grave_deck?: never;
sibyl_name?: never;
} | { } | {
start?: never; start?: never;
draw?: never; draw?: never;
...@@ -6780,6 +6821,7 @@ export namespace ygopro { ...@@ -6780,6 +6821,7 @@ export namespace ygopro {
rock_paper_scissors?: never; rock_paper_scissors?: never;
hand_res?: never; hand_res?: never;
swap_grave_deck?: never; swap_grave_deck?: never;
sibyl_name?: never;
} | { } | {
start?: never; start?: never;
draw?: never; draw?: never;
...@@ -6834,6 +6876,7 @@ export namespace ygopro { ...@@ -6834,6 +6876,7 @@ export namespace ygopro {
rock_paper_scissors?: never; rock_paper_scissors?: never;
hand_res?: never; hand_res?: never;
swap_grave_deck?: never; swap_grave_deck?: never;
sibyl_name?: never;
} | { } | {
start?: never; start?: never;
draw?: never; draw?: never;
...@@ -6888,6 +6931,7 @@ export namespace ygopro { ...@@ -6888,6 +6931,7 @@ export namespace ygopro {
rock_paper_scissors?: never; rock_paper_scissors?: never;
hand_res?: never; hand_res?: never;
swap_grave_deck?: never; swap_grave_deck?: never;
sibyl_name?: never;
} | { } | {
start?: never; start?: never;
draw?: never; draw?: never;
...@@ -6942,6 +6986,7 @@ export namespace ygopro { ...@@ -6942,6 +6986,7 @@ export namespace ygopro {
rock_paper_scissors?: never; rock_paper_scissors?: never;
hand_res?: never; hand_res?: never;
swap_grave_deck?: never; swap_grave_deck?: never;
sibyl_name?: never;
} | { } | {
start?: never; start?: never;
draw?: never; draw?: never;
...@@ -6996,6 +7041,7 @@ export namespace ygopro { ...@@ -6996,6 +7041,7 @@ export namespace ygopro {
rock_paper_scissors?: never; rock_paper_scissors?: never;
hand_res?: never; hand_res?: never;
swap_grave_deck?: never; swap_grave_deck?: never;
sibyl_name?: never;
} | { } | {
start?: never; start?: never;
draw?: never; draw?: never;
...@@ -7050,6 +7096,7 @@ export namespace ygopro { ...@@ -7050,6 +7096,7 @@ export namespace ygopro {
rock_paper_scissors?: never; rock_paper_scissors?: never;
hand_res?: never; hand_res?: never;
swap_grave_deck?: never; swap_grave_deck?: never;
sibyl_name?: never;
} | { } | {
start?: never; start?: never;
draw?: never; draw?: never;
...@@ -7104,6 +7151,7 @@ export namespace ygopro { ...@@ -7104,6 +7151,7 @@ export namespace ygopro {
rock_paper_scissors?: never; rock_paper_scissors?: never;
hand_res?: never; hand_res?: never;
swap_grave_deck?: never; swap_grave_deck?: never;
sibyl_name?: never;
} | { } | {
start?: never; start?: never;
draw?: never; draw?: never;
...@@ -7158,6 +7206,7 @@ export namespace ygopro { ...@@ -7158,6 +7206,7 @@ export namespace ygopro {
rock_paper_scissors?: never; rock_paper_scissors?: never;
hand_res?: never; hand_res?: never;
swap_grave_deck?: never; swap_grave_deck?: never;
sibyl_name?: never;
} | { } | {
start?: never; start?: never;
draw?: never; draw?: never;
...@@ -7212,6 +7261,7 @@ export namespace ygopro { ...@@ -7212,6 +7261,7 @@ export namespace ygopro {
rock_paper_scissors?: never; rock_paper_scissors?: never;
hand_res?: never; hand_res?: never;
swap_grave_deck?: never; swap_grave_deck?: never;
sibyl_name?: never;
} | { } | {
start?: never; start?: never;
draw?: never; draw?: never;
...@@ -7266,6 +7316,7 @@ export namespace ygopro { ...@@ -7266,6 +7316,7 @@ export namespace ygopro {
rock_paper_scissors?: StocGameMessage.MsgRockPaperScissors; rock_paper_scissors?: StocGameMessage.MsgRockPaperScissors;
hand_res?: never; hand_res?: never;
swap_grave_deck?: never; swap_grave_deck?: never;
sibyl_name?: never;
} | { } | {
start?: never; start?: never;
draw?: never; draw?: never;
...@@ -7320,6 +7371,7 @@ export namespace ygopro { ...@@ -7320,6 +7371,7 @@ export namespace ygopro {
rock_paper_scissors?: never; rock_paper_scissors?: never;
hand_res?: StocGameMessage.MsgHandResult; hand_res?: StocGameMessage.MsgHandResult;
swap_grave_deck?: never; swap_grave_deck?: never;
sibyl_name?: never;
} | { } | {
start?: never; start?: never;
draw?: never; draw?: never;
...@@ -7374,6 +7426,62 @@ export namespace ygopro { ...@@ -7374,6 +7426,62 @@ export namespace ygopro {
rock_paper_scissors?: never; rock_paper_scissors?: never;
hand_res?: never; hand_res?: never;
swap_grave_deck?: StocGameMessage.MsgSwapGraveDeck; swap_grave_deck?: StocGameMessage.MsgSwapGraveDeck;
sibyl_name?: never;
} | {
start?: never;
draw?: never;
new_turn?: never;
new_phase?: never;
hint?: never;
select_idle_cmd?: never;
select_place?: never;
move?: never;
select_card?: never;
select_chain?: never;
select_effect_yn?: never;
select_position?: never;
select_option?: never;
shuffle_hand_extra?: never;
select_battle_cmd?: never;
pos_change?: never;
select_unselect_card?: never;
select_yes_no?: never;
update_hp?: never;
win?: never;
wait?: never;
unimplemented?: never;
update_data?: never;
reload_field?: never;
select_sum?: never;
select_tribute?: never;
update_counter?: never;
select_counter?: never;
sort_card?: never;
set?: never;
swap?: never;
summoning?: never;
summoned?: never;
flip_summoning?: never;
flip_summoned?: never;
sp_summoning?: never;
sp_summoned?: never;
chaining?: never;
attack?: never;
attack_disable?: never;
chain_solved?: never;
chain_end?: never;
announce?: never;
lp_update?: never;
confirm_cards?: never;
become_target?: never;
toss?: never;
shuffle_set_card?: never;
field_disabled?: never;
shuffle_deck?: never;
rock_paper_scissors?: never;
hand_res?: never;
swap_grave_deck?: never;
sibyl_name?: StocGameMessage.MsgSibylName;
})))) { })))) {
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);
...@@ -7537,6 +7645,9 @@ export namespace ygopro { ...@@ -7537,6 +7645,9 @@ export namespace ygopro {
if ("swap_grave_deck" in data && data.swap_grave_deck != undefined) { if ("swap_grave_deck" in data && data.swap_grave_deck != undefined) {
this.swap_grave_deck = data.swap_grave_deck; this.swap_grave_deck = data.swap_grave_deck;
} }
if ("sibyl_name" in data && data.sibyl_name != undefined) {
this.sibyl_name = data.sibyl_name;
}
} }
} }
get start() { get start() {
...@@ -8016,9 +8127,18 @@ export namespace ygopro { ...@@ -8016,9 +8127,18 @@ export namespace ygopro {
get has_swap_grave_deck() { get has_swap_grave_deck() {
return pb_1.Message.getField(this, 53) != null; return pb_1.Message.getField(this, 53) != null;
} }
get sibyl_name() {
return pb_1.Message.getWrapperField(this, StocGameMessage.MsgSibylName, 54) as StocGameMessage.MsgSibylName;
}
set sibyl_name(value: StocGameMessage.MsgSibylName) {
pb_1.Message.setOneofWrapperField(this, 54, this.#one_of_decls[0], value);
}
get has_sibyl_name() {
return pb_1.Message.getField(this, 54) != null;
}
get gameMsg() { get gameMsg() {
const cases: { const cases: {
[index: number]: "none" | "start" | "draw" | "new_turn" | "new_phase" | "hint" | "select_idle_cmd" | "select_place" | "move" | "select_card" | "select_chain" | "select_effect_yn" | "select_position" | "select_option" | "shuffle_hand_extra" | "select_battle_cmd" | "pos_change" | "select_unselect_card" | "select_yes_no" | "update_hp" | "win" | "wait" | "unimplemented" | "update_data" | "reload_field" | "select_sum" | "select_tribute" | "update_counter" | "select_counter" | "sort_card" | "set" | "swap" | "summoning" | "summoned" | "flip_summoning" | "flip_summoned" | "sp_summoning" | "sp_summoned" | "chaining" | "attack" | "attack_disable" | "chain_solved" | "chain_end" | "announce" | "lp_update" | "confirm_cards" | "become_target" | "toss" | "shuffle_set_card" | "field_disabled" | "shuffle_deck" | "rock_paper_scissors" | "hand_res" | "swap_grave_deck"; [index: number]: "none" | "start" | "draw" | "new_turn" | "new_phase" | "hint" | "select_idle_cmd" | "select_place" | "move" | "select_card" | "select_chain" | "select_effect_yn" | "select_position" | "select_option" | "shuffle_hand_extra" | "select_battle_cmd" | "pos_change" | "select_unselect_card" | "select_yes_no" | "update_hp" | "win" | "wait" | "unimplemented" | "update_data" | "reload_field" | "select_sum" | "select_tribute" | "update_counter" | "select_counter" | "sort_card" | "set" | "swap" | "summoning" | "summoned" | "flip_summoning" | "flip_summoned" | "sp_summoning" | "sp_summoned" | "chaining" | "attack" | "attack_disable" | "chain_solved" | "chain_end" | "announce" | "lp_update" | "confirm_cards" | "become_target" | "toss" | "shuffle_set_card" | "field_disabled" | "shuffle_deck" | "rock_paper_scissors" | "hand_res" | "swap_grave_deck" | "sibyl_name";
} = { } = {
0: "none", 0: "none",
1: "start", 1: "start",
...@@ -8073,9 +8193,10 @@ export namespace ygopro { ...@@ -8073,9 +8193,10 @@ export namespace ygopro {
50: "shuffle_deck", 50: "shuffle_deck",
51: "rock_paper_scissors", 51: "rock_paper_scissors",
52: "hand_res", 52: "hand_res",
53: "swap_grave_deck" 53: "swap_grave_deck",
54: "sibyl_name"
}; };
return cases[pb_1.Message.computeOneofCase(this, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53])]; return cases[pb_1.Message.computeOneofCase(this, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54])];
} }
static fromObject(data: { static fromObject(data: {
start?: ReturnType<typeof StocGameMessage.MsgStart.prototype.toObject>; start?: ReturnType<typeof StocGameMessage.MsgStart.prototype.toObject>;
...@@ -8131,6 +8252,7 @@ export namespace ygopro { ...@@ -8131,6 +8252,7 @@ export namespace ygopro {
rock_paper_scissors?: ReturnType<typeof StocGameMessage.MsgRockPaperScissors.prototype.toObject>; rock_paper_scissors?: ReturnType<typeof StocGameMessage.MsgRockPaperScissors.prototype.toObject>;
hand_res?: ReturnType<typeof StocGameMessage.MsgHandResult.prototype.toObject>; hand_res?: ReturnType<typeof StocGameMessage.MsgHandResult.prototype.toObject>;
swap_grave_deck?: ReturnType<typeof StocGameMessage.MsgSwapGraveDeck.prototype.toObject>; swap_grave_deck?: ReturnType<typeof StocGameMessage.MsgSwapGraveDeck.prototype.toObject>;
sibyl_name?: ReturnType<typeof StocGameMessage.MsgSibylName.prototype.toObject>;
}): StocGameMessage { }): StocGameMessage {
const message = new StocGameMessage({}); const message = new StocGameMessage({});
if (data.start != null) { if (data.start != null) {
...@@ -8292,6 +8414,9 @@ export namespace ygopro { ...@@ -8292,6 +8414,9 @@ export namespace ygopro {
if (data.swap_grave_deck != null) { if (data.swap_grave_deck != null) {
message.swap_grave_deck = StocGameMessage.MsgSwapGraveDeck.fromObject(data.swap_grave_deck); message.swap_grave_deck = StocGameMessage.MsgSwapGraveDeck.fromObject(data.swap_grave_deck);
} }
if (data.sibyl_name != null) {
message.sibyl_name = StocGameMessage.MsgSibylName.fromObject(data.sibyl_name);
}
return message; return message;
} }
toObject() { toObject() {
...@@ -8349,6 +8474,7 @@ export namespace ygopro { ...@@ -8349,6 +8474,7 @@ export namespace ygopro {
rock_paper_scissors?: ReturnType<typeof StocGameMessage.MsgRockPaperScissors.prototype.toObject>; rock_paper_scissors?: ReturnType<typeof StocGameMessage.MsgRockPaperScissors.prototype.toObject>;
hand_res?: ReturnType<typeof StocGameMessage.MsgHandResult.prototype.toObject>; hand_res?: ReturnType<typeof StocGameMessage.MsgHandResult.prototype.toObject>;
swap_grave_deck?: ReturnType<typeof StocGameMessage.MsgSwapGraveDeck.prototype.toObject>; swap_grave_deck?: ReturnType<typeof StocGameMessage.MsgSwapGraveDeck.prototype.toObject>;
sibyl_name?: ReturnType<typeof StocGameMessage.MsgSibylName.prototype.toObject>;
} = {}; } = {};
if (this.start != null) { if (this.start != null) {
data.start = this.start.toObject(); data.start = this.start.toObject();
...@@ -8509,6 +8635,9 @@ export namespace ygopro { ...@@ -8509,6 +8635,9 @@ export namespace ygopro {
if (this.swap_grave_deck != null) { if (this.swap_grave_deck != null) {
data.swap_grave_deck = this.swap_grave_deck.toObject(); data.swap_grave_deck = this.swap_grave_deck.toObject();
} }
if (this.sibyl_name != null) {
data.sibyl_name = this.sibyl_name.toObject();
}
return data; return data;
} }
serialize(): Uint8Array; serialize(): Uint8Array;
...@@ -8621,6 +8750,8 @@ export namespace ygopro { ...@@ -8621,6 +8750,8 @@ export namespace ygopro {
writer.writeMessage(52, this.hand_res, () => this.hand_res.serialize(writer)); writer.writeMessage(52, this.hand_res, () => this.hand_res.serialize(writer));
if (this.has_swap_grave_deck) if (this.has_swap_grave_deck)
writer.writeMessage(53, this.swap_grave_deck, () => this.swap_grave_deck.serialize(writer)); writer.writeMessage(53, this.swap_grave_deck, () => this.swap_grave_deck.serialize(writer));
if (this.has_sibyl_name)
writer.writeMessage(54, this.sibyl_name, () => this.sibyl_name.serialize(writer));
if (!w) if (!w)
return writer.getResultBuffer(); return writer.getResultBuffer();
} }
...@@ -8789,6 +8920,9 @@ export namespace ygopro { ...@@ -8789,6 +8920,9 @@ export namespace ygopro {
case 53: case 53:
reader.readMessage(message.swap_grave_deck, () => message.swap_grave_deck = StocGameMessage.MsgSwapGraveDeck.deserialize(reader)); reader.readMessage(message.swap_grave_deck, () => message.swap_grave_deck = StocGameMessage.MsgSwapGraveDeck.deserialize(reader));
break; break;
case 54:
reader.readMessage(message.sibyl_name, () => message.sibyl_name = StocGameMessage.MsgSibylName.deserialize(reader));
break;
default: reader.skipField(); default: reader.skipField();
} }
} }
...@@ -16674,6 +16808,188 @@ export namespace ygopro { ...@@ -16674,6 +16808,188 @@ export namespace ygopro {
return MsgSwapGraveDeck.deserialize(bytes); return MsgSwapGraveDeck.deserialize(bytes);
} }
} }
export class MsgSibylName extends pb_1.Message {
#one_of_decls: number[][] = [];
constructor(data?: any[] | {
name_0?: string;
name_0_tag?: string;
name_0_c?: string;
name_1?: string;
name_1_tag?: string;
name_1_c?: string;
}) {
super();
pb_1.Message.initialize(this, Array.isArray(data) ? data : [], 0, -1, [], this.#one_of_decls);
if (!Array.isArray(data) && typeof data == "object") {
if ("name_0" in data && data.name_0 != undefined) {
this.name_0 = data.name_0;
}
if ("name_0_tag" in data && data.name_0_tag != undefined) {
this.name_0_tag = data.name_0_tag;
}
if ("name_0_c" in data && data.name_0_c != undefined) {
this.name_0_c = data.name_0_c;
}
if ("name_1" in data && data.name_1 != undefined) {
this.name_1 = data.name_1;
}
if ("name_1_tag" in data && data.name_1_tag != undefined) {
this.name_1_tag = data.name_1_tag;
}
if ("name_1_c" in data && data.name_1_c != undefined) {
this.name_1_c = data.name_1_c;
}
}
}
get name_0() {
return pb_1.Message.getFieldWithDefault(this, 1, "") as string;
}
set name_0(value: string) {
pb_1.Message.setField(this, 1, value);
}
get name_0_tag() {
return pb_1.Message.getFieldWithDefault(this, 2, "") as string;
}
set name_0_tag(value: string) {
pb_1.Message.setField(this, 2, value);
}
get name_0_c() {
return pb_1.Message.getFieldWithDefault(this, 3, "") as string;
}
set name_0_c(value: string) {
pb_1.Message.setField(this, 3, value);
}
get name_1() {
return pb_1.Message.getFieldWithDefault(this, 4, "") as string;
}
set name_1(value: string) {
pb_1.Message.setField(this, 4, value);
}
get name_1_tag() {
return pb_1.Message.getFieldWithDefault(this, 5, "") as string;
}
set name_1_tag(value: string) {
pb_1.Message.setField(this, 5, value);
}
get name_1_c() {
return pb_1.Message.getFieldWithDefault(this, 6, "") as string;
}
set name_1_c(value: string) {
pb_1.Message.setField(this, 6, value);
}
static fromObject(data: {
name_0?: string;
name_0_tag?: string;
name_0_c?: string;
name_1?: string;
name_1_tag?: string;
name_1_c?: string;
}): MsgSibylName {
const message = new MsgSibylName({});
if (data.name_0 != null) {
message.name_0 = data.name_0;
}
if (data.name_0_tag != null) {
message.name_0_tag = data.name_0_tag;
}
if (data.name_0_c != null) {
message.name_0_c = data.name_0_c;
}
if (data.name_1 != null) {
message.name_1 = data.name_1;
}
if (data.name_1_tag != null) {
message.name_1_tag = data.name_1_tag;
}
if (data.name_1_c != null) {
message.name_1_c = data.name_1_c;
}
return message;
}
toObject() {
const data: {
name_0?: string;
name_0_tag?: string;
name_0_c?: string;
name_1?: string;
name_1_tag?: string;
name_1_c?: string;
} = {};
if (this.name_0 != null) {
data.name_0 = this.name_0;
}
if (this.name_0_tag != null) {
data.name_0_tag = this.name_0_tag;
}
if (this.name_0_c != null) {
data.name_0_c = this.name_0_c;
}
if (this.name_1 != null) {
data.name_1 = this.name_1;
}
if (this.name_1_tag != null) {
data.name_1_tag = this.name_1_tag;
}
if (this.name_1_c != null) {
data.name_1_c = this.name_1_c;
}
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 (this.name_0.length)
writer.writeString(1, this.name_0);
if (this.name_0_tag.length)
writer.writeString(2, this.name_0_tag);
if (this.name_0_c.length)
writer.writeString(3, this.name_0_c);
if (this.name_1.length)
writer.writeString(4, this.name_1);
if (this.name_1_tag.length)
writer.writeString(5, this.name_1_tag);
if (this.name_1_c.length)
writer.writeString(6, this.name_1_c);
if (!w)
return writer.getResultBuffer();
}
static deserialize(bytes: Uint8Array | pb_1.BinaryReader): MsgSibylName {
const reader = bytes instanceof pb_1.BinaryReader ? bytes : new pb_1.BinaryReader(bytes), message = new MsgSibylName();
while (reader.nextField()) {
if (reader.isEndGroup())
break;
switch (reader.getFieldNumber()) {
case 1:
message.name_0 = reader.readString();
break;
case 2:
message.name_0_tag = reader.readString();
break;
case 3:
message.name_0_c = reader.readString();
break;
case 4:
message.name_1 = reader.readString();
break;
case 5:
message.name_1_tag = reader.readString();
break;
case 6:
message.name_1_c = reader.readString();
break;
default: reader.skipField();
}
}
return message;
}
serializeBinary(): Uint8Array {
return this.serialize();
}
static deserializeBinary(bytes: Uint8Array): MsgSibylName {
return MsgSibylName.deserialize(bytes);
}
}
export class MsgReloadField extends pb_1.Message { export class MsgReloadField extends pb_1.Message {
#one_of_decls: number[][] = []; #one_of_decls: number[][] = [];
constructor(data?: any[] | { constructor(data?: any[] | {
......
...@@ -69,3 +69,4 @@ export const MSG_FIELD_DISABLED = 56; ...@@ -69,3 +69,4 @@ export const MSG_FIELD_DISABLED = 56;
export const MSG_HAND_RES = 133; export const MSG_HAND_RES = 133;
export const MSG_SHUFFLE_HAND = 33; export const MSG_SHUFFLE_HAND = 33;
export const MSG_SHUFFLE_EXTRA = 39; export const MSG_SHUFFLE_EXTRA = 39;
export const MSG_SIBYL_NAME = 235;
...@@ -37,6 +37,7 @@ import MsgSelectTributeAdapter from "./selectTribute"; ...@@ -37,6 +37,7 @@ import MsgSelectTributeAdapter from "./selectTribute";
import MsgSelectUnselectCardAdapter from "./selectUnselectCard"; import MsgSelectUnselectCardAdapter from "./selectUnselectCard";
import MsgShuffleHandExtraAdapter from "./shuffleHandExtra"; import MsgShuffleHandExtraAdapter from "./shuffleHandExtra";
import MsgShuffleSetCard from "./shuffleSetCard"; import MsgShuffleSetCard from "./shuffleSetCard";
import MsgSibylNameAdapter from "./sibylName";
import MsgSortCard from "./sortCard"; import MsgSortCard from "./sortCard";
import MsgStartAdapter from "./start"; import MsgStartAdapter from "./start";
import MsgTossAdapter from "./toss"; import MsgTossAdapter from "./toss";
...@@ -273,6 +274,11 @@ export default class GameMsgAdapter implements StocAdapter { ...@@ -273,6 +274,11 @@ export default class GameMsgAdapter implements StocAdapter {
break; break;
} }
case GAME_MSG.MSG_SIBYL_NAME: {
gameMsg.sibyl_name = MsgSibylNameAdapter(gameData);
break;
}
default: { default: {
gameMsg.unimplemented = new ygopro.StocGameMessage.MsgUnimplemented({ gameMsg.unimplemented = new ygopro.StocGameMessage.MsgUnimplemented({
command: func, command: func,
......
import { ygopro } from "@/api/ocgcore/idl/ocgcore";
import MsgSibylName = ygopro.StocGameMessage.MsgSibylName;
const LEN = 100;
/*
* Msg Sibyl Name
* @param - TODO
*
* @usage - Replay模式获取对战双方的昵称
* */
export default (data: Uint8Array) => {
const decoder = new TextDecoder("utf-16");
let offset = 0;
const name_0 = cutString(decoder.decode(data.slice(offset, offset + LEN)));
offset += LEN;
const name_0_tag = cutString(
decoder.decode(data.slice(offset, offset + LEN))
);
offset += LEN;
const name_0_c = cutString(decoder.decode(data.slice(offset, offset + LEN)));
offset += LEN;
const name_1 = cutString(decoder.decode(data.slice(offset, offset + LEN)));
offset += LEN;
const name_1_tag = cutString(
decoder.decode(data.slice(offset, offset + LEN))
);
offset += LEN;
const name_1_c = cutString(decoder.decode(data.slice(offset, offset + LEN)));
return new MsgSibylName({
name_0,
name_0_tag,
name_0_c,
name_1,
name_1_tag,
name_1_c,
});
};
function cutString(str: string): string {
const end = str.indexOf("\0");
return str.substring(0, end);
}
...@@ -26,6 +26,11 @@ export interface socketAction { ...@@ -26,6 +26,11 @@ export interface socketAction {
player: string; player: string;
passWd: string; passWd: string;
}; };
isReplay?: boolean; // 是否是回放模式
replayInfo?: {
Url: string; // 提供回放服务的地址
data: ArrayBuffer; // 回放数据
};
// 通过长连接发送的数据 // 通过长连接发送的数据
payload?: Uint8Array; payload?: Uint8Array;
} }
...@@ -36,12 +41,20 @@ let ws: WebSocketStream | null = null; ...@@ -36,12 +41,20 @@ let ws: WebSocketStream | null = null;
export default async function (action: socketAction) { export default async function (action: socketAction) {
switch (action.cmd) { switch (action.cmd) {
case socketCmd.CONNECT: { case socketCmd.CONNECT: {
const info = action.initInfo; const { initInfo: info, isReplay, replayInfo } = action;
if (info) { if (info) {
ws = new WebSocketStream(info.ip, (conn, _event) => ws = new WebSocketStream(info.ip, (conn, _event) =>
handleSocketOpen(conn, info.ip, info.player, info.passWd) handleSocketOpen(conn, info.ip, info.player, info.passWd)
); );
await ws.execute(handleSocketMessage);
} else if (isReplay && replayInfo) {
ws = new WebSocketStream(replayInfo.Url, (conn, _event) => {
console.info("replay websocket open.");
conn.binaryType = "arraybuffer";
conn.send(replayInfo.data);
});
await ws.execute(handleSocketMessage); await ws.execute(handleSocketMessage);
} }
......
import { ygopro } from "@/api"; import { ygopro } from "@/api";
import { sleep } from "@/infra"; import { sleep } from "@/infra";
import { matStore } from "@/stores";
import { showWaiting } from "@/ui/Duel/Message"; import { showWaiting } from "@/ui/Duel/Message";
import onAnnounce from "./announce"; import onAnnounce from "./announce";
...@@ -40,6 +41,7 @@ import onMsgSet from "./set"; ...@@ -40,6 +41,7 @@ import onMsgSet from "./set";
import onMsgShuffleDeck from "./shuffleDeck"; import onMsgShuffleDeck from "./shuffleDeck";
import onMsgShuffleHandExtra from "./shuffleHandExtra"; import onMsgShuffleHandExtra from "./shuffleHandExtra";
import onMsgShuffleSetCard from "./shuffleSetCard"; import onMsgShuffleSetCard from "./shuffleSetCard";
import onMsgSibylName from "./sibylName";
import onMsgSortCard from "./sortCard"; import onMsgSortCard from "./sortCard";
import onMsgSpSummoned from "./spSummoned"; import onMsgSpSummoned from "./spSummoned";
import onMsgSpSummoning from "./spSummoning"; import onMsgSpSummoning from "./spSummoning";
...@@ -69,6 +71,24 @@ const ActiveList = [ ...@@ -69,6 +71,24 @@ const ActiveList = [
"select_yes_no", "select_yes_no",
]; ];
const ReplayIgnoreMsg = [
"select_idle_cmd",
"select_place",
"select_card",
"select_chain",
"select_effect_yn",
"select_position",
"select_option",
"select_battle_cmd",
"select_unselect_card",
"select_yes_no",
"select_tribute",
"select_counter",
"rock_paper_scissors",
"sort_card",
"announce",
];
let animation: Promise<unknown> = new Promise<void>((rs) => rs()); let animation: Promise<unknown> = new Promise<void>((rs) => rs());
export default async function handleGameMsg(pb: ygopro.YgoStocMsg) { export default async function handleGameMsg(pb: ygopro.YgoStocMsg) {
...@@ -83,6 +103,8 @@ async function _handleGameMsg(pb: ygopro.YgoStocMsg) { ...@@ -83,6 +103,8 @@ async function _handleGameMsg(pb: ygopro.YgoStocMsg) {
showWaiting(false); showWaiting(false);
} }
if (matStore.isReplay && ReplayIgnoreMsg.includes(msg.gameMsg)) return;
switch (msg.gameMsg) { switch (msg.gameMsg) {
case "start": { case "start": {
await onMsgStart(msg.start); await onMsgStart(msg.start);
...@@ -345,6 +367,11 @@ async function _handleGameMsg(pb: ygopro.YgoStocMsg) { ...@@ -345,6 +367,11 @@ async function _handleGameMsg(pb: ygopro.YgoStocMsg) {
break; break;
} }
case "sibyl_name": {
onMsgSibylName(msg.sibyl_name);
break;
}
case "unimplemented": { case "unimplemented": {
onUnimplemented(msg.unimplemented); onUnimplemented(msg.unimplemented);
......
import { ygopro } from "@/api";
import { playerStore } from "@/stores";
type MsgSibylName = ygopro.StocGameMessage.MsgSibylName;
export default (sibylName: MsgSibylName) => {
playerStore.getMePlayer().name = sibylName.name_0;
playerStore.getOpPlayer().name = sibylName.name_1;
};
...@@ -7,6 +7,7 @@ import { fetchCard, ygopro } from "@/api"; ...@@ -7,6 +7,7 @@ import { fetchCard, ygopro } from "@/api";
import { useConfig } from "@/config"; import { useConfig } from "@/config";
import { sleep } from "@/infra"; import { sleep } from "@/infra";
import { cardStore, CardType, matStore } from "@/stores"; import { cardStore, CardType, matStore } from "@/stores";
import { replayStart } from "@/ui/Replay";
const TOKEN_SIZE = 13; // 每人场上最多就只可能有13个token const TOKEN_SIZE = 13; // 每人场上最多就只可能有13个token
export default async (start: ygopro.StocGameMessage.MsgStart) => { export default async (start: ygopro.StocGameMessage.MsgStart) => {
...@@ -72,7 +73,11 @@ export default async (start: ygopro.StocGameMessage.MsgStart) => { ...@@ -72,7 +73,11 @@ export default async (start: ygopro.StocGameMessage.MsgStart) => {
// 设置自己的额外卡组,信息是在waitroom之中拿到的 // 设置自己的额外卡组,信息是在waitroom之中拿到的
cardStore cardStore
.at(ygopro.CardZone.EXTRA, 1 - opponent) .at(ygopro.CardZone.EXTRA, 1 - opponent)
.forEach((card) => (card.code = myExtraDeckCodes.pop()!)); .forEach((card) => (card.code = myExtraDeckCodes.pop() ?? 0));
if (matStore.isReplay) {
replayStart();
}
// 初始化完后,sleep 1s,让UI初始化完成, // 初始化完后,sleep 1s,让UI初始化完成,
// 否则在和AI对战时,由于后端给传给前端的`MSG`频率太高,会导致一些问题。 // 否则在和AI对战时,由于后端给传给前端的`MSG`频率太高,会导致一些问题。
......
...@@ -80,6 +80,7 @@ export const matStore: MatState = proxy<MatState>({ ...@@ -80,6 +80,7 @@ export const matStore: MatState = proxy<MatState>({
enableM2: false, // 允许进入M2阶段 enableM2: false, // 允许进入M2阶段
enableEp: false, // 允许回合结束 enableEp: false, // 允许回合结束
}, },
isReplay: false,
unimplemented: 0, unimplemented: 0,
handResults: { handResults: {
me: 0, me: 0,
......
...@@ -28,6 +28,8 @@ export interface MatState { ...@@ -28,6 +28,8 @@ export interface MatState {
phase: PhaseState; phase: PhaseState;
isReplay: boolean; // 是否是回放模式
result?: { result?: {
isWin: boolean; isWin: boolean;
reason: string; reason: string;
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
import "../styles/core.scss"; import "../styles/core.scss";
import { Input } from "antd"; import { Input } from "antd";
import Link from "antd/es/typography/Link";
import React, { ChangeEvent, useEffect, useState } from "react"; import React, { ChangeEvent, useEffect, useState } from "react";
import { useNavigate } from "react-router-dom"; import { useNavigate } from "react-router-dom";
...@@ -88,6 +89,9 @@ export default function Login() { ...@@ -88,6 +89,9 @@ export default function Login() {
<a href="https://doc.neos.moe">Player Guide</a> <a href="https://doc.neos.moe">Player Guide</a>
<span className="fa fa-arrow-right"></span> <span className="fa fa-arrow-right"></span>
</p> </p>
<p>
<Link href="replay">Clik here to play ygo replay</Link>
</p>
</div> </div>
<div className="sign-in__actions clearfix"> <div className="sign-in__actions clearfix">
<ul> <ul>
......
...@@ -7,6 +7,7 @@ const Login = React.lazy(() => import("./Login")); ...@@ -7,6 +7,7 @@ const Login = React.lazy(() => import("./Login"));
const WaitRoom = React.lazy(() => import("./WaitRoom")); const WaitRoom = React.lazy(() => import("./WaitRoom"));
const Mora = React.lazy(() => import("./Mora")); const Mora = React.lazy(() => import("./Mora"));
const NeosDuel = React.lazy(() => import("./Duel/Main")); const NeosDuel = React.lazy(() => import("./Duel/Main"));
const Replay = React.lazy(() => import("./Replay"));
export default function () { export default function () {
return ( return (
...@@ -28,6 +29,14 @@ export default function () { ...@@ -28,6 +29,14 @@ export default function () {
</Suspense> </Suspense>
} }
/> />
<Route
path="/replay"
element={
<Suspense fallback={<Loading />}>
<Replay />
</Suspense>
}
/>
<Route <Route
path="/duel/:player/:passWd/:ip" path="/duel/:player/:passWd/:ip"
element={ element={
......
import "../../styles/core.scss";
import { UploadOutlined } from "@ant-design/icons";
import { Button, message, Modal, Upload, UploadProps } from "antd";
import React, { useEffect, useState } from "react";
import { useNavigate } from "react-router-dom";
import rustInit from "rust-src";
import { proxy, useSnapshot } from "valtio";
import { initStrings } from "@/api";
import { useConfig } from "@/config";
import socketMiddleWare, { socketCmd } from "@/middleware/socket";
import sqliteMiddleWare, { sqliteCmd } from "@/middleware/sqlite";
import { matStore } from "@/stores";
const NeosConfig = useConfig();
const localStore = proxy({
hasStart: false,
});
const ReplayModal: React.FC = () => {
const { hasStart } = useSnapshot(localStore);
const [replay, setReplay] = useState<null | ArrayBuffer>(null);
const uploadProps: UploadProps = {
name: "replay",
onChange(info) {
info.file.status = "done";
},
beforeUpload(file, _) {
const reader = new FileReader();
reader.readAsArrayBuffer(file);
reader.onload = (e) => setReplay(e.target?.result as ArrayBuffer);
},
};
const navigate = useNavigate();
useEffect(() => {
if (hasStart) {
// 跳转
navigate(`/duel/neos/replay/${NeosConfig.replayUrl}`);
}
}, [hasStart]);
return (
<Modal
title="选择回放"
open={true}
maskClosable={false}
onOk={async () => {
if (replay === null) {
message.error("请先上传录像文件");
} else {
// 标记为回放模式
matStore.isReplay = true;
// 初始化wasm
const url =
import.meta.env.BASE_URL === "/"
? undefined
: new URL(
"rust_src_bg.wasm",
`${import.meta.env.BASE_URL}assets/`
);
await rustInit(url);
// 初始化额外卡组
// FIXME: 这样写应该不对,有空来修
window.myExtraDeckCodes = [];
// 初始化sqlite
await sqliteMiddleWare({
cmd: sqliteCmd.INIT,
initInfo: { dbUrl: NeosConfig.cardsDbUrl },
});
// 初始化文案
await initStrings();
// 连接回放websocket服务
socketMiddleWare({
cmd: socketCmd.CONNECT,
isReplay: true,
replayInfo: {
Url: NeosConfig.replayUrl,
data: replay,
},
});
}
}}
onCancel={() => {
// 断开websocket连接
socketMiddleWare({ cmd: socketCmd.DISCONNECT });
// 回到初始界面
navigate("/");
}}
>
<Upload {...uploadProps}>
<Button icon={<UploadOutlined />}>点击上传录像文件</Button>
</Upload>
</Modal>
);
};
export const replayStart = () => {
localStore.hasStart = true;
};
export default ReplayModal;
...@@ -59,15 +59,12 @@ const WaitRoom = () => { ...@@ -59,15 +59,12 @@ const WaitRoom = () => {
useEffect(() => { useEffect(() => {
if (ip && player && player.length != 0 && passWd && passWd.length != 0) { if (ip && player && player.length != 0 && passWd && passWd.length != 0) {
const init = async () => { const init = async () => {
// 页面第一次渲染时,通过socket中间件向ygopro服务端请求建立长连接 // 初始化wasm
socketMiddleWare({ const url =
cmd: socketCmd.CONNECT, import.meta.env.BASE_URL === "/"
initInfo: { ? undefined
ip, : new URL("rust_src_bg.wasm", `${import.meta.env.BASE_URL}assets/`);
player, await rustInit(url);
passWd,
},
});
// 初始化sqlite // 初始化sqlite
await sqliteMiddleWare({ await sqliteMiddleWare({
...@@ -78,12 +75,15 @@ const WaitRoom = () => { ...@@ -78,12 +75,15 @@ const WaitRoom = () => {
// 初始化文案 // 初始化文案
await initStrings(); await initStrings();
// 初始化wasm // 页面第一次渲染时,通过socket中间件向ygopro服务端请求建立长连接
const url = socketMiddleWare({
import.meta.env.BASE_URL === "/" cmd: socketCmd.CONNECT,
? undefined initInfo: {
: new URL("rust_src_bg.wasm", `${import.meta.env.BASE_URL}assets/`); ip,
await rustInit(url); player,
passWd,
},
});
}; };
init(); init();
......
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