docs(47) + feat(g48): «Мультиплеер: Салки»

g47 docs: CodeBoth main+btn_1+finish.

g48 паритет (упрощённый — без MP-API):
- __rbxl_show_text 'Опубликуй игру для игры с друзьями'
- __rbxl_hud_set 'info' 50,8 'Игроков в комнате: N' (Players:GetPlayers)
- Players.PlayerAdded → '<имя> присоединился!' + refresh
- Players.PlayerRemoving → refresh
- task.delay 2 показывает правила
- В одиночке роли не назначаются (нет game.room API в shim)
This commit is contained in:
min 2026-06-09 23:15:11 +03:00
parent 57c5779644
commit e78f585fd4
2 changed files with 42 additions and 7 deletions

View File

@ -4449,7 +4449,42 @@ end)`;
})(),
// ═══════════════════════════════════════════════════════════════
// ИГРЫ 48-50: явных Lua-версий пока нет.
// ИГРА 48 — «Мультиплеер: Салки»
// ═══════════════════════════════════════════════════════════════
'mp-tag': {
g48_main: `-- === ИГРА «МУЛЬТИПЛЕЕР: САЛКИ» — главный скрипт (Lua) ===
-- Это МУЛЬТИПЛЕЕРНАЯ игра. Чтобы играть с друзьями, опубликуй её
-- с галочкой «Мультиплеер» тогда в комнату смогут зайти несколько
-- игроков. В одиночку игра показывает только правила.
local Players = game:GetService("Players")
__rbxl_show_text("Салки! Опубликуй игру для игры с друзьями", 4)
-- Показываем сколько игроков в комнате (постоянная плашка вверху)
local function refresh()
local n = #Players:GetPlayers()
__rbxl_hud_set("info", "Игроков в комнате: " .. n, 50, 8, "#ffe066", 22)
end
refresh()
-- Подписки на вход/выход
Players.PlayerAdded:Connect(function(p)
__rbxl_show_text(p.Name .. " присоединился к салкам!", 2)
refresh()
end)
Players.PlayerRemoving:Connect(function()
refresh()
end)
-- В одиночке роли не назначаются показываем правила
task.delay(2, function()
__rbxl_show_text("Водящий — первый зашедший. Он догоняет остальных.", 4)
end)`,
},
// ═══════════════════════════════════════════════════════════════
// ИГРЫ 49-50: явных Lua-версий пока нет.
// buildGameProject в docsGamesBuilders.js использует generateFallbackLua.
'clicker': {
g46_main: `-- === ИГРА «КЛИКЕР» — главный скрипт (Lua) ===

View File

@ -6830,7 +6830,7 @@ game.self.onInteract(() => {
<h3 className="lessonH">Шаг 2. Главный скрипт</h3>
<ScriptKind kind="global" />
<Code>{`// === ИГРА «КВЕСТ-ПОБЕГ» — главный скрипт ===
<CodeBoth game="escape-quest" script="g47_main">{`// === ИГРА «КВЕСТ-ПОБЕГ» — главный скрипт ===
let pressed = 0; // сколько кнопок нажато
const TOTAL = 3;
@ -6862,7 +6862,7 @@ game.onMessage('escape', () => {
const p = game.player.position;
game.scene.spawnParticles('confetti',
{ x: p.x, y: p.y + 3, z: p.z }, { duration: 3, count: 3 });
});`}</Code>
});`}</CodeBoth>
<p>Разберём:</p>
<ul>
<li><code>pressed</code> счётчик нажатых кнопок,
@ -6878,19 +6878,19 @@ game.onMessage('escape', () => {
<h3 className="lessonH">Шаг 3. Скрипты кнопки и финиша</h3>
<ScriptKind kind="object" on="каждую красную кнопку" />
<Code>{`// === Скрипт кнопки 1 ===
<CodeBoth game="escape-quest" script="g47_btn_1">{`// === Скрипт кнопки 1 ===
let used = false;
game.self.onInteract(() => {
if (used) return;
used = true;
game.scene.setColor(game.self.ref, '#22dd55'); // нажата зелёная
game.broadcast('pressButton');
}, { text: 'Нажать кнопку', distance: 3 });`}</Code>
}, { text: 'Нажать кнопку', distance: 3 });`}</CodeBoth>
<ScriptKind kind="object" on="зелёный финиш" />
<Code>{`// === Скрипт финиша ===
<CodeBoth game="escape-quest" script="g47_finish">{`// === Скрипт финиша ===
game.self.onTouch(() => {
game.broadcast('escape');
});`}</Code>
});`}</CodeBoth>
<p>
Кнопка при нажатии становится зелёной (видно, что нажата),
шлёт <code>game.broadcast('pressButton')</code> и больше