feat: wire lobby task and VIP prefab flows and sync UI assets

This commit is contained in:
2026-09-06 18:46:37 +08:00
parent 842c68ef55
commit 9c4510697c
184 changed files with 8348 additions and 19133 deletions
@@ -310,6 +310,39 @@ function makeRuntime(config: RuntimeConfig = runtimeConfig(), entry = makeGameEn
return { runtime, wire, scene, clock, factoryConfigs, config };
}
test('VIP wire query response reaches canonical state and clears on login replacement',async()=>{
const {runtime,wire}=makeRuntime();await runtime.start();
wire.emit({type:'open',server:'ws://agent'});runtime.login(ACCOUNT);
const login=()=>wire.emit({type:'message',message:{route:'agent',rpc:'player_login',data:fixture('player-login-success.json')}});
login();runtime.getVipRooms(['123456']);
wire.emit({type:'message',message:{route:'agent',rpc:'getInfoByShortCode',data:{roomInfo:[{shortCode:123456,owner:'房主',playerList:[]}]}}});
assert.equal(runtime.state.vipRooms?.[0].shortCode,123456);
wire.emit({type:'message',message:{route:'agent',rpc:'getInfoByShortCode',data:{roomInfo:[]}}});
assert.deepEqual(runtime.state.vipRooms,[]);
login();assert.equal(runtime.state.vipRooms,undefined);runtime.stop();
});
test('task wire responses reach the store and claim does not invent reward balances',async()=>{
const {runtime,wire}=makeRuntime();await runtime.start();
wire.emit({type:'open',server:'ws://agent'});runtime.login(ACCOUNT);
wire.emit({type:'message',message:{route:'agent',rpc:'player_login',data:fixture('player-login-success.json')}});
runtime.getPlayerTasks();
wire.emit({type:'message',message:{route:'agent',rpc:'get_player_task',data:{tasks:[{taskid:7,title:'任务',award:'3',finish:'1',total:'1',state:'1'}]}}});
assert.equal(runtime.state.tasks?.[0].award,3);
const balance=runtime.state.players.entities[430511].roomcard;
runtime.claimTask(7);
wire.emit({type:'message',message:{route:'agent',rpc:'get_task_award',data:{taskid:'7',taskstate:0}}});
assert.equal(runtime.state.tasks?.[0].state,2);
assert.equal(runtime.state.players.entities[430511].taskstate,0);
assert.equal(runtime.state.players.entities[430511].roomcard,balance);
wire.emit({type:'message',message:{route:'agent',rpc:'update_roomcard',data:{roomcard:25}}});
assert.equal(runtime.state.players.entities[430511].roomcard,25);
wire.emit({type:'message',message:{route:'agent',rpc:'player_finish_task',data:{state:1}}});
assert.equal(runtime.state.players.entities[430511].taskstate,1);
wire.emit({type:'slow'});assert.throws(()=>runtime.getPlayerTasks(),/logged-in/);
runtime.stop();
});
test('UI observes canonical commits and unsubscribe is idempotent', async () => {
const { runtime, wire } = makeRuntime();
const seen: unknown[] = [];