From a9333baa784940d0d936db6dc0ba8e865ba47c30 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 8 Jul 2020 12:11:27 -0400 Subject: [PATCH] Research tweaks --- core/assets/maps/groundZero.msav | Bin 13399 -> 13529 bytes core/src/mindustry/content/Blocks.java | 2 +- core/src/mindustry/core/Logic.java | 9 ++++ core/src/mindustry/core/NetServer.java | 2 +- core/src/mindustry/core/UI.java | 4 +- core/src/mindustry/game/Team.java | 7 +++ core/src/mindustry/input/DesktopInput.java | 13 +++++ .../mindustry/ui/dialogs/PausedDialog.java | 4 +- .../mindustry/ui/dialogs/PlanetDialog.java | 10 ++-- ...echTreeDialog.java => ResearchDialog.java} | 46 ++++++------------ .../mindustry/ui/fragments/HudFragment.java | 13 ++--- .../world/blocks/campaign/ResearchBlock.java | 9 ++-- .../mindustry/world/modules/ItemModule.java | 2 + 13 files changed, 66 insertions(+), 55 deletions(-) rename core/src/mindustry/ui/dialogs/{TechTreeDialog.java => ResearchDialog.java} (92%) diff --git a/core/assets/maps/groundZero.msav b/core/assets/maps/groundZero.msav index 628ab59ecec6d9f66c0bba5d0ad5cbbc86aac26f..da07ea192559e090e872279ea006486ccb7b47e1 100644 GIT binary patch delta 13507 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 delta 13382 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 diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index e1c53bc981..cd2d11b337 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -1864,7 +1864,7 @@ public class Blocks implements ContentList{ }}; dataProcessor = new ResearchBlock("data-processor"){{ - requirements(Category.effect, BuildVisibility.campaignOnly, with(Items.copper, 200, Items.lead, 100)); + //requirements(Category.effect, BuildVisibility.campaignOnly, with(Items.copper, 200, Items.lead, 100)); size = 3; alwaysUnlocked = true; diff --git a/core/src/mindustry/core/Logic.java b/core/src/mindustry/core/Logic.java index 5b2075d430..64e39aa5ab 100644 --- a/core/src/mindustry/core/Logic.java +++ b/core/src/mindustry/core/Logic.java @@ -171,6 +171,15 @@ public class Logic implements ApplicationListener{ Core.settings.manualSave(); } + public void skipWave(){ + if(state.isCampaign()){ + //warp time spent forward because the wave was just skipped. + state.secinfo.internalTimeSpent += state.wavetime; + } + + state.wavetime = 0; + } + public void runWave(){ spawner.spawnEnemies(); state.wave++; diff --git a/core/src/mindustry/core/NetServer.java b/core/src/mindustry/core/NetServer.java index 210e4650da..119c4d7cb3 100644 --- a/core/src/mindustry/core/NetServer.java +++ b/core/src/mindustry/core/NetServer.java @@ -682,7 +682,7 @@ public class NetServer implements ApplicationListener{ if(action == AdminAction.wave){ //no verification is done, so admins can hypothetically spam waves //not a real issue, because server owners may want to do just that - state.wavetime = 0f; + logic.skipWave(); }else if(action == AdminAction.ban){ netServer.admins.banPlayerIP(other.con.address); other.kick(KickReason.banned); diff --git a/core/src/mindustry/core/UI.java b/core/src/mindustry/core/UI.java index 63078827e9..8dfcefdad9 100644 --- a/core/src/mindustry/core/UI.java +++ b/core/src/mindustry/core/UI.java @@ -63,7 +63,7 @@ public class UI implements ApplicationListener, Loadable{ public DatabaseDialog database; public ContentInfoDialog content; public PlanetDialog planet; - public TechTreeDialog tech; + public ResearchDialog research; public SchematicsDialog schematics; public ModsDialog mods; public ColorPicker picker; @@ -175,7 +175,7 @@ public class UI implements ApplicationListener, Loadable{ maps = new MapsDialog(); content = new ContentInfoDialog(); planet = new PlanetDialog(); - tech = new TechTreeDialog(); + research = new ResearchDialog(); mods = new ModsDialog(); schematics = new SchematicsDialog(); diff --git a/core/src/mindustry/game/Team.java b/core/src/mindustry/game/Team.java index ec2e437f61..b82e8e1f12 100644 --- a/core/src/mindustry/game/Team.java +++ b/core/src/mindustry/game/Team.java @@ -9,6 +9,7 @@ import mindustry.game.Rules.*; import mindustry.game.Teams.*; import mindustry.graphics.*; import mindustry.world.blocks.storage.CoreBlock.*; +import mindustry.world.modules.*; import static mindustry.Vars.*; @@ -71,6 +72,12 @@ public class Team implements Comparable{ hasPalette = true; } + /** @return the core items for this team, or an empty item module. + * Never add to the resulting item module, as it is mutable. */ + public @NonNull ItemModule items(){ + return core() == null ? ItemModule.empty : core().items; + } + /** @return the team-specific rules. */ public TeamRule rules(){ return state.rules.teams.get(this); diff --git a/core/src/mindustry/input/DesktopInput.java b/core/src/mindustry/input/DesktopInput.java index edd418da71..7ae6820a15 100644 --- a/core/src/mindustry/input/DesktopInput.java +++ b/core/src/mindustry/input/DesktopInput.java @@ -333,6 +333,19 @@ public class DesktopInput extends InputHandler{ table.button(Icon.paste, Styles.clearPartiali, () -> { ui.schematics.show(); }); + + table.button(Icon.tree, Styles.clearPartiali, () -> { + ui.research.show(); + }).visible(() -> state.isCampaign()); + + table.button(Icon.map, Styles.clearPartiali, () -> { + ui.planet.show(); + }).visible(() -> state.isCampaign()); + + table.button(Icon.up, Styles.clearPartiali, () -> { + ui.planet.show(state.getSector(), player.team().core()); + }).visible(() -> state.isCampaign()) + .disabled(b -> player.team().core() == null || !player.team().core().items.has(player.team().core().block.requirements)); } void pollInput(){ diff --git a/core/src/mindustry/ui/dialogs/PausedDialog.java b/core/src/mindustry/ui/dialogs/PausedDialog.java index ce8b3e9d8d..f37b1b8b4a 100644 --- a/core/src/mindustry/ui/dialogs/PausedDialog.java +++ b/core/src/mindustry/ui/dialogs/PausedDialog.java @@ -52,9 +52,7 @@ public class PausedDialog extends BaseDialog{ // cont.button("$database", Icon.book, ui.database::show); //} //TODO remove - cont.button("launch core", Icon.warning, () -> ui.planet.show(state.getSector(), player.team().core())) - .disabled(b -> player.team().core() == null || !player.team().core().items.has(player.team().core().block.requirements)) - .visible(() -> state.isCampaign()); + cont.button("nothing", Icon.warning, () -> ui.showInfo("no")); cont.button("$settings", Icon.settings, ui.settings::show); if(!state.rules.tutorial){ diff --git a/core/src/mindustry/ui/dialogs/PlanetDialog.java b/core/src/mindustry/ui/dialogs/PlanetDialog.java index ed847a67d3..7e63b4533f 100644 --- a/core/src/mindustry/ui/dialogs/PlanetDialog.java +++ b/core/src/mindustry/ui/dialogs/PlanetDialog.java @@ -122,7 +122,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ //draw all sector stuff for(Sector sec : planet.sectors){ if(selectAlpha > 0.01f){ - if(/*canLaunch(sec) || sec.unlocked()*/true){ + if(canLaunch(sec) || sec.unlocked()){ if(sec.baseCoverage > 0){ planets.fill(sec, Tmp.c1.set(Team.crux.color).a(0.1f * sec.baseCoverage * selectAlpha), -0.002f); } @@ -230,7 +230,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ new Table(t -> { //TODO localize t.top(); - t.label(() -> "Turn " + universe.turn()).style(Styles.outlineLabel).color(Pal.accent); + t.label(() -> mode == launch ? "Select Launch Sector" : "Turn " + universe.turn()).style(Styles.outlineLabel).color(Pal.accent); })).grow(); } @@ -249,7 +249,9 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ if(doBuffer){ buffer.end(); - buffer.blit(Shaders.screenspace); + Draw.color(color); + Draw.rect(Draw.wrap(buffer.getTexture()), width/2f, height/2f, width, -height); + Draw.color(); } } @@ -302,7 +304,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ if(sector.hasBase() && sector.hasWaves()){ stable.add("[scarlet]Under attack!"); stable.row(); - stable.add("[accent]" + Mathf.ceil(sectorDestructionTurns - (sector.getSecondsPassed() * 60) / turnDuration) + " turn(s) until destruction"); + stable.add("[accent]" + Mathf.ceil(sectorDestructionTurns - (sector.getSecondsPassed() * 60) / turnDuration) + " turn(s)\nuntil destruction"); stable.row(); } diff --git a/core/src/mindustry/ui/dialogs/TechTreeDialog.java b/core/src/mindustry/ui/dialogs/ResearchDialog.java similarity index 92% rename from core/src/mindustry/ui/dialogs/TechTreeDialog.java rename to core/src/mindustry/ui/dialogs/ResearchDialog.java index a09a191b88..f9e7e15392 100644 --- a/core/src/mindustry/ui/dialogs/TechTreeDialog.java +++ b/core/src/mindustry/ui/dialogs/ResearchDialog.java @@ -1,7 +1,6 @@ package mindustry.ui.dialogs; import arc.*; -import arc.func.*; import arc.graphics.*; import arc.graphics.g2d.*; import arc.input.*; @@ -12,12 +11,12 @@ import arc.scene.actions.*; import arc.scene.event.*; import arc.scene.style.*; import arc.scene.ui.*; -import arc.scene.ui.layout.Stack; import arc.scene.ui.layout.*; import arc.struct.*; import arc.util.*; import mindustry.content.*; import mindustry.content.TechTree.*; +import mindustry.game.EventType.*; import mindustry.game.Objectives.*; import mindustry.gen.*; import mindustry.graphics.*; @@ -25,25 +24,25 @@ import mindustry.type.*; import mindustry.ui.*; import mindustry.ui.layout.*; import mindustry.ui.layout.TreeLayout.*; +import mindustry.world.modules.*; import java.util.*; import static mindustry.Vars.*; -public class TechTreeDialog extends BaseDialog{ +public class ResearchDialog extends BaseDialog{ private final float nodeSize = Scl.scl(60f); private ObjectSet nodes = new ObjectSet<>(); private TechTreeNode root = new TechTreeNode(TechTree.root, null); private Rect bounds = new Rect(); private View view; - private Cons selector = c -> {}; - public TechTreeDialog(){ + public ResearchDialog(){ super(""); titleTable.remove(); margin(0f).marginBottom(8); - Stack stack = cont.stack(view = new View()/*, items = new ItemsDisplay()*/).grow().get(); + cont.add(view = new View()).grow().get(); shouldPause = true; @@ -105,13 +104,8 @@ public class TechTreeDialog extends BaseDialog{ }); } - public Dialog show(Cons selector){ - this.selector = selector; - return super.show(); - } - - public Dialog show(){ - return show(c -> {}); + ItemModule items(){ + return state.rules.defaultTeam.items(); } void treeLayout(){ @@ -262,13 +256,9 @@ public class TechTreeDialog extends BaseDialog{ } }); } - }else if(locked(node.node)){ - selector.get(node.node); + }else if(items().has(node.node.requirements) && locked(node.node)){ + unlock(node.node); } - //TODO select it - //else if(data.hasItems(node.node.requirements) && locked(node.node)){ - // unlock(node.node); - //} }); button.hovered(() -> { if(!mobile && hoverNode != button && node.visible){ @@ -288,7 +278,7 @@ public class TechTreeDialog extends BaseDialog{ button.update(() -> { float offset = (Core.graphics.getHeight() % 2) / 2f; button.setPosition(node.x + panX + width / 2f, node.y + panY + height / 2f + offset, Align.center); - button.getStyle().up = !locked(node.node) ? Tex.buttonOver : Tex.button; + button.getStyle().up = !locked(node.node) ? Tex.buttonOver : !items().has(node.node.requirements) ? Tex.buttonRed : Tex.button; ((TextureRegionDrawable)button.getStyle().imageUp) .setRegion(node.visible ? node.node.content.icon(Cicon.medium) : Icon.lock.getRegion()); button.getImage().setColor(!locked(node.node) ? Color.white : Color.gray); @@ -323,11 +313,9 @@ public class TechTreeDialog extends BaseDialog{ panY = ry - bounds.y - oy; } - /* void unlock(TechNode node){ - data.unlockContent(node.content); - //TODO this should not happen - //data.removeItems(node.requirements); + node.content.unlock(); + items().remove(node.requirements); showToast(Core.bundle.format("researched", node.content.localizedName)); checkNodes(root); hoverNode = null; @@ -336,7 +324,7 @@ public class TechTreeDialog extends BaseDialog{ Core.scene.act(); Sounds.unlock.play(); Events.fire(new ResearchEvent(node.content)); - }*/ + } void rebuild(){ ImageButton button = hoverNode; @@ -379,7 +367,7 @@ public class TechTreeDialog extends BaseDialog{ list.image(req.item.icon(Cicon.small)).size(8 * 3).padRight(3); list.add(req.item.localizedName).color(Color.lightGray); list.label(() -> " " + (player.team().core() != null ? Math.min(player.team().core().items.get(req.item), req.amount) + " / " : "") + req.amount) - .update(l -> {}/*l.setColor(data.has(req.item, req.amount) ? Color.lightGray : Color.scarlet)*/);//TODO + .update(l -> l.setColor(items().has(req.item, req.amount) ? Color.lightGray : Color.scarlet));//TODO }).fillX().left(); t.row(); } @@ -404,13 +392,11 @@ public class TechTreeDialog extends BaseDialog{ } }).pad(9); - //TODO research select button - /* if(mobile && locked(node)){ b.row(); b.button("$research", Icon.ok, Styles.nodet, () -> unlock(node)) - .disabled(i -> !data.hasItems(node.requirements)).growX().height(44f).colspan(3); - }*/ + .disabled(i -> !items().has(node.requirements)).growX().height(44f).colspan(3); + } }); infoTable.row(); diff --git a/core/src/mindustry/ui/fragments/HudFragment.java b/core/src/mindustry/ui/fragments/HudFragment.java index c4f15f8b0f..1032a7e749 100644 --- a/core/src/mindustry/ui/fragments/HudFragment.java +++ b/core/src/mindustry/ui/fragments/HudFragment.java @@ -114,7 +114,7 @@ public class HudFragment extends Fragment{ ui.chatfrag.toggle(); } }else if(state.isCampaign()){ - ui.tech.show(); + ui.research.show(); }else{ ui.database.show(); } @@ -134,13 +134,6 @@ public class HudFragment extends Fragment{ cont.row(); } - //TODO BUTTONS FOR VIEWING EXPORTS/IMPORTS/RESEARCH/MAP/ETC - /* - cont.table(t -> { - - }); - cont.row();*/ - cont.update(() -> { if(Core.input.keyTap(Binding.toggle_menus) && !ui.chatfrag.shown() && !Core.scene.hasDialog() && !(Core.scene.getKeyboardFocus() instanceof TextField)){ toggleMenus(); @@ -683,9 +676,9 @@ public class HudFragment extends Fragment{ if(net.client() && player.admin){ Call.adminRequest(player, AdminAction.wave); }else if(inLaunchWave()){ - ui.showConfirm("$confirm", "$launch.skip.confirm", () -> !canSkipWave(), () -> state.wavetime = 0f); + ui.showConfirm("$confirm", "$launch.skip.confirm", () -> !canSkipWave(), () -> logic.skipWave()); }else{ - state.wavetime = 0f; + logic.skipWave(); } }).growY().fillX().right().width(40f) .visible(this::canSkipWave); diff --git a/core/src/mindustry/world/blocks/campaign/ResearchBlock.java b/core/src/mindustry/world/blocks/campaign/ResearchBlock.java index 2ca9d7aee5..4a29cb3e03 100644 --- a/core/src/mindustry/world/blocks/campaign/ResearchBlock.java +++ b/core/src/mindustry/world/blocks/campaign/ResearchBlock.java @@ -178,10 +178,11 @@ public class ResearchBlock extends Block{ @Override public boolean configTapped(){ //configure with tech node - ui.tech.show(node -> { - configure(node); - ui.tech.hide(); - }); + ui.showInfo("this does nothing"); + //ui.research.show(node -> { + // configure(node); + // ui.research.hide(); + //}); return false; } diff --git a/core/src/mindustry/world/modules/ItemModule.java b/core/src/mindustry/world/modules/ItemModule.java index 71cffee56a..ead9f73505 100644 --- a/core/src/mindustry/world/modules/ItemModule.java +++ b/core/src/mindustry/world/modules/ItemModule.java @@ -12,6 +12,8 @@ import java.util.*; import static mindustry.Vars.content; public class ItemModule extends BlockModule{ + public static final ItemModule empty = new ItemModule(); + private static final int windowSize = 60 * 4; private static WindowedMean[] cacheFlow; private static float[] cacheSums;