Files
youle_cocos/cocoscreator_projects/scripts/verify-room-refactor-preview.mjs
joywayer 35216f75e7 feat: integrate room framework and isolated subgame bundles
Complete room UI and protocol integration, move game definitions and resources behind bundle entries, publish authoritative version XML, and document single-game builds. Include all current resource changes and experiment artifacts.
2026-09-09 03:13:18 +08:00

46 lines
4.7 KiB
JavaScript

/** Execute through Cocos MCP in the editor Game View. No business RPC is sent. */
export async function verifyRoomRefactorPreview(){
const e=await System.import('cc'),modules=Array.from(System.entries()).map(([,m])=>m);
const get=name=>{const value=modules.find(m=>m[name])?.[name];if(!value)throw Error('Missing compiled export '+name);return value;};
const assert=(value,message)=>{if(!value)throw Error(message);};
const tick=()=>new Promise(resolve=>setTimeout(resolve,80));
const load=uuid=>new Promise((resolve,reject)=>e.assetManager.loadAny(uuid,(error,asset)=>error?reject(error):resolve(asset)));
const scene=e.director.getScene(),startup=scene.getComponentInChildren('PlatformStartup');
assert(startup,'PlatformStartup required');startup.unsubscribe?.();startup.unsubscribe=null;startup.runtime.stop();startup.panel?.dispose();startup.panel=null;
const canvas=scene.getChildByName('Canvas'),composition=startup.getComponent('GameComposition');assert(composition,'abstract GameComposition resolves moved script');
for(const node of [...canvas.children])if(node.name==='Layer418_ChatPannel')node.destroy();await tick();
const definitions={erqiwang:e.js.getClassByName('GameEntry_erqiwang').definition,Game_Surface_3:e.js.getClassByName('GameEntry_Game_Surface_3').definition},created=[];
for(const [key,uuid]of [['erqiwang',composition.createRoom._uuid],['Game_Surface_3','584dbb85-4acc-4bea-9d9b-e0cbeb8741da']]){
const root=e.instantiate(await load(uuid));root.parent=canvas;const page=root.getComponent('CreateRoomPage'),packets=[];
assert(page&&page.__classname__!==null,key+' create page');
const cases=key==='erqiwang'?32:1;
for(let bits=0;bits<cases;bits++){
page.open({previousRoomtype:null,submit:value=>packets.push(value),cancel(){},reportError:message=>{throw Error(message);}});
if(key==='erqiwang')for(let group=0;group<5;group++){
const value=(bits>>group)&1,index=group<3?group*2+value:group+3;
page.options[index].isChecked=!!value||group<3;page.options[index].node.emit(e.Toggle.EventType.TOGGLE);
}
page.submitButton.node.emit(e.Button.EventType.CLICK);
}
assert(packets.length===cases,key+' actual submit count');
if(key==='erqiwang'){assert(packets.every(value=>typeof value==='string'&&/^[01]{5}000000$/.test(value)),'all erqiwang sends are eleven bits');assert(new Set(packets).size===32,'all erqiwang combinations distinct');}
else assert(Array.isArray(packets[0]),'template keeps array');
created.push({key,submissions:packets.length,format:typeof packets[0]});page.close();root.destroy();
}
const Chat=get('RoomChatPanel'),cache=get('roomAvatarCache');
const panel=new Chat(canvas,startup.roomChatPrefab,startup.chatPhrasePrefab,startup.chatHistoryPrefab,definitions.erqiwang.chat,{text(){},phrase(){},expression(){},voice(){},error:message=>{throw Error(message);},readAnnouncements(){}});
panel.open();panel.select('History');
const history=Array.from({length:50},(_,i)=>Object.freeze({id:i+1,kind:'text',sender:{nickname:'玩家'+i,avatar:''},text:'测试聊天 '+i}));
const state=messages=>({app:{phase:'logged-in'},room:{kind:'inside'},roomSocial:{history:messages,announcements:[]}});
panel.render(state(history),false,'');await tick();
const content=panel.content('History'),nodes=[...content.children],scroll=panel.scroll('History');scroll.scrollToTop(0);await tick();const offset=scroll.getScrollOffset().y;
const layout=content.getComponent(e.Layout),original=layout.updateLayout;let layouts=0,layoutChecks=0;layout.updateLayout=function(...args){layoutChecks++;if(this._layoutDirty||args[0])layouts++;return original.apply(this,args);};
const drawHistory=panel.renderHistory;let renderPasses=0;panel.renderHistory=function(messages){renderPasses++;return drawHistory.call(this,messages);};
const before=performance.now();for(let i=0;i<5;i++)panel.render(state([...history,{id:51,kind:'text',sender:{nickname:'新玩家',avatar:''},text:'追加消息'}]),false,'');await tick();
const elapsed=performance.now()-before;
assert(content.children.length===51,'one additional row');assert(nodes.every((node,i)=>content.children[i]===node),'all fifty existing row identities retained');assert(Math.abs(scroll.getScrollOffset().y-offset)<1,'scroll position retained while reading history');assert(renderPasses===1,'same-frame state changes must render history once');
layout.updateLayout=original;
const activeLeases=cache.leases;panel.dispose();await tick();assert(cache.leases===0,'avatar leases return to zero');
return {created,chat:{beforeRows:50,afterRows:51,retainedRows:50,renderPasses,layouts,layoutChecks,scrollPreserved:true,elapsedIncludingFrameWaitMs:elapsed},leases:{beforeDispose:activeLeases,afterDispose:cache.leases},environment:{userAgent:navigator.userAgent,width:e.view.getVisibleSize().width,height:e.view.getVisibleSize().height}};
}