From 504033b65e5021b9df463b73cbda713d866ef654 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Tue, 21 Feb 2023 16:10:58 +0700 Subject: [PATCH] not so good attempt at improving clarity of configuration menu --- .../mc/otm/client/render/WidgetLocation.kt | 2 +- .../mc/otm/client/render/Widgets18.kt | 59 ++++++++++++++++-- .../client/screen/panels/button/Buttons.kt | 52 ++++++--------- .../textures/gui/widgets/side_controls.png | Bin 1189 -> 2020 bytes .../textures/gui/widgets/side_controls.xcf | Bin 7474 -> 36864 bytes 5 files changed, 74 insertions(+), 39 deletions(-) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/WidgetLocation.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/WidgetLocation.kt index 0b4725b34..5b13d0273 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/WidgetLocation.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/WidgetLocation.kt @@ -17,5 +17,5 @@ object WidgetLocation { val HORIZONTAL_GAUGES = MatteryAtlas(ResourceLocation(OverdriveThatMatters.MOD_ID, "textures/gui/widgets/horizontal_gauges.png"), 96f, 54f) val VERTICAL_GAUGES = MatteryAtlas(ResourceLocation(OverdriveThatMatters.MOD_ID, "textures/gui/widgets/vertical_gauges.png"), 90f, 48f) val REDSTONE_CONTROLS = MatteryAtlas(ResourceLocation(OverdriveThatMatters.MOD_ID, "textures/gui/widgets/redstone.png"), 54f, 18f) - val SIDE_CONTROLS = MatteryAtlas(ResourceLocation(OverdriveThatMatters.MOD_ID, "textures/gui/widgets/side_controls.png"), 72f, 72f) + val SIDE_CONTROLS = MatteryAtlas(ResourceLocation(OverdriveThatMatters.MOD_ID, "textures/gui/widgets/side_controls.png"), 144f, 72f) } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/Widgets18.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/Widgets18.kt index 1b0a14618..603a47cb6 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/Widgets18.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/Widgets18.kt @@ -1,5 +1,10 @@ package ru.dbotthepony.mc.otm.client.render +import ru.dbotthepony.mc.otm.block.entity.MatteryDeviceBlockEntity +import ru.dbotthepony.mc.otm.capability.FlowDirection +import ru.dbotthepony.mc.otm.core.immutableMap +import ru.dbotthepony.mc.otm.core.math.RelativeSide + private fun makeButton(grid: GridAtlas): StretchingRectangleElement { val x = grid.currentX val y = grid.currentY @@ -56,17 +61,61 @@ object Widgets18 { val REDSTONE_LOW = redstoneGrid.next() val REDSTONE_HIGH = redstoneGrid.next() - private val controlsGrid = WidgetLocation.SIDE_CONTROLS.grid(rows = 4, columns = 4) + private val controlsGrid = WidgetLocation.SIDE_CONTROLS.grid(rows = 4, columns = 8) val PULL = controlsGrid.next() val PUSH = controlsGrid.next() val PULL_DISABLED = controlsGrid.next() val PUSH_DISABLED = controlsGrid.next() - val DISABLED = controlsGrid.next() - val INPUT_ONLY = controlsGrid.next() - val OUTPUT_ONLY = controlsGrid.next() - val INPUT_OUTPUT = controlsGrid.next() + + private fun controls() = immutableMap { + put(FlowDirection.NONE, controlsGrid.next()) + put(FlowDirection.INPUT, controlsGrid.next()) + put(FlowDirection.OUTPUT, controlsGrid.next()) + put(FlowDirection.BI_DIRECTIONAL, controlsGrid.next()) + } + + private fun controls2(input: Map) = immutableMap { + put(MatteryDeviceBlockEntity.ItemHandlerMode.DISABLED, input[FlowDirection.NONE]!!) + put(MatteryDeviceBlockEntity.ItemHandlerMode.INPUT, input[FlowDirection.INPUT]!!) + put(MatteryDeviceBlockEntity.ItemHandlerMode.OUTPUT, input[FlowDirection.OUTPUT]!!) + put(MatteryDeviceBlockEntity.ItemHandlerMode.INPUT_OUTPUT, input[FlowDirection.BI_DIRECTIONAL]!!) + put(MatteryDeviceBlockEntity.ItemHandlerMode.BATTERY, BATTERY_ONLY) + } + + val LEFT_CONTROLS = controls() + val RIGHT_CONTROLS = controls() + val TOP_CONTROLS = controls() + val BOTTOM_CONTROLS = controls() + val FRONT_CONTROLS = controls() + val BACK_CONTROLS = controls() + + val CONTROLS = immutableMap { + put(RelativeSide.BOTTOM, BOTTOM_CONTROLS) + put(RelativeSide.TOP, TOP_CONTROLS) + put(RelativeSide.LEFT, LEFT_CONTROLS) + put(RelativeSide.RIGHT, RIGHT_CONTROLS) + put(RelativeSide.FRONT, FRONT_CONTROLS) + put(RelativeSide.BACK, BACK_CONTROLS) + } + val BATTERY_ONLY = controlsGrid.next() val ITEMS_CONFIGURATION = controlsGrid.next() val ENERGY_CONFIGURATION = controlsGrid.next() + + val LEFT_CONTROLS_ITEMS = controls2(LEFT_CONTROLS) + val RIGHT_CONTROLS_ITEMS = controls2(RIGHT_CONTROLS) + val TOP_CONTROLS_ITEMS = controls2(TOP_CONTROLS) + val BOTTOM_CONTROLS_ITEMS = controls2(BOTTOM_CONTROLS) + val FRONT_CONTROLS_ITEMS = controls2(FRONT_CONTROLS) + val BACK_CONTROLS_ITEMS = controls2(BACK_CONTROLS) + + val ITEMS_CONTROLS = immutableMap { + put(RelativeSide.BOTTOM, BOTTOM_CONTROLS_ITEMS) + put(RelativeSide.TOP, TOP_CONTROLS_ITEMS) + put(RelativeSide.LEFT, LEFT_CONTROLS_ITEMS) + put(RelativeSide.RIGHT, RIGHT_CONTROLS_ITEMS) + put(RelativeSide.FRONT, FRONT_CONTROLS_ITEMS) + put(RelativeSide.BACK, BACK_CONTROLS_ITEMS) + } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/Buttons.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/Buttons.kt index 0902b3524..72ef6acce 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/Buttons.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/button/Buttons.kt @@ -5,6 +5,7 @@ import ru.dbotthepony.mc.otm.block.entity.MatteryDeviceBlockEntity import ru.dbotthepony.mc.otm.block.entity.RedstoneSetting import ru.dbotthepony.mc.otm.capability.FlowDirection import ru.dbotthepony.mc.otm.client.minecraft +import ru.dbotthepony.mc.otm.client.render.UVWindingOrder import ru.dbotthepony.mc.otm.client.render.Widgets18 import ru.dbotthepony.mc.otm.client.screen.MatteryScreen import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel @@ -41,19 +42,11 @@ private fun > makeRedstoneSettingButton( } } -private fun > makeItemModeButton(screen: S, parent: FramePanel, input: ItemHandlerPlayerInput.Piece): LargeEnumRectangleButtonPanel { +private fun > makeItemModeButton(screen: S, parent: FramePanel, input: ItemHandlerPlayerInput.Piece, side: RelativeSide): LargeEnumRectangleButtonPanel { val button = LargeEnumRectangleButtonPanel(screen, parent, enum = MatteryDeviceBlockEntity.ItemHandlerMode::class.java, prop = input.input, defaultValue = input.default) - val values = listOf( - MatteryDeviceBlockEntity.ItemHandlerMode.DISABLED to Widgets18.DISABLED, - MatteryDeviceBlockEntity.ItemHandlerMode.INPUT to Widgets18.INPUT_ONLY, - MatteryDeviceBlockEntity.ItemHandlerMode.OUTPUT to Widgets18.OUTPUT_ONLY, - MatteryDeviceBlockEntity.ItemHandlerMode.INPUT_OUTPUT to Widgets18.INPUT_OUTPUT, - MatteryDeviceBlockEntity.ItemHandlerMode.BATTERY to Widgets18.BATTERY_ONLY, - ) - - for ((k, v) in values) { - button.add(k, skinElement = v, tooltip = TranslatableComponent(k.translationKey)) + for (v in MatteryDeviceBlockEntity.ItemHandlerMode.values()) { + button.add(v, skinElement = Widgets18.ITEMS_CONTROLS[side]!![v]!!, tooltip = TranslatableComponent(v.translationKey)) } button.finish() @@ -62,18 +55,11 @@ private fun > makeItemModeButton(screen: S, parent: FramePa return button } -private fun > makeEnergyModeButton(screen: S, parent: FramePanel, input: EnergyPlayerInput.Piece): LargeEnumRectangleButtonPanel { +private fun > makeEnergyModeButton(screen: S, parent: FramePanel, input: EnergyPlayerInput.Piece, side: RelativeSide): LargeEnumRectangleButtonPanel { val button = LargeEnumRectangleButtonPanel(screen, parent, enum = FlowDirection::class.java, prop = input.input, defaultValue = input.default) - val values = listOf( - FlowDirection.NONE to Widgets18.DISABLED, - FlowDirection.INPUT to Widgets18.INPUT_ONLY, - FlowDirection.OUTPUT to Widgets18.OUTPUT_ONLY, - FlowDirection.BI_DIRECTIONAL to Widgets18.INPUT_OUTPUT, - ) - - for ((k, v) in values) { - button.add(k, skinElement = v, tooltip = TranslatableComponent(k.translationKey)) + for (v in FlowDirection.values()) { + button.add(v, skinElement = Widgets18.CONTROLS[side]!![v]!!, tooltip = TranslatableComponent(v.translationKey)) } button.finish() @@ -162,12 +148,12 @@ private fun > makeItemHandlerControlPanel( } } - val front = makeItemModeButton(screen, frame, inputs.pieces[RelativeSide.FRONT]!!) - val back = makeItemModeButton(screen, frame, inputs.pieces[RelativeSide.BACK]!!) - val left = makeItemModeButton(screen, frame, inputs.pieces[RelativeSide.LEFT]!!) - val right = makeItemModeButton(screen, frame, inputs.pieces[RelativeSide.RIGHT]!!) - val top = makeItemModeButton(screen, frame, inputs.pieces[RelativeSide.TOP]!!) - val bottom = makeItemModeButton(screen, frame, inputs.pieces[RelativeSide.BOTTOM]!!) + val front = makeItemModeButton(screen, frame, inputs.pieces[RelativeSide.FRONT]!!, RelativeSide.FRONT) + val back = makeItemModeButton(screen, frame, inputs.pieces[RelativeSide.BACK]!!, RelativeSide.BACK) + val left = makeItemModeButton(screen, frame, inputs.pieces[RelativeSide.LEFT]!!, RelativeSide.LEFT) + val right = makeItemModeButton(screen, frame, inputs.pieces[RelativeSide.RIGHT]!!, RelativeSide.RIGHT) + val top = makeItemModeButton(screen, frame, inputs.pieces[RelativeSide.TOP]!!, RelativeSide.TOP) + val bottom = makeItemModeButton(screen, frame, inputs.pieces[RelativeSide.BOTTOM]!!, RelativeSide.BOTTOM) pullPush(frame, inputs.pull, inputs.push) moveButtons(front, back, left, right, top, bottom) @@ -191,12 +177,12 @@ private fun > makeEnergyConfigPanel( } } - val front = makeEnergyModeButton(screen, frame, inputs.pieces[RelativeSide.FRONT]!!).also { it.predicate = Predicate { inputs.possibleModes.isSupertype(it) } } - val back = makeEnergyModeButton(screen, frame, inputs.pieces[RelativeSide.BACK]!!).also { it.predicate = Predicate { inputs.possibleModes.isSupertype(it) } } - val left = makeEnergyModeButton(screen, frame, inputs.pieces[RelativeSide.LEFT]!!).also { it.predicate = Predicate { inputs.possibleModes.isSupertype(it) } } - val right = makeEnergyModeButton(screen, frame, inputs.pieces[RelativeSide.RIGHT]!!).also { it.predicate = Predicate { inputs.possibleModes.isSupertype(it) } } - val top = makeEnergyModeButton(screen, frame, inputs.pieces[RelativeSide.TOP]!!).also { it.predicate = Predicate { inputs.possibleModes.isSupertype(it) } } - val bottom = makeEnergyModeButton(screen, frame, inputs.pieces[RelativeSide.BOTTOM]!!).also { it.predicate = Predicate { inputs.possibleModes.isSupertype(it) } } + val front = makeEnergyModeButton(screen, frame, inputs.pieces[RelativeSide.FRONT]!!, RelativeSide.FRONT).also { it.predicate = Predicate { inputs.possibleModes.isSupertype(it) } } + val back = makeEnergyModeButton(screen, frame, inputs.pieces[RelativeSide.BACK]!!, RelativeSide.BACK).also { it.predicate = Predicate { inputs.possibleModes.isSupertype(it) } } + val left = makeEnergyModeButton(screen, frame, inputs.pieces[RelativeSide.LEFT]!!, RelativeSide.LEFT).also { it.predicate = Predicate { inputs.possibleModes.isSupertype(it) } } + val right = makeEnergyModeButton(screen, frame, inputs.pieces[RelativeSide.RIGHT]!!, RelativeSide.RIGHT).also { it.predicate = Predicate { inputs.possibleModes.isSupertype(it) } } + val top = makeEnergyModeButton(screen, frame, inputs.pieces[RelativeSide.TOP]!!, RelativeSide.TOP).also { it.predicate = Predicate { inputs.possibleModes.isSupertype(it) } } + val bottom = makeEnergyModeButton(screen, frame, inputs.pieces[RelativeSide.BOTTOM]!!, RelativeSide.BOTTOM).also { it.predicate = Predicate { inputs.possibleModes.isSupertype(it) } } pullPush(frame, inputs.pull, inputs.push) moveButtons(front, back, left, right, top, bottom) diff --git a/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/side_controls.png b/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/side_controls.png index fafdeacc035cbc3616295c0db9084f558c7e0107..30dfc45a74927934ac1da9d45c7a56a12abc9060 100644 GIT binary patch delta 2010 zcmV<02POEW3FHqUiBL{Q4GJ0x0000DNk~Le0001x0000;2nGNE02wQM`jH_be?=+| zRuFN>P@OFJg*ZwTi(sL&6nNgNw7S4z7YA_yOYT;-u&z zCH^ldw21NGxF7HCJ?`ECLZiY|vuhksHOolFV`4V9Dh6I5U;sgcFd;EhPox(!@El+F z@bUF7%Co%B{W*G-yvYEcNIb`Mf5Rf)AfDN@bk6(4VOEk9;&b9LgDyz?$aUG}H_ki6e@tQNECMS>e3JS*_Gq>z@3Dp}e+|<~q$`#Ib|~ zk`N)IhB7L!5T#Wk#YBqsV;=q?$DbsZOs+B*ITlcb3d!+<|H1EW&BD~Af14DF0o^aQ z{V@Urc7bNyw!e>UyLkfmpMfi_?XNa~*-z5zZ7p&H^lbwd*KJMS11@)f!6#iZBuDbo z6bc34{fxdT2lU?pJ!@`nt$mz602%6P`35*R1V)RLz3%buU}tato@w>>19x|Fsqk^L z761SM24YJ`L;!98ZUAmKe*)Mh00009a7bBm000id000id0mpBsWB>pF2XskIMF-~s z6$t|)TnTJx000HyNkl3E5UpPJM>ug{xWH%=2TBeUC{wZsv^YAre;_N_ zNGLXrlt}&u21kbkW)tNCCkmXbxxk=6$^DDD;JjAv+;rEg>Ym>Df2aqG7R_vJP4}DX zs;_p5al3G)B9b)CysTfxYWt||325)sk$diy%H zlXW@&?sAYPw?C6okwKNe^C#}>d|qu{lBH$2+N)yAe+O!(?vFOV;rt05E0RPH z2}tBYCLg)e5j#laK}dx7(`3hmmMjk1B~80zanLSlT=FcfwsI{iU0a?)c3dp)$wi(N z0wE;QRAf>D`4cKhnCp|@mFlV0DlA42Z8@KU7(uk6!K`6 zFr?ZV+Y&ZGf0wFVM4ni*DIIyFrFzPww_zt&d7iz@9}|!UX|DD{7upnU*fAIk27|$1 z7$r8z9g{Vnu-uD^wzAG4$Cg&~T&p_3@)L(2I0c2cg( zzm}Bi;_QeCQK-!!9iLEC%W(~w>q6{^e>%uxRNTcT`g*-~T#qca5xDW~ za{k?M*Bi6r`@>yt?7Dn^P&-piL-&x26=Mq*S%TP&Sm60bxAR~{CJUI%A-V?~kv%6}v zub6VBf9U7O$0#8<#T{Bran%!AO>v4ltsNr|Lm;cRu&5fkxzMDa+gm{+A-88#${*Lp zn%);RofKR(ijpZ51vkE-c0$p8^EtGP=lqG;nY2+&3{gcV*~-xPqw%rnyG#2ssYje# zYx>Yg)HFUR*Xa9`;+yY77yL083NnDe}^gV(#9=CY?sTQ5_Y1!u+St+p8=Rl z>DL8?9^&U{6^V!<4%x=frHJdALJ#qCY>LDQ;%L)0zUBdvQsKJhSX=%`$;0&!yMDc> zo#+DsQXb>xe^E%TDiw`|8m>~&Sg7HetId(R8JokOQg$ZN!LbIbjgN>xMjk9-){M{K zf1gxuiaVS<((xJmlj==0W#mCHHS(0LwzLY#W;@RxT~dl2y+2cK*~+DS>xzOd)s87P zx8Y(5b6sgy2dccQEA6Cq>Sa8qphNwU+R2p@4(UntkRmac@~sOBI<1|Y)o3okRu@Ej zup%*+@~vwMI@C^X#paMmWH1;E27|#cf9f(mR5pjI5-y?aQ&+hZ&d$zM8-7<;S5EUi z($7gTjqNSGo6V{w68Va|_-{s3Q9IH-isfpr(oTM=orBv4)x_VQ?7O~@G?_r5-D0UO z2(crb^pwfZWrv99f3zgJ zKiPM0;Gw-xN39%@rv!Pn2*f?358cN1KeK7@_2F565`24jU%lDCaMEM3$g)^0h=}Os z=B78~AyOz3tverIp17rJD3K?aM04axNr-dgAUSfYHvQ37Rg1-wO*1$4;N{?>#&`RQVo?ETxt;R*@J} z+@X`k-PtIKn(b_>@^U=9v-EP-=bR|2NHoPAo*<+9Lqkibr_yRmqJl$ymjNlOk>9Oo z+n@WBeRpvCP0v_Ra1`}lP8vpFQDQvd(} delta 1172 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 delta 1126 zcmaJ`k9AfF<6`WR9!Iru(q@a;*$zRQ7lD6MWht5rb3%i zRARX*B0ebofCVFdAk_z77mR)K2b9vP`0*l$g?Q#}f}qufJ7?z1nX`B9o!JNS@!s9z z6Y2A9)2Gg~O?4%c8or@YsQDd)g%AQm2+^|C-y?>WWw#%ObuE7SanPpaN>c___(0$@J6BfZ zrLiGs{Bkqt`gJnTrs%|sDXTVERjn&krniUPm@?SKHxG_-eS)WH zGqWSE?!@=|*PSRk8;`4;Ie)0OOqo?GC8hdbN+U)X6<06Npf3w|RRe`Z-@5kEp*eHE znJ%{jsGg`2`#sJqy*XZ$_pmS@di$EzPxt3~L_gKd{~nXWL)3V+iVN{{GG!TMv4_?I z*Tj0HYSL-FEbngh8vN+AdLbx&8aK7+dlr@Xv)fQH2UP+phb}F|<9{_1D&|Tm7plqn z`og`!tHSHT^LM$nf#D;)eWM2kx=H9aDRnVL^I21d3!HBFlS)@?qo0}P{95*_kdY8? zL^`>*k->b;;#(o34a`ROFdH4oTi4zT8Ea=Y*2`?{XukCZv`ssiZ5mW;b<