Files

603 lines
35 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// Create RP — туторіал у стилі Create (Ponder): наведи на предмет і затисни W.
// Потрібні PonderJS (мод «Ponder for KubeJS») і startup_scripts/createrp_items.js (предмет kubejs:citizen_guide).
// Більшість сцен — на стандартній плиті 5x5 (y=0 — плита, блоки з y=1); продаж і покупки — на схематиці Create з ланцюгами.
// Підписи — як у Create: одне коротке речення на крок.
const PACKAGE = 'create:cardboard_package_10x12'
// Справжні посилки на ланцюгах — тими ж викликами, що й у сценах самого Create (FrogAndConveyorScenes).
// Якщо KubeJS не дасть доступу до класів — сцени все одно покажуть мережу й текст, лише без руху посилок.
let CreateScene = null, Frogport = null, ChainConveyor = null, PackageItem = null, PackageStyles = null
try {
CreateScene = Java.loadClass('com.simibubi.create.foundation.ponder.CreateSceneBuilder')
Frogport = Java.loadClass('com.simibubi.create.content.logistics.packagePort.frogport.FrogportBlockEntity')
ChainConveyor = Java.loadClass('com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorBlockEntity')
PackageItem = Java.loadClass('com.simibubi.create.content.logistics.box.PackageItem')
PackageStyles = Java.loadClass('com.simibubi.create.content.logistics.box.PackageStyles')
} catch (e) {
console.warn('[createrp] Create classes unavailable for Ponder animations: ' + e)
}
// один крок: підпис біля точки й пауза, поки його читають
function say(scene, ticks, text, pos, colour, keyframe) {
const t = scene.text(ticks, text, pos).placeNearTarget()
if (colour) t.colored(colour)
if (keyframe) t.attachKeyFrame()
scene.idle(ticks + 10)
}
// Create's own kinetic helper. In KubeJS `world` is a property, not a method; and Rhino rejects a
// const/let declared inside try on a second call, so there are no declarations in the try at all.
function kineticWorld(scene) {
var builder = new CreateScene(scene)
return typeof builder.world === 'function' ? builder.world() : builder.world
}
function setSpeed(scene, sel, speed) {
if (!CreateScene) return
try {
kineticWorld(scene).setKineticSpeed(sel, speed)
} catch (e) {
console.warn('[createrp] setKineticSpeed: ' + e)
}
}
// ---- мережа ланцюгів (схематика Create «Transporting packages between Frogports», 9x9) --------
const FROG_STRUCTURE = 'create:high_logistics/package_frogport'
const CONV1 = [1, 4, 7], CONV2 = [7, 4, 7]
const FROM_FROG = [5, 2, 2], TO_FROG = [2, 2, 5]
function addressedBox(address) {
const box = PackageStyles.getDefaultBox().copy()
PackageItem.addAddress(box, address)
return box
}
// посилки, що крутяться на одному вузлі ланцюга, їдуть до іншого (Create: boxTransfer)
function chainTransfer(scene, util, to, from) {
scene.world.modifyBlockEntity(util.grid.at(from[0], from[1], from[2]), ChainConveyor, be => {
var it = be.getLoopingPackages().iterator()
while (it.hasNext()) {
var p = it.next()
p.chainPosition = 0
be.addTravellingPackage(p, util.grid.at(to[0] - from[0], to[1] - from[1], to[2] - from[2]))
it.remove()
}
})
}
// посилка з адресою їде ланцюгами від пакужаби (5,2,2) до пакужаби (2,2,5)
function shipOnChains(scene, util, address) {
if (!Frogport) {
scene.overlay.showBigLine(PonderPalette.OUTPUT, [5.5, 3, 2.5], [2.5, 3, 5.5], 140)
scene.idle(150)
return
}
const box = addressedBox(address)
scene.world.modifyBlockEntity(util.grid.at(FROM_FROG[0], FROM_FROG[1], FROM_FROG[2]), Frogport, be => be.startAnimation(box, true))
scene.idle(95)
chainTransfer(scene, util, CONV1, CONV2)
scene.idle(45)
scene.world.modifyBlockEntity(util.grid.at(CONV1[0], CONV1[1], CONV1[2]), ChainConveyor, be => be.getLoopingPackages().clear())
scene.world.modifyBlockEntity(util.grid.at(TO_FROG[0], TO_FROG[1], TO_FROG[2]), Frogport, be => be.startAnimation(box, false))
scene.idle(15)
}
// мережа з'являється так само, як у Create
function showChainNetwork(scene, util) {
scene.configureBasePlate(0, 0, 9)
scene.scaleSceneView(0.75)
scene.setSceneOffsetY(-1)
scene.world.showSection(util.select.layer(0).substract(util.select.position(9, 0, 1)), Direction.UP)
scene.idle(10)
scene.world.showSection(util.select.position(2, 1, 8), Direction.SOUTH)
scene.idle(2)
scene.world.showSection(util.select.fromTo(1, 1, 7, 1, 3, 7), Direction.DOWN)
scene.idle(2)
scene.world.showSection(util.select.fromTo(7, 1, 7, 7, 3, 7), Direction.DOWN)
scene.idle(2)
scene.world.showSection(util.select.fromTo(7, 1, 1, 7, 3, 1), Direction.DOWN)
scene.idle(5)
scene.world.showSection(util.select.position(1, 4, 7), Direction.DOWN)
scene.world.showSection(util.select.position(7, 4, 7), Direction.DOWN)
scene.world.showSection(util.select.position(7, 4, 1), Direction.DOWN)
scene.idle(20)
}
function showRightSide(scene, util) { // пакувальник, сховище й пакужаба праворуч (5..7, z=2)
scene.world.showSection(util.select.fromTo(7, 1, 2, 5, 1, 2), Direction.DOWN)
scene.world.showSection(util.select.position(5, 1, 3), Direction.DOWN)
scene.idle(5)
scene.world.showSection(util.select.position(5, 2, 2), Direction.DOWN)
scene.idle(15)
}
function showLeftSide(scene, util) { // пакужаба з пакувальником ліворуч (2, z=5)
scene.world.showSection(util.select.position(2, 1, 5), Direction.SOUTH)
scene.world.showSection(util.select.fromTo(2, 1, 4, 0, 1, 4), Direction.DOWN)
scene.world.showSection(util.select.position(3, 1, 5), Direction.DOWN)
scene.idle(5)
scene.world.showSection(util.select.position(2, 2, 5), Direction.DOWN)
scene.idle(15)
}
// ---------------------------------------------------------------------------------------------
// 1. Термінал держави
function terminalScene(scene, util) {
scene.showBasePlate()
scene.world.setBlocks([2, 1, 2], 'computercraft:computer_advanced')
scene.world.setBlocks([1, 1, 3, 3, 2, 3], 'computercraft:monitor_advanced')
scene.idle(10)
scene.world.showSection([2, 1, 2], Direction.DOWN)
scene.idle(15)
scene.showControls(60, [2.5, 2, 2.5], 'down').rightClick()
say(scene, 70, 'Будь-який комп\'ютер — термінал держави', [2.5, 1.5, 2.5], null, true)
say(scene, 60, 'Набери rp і натисни Enter', [2.5, 1.5, 2.5])
say(scene, 70, 'Увійди: свій нік і пароль', [2.5, 1.5, 2.5], PonderPalette.BLUE, true)
say(scene, 70, 'Першого разу термінал попросить створити пароль', [2.5, 1.5, 2.5])
say(scene, 60, 'Стій поруч — здалеку не пустить', [2.5, 1.5, 2.5], PonderPalette.RED)
say(scene, 80, 'Тут усе: рахунок, бізнес, ціни, магазин, земля, робота, банк', [2.5, 1.5, 2.5], null, true)
say(scene, 70, 'Назву кирилицею пиши в чат гри', [2.5, 1.5, 2.5], PonderPalette.BLUE, true)
say(scene, 70, 'Термінал забере цей рядок собі', [2.5, 1.5, 2.5])
scene.world.showSection([1, 1, 3, 3, 2, 3], Direction.DOWN)
scene.idle(15)
say(scene, 70, 'Додай монітор — і набери prices metal', [2, 2.5, 3], PonderPalette.BLUE, true)
say(scene, 60, 'Вийде табло цін держави', [2, 2.5, 3])
}
// ---------------------------------------------------------------------------------------------
// 2. Продаж державі
function sellScene(scene, util) {
showChainNetwork(scene, util)
say(scene, 70, 'Держава купує все, що ти добуваєш і виробляєш', [4, 4.5, 4], null, true)
say(scene, 70, 'Товар їде до неї посилками по ланцюгах', [4, 4.5, 7])
showRightSide(scene, util)
scene.world.showSection(util.select.position(4, 1, 2), Direction.EAST)
scene.idle(10)
say(scene, 70, 'Твій бізнес: сховище, пакувальник і пакужаба', [5.5, 2.5, 2.5], null, true)
say(scene, 80, 'На пакувальник — табличка з адресою gov-…', [4.5, 1.5, 2.5], PonderPalette.BLUE)
say(scene, 70, 'Адресу дає термінал: Бізнес → Адреса продажу', [4.5, 1.5, 2.5])
showLeftSide(scene, util)
say(scene, 80, 'Це державна пакужаба — вона приймає всі адреси gov-…', [2.5, 2.5, 5.5], PonderPalette.BLUE, true)
scene.text(60, 'Посилка їде ланцюгами…', [6.78, 4.37, 3.5]).placeNearTarget()
shipOnChains(scene, util, 'gov-a1b2c3')
say(scene, 70, '…і гроші приходять на рахунок бізнесу', [2.5, 2.5, 5.5], PonderPalette.GREEN, true)
say(scene, 70, 'Багато однакового товару — ціна падає', [4, 4.5, 4], PonderPalette.RED)
say(scene, 60, 'Дефіцит — ціна росте', [4, 4.5, 4], PonderPalette.GREEN)
say(scene, 60, 'Ціни дивись на табло або в терміналі', [4, 4.5, 4])
}
// ---------------------------------------------------------------------------------------------
// 3. Покупки в держави
function buyScene(scene, util) {
showChainNetwork(scene, util)
showRightSide(scene, util)
say(scene, 70, 'Це державний склад', [5.5, 2.5, 2.5], PonderPalette.BLUE, true)
say(scene, 80, 'Держава продає імпорт: алмази, незерит, елітри, ліцензії', [5.5, 2.5, 2.5])
say(scene, 60, 'Купуй у терміналі: Магазин держави', [4, 4.5, 4])
showLeftSide(scene, util)
say(scene, 70, 'Це твоя пакужаба, напр. «Склад Олі»', [2.5, 2.5, 5.5], null, true)
say(scene, 70, 'Цю назву впиши як адресу доставки', [2.5, 2.5, 5.5], PonderPalette.BLUE)
shipOnChains(scene, util, 'Склад Олі')
say(scene, 70, 'Посилка приїжджає сама', [2.5, 2.5, 5.5], PonderPalette.GREEN, true)
say(scene, 70, 'Пакувальник розпакує її у скриню', [3.5, 1.5, 5.5])
say(scene, 70, 'Не доїхала — гроші повернуться самі', [4, 4.5, 4], PonderPalette.RED)
}
// ---------------------------------------------------------------------------------------------
// 4. Гроші й банк
function moneyScene(scene, util) {
scene.showBasePlate()
scene.world.setBlocks([2, 1, 2], 'computercraft:computer_advanced')
scene.world.showSection([2, 1, 2], Direction.DOWN)
scene.idle(15)
say(scene, 70, 'Твої гроші лежать на рахунку в банку', [2.5, 1.5, 2.5], null, true)
say(scene, 60, 'Баланс і перекази — у терміналі', [2.5, 1.5, 2.5])
const coins = ['numismatics:spur', 'numismatics:bevel', 'numismatics:sprocket', 'numismatics:cog']
for (let i = 0; i < coins.length; i++) {
scene.world.createItemEntity([1 + i, 3, 1], [0, 0.1, 0], coins[i])
scene.idle(5)
}
scene.idle(10)
say(scene, 70, 'Монети — це готівка', [2.5, 2, 1.5], PonderPalette.GREEN, true)
say(scene, 70, 'Зняти: /cash withdraw <сума>', [2.5, 2, 1.5])
say(scene, 70, 'Покласти: монети в руку і /cash deposit', [2.5, 2, 1.5])
say(scene, 70, 'Банк дає кредити бізнесу', [2.5, 1.5, 2.5], PonderPalette.BLUE, true)
say(scene, 60, 'А вклад щодня приносить відсоток', [2.5, 1.5, 2.5])
say(scene, 80, 'Пропустив 3 платежі по кредиту — рахунок заморожено', [2.5, 1.5, 2.5], PonderPalette.RED)
}
// ---------------------------------------------------------------------------------------------
// 5. Земля й надра
function landScene(scene, util) {
scene.showBasePlate()
scene.world.setBlocks([1, 1, 1], 'minecraft:oak_fence')
scene.world.setBlocks([3, 1, 1], 'minecraft:oak_fence')
scene.world.setBlocks([1, 1, 3], 'minecraft:oak_fence')
scene.world.setBlocks([3, 1, 3], 'minecraft:oak_fence')
scene.world.setBlocks([2, 1, 2], 'minecraft:iron_ore')
scene.idle(10)
say(scene, 70, 'Нічия земля належить державі', [2.5, 1, 2.5], null, true)
scene.overlay.showOutline(PonderPalette.GREEN, 'plot', util.select.fromTo(0, 0, 0, 4, 0, 4), 150)
scene.world.showSection([1, 1, 1, 3, 1, 3], Direction.DOWN)
say(scene, 70, 'Будуй на своїй ділянці', [2.5, 1.5, 2.5], PonderPalette.GREEN, true)
say(scene, 70, 'Орендуй або купи її в терміналі: Земля', [2.5, 1.5, 2.5])
say(scene, 70, 'На ділянці над хотбаром видно її назву', [2.5, 1.5, 2.5])
say(scene, 70, 'Чужі тут не ламають, а твої працівники — можуть', [2.5, 1.5, 2.5])
scene.overlay.showOutline(PonderPalette.RED, 'ore', util.select.position(2, 1, 2), 150)
say(scene, 70, 'Руду копають лише з концесією', [2.5, 1.5, 2.5], PonderPalette.RED, true)
say(scene, 70, 'Купи її в терміналі: Земля → Купити концесію', [2.5, 1.5, 2.5])
say(scene, 70, 'Бури Create теж копають лише за концесією', [2.5, 1.5, 2.5])
say(scene, 70, 'Найкращі ділянки держава продає на аукціоні', [2.5, 2.5, 2.5], PonderPalette.BLUE, true)
say(scene, 70, 'Ставки — в терміналі: Земля → Аукціони', [2.5, 2.5, 2.5])
say(scene, 80, 'За землю платиш щодня. Не платив 3 дні — ділянку забирають', [2.5, 2.5, 2.5])
}
// ---------------------------------------------------------------------------------------------
// 6. Робота: ринок праці й пошта
function jobsScene(scene, util) {
scene.showBasePlate()
scene.idle(10)
scene.world.createEntity('minecraft:villager', [1, 1, 2.5])
scene.idle(10)
say(scene, 70, 'Немає роботи? Стань на ринок праці', [2.5, 2.5, 2.5], null, true)
say(scene, 70, 'Держава щодня платить допомогу, якщо ти грав', [2.5, 2.5, 2.5])
scene.showControls(60, [1, 2.3, 2.5], 'down').rightClick()
say(scene, 70, 'Хочеш більше — працюй поштарем', [1, 2.5, 2.5], PonderPalette.BLUE, true)
scene.world.createItemEntity([1.5, 2, 2.5], [0.05, 0.25, 0], PACKAGE)
scene.world.createItemEntity([1.5, 2, 2.5], [0.03, 0.3, 0.03], 'minecraft:compass')
scene.idle(20)
say(scene, 70, 'NPC пошти дасть посилку й компас', [2, 1.5, 2.5], null, true)
say(scene, 70, 'Компас веде до адресата', [2, 1.5, 2.5])
say(scene, 70, 'ПКМ компасом — мітка на місці', [2, 1.5, 2.5], PonderPalette.BLUE)
scene.world.createEntity('minecraft:villager', [4, 1, 2.5])
scene.overlay.showBigLine(PonderPalette.OUTPUT, [1.5, 1.2, 2.5], [4, 1.2, 2.5], 100)
say(scene, 70, 'Віддай посилку адресату — і отримаєш гроші', [4, 2.5, 2.5], PonderPalette.GREEN, true)
say(scene, 60, 'Що далі везти — то більше платять', [4, 2.5, 2.5])
say(scene, 60, 'На доставку — 2 ігрові дні', [2.5, 2.5, 2.5], PonderPalette.RED)
say(scene, 80, 'Або наймися в бізнес: термінал → Бізнес', [2.5, 2.5, 2.5], null, true)
}
// ---------------------------------------------------------------------------------------------
// 8. Вантажник
function cargoScene(scene, util) {
scene.showBasePlate()
scene.world.setBlocks([0, 1, 3, 4, 1, 3], 'minecraft:rail[shape=east_west]')
scene.idle(10)
scene.world.createEntity('minecraft:villager', [1, 1, 1])
scene.idle(10)
say(scene, 70, 'Вантажник возить будматеріали на будови', [1, 2.5, 1], null, true)
scene.showControls(50, [1, 2.3, 1], 'down').rightClick()
scene.idle(20)
for (let i = 0; i < 5; i++) {
scene.world.createItemEntity([1.5, 2, 1.5], [0.04 * (i - 2), 0.25, 0.06], PACKAGE)
scene.idle(4)
}
scene.idle(10)
say(scene, 70, 'Диспетчер вантажів дасть від 4 до 8 ящиків', [1.5, 1.5, 1.5], PonderPalette.BLUE, true)
say(scene, 70, 'Ящики важкі: з ними ти ледве йдеш', [1.5, 1.5, 1.5], PonderPalette.RED)
scene.world.showSection([0, 1, 3, 4, 1, 3], Direction.DOWN)
scene.world.createEntity('minecraft:minecart', [1.5, 1, 3.5])
scene.idle(15)
say(scene, 70, 'Візьми візок, поїзд чи інший транспорт', [1.5, 1.5, 3.5], null, true)
scene.world.createEntity('minecraft:villager', [4, 1, 1])
scene.overlay.showBigLine(PonderPalette.OUTPUT, [1.5, 1.2, 3.5], [4, 1.2, 1.5], 100)
say(scene, 70, 'Компас веде до прораба на будові', [4, 2.5, 1], null, true)
say(scene, 70, 'Віддай йому всі ящики — і отримаєш гроші', [4, 2.5, 1], PonderPalette.GREEN)
say(scene, 70, 'Платять більше, ніж на пошті: за відстань і кожен ящик', [2.5, 2.5, 2.5], PonderPalette.GREEN)
say(scene, 60, 'На доставку — 3 ігрові дні', [2.5, 2.5, 2.5], PonderPalette.RED)
}
// ---------------------------------------------------------------------------------------------
// 9. Дорожник
function roadsScene(scene, util) {
const CORRIDOR = util.select.fromTo(0, 0, 1, 4, 0, 3)
scene.showBasePlate()
scene.idle(10)
scene.overlay.showOutline(PonderPalette.BLUE, 'corridor', CORRIDOR, 200)
say(scene, 70, 'Це транспортний коридор держави', [2.5, 1, 2], PonderPalette.BLUE, true)
say(scene, 70, 'Будувати й ламати тут може лише дорожник', [2.5, 1, 2], PonderPalette.RED)
scene.world.createEntity('minecraft:villager', [0.5, 1, 0.5])
scene.idle(10)
scene.showControls(50, [0.5, 2.3, 0.5], 'down').rightClick()
say(scene, 70, 'Стань дорожником: дорожній майстер або термінал → Робота', [0.5, 2.5, 0.5], null, true)
for (let x = 0; x < 5; x++) {
scene.world.setBlocks([x, 1, 2], 'minecraft:stone_bricks')
scene.world.showSection([x, 1, 2], Direction.DOWN)
if (x === 0) scene.showControls(40, [0.5, 1.5, 2.5], 'down').rightClick().withItem('minecraft:stone_bricks')
scene.idle(8)
}
scene.idle(10)
say(scene, 70, 'Кожен новий блок дороги — 0,3 ¤', [2.5, 1.5, 2.5], PonderPalette.GREEN, true)
say(scene, 70, 'Гроші — в кінці ігрового дня, до 300 блоків на день', [2.5, 1.5, 2.5])
say(scene, 70, 'Перекласти той самий блок вдруге — не оплачується', [2.5, 1.5, 2.5], PonderPalette.RED)
say(scene, 80, 'Покриття: кам\'яна цегла, гладкий камінь, андезит, плитка Create', [2.5, 1.5, 2.5])
}
// ---------------------------------------------------------------------------------------------
// 10. Шахтар
function minerScene(scene, util) {
scene.showBasePlate()
scene.world.setBlocks([1, 1, 1, 3, 2, 3], 'minecraft:stone')
scene.world.setBlocks([2, 1, 1], 'minecraft:iron_ore')
scene.world.setBlocks([1, 2, 1], 'minecraft:coal_ore')
scene.world.setBlocks([3, 1, 1], 'minecraft:copper_ore')
scene.world.setBlocks([2, 2, 1], 'minecraft:stone')
scene.idle(10)
scene.world.showSection([1, 1, 1, 3, 2, 3], Direction.DOWN)
scene.idle(15)
say(scene, 70, 'Це державна шахта', [2.5, 2.5, 1], PonderPalette.BLUE, true)
say(scene, 70, 'Копати тут можуть лише шахтарі', [2.5, 2.5, 1], PonderPalette.RED)
say(scene, 70, 'Найнятися: бригадир шахти або термінал → Робота', [2.5, 2.5, 1])
scene.showControls(40, [2.5, 1.5, 1], 'right').leftClick().withItem('minecraft:iron_pickaxe')
scene.idle(30)
scene.world.destroyBlock([2, 1, 1])
scene.idle(15)
say(scene, 70, 'Руда одразу йде державі — без дропу', [2.5, 1.5, 1], null, true)
scene.world.createItemEntity([2.5, 2, 0.8], [0, 0.2, 0], 'numismatics:spur')
say(scene, 70, 'Тобі — оплата за кожен блок', [2.5, 1.5, 1], PonderPalette.GREEN)
say(scene, 70, 'Алмази й золото дорожчі за вугілля', [2.5, 1.5, 1])
say(scene, 70, 'Гроші — в кінці ігрового дня, до 200 блоків на день', [2.5, 2.5, 2])
scene.world.setBlocks([2, 1, 1], 'minecraft:iron_ore')
scene.idle(10)
say(scene, 70, 'Викопана руда згодом виростає знову', [2.5, 1.5, 1], PonderPalette.BLUE, true)
}
// ---------------------------------------------------------------------------------------------
// 11. Оператор заводу
function operatorScene(scene, util) {
scene.showBasePlate()
scene.world.setBlocks([1, 1, 2], 'minecraft:blast_furnace')
scene.world.setBlocks([2, 1, 2], 'create:andesite_casing')
scene.world.setBlocks([3, 1, 2], 'create:mechanical_press')
scene.idle(10)
scene.world.showSection([1, 1, 2, 3, 1, 2], Direction.DOWN)
scene.idle(15)
say(scene, 70, 'Це державний завод', [2.5, 2.5, 2.5], PonderPalette.BLUE, true)
say(scene, 70, 'Оператор стежить, щоб він не зупинявся', [2.5, 2.5, 2.5])
say(scene, 70, 'Найнятися: майстер заводу або термінал → Робота', [2.5, 2.5, 2.5])
scene.overlay.showOutline(PonderPalette.RED, 'broken', util.select.position(1, 1, 2), 220)
say(scene, 70, 'Точка задиміла — щось зламалось', [1.5, 2, 2.5], PonderPalette.RED, true)
scene.showControls(50, [1.5, 2, 2.5], 'down').rightClick().withItem('minecraft:coal')
say(scene, 70, 'Немає палива — клацни з вугіллям у руці', [1.5, 2, 2.5])
scene.showControls(50, [1.5, 2, 2.5], 'down').rightClick()
say(scene, 70, 'Затор — прочисть порожньою рукою', [1.5, 2, 2.5])
scene.showControls(50, [1.5, 2, 2.5], 'down').rightClick().withItem('create:wrench')
say(scene, 70, 'Розхиталась деталь — підтягни ключем', [1.5, 2, 2.5])
scene.world.createItemEntity([1.5, 2.2, 2.5], [0, 0.2, 0], 'numismatics:spur')
say(scene, 70, 'Кожен ремонт — 2 ¤ у кінці ігрового дня', [2.5, 2.5, 2.5], PonderPalette.GREEN, true)
say(scene, 70, 'Поломки стаються, лише поки ти на зміні поруч', [2.5, 2.5, 2.5])
}
// ---------------------------------------------------------------------------------------------
// 12. Державні службовці
function officialsScene(scene, util) {
scene.showBasePlate()
scene.idle(10)
scene.world.createEntity('minecraft:villager', [2.5, 1, 2.5])
scene.idle(10)
scene.showControls(50, [2.5, 2.3, 2.5], 'down').rightClick()
say(scene, 70, 'Державні службовці відповідають на запитання', [2.5, 2.5, 2.5], null, true)
say(scene, 70, 'Клацни по службовцю й обери репліку', [2.5, 2.5, 2.5])
say(scene, 70, 'Провідник на спавні пояснить, з чого почати', [2.5, 2.5, 2.5], PonderPalette.BLUE, true)
say(scene, 70, 'Він же дасть перше завдання з підйомними', [2.5, 2.5, 2.5], PonderPalette.GREEN)
scene.world.createEntity('minecraft:villager', [0.5, 1, 0.5])
scene.world.createEntity('minecraft:villager', [4.5, 1, 0.5])
scene.world.createEntity('minecraft:villager', [0.5, 1, 4.5])
scene.world.createEntity('minecraft:villager', [4.5, 1, 4.5])
scene.idle(15)
say(scene, 70, 'Ратуша: бізнес, ділянки, аукціони', [0.5, 2.5, 0.5], null, true)
say(scene, 70, 'Міністерство: тендери й частки ринку', [4.5, 2.5, 0.5])
say(scene, 70, 'Банк: рахунок, кредити, вклад', [0.5, 2.5, 4.5])
say(scene, 70, 'Центр зайнятості: робота й допомога', [4.5, 2.5, 4.5])
say(scene, 80, 'Відповідь службовця приходить у чат', [2.5, 2.5, 2.5], PonderPalette.BLUE, true)
say(scene, 80, 'Щоб щось оформити — іди до термінала', [2.5, 2.5, 2.5])
}
// ---------------------------------------------------------------------------------------------
// 7. Продаж енергії державі: державна підстанція
function energyScene(scene, util) {
const STATE = util.select.fromTo(3, 1, 0, 4, 1, 4)
const BUSINESS = util.select.fromTo(0, 1, 2, 1, 1, 2)
const ALL = util.select.fromTo(0, 1, 0, 4, 1, 4)
scene.showBasePlate()
// генератор бізнесу → вал → лічильник → коробка передач підстанції → три вентилятори держави
scene.world.setBlocks([0, 1, 2], 'create:water_wheel[facing=east]')
scene.world.setBlocks([1, 1, 2], 'create:shaft[axis=x]')
scene.world.setBlocks([2, 1, 2], 'create:stressometer[facing=south,axis_along_first=true]')
scene.world.setBlocks([3, 1, 2], 'create:gearbox')
scene.world.setBlocks([4, 1, 2], 'create:encased_fan[facing=east]')
scene.world.setBlocks([3, 1, 1], 'create:shaft[axis=z]')
scene.world.setBlocks([3, 1, 3], 'create:shaft[axis=z]')
scene.world.setBlocks([3, 1, 0], 'create:encased_fan[facing=north]')
scene.world.setBlocks([3, 1, 4], 'create:encased_fan[facing=south]')
scene.idle(10)
scene.world.showSection(STATE, Direction.DOWN)
scene.idle(15)
scene.overlay.showOutline(PonderPalette.BLUE, 'state', STATE, 90)
say(scene, 80, 'Це державна підстанція: її машинам потрібна сила', [3.5, 2.5, 2.5], PonderPalette.BLUE, true)
scene.world.showSection([2, 1, 2], Direction.DOWN)
scene.idle(10)
say(scene, 70, 'На вході стоїть лічильник — стресометр', [2.5, 1.8, 2.5], null, true)
say(scene, 70, 'Держава закріплює його за твоїм бізнесом', [2.5, 1.8, 2.5])
scene.world.showSection(BUSINESS, Direction.EAST)
scene.idle(15)
scene.overlay.showOutline(PonderPalette.GREEN, 'biz', BUSINESS, 90)
say(scene, 70, 'Підведи вал від свого генератора', [0.5, 1.5, 2.5], PonderPalette.GREEN, true)
setSpeed(scene, ALL, 32)
scene.idle(10)
say(scene, 70, 'Машини держави закрутились', [3.5, 2.5, 2.5])
for (let i = 0; i < 3; i++) {
scene.world.createItemEntity([2.5, 2.2, 2.5], [0, 0.2, 0], 'numismatics:spur')
scene.idle(12)
}
say(scene, 70, 'Щохвилини держава платить твоєму бізнесу', [2.5, 2.5, 2.5], PonderPalette.GREEN, true)
say(scene, 70, 'Платить лише за силу, яку забирають її машини', [2.5, 2.5, 2.5])
say(scene, 70, 'Приклад: 2048 SU — приблизно 1 ¤ за хвилину', [2.5, 2.5, 2.5], PonderPalette.BLUE)
setSpeed(scene, ALL, 0)
scene.idle(10)
say(scene, 70, 'Сили не вистачає — машини стоять, грошей немає', [1.5, 1.5, 2.5], PonderPalette.RED, true)
setSpeed(scene, ALL, 32)
say(scene, 80, 'Хочеш продавати енергію — знайди підстанцію й підключись', [2.5, 2.5, 2.5], null, true)
say(scene, 70, 'Держава оголошує й тендери на енергію', [2.5, 2.5, 2.5], PonderPalette.BLUE, true)
say(scene, 70, 'Переможцю платять дорожче за звичайний тариф', [2.5, 2.5, 2.5], PonderPalette.GREEN)
say(scene, 70, 'Не дав обіцяної сили — штраф', [2.5, 2.5, 2.5], PonderPalette.RED)
}
// ---------------------------------------------------------------------------------------------
// ---------------------------------------------------------------------------------------------
// 13. Ефір: дві школи магії в державі
function arcaneScene(scene, util) {
scene.showBasePlate()
scene.world.setBlocks([2, 1, 2], 'minecraft:budding_amethyst')
scene.world.setBlocks([2, 2, 2], 'minecraft:amethyst_cluster')
scene.world.setBlocks([0, 1, 3], 'ars_nouveau:source_jar')
scene.world.setBlocks([4, 1, 3], 'hexcasting:slate')
scene.idle(10)
scene.world.showSection([2, 1, 2, 2, 2, 2], Direction.DOWN)
scene.idle(15)
say(scene, 70, 'В аметистових жилах накопичується ефір', [2.5, 2.5, 2.5], PonderPalette.BLUE, true)
say(scene, 70, 'Держава вважає ефір ресурсом надр', [2.5, 2.5, 2.5])
say(scene, 70, 'Його вивчає Ефірна палата', [2.5, 2.5, 2.5])
scene.world.showSection([0, 1, 3, 0, 1, 3], Direction.DOWN)
scene.idle(15)
scene.showControls(50, [0.5, 2, 3.5], 'down').withItem('ars_nouveau:novice_spell_book')
say(scene, 70, 'Плетільники збирають ефір у джерело', [0.5, 2, 3.5], PonderPalette.GREEN, true)
say(scene, 70, 'Заклинання складають у книзі', [0.5, 2, 3.5])
scene.world.showSection([4, 1, 3, 4, 1, 3], Direction.DOWN)
scene.idle(15)
scene.showControls(50, [4.5, 1.5, 3.5], 'down').withItem('hexcasting:staff/oak')
say(scene, 70, 'Гексографи креслять візерунки посохом', [4.5, 1.5, 3.5], PonderPalette.GREEN, true)
say(scene, 70, 'Їхнє паливо — аметистовий пил', [4.5, 1.5, 3.5])
scene.world.createItemEntity([2.5, 3.5, 2.5], [0, 0.1, 0], 'ars_nouveau:source_gem')
scene.idle(10)
say(scene, 70, 'Держава купує джерело, пил і аметист', [2.5, 2.5, 2.5], PonderPalette.BLUE, true)
say(scene, 70, 'Ціни — на табло, категорія «Ефір»', [2.5, 2.5, 2.5])
say(scene, 80, 'Торгуєш ефірним — купи ліцензію в магазині', [2.5, 2.5, 2.5], PonderPalette.RED)
say(scene, 70, 'Закон той самий, що й для машин', [2.5, 2.5, 2.5], null, true)
say(scene, 70, 'Руду без концесії заклинання не візьме', [2.5, 2.5, 2.5], PonderPalette.RED)
say(scene, 70, 'Посилки й вантажі не телепортують', [2.5, 2.5, 2.5], PonderPalette.RED)
say(scene, 80, 'Решту розкаже магістр Ефірної палати', [2.5, 2.5, 2.5], PonderPalette.BLUE)
}
// ---------------------------------------------------------------------------------------------
// 14. Дошки оголошень
function boardScene(scene, util) {
scene.showBasePlate()
scene.world.setBlocks([2, 1, 2], 'computercraft:computer_advanced')
scene.world.setBlocks([1, 1, 3, 3, 3, 3], 'computercraft:monitor_advanced')
scene.idle(10)
scene.world.showSection([1, 1, 2, 3, 3, 3], Direction.DOWN)
scene.idle(15)
say(scene, 70, 'Це дошка оголошень держави', [2.5, 3, 3], PonderPalette.BLUE, true)
say(scene, 70, 'Розділи змінюються самі', [2.5, 3, 3])
say(scene, 70, 'Тендери: що держава замовляє і до якої ціни', [2.5, 3, 3], null, true)
say(scene, 70, 'Ділянки: вільна земля, оренда й ціна купівлі', [2.5, 3, 3])
say(scene, 70, 'Центр міста дорожчий за околиці', [2.5, 3, 3], PonderPalette.RED)
say(scene, 70, 'Аукціони: ставки й день закриття', [2.5, 3, 3])
say(scene, 70, 'Робота: державні роботи й вакансії бізнесів', [2.5, 3, 3], PonderPalette.GREEN, true)
say(scene, 80, 'Власник бізнесу вивішує вакансію в терміналі', [2.5, 1.5, 2.5])
scene.showControls(50, [2.5, 2, 2.5], 'down').rightClick()
say(scene, 80, 'Свою дошку запускає програма board', [2.5, 1.5, 2.5], PonderPalette.BLUE, true)
}
Ponder.tags(event => {
event.createTag('kubejs:createrp', 'kubejs:citizen_guide', 'Держава Create RP',
'Як жити й заробляти в державній економіці',
['kubejs:citizen_guide', 'create:package_frogport', 'computercraft:computer_advanced', 'computercraft:computer_normal', 'computercraft:monitor_advanced', 'create:stressometer', 'ars_nouveau:source_gem', 'hexcasting:amethyst_dust'])
})
Ponder.registry(event => {
event.create('kubejs:citizen_guide')
.scene('guide_officials', 'Державні службовці', officialsScene)
.scene('guide_terminal', 'Термінал держави', terminalScene)
.scene('guide_board', 'Дошки оголошень', boardScene)
.scene('guide_sell', 'Продаж державі', FROG_STRUCTURE, sellScene)
.scene('guide_buy', 'Покупки в держави', FROG_STRUCTURE, buyScene)
.scene('guide_energy', 'Продаж енергії державі', energyScene)
.scene('guide_money', 'Гроші й банк', moneyScene)
.scene('guide_land', 'Земля й надра', landScene)
.scene('guide_jobs', 'Робота: ринок праці й пошта', jobsScene)
.scene('guide_cargo', 'Робота: вантажник', cargoScene)
.scene('guide_roads', 'Робота: дорожник', roadsScene)
.scene('guide_miner', 'Робота: шахтар', minerScene)
.scene('guide_operator', 'Робота: оператор заводу', operatorScene)
.scene('guide_arcane', 'Ефір і магія', arcaneScene)
event.create('create:package_frogport')
.scene('frogport_sell', 'Create RP: продаж державі', FROG_STRUCTURE, sellScene)
.scene('frogport_buy', 'Create RP: покупки в держави', FROG_STRUCTURE, buyScene)
event.create(['ars_nouveau:source_gem', 'ars_nouveau:novice_spell_book', 'hexcasting:amethyst_dust', 'minecraft:amethyst_shard'])
.scene('arcane_law', 'Create RP: ефір і магія', arcaneScene)
event.create('create:stressometer')
.scene('stressometer_energy', 'Create RP: продаж енергії державі', energyScene)
event.create(['computercraft:computer_advanced', 'computercraft:computer_normal'])
.scene('computer_terminal', 'Create RP: термінал держави', terminalScene)
event.create('computercraft:monitor_advanced')
.scene('monitor_terminal', 'Create RP: термінал і табло цін', terminalScene)
.scene('monitor_board', 'Create RP: дошки оголошень', boardScene)
})