@@ -1,6 +1,7 @@
// Create RP — туторіал у стилі Create (Ponder): наведи на предмет і затисни W.
// Потрібні 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'
@@ -17,27 +18,28 @@ try {
console . warn ( '[createrp] Create classes unavailable for Ponder animations: ' + e )
}
// посилка з адресою їде ланцюгами від пакужаби from до пакужаби to (по вузлах CONV2 → CONV1)
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 )
frogTakes ( scene , util , CONV1 , TO _FROG , box )
scene . idle ( 10 )
// один крок: підпис біля точки й пауза, поки його читають
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 )
}
function setSpeed ( scene , util , sel , speed ) {
if ( CreateScene ) new CreateScene ( scene ) . world ( ) . setKineticSpeed ( sel , speed )
// Create's own kinetic helper; in KubeJS `world` is a property, not a method
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 CONV1 = [ 1 , 4 , 7 ] , CONV2 = [ 7 , 4 , 7 ]
const FROM _FROG = [ 5 , 2 , 2 ] , TO _FROG = [ 2 , 2 , 5 ]
@@ -48,7 +50,7 @@ function addressedBox(address) {
return box
}
// посилки, що крутяться на одному ланцюговому вузлі, їдуть до іншого (Create: boxTransfer)
// посилки, що крутяться на одному вузлі ланцюга , їдуть до іншого (Create: boxTransfer)
function chainTransfer ( scene , util , to , from ) {
scene . world . modifyBlockEntity ( util . grid . at ( from [ 0 ] , from [ 1 ] , from [ 2 ] ) , ChainConveyor , be => {
const it = be . getLoopingPackages ( ) . iterator ( )
@@ -61,13 +63,24 @@ function chainTransfer(scene, util, to, from) {
} )
}
// пакужаба на прийомі: знімає посилки з вузла й «ковтає» їх
function frogTakes ( scene , util , conv , frog , box ) {
scene . world . modifyBlockEntity ( util . grid . at ( conv [ 0 ] , conv [ 1 ] , conv [ 2 ] ) , ChainConveyor , be => be . getLoopingPackages ( ) . clear ( ) )
scene . world . modifyBlockEntity ( util . grid . at ( frog [ 0 ] , frog [ 1 ] , frog [ 2 ] ) , Frogport , be => be . startAnimation ( box , false ) )
// посилка з адресою їде ланцюгами від пакужаби (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
// мережа з'являється так само, як у Create
function showChainNetwork ( scene , util ) {
scene . configureBasePlate ( 0 , 0 , 9 )
scene . scaleSceneView ( 0.75 )
@@ -88,6 +101,23 @@ function showChainNetwork(scene, util) {
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. Термінал держави
@@ -99,145 +129,64 @@ function terminalScene(scene, util) {
scene . world . showSection ( [ 2 , 1 , 2 ] , Direction . DOWN )
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 . idle ( 90 )
scene . text ( 90 , 'Вхід — т вій _ нік_ і _ пароль_. Першого разу термінал попросить створити пароль. Стій поруч із комп\'ютером — здалеку не пустить. ', [ 2.5 , 1.5 , 2.5 ] )
. placeNearTarget ( ) . attachKeyFrame ( )
scene . idle ( 100 )
scene . text ( 90 , 'У меню: _рахунок_, _бізнес_, _ціни_, _магазин_, _земля_, _робота_, _тендери_, _банк_. Стрілки й Enter, Backspace — назад.' , [ 2.5 , 1.5 , 2.5 ] )
. placeNearTarget ( )
scene . idle ( 100 )
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 )
scene . world . showSection ( [ 1 , 1 , 3 , 3 , 2 , 3 ] , Direction . DOWN )
scene . idle ( 15 )
scene . text ( 90 , 'Комп\'ютер з _монітором_ — табло цін держави: програма _prices metal_ (або stone, wood, farm, food, create…). ', [ 2 , 2.5 , 3 ] )
. colored ( PonderPalette . BLUE ) . placeNearTarget ( ) . attachKeyFrame ( )
scene . idle ( 100 )
say ( scene , 70 , 'Додай монітор — і набери prices metal ', [ 2 , 2.5 , 3 ] , PonderPalette . BLUE , true )
say ( scene , 60 , 'Вийде табло цін держави' , [ 2 , 2.5 , 3 ] )
}
// ---------------------------------------------------------------------------------------------
// 2. Продаж державі (схематика Create з ланцюгами)
// 2. Продаж державі
function sellScene ( scene , util ) {
showChainNetwork ( scene , util )
scene . text ( 90 , 'Бізнеси й держава з\'єднані _мережею ланцюгів_. Посилка сама знаходить пакужабу з потрібною адресою. ', [ 4 , 4.5 , 7 ] )
. placeNearTarget ( ) . attachKeyFrame ( )
scene . idle ( 100 )
say ( scene , 70 , 'Держава купує все, що ти добуваєш і виробляєш ', [ 4 , 4.5 , 4 ] , null , true )
say ( scene , 70 , 'Товар їде до неї посилками по ланцюгах' , [ 4 , 4.5 , 7 ] )
// бізнес: сховище, пакувальник з табличкою, пакужаба на ланцюгу
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 )
showRightSide ( scene , util )
scene . world . showSection ( util . select . position ( 4 , 1 , 2 ) , Direction . EAST )
scene . world . showSection ( util . select . position ( 5 , 2 , 2 ) , Direction . DOWN )
scene . idle ( 15 )
scene . text ( 110 , 'Твій бізнес: сховище → _пакувальник_ → _пакужаба_ на ланцюгу. Табличка на пакувальнику — адреса продажу _gov-…_ (термінал → Бізнес → Адреса продажу). ', [ 4.5 , 1.5 , 2.5 ] )
. placeNearTarget ( ) . attachKeyFrame ( )
scene . idle ( 120 )
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 ] )
// держава: пакужаба з фільтром gov-* і приймач під нею
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 . 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 )
showLeftSide ( scene , util )
say ( scene , 80 , 'Це державна пакужаба — вона приймає всі адреси gov-…' , [ 2.5 , 2.5 , 5.5 ] , PonderPalette . BLUE , true )
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' )
scene . text ( 110 , '…до держави. Гроші — на _ рахунок бізнесу_. Товару забагато — ціна падає, дефіцит — росте. Ціни — на табло й у терміналі. ', [ 2.5 , 2.5 , 5.5 ] )
. colored ( PonderPalette . GREEN ) . placeNearTarget ( ) . attachKeyFrame ( )
scene . idle ( 120 )
scene . text ( 80 , 'Поїзди, ферми, ланцюги — продаж іде сам, поки ти робиш інше.' , [ 4 , 4.5 , 4 ] )
scene . idle ( 90 )
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. Покупка в держави (та сама мережа, напрямок навпаки)
// 3. Покупки в держави
function buyScene ( scene , util ) {
showChainNetwork ( 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 ( 5 , 2 , 2 ) , Direction . DOWN )
scene . idle ( 15 )
scene . text ( 100 , '_Державний склад_: пакувальник і пакужаба держави на тій самій мережі ланцюгів.' , [ 5.5 , 2.5 , 2.5 ] )
. colored ( PonderPalette . BLUE ) . placeNearTarget ( ) . attachKeyFrame ( )
scene . idle ( 110 )
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 ] )
scene . text ( 100 , 'Держава продає _імпорт_ (алмази, незерит, елітри…) і _ліцензії_. Купівля — термінал → Магазин держави.' , [ 4 , 4.5 , 4 ] )
. placeNearTarget ( ) . attachKeyFrame ( )
scene . idle ( 110 )
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 )
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 , 'Склад Олі' )
scene . text ( 100 , 'Посилка приходить сама. _Пакувальник_ під твоєю пакужабою розпакує її у скриню. ' , [ 3.5 , 1.5 , 5.5 ] )
. colored ( PonderPalette . GREEN ) . placeNearTarget ( ) . attachKeyFrame ( )
scene . idle ( 110 )
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 )
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 )
}
// ---------------------------------------------------------------------------------------------
@@ -249,9 +198,8 @@ function moneyScene(scene, util) {
scene . world . showSection ( [ 2 , 1 , 2 ] , Direction . DOWN )
scene . idle ( 15 )
scene . text ( 90 , 'Твої гроші — на _ рахунку_ в державному банку. Баланс і перекази — термінал → Рахунок. ' , [ 2.5 , 1.5 , 2.5 ] )
. placeNearTarget ( ) . attachKeyFrame ( )
scene . idle ( 100 )
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 ++ ) {
@@ -259,17 +207,13 @@ function moneyScene(scene, util) {
scene . idle ( 5 )
}
scene . idle ( 10 )
scene . text ( 110 , '_Готівка_ — монети: зняти /cash withdraw <сума>, покласти — /cash deposit з монетами в руці. Готівкою платять одне одному з рук. ', [ 2.5 , 2 , 1.5 ] )
. colored ( PonderPalette . GREEN ) . placeNearTarget ( ) . attachKeyFrame ( )
scene . idle ( 120 )
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 ] )
scene . text ( 100 , '_ Банк_ (термінал → Банк): стартовий та інвестиційний кредити для бізнесу, вклади під відсоток щодня. ' , [ 2.5 , 1.5 , 2.5 ] )
. placeNearTarget ( ) . attachKeyFrame ( )
scene . idle ( 110 )
scene . text ( 90 , 'Кредит платиться щоденними внесками. Пропустиш тричі — _дефолт_: рахунок бізнесу заморожено, тендери заборонені.' , [ 2.5 , 1.5 , 2.5 ] )
. colored ( PonderPalette . RED ) . placeNearTarget ( )
scene . idle ( 100 )
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 )
}
// ---------------------------------------------------------------------------------------------
@@ -284,73 +228,175 @@ function landScene(scene, util) {
scene . world . setBlocks ( [ 2 , 1 , 2 ] , 'minecraft:iron_ore' )
scene . idle ( 10 )
scene . text ( 90 , 'Уся незареєстрована земля _ належить державі_. Будувати можна на своїх ділянках. ', [ 2.5 , 1 , 2.5 ] )
. placeNearTarget ( ) . attachKeyFrame ( )
scene . idle ( 100 )
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 ) , 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 . text ( 110 , '_Ділянки_ орендують на ігрові дні або викуповують: термінал → Земля. Заходячи на ділянку, бачиш її назву над хотбаром. ', [ 2.5 , 1.5 , 2.5 ] )
. colored ( PonderPalette . GREEN ) . placeNearTarget ( ) . attachKeyFrame ( )
scene . idle ( 120 )
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 . text ( 100 , 'Орендована ділянка — _приват_ бізнесу: чужі не ламають, а твої працівники мають доступ.' , [ 2.5 , 1.5 , 2.5 ] )
. placeNearTarget ( )
scene . idle ( 110 )
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 )
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 , 80 , 'За землю платиш щодня. Не платив 3 дні — ділянку забирають' , [ 2.5 , 2.5 , 2.5 ] )
}
// ---------------------------------------------------------------------------------------------
// 6. Робота: ринок праці і пошта
// 6. Робота: ринок праці й пошта
function jobsScene ( scene , util ) {
scene . showBasePlate ( )
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 . text ( 90 , 'Немає роботи? Термінал → Робота → _ринок праці_: допомога по безробіттю щодня, якщо ти був активний у грі. ' , [ 2.5 , 2.5 , 2.5 ] )
. placeNearTarget ( ) . attachKeyFrame ( )
scene . idle ( 100 )
say ( scene , 70 , 'Немає роботи? Стань на ринок праці ' , [ 2.5 , 2.5 , 2.5 ] , null , true )
say ( scene , 70 , 'Держава щодня платить допомогу, якщо ти грав' , [ 2.5 , 2.5 , 2.5 ] )
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 . 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.03 , 0.3 , 0.03 ] , 'minecraft:compass' )
scene . idle ( 20 )
scene . text ( 100 , 'Отримаєш _посилку_ з іменем адресата й _компас_, що вказує на нього. ПКМ компасом — мітка на місці (видно лише тобі). ', [ 2 , 1.5 , 2.5 ] )
. placeNearTarget ( ) . attachKeyFrame ( )
scene . idle ( 110 )
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 ] , 80 )
scene . text ( 100 , 'Адресат чекає в іншій частині світу. Принеси посилку й клікни по ньому — гроші на рахунок. Що далі, то дорожче. ', [ 4 , 2.5 , 2.5 ] )
. colored ( PonderPalette . GREEN ) . placeNearTarget ( ) . attachKeyFrame ( )
scene . idle ( 110 )
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 )
}
scene . text ( 80 , 'На доставку — _2 ігрові дні_. Не встиг — адресат поїде, і посилка згорить.' , [ 2.5 , 2.5 , 2.5 ] )
. colored ( PonderPalette . RED )
scene . idle ( 90 )
// ---------------------------------------------------------------------------------------------
// 8. Вантажник
scene . text ( 90 , 'Або наймися до бізнесу: власник пропонує зарплату, ти приймаєш у терміналі → Бізнес → Прийняти запрошення.' , [ 2.5 , 2.5 , 2.5 ] )
scene . idle ( 100 )
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 ] )
}
// ---------------------------------------------------------------------------------------------
// 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 => {
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' ] )
} )
@@ -363,6 +409,8 @@ Ponder.registry(event => {
. scene ( 'guide_money' , 'Гроші й банк' , moneyScene )
. scene ( 'guide_land' , 'Земля й надра' , landScene )
. scene ( 'guide_jobs' , 'Робота: ринок праці й пошта' , jobsScene )
. scene ( 'guide_cargo' , 'Робота: вантажник' , cargoScene )
. scene ( 'guide_roads' , 'Робота: дорожник' , roadsScene )
event . create ( 'create:package_frogport' )
. scene ( 'frogport_sell' , 'Create RP: продаж державі' , FROG _STRUCTURE , sellScene )