MatchMaster/.codex_tmp/guide-mask-preview.cjs
2026-09-10 17:09:05 +08:00

63 lines
3.4 KiB
JavaScript

const http = require('node:http');
const probe = String.raw`
(() => {
const panel = document.createElement('div');
panel.style.cssText = 'position:fixed;right:8px;top:40px;z-index:99999;background:white;color:black;padding:12px;font:14px monospace;max-width:420px';
panel.innerHTML = '<button id="test-enter">进入第8关测试</button><button id="test-guide">显示引导锤子</button><pre id="guide-state">waiting</pre>';
document.body.appendChild(panel);
const findMap = () => {
if (!window.cc || !cc.director || !cc.director.getScene()) return null;
const node = cc.find('Canvas/Game/GameNode/Map');
return node && node._components.find(c => typeof c.showPropGuideMask === 'function');
};
document.getElementById('test-guide').onclick = () => {
const map = findMap();
if (map && cc.fx.GameConfig.GM_INFO.level + 1 === 8) map.showPropGuideMask(8);
};
document.getElementById('test-enter').onclick = () => {
const config = cc.fx.GameConfig;
Object.assign(config.GM_INFO, {level:7,otherLevel:0,first:false,hammerFirst:false,hammerAmount:3});
// 验证页只检查本地交互,不向服务端写入道具消耗或测试埋点。
cc.fx.GameTool.setUserProp = () => {};
cc.fx.GameTool.shushu_Track = () => {};
cc.fx.GameTool.setDailyQuestInfo = () => {};
config.LEVEL_INFO_init(true,0,false);
};
setInterval(() => {
const map = findMap();
if (!map) return;
const mask = map.node.parent.getChildByName('Mask');
const guide = map.propGuideMask;
const event = guide && guide.getChildByName('bottom').getChildByName('destroyBtn').getComponent(cc.Button).clickEvents[0];
document.getElementById('guide-state').textContent = JSON.stringify({
level: cc.fx.GameConfig.GM_INFO.level + 1,
className: cc.js.getClassName(map),
guideVisible: !!guide, guideNodes: map.node.parent.children.filter(n => n.name === 'GuideMask').length,
guideHammerPending: map.guideHammerPending, hammer: map.hammer, maskVisible: mask.active,
hammerAmount: cc.fx.GameConfig.GM_INFO.hammerAmount,
guideEvent: event && {handler:event.handler, data:event.customEventData, component:event.component},
hasCancelGuard: map.cancleHammer.toString().includes('guideHammerPending')
}, null, 2);
}, 150);
})();`;
const server = http.createServer((req, res) => {
if (req.url === '/__guide_mask_probe.js') {
res.writeHead(200, {'Content-Type':'application/javascript'}); res.end(probe); return;
}
const upstream = http.request({hostname:'localhost',port:7456,path:req.url,method:req.method,
headers:{...req.headers, host:'localhost:7456','accept-encoding':'identity'}}, response => {
const chunks=[];
response.on('data',chunk=>chunks.push(chunk));
response.on('end',()=>{
let body=Buffer.concat(chunks);
const headers={...response.headers}; delete headers['content-length']; delete headers['transfer-encoding'];
if ((headers['content-type']||'').includes('text/html') && req.url === '/') {
body=Buffer.from(body.toString().replace('</body>','<script src="/__guide_mask_probe.js"></script></body>'));
}
res.writeHead(response.statusCode,headers);res.end(body);
});
});
upstream.on('error',error=>{res.writeHead(502);res.end(error.message);});req.pipe(upstream);
});
server.listen(7469,'127.0.0.1',()=>console.log('GuideMask browser verification: http://127.0.0.1:7469/'));