minigame 6 rocker 1.4

This commit is contained in:
2026-05-01 11:09:11 +00:00
parent ed0f24b344
commit e548b796fc
10 changed files with 395 additions and 43 deletions
+4 -2
View File
@@ -164,6 +164,9 @@
"borderWidthPx": 0,
"plaqueImageUrl": "https:\/\/srv1361159.hstgr.cloud\/Game\/img\/quiz-carry\/board-2.png"
},
"carryChoicePlaqueMapScale": 1.9,
"carryWalkSpeedMultForMapId": "",
"carryWalkSpeedMult": null,
"questions": [
{
"text": "test1",
@@ -275,6 +278,5 @@
],
"correctIndex": 0
}
],
"carryChoicePlaqueMapScale": 1.9
]
}
@@ -25,7 +25,7 @@ if (!is_array($data)) {
}
$out = [];
$keys = ['carryMapPanelTheme', 'carryEmbedCountdownTheme', 'carryChoicePlaqueThemes', 'carryChoicePlaqueTheme', 'carryChoicePlaqueMapScale', 'carryReadMs', 'carryAnswerMs', 'carrySessionLength', 'carryQuestions'];
$keys = ['carryMapPanelTheme', 'carryEmbedCountdownTheme', 'carryChoicePlaqueThemes', 'carryChoicePlaqueTheme', 'carryChoicePlaqueMapScale', 'carryReadMs', 'carryAnswerMs', 'carrySessionLength', 'carryWalkSpeedMultForMapId', 'carryWalkSpeedMult', 'carryQuestions'];
foreach ($keys as $k) {
if (!array_key_exists($k, $data)) {
continue;
+62 -5
View File
@@ -718,8 +718,42 @@
return getStoredCharacterId();
}
const MOVE_SPEED = 0.15;
/** quiz_carry — ค่าเริ่มเมื่อไม่มี override จาก Admin (รหัสฉากตรงกันใน quiz-settings.json) */
const QUIZ_CARRY_WALK_SPEED_MULT = 1.42;
/** ค่าที่ใช้จริงต่อเฟรม — อัปเดตจาก /api/quiz-settings + join snap */
let quizCarryWalkSpeedMultActive = QUIZ_CARRY_WALK_SPEED_MULT;
const PATH_ARRIVE_THRESH = 0.15;
function clampQuizCarryWalkSpeedMultClient(n, def) {
const v = Number(n);
if (!Number.isFinite(v)) return def;
return Math.round(Math.max(0.5, Math.min(3, v)) * 100) / 100;
}
function resolveQuizCarryWalkSpeedMultFromSettingsObj(s) {
const base = QUIZ_CARRY_WALK_SPEED_MULT;
if (!s || typeof s !== 'object') return base;
const forId = String(s.carryWalkSpeedMultForMapId ?? '').trim();
const mult = Number(s.carryWalkSpeedMult);
const mapId = (currentPlayMapId() || '').trim();
if (forId && mapId && forId === mapId && Number.isFinite(mult)) {
return clampQuizCarryWalkSpeedMultClient(mult, base);
}
return base;
}
function applyQuizCarryWalkSpeedFromSettingsObj(s) {
if (!isQuizCarry()) {
quizCarryWalkSpeedMultActive = QUIZ_CARRY_WALK_SPEED_MULT;
return;
}
quizCarryWalkSpeedMultActive = resolveQuizCarryWalkSpeedMultFromSettingsObj(s);
}
function moveSpeedTilesThisFrameForWalk() {
return MOVE_SPEED * (isQuizCarry() ? quizCarryWalkSpeedMultActive : 1);
}
function isMovementKey(code) {
return ['KeyW','KeyA','KeyS','KeyD','ArrowUp','ArrowDown','ArrowLeft','ArrowRight'].indexOf(code) !== -1;
}
@@ -2518,6 +2552,7 @@
playPath = [];
hidePlayQuizHud();
quizCarryJoinSettingsSnap = null;
quizCarryWalkSpeedMultActive = QUIZ_CARRY_WALK_SPEED_MULT;
quizCarryMapPanelTheme = null;
quizCarryChoicePlaqueThemes = null;
resetQuizCarryPlayState();
@@ -4842,6 +4877,13 @@
if (disk.carryReadMs != null) out.carryReadMs = disk.carryReadMs;
if (disk.carryAnswerMs != null) out.carryAnswerMs = disk.carryAnswerMs;
if (disk.carrySessionLength != null) out.carrySessionLength = disk.carrySessionLength;
if (disk.carryWalkSpeedMultForMapId != null) {
out.carryWalkSpeedMultForMapId = String(disk.carryWalkSpeedMultForMapId).trim();
}
if (disk.carryWalkSpeedMult != null) {
const wm = Number(disk.carryWalkSpeedMult);
if (Number.isFinite(wm)) out.carryWalkSpeedMult = wm;
}
const diskPlaqueScale = Number(disk.carryChoicePlaqueMapScale);
if (Number.isFinite(diskPlaqueScale)) {
out.carryChoicePlaqueMapScale = Math.max(0.85, Math.min(2.5, diskPlaqueScale));
@@ -4901,6 +4943,13 @@
const sm = Number(snap.carryChoicePlaqueMapScale);
if (Number.isFinite(sm)) s.carryChoicePlaqueMapScale = sm;
}
if (snap) {
if ((s.carryWalkSpeedMultForMapId == null || String(s.carryWalkSpeedMultForMapId).trim() === '') && snap.carryWalkSpeedMultForMapId != null) {
s.carryWalkSpeedMultForMapId = snap.carryWalkSpeedMultForMapId;
}
if (s.carryWalkSpeedMult == null && snap.carryWalkSpeedMult != null) s.carryWalkSpeedMult = snap.carryWalkSpeedMult;
}
applyQuizCarryWalkSpeedFromSettingsObj(s);
{
const sc = Number(s.carryChoicePlaqueMapScale);
quizCarryPlaqueMapScale = Number.isFinite(sc) ? Math.max(0.85, Math.min(2.5, sc)) : 1.25;
@@ -5070,7 +5119,7 @@
const accY = o.botWanderDy;
if (Math.abs(accY) > Math.abs(accX)) o.direction = accY > 0 ? 'down' : 'up';
else if (accX !== 0) o.direction = accX > 0 ? 'right' : 'left';
const step = MOVE_SPEED;
const step = MOVE_SPEED * quizCarryWalkSpeedMultActive;
const nx = o.x + accX * step;
const ny = o.y + accY * step;
const ox = o.x;
@@ -8853,6 +8902,9 @@
const prevWasSpaceShooter = mapData && mapData.gameType === 'space_shooter';
const prevWasBalloonBoss = mapData && mapData.gameType === 'balloon_boss';
mapData = gameMapData;
if (mapData.gameType !== 'quiz_carry') {
quizCarryWalkSpeedMultActive = QUIZ_CARRY_WALK_SPEED_MULT;
}
if (res && res.mapId != null && String(res.mapId).trim() !== '') {
playSessionMapId = String(res.mapId).trim();
}
@@ -8897,6 +8949,7 @@
if (!mapData.quizQuestions) mapData.quizQuestions = [];
if (!mapData.quizQuestionArea) mapData.quizQuestionArea = [];
normalizeQuizCarryLayersInPlay(mapData);
applyQuizCarryWalkSpeedFromSettingsObj(quizCarryJoinSettingsSnap || {});
}
if (mapData.gameType === 'quiz_battle') {
if (!mapData.quizBattleDomeArea) mapData.quizBattleDomeArea = [];
@@ -10226,8 +10279,12 @@
return;
}
const len = dist || 1;
const pathStepMul = (previewFillBots && editorEmbedReturn) ? 0.56 : 1;
const step = Math.min(MOVE_SPEED * 1.28 * pathStepMul, len);
const carryWalk = isQuizCarry() ? quizCarryWalkSpeedMultActive : 1;
const baseEmbedCarryPathMul = 0.74;
const pathStepMul = (previewFillBots && editorEmbedReturn)
? (isQuizCarry() ? baseEmbedCarryPathMul * (quizCarryWalkSpeedMultActive / QUIZ_CARRY_WALK_SPEED_MULT) : 0.56)
: 1;
const step = Math.min(MOVE_SPEED * 1.28 * pathStepMul * carryWalk, len);
const nx = o.x + (dx / len) * step;
const ny = o.y + (dy / len) * step;
if (Math.abs(dy) > Math.abs(dx)) o.direction = dy > 0 ? 'down' : 'up';
@@ -10244,7 +10301,7 @@
o.y = ny;
} else {
/* เส้นตรงไป waypoint อาจตัดมุม hub / block — ลองก้าวแนวแกนตามทิศหลักอย่างใดอย่างหนึ่ง */
const cstep = Math.min(MOVE_SPEED * 1.2 * pathStepMul, Math.max(Math.abs(dx), Math.abs(dy), 1e-4));
const cstep = Math.min(MOVE_SPEED * 1.2 * pathStepMul * carryWalk, Math.max(Math.abs(dx), Math.abs(dy), 1e-4));
const sx = dx > 1e-4 ? 1 : dx < -1e-4 ? -1 : 0;
const sy = dy > 1e-4 ? 1 : dy < -1e-4 ? -1 : 0;
const tryAxisX = () => {
@@ -12076,7 +12133,7 @@
const preWalkX = me.x, preWalkY = me.y;
if (accX !== 0 || accY !== 0) {
const len = Math.sqrt(accX * accX + accY * accY) || 1;
const step = Math.min(MOVE_SPEED, len);
const step = Math.min(moveSpeedTilesThisFrameForWalk(), len);
const nx = me.x + (accX / len) * step;
const ny = me.y + (accY / len) * step;
/** Quiz Battle + เส้นทาง: ห้ามเลื่อนแกนเดียว (slide) — ไม่งั้นเดินทแยงหลุดออกนอกเลนได้ */
+1 -1
View File
@@ -1897,7 +1897,7 @@
</div>
<script src="/Game/socket.io/socket.io.js"></script>
<script src="js/version.js?v=0.0184"></script>
<script src="js/play.js?v=0.222"></script>
<script src="js/play.js?v=0.224"></script>
<div class="version-tag">v —</div>
</body>
</html>
+49
View File
@@ -191,6 +191,9 @@ function defaultQuizSettings() {
carryChoicePlaqueTheme: defaultCarryChoicePlaqueTheme(),
/** quiz_carry: ขยายป้ายตัวเลือกบนแมป (กว้าง/สูง/ฟอนต์) — 0.85–2.5 */
carryChoicePlaqueMapScale: 1.25,
/** quiz_carry: ถ้าใส่รหัสฉาก + คูณ — เดินเร็วเฉพาะแมปนั้น (เทียบกับค่าเริ่มในไคลเอนต์) */
carryWalkSpeedMultForMapId: '',
carryWalkSpeedMult: null,
questions: [],
carryQuestions: [],
battleQuizMcq: [],
@@ -446,6 +449,22 @@ function clampCarryChoicePlaqueMapScale(n, def) {
return Math.round(Math.max(0.85, Math.min(2.5, v)) * 100) / 100;
}
/** รหัสฉาก (เช่น mnorwqx1) — ว่าง = ไม่ใช้คูณเดินแยกแมป */
function sanitizeCarryWalkSpeedMultForMapId(raw) {
const t = String(raw == null ? '' : raw).trim().slice(0, 64);
if (!t) return '';
if (!/^[a-zA-Z0-9_-]+$/.test(t)) return '';
return t;
}
/** quiz_carry: คูณความเร็วเดินเมื่อ map id ตรง — null = ไม่ตั้ง */
function clampCarryWalkSpeedMultSetting(n) {
if (n === null || n === undefined || n === '') return null;
const v = Number(n);
if (Number.isNaN(v)) return null;
return Math.round(Math.max(0.5, Math.min(3, v)) * 100) / 100;
}
function mergeQuizCarryFromMirrorIfSet(base) {
if (!QUIZ_SETTINGS_MIRROR_PATH) return base;
try {
@@ -465,6 +484,13 @@ function mergeQuizCarryFromMirrorIfSet(base) {
if (j.carrySessionLength != null) {
base.carrySessionLength = clampCarrySessionLength(j.carrySessionLength, base.carrySessionLength);
}
if (j.carryWalkSpeedMultForMapId != null) {
base.carryWalkSpeedMultForMapId = sanitizeCarryWalkSpeedMultForMapId(j.carryWalkSpeedMultForMapId);
}
if (j.carryWalkSpeedMult != null) {
const wm = clampCarryWalkSpeedMultSetting(j.carryWalkSpeedMult);
if (wm != null) base.carryWalkSpeedMult = wm;
}
if (j.carryEmbedCountdownTheme != null && typeof j.carryEmbedCountdownTheme === 'object') {
base.carryEmbedCountdownTheme = sanitizeCarryEmbedCountdownTheme(j.carryEmbedCountdownTheme);
}
@@ -500,6 +526,10 @@ function loadQuizSettings() {
: sanitizeCarryChoicePlaqueThemes(j.carryChoicePlaqueTheme);
const carryChoicePlaqueTheme = carryChoicePlaqueThemes[0];
const carryChoicePlaqueMapScale = clampCarryChoicePlaqueMapScale(j.carryChoicePlaqueMapScale, d.carryChoicePlaqueMapScale);
const carryWalkSpeedMultForMapId = sanitizeCarryWalkSpeedMultForMapId(j.carryWalkSpeedMultForMapId);
let carryWalkSpeedMult = clampCarryWalkSpeedMultSetting(j.carryWalkSpeedMult);
if (!carryWalkSpeedMultForMapId) carryWalkSpeedMult = null;
else if (carryWalkSpeedMult == null) carryWalkSpeedMult = clampCarryWalkSpeedMultSetting(1.42);
const out = {
readMs: clampQuizMs(j.readMs, d.readMs),
answerMs: clampQuizMs(j.answerMs, d.answerMs),
@@ -512,6 +542,8 @@ function loadQuizSettings() {
carryChoicePlaqueThemes,
carryChoicePlaqueTheme,
carryChoicePlaqueMapScale,
carryWalkSpeedMultForMapId,
carryWalkSpeedMult,
questions,
carryQuestions,
battleQuizMcq,
@@ -1037,6 +1069,17 @@ function saveQuizSettings(d) {
const carryChoicePlaqueMapScale = d.carryChoicePlaqueMapScale != null
? clampCarryChoicePlaqueMapScale(d.carryChoicePlaqueMapScale, prevScale)
: prevScale;
const prevWalkId = sanitizeCarryWalkSpeedMultForMapId(prev.carryWalkSpeedMultForMapId);
const prevWalkMult = prev.carryWalkSpeedMult != null ? clampCarryWalkSpeedMultSetting(prev.carryWalkSpeedMult) : null;
let carryWalkSpeedMultForMapId = d.carryWalkSpeedMultForMapId !== undefined
? sanitizeCarryWalkSpeedMultForMapId(d.carryWalkSpeedMultForMapId)
: prevWalkId;
let carryWalkSpeedMult = d.carryWalkSpeedMult !== undefined ? clampCarryWalkSpeedMultSetting(d.carryWalkSpeedMult) : prevWalkMult;
if (!carryWalkSpeedMultForMapId) {
carryWalkSpeedMult = null;
} else if (carryWalkSpeedMult == null) {
carryWalkSpeedMult = clampCarryWalkSpeedMultSetting(1.42);
}
const out = {
readMs,
answerMs,
@@ -1049,6 +1092,8 @@ function saveQuizSettings(d) {
carryChoicePlaqueThemes,
carryChoicePlaqueTheme,
carryChoicePlaqueMapScale,
carryWalkSpeedMultForMapId,
carryWalkSpeedMult,
questions,
carryQuestions,
battleQuizMcq,
@@ -1748,6 +1793,8 @@ const server = http.createServer((req, res) => {
carryReadMs: g.carryReadMs,
carryAnswerMs: g.carryAnswerMs,
carrySessionLength: g.carrySessionLength,
carryWalkSpeedMultForMapId: g.carryWalkSpeedMultForMapId,
carryWalkSpeedMult: g.carryWalkSpeedMult,
carryQuestions: g.carryQuestions,
};
res.writeHead(200, {
@@ -3416,6 +3463,8 @@ io.on('connection', (socket) => {
carryReadMs: qs.carryReadMs,
carryAnswerMs: qs.carryAnswerMs,
carrySessionLength: qs.carrySessionLength,
carryWalkSpeedMultForMapId: qs.carryWalkSpeedMultForMapId,
carryWalkSpeedMult: qs.carryWalkSpeedMult,
};
} catch (e) { /* ignore */ }
}