mars-xxl/dist/assets/index-e57edd61.js

21 lines
40 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import{P as f}from"./phaser-d7bec1a5.js";(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))s(i);new MutationObserver(i=>{for(const a of i)if(a.type==="childList")for(const o of a.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&s(o)}).observe(document,{childList:!0,subtree:!0});function e(i){const a={};return i.integrity&&(a.integrity=i.integrity),i.referrerPolicy&&(a.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?a.credentials="include":i.crossOrigin==="anonymous"?a.credentials="omit":a.credentials="same-origin",a}function s(i){if(i.ep)return;i.ep=!0;const a=e(i);fetch(i.href,a)}})();class w extends f.Events.EventEmitter{constructor(t,e){super(),this.scene=t,this.config=e,this.board=[],this.sprites=[],this.selectedCell=null,this.animating=!1,this.elementsData={},this.selectionBorder=null,this.isDragging=!1,this.dragStart=null,this.dragStartCell=null,this.processElementsConfig()}processElementsConfig(){this.config.elements.forEach(t=>{this.elementsData[t.id]=t})}create(){this.createBoard(),this.createSprites(),this.setupInput(),this.createSelectionBorder()}createBoard(){this.config.levelData&&this.config.levelData.board?this.board=this.deepCopyBoard(this.config.levelData.board):this.generateRandomBoard()}deepCopyBoard(t){return t.map(e=>e.map(s=>({...s})))}generateRandomBoard(){const t=this.config.levelData?this.config.levelData.elementTypes:4,e=Object.keys(this.elementsData).slice(0,t);for(let s=0;s<this.config.height;s++){this.board[s]=[];for(let i=0;i<this.config.width;i++){let a,o=0;do a=e[Math.floor(Math.random()*e.length)],o++;while(o<50&&this.wouldCreateMatch(i,s,a));this.board[s][i]={type:a,obstacle:null,special:!1}}}}wouldCreateMatch(t,e,s){return!!(t>=2&&this.board[e][t-1]&&this.board[e][t-1].type===s&&this.board[e][t-2]&&this.board[e][t-2].type===s||e>=2&&this.board[e-1]&&this.board[e-1][t]&&this.board[e-1][t].type===s&&this.board[e-2]&&this.board[e-2][t]&&this.board[e-2][t].type===s)}createSprites(){this.sprites=[];for(let t=0;t<this.config.height;t++){this.sprites[t]=[];for(let e=0;e<this.config.width;e++){const s=this.board[t][e],i=this.createElementSprite(e,t,s);this.sprites[t][e]=i}}}createElementSprite(t,e,s){const i=this.config.startX+t*this.config.cellSize+this.config.cellSize/2,a=this.config.startY+e*this.config.cellSize+this.config.cellSize/2,o=this.elementsData[s.type],n=o?o.sprite:s.type,r=this.scene.add.image(i,a,n);return r.setDisplaySize(this.config.cellSize-4,this.config.cellSize-4),r.setInteractive({useHandCursor:!0}),r.gridX=t,r.gridY=e,r.elementType=s.type,r.originalScale=r.scaleX,r}createSelectionBorder(){this.selectionBorder=this.scene.add.graphics(),this.selectionBorder.lineStyle(3,16776960,1),this.selectionBorder.strokeRoundedRect(0,0,this.config.cellSize,this.config.cellSize,4),this.selectionBorder.setVisible(!1)}setupInput(){this.gameArea=this.scene.add.rectangle(this.config.startX+this.config.width*this.config.cellSize/2,this.config.startY+this.config.height*this.config.cellSize/2,this.config.width*this.config.cellSize,this.config.height*this.config.cellSize,0,0),this.gameArea.setInteractive(),this.gameArea.on("pointerdown",t=>{if(this.animating)return;const e=this.getCellFromPosition(t.x,t.y);e&&(this.dragStart={x:t.x,y:t.y},this.dragStartCell=e,this.isDragging=!1,this.selectCell(e.x,e.y))}),this.gameArea.on("pointermove",t=>{if(this.animating||!this.dragStart)return;f.Math.Distance.Between(this.dragStart.x,this.dragStart.y,t.x,t.y)>20&&!this.isDragging&&(this.isDragging=!0)}),this.gameArea.on("pointerup",t=>{if(!this.animating){if(this.isDragging&&this.dragStartCell){const e=t.x-this.dragStart.x,s=t.y-this.dragStart.y;if(Math.sqrt(e*e+s*s)>30){let a=this.dragStartCell.x,o=this.dragStartCell.y;Math.abs(e)>Math.abs(s)?e>0?a=this.dragStartCell.x+1:a=this.dragStartCell.x-1:s>0?o=this.dragStartCell.y+1:o=this.dragStartCell.y-1,a>=0&&a<this.config.width&&o>=0&&o<this.config.height?this.attemptSwap(this.dragStartCell.x,this.dragStartCell.y,a,o):this.deselectCell()}else this.deselectCell()}else!this.isDragging&&this.dragStartCell&&this.selectedCell&&(this.selectedCell.x!==this.dragStartCell.x||this.selectedCell.y!==this.dragStartCell.y)&&(this.isAdjacent(this.selectedCell.x,this.selectedCell.y,this.dragStartCell.x,this.dragStartCell.y)?this.attemptSwap(this.selectedCell.x,this.selectedCell.y,this.dragStartCell.x,this.dragStartCell.y):this.selectCell(this.dragStartCell.x,this.dragStartCell.y));this.dragStart=null,this.dragStartCell=null,this.isDragging=!1}})}getCellFromPosition(t,e){const s=t-this.config.startX,i=e-this.config.startY;if(s<0||i<0)return null;const a=Math.floor(s/this.config.cellSize),o=Math.floor(i/this.config.cellSize);return a>=0&&a<this.config.width&&o>=0&&o<this.config.height?{x:a,y:o}:null}selectCell(t,e){this.deselectCell(),this.selectedCell={x:t,y:e};const s=this.sprites[e][t];this.scene.tweens.add({targets:s,scaleX:s.originalScale*1.1,scaleY:s.originalScale*1.1,duration:100,ease:"Power2"});const i=this.config.startX+t*this.config.cellSize,a=this.config.startY+e*this.config.cellSize;this.selectionBorder.setPosition(i,a),this.selectionBorder.setVisible(!0),this.scene.tweens.add({targets:this.selectionBorder,alpha:.7,duration:300,yoyo:!0,repeat:-1})}deselectCell(){if(this.selectedCell){const t=this.sprites[this.selectedCell.y][this.selectedCell.x];this.scene.tweens.add({targets:t,scaleX:t.originalScale,scaleY:t.originalScale,duration:100,ease:"Power2"}),this.selectedCell=null}this.selectionBorder.setVisible(!1),this.scene.tweens.killTweensOf(this.selectionBorder),this.selectionBorder.setAlpha(1)}isAdjacent(t,e,s,i){const a=Math.abs(t-s),o=Math.abs(e-i);return a===1&&o===0||a===0&&o===1}attemptSwap(t,e,s,i){this.animating=!0,this.swapElements(t,e,s,i);const a=this.findMatches();a.length>0?(this.deselectCell(),this.animateSwap(t,e,s,i,()=>{this.processMatches(a)})):(this.swapElements(t,e,s,i),this.playInvalidMoveAnimation(t,e,s,i,()=>{this.animating=!1,this.deselectCell()}))}playInvalidMoveAnimation(t,e,s,i,a){const o=this.sprites[e][t],n=this.sprites[i][s],r=this.config.startX+t*this.config.cellSize+this.config.cellSize/2,l=this.config.startY+e*this.config.cellSize+this.config.cellSize/2,h=this.config.startX+s*this.config.cellSize+this.config.cellSize/2,g=this.config.startY+i*this.config.cellSize+this.config.cellSize/2,c=10,d=h-r>0?c:-c,u=g-l>0?c:-c,S=-d,x=-u;let M=0;const b=()=>{M++,M===2&&a&&a()};this.scene.tweens.add({targets:o,x:r+(Math.abs(d)>Math.abs(u)?d:0),y:l+(Math.abs(u)>Math.abs(d)?u:0),duration:100,yoyo:!0,ease:"Power2",onComplete:b}),this.scene.tweens.add({targets:n,x:h+(Math.abs(S)>Math.abs(x)?S:0),y:g+(Math.abs(x)>Math.abs(S)?x:0),duration:100,yoyo:!0,ease:"Power2",onComplete:b})}swapElements(t,e,s,i){const a=this.board[e][t];this.board[e][t]=this.board[i][s],this.board[i][s]=a}animateSwap(t,e,s,i,a){const o=this.sprites[e][t],n=this.sprites[i][s],r=this.config.startX+t*this.config.cellSize+this.config.cellSize/2,l=this.config.startY+e*this.config.cellSize+this.config.cellSize/2,h=this.config.startX+s*this.config.cellSize+this.config.cellSize/2,g=this.config.startY+i*this.config.cellSize+this.config.cellSize/2;let c=0;const d=()=>{c++,c===2&&(this.sprites[e][t]=n,this.sprites[i][s]=o,o.gridX=s,o.gridY=i,o.elementType=this.board[i][s].type,n.gridX=t,n.gridY=e,n.elementType=this.board[e][t].type,a&&a())};this.scene.tweens.add({targets:o,x:h,y:g,duration:200,ease:"Power2",onComplete:d}),this.scene.tweens.add({targets:n,x:r,y:l,duration:200,ease:"Power2",onComplete:d})}findMatches(){const t=[];for(let i=0;i<this.config.height;i++)for(let a=0;a<this.config.width-2;a++){const o=this.board[i][a].type;if(o&&this.board[i][a+1].type===o&&this.board[i][a+2].type===o){const n=[];let r=a;for(;r<this.config.width&&this.board[i][r].type===o;)n.push({x:r,y:i}),r++;n.length>=3&&(t.push({type:"horizontal",cells:n,elementType:o}),a=r-1)}}for(let i=0;i<this.config.width;i++)for(let a=0;a<this.config.height-2;a++){const o=this.board[a][i].type;if(o&&this.board[a+1][i].type===o&&this.board[a+2][i].type===o){const n=[];let r=a;for(;r<this.config.height&&this.board[r][i].type===o;)n.push({x:i,y:r}),r++;n.length>=3&&(t.push({type:"vertical",cells:n,elementType:o}),a=r-1)}}const e=new Set,s=[];if(t.forEach(i=>{i.cells.forEach(a=>{e.add(`${a.x},${a.y}`)})}),e.size>0){const i=Array.from(e).map(a=>{const[o,n]=a.split(",").map(Number);return{x:o,y:n}});s.push(i)}return s}processMatches(t){if(!t||t.length===0)return;let e=0,s=0,i=0;t.forEach(n=>{n.forEach(r=>{e++,s+=this.config.startX+r.x*this.config.cellSize+this.config.cellSize/2,i+=this.config.startY+r.y*this.config.cellSize+this.config.cellSize/2})}),e>0&&(s/=e,i/=e);const a=t.flat(),o=this.detectComboType(a);this.emit("match",{matches:t,elements:a,centerX:s,centerY:i,comboType:o,elementCount:e}),this.animateMatches(t,()=>{this.applyGravity(()=>{this.fillEmptySpaces(()=>{const n=this.findMatches();n.length>0?this.processMatches(n):(this.animating=!1,this.emit("moveComplete"),this.hasPossibleMoves()||this.emit("noMatches"))})})})}detectComboType(t){if(t.length<4)return"normal";const e=new Map;t.forEach(s=>{const i=`${s.x},${s.y}`;e.set(i,s)});for(const s of t){let i=1,a=1;for(let o=s.x-1;o>=0&&e.has(`${o},${s.y}`);o--)i++;for(let o=s.x+1;o<this.config.width&&e.has(`${o},${s.y}`);o++)i++;for(let o=s.y-1;o>=0&&e.has(`${s.x},${o}`);o--)a++;for(let o=s.y+1;o<this.config.height&&e.has(`${s.x},${o}`);o++)a++;if(i>=3&&a>=3)return i>=5||a>=5?"mega":i>=4&&a>=4?"cross":"tshape"}return t.length>=6?"long_chain":t.length>=4?"four_match":"normal"}animateMatches(t,e){let s=0;t.forEach(i=>{i.forEach(a=>{const o=this.sprites[a.y][a.x];s++,this.scene.tweens.add({targets:o,alpha:0,scaleX:o.originalScale*1.5,scaleY:o.originalScale*1.5,duration:300,ease:"Power2",onComplete:()=>{o.destroy(),this.sprites[a.y][a.x]=null,this.board[a.y][a.x]=null,s--,s===0&&e&&e()}})})})}applyGravity(t){const e=[];for(let s=0;s<this.config.width;s++){let i=this.config.height-1;for(let a=this.config.height-1;a>=0;a--)this.board[a][s]!==null&&(a!==i&&(e.push({from:{x:s,y:a},to:{x:s,y:i},sprite:this.sprites[a][s],element:this.board[a][s]}),this.board[i][s]=this.board[a][s],this.sprites[i][s]=this.sprites[a][s],this.board[a][s]=null,this.sprites[a][s]=null),i--)}if(e.length>0){let s=e.length;e.forEach(i=>{const a=this.config.startY+i.to.y*this.config.cellSize+this.config.cellSize/2;this.scene.tweens.add({targets:i.sprite,y:a,duration:300,ease:"Power2",onComplete:()=>{i.sprite.gridX=i.to.x,i.sprite.gridY=i.to.y,s--,s===0&&t&&t()}})})}else t&&t()}fillEmptySpaces(t){const e=[];for(let s=0;s<this.config.width;s++)for(let i=0;i<this.config.height;i++)if(this.board[i][s]===null){const a=Object.keys(this.elementsData),o=this.config.levelData?this.config.levelData.elementTypes:4,n=a[Math.floor(Math.random()*Math.min(a.length,o))];this.board[i][s]={type:n,obstacle:null,special:!1};const r=this.config.startY-this.config.cellSize*2,l=this.config.startY+i*this.config.cellSize+this.config.cellSize/2,h=this.config.startX+s*this.config.cellSize+this.config.cellSize/2,g=this.elementsData[n],c=g?g.sprite:n,d=this.scene.add.image(h,r,c);d.setDisplaySize(this.config.cellSize-4,this.config.cellSize-4),d.gridX=s,d.gridY=i,d.elementType=n,d.originalScale=d.scaleX,this.sprites[i][s]=d,e.push({sprite:d,targetY:l})}if(e.length>0){let s=e.length;e.forEach(({sprite:i,targetY:a})=>{this.scene.tweens.add({targets:i,y:a,duration:400,ease:"Bounce",onComplete:()=>{s--,s===0&&t&&t()}})})}else t&&t()}hasPossibleMoves(){for(let t=0;t<this.config.height;t++)for(let e=0;e<this.config.width;e++){if(e<this.config.width-1){this.swapElements(e,t,e+1,t);const s=this.findMatches().length>0;if(this.swapElements(e,t,e+1,t),s)return!0}if(t<this.config.height-1){this.swapElements(e,t,e,t+1);const s=this.findMatches().length>0;if(this.swapElements(e,t,e,t+1),s)return!0}}return!1}regenerateBoard(){this.sprites.forEach(t=>{t.forEach(e=>{e&&e.destroy()})}),this.selectionBorder&&this.selectionBorder.destroy(),this.gameArea&&this.gameArea.destroy(),this.generateRandomBoard(),this.createSprites(),this.createSelectionBorder(),this.setupInput(),this.selectedCell=null}}class B{constructor(t){this.config=t.levelGeneration,this.difficulties=this.config.difficulties,this.progressionRules=this.config.progressionRules,this.validationRules=this.config.validationRules}generateLevel(t){const e=this.getDifficultyForLevel(t),s={level:t,difficulty:e.name,elementTypes:e.elementTypes,maxMoves:Math.max(10,e.maxMoves-Math.floor(t/10)),targetScore:e.targetScore+(t-1)*this.progressionRules.targetScoreIncrease,objectives:this.generateObjectives(e,t),obstacles:e.obstacles||[],specialElementChance:e.specialElementChance,board:this.generateBoard(e,t)};return this.validationRules.ensureSolvable&&(s.board=this.ensureSolvableBoard(s)),s}getDifficultyForLevel(t){for(const e of this.progressionRules.difficultyProgression)if(t>=e.levelRange[0]&&t<=e.levelRange[1])return this.difficulties[e.difficulty-1];return this.difficulties[this.difficulties.length-1]}generateObjectives(t,e){const s=[];if(s.push({type:"score",target:t.targetScore+(e-1)*this.progressionRules.targetScoreIncrease}),t.level>=2){const i=["red","blue","green","yellow","purple","orange"],a=i[e%i.length];s.push({type:"collect",elementId:a,count:5+t.level*3})}return t.level>=3&&t.obstacles.length>0&&s.push({type:"clearObstacles",count:3+t.level}),s}generateBoard(t,e){const s=this.config.boardSize.width,i=this.config.boardSize.height,a=[],n=["red","blue","green","yellow","purple","orange"].slice(0,t.elementTypes);for(let r=0;r<i;r++){a[r]=[];for(let l=0;l<s;l++){let h,g=0;do h=this.getRandomElement(n),g++;while(g<50&&this.wouldCreateMatch(a,l,r,h));a[r][l]={type:h,obstacle:this.shouldPlaceObstacle(t,l,r,e),special:!1}}}return a}getRandomElement(t){return t[Math.floor(Math.random()*t.length)]}wouldCreateMatch(t,e,s,i){return!!(e>=2&&t[s][e-1]&&t[s][e-1].type===i&&t[s][e-2]&&t[s][e-2].type===i||s>=2&&t[s-1]&&t[s-1][e]&&t[s-1][e].type===i&&t[s-2]&&t[s-2][e]&&t[s-2][e].type===i)}shouldPlaceObstacle(t,e,s,i){if(!t.obstacles||t.obstacles.length===0)return null;const a=.1+(t.level-1)*.05,n=e===0||e===this.config.boardSize.width-1||s===0||s===this.config.boardSize.height-1?a*1.5:a;return Math.random()<n?t.obstacles[Math.floor(Math.random()*t.obstacles.length)]:null}ensureSolvableBoard(t){let e=0,s=t.board;for(;e<this.validationRules.maxGenerationAttempts;){if(this.isBoardSolvable(s,t))return s;s=this.generateBoard(this.getDifficultyForLevel(t.level),t.level),e++}return console.warn(`无法在 ${this.validationRules.maxGenerationAttempts} 次尝试内生成可解的棋盘,使用当前棋盘`),s}isBoardSolvable(t,e){if(this.findPossibleMoves(t).length<3)return!1;for(const i of e.objectives)if(i.type==="collect"&&this.countElementOnBoard(t,i.elementId)<i.count)return!1;return!0}findPossibleMoves(t){const e=[],s=t[0].length,i=t.length;for(let a=0;a<i;a++)for(let o=0;o<s;o++){if(o<s-1){const n=this.copyBoard(t);this.swapElements(n,o,a,o+1,a),this.hasMatches(n)&&e.push({x1:o,y1:a,x2:o+1,y2:a})}if(a<i-1){const n=this.copyBoard(t);this.swapElements(n,o,a,o,a+1),this.hasMatches(n)&&e.push({x1:o,y1:a,x2:o,y2:a+1})}}return e}copyBoard(t){return t.map(e=>e.map(s=>({...s})))}swapElements(t,e,s,i,a){const o=t[s][e];t[s][e]=t[a][i],t[a][i]=o}hasMatches(t){const e=t[0].length,s=t.length;for(let i=0;i<s;i++)for(let a=0;a<e-2;a++)if(t[i][a].type===t[i][a+1].type&&t[i][a].type===t[i][a+2].type)return!0;for(let i=0;i<s-2;i++)for(let a=0;a<e;a++)if(t[i][a].type===t[i+1][a].type&&t[i][a].type===t[i+2][a].type)return!0;return!1}countElementOnBoard(t,e){let s=0;for(const i of t)for(const a of i)a.type===e&&s++;return s}}class C extends f.Scene{constructor(){super({key:"GameScene"}),this.reset(),this.isPortrait=!1,this.uiScale=1,this.gameAreaBounds={}}init(t){this.shouldContinue=t&&t.continue}reset(){this.currentLevel=1,this.score=0,this.moves=0,this.maxMoves=30,this.cheatMode=!1}create(){this.shouldContinue?this.loadSavedProgress():this.reset(),this.calculateResponsiveLayout(),this.elementsConfig=this.cache.json.get("elements"),this.levelConfig=this.cache.json.get("levelgen"),this.createUI(),this.levelGenerator=new B(this.levelConfig),this.generateLevel(),this.scale.on("orientationchange",this.handleOrientationChange,this)}calculateResponsiveLayout(){const{width:t,height:e}=this.cameras.main;this.isPortrait=e>t;const s=400,i=600;this.uiScale=Math.min(t/s,e/i),this.isPortrait?this.gameAreaBounds={headerHeight:120*this.uiScale,footerHeight:80*this.uiScale,sideMargin:20*this.uiScale,boardStartY:140*this.uiScale}:this.gameAreaBounds={headerHeight:80*this.uiScale,footerHeight:60*this.uiScale,sideMargin:120*this.uiScale,boardStartY:100*this.uiScale}}createUI(){this.cameras.main,this.createBackground(),this.isPortrait?this.createPortraitUI():this.createLandscapeUI()}createBackground(){const{width:t,height:e}=this.cameras.main,s=this.add.graphics();s.fillGradientStyle(1713455,1713455,2899536,2899536,1),s.fillRect(0,0,t,e),this.createBackgroundDecorations()}createBackgroundDecorations(){const{width:t,height:e}=this.cameras.main;for(let s=0;s<6;s++){const i=Math.random()*t,a=Math.random()*e,o=20+Math.random()*40,n=.05+Math.random()*.1,r=this.add.circle(i,a,o,16777215,n);this.tweens.add({targets:r,scaleX:1.2,scaleY:1.2,duration:3e3+Math.random()*2e3,yoyo:!0,repeat:-1,ease:"Sine.easeInOut"})}}createPortraitUI(){const{width:t,height:e}=this.cameras.main,s=Math.max(16*this.uiScale,14),i=Math.max(20*this.uiScale,18);this.createTopBar(t,i,s),this.createBottomBar(t,e,s)}createLandscapeUI(){const{width:t,height:e}=this.cameras.main,s=Math.max(14*this.uiScale,12),i=Math.max(18*this.uiScale,16);this.createSidePanel(i,s),this.createControlPanel(t,e,s)}createTopBar(t,e,s){this.add.rectangle(t/2,this.gameAreaBounds.headerHeight/2,t,this.gameAreaBounds.headerHeight,3426654,.9).setStrokeStyle(2,3447003,.3),this.levelText=this.add.text(t/2,30*this.uiScale,`关卡 ${this.currentLevel}`,{fontSize:`${e}px`,fill:"#ffffff",fontFamily:"Arial",fontWeight:"bold"}).setOrigin(.5);const a=60*this.uiScale;this.scoreText=this.add.text(60*this.uiScale,a,`分数: ${this.score}`,{fontSize:`${s}px`,fill:"#3498db",fontFamily:"Arial",fontWeight:"bold"}).setOrigin(0,.5),this.targetText=this.add.text(t-60*this.uiScale,a,"目标: 1000分",{fontSize:`${s}px`,fill:"#e74c3c",fontFamily:"Arial",fontWeight:"bold"}).setOrigin(1,.5);const o=90*this.uiScale;this.movesText=this.add.text(60*this.uiScale,o,`剩余步数: ${this.maxMoves}`,{fontSize:`${s}px`,fill:"#f39c12",fontFamily:"Arial"}).setOrigin(0,.5),this.createProgressBar(t-180*this.uiScale,o,120*this.uiScale)}createBottomBar(t,e,s){const i=e-this.gameAreaBounds.footerHeight/2;this.add.rectangle(t/2,i,t,this.gameAreaBounds.footerHeight,3426654,.9).setStrokeStyle(2,3447003,.3),this.createStyledButton(t/2-120*this.uiScale,i,"返回",()=>{this.saveProgress(),this.scene.start("MenuScene")}),this.createStyledButton(t/2,i,"重置",()=>{this.gameBoard&&this.gameBoard.regenerateBoard()}),this.createCheatModeToggle(t/2+120*this.uiScale,i)}createSidePanel(t,e){const{height:s}=this.cameras.main,i=60*this.uiScale,a=100*this.uiScale;this.add.rectangle(i,s/2,a,s-40*this.uiScale,3426654,.9).setStrokeStyle(2,3447003,.3),this.levelText=this.add.text(i,80*this.uiScale,`关卡
${this.currentLevel}`,{fontSize:`${t}px`,fill:"#ffffff",fontFamily:"Arial",fontWeight:"bold",align:"center"}).setOrigin(.5),this.scoreText=this.add.text(i,160*this.uiScale,`分数
${this.score}`,{fontSize:`${e}px`,fill:"#3498db",fontFamily:"Arial",fontWeight:"bold",align:"center"}).setOrigin(.5),this.targetText=this.add.text(i,240*this.uiScale,`目标
1000分`,{fontSize:`${e}px`,fill:"#e74c3c",fontFamily:"Arial",fontWeight:"bold",align:"center"}).setOrigin(.5),this.movesText=this.add.text(i,320*this.uiScale,`步数
${this.maxMoves}`,{fontSize:`${e}px`,fill:"#f39c12",fontFamily:"Arial",fontWeight:"bold",align:"center"}).setOrigin(.5)}createControlPanel(t,e,s){const i=t-60*this.uiScale,a=100*this.uiScale;this.add.rectangle(i,e/2,a,e-40*this.uiScale,3426654,.9).setStrokeStyle(2,3447003,.3);const n=70*this.uiScale,r=e/2-n;this.createStyledButton(i,r,"返回",()=>{this.saveProgress(),this.scene.start("MenuScene")}),this.createStyledButton(i,r+n,"重置",()=>{this.gameBoard&&this.gameBoard.regenerateBoard()}),this.createCheatModeToggle(i,r+n*2)}createProgressBar(t,e,s){this.progressBg=this.add.rectangle(t,e,s,8*this.uiScale,2899536),this.progressBg.setStrokeStyle(1,3426654),this.progressBar=this.add.rectangle(t-s/2,e,0,6*this.uiScale,3066993),this.progressBar.setOrigin(0,.5)}createStyledButton(t,e,s,i){const a=80*this.uiScale,o=35*this.uiScale,n=Math.max(14*this.uiScale,12),r=this.add.rectangle(t,e,a,o,3447003);r.setStrokeStyle(2,2719929),r.setInteractive({useHandCursor:!0});const l=this.add.text(t,e,s,{fontSize:`${n}px`,fill:"#ffffff",fontFamily:"Arial",fontWeight:"bold"}).setOrigin(.5);return r.on("pointerover",()=>{r.setFillStyle(2719929),this.tweens.add({targets:[r,l],scaleX:1.05,scaleY:1.05,duration:100})}),r.on("pointerout",()=>{r.setFillStyle(3447003),this.tweens.add({targets:[r,l],scaleX:1,scaleY:1,duration:100})}),r.on("pointerdown",i),{button:r,text:l}}createCheatModeToggle(t,e){const s=80*this.uiScale,i=35*this.uiScale,a=Math.max(12*this.uiScale,10),o=this.add.rectangle(t,e,s,i,this.cheatMode?15105570:8359053);o.setStrokeStyle(2,this.cheatMode?13849600:9807270),o.setInteractive({useHandCursor:!0});const n=this.add.text(t,e,this.getCheatModeText(),{fontSize:`${a}px`,fill:"#ffffff",fontFamily:"Arial",fontWeight:"bold",align:"center"}).setOrigin(.5);return this.cheatToggleButton=o,this.cheatToggleText=n,o.on("pointerover",()=>{o.setFillStyle(this.cheatMode?13849600:9807270)}),o.on("pointerout",()=>{this.updateCheatModeToggle()}),o.on("pointerdown",()=>{this.toggleCheatMode()}),{button:o,text:n}}getCheatModeText(){return this.cheatMode?`作弊
开启`:`作弊
关闭`}toggleCheatMode(){this.cheatMode=!this.cheatMode,this.updateCheatModeToggle(),this.saveProgress()}updateCheatModeToggle(){!this.cheatToggleButton||!this.cheatToggleText||(this.cheatToggleButton.setFillStyle(this.cheatMode?15105570:8359053),this.cheatToggleButton.setStrokeStyle(2,this.cheatMode?13849600:9807270),this.cheatToggleText.setText(this.getCheatModeText()))}generateLevel(){this.currentLevelData=this.levelGenerator.generateLevel(this.currentLevel),this.shouldContinue?this.maxMoves=this.currentLevelData.maxMoves:(this.maxMoves=this.currentLevelData.maxMoves,this.moves=this.maxMoves),this.shouldContinue?(this.createGameBoard(),this.shouldContinue=!1):this.showLevelStartDialog(),this.updateUI()}createGameBoard(){const{width:t,height:e}=this.cameras.main;let s,i,a;const o=this.levelConfig.levelGeneration.boardSize.width,n=this.levelConfig.levelGeneration.boardSize.height;if(this.isPortrait){const l=t-this.gameAreaBounds.sideMargin*2,h=e-this.gameAreaBounds.boardStartY-this.gameAreaBounds.footerHeight-20*this.uiScale,g=l/o,c=h/n;s=Math.min(g,c)*.95;const d=o*s,u=n*s;i=(t-d)/2,a=this.gameAreaBounds.boardStartY+(h-u)/2}else{const l=t-this.gameAreaBounds.sideMargin*2,h=e-this.gameAreaBounds.headerHeight-this.gameAreaBounds.footerHeight-40*this.uiScale,g=l/o,c=h/n;s=Math.min(g,c)*.95;const d=o*s,u=n*s;i=(t-d)/2,a=this.gameAreaBounds.headerHeight+(h-u)/2+20*this.uiScale}s=Math.max(s,35*this.uiScale);const r={width:o,height:n,cellSize:s,startX:i,startY:a,elements:this.elementsConfig.elements,levelData:this.currentLevelData};this.gameBoard=new w(this,r),this.gameBoard.create(),this.gameBoard.on("match",this.onMatch,this),this.gameBoard.on("moveComplete",this.onMoveComplete,this),this.gameBoard.on("noMatches",this.onNoMatches,this)}handleOrientationChange(){this.calculateResponsiveLayout(),this.children.removeAll(),this.createUI(),this.gameBoard&&(this.gameBoard.destroy(),this.createGameBoard())}onMatch(t){let e=t.elements.length*10,s=1,i="";switch(t.comboType){case"tshape":s=2,i="T字组合";break;case"cross":s=3,i="十字组合!";break;case"mega":s=4,i="超级组合!";break;case"long_chain":s=2.5,i="长链组合!";break;case"four_match":s=1.5,i="四连消除!";break;default:i=""}const a=Math.floor(e*s);this.score+=a,this.showScorePopup(t.centerX,t.centerY,a,i),this.updateUI()}onMoveComplete(){this.cheatMode||this.moves--,this.updateUI(),this.saveProgress(),this.score>=this.currentLevelData.targetScore?this.levelComplete():this.moves<=0&&this.gameOver()}onNoMatches(){console.log("没有可消除的组合,重新生成棋盘"),this.gameBoard.regenerateBoard()}showScorePopup(t,e,s,i=""){const a=Math.max(18*this.uiScale,16),o=Math.max(14*this.uiScale,12),n=this.add.text(t,e,`+${s}`,{fontSize:`${a}px`,fill:"#ffff00",fontFamily:"Arial",fontWeight:"bold",stroke:"#333333",strokeThickness:2}).setOrigin(.5);if(this.tweens.add({targets:n,y:e-50*this.uiScale,alpha:0,duration:1e3,ease:"Power2",onComplete:()=>{n.destroy()}}),i){const r=this.add.text(t,e-50*this.uiScale,i,{fontSize:`${o}px`,fill:"#ffffff",fontFamily:"Arial",fontWeight:"bold",stroke:"#333333",strokeThickness:2}).setOrigin(.5);this.tweens.add({targets:r,y:e-100*this.uiScale,alpha:0,duration:1e3,ease:"Power2",onComplete:()=>{r.destroy()}})}}updateUI(){if(!this.scoreText||!this.movesText||!this.levelText||!this.targetText){console.log("UI元素尚未创建跳过更新");return}if(this.scoreText.setText(`分数: ${this.score}`),this.movesText.setText(`剩余步数: ${this.moves}`),this.updateCheatModeToggle(),this.isPortrait){this.levelText.setText(`关卡 ${this.currentLevel}`);const t=this.currentLevelData?this.currentLevelData.difficulty:"简单";this.targetText.setText(`目标: ${this.currentLevelData.targetScore}分 (${t})`)}else{this.levelText.setText(`关卡
${this.currentLevel}`);const t=this.currentLevelData?this.currentLevelData.difficulty:"简单";this.targetText.setText(`目标
${this.currentLevelData.targetScore}
(${t})`)}if(this.progressBar&&this.progressBg&&this.currentLevelData){const t=this.score/this.currentLevelData.targetScore,e=this.progressBg.width-4;this.progressBar.width=Math.min(e,e*t)}}levelComplete(){this.currentLevel++,this.saveProgress(),this.showLevelCompleteDialog()}gameOver(){this.saveProgress(),this.showGameOverDialog()}showLevelCompleteDialog(){const{width:t,height:e}=this.cameras.main,s=this.uiScale;this.add.rectangle(0,0,t,e,0,.7).setOrigin(0);const a=280*s,o=200*s;this.add.rectangle(t/2,e/2,a,o,16777215).setStrokeStyle(2,3066993);const r=this.currentLevel>7,l=r?"感谢公主游玩,火星消消乐 1.0.1 已经通关啦!":"关卡完成!";this.add.text(t/2,e/2-60*s,l,{fontSize:`${24*s}px`,fill:"#2ecc71",fontFamily:"Arial",fontWeight:"bold"}).setOrigin(.5),this.add.text(t/2,e/2-20*s,`最终分数: ${this.score}`,{fontSize:`${18*s}px`,fill:"#333333",fontFamily:"Arial"}).setOrigin(.5),r?this.createStyledButton(t/2,e/2+40*s,"返回菜单",()=>{this.clearSavedProgress(),this.scene.start("MenuScene")}):(this.createStyledButton(t/2-60*s,e/2+40*s,"下一关",()=>{this.cleanupCurrentLevel(),this.score=0,this.shouldContinue=!1,this.currentLevelData=this.levelGenerator.generateLevel(this.currentLevel),this.maxMoves=this.currentLevelData.maxMoves,this.moves=this.maxMoves,this.updateUI(),this.saveProgress(),this.showLevelStartDialog()}),this.createStyledButton(t/2+60*s,e/2+40*s,"返回菜单",()=>{this.scene.start("MenuScene")}))}cleanupCurrentLevel(){this.gameBoard&&(this.gameBoard.destroy(),this.gameBoard=null),this.children.removeAll(!0),this.createUI()}showGameOverDialog(){const{width:t,height:e}=this.cameras.main,s=this.uiScale;this.add.rectangle(0,0,t,e,0,.7).setOrigin(0);const a=280*s,o=200*s;this.add.rectangle(t/2,e/2,a,o,16777215).setStrokeStyle(2,15158332),this.add.text(t/2,e/2-60*s,"游戏结束",{fontSize:`${24*s}px`,fill:"#e74c3c",fontFamily:"Arial",fontWeight:"bold"}).setOrigin(.5),this.add.text(t/2,e/2-20*s,`最终分数: ${this.score}`,{fontSize:`${18*s}px`,fill:"#333333",fontFamily:"Arial"}).setOrigin(.5),this.createStyledButton(t/2-60*s,e/2+40*s,"重新开始",()=>{this.score=0,this.scene.restart()}),this.createStyledButton(t/2+60*s,e/2+40*s,"返回菜单",()=>{this.scene.start("MenuScene")})}showLevelStartDialog(){const{width:t,height:e}=this.cameras.main,s=this.uiScale,i=this.add.rectangle(0,0,t,e,0,.7);i.setOrigin(0);const a=300*s,o=220*s,n=this.add.rectangle(t/2,e/2,a,o,16777215);n.setStrokeStyle(2,3447003),this.add.text(t/2,e/2-70*s,`关卡 ${this.currentLevel}`,{fontSize:`${24*s}px`,fill:"#3498db",fontFamily:"Arial",fontWeight:"bold"}).setOrigin(.5);let r="";this.currentLevel<=2?r=`简单模式 第${this.currentLevel}`:this.currentLevel<=4?r=`中等模式 第${this.currentLevel-2}`:this.currentLevel<=7&&(r=`困难模式 第${this.currentLevel-4}`),this.add.text(t/2,e/2-30*s,r,{fontSize:`${18*s}px`,fill:"#2c3e50",fontFamily:"Arial",fontWeight:"bold"}).setOrigin(.5),this.add.text(t/2,e/2+5*s,`目标分数: ${this.currentLevelData.targetScore}`,{fontSize:`${16*s}px`,fill:"#e74c3c",fontFamily:"Arial"}).setOrigin(.5),this.add.text(t/2,e/2+30*s,`可用步数: ${this.currentLevelData.maxMoves}`,{fontSize:`${16*s}px`,fill:"#f39c12",fontFamily:"Arial"}).setOrigin(.5);const l=this.createStyledButton(t/2,e/2+70*s,"开始游戏",()=>{i.destroy(),n.destroy(),l.button.destroy(),l.text.destroy(),this.createGameBoard()})}saveProgress(){try{const t={currentLevel:this.currentLevel,score:this.score,moves:this.moves,maxMoves:this.maxMoves,cheatMode:this.cheatMode,timestamp:Date.now()};localStorage.setItem("marsGameProgress",JSON.stringify(t))}catch(t){console.error("保存游戏进度失败:",t)}}loadSavedProgress(){try{const t=localStorage.getItem("marsGameProgress");if(t){const e=JSON.parse(t);this.currentLevel=e.currentLevel||1,this.score=e.score||0,this.moves=e.moves||0,this.maxMoves=e.maxMoves||30,this.cheatMode=!!e.cheatMode,console.log("已加载游戏进度:",e)}}catch(t){console.error("加载游戏进度失败:",t),this.reset()}}clearSavedProgress(){try{localStorage.removeItem("marsGameProgress")}catch(t){console.error("清除游戏进度失败:",t)}}}class T extends f.Scene{constructor(){super({key:"PreloadScene"})}preload(){const{width:t,height:e}=this.cameras.main;this.createLoadingUI(t,e),this.load.json("elements","/config/elements.json"),this.load.json("levelgen","/config/levelgen.json"),["element_red","element_blue","element_green","element_yello","element_purple","element_orange","element_special"].forEach(i=>{this.load.image(i,`/assets/elements/${i}.png`)}),this.load.image("logo","/assets/logo.png"),this.load.on("progress",i=>{this.updateProgress(i)}),this.load.on("complete",()=>{this.scene.start("MenuScene")})}createLoadingUI(t,e){this.add.rectangle(t/2,e/2,t,e,1713455);const s=Math.min(t/400,e/600),i=Math.max(24*s,20),a=Math.max(16*s,14);this.add.text(t/2,e/2-100*s,"火星消消乐",{fontSize:`${i}px`,fill:"#ffffff",fontFamily:"Arial",fontWeight:"bold"}).setOrigin(.5),this.loadingText=this.add.text(t/2,e/2,"加载中...",{fontSize:`${a}px`,fill:"#ffffff",fontFamily:"Arial"}).setOrigin(.5);const o=Math.min(300*s,t*.8),n=20*s,r=e/2+50*s;this.progressBg=this.add.rectangle(t/2,r,o,n,2899536),this.progressBg.setStrokeStyle(2,3426654),this.progressBar=this.add.rectangle(t/2-o/2,r,0,n-4,3447003),this.progressBar.setOrigin(0,.5),this.percentText=this.add.text(t/2,r+30*s,"0%",{fontSize:`${a}px`,fill:"#95a5a6",fontFamily:"Arial"}).setOrigin(.5)}updateProgress(t){const e=this.progressBg.width-4;this.progressBar.width=e*t,this.percentText.setText(`${Math.round(t*100)}%`),t===1&&this.loadingText.setText("加载完成!")}}class z extends f.Scene{constructor(){super({key:"MenuScene"}),this.uiScale=1,this.isPortrait=!1}create(){this.calculateResponsiveLayout(),this.createBackground(),this.createMainUI(),this.createAnimations(),this.recordVisitAndShowStats()}calculateResponsiveLayout(){const{width:t,height:e}=this.cameras.main;this.isPortrait=e>t;const s=400,i=600;this.uiScale=Math.min(t/s,e/i)}createBackground(){const{width:t,height:e}=this.cameras.main,s=this.add.graphics();s.fillGradientStyle(1713455,1713455,3447003,2899536,1),s.fillRect(0,0,t,e),this.createBackgroundDecorations()}createBackgroundDecorations(){const{width:t,height:e}=this.cameras.main;for(let s=0;s<8;s++){const i=Math.random()*t,a=Math.random()*e,o=30+Math.random()*60,n=.03+Math.random()*.07;if(Math.random()>.5){const r=this.add.circle(i,a,o/2,16777215,n);this.tweens.add({targets:r,scaleX:1.3,scaleY:1.3,duration:4e3+Math.random()*3e3,yoyo:!0,repeat:-1,ease:"Sine.easeInOut"})}else{const r=this.add.rectangle(i,a,o,o,16777215,n);r.setRotation(Math.random()*Math.PI),this.tweens.add({targets:r,rotation:r.rotation+Math.PI*2,duration:8e3+Math.random()*4e3,repeat:-1,ease:"Linear"})}}}createMainUI(){const{width:t,height:e}=this.cameras.main;this.createGameTitle(t,e),this.createMenuButtons(t,e),this.createFooterInfo(t,e)}createGameTitle(t,e){const s=this.isPortrait?150*this.uiScale:100*this.uiScale,i=this.add.text(t/2,s,"火星消消乐",{fontSize:`${Math.max(48*this.uiScale,32)}px`,fill:"#ffffff",fontFamily:"Arial",fontWeight:"bold",align:"center",stroke:"#2c3e50",strokeThickness:4}).setOrigin(.5);i.setShadow(3,3,"#34495e",2,!1,!0);const a=s+60*this.uiScale;this.add.text(t/2,a,"Made by 溦雨yu小红书提建议",{fontSize:`${Math.max(14*this.uiScale,12)}px`,fill:"#95a5a6",fontFamily:"Arial",align:"center"}).setOrigin(.5),this.tweens.add({targets:i,scaleX:1.05,scaleY:1.05,duration:2e3,yoyo:!0,repeat:-1,ease:"Sine.easeInOut"});const o=this.add.circle(t/2,s,120*this.uiScale,16777215,.1);this.tweens.add({targets:o,alpha:{from:.1,to:.3},scale:{from:1,to:1.2},duration:3e3,yoyo:!0,repeat:-1,ease:"Sine.easeInOut"})}createMenuButtons(t,e){const s=this.isPortrait?e*.45:e*.4,i=80*this.uiScale,a=this.getSavedProgress(),o=[];a?o.push({text:"继续游戏",action:()=>this.continueGame(),color:2600544},{text:"新游戏",action:()=>this.startNewGame(),color:15158332}):o.push({text:"开始游戏",action:()=>this.startNewGame(),color:3066993}),o.push({text:"游戏设置",action:()=>this.showSettings(),color:3447003},{text:"关于游戏",action:()=>this.showAbout(),color:10181046}),o.forEach((n,r)=>{const l=s+r*i;this.createStyledButton(t/2,l,n.text,n.action,n.color)})}createStyledButton(t,e,s,i,a=3447003){const o=Math.max(200*this.uiScale,180),n=Math.max(50*this.uiScale,45),r=Math.max(18*this.uiScale,16),l=this.add.container(t,e),h=this.add.rectangle(0,0,o,n,a);h.setStrokeStyle(3,f.Display.Color.GetColor32(f.Display.Color.ColorToRGBA(a))-2236962),h.setInteractive({useHandCursor:!0});const g=this.add.text(0,0,s,{fontSize:`${r}px`,fill:"#ffffff",fontFamily:"Arial",fontWeight:"bold"}).setOrigin(.5);return l.add([h,g]),h.on("pointerover",()=>{this.tweens.add({targets:l,scaleX:1.05,scaleY:1.05,duration:100,ease:"Power2"}),this.tweens.add({targets:h,fillColor:f.Display.Color.GetColor32(f.Display.Color.ColorToRGBA(a))+3355443,duration:100})}),h.on("pointerout",()=>{this.tweens.add({targets:l,scaleX:1,scaleY:1,duration:100,ease:"Power2"}),this.tweens.add({targets:h,fillColor:a,duration:100})}),h.on("pointerdown",()=>{this.tweens.add({targets:l,scaleX:.95,scaleY:.95,duration:50,yoyo:!0,ease:"Power2",onComplete:i})}),l.setAlpha(0),l.setScale(.8),this.tweens.add({targets:l,alpha:1,scaleX:1,scaleY:1,duration:500,delay:200*l.list.indexOf(l),ease:"Back.easeOut"}),l}createFooterInfo(t,e){const s=e-50*this.uiScale,i=Math.max(12*this.uiScale,10);this.add.text(t/2-60*this.uiScale,s,"版本 1.0.1",{fontSize:`${i}px`,fill:"#95a5a6",fontFamily:"Arial"}).setOrigin(.5);const a=this.add.text(t/2+60*this.uiScale,s,"更新日志",{fontSize:`${i}px`,fill:"#3498db",fontFamily:"Arial",textDecoration:"underline"}).setOrigin(.5);a.setInteractive({useHandCursor:!0}),a.on("pointerover",()=>{a.setFill("#5dade2")}),a.on("pointerout",()=>{a.setFill("#3498db")}),a.on("pointerdown",()=>{this.showChangelog()}),this.visitStatsText=this.add.text(t-20*this.uiScale,e-20*this.uiScale,"访问统计: 加载中...",{fontSize:`${Math.max(10*this.uiScale,9)}px`,fill:"#7f8c8d",fontFamily:"Arial",align:"right"}).setOrigin(1,1)}showChangelog(){const t=`1. 优化了操作手感
2. 修复了刷分 bug
3. 修复了关卡切换UI残留问题
4. 新增访问统计功能
5. 可以暂时保存游戏进度并继续游戏
6. 新增了对蓝色高马尾斯文败类的爱(仅有爱)
待做:音效、彩蛋、新 UI`;this.showDialog("更新日志 1.0.1",t)}createAnimations(){const{width:t,height:e}=this.cameras.main,s=["element_red","element_blue","element_green","element_yello"];for(let i=0;i<4;i++){const a=100+Math.random()*(t-200),o=100+Math.random()*(e-200),n=s[Math.floor(Math.random()*s.length)],r=this.add.image(a,o,n);r.setScale(.3*this.uiScale),r.setAlpha(.2),this.tweens.add({targets:r,y:o-20,duration:3e3+Math.random()*2e3,yoyo:!0,repeat:-1,ease:"Sine.easeInOut"}),this.tweens.add({targets:r,rotation:Math.PI*2,duration:8e3+Math.random()*4e3,repeat:-1,ease:"Linear"})}}startGame(){this.scene.start("GameScene")}showSettings(){this.showDialog("游戏设置",`暂时没有可配置的设置项
敬请期待后续版本更新!
(怎么会有更新呢)`)}showAbout(){this.showDialog("关于游戏",`Made by 溦雨yu
(& Claude)
晨宇啊...晨宇啊...`)}showDialog(t,e){const{width:s,height:i}=this.cameras.main,a=this.uiScale,o=this.add.rectangle(0,0,s,i,0,.7);o.setOrigin(0),o.setInteractive();const n=Math.min(350*a,s*.9),r=Math.min(300*a,i*.8),l=this.add.rectangle(s/2,i/2,n,r,16777215);l.setStrokeStyle(3,3447003);const h=this.add.text(s/2,i/2-r/2+40*a,t,{fontSize:`${Math.max(20*a,18)}px`,fill:"#2c3e50",fontFamily:"Arial",fontWeight:"bold"}).setOrigin(.5),g=this.add.text(s/2,i/2,e,{fontSize:`${Math.max(14*a,12)}px`,fill:"#34495e",fontFamily:"Arial",align:"center",lineSpacing:8,wordWrap:{width:n-40*a,useAdvancedWrap:!0}}).setOrigin(.5),c=this.add.rectangle(s/2,i/2+r/2-40*a,100*a,35*a,3447003);c.setStrokeStyle(2,2719929),c.setInteractive({useHandCursor:!0});const d=this.add.text(s/2,i/2+r/2-40*a,"确定",{fontSize:`${Math.max(16*a,14)}px`,fill:"#ffffff",fontFamily:"Arial",fontWeight:"bold"}).setOrigin(.5),u=()=>{o.destroy(),l.destroy(),h.destroy(),g.destroy(),c.destroy(),d.destroy()};c.on("pointerdown",u),o.on("pointerdown",u),c.on("pointerover",()=>{c.setFillStyle(2719929)}),c.on("pointerout",()=>{c.setFillStyle(3447003)}),l.setScale(.8),h.setScale(.8),g.setScale(.8),c.setScale(.8),d.setScale(.8),this.tweens.add({targets:[l,h,g,c,d],scaleX:1,scaleY:1,duration:300,ease:"Back.easeOut"})}getSavedProgress(){try{const t=localStorage.getItem("marsGameProgress");return t?JSON.parse(t):null}catch(t){return console.error("读取游戏进度失败:",t),null}}continueGame(){this.scene.start("GameScene",{continue:!0})}startNewGame(){this.clearSavedProgress(),this.scene.start("GameScene",{continue:!1})}clearSavedProgress(){try{localStorage.removeItem("marsGameProgress")}catch(t){console.error("清除游戏进度失败:",t)}}recordVisitAndShowStats(){this.recordVisit().then(()=>this.getStats()).then(t=>{t&&this.visitStatsText&&this.visitStatsText.setText(`访问人次: ${t.visits}`)}).catch(t=>{console.error("统计功能错误:",t),this.visitStatsText&&this.visitStatsText.setText("访问统计: 暂不可用")})}async recordVisit(){try{const t=await fetch("/api/visit",{method:"POST",headers:{"Content-Type":"application/json"}});if(!t.ok)throw new Error(`HTTP error! status: ${t.status}`);const e=await t.json();return console.log("访问记录成功:",e),e}catch(t){throw console.error("记录访问失败:",t),t}}async getStats(){try{const t=await fetch("/api/stats");if(!t.ok)throw new Error(`HTTP error! status: ${t.status}`);const e=await t.json();if(e.success)return e.data;throw new Error(e.message||"获取统计数据失败")}catch(t){throw console.error("获取统计数据失败:",t),t}}}const p=window.devicePixelRatio||1,P=375,A=667,y=P*Math.min(p,2),v=A*Math.min(p,2),L={type:f.AUTO,width:y,height:v,parent:"game-container",backgroundColor:"#2c3e50",scale:{mode:f.Scale.FIT,autoCenter:f.Scale.CENTER_BOTH,width:y,height:v,zoom:1/Math.min(p,2)},render:{antialias:!0,pixelArt:!1,roundPixels:!1},physics:{default:"arcade",arcade:{gravity:{y:0},debug:!1}},scene:[T,z,C]};if(typeof window<"u"){window.addEventListener("touchstart",function(e){e.touches.length>1&&e.preventDefault()});let m=0;window.addEventListener("touchend",function(e){const s=Date.now();s-m<=300&&e.preventDefault(),m=s},!1),window.addEventListener("touchmove",function(e){e.preventDefault()},{passive:!1});const t=document.querySelector('meta[name="viewport"]');t&&t.setAttribute("content","width=device-width, initial-scale=1.0, user-scalable=no, shrink-to-fit=no, viewport-fit=cover")}new f.Game(L);console.log(`设备像素密度: ${p}`);console.log(`游戏分辨率: ${y}x${v}`);console.log(`缩放比例: ${1/Math.min(p,2)}`);