feat: 50 игр на Lua + импорт Roblox для всех + поддержка Lua в плеере #39

Merged
min merged 215 commits from feat/lua-50-games-bundle into main 2026-06-09 21:59:25 +00:00
2 changed files with 42 additions and 7 deletions
Showing only changes of commit e78f585fd4 - Show all commits

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> и больше