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.
30 lines
2.1 KiB
JavaScript
30 lines
2.1 KiB
JavaScript
/** Run with Cocos MCP in Game View; no business packets are sent. */
|
|
export async function verifyVersionXmlPreview(){
|
|
const cc=await System.import('cc'),modules=Array.from(System.entries()).map(([,m])=>m);
|
|
const exported=name=>{const result=modules.find(m=>m[name])?.[name];if(!result)throw Error('Missing '+name);return result;};
|
|
const assert=(value,message)=>{if(!value)throw Error(message);};
|
|
const startup=cc.director.getScene().getComponentInChildren('PlatformStartup');
|
|
const selected=startup.getComponent('SubgameAssets');
|
|
assert(selected.versionManifest.gameid===startup.config.identity.gameid,'live game identity');
|
|
assert(selected.versionManifest.versionCode===startup.config.identity.version,'live numeric version');
|
|
let label;function find(n){for(const c of n.components)if(c instanceof cc.Label&&n.name==='版本显示')label=c.string;n.children.forEach(find);}find(cc.director.getScene());
|
|
assert(label==='v'+selected.versionManifest.version,'live display version');
|
|
const outcomes=[];
|
|
for(const key of ['erqiwang','Game_Surface_3']){
|
|
const node=new cc.Node('VersionContractTest');
|
|
try{const component=node.addComponent(exported('SubgameAssets'));component.gameKey=key;
|
|
const identity=await component.loadBuildIdentity();assert(identity.gameid===component.versionManifest.gameid,'selected XML identity');
|
|
outcomes.push({key,gameid:identity.gameid,versionCode:identity.version,version:component.displayVersion});
|
|
}finally{node.destroy();}
|
|
}
|
|
const Feedback=exported('FeedbackPanels');
|
|
const feedback=new Feedback(cc.director.getScene().getChildByName('Canvas'),{tips:startup.tipsPrefab,loading:startup.waitPrefab,reconnect:startup.reconnectPrefab,kick:startup.kickPrefab});
|
|
feedback.loadingNode.destroy();
|
|
await new Promise(resolve=>setTimeout(resolve,100));
|
|
feedback.dispose();
|
|
const invalid=Object.create(Feedback.prototype);invalid.loadingNode=new cc.Node('InvalidLiveLoading');
|
|
let rejected=false;try{invalid.renderLoading(false);}catch{rejected=true;}finally{invalid.loadingNode.destroy();}
|
|
assert(rejected,'invalid live panel must still reject');
|
|
return {label,games:outcomes,disposedScenePanel:true,invalidLivePanelRejected:true};
|
|
}
|