Commit cd844fd3 authored by Chunchi Che's avatar Chunchi Che

Merge branch 'feat/service/response' into 'main'

Feat/service/response

See merge request mycard/Neos!39
parents 09e86476 b92bb5f2
neos-protobuf @ 1ba7de35
Subproject commit cd2ef52b2642e59cc021b44e9816fd8622b2a8cb
Subproject commit 1ba7de35c6c717fe9f361dcdada8ffd6c43f9a8b
This diff is collapsed.
......@@ -63,3 +63,30 @@ export class BufferReader {
return cardInfo;
}
}
export class BufferWriter {
dataView: DataView;
littleEndian: boolean;
offset: number;
constructor(data: Uint8Array, littleEndian: boolean) {
this.dataView = new DataView(data.buffer);
this.littleEndian = littleEndian;
this.offset = 0;
}
writeUint8(value: number) {
this.dataView.setUint8(this.offset, value);
this.offset += OFFSET_UINT8;
}
writeInt8(value: number) {
this.dataView.setInt8(this.offset, value);
this.offset += OFFSET_INT8;
}
writeUint32(value: number) {
this.dataView.setUint32(this.offset, value);
this.offset += OFFSET_UINT32;
}
}
import { ygopro } from "../../../idl/ocgcore";
import { YgoProPacket } from "../../packet";
import { CTOS_RESPONSE } from "../../protoDecl";
import adaptSelectIdleCmdResponse from "./selectIdleCmd";
/*
* CTOS CTOS_RESPONSE
*
* @param response: any - 对于服务端传给端上的`GameMsg`,回传一个`Response`
*
* @usage - 告知服务端玩家对局内的操作选择
*
* */
export default class CtosResponsePacket extends YgoProPacket {
constructor(pb: ygopro.YgoCtosMsg) {
const response = pb.ctos_response;
let extraData = new Uint8Array(0);
switch (response.gameMsgResponse) {
case "select_idle_cmd": {
extraData = adaptSelectIdleCmdResponse(response.select_idle_cmd);
break;
}
default: {
break;
}
}
super(extraData.length + 1, CTOS_RESPONSE, extraData);
}
}
import { ygopro } from "../../../idl/ocgcore";
import { BufferWriter } from "../../bufferIO";
export default (response: ygopro.CtosGameMsgResponse.SelectIdleCmdResponse) => {
const array = new Uint8Array(4);
const writer = new BufferWriter(array, true);
writer.writeUint32(response.code);
return array;
};
......@@ -10,6 +10,7 @@ export const CTOS_HS_START = 37;
export const CTOS_HAND_RESULT = 3;
export const CTOS_TP_RESULT = 4;
export const CTOS_TIME_CONFIRM = 21;
export const CTOS_RESPONSE = 1;
export const STOC_JOIN_GAME = 18;
export const STOC_CHAT = 25;
......
......@@ -27,6 +27,7 @@ export default (data: Uint8Array) => {
for (let i = 0; i < summonCount; i++) {
const idleData = new MsgSelectIdleCmd.IdleCmd.IdleData({
card_info: reader.readCardInfo(),
response: (i << 16) + 0,
});
summonCmd.idle_datas.push(idleData);
}
......@@ -40,6 +41,7 @@ export default (data: Uint8Array) => {
for (let i = 0; i < spSummonCount; i++) {
const idleData = new MsgSelectIdleCmd.IdleCmd.IdleData({
card_info: reader.readCardInfo(),
response: (i << 16) + 1,
});
spSummonCmd.idle_datas.push(idleData);
}
......@@ -53,6 +55,7 @@ export default (data: Uint8Array) => {
for (let i = 0; i < posChangeCount; i++) {
const idleData = new MsgSelectIdleCmd.IdleCmd.IdleData({
card_info: reader.readCardInfo(),
response: (i << 16) + 2,
});
posChangeCmd.idle_datas.push(idleData);
}
......@@ -66,6 +69,7 @@ export default (data: Uint8Array) => {
for (let i = 0; i < mSetCount; i++) {
const idleData = new MsgSelectIdleCmd.IdleCmd.IdleData({
card_info: reader.readCardInfo(),
response: (i << 16) + 3,
});
mSetCmd.idle_datas.push(idleData);
}
......@@ -79,6 +83,7 @@ export default (data: Uint8Array) => {
for (let i = 0; i < sSetCount; i++) {
const idleData = new MsgSelectIdleCmd.IdleCmd.IdleData({
card_info: reader.readCardInfo(),
response: (i << 16) + 4,
});
sSetCmd.idle_datas.push(idleData);
}
......@@ -93,6 +98,7 @@ export default (data: Uint8Array) => {
const idleData = new MsgSelectIdleCmd.IdleCmd.IdleData({
card_info: reader.readCardInfo(),
effect_description: reader.readUint32(),
response: (i << 16) + 5,
});
activateCmd.idle_datas.push(idleData);
}
......
......@@ -13,6 +13,7 @@ import HsStartAdapter from "./ocgAdapter/ctos/ctosHsStart";
import HandResult from "./ocgAdapter/ctos/ctosHandResult";
import TpResult from "./ocgAdapter/ctos/ctosTpResult";
import TimeConfirm from "./ocgAdapter/ctos/ctosTimeConfirm";
import GameMsgResponse from "./ocgAdapter/ctos/ctosGameMsgResponse/mod";
export function sendUpdateDeck(deck: IDeck) {
const updateDeck = new ygopro.YgoCtosMsg({
......@@ -117,3 +118,16 @@ export function sendTimeConfirm() {
socketMiddleWare({ cmd: socketCmd.SEND, payload });
}
export function sendSelectIdleCmdResponse(value: number) {
const response = new ygopro.YgoCtosMsg({
ctos_response: new ygopro.CtosGameMsgResponse({
select_idle_cmd: new ygopro.CtosGameMsgResponse.SelectIdleCmdResponse({
code: value,
}),
}),
});
const payload = new GameMsgResponse(response).serialize();
socketMiddleWare({ cmd: socketCmd.SEND, payload });
}
......@@ -65,4 +65,6 @@ export interface Interactivity {
interactType: InteractType;
// 如果`interactType`是`ACTIVATE`,这个字段是对应的效果编号
activateIndex?: number;
// 用户点击后,需要回传给服务端的`response`
response: number;
}
......@@ -56,6 +56,7 @@ export default (selectIdleCmd: MsgSelectIdleCmd, dispatch: AppDispatch) => {
interactivity: {
interactType,
activateIndex: data.effect_description,
response: data.response,
},
})
);
......@@ -64,7 +65,7 @@ export default (selectIdleCmd: MsgSelectIdleCmd, dispatch: AppDispatch) => {
addHandsInteractivity({
player,
index: card_info.sequence,
interactivity: { interactType },
interactivity: { interactType, response: data.response },
})
);
}
......
......@@ -2,6 +2,7 @@ import * as BABYLON from "@babylonjs/core";
import * as BABYLON_GUI from "@babylonjs/gui";
import * as CONFIG from "../../../config/ui";
import { Card, InteractType } from "../../../reducers/duel/util";
import { sendSelectIdleCmdResponse } from "../../../api/ocgcore/ocgHelper";
export default (hands: Card[], scene: BABYLON.Scene) => {
const handShape = CONFIG.HandShape();
......@@ -87,6 +88,8 @@ function setupHandInteractivity(
button.color = "white";
button.onPointerClickObservable.add(() => {
console.log(`<Interact>hand ${handIdx}`);
sendSelectIdleCmdResponse(interactivities[i].response);
});
advancedTexture.addControl(button);
......
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