minigame 6 rocker 1.4
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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) — ไม่งั้นเดินทแยงหลุดออกนอกเลนได้ */
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 */ }
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user