3 Commits
Author SHA1 Message Date
full_droper f5f8fcc367 Видалити mods/x+-autofish.pw.toml 2026-10-03 14:46:25 +01:00
FulldroperandClaude Opus 5.5 d1a9b9d1f6 0.7.0: tutorial — courier and road builder scenes, energy scene fixed (world is a property in KubeJS), credits.txt lowercase
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 07:15:28 +03:00
FulldroperandClaude Opus 5.5 42ee586e63 0.6.2: readable tutorial texts, clearer energy scene
- one short sentence per step like Create (no more paragraphs); literal _underscores_ removed —
  PonderJS shows them as is
- energy scene tells the substation story: state machines need power, meter at the input,
  your generator connects, coins every minute, no power — no pay

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 06:53:48 +03:00
5 changed files with 243 additions and 208 deletions
+2 -2
View File
@@ -805,7 +805,7 @@ file = "config/yacl.json5"
hash = "121b93764159be6fb7dab523b29a844e2bb78400ce8c48f52135a097e9b0006e" hash = "121b93764159be6fb7dab523b29a844e2bb78400ce8c48f52135a097e9b0006e"
[[files]] [[files]]
file = "kubejs/assets/computercraft/textures/gui/CREDITS.txt" file = "kubejs/assets/computercraft/textures/gui/credits.txt"
hash = "19b844245d03fcdd488a7a791e287447191a74acd0f14995209339d768c5e6ce" hash = "19b844245d03fcdd488a7a791e287447191a74acd0f14995209339d768c5e6ce"
[[files]] [[files]]
@@ -814,7 +814,7 @@ hash = "db4c4a8ab49265f6e8e456f495800ea148b133b18a3242aabca30b98ab7f784f"
[[files]] [[files]]
file = "kubejs/client_scripts/createrp_ponder.js" file = "kubejs/client_scripts/createrp_ponder.js"
hash = "4a6ebdddb0249b1f59fd0d3b67649df682b81c10ff60a65a9739c0fb8c4de6ac" hash = "15e39779356b37faa17b99f628de5c8f28651e26eccab4c6feb021f3ae97a33b"
[[files]] [[files]]
file = "kubejs/startup_scripts/createrp_items.js" file = "kubejs/startup_scripts/createrp_items.js"
+239 -191
View File
@@ -1,6 +1,7 @@
// Create RP — туторіал у стилі Create (Ponder): наведи на предмет і затисни W. // Create RP — туторіал у стилі Create (Ponder): наведи на предмет і затисни W.
// Потрібні PonderJS (мод «Ponder for KubeJS») і startup_scripts/createrp_items.js (предмет kubejs:citizen_guide). // Потрібні PonderJS (мод «Ponder for KubeJS») і startup_scripts/createrp_items.js (предмет kubejs:citizen_guide).
// Більшість сцен — на стандартній плиті 5x5 (y=0 — плита, блоки з y=1); продаж і покупки — на схематиці Create з ланцюгами. Текст: _слово_ — підсвітка, як у Create. // Більшість сцен — на стандартній плиті 5x5 (y=0 — плита, блоки з y=1); продаж і покупки — на схематиці Create з ланцюгами.
// Підписи — як у Create: одне коротке речення на крок.
const PACKAGE = 'create:cardboard_package_10x12' const PACKAGE = 'create:cardboard_package_10x12'
@@ -17,27 +18,28 @@ try {
console.warn('[createrp] Create classes unavailable for Ponder animations: ' + e) console.warn('[createrp] Create classes unavailable for Ponder animations: ' + e)
} }
// посилка з адресою їде ланцюгами від пакужаби from до пакужаби to (по вузлах CONV2 → CONV1) // один крок: підпис біля точки й пауза, поки його читають
function shipOnChains(scene, util, address) { function say(scene, ticks, text, pos, colour, keyframe) {
if (!Frogport) { const t = scene.text(ticks, text, pos).placeNearTarget()
scene.overlay.showBigLine(PonderPalette.OUTPUT, [5.5, 3, 2.5], [2.5, 3, 5.5], 140) if (colour) t.colored(colour)
scene.idle(150) if (keyframe) t.attachKeyFrame()
return scene.idle(ticks + 10)
}
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)
frogTakes(scene, util, CONV1, TO_FROG, box)
scene.idle(10)
} }
function setSpeed(scene, util, sel, speed) { // Create's own kinetic helper; in KubeJS `world` is a property, not a method
if (CreateScene) new CreateScene(scene).world().setKineticSpeed(sel, speed) function setSpeed(scene, sel, speed) {
if (!CreateScene) return
try {
const cs = new CreateScene(scene)
const w = typeof cs.world === 'function' ? cs.world() : cs.world
w.setKineticSpeed(sel, speed)
} catch (e) {
console.warn('[createrp] setKineticSpeed: ' + e)
}
} }
// схематика Create «Transporting packages between Frogports» (9x9): ланцюги на висоті 4, дві пакужаби // ---- мережа ланцюгів (схематика Create «Transporting packages between Frogports», 9x9) --------
const FROG_STRUCTURE = 'create:high_logistics/package_frogport' const FROG_STRUCTURE = 'create:high_logistics/package_frogport'
const CONV1 = [1, 4, 7], CONV2 = [7, 4, 7] const CONV1 = [1, 4, 7], CONV2 = [7, 4, 7]
const FROM_FROG = [5, 2, 2], TO_FROG = [2, 2, 5] const FROM_FROG = [5, 2, 2], TO_FROG = [2, 2, 5]
@@ -48,7 +50,7 @@ function addressedBox(address) {
return box return box
} }
// посилки, що крутяться на одному ланцюговому вузлі, їдуть до іншого (Create: boxTransfer) // посилки, що крутяться на одному вузлі ланцюга, їдуть до іншого (Create: boxTransfer)
function chainTransfer(scene, util, to, from) { function chainTransfer(scene, util, to, from) {
scene.world.modifyBlockEntity(util.grid.at(from[0], from[1], from[2]), ChainConveyor, be => { scene.world.modifyBlockEntity(util.grid.at(from[0], from[1], from[2]), ChainConveyor, be => {
const it = be.getLoopingPackages().iterator() const it = be.getLoopingPackages().iterator()
@@ -61,13 +63,24 @@ function chainTransfer(scene, util, to, from) {
}) })
} }
// пакужаба на прийомі: знімає посилки з вузла й «ковтає» їх // посилка з адресою їде ланцюгами від пакужаби (5,2,2) до пакужаби (2,2,5)
function frogTakes(scene, util, conv, frog, box) { function shipOnChains(scene, util, address) {
scene.world.modifyBlockEntity(util.grid.at(conv[0], conv[1], conv[2]), ChainConveyor, be => be.getLoopingPackages().clear()) if (!Frogport) {
scene.world.modifyBlockEntity(util.grid.at(frog[0], frog[1], frog[2]), Frogport, be => be.startAnimation(box, false)) 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 // мережа з'являється так само, як у Create
function showChainNetwork(scene, util) { function showChainNetwork(scene, util) {
scene.configureBasePlate(0, 0, 9) scene.configureBasePlate(0, 0, 9)
scene.scaleSceneView(0.75) scene.scaleSceneView(0.75)
@@ -88,6 +101,23 @@ function showChainNetwork(scene, util) {
scene.idle(20) 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. Термінал держави // 1. Термінал держави
@@ -99,145 +129,64 @@ function terminalScene(scene, util) {
scene.world.showSection([2, 1, 2], Direction.DOWN) scene.world.showSection([2, 1, 2], Direction.DOWN)
scene.idle(15) scene.idle(15)
scene.text(80, 'Будь-який _комп\'ютер_ — це термінал держави. Відкрий його й набери _rp_.', [2.5, 1.5, 2.5])
.placeNearTarget().attachKeyFrame()
scene.showControls(60, [2.5, 2, 2.5], 'down').rightClick() scene.showControls(60, [2.5, 2, 2.5], 'down').rightClick()
scene.idle(90) say(scene, 70, 'Будь-який комп\'ютер — термінал держави', [2.5, 1.5, 2.5], null, true)
say(scene, 60, 'Набери rp і натисни Enter', [2.5, 1.5, 2.5])
scene.text(90, 'Вхід — твій _нік_ і _пароль_. Першого разу термінал попросить створити пароль. Стій поруч із комп\'ютером — здалеку не пустить.', [2.5, 1.5, 2.5]) say(scene, 70, 'Увійди: свій нік і пароль', [2.5, 1.5, 2.5], PonderPalette.BLUE, true)
.placeNearTarget().attachKeyFrame() say(scene, 70, 'Першого разу термінал попросить створити пароль', [2.5, 1.5, 2.5])
scene.idle(100) say(scene, 60, 'Стій поруч — здалеку не пустить', [2.5, 1.5, 2.5], PonderPalette.RED)
say(scene, 80, 'Тут усе: рахунок, бізнес, ціни, магазин, земля, робота, банк', [2.5, 1.5, 2.5], null, true)
scene.text(90, 'У меню: _рахунок_, _бізнес_, _ціни_, _магазин_, _земля_, _робота_, _тендери_, _банк_. Стрілки й Enter, Backspace — назад.', [2.5, 1.5, 2.5])
.placeNearTarget()
scene.idle(100)
scene.world.showSection([1, 1, 3, 3, 2, 3], Direction.DOWN) scene.world.showSection([1, 1, 3, 3, 2, 3], Direction.DOWN)
scene.idle(15) scene.idle(15)
scene.text(90, 'Комп\'ютер з _монітором_ — табло цін держави: програма _prices metal_ (або stone, wood, farm, food, create…).', [2, 2.5, 3]) say(scene, 70, 'Додай монітор — і набери prices metal', [2, 2.5, 3], PonderPalette.BLUE, true)
.colored(PonderPalette.BLUE).placeNearTarget().attachKeyFrame() say(scene, 60, 'Вийде табло цін держави', [2, 2.5, 3])
scene.idle(100)
} }
// --------------------------------------------------------------------------------------------- // ---------------------------------------------------------------------------------------------
// 2. Продаж державі (схематика Create з ланцюгами) // 2. Продаж державі
function sellScene(scene, util) { function sellScene(scene, util) {
showChainNetwork(scene, util) showChainNetwork(scene, util)
scene.text(90, 'Бізнеси й держава з\'єднані _мережею ланцюгів_. Посилка сама знаходить пакужабу з потрібною адресою.', [4, 4.5, 7]) say(scene, 70, 'Держава купує все, що ти добуваєш і виробляєш', [4, 4.5, 4], null, true)
.placeNearTarget().attachKeyFrame() say(scene, 70, 'Товар їде до неї посилками по ланцюгах', [4, 4.5, 7])
scene.idle(100)
// бізнес: сховище, пакувальник з табличкою, пакужаба на ланцюгу showRightSide(scene, util)
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(4, 1, 2), Direction.EAST) scene.world.showSection(util.select.position(4, 1, 2), Direction.EAST)
scene.world.showSection(util.select.position(5, 2, 2), Direction.DOWN) scene.idle(10)
scene.idle(15) say(scene, 70, 'Твій бізнес: сховище, пакувальник і пакужаба', [5.5, 2.5, 2.5], null, true)
scene.text(110, 'Твій бізнес: сховище → _пакувальник_ → _пакужаба_ на ланцюгу. Табличка на пакувальнику — адреса продажу _gov-…_ (термінал → Бізнес → Адреса продажу).', [4.5, 1.5, 2.5]) say(scene, 80, 'На пакувальник — табличка з адресою gov-…', [4.5, 1.5, 2.5], PonderPalette.BLUE)
.placeNearTarget().attachKeyFrame() say(scene, 70, 'Адресу дає термінал: Бізнес → Адреса продажу', [4.5, 1.5, 2.5])
scene.idle(120)
// держава: пакужаба з фільтром gov-* і приймач під нею showLeftSide(scene, util)
scene.world.showSection(util.select.position(2, 1, 5), Direction.SOUTH) say(scene, 80, 'Це державна пакужаба — вона приймає всі адреси gov-…', [2.5, 2.5, 5.5], PonderPalette.BLUE, true)
scene.world.showSection(util.select.fromTo(2, 1, 4, 0, 1, 4), Direction.DOWN)
scene.idle(5)
scene.world.showSection(util.select.position(2, 2, 5), Direction.DOWN)
scene.idle(15)
scene.text(100, '_Державна пакужаба_ приймає посилки на всі адреси gov-… Під нею — державний приймач.', [2.5, 2.5, 5.5])
.colored(PonderPalette.BLUE).placeNearTarget().attachKeyFrame()
scene.idle(110)
scene.text(70, 'Посилка з адресою gov-… їде ланцюгами…', [6.78, 4.37, 3.5]).placeNearTarget() scene.text(60, 'Посилка їде ланцюгами…', [6.78, 4.37, 3.5]).placeNearTarget()
shipOnChains(scene, util, 'gov-a1b2c3') shipOnChains(scene, util, 'gov-a1b2c3')
scene.text(110, '…до держави. Гроші — на _рахунок бізнесу_. Товару забагато — ціна падає, дефіцит — росте. Ціни — на табло й у терміналі.', [2.5, 2.5, 5.5]) say(scene, 70, '…і гроші приходять на рахунок бізнесу', [2.5, 2.5, 5.5], PonderPalette.GREEN, true)
.colored(PonderPalette.GREEN).placeNearTarget().attachKeyFrame() say(scene, 70, 'Багато однакового товару — ціна падає', [4, 4.5, 4], PonderPalette.RED)
scene.idle(120) say(scene, 60, 'Дефіцит — ціна росте', [4, 4.5, 4], PonderPalette.GREEN)
say(scene, 60, 'Ціни дивись на табло або в терміналі', [4, 4.5, 4])
scene.text(80, 'Поїзди, ферми, ланцюги — продаж іде сам, поки ти робиш інше.', [4, 4.5, 4])
scene.idle(90)
} }
// --------------------------------------------------------------------------------------------- // ---------------------------------------------------------------------------------------------
// 3. Покупка в держави (та сама мережа, напрямок навпаки) // 3. Покупки в держави
function buyScene(scene, util) { function buyScene(scene, util) {
showChainNetwork(scene, util) showChainNetwork(scene, util)
scene.world.showSection(util.select.fromTo(7, 1, 2, 5, 1, 2), Direction.DOWN) showRightSide(scene, util)
scene.world.showSection(util.select.position(5, 1, 3), Direction.DOWN) say(scene, 70, 'Це державний склад', [5.5, 2.5, 2.5], PonderPalette.BLUE, true)
scene.idle(5) say(scene, 80, 'Держава продає імпорт: алмази, незерит, елітри, ліцензії', [5.5, 2.5, 2.5])
scene.world.showSection(util.select.position(5, 2, 2), Direction.DOWN) say(scene, 60, 'Купуй у терміналі: Магазин держави', [4, 4.5, 4])
scene.idle(15)
scene.text(100, '_Державний склад_: пакувальник і пакужаба держави на тій самій мережі ланцюгів.', [5.5, 2.5, 2.5])
.colored(PonderPalette.BLUE).placeNearTarget().attachKeyFrame()
scene.idle(110)
scene.text(100, 'Держава продає _імпорт_ (алмази, незерит, елітри…) і _ліцензії_. Купівля — термінал → Магазин держави.', [4, 4.5, 4]) showLeftSide(scene, util)
.placeNearTarget().attachKeyFrame() say(scene, 70, 'Це твоя пакужаба, напр. «Склад Олі»', [2.5, 2.5, 5.5], null, true)
scene.idle(110) say(scene, 70, 'Цю назву впиши як адресу доставки', [2.5, 2.5, 5.5], PonderPalette.BLUE)
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)
scene.text(100, 'Твоя пакужаба з адресою, напр. _Склад Олі_. Цю назву вкажи під час покупки — термінал запам\'ятає.', [2.5, 2.5, 5.5])
.placeNearTarget().attachKeyFrame()
scene.idle(110)
shipOnChains(scene, util, 'Склад Олі') shipOnChains(scene, util, 'Склад Олі')
scene.text(100, 'Посилка приходить сама. _Пакувальник_ під твоєю пакужабою розпакує її у скриню.', [3.5, 1.5, 5.5]) say(scene, 70, 'Посилка приїжджає сама', [2.5, 2.5, 5.5], PonderPalette.GREEN, true)
.colored(PonderPalette.GREEN).placeNearTarget().attachKeyFrame() say(scene, 70, 'Пакувальник розпакує її у скриню', [3.5, 1.5, 5.5])
scene.idle(110) say(scene, 70, 'Не доїхала — гроші повернуться самі', [4, 4.5, 4], PonderPalette.RED)
scene.text(80, 'Не дійшла? Гроші _повертаються_ автоматично, а в чаті буде причина.', [4, 4.5, 4])
scene.idle(90)
}
// ---------------------------------------------------------------------------------------------
// 7. Продаж енергії державі
function energyScene(scene, util) {
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:shaft[axis=x]')
scene.world.setBlocks([4, 1, 2], 'create:encased_fan[facing=east]')
scene.idle(10)
scene.world.showSection([0, 1, 2], Direction.DOWN)
scene.world.showSection([1, 1, 2], Direction.DOWN)
scene.idle(10)
setSpeed(scene, util, util.select.fromTo(0, 1, 2, 1, 1, 2), 16)
scene.text(90, 'Енергію теж можна _продавати державі_. Твій генератор — колесо, вітряк, двигун — крутить вал до державної мережі.', [0.5, 1.5, 2.5])
.placeNearTarget().attachKeyFrame()
scene.idle(100)
scene.world.showSection([3, 1, 2, 4, 1, 2], Direction.DOWN)
scene.idle(10)
scene.world.showSection([2, 1, 2], Direction.DOWN)
scene.idle(10)
setSpeed(scene, util, util.select.fromTo(0, 1, 2, 4, 1, 2), 16)
scene.overlay.showOutline(PonderPalette.GREEN, 'biz', util.select.fromTo(0, 1, 2, 1, 1, 2), 100)
scene.overlay.showOutline(PonderPalette.BLUE, 'state', util.select.fromTo(3, 1, 2, 4, 1, 2), 100)
scene.text(100, 'На стику — _державний лічильник_ (стресометр). Його ставить держава і прив\'язує до твого бізнесу.', [2.5, 1.8, 2.5])
.colored(PonderPalette.BLUE).placeNearTarget().attachKeyFrame()
scene.idle(110)
scene.text(110, 'Щохвилини держава платить бізнесу за _силу_ (SU), яку забирають її машини, — до ліміту лічильника.', [3.5, 1.5, 2.5])
.colored(PonderPalette.GREEN).placeNearTarget().attachKeyFrame()
scene.idle(120)
setSpeed(scene, util, util.select.fromTo(0, 1, 2, 4, 1, 2), 0)
scene.text(90, 'Генератор зупинився — оплата зупинилась. Перевантажив мережу — теж нічого не заробиш.', [1.5, 1.5, 2.5])
.colored(PonderPalette.RED).placeNearTarget()
scene.idle(100)
setSpeed(scene, util, util.select.fromTo(0, 1, 2, 4, 1, 2), 16)
scene.text(80, 'Хочеш лічильник? Звернися до держави — вона підключить твою електростанцію.', [2.5, 2.5, 2.5])
scene.idle(90)
} }
// --------------------------------------------------------------------------------------------- // ---------------------------------------------------------------------------------------------
@@ -249,9 +198,8 @@ function moneyScene(scene, util) {
scene.world.showSection([2, 1, 2], Direction.DOWN) scene.world.showSection([2, 1, 2], Direction.DOWN)
scene.idle(15) scene.idle(15)
scene.text(90, 'Твої гроші — на _рахунку_ в державному банку. Баланс і перекази — термінал → Рахунок.', [2.5, 1.5, 2.5]) say(scene, 70, 'Твої гроші лежать на рахунку в банку', [2.5, 1.5, 2.5], null, true)
.placeNearTarget().attachKeyFrame() say(scene, 60, 'Баланс і перекази — у терміналі', [2.5, 1.5, 2.5])
scene.idle(100)
const coins = ['numismatics:spur', 'numismatics:bevel', 'numismatics:sprocket', 'numismatics:cog'] const coins = ['numismatics:spur', 'numismatics:bevel', 'numismatics:sprocket', 'numismatics:cog']
for (let i = 0; i < coins.length; i++) { for (let i = 0; i < coins.length; i++) {
@@ -259,17 +207,13 @@ function moneyScene(scene, util) {
scene.idle(5) scene.idle(5)
} }
scene.idle(10) scene.idle(10)
scene.text(110, '_Готівка_ — монети: зняти /cash withdraw <сума>, покласти — /cash deposit з монетами в руці. Готівкою платять одне одному з рук.', [2.5, 2, 1.5]) say(scene, 70, 'Монети — це готівка', [2.5, 2, 1.5], PonderPalette.GREEN, true)
.colored(PonderPalette.GREEN).placeNearTarget().attachKeyFrame() say(scene, 70, 'Зняти: /cash withdraw <сума>', [2.5, 2, 1.5])
scene.idle(120) say(scene, 70, 'Покласти: монети в руку і /cash deposit', [2.5, 2, 1.5])
scene.text(100, '_Банк_ (термінал → Банк): стартовий та інвестиційний кредити для бізнесу, вклади під відсоток щодня.', [2.5, 1.5, 2.5]) say(scene, 70, 'Банк дає кредити бізнесу', [2.5, 1.5, 2.5], PonderPalette.BLUE, true)
.placeNearTarget().attachKeyFrame() say(scene, 60, 'А вклад щодня приносить відсоток', [2.5, 1.5, 2.5])
scene.idle(110) say(scene, 80, 'Пропустив 3 платежі по кредиту — рахунок заморожено', [2.5, 1.5, 2.5], PonderPalette.RED)
scene.text(90, 'Кредит платиться щоденними внесками. Пропустиш тричі — _дефолт_: рахунок бізнесу заморожено, тендери заборонені.', [2.5, 1.5, 2.5])
.colored(PonderPalette.RED).placeNearTarget()
scene.idle(100)
} }
// --------------------------------------------------------------------------------------------- // ---------------------------------------------------------------------------------------------
@@ -284,73 +228,175 @@ function landScene(scene, util) {
scene.world.setBlocks([2, 1, 2], 'minecraft:iron_ore') scene.world.setBlocks([2, 1, 2], 'minecraft:iron_ore')
scene.idle(10) scene.idle(10)
scene.text(90, 'Уся незареєстрована земля _належить державі_. Будувати можна на своїх ділянках.', [2.5, 1, 2.5]) say(scene, 70, 'Нічия земля належить державі', [2.5, 1, 2.5], null, true)
.placeNearTarget().attachKeyFrame()
scene.idle(100)
scene.overlay.showOutline(PonderPalette.GREEN, 'plot', util.select.fromTo(0, 0, 0, 4, 0, 4), 120) 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) scene.world.showSection([1, 1, 1, 3, 1, 3], Direction.DOWN)
scene.text(110, '_Ділянки_ орендують на ігрові дні або викуповують: термінал → Земля. Заходячи на ділянку, бачиш її назву над хотбаром.', [2.5, 1.5, 2.5]) say(scene, 70, 'Будуй на своїй ділянці', [2.5, 1.5, 2.5], PonderPalette.GREEN, true)
.colored(PonderPalette.GREEN).placeNearTarget().attachKeyFrame() say(scene, 70, 'Орендуй або купи її в терміналі: Земля', [2.5, 1.5, 2.5])
scene.idle(120) say(scene, 70, 'На ділянці над хотбаром видно її назву', [2.5, 1.5, 2.5])
say(scene, 70, 'Чужі тут не ламають, а твої працівники — можуть', [2.5, 1.5, 2.5])
scene.text(100, 'Орендована ділянка — _приват_ бізнесу: чужі не ламають, а твої працівники мають доступ.', [2.5, 1.5, 2.5]) scene.overlay.showOutline(PonderPalette.RED, 'ore', util.select.position(2, 1, 2), 150)
.placeNearTarget() say(scene, 70, 'Руду копають лише з концесією', [2.5, 1.5, 2.5], PonderPalette.RED, true)
scene.idle(110) say(scene, 70, 'Купи її в терміналі: Земля → Купити концесію', [2.5, 1.5, 2.5])
say(scene, 80, 'За землю платиш щодня. Не платив 3 дні — ділянку забирають', [2.5, 2.5, 2.5])
scene.overlay.showOutline(PonderPalette.RED, 'ore', util.select.position(2, 1, 2), 100)
scene.text(100, '_Руда_ видобувається за _концесією_: купи дозвіл на руду й квоту на ділянці (термінал → Земля → Купити концесію).', [2.5, 1.5, 2.5])
.colored(PonderPalette.RED).placeNearTarget().attachKeyFrame()
scene.idle(110)
scene.text(80, 'За землю щодня — орендна плата або податок. Не заплатив 3 дні — ділянка повертається державі.', [2.5, 2.5, 2.5])
scene.idle(90)
} }
// --------------------------------------------------------------------------------------------- // ---------------------------------------------------------------------------------------------
// 6. Робота: ринок праці і пошта // 6. Робота: ринок праці й пошта
function jobsScene(scene, util) { function jobsScene(scene, util) {
scene.showBasePlate() scene.showBasePlate()
scene.idle(10) scene.idle(10)
const post = scene.world.createEntity('minecraft:villager', [1, 1, 2.5]) scene.world.createEntity('minecraft:villager', [1, 1, 2.5])
scene.idle(10) scene.idle(10)
scene.text(90, 'Немає роботи? Термінал → Робота → _ринок праці_: допомога по безробіттю щодня, якщо ти був активний у грі.', [2.5, 2.5, 2.5]) say(scene, 70, 'Немає роботи? Стань на ринок праці', [2.5, 2.5, 2.5], null, true)
.placeNearTarget().attachKeyFrame() say(scene, 70, 'Держава щодня платить допомогу, якщо ти грав', [2.5, 2.5, 2.5])
scene.idle(100)
scene.text(90, 'Хочеш заробляти більше — стань _поштарем_. Клікни по NPC пошти.', [1, 2.5, 2.5])
.colored(PonderPalette.BLUE).placeNearTarget().attachKeyFrame()
scene.showControls(60, [1, 2.3, 2.5], 'down').rightClick() scene.showControls(60, [1, 2.3, 2.5], 'down').rightClick()
scene.idle(70) 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.05, 0.25, 0], PACKAGE)
scene.world.createItemEntity([1.5, 2, 2.5], [0.03, 0.3, 0.03], 'minecraft:compass') scene.world.createItemEntity([1.5, 2, 2.5], [0.03, 0.3, 0.03], 'minecraft:compass')
scene.idle(20) scene.idle(20)
scene.text(100, 'Отримаєш _посилку_ з іменем адресата й _компас_, що вказує на нього. ПКМ компасом — мітка на місці (видно лише тобі).', [2, 1.5, 2.5]) say(scene, 70, 'NPC пошти дасть посилку й компас', [2, 1.5, 2.5], null, true)
.placeNearTarget().attachKeyFrame() say(scene, 70, 'Компас веде до адресата', [2, 1.5, 2.5])
scene.idle(110) say(scene, 70, 'ПКМ компасом — мітка на місці', [2, 1.5, 2.5], PonderPalette.BLUE)
scene.world.createEntity('minecraft:villager', [4, 1, 2.5]) 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], 80) scene.overlay.showBigLine(PonderPalette.OUTPUT, [1.5, 1.2, 2.5], [4, 1.2, 2.5], 100)
scene.text(100, 'Адресат чекає в іншій частині світу. Принеси посилку й клікни по ньому — гроші на рахунок. Що далі, то дорожче.', [4, 2.5, 2.5]) say(scene, 70, 'Віддай посилку адресату — і отримаєш гроші', [4, 2.5, 2.5], PonderPalette.GREEN, true)
.colored(PonderPalette.GREEN).placeNearTarget().attachKeyFrame() say(scene, 60, 'Що далі везти — то більше платять', [4, 2.5, 2.5])
scene.idle(110) say(scene, 60, 'На доставку — 2 ігрові дні', [2.5, 2.5, 2.5], PonderPalette.RED)
say(scene, 80, 'Або наймися в бізнес: термінал → Бізнес', [2.5, 2.5, 2.5], null, true)
}
scene.text(80, 'На доставку — _2 ігрові дні_. Не встиг — адресат поїде, і посилка згорить.', [2.5, 2.5, 2.5]) // ---------------------------------------------------------------------------------------------
.colored(PonderPalette.RED) // 8. Вантажник
scene.idle(90)
scene.text(90, 'Або наймися до бізнесу: власник пропонує зарплату, ти приймаєш у терміналі → Бізнес → Прийняти запрошення.', [2.5, 2.5, 2.5]) function cargoScene(scene, util) {
scene.idle(100) 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])
}
// ---------------------------------------------------------------------------------------------
// 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)
} }
// --------------------------------------------------------------------------------------------- // ---------------------------------------------------------------------------------------------
Ponder.tags(event => { Ponder.tags(event => {
event.createTag('kubejs:createrp', 'kubejs:citizen_guide', 'Держава Create RP', 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']) ['kubejs:citizen_guide', 'create:package_frogport', 'computercraft:computer_advanced', 'computercraft:computer_normal', 'computercraft:monitor_advanced', 'create:stressometer'])
}) })
@@ -363,6 +409,8 @@ Ponder.registry(event => {
.scene('guide_money', 'Гроші й банк', moneyScene) .scene('guide_money', 'Гроші й банк', moneyScene)
.scene('guide_land', 'Земля й надра', landScene) .scene('guide_land', 'Земля й надра', landScene)
.scene('guide_jobs', 'Робота: ринок праці й пошта', jobsScene) .scene('guide_jobs', 'Робота: ринок праці й пошта', jobsScene)
.scene('guide_cargo', 'Робота: вантажник', cargoScene)
.scene('guide_roads', 'Робота: дорожник', roadsScene)
event.create('create:package_frogport') event.create('create:package_frogport')
.scene('frogport_sell', 'Create RP: продаж державі', FROG_STRUCTURE, sellScene) .scene('frogport_sell', 'Create RP: продаж державі', FROG_STRUCTURE, sellScene)
-13
View File
@@ -1,13 +0,0 @@
name = "XPlus Autofish (Fabric / Forge / NeoForge)"
filename = "xplus-autofish-1.3.3-neoforged-mc1.21.1.jar"
side = "client"
[download]
url = "https://cdn.modrinth.com/data/2H1rLgy4/versions/nC2iqgow/xplus-autofish-1.3.3-neoforged-mc1.21.1.jar"
hash-format = "sha512"
hash = "e1680e37749e0229972be0feede3d88141c59e04f6bdc66a61238aad950134e132b366f70361a0cf703e132a8bb2b15dc5befa5989caded852e67a2b829ae6f0"
[update]
[update.modrinth]
mod-id = "2H1rLgy4"
version = "nC2iqgow"
+2 -2
View File
@@ -1,12 +1,12 @@
name = "Create RP" name = "Create RP"
author = "Pinecraft-CreateRP" author = "Pinecraft-CreateRP"
version = "0.6.1" version = "0.7.0"
pack-format = "packwiz:1.1.0" pack-format = "packwiz:1.1.0"
[index] [index]
file = "index.toml" file = "index.toml"
hash-format = "sha256" hash-format = "sha256"
hash = "2a8313cb0a107c64dc9c434c0f331fdc545223c9d9293fb7fc57b85ca54256fa" hash = "061b0574da762d2dd8b9d981a0d52be81db87fc54afee42aad118e4ed369dc1e"
[versions] [versions]
minecraft = "1.21.1" minecraft = "1.21.1"