From a8bed595c380dfe50bf044beff04648bb1a75a0b Mon Sep 17 00:00:00 2001 From: MEEPofFaith <54301439+MEEPofFaith@users.noreply.github.com> Date: Tue, 20 Sep 2022 05:43:05 -0700 Subject: [PATCH 1/4] Fix Variable Reactor power output (#7600) --- core/src/mindustry/world/blocks/power/VariableReactor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/mindustry/world/blocks/power/VariableReactor.java b/core/src/mindustry/world/blocks/power/VariableReactor.java index ae9aa1c693..891a25d573 100644 --- a/core/src/mindustry/world/blocks/power/VariableReactor.java +++ b/core/src/mindustry/world/blocks/power/VariableReactor.java @@ -78,7 +78,7 @@ public class VariableReactor extends PowerGenerator{ public void updateTile(){ heat = calculateHeat(sideHeat); - productionEfficiency = Mathf.clamp(heat / maxHeat) * efficiency; + productionEfficiency = efficiency; warmup = Mathf.lerpDelta(warmup, productionEfficiency > 0 ? 1f : 0f, warmupSpeed); if(instability >= 1f){ From b5d911100d2d1b5ece746df462d0565aa16b85f6 Mon Sep 17 00:00:00 2001 From: GTMZ <113624426+GTMZOMEAGEAmazon@users.noreply.github.com> Date: Tue, 20 Sep 2022 19:43:21 +0700 Subject: [PATCH 2/4] Update servers_v7.json (#7601) The old ip has been revoked, here is its new ip --- servers_v7.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/servers_v7.json b/servers_v7.json index 1b1c13b1e4..7003e2e074 100644 --- a/servers_v7.json +++ b/servers_v7.json @@ -122,6 +122,6 @@ }, { "name": "LightDustry", - "address": ["lightdustry.ddns.net:28583", "lightdusy.ddns.net:6567", "lightdusy.ddns.net:6568"] + "address": ["own-formerly.craft.playit.gg:26618", "lightdusy.ddns.net:6567", "lightdusy.ddns.net:6568"] } ] From 057f1ee44679fc82645ce94f83c42f453ac97dea Mon Sep 17 00:00:00 2001 From: Nunting <77824588+Nunting@users.noreply.github.com> Date: Tue, 20 Sep 2022 23:35:52 +0900 Subject: [PATCH 3/4] Update bundle_ko.properties (#7598) * Update bundle_ko.properties * Update bundle_ko.properties * Update bundle_ko.properties * Update bundle_ko.properties --- core/assets/bundles/bundle_ko.properties | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/core/assets/bundles/bundle_ko.properties b/core/assets/bundles/bundle_ko.properties index 5599d02084..f2ec3e9f24 100644 --- a/core/assets/bundles/bundle_ko.properties +++ b/core/assets/bundles/bundle_ko.properties @@ -176,10 +176,10 @@ filename = 파일 이름: unlocked = 새로운 콘텐츠가 해금되었습니다! available = 새로운 콘텐츠 해금이 가능합니다! unlock.incampaign = < 해금 후 상세정보 열람이 가능합니다 > -campaign.select = Select Starting Campaign -campaign.none = [lightgray]Select a planet to start on.\nThis can be switched at any time. -campaign.erekir = [accent]Recommended for new players.[]\n\nNewer, more polished content. Mostly linear campaign progression.\n\nHigher quality maps and overall experience. -campaign.serpulo = [scarlet]Not recommended for new players.[]\n\nOlder content; the classic experience. More open-ended.\n\nPotentially unbalanced maps and campaign mechanics. Less polished. +campaign.select = 캠페인 시작지점 선택하기 +campaign.none = [lightgray]시작할 행성을 선택하십시오.\n언제든지 전환할 수 있습니다. +campaign.erekir = [accent]신규 플레이어에게 추천합니다.[]\n\n보다 새롭고 세련된 컨텐츠. 대부분 순차적으로 캠페인이 진행됩니다.\n\n더 높은 완성도의 지도와 다채로운 경험. +campaign.serpulo = [scarlet]신규 플레이어에게 권장되지 않습니다.[]\n\n오래된 컨텐츠: 고전적인 경험. 좀 더 개방적이죠.\n\n잠재적으로 불균형한 지도와 캠페인 메커니즘. 덜 세련됩니다. completed = [accent]완료됨 techtree = 연구 기록 techtree.select = 연구 기록 선택 @@ -755,7 +755,7 @@ sector.basin.name = 유역 sector.marsh.name = 습지 sector.peaks.name = 산봉우리 sector.ravine.name = 협곡 -sector.caldera-erekir.name = Caldera +sector.caldera-erekir.name = 칼데라 sector.onset.description = 튜토리얼 지역. 아직 목표가 만들어지지 않았습니다. 정보를 더 기다리십시오. sector.aegis.description = 적은 방어막으로 보호받고 있습니다. 이 구역에서 실험적인 방어막 차단기 모듈이 감지되었습니다.\n이 구조물을 찾으십시오. 텅스텐을 공급해 방어막 차단기를 가동하고 적의 기지를 파괴하십시오. sector.lake.description = 이 지역의 광재 호수는 기체의 활동범위를 크게 제한시킵니다. 호버 유닛이 유일한 선택지입니다.\n[accent]함선 재구성기[]를 연구하고 [accent]일루드[]를 가능한 한 빨리 생산하십시오. @@ -1149,7 +1149,7 @@ rules.coreincinerates = 코어 방화 비허용 rules.disableworldprocessors = 월드 프로세서 비활성화 rules.schematic = 설계도 허용 rules.wavetimer = 시간 제한이 있는 단계 -rules.wavesending = Wave Sending +rules.wavesending = 단계 넘김 rules.waves = 단계 rules.attack = 공격 모드 rules.rtsai = RTS AI @@ -2087,7 +2087,7 @@ lst.set = 변수 선언/할당 lst.operation = 1~2개의 변수로 연산 lst.end = 실행줄의 가장 위로 건너뜀 lst.wait = 일정 시간(초) 동안 대기 -lst.stop = Halt execution of this processor. +lst.stop = 이 프로세서의 실행 중지 lst.lookup = id를 통해 특정 유형의 아이템/액체/기체/블록 조회\n[accent]@unitCount[] / [accent]@itemCount[] / [accent]@liquidCount[] / [accent]@blockCount[]\n...로 각 유형의 총 갯수를 알 수 있습니다. lst.jump = 조건부로 다른 실행문으로 건너뜀 lst.unitbind = type 옆에 있는 기체를 지정하고, [accent]@unit[]에 저장 From 10d989fbc2881e0b763808054e1916fd20454f18 Mon Sep 17 00:00:00 2001 From: Mnemotechnican <69920617+Mnemotechnician@users.noreply.github.com> Date: Tue, 20 Sep 2022 18:25:56 +0300 Subject: [PATCH 4/4] Support for custom menu buttons (#7595) * added support for custom main menu buttons * layout fix * ...and yet another fix * removed another unneccesary table, which was causing issues * actually, it looks better with even and odd buttons swapped * made the container a scroll pane, needs some testing... * this seems to work correctly * render the logo under the menu buttons * rename Buttoni to MenuButton --- .../mindustry/ui/fragments/MenuFragment.java | 204 +++++++++++------- 1 file changed, 123 insertions(+), 81 deletions(-) diff --git a/core/src/mindustry/ui/fragments/MenuFragment.java b/core/src/mindustry/ui/fragments/MenuFragment.java index bd8f34d3b1..99a2034b97 100644 --- a/core/src/mindustry/ui/fragments/MenuFragment.java +++ b/core/src/mindustry/ui/fragments/MenuFragment.java @@ -12,7 +12,9 @@ import arc.scene.ui.*; import arc.scene.ui.ImageButton.*; import arc.scene.ui.TextButton.*; import arc.scene.ui.layout.*; +import arc.struct.*; import arc.util.*; +import mindustry.annotations.Annotations.*; import mindustry.core.*; import mindustry.game.EventType.*; import mindustry.gen.*; @@ -26,6 +28,7 @@ public class MenuFragment{ private Table container, submenu; private Button currentMenu; private MenuRenderer renderer; + private Seq customButtons = new Seq<>(); public void build(Group parent){ renderer = new MenuRenderer(); @@ -39,46 +42,6 @@ public class MenuFragment{ parent.fill((x, y, w, h) -> renderer.render()); - parent.fill(c -> { - container = c; - c.name = "menu container"; - - if(!mobile){ - buildDesktop(); - Events.on(ResizeEvent.class, event -> buildDesktop()); - }else{ - buildMobile(); - Events.on(ResizeEvent.class, event -> buildMobile()); - } - }); - - parent.fill(c -> c.bottom().right().button(Icon.discord, new ImageButtonStyle(){{ - up = discordBanner; - }}, ui.discord::show).marginTop(9f).marginLeft(10f).tooltip("@discord").size(84, 45).name("discord")); - - //info icon - if(mobile){ - parent.fill(c -> c.bottom().left().button("", new TextButtonStyle(){{ - font = Fonts.def; - fontColor = Color.white; - up = infoBanner; - }}, ui.about::show).size(84, 45).name("info")); - - - }else if(becontrol.active()){ - parent.fill(c -> c.bottom().right().button("@be.check", Icon.refresh, () -> { - ui.loadfrag.show(); - becontrol.checkUpdate(result -> { - ui.loadfrag.hide(); - if(!result){ - ui.showInfo("@be.noupdates"); - } - }); - }).size(200, 60).name("becheck").update(t -> { - t.getLabel().setColor(becontrol.isUpdateAvailable() ? Tmp.c1.set(Color.white).lerp(Pal.accent, Mathf.absin(5f, 1f)) : Color.white); - })); - } - String versionText = ((Version.build == -1) ? "[#fc8140aa]" : "[#ffffffba]") + Version.combined(); parent.fill((x, y, w, h) -> { TextureRegion logo = Core.atlas.find("logo"); @@ -96,6 +59,49 @@ public class MenuFragment{ Fonts.outline.setColor(Color.white); Fonts.outline.draw(versionText, fx, fy - logoh/2f - Scl.scl(2f), Align.center); }).touchable = Touchable.disabled; + + parent.fill(c -> { + c.pane(Styles.noBarPane, cont -> { + container = cont; + cont.name = "menu container"; + + if(!mobile){ + c.left(); + buildDesktop(); + Events.on(ResizeEvent.class, event -> buildDesktop()); + }else{ + buildMobile(); + Events.on(ResizeEvent.class, event -> buildMobile()); + } + }).with(pane -> { + pane.setOverscroll(false, false); + }).grow(); + }); + + parent.fill(c -> c.bottom().right().button(Icon.discord, new ImageButtonStyle(){{ + up = discordBanner; + }}, ui.discord::show).marginTop(9f).marginLeft(10f).tooltip("@discord").size(84, 45).name("discord")); + + //info icon + if(mobile){ + parent.fill(c -> c.bottom().left().button("", new TextButtonStyle(){{ + font = Fonts.def; + fontColor = Color.white; + up = infoBanner; + }}, ui.about::show).size(84, 45).name("info")); + }else if(becontrol.active()){ + parent.fill(c -> c.bottom().right().button("@be.check", Icon.refresh, () -> { + ui.loadfrag.show(); + becontrol.checkUpdate(result -> { + ui.loadfrag.hide(); + if(!result){ + ui.showInfo("@be.noupdates"); + } + }); + }).size(200, 60).name("becheck").update(t -> { + t.getLabel().setColor(becontrol.isUpdateAvailable() ? Tmp.c1.set(Color.white).lerp(Pal.accent, Mathf.absin(5f, 1f)) : Color.white); + })); + } } private void buildMobile(){ @@ -116,23 +122,28 @@ public class MenuFragment{ mods = new MobileButton(Icon.book, "@mods", ui.mods::show), exit = new MobileButton(Icon.exit, "@quit", () -> Core.app.exit()); + Seq customs = customButtons.map(b -> new MobileButton(b.icon, b.text, b.runnable == null ? () -> {} : b.runnable)); + if(!Core.graphics.isPortrait()){ container.marginTop(60f); container.add(play); container.add(join); container.add(custom); container.add(maps); + // add odd custom buttons + for(int i = 1; i < customs.size; i += 2){ + container.add(customs.get(i)); + } container.row(); - container.table(table -> { - table.defaults().set(container.defaults()); - - table.add(editor); - table.add(tools); - - table.add(mods); - if(!ios) table.add(exit); - }).colspan(4); + container.add(editor); + container.add(tools); + container.add(mods); + // add even custom buttons (before the exit button) + for(int i = 0; i < customs.size; i += 2){ + container.add(customs.get(i)); + } + if(!ios) container.add(exit); }else{ container.marginTop(0f); container.add(play); @@ -144,13 +155,13 @@ public class MenuFragment{ container.add(editor); container.add(tools); container.row(); - - container.table(table -> { - table.defaults().set(container.defaults()); - - table.add(mods); - if(!ios) table.add(exit); - }).colspan(2); + container.add(mods); + // add custom buttons + for(int i = 0; i < customs.size; i++){ + container.add(customs.get(i)); + if(i % 2 == 0) container.row(); + } + if(!ios) container.add(exit); } } @@ -168,23 +179,23 @@ public class MenuFragment{ t.name = "buttons"; buttons(t, - new Buttoni("@play", Icon.play, - new Buttoni("@campaign", Icon.play, () -> checkPlay(ui.planet::show)), - new Buttoni("@joingame", Icon.add, () -> checkPlay(ui.join::show)), - new Buttoni("@customgame", Icon.terrain, () -> checkPlay(ui.custom::show)), - new Buttoni("@loadgame", Icon.download, () -> checkPlay(ui.load::show)) + new MenuButton("@play", Icon.play, + new MenuButton("@campaign", Icon.play, () -> checkPlay(ui.planet::show)), + new MenuButton("@joingame", Icon.add, () -> checkPlay(ui.join::show)), + new MenuButton("@customgame", Icon.terrain, () -> checkPlay(ui.custom::show)), + new MenuButton("@loadgame", Icon.download, () -> checkPlay(ui.load::show)) ), - new Buttoni("@database.button", Icon.menu, - new Buttoni("@schematics", Icon.paste, ui.schematics::show), - new Buttoni("@database", Icon.book, ui.database::show), - new Buttoni("@about.button", Icon.info, ui.about::show) + new MenuButton("@database.button", Icon.menu, + new MenuButton("@schematics", Icon.paste, ui.schematics::show), + new MenuButton("@database", Icon.book, ui.database::show), + new MenuButton("@about.button", Icon.info, ui.about::show) ), - new Buttoni("@editor", Icon.terrain, () -> checkPlay(ui.maps::show)), steam ? new Buttoni("@workshop", Icon.steam, platform::openWorkshop) : null, - new Buttoni("@mods", Icon.book, ui.mods::show), - new Buttoni("@settings", Icon.settings, ui.settings::show), - new Buttoni("@quit", Icon.exit, Core.app::exit) + new MenuButton("@editor", Icon.terrain, () -> checkPlay(ui.maps::show)), steam ? new MenuButton("@workshop", Icon.steam, platform::openWorkshop) : null, + new MenuButton("@mods", Icon.book, ui.mods::show), + new MenuButton("@settings", Icon.settings, ui.settings::show) ); - + buttons(t, customButtons.toArray(MenuButton.class)); + buttons(t, new MenuButton("@quit", Icon.exit, Core.app::exit)); }).width(width).growY(); container.table(background, t -> { @@ -199,7 +210,6 @@ public class MenuFragment{ } private void checkPlay(Runnable run){ - if(!mods.hasContentErrors()){ run.run(); }else{ @@ -222,8 +232,8 @@ public class MenuFragment{ submenu.actions(Actions.alpha(1f), Actions.alpha(0f, 0.2f, Interp.fade), Actions.run(() -> submenu.clearChildren())); } - private void buttons(Table t, Buttoni... buttons){ - for(Buttoni b : buttons){ + private void buttons(Table t, MenuButton... buttons){ + for(MenuButton b : buttons){ if(b == null) continue; Button[] out = {null}; out[0] = t.button(b.text, b.icon, Styles.flatToggleMenut, () -> { @@ -251,24 +261,56 @@ public class MenuFragment{ } } - private static class Buttoni{ - final Drawable icon; - final String text; - final Runnable runnable; - final Buttoni[] submenu; + /** Adds a custom button to the menu. */ + public void addButton(String text, Drawable icon, Runnable callback){ + addButton(new MenuButton(text, icon, callback)); + } - public Buttoni(String text, Drawable icon, Runnable runnable){ + /** Adds a custom button to the menu. */ + public void addButton(String text, Runnable callback){ + addButton(text, Styles.none, callback); + } + + /** + * Adds a custom button to the menu. + * If {@link MenuButton#submenu} is null or the player is on mobile, {@link MenuButton#runnable} is invoked on click. + * Otherwise, {@link MenuButton#submenu} is shown. + */ + public void addButton(MenuButton button){ + customButtons.add(button); + } + + /** Represents a menu button definition. */ + public static class MenuButton{ + public final Drawable icon; + public final String text; + /** Runnable ran when the button is clicked. Ignored on desktop if {@link #submenu} is not null. */ + public final Runnable runnable; + /** Submenu shown when this button is clicked. Used instead of {@link #runnable} on desktop. */ + public final @Nullable MenuButton[] submenu; + + /** Constructs a simple menu button, which behaves the same way on desktop and mobile. */ + public MenuButton(String text, Drawable icon, Runnable runnable){ this.icon = icon; this.text = text; this.runnable = runnable; this.submenu = null; } - public Buttoni(String text, Drawable icon, Buttoni... buttons){ + /** Constructs a button that runs the runnable when clicked on mobile or shows the submenu on desktop. */ + public MenuButton(String text, Drawable icon, Runnable runnable, MenuButton... submenu){ + this.icon = icon; + this.text = text; + this.runnable = runnable; + this.submenu = submenu; + } + + /** Comstructs a desktop-only button; used internally. */ + MenuButton(String text, Drawable icon, MenuButton... submenu){ this.icon = icon; this.text = text; this.runnable = () -> {}; - this.submenu = buttons; + this.submenu = submenu; } } }