import CSMessage from "@/Common/Message/CSMessage"; import { CoroutineV2 } from "@/Engine/CatanEngine/CoroutineV2/CoroutineV2"; import { INetResponse } from "@/Engine/CatanEngine/NetManagerV2/Core/INetResponse"; import { NetConnector } from "@/Engine/CatanEngine/NetManagerV2/NetConnector"; import { NetManagerSD } from "@/Engine/CatanEngine/NetManagerV2/NetManagerSD"; import A from "@/components/CustomA"; import { useGameItems } from "@/context/GameItemsContext"; import { SDAccountLoginRequest } from "@/define/Request/AccountRequest"; import { SlotInRequest } from "@/define/Request/SlotRequest"; import GameManager from "@/modules/GameManager"; import { Button, Checkbox, Dropdown, Flex, Input, MenuProps } from "antd"; import { CheckboxChangeEvent } from "antd/es/checkbox"; import { ChangeEvent, useEffect, useState } from "react"; const SDGame = (props: ISDGame) => { const { gameUrl, onClickSlotOut } = props; const { player, setPlayer } = useGameItems(); const { gameData } = useGameItems(); const { nowSlotId } = gameData; const [isOK, setIsOK] = useState(false); const [isSpin, setIsSpin] = useState(false); const [slotData, setSlotData] = useState(undefined); const [items, setItems] = useState([]); const [bet, setBet] = useState(0); const [delay, setDelay] = useState(0.1); const [isRatioStop, setIsRatio] = useState(false); const [ratioStop, setRatio] = useState(200); const [isCountStop, setIsSpinCount] = useState(false); const [countStop, setSpinCount] = useState(200); const [log, setLog] = useState([]); let conn: NetConnector = undefined; function* onLoad(): IterableIterator { const url: URL = new URL(gameUrl); const queryParameters: URLSearchParams = new URLSearchParams(url.search); const token: string = queryParameters.get("token"); const slotid: number = +queryParameters.get("slotid"); const host: string = queryParameters.get("host"); const port: number = 9005; GameManager.SlotData.SlotId = slotid; conn = new NetConnector("https://" + host, port); conn.OnDataReceived.AddCallback(onNetDataReceived); conn.OnDisconnected.AddCallback(onNetDisconnected); setSlotClass(); NetManagerSD.Initialize(conn); console.log("[SDsocket] connecting..."); yield NetManagerSD.ConnectAsync(); yield* login(token); yield* slotIn(); } function* login(token: string): IterableIterator { const req = new SDAccountLoginRequest(token); yield req.SendAsync(true); const resp = req.Result; if (!resp.IsValid) { CSMessage.NetError(resp.Method, resp.Status, "SD Account Login Fail"); return; } } function* slotIn(): IterableIterator { let req: SlotInRequest = new SlotInRequest(GameManager.SlotData.SlotId); yield req.SendAsync(true); let resp: INetResponse = req.Result; if (resp.IsValid) { setSlotData(resp.Data); const br: number[] = resp.Data["br"]; const db: number = resp.Data["db"]; const betGroup: MenuProps["items"] = []; for (let i = 0; i < br.length; i++) { betGroup.push({ key: i, label: ( { setBet(br[i]); GameManager.SlotData.NowBet = br[i]; }}> {br[i]} ), }); } setItems(betGroup); setBet(br[db]); GameManager.SlotData.NowBet = br[db]; setIsOK(true); } } async function setSlotClass() { let slot: any; const slotGroup: typeof import("../../define/Game/Base/Slot") = await import(/* @vite-ignore */`../../define/Game/Base/Slot`); try { slot = slotGroup[`Slot${GameManager.SlotData.SlotId}`]; } catch (error) { // } if (!slot) { slot = slotGroup.SlotBase; } GameManager.SlotData.SlotClass = new slot(GameManager.SlotData.SlotId, setRPCLog); } async function OnClickSpin() { GameManager.SlotData.IsSpin = true; setIsSpin(true); CoroutineV2.Single(spin()).Start(); } function OnClickStop() { GameManager.SlotData.IsSpin = false; setIsSpin(false); } function* spin(): IterableIterator { yield* GameManager.SlotData.SlotClass.Spin(bet, isCountStop, countStop, isRatioStop, ratioStop, OnClickStop); yield CoroutineV2.WaitTime(delay); if (GameManager.SlotData.IsSpin) { yield* spin(); } else { setIsSpin(false); } } function setRPCLog(s: string) { setLog((v) => { if (v.length > 100) { v.pop(); } v.unshift(s); return v; }); } /**RPC回傳.若協定錯誤斷線.原因也會在這裡收到 */ function onNetDataReceived(resp: INetResponse) { // MainControl.DataReceivedEvent.DispatchCallback([MainControl.DataType.ServerData, resp]); } /**只要連線中斷不管主被動都會走到這裡 */ function onNetDisconnected() { console.warn("[socket] Disconnected"); conn.OnDataReceived.RemoveAllCallbacks(); // MainControl.DataReceivedEvent.DispatchCallback([MainControl.DataType.NetDisconnected]); } useEffect(() => { CoroutineV2.Single(onLoad()).Start(); }, []); return (<>
{isOK &&

押注

延遲 ) => setDelay(+e.target.value)} type="text" value={delay} placeholder={delay.toString()} style={{ width: "10%" }} /> 秒

倍率 setIsRatio(e.target.checked)} /> {isRatioStop && <>) => setRatio(+e.target.value)} type="text" value={ratioStop} placeholder={ratioStop.toString()} style={{ width: "10%" }} />倍}

轉數 setIsSpinCount(e.target.checked)} /> {isCountStop && <>) => setSpinCount(+e.target.value)} type="text" value={countStop} placeholder={countStop.toString()} style={{ width: "10%" }} />轉}

{isSpin ? : }

{log.map((log: string, index: number) =>

{log}

)}
}
); }; export default SDGame; interface ISDGame { gameUrl: string; onClickSlotOut: () => void; } const siderStyle: React.CSSProperties = { fontSize: "1rem", color: "#000000", display: "flex", textAlign: "left", flexDirection: "column", justifyContent: "center", width: "100%" }; const controlStyle: React.CSSProperties = { fontSize: "1rem", display: "flex", textAlign: "left", flexDirection: "column", justifyContent: "center", lineHeight: "30px", width: "30%" };