From fbf0fec135dd287852ecde47b16aa2a8c8346616 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 16 Feb 2022 00:23:07 -0500 Subject: [PATCH] Unit control improvements / Larger max map size --- core/src/mindustry/content/UnitTypes.java | 2 +- core/src/mindustry/ctype/ContentType.java | 43 ++++++++++++------- .../src/mindustry/editor/MapResizeDialog.java | 2 +- .../mindustry/entities/comp/BuildingComp.java | 4 -- core/src/mindustry/input/DesktopInput.java | 11 ++--- core/src/mindustry/type/UnitType.java | 9 ++-- .../mindustry/type/unit/ErekirUnitType.java | 2 - .../ui/fragments/PlacementFragment.java | 14 +++++- .../blocks/defense/turrets/BaseTurret.java | 1 + .../blocks/defense/turrets/ReloadTurret.java | 4 +- .../world/consumers/ConsumeItemFilter.java | 25 +++++------ .../world/consumers/ConsumeLiquidFilter.java | 12 +++--- 12 files changed, 74 insertions(+), 55 deletions(-) diff --git a/core/src/mindustry/content/UnitTypes.java b/core/src/mindustry/content/UnitTypes.java index 16cc6b2a53..f96aa366ba 100644 --- a/core/src/mindustry/content/UnitTypes.java +++ b/core/src/mindustry/content/UnitTypes.java @@ -2822,7 +2822,7 @@ public class UnitTypes{ velocityRnd = 0.1f; heatColor = Color.red; - for(int i = 0; i < 6; i++){ + for(int i = 0; i < 5; i++){ int fi = i; parts.add(new RegionPart("-blade"){{ under = true; diff --git a/core/src/mindustry/ctype/ContentType.java b/core/src/mindustry/ctype/ContentType.java index 7478c79f35..eb67a52003 100644 --- a/core/src/mindustry/ctype/ContentType.java +++ b/core/src/mindustry/ctype/ContentType.java @@ -1,23 +1,34 @@ package mindustry.ctype; +import arc.util.*; +import mindustry.entities.bullet.*; +import mindustry.type.*; +import mindustry.world.*; + /** Do not rearrange, ever! */ public enum ContentType{ - item, - block, - mech_UNUSED, - bullet, - liquid, - status, - unit, - weather, - effect_UNUSED, - sector, - loadout_UNUSED, - typeid_UNUSED, - error, - planet, - ammo_UNUSED, - team; + item(Item.class), + block(Block.class), + mech_UNUSED(null), + bullet(BulletType.class), + liquid(Liquid.class), + status(StatusEffect.class), + unit(UnitType.class), + weather(Weather.class), + effect_UNUSED(null), + sector(SectorPreset.class), + loadout_UNUSED(null), + typeid_UNUSED(null), + error(null), + planet(Planet.class), + ammo_UNUSED(null), + team(TeamEntry.class); public static final ContentType[] all = values(); + + public final @Nullable Class contentClass; + + ContentType(Class contentClass){ + this.contentClass = contentClass; + } } diff --git a/core/src/mindustry/editor/MapResizeDialog.java b/core/src/mindustry/editor/MapResizeDialog.java index b9925e14dc..f9cbfc8da8 100644 --- a/core/src/mindustry/editor/MapResizeDialog.java +++ b/core/src/mindustry/editor/MapResizeDialog.java @@ -9,7 +9,7 @@ import mindustry.ui.dialogs.*; import static mindustry.Vars.*; public class MapResizeDialog extends BaseDialog{ - public static int minSize = 50, maxSize = 500, increment = 50; + public static int minSize = 50, maxSize = 600, increment = 50; int width, height; diff --git a/core/src/mindustry/entities/comp/BuildingComp.java b/core/src/mindustry/entities/comp/BuildingComp.java index 6cce9c3c03..d769dd5227 100644 --- a/core/src/mindustry/entities/comp/BuildingComp.java +++ b/core/src/mindustry/entities/comp/BuildingComp.java @@ -71,10 +71,6 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, transient boolean wasDamaged; //used only by the indexer transient float visualLiquid; - //TODO bad system - transient @Nullable Liquid filterConsLiquid; - transient @Nullable Item filterConsItem; - @Nullable PowerModule power; @Nullable ItemModule items; @Nullable LiquidModule liquids; diff --git a/core/src/mindustry/input/DesktopInput.java b/core/src/mindustry/input/DesktopInput.java index 1ef4683555..51ffd4e836 100644 --- a/core/src/mindustry/input/DesktopInput.java +++ b/core/src/mindustry/input/DesktopInput.java @@ -691,21 +691,18 @@ public class DesktopInput extends InputHandler{ public boolean tap(float x, float y, int count, KeyCode button){ if(scene.hasMouse() || !commandMode) return false; + //TODO doesn't work properly tappedOne = true; //click: select a single unit if(button == KeyCode.mouseLeft){ Unit unit = selectedCommandUnit(input.mouseWorldX(), input.mouseWorldY()); if(unit != null){ - if(!multiSelect()){ + if(selectedUnits.contains(unit)){ + selectedUnits.remove(unit); + }else{ selectedUnits.clear(); selectedUnits.add(unit); - }else{ - if(selectedUnits.contains(unit)){ - selectedUnits.remove(unit); - }else{ - selectedUnits.add(unit); - } } }else{ //deselect diff --git a/core/src/mindustry/type/UnitType.java b/core/src/mindustry/type/UnitType.java index 4a4e1dd402..3c8d545bb8 100644 --- a/core/src/mindustry/type/UnitType.java +++ b/core/src/mindustry/type/UnitType.java @@ -49,10 +49,6 @@ public class UnitType extends UnlockableContent{ public boolean flying; /** Creates a new instance of this unit class. */ public Prov constructor; - /** The default AI controller to assign on creation. */ - public Prov defaultController = () -> !flying ? new GroundAI() : new FlyingAI(); - /** Function that chooses AI controller based on unit entity. */ - public Func unitBasedDefaultController = u -> defaultController.get(); /** Environmental flags that are *all* required for this unit to function. 0 = any environment */ public int envRequired = 0; @@ -116,6 +112,11 @@ public class UnitType extends UnlockableContent{ /** Target items to mine. Used in MinerAI */ public Seq mineItems = Seq.with(Items.copper, Items.lead, Items.titanium, Items.thorium); + /** The default AI controller to assign on creation. */ + public Prov defaultController = () -> !flying ? new GroundAI() : new FlyingAI(); + /** Function that chooses AI controller based on unit entity. */ + public Func unitBasedDefaultController = u -> !playerControllable || u.team.isAI() ? defaultController.get() : new CommandAI(); + public Color outlineColor = Pal.darkerMetal; public int outlineRadius = 3; public boolean outlines = true; diff --git a/core/src/mindustry/type/unit/ErekirUnitType.java b/core/src/mindustry/type/unit/ErekirUnitType.java index 306d970055..e3934ccc8f 100644 --- a/core/src/mindustry/type/unit/ErekirUnitType.java +++ b/core/src/mindustry/type/unit/ErekirUnitType.java @@ -1,6 +1,5 @@ package mindustry.type.unit; -import mindustry.ai.types.*; import mindustry.graphics.*; import mindustry.type.*; import mindustry.world.meta.*; @@ -12,7 +11,6 @@ public class ErekirUnitType extends UnitType{ super(name); outlineColor = Pal.darkOutline; envDisabled = Env.space; - unitBasedDefaultController = u -> !playerControllable || u.team.isAI() ? defaultController.get() : new CommandAI(); researchCostMultiplier = 10f; } } diff --git a/core/src/mindustry/ui/fragments/PlacementFragment.java b/core/src/mindustry/ui/fragments/PlacementFragment.java index 9aa87f2336..82303ff20f 100644 --- a/core/src/mindustry/ui/fragments/PlacementFragment.java +++ b/core/src/mindustry/ui/fragments/PlacementFragment.java @@ -427,7 +427,19 @@ public class PlacementFragment extends Fragment{ for(int i = 0; i < counts.length; i++){ if(counts[i] > 0){ var type = content.unit(i); - u.add(new ItemImage(type.uiIcon, counts[i])).tooltip(type.localizedName).pad(4); + u.add(new ItemImage(type.uiIcon, counts[i])).tooltip(type.localizedName).pad(4).with(b -> { + ClickListener listener = new ClickListener(); + + //left click -> select + b.clicked(KeyCode.mouseLeft, () -> control.input.selectedUnits.removeAll(unit -> unit.type != type)); + //right click -> remove + b.clicked(KeyCode.mouseRight, () -> control.input.selectedUnits.removeAll(unit -> unit.type == type)); + + b.addListener(listener); + b.addListener(new HandCursorListener()); + //gray on hover + b.update(() -> ((Group)b.getChildren().first()).getChildren().first().setColor(listener.isOver() ? Color.lightGray : Color.white)); + }); if(++col % 7 == 0){ u.row(); diff --git a/core/src/mindustry/world/blocks/defense/turrets/BaseTurret.java b/core/src/mindustry/world/blocks/defense/turrets/BaseTurret.java index 59e28956ce..fce450e8b3 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/BaseTurret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/BaseTurret.java @@ -23,6 +23,7 @@ public class BaseTurret extends Block{ /** How much reload is lowered by for each unit of liquid of heat capacity. */ public float coolantMultiplier = 5f; /** If not null, this consumer will be used for coolant. */ + //TODO make automatic for mods? public @Nullable ConsumeLiquidBase coolant; public BaseTurret(String name){ diff --git a/core/src/mindustry/world/blocks/defense/turrets/ReloadTurret.java b/core/src/mindustry/world/blocks/defense/turrets/ReloadTurret.java index a6402d664b..819a9fa351 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/ReloadTurret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/ReloadTurret.java @@ -1,6 +1,7 @@ package mindustry.world.blocks.defense.turrets; import arc.math.*; +import mindustry.world.consumers.*; import mindustry.world.meta.*; import static mindustry.Vars.*; @@ -33,8 +34,9 @@ public class ReloadTurret extends BaseTurret{ protected void updateCooling(){ if(reload < reloadTime && coolant != null && coolant.valid(this)){ + float capacity = coolant instanceof ConsumeLiquidFilter filter ? filter.getConsumed(this).heatCapacity : 1f; coolant.update(this); - reload += coolant.amount * edelta() * (filterConsLiquid == null ? 1f : filterConsLiquid.heatCapacity) * coolantMultiplier; + reload += coolant.amount * edelta() * capacity * coolantMultiplier; if(Mathf.chance(0.06 * coolant.amount)){ coolEffect.at(x + Mathf.range(size * tilesize / 2f), y + Mathf.range(size * tilesize / 2f)); diff --git a/core/src/mindustry/world/consumers/ConsumeItemFilter.java b/core/src/mindustry/world/consumers/ConsumeItemFilter.java index 2ba4b304c3..d92f83ae28 100644 --- a/core/src/mindustry/world/consumers/ConsumeItemFilter.java +++ b/core/src/mindustry/world/consumers/ConsumeItemFilter.java @@ -2,6 +2,7 @@ package mindustry.world.consumers; import arc.func.*; import arc.scene.ui.layout.*; +import arc.util.*; import mindustry.gen.*; import mindustry.type.*; import mindustry.ui.*; @@ -28,7 +29,7 @@ public class ConsumeItemFilter extends Consume{ public void build(Building build, Table table){ MultiReqImage image = new MultiReqImage(); content.items().each(i -> filter.get(i) && i.unlockedNow(), item -> image.add(new ReqImage(new ItemImage(item.uiIcon, 1), - () -> build.items != null && build.items.has(item)))); + () -> build.items.has(item)))); table.add(image).size(8 * 4); } @@ -39,27 +40,27 @@ public class ConsumeItemFilter extends Consume{ @Override public void trigger(Building build){ + Item item = getConsumed(build); + if(item != null){ + build.items.remove(item, 1); + } + } + + public @Nullable Item getConsumed(Building build){ for(int i = 0; i < content.items().size; i++){ Item item = content.item(i); - if(build.items != null && build.items.has(item) && this.filter.get(item)){ - build.items.remove(item, 1); - build.filterConsItem = item; - break; + if(build.items.has(item) && this.filter.get(item)){ + return item; } } + return null; } @Override public boolean valid(Building build){ if(build.consumeTriggerValid()) return true; - for(int i = 0; i < content.items().size; i++){ - Item item = content.item(i); - if(this.filter.get(item) && build.items.has(item)){ - return true; - } - } - return false; + return getConsumed(build) != null; } @Override diff --git a/core/src/mindustry/world/consumers/ConsumeLiquidFilter.java b/core/src/mindustry/world/consumers/ConsumeLiquidFilter.java index 1cfff938e8..1cae6e00bf 100644 --- a/core/src/mindustry/world/consumers/ConsumeLiquidFilter.java +++ b/core/src/mindustry/world/consumers/ConsumeLiquidFilter.java @@ -42,19 +42,19 @@ public class ConsumeLiquidFilter extends ConsumeLiquidBase{ @Override public void update(Building build){ - Liquid liq = match(build); + Liquid liq = getConsumed(build); build.liquids.remove(liq, use(build)); - build.filterConsLiquid = liq; } @Override public boolean valid(Building build){ - var liq = match(build); + var liq = getConsumed(build); return liq != null && build.liquids.get(liq) >= use(build); } - @Nullable Liquid match(Building build){ - if(filter.get(build.liquids.current())){ + public @Nullable Liquid getConsumed(Building build){ + float u = use(build); + if(filter.get(build.liquids.current()) && build.liquids.currentAmount() >= u){ return build.liquids.current(); } @@ -62,7 +62,7 @@ public class ConsumeLiquidFilter extends ConsumeLiquidBase{ for(int i = 0; i < liqs.size; i++){ var liq = liqs.get(i); - if(filter.get(liq) && build.liquids.get(liq) > 0){ + if(filter.get(liq) && build.liquids.get(liq) >= u){ return liq; } }