diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 72f241b9b4..33ab9b2778 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -22,7 +22,6 @@ gameover.pvp = The[accent] {0}[] team is victorious! gameover.waiting = [accent]Waiting for next map... highscore = [accent]New highscore! copied = Copied. -indev.popup = [accent]v6[] is currently in [accent]beta[].\n[lightgray]This means:[]\n[scarlet]- The campaign is unfinished[]\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. indev.notready = This part of the game isn't ready yet indev.campaign = [accent]You've reached the end of the campaign![]\n\nThis is as far as the content goes. Interplanetary travel will be added in future updates. @@ -1270,6 +1269,7 @@ hint.payloadDrop = Press [accent]][] to drop a payload. hint.payloadDrop.mobile = [accent]Tap and hold[] an empty location to drop a payload there. hint.waveFire = [accent]Wave[] turrets with water as ammunition will automatically put out nearby fires. hint.generator = \uf879 [accent]Combustion Generators[] burn coal and transmit power to adjacent blocks.\n\nPower transmission range can be extended with \uf87f [accent]Power Nodes[]. +hint.guardian = [accent]Guardian[] units are armored. Weak ammo such as [accent]Copper[] and [accent]Lead[] is [scarlet]not effective[].\n\nUse higher tier turrets or \uf835 [accent]Graphite[] \uf861Duo/\uf859Salvo ammunition to take Guardians down. item.copper.description = Used in all types of construction and ammunition. item.copper.details = Copper. Abnormally abundant metal on Serpulo. Structurally weak unless reinforced. diff --git a/core/assets/maps/ruinousShores.msav b/core/assets/maps/ruinousShores.msav index 41e957c0ff..48727feae4 100644 Binary files a/core/assets/maps/ruinousShores.msav and b/core/assets/maps/ruinousShores.msav differ diff --git a/core/src/mindustry/Vars.java b/core/src/mindustry/Vars.java index e41b9a08b7..ec720f1570 100644 --- a/core/src/mindustry/Vars.java +++ b/core/src/mindustry/Vars.java @@ -88,7 +88,7 @@ public class Vars implements Loadable{ /** duration of time between turns in ticks */ public static final float turnDuration = 2 * Time.toMinutes; /** chance of an invasion per turn, 1 = 100% */ - public static final float baseInvasionChance = 1f / 50f; + public static final float baseInvasionChance = 1f / 55f; /** how many turns have to pass before invasions start */ public static final int invasionGracePeriod = 20; /** min armor fraction damage; e.g. 0.05 = at least 5% damage */ diff --git a/core/src/mindustry/content/TechTree.java b/core/src/mindustry/content/TechTree.java index d216a665e1..41dd134682 100644 --- a/core/src/mindustry/content/TechTree.java +++ b/core/src/mindustry/content/TechTree.java @@ -198,10 +198,10 @@ public class TechTree implements ContentList{ }); }); }); - }); - node(illuminator, () -> { - + node(illuminator, () -> { + + }); }); }); diff --git a/core/src/mindustry/core/GameState.java b/core/src/mindustry/core/GameState.java index 3eed5e0164..de7cf6f60c 100644 --- a/core/src/mindustry/core/GameState.java +++ b/core/src/mindustry/core/GameState.java @@ -33,9 +33,8 @@ public class GameState{ /** Current game state. */ private State state = State.menu; - //TODO optimize public Unit boss(){ - return Groups.unit.find(u -> u.isBoss() && u.team == rules.waveTeam); + return teams.boss; } public void set(State astate){ diff --git a/core/src/mindustry/game/Teams.java b/core/src/mindustry/game/Teams.java index da5edfd0db..1c06372731 100644 --- a/core/src/mindustry/game/Teams.java +++ b/core/src/mindustry/game/Teams.java @@ -26,6 +26,8 @@ public class Teams{ public Seq active = new Seq<>(); /** Teams with block or unit presence. */ public Seq present = new Seq<>(TeamData.class); + /** Current boss unit. */ + public @Nullable Unit boss; public Teams(){ active.add(get(Team.crux)); @@ -178,6 +180,10 @@ public class Teams{ data.units.add(unit); data.presentFlag = true; + if(unit.team == state.rules.waveTeam && unit.isBoss()){ + boss = unit; + } + if(data.unitsByType == null || data.unitsByType.length <= unit.type.id){ data.unitsByType = new Seq[content.units().size]; } diff --git a/core/src/mindustry/game/Universe.java b/core/src/mindustry/game/Universe.java index 1b0b1fc10b..b8f27b5f73 100644 --- a/core/src/mindustry/game/Universe.java +++ b/core/src/mindustry/game/Universe.java @@ -216,7 +216,7 @@ public class Universe{ if(!sector.isAttacked() && turn > invasionGracePeriod && sector.info.hasSpawns){ //invasion chance depends on # of nearby bases if(Mathf.chance(baseInvasionChance * Math.min(sector.near().count(Sector::hasEnemyBase), 1))){ - int waveMax = Math.max(sector.info.winWave, sector.isBeingPlayed() ? state.wave : sector.info.wave + sector.info.wavesPassed) + Mathf.random(2, 5) * 5; + int waveMax = Math.max(sector.info.winWave, sector.isBeingPlayed() ? state.wave : sector.info.wave + sector.info.wavesPassed) + Mathf.random(2, 4) * 5; //assign invasion-related things if(sector.isBeingPlayed()){ diff --git a/core/src/mindustry/game/Waves.java b/core/src/mindustry/game/Waves.java index 8e65a0b1b9..21adaac37c 100644 --- a/core/src/mindustry/game/Waves.java +++ b/core/src/mindustry/game/Waves.java @@ -298,7 +298,7 @@ public class Waves{ begin = f; end = f + next >= cap ? never : f + next; max = 13; - unitScaling = (difficulty < 0.4f ? rand.random(2.5f, 5f) : rand.random(1f, 4f)) * scaling[ctier]; + unitScaling = (difficulty < 0.4f ? rand.random(2.5f, 4f) : rand.random(1f, 4f)) * scaling[ctier]; shields = shieldAmount; shieldScaling = shieldsPerWave; spacing = space; diff --git a/core/src/mindustry/ui/fragments/HintsFragment.java b/core/src/mindustry/ui/fragments/HintsFragment.java index eb029789fe..f967518cb4 100644 --- a/core/src/mindustry/ui/fragments/HintsFragment.java +++ b/core/src/mindustry/ui/fragments/HintsFragment.java @@ -150,7 +150,7 @@ public class HintsFragment extends Fragment{ depositItems(() -> player.unit().hasItem(), () -> !player.unit().hasItem()), desktopPause(visibleDesktop, () -> isTutorial.get() && !Vars.net.active(), () -> Core.input.keyTap(Binding.pause)), research(isTutorial, () -> ui.research.isShown()), - unitControl(() -> state.rules.defaultTeam.data().units.size > 1 && !net.active(), () -> !player.dead() && !player.unit().spawnedByCore), + unitControl(() -> state.rules.defaultTeam.data().units.size > 2 && !net.active() && !player.dead(), () -> !player.dead() && !player.unit().spawnedByCore), respawn(visibleMobile, () -> !player.dead() && !player.unit().spawnedByCore, () -> !player.dead() && player.unit().spawnedByCore), launch(() -> isTutorial.get() && state.rules.sector.isCaptured(), () -> ui.planet.isShown()), schematicSelect(visibleDesktop, () -> ui.hints.placedBlocks.contains(Blocks.router), () -> Core.input.keyRelease(Binding.schematic_select) || Core.input.keyTap(Binding.pick)), @@ -161,6 +161,7 @@ public class HintsFragment extends Fragment{ payloadDrop(() -> !player.unit().dead && player.unit() instanceof Payloadc p && p.payloads().any(), () -> player.unit() instanceof Payloadc p && p.payloads().isEmpty()), waveFire(() -> Groups.fire.size() > 0 && Blocks.wave.unlockedNow(), () -> indexer.getAllied(state.rules.defaultTeam, BlockFlag.extinguisher).size() > 0), generator(() -> control.input.block == Blocks.combustionGenerator, () -> ui.hints.placedBlocks.contains(Blocks.combustionGenerator)), + guardian(() -> state.boss() != null && state.boss().armor >= 4, () -> state.boss() == null), ; @Nullable