minigame 6 add more design 1.2

This commit is contained in:
2026-05-06 06:45:47 +00:00
parent 14ce8543a1
commit 2f5e8aa4c3
2 changed files with 91 additions and 11 deletions
+90 -10
View File
@@ -75,6 +75,18 @@
const SPACE_SHOOTER_MISSION_MAX_ASTEROID_HITS = 3;
const SPACE_SHOOTER_MISSION_HIT_INVULN_MS = 1400;
const SPACE_SHOOTER_MISSION_SHIP_HIT_RADIUS = 12;
/** อุกาบาต: HP สุ่ม 1–5 ต่อก้อน (ไม่วาดหัวใจบนก้อน) — ขนาดตาม HP เทียบสเกล 5 */
const SPACE_SHOOTER_ASTEROID_MAX_HP = 5;
const SPACE_SHOOTER_ASTEROID_RADIUS_AT_FULL = 48;
const SPACE_SHOOTER_ASTEROID_RADIUS_AT_MIN_HP = 11;
function spaceShooterAsteroidRadiusFromHpPlay(hp) {
const cap = SPACE_SHOOTER_ASTEROID_MAX_HP;
const h = Math.max(0, Math.min(cap, Math.floor(Number(hp)) || 0));
const frac = h <= 0 ? 0 : h / cap;
return SPACE_SHOOTER_ASTEROID_RADIUS_AT_MIN_HP
+ (SPACE_SHOOTER_ASTEROID_RADIUS_AT_FULL - SPACE_SHOOTER_ASTEROID_RADIUS_AT_MIN_HP) * frac;
}
function spaceShooterResetMissionShipStateForAllPlay() {
function resetEnt(ent) {
@@ -123,6 +135,22 @@
if (!o) return;
tryHit(o, o.spaceShooterCx, o.spaceShooterCy);
});
if (spaceShooterMissionEveryParticipantEliminatedPlay()) {
endSpaceShooterMissionRound('all_dead');
}
}
/** Space Shooter ภารกิจ: ผู้เข้าร่วมทุกคนถูกกำจัดแล้ว (รวมเรา) */
function spaceShooterMissionEveryParticipantEliminatedPlay() {
if (!isSpaceShooterMissionUiMapPlay() || spaceShooterMissionPhase !== 'live' || spaceShooterGameEnded) return false;
if (myId == null) return false;
if (!me.spaceShooterEliminated) return false;
let anyAlive = false;
others.forEach(function (o) {
if (!o) return;
if (!o.spaceShooterEliminated) anyAlive = true;
});
return !anyAlive;
}
/** จนกว่าโหลด /api/characters — placeholder ชั่วคราวก่อน join */
@@ -4648,6 +4676,49 @@
}
}
/**
* Space Shooter mnpz6rkp: หมดเวลา = แฟลช result-timeup แล result-gameover แล GCM;
* กคนตาย = แฟลช result-gameover อยางเดยวแล GCM
*/
function beginSpaceShooterMissionResultFlashSequenceThenGcm(mission, endKind) {
if (!mission || mission.uiSkin !== 'violent_crime') {
showGauntletCrownMissionOverlay(mission);
return;
}
hideStackTowerResultFlashDomOnlyPlay();
const ov = document.getElementById('stack-tower-result-flash');
const imgEl = document.getElementById('stack-tower-result-flash-img');
if (!ov || !imgEl) {
showGauntletCrownMissionOverlay(mission);
return;
}
const finishToGcm = function () {
hideStackTowerResultFlashDomOnlyPlay();
showGauntletCrownMissionOverlay(mission);
};
const showOneFlash = function (file, onDone) {
imgEl.onerror = function () {
imgEl.onerror = null;
onDone();
};
imgEl.src = violentCrimeAssetUrl(file);
ov.classList.remove('is-hidden');
ov.setAttribute('aria-hidden', 'false');
stackTowerResultFlashTimer = setTimeout(function () {
stackTowerResultFlashTimer = null;
onDone();
}, STACK_TOWER_RESULT_FLASH_MS);
};
if (endKind === 'time_up') {
showOneFlash('result-timeup.png', function () {
hideStackTowerResultFlashDomOnlyPlay();
showOneFlash('result-gameover.png', finishToGcm);
});
} else {
showOneFlash('result-gameover.png', finishToGcm);
}
}
function stackTowerMissionTimeLimitSecPlay() {
const t = Number(playStackTowerMissionTimeSec);
if (Number.isFinite(t) && t > 0) return Math.max(10, Math.min(7200, Math.floor(t)));
@@ -5817,8 +5888,9 @@
};
}
function endSpaceShooterMissionRound() {
function endSpaceShooterMissionRound(endKind) {
if (!isSpaceShooterMissionUiMapPlay() || spaceShooterGameEnded) return;
const kind = endKind === 'all_dead' ? 'all_dead' : 'time_up';
spaceShooterGameEnded = true;
spaceShooterMissionPhase = 'ended';
applySpaceShooterMissionPanelImages();
@@ -5827,7 +5899,9 @@
spaceShooterAsteroidExplosions = [];
spaceShooterSpawnAccMs = 0;
spaceShooterPopups = [];
showGauntletCrownMissionOverlay(spaceShooterBuildMissionPayload());
const mission = spaceShooterBuildMissionPayload();
mission.spaceShooterEndKind = kind;
beginSpaceShooterMissionResultFlashSequenceThenGcm(mission, kind);
}
function questionMissionAssetUrl(file) {
@@ -10067,7 +10141,7 @@
}
const gcmHead = document.getElementById('gcm-heading');
if (gcmHead) {
if (mission && (mission.uiSkin === 'question_mission' || mission.uiSkin === 'stack_tower' || mission.uiSkin === 'mega_virus')) gcmHead.classList.add('sr-only');
if (mission && (mission.uiSkin === 'question_mission' || mission.uiSkin === 'stack_tower' || mission.uiSkin === 'mega_virus' || mission.uiSkin === 'jumper' || mission.uiSkin === 'violent_crime')) gcmHead.classList.add('sr-only');
else gcmHead.classList.remove('sr-only');
}
ov.classList.remove('is-hidden');
@@ -10081,7 +10155,7 @@
if (previewMode && editorEmbedReturn) {
ov.classList.add('is-hidden');
if (gcmHead) gcmHead.classList.remove('sr-only');
if (mission && (mission.uiSkin === 'question_mission' || mission.uiSkin === 'stack_tower' || mission.uiSkin === 'mega_virus' || mission.uiSkin === 'jumper')) {
if (mission && (mission.uiSkin === 'question_mission' || mission.uiSkin === 'stack_tower' || mission.uiSkin === 'mega_virus' || mission.uiSkin === 'jumper' || mission.uiSkin === 'violent_crime')) {
cancelQuizCarryResultEndAfterTimeup();
hideQuizCarryTimeupOnDeskLayer();
hideQuizCarryResultEndLayer();
@@ -10727,7 +10801,7 @@
function endSpaceShooterTimeUp() {
if (spaceShooterGameEnded || !mapData || mapData.gameType !== 'space_shooter') return;
if (isSpaceShooterMissionUiMapPlay()) {
endSpaceShooterMissionRound();
endSpaceShooterMissionRound('time_up');
return;
}
spaceShooterGameEnded = true;
@@ -10870,12 +10944,15 @@
spaceShooterSpawnAccMs += dt * 1000;
while (spaceShooterSpawnAccMs >= interval) {
spaceShooterSpawnAccMs -= interval;
const maxHp = 1 + Math.floor(Math.random() * SPACE_SHOOTER_ASTEROID_MAX_HP);
const hp0 = maxHp;
spaceShooterAsteroids.push({
x: 36 + Math.random() * (mw - 72),
y: -45 - Math.random() * 90,
r: 13 + Math.random() * 17,
r: spaceShooterAsteroidRadiusFromHpPlay(hp0),
vy: 58 + Math.random() * 62,
hp: 1,
maxHp: maxHp,
hp: hp0,
});
}
@@ -10908,8 +10985,8 @@
}
spaceShooterFireCd -= dt;
const fireHeld = !isChatFocused() && !!keys['Space'];
if (canPilotMe && fireHeld && spaceShooterFireCd <= 0 && me.spaceShooterCy != null) {
const autoFireOk = canPilotMe && !isChatFocused();
if (autoFireOk && spaceShooterFireCd <= 0 && me.spaceShooterCy != null) {
spaceShooterFireCd = 0.21;
spaceShooterBullets.push({ x: me.spaceShooterCx, y: me.spaceShooterCy - 20, vy: -580, ownerId: myId });
}
@@ -10940,7 +11017,8 @@
}
if (hit >= 0) {
const a = spaceShooterAsteroids[hit];
a.hp = (a.hp || 1) - 1;
const mh = Math.max(1, Math.floor(Number(a.maxHp)) || SPACE_SHOOTER_ASTEROID_MAX_HP);
a.hp = Math.max(0, Math.floor(Number(a.hp) || mh) - 1);
spaceShooterBullets.splice(bi, 1);
const add = 5;
if (b.ownerId === myId) {
@@ -10956,6 +11034,8 @@
if (a.hp <= 0) {
spaceShooterSpawnAsteroidExplosion(a.x, a.y, a.r);
spaceShooterAsteroids.splice(hit, 1);
} else {
a.r = spaceShooterAsteroidRadiusFromHpPlay(a.hp);
}
}
}
+1 -1
View File
@@ -3075,7 +3075,7 @@
</div>
<script src="/Game/socket.io/socket.io.js"></script>
<script src="js/version.js?v=0.0306"></script>
<script src="js/play.js?v=0.0327"></script>
<script src="js/play.js?v=0.0330"></script>
<div class="version-tag">v —</div>
</body>
</html>