From 8104173b3120ace83bfff3ff0c18b9175636f13e Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 10 Oct 2022 19:05:23 -0400 Subject: [PATCH] Ground zero tutorial from #7532 --- core/assets/bundles/bundle.properties | 36 ++++++++++++++---- core/assets/maps/groundZero.msav | Bin 13804 -> 16461 bytes core/src/mindustry/content/Blocks.java | 13 +++++-- core/src/mindustry/content/Items.java | 4 +- core/src/mindustry/content/SectorPresets.java | 1 + core/src/mindustry/game/MapObjectives.java | 2 +- core/src/mindustry/type/Planet.java | 2 +- core/src/mindustry/type/Weapon.java | 3 ++ .../mindustry/ui/fragments/HintsFragment.java | 12 ++---- tests/src/test/java/ApplicationTests.java | 31 +++++++++------ 10 files changed, 68 insertions(+), 36 deletions(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index bbf99f9fca..47cdc0e3aa 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -1724,25 +1724,22 @@ team.blue.name = Blue hint.skip = Skip hint.desktopMove = Use [accent][[WASD][] to move. hint.zoom = [accent]Scroll[] to zoom in or out. -hint.mine = Move near the \uF8C4 copper ore and [accent]tap[] it to mine manually. hint.desktopShoot = [accent][[Left-click][] to shoot. hint.depositItems = To transfer items, drag from your ship to the core. hint.respawn = To respawn as a ship, press [accent][[V][]. hint.respawn.mobile = You have switched control to a unit/structure. To respawn as a ship, [accent]tap the avatar in the top left.[] hint.desktopPause = Press [accent][[Space][] to pause and unpause the game. -hint.placeDrill = Select the \uE85E [accent]Drill[] tab in the menu at the bottom right, then select a \uF870 [accent]Drill[] and click on a copper patch to place it. -hint.placeDrill.mobile = Select the \uE85E [accent]Drill[] tab in the menu at the bottom right, then select a \uF870 [accent]Drill[] and tap on a copper patch to place it.\n\nPress the \uE800 [accent]checkmark[] at the bottom right to confirm. -hint.placeConveyor = Conveyors move items from drills into other blocks. Select a \uF896 [accent]Conveyor[] from the \uE814 [accent]Distribution[] tab.\n\nClick and drag to place multiple conveyors.\n[accent]Scroll[] to rotate. -hint.placeConveyor.mobile = Conveyors move items from drills into other blocks. Select a \uF896 [accent]Conveyor[] from the \uE814 [accent]Distribution[] tab.\n\nHold down your finger for a second and drag to place multiple conveyors. -hint.placeTurret = Place \uF861 [accent]Turrets[] to defend your base from enemies.\n\nTurrets require ammo - in this case, \uF838copper.\nUse conveyors and drills to supply them. + hint.breaking = [accent]Right-click[] and drag to break blocks. hint.breaking.mobile = Activate the \uE817 [accent]hammer[] in the bottom right and tap to break blocks.\n\nHold down your finger for a second and drag to break in a selection. hint.blockInfo = View information of a block by selecting it in the [accent]build menu[], then selecting the [accent][[?][] button at the right. hint.derelict = [accent]Derelict[] structures are broken remnants of old bases that no longer function.\n\nThese structures can be [accent]deconstructed[] for resources. hint.research = Use the \uE875 [accent]Research[] button to research new technology. hint.research.mobile = Use the \uE875 [accent]Research[] button in the \uE88C [accent]Menu[] to research new technology. -hint.unitControl = Hold [accent][[L-ctrl][] and [accent]click[] to control friendly units or turrets. -hint.unitControl.mobile = [accent][[Double-tap][] to control friendly units or turrets. +hint.unitControl = Hold [accent][[L-ctrl][] and [accent]click[] to manually control friendly units or turrets. +hint.unitControl.mobile = [accent][[Double-tap][] to manually control friendly units or turrets. +hint.unitSelectControl = To control units, enter [accent]command mode[] by holding [accent]L-shift.[]\nWhile in command mode, click and drag to select units. [accent]Right-click[] a location or target to command units there. +hint.unitSelectControl.mobile = To control units, enter [accent]command mode[] by pressing the [accent]command[] button in the bottom left.\nWhile in command mode, long-press and drag to select units. Tap a location or target to command units there. hint.launch = Once enough resources are collected, you can [accent]Launch[] by selecting nearby sectors from the \uE827 [accent]Map[] in the bottom right. hint.launch.mobile = Once enough resources are collected, you can [accent]Launch[] by selecting nearby sectors from the \uE827 [accent]Map[] in the \uE88C [accent]Menu[]. hint.schematicSelect = Hold [accent][[F][] and drag to select blocks to copy and paste.\n\n[accent][[Middle Click][] to copy a single block type. @@ -1763,6 +1760,29 @@ hint.coreIncinerate = After the core is filled to capacity with an item, any ext hint.factoryControl = To set a unit factory's [accent]output destination[], click a factory block while in command mode, then right-click a location.\nUnits produced by it will automatically move there. hint.factoryControl.mobile = To set a unit factory's [accent]output destination[], tap a factory block while in command mode, then tap a location.\nUnits produced by it will automatically move there. +gz.mine = Move near the \uf8c4 [accent]copper ore[] on the ground and click to begin mining. +gz.mine.mobile = Move near the \uf8c4 [accent]copper ore[] on the ground and tap it to begin mining. + +gz.research = Open the \ue875 tech tree.\nResearch the \uf870 [accent]Mechanical Drill[], then select it from the menu in the bottom right.\nClick on a copper patch to place it. +gz.research.mobile = Open the \ue875 tech tree.\nResearch the \uf870 [accent]Mechanical Drill[], then select it from the menu in the bottom right.\nTap on a copper patch to place it.\n\nPress the \uE800 [accent]checkmark[] at the bottom right to confirm. + +gz.conveyors = Research and place \uf896 [accent]conveyors[] to move the mined resources\nfrom drills to the core.\n\nClick and drag to place multiple conveyors.\n[accent]Scroll[] to rotate. +gz.conveyors.mobile = Research and place \uf896 [accent]conveyors[] to move the mined resources\nfrom drills to the core.\n\nHold down your finger for a second and drag to place multiple conveyors. + +gz.drills = Expand the mining operation.\nPlace more Mechanical Drills.\nMine 100 copper. +gz.lead = \uf837 [accent]Lead[] is another commonly used resource.\nSet up drills to mine lead. + +gz.moveup = \ue804 Move up for further objectives. +gz.turrets = Research and place 2 \uf861 [accent]Duo[] turrets to defend the core.\nDuo turrets require \uf838 [accent]ammo[] from conveyors. +gz.walls = [accent]Walls[] can prevent oncoming damage from reaching buildings.\nPlace \uf8ae [accent]copper walls[] around the turrets. +gz.defend = Enemy incoming, prepare to defend. +gz.aa = Flying units cannot easily be dispatched with standard turrets.\n\uf860 [accent]Scatter[] turrets provide excellent anti-air, but require \uf837 [accent]lead[] as ammo. +gz.zone1 = This is the enemy drop zone. +gz.zone2 = Anything built in the radius is destroyed when a wave starts. +gz.zone3 = A wave will begin now.\nGet ready. +gz.finish = Build more turrets, mine more resources,\nand defend against all the waves to [accent]capture the sector[]. + + item.copper.description = Used in all types of construction and ammunition. item.copper.details = Copper. Abnormally abundant metal on Serpulo. Structurally weak unless reinforced. item.lead.description = Used in liquid transportation and electrical structures. diff --git a/core/assets/maps/groundZero.msav b/core/assets/maps/groundZero.msav index bb169dbbc773a5fb2bf5bae7fc8afbe6a760d4a6..34fe213016bfb7b049cc264995a11aa3fd01114b 100644 GIT binary patch literal 16461 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 i*A(1U@UNA0>=(iRwGj2I1+qQ, Eachable Core.input.axis(Binding.move_x) != 0 || Core.input.axis(Binding.move_y) != 0), zoom(visibleDesktop, () -> Core.input.axis(KeyCode.scroll) != 0), - mine(() -> player.unit().canMine() && isTutorial.get(), () -> player.unit().mining()), - placeDrill(isTutorial, () -> ui.hints.placedBlocks.contains(Blocks.mechanicalDrill)), - placeConveyor(isTutorial, () -> ui.hints.placedBlocks.contains(Blocks.conveyor)), - placeTurret(isTutorial, () -> ui.hints.placedBlocks.contains(Blocks.duo)), - breaking(isTutorial, () -> ui.hints.events.contains("break")), + breaking(() -> isTutorial.get() && state.rules.defaultTeam.data().getCount(Blocks.conveyor) > 5, () -> ui.hints.events.contains("break")), desktopShoot(visibleDesktop, () -> isSerpulo() && Vars.state.enemies > 0, () -> player.shooting), depositItems(() -> player.unit().hasItem(), () -> !player.unit().hasItem()), - desktopPause(visibleDesktop, () -> isTutorial.get() && !Vars.net.active(), () -> Core.input.keyTap(Binding.pause)), - research(isTutorial, () -> ui.research.isShown()), + desktopPause(visibleDesktop, () -> isTutorial.get() && !Vars.net.active() && state.wave >= 2, () -> Core.input.keyTap(Binding.pause)), unitControl(() -> isSerpulo() && state.rules.defaultTeam.data().units.size > 2 && !net.active() && !player.dead(), () -> !player.dead() && !player.unit().spawnedByCore), + unitSelectControl(() -> isSerpulo() && state.rules.defaultTeam.data().units.size > 3 && !net.active() && !player.dead(), () -> control.input.commandMode && control.input.selectedUnits.size > 0), 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)), + schematicSelect(visibleDesktop, () -> ui.hints.placedBlocks.contains(Blocks.router) || ui.hints.placedBlocks.contains(Blocks.ductRouter), () -> Core.input.keyRelease(Binding.schematic_select) || Core.input.keyTap(Binding.pick)), conveyorPathfind(() -> control.input.block == Blocks.titaniumConveyor, () -> Core.input.keyRelease(Binding.diagonal_placement) || (mobile && Core.settings.getBool("swapdiagonal"))), boost(visibleDesktop, () -> !player.dead() && player.unit().type.canBoost, () -> Core.input.keyDown(Binding.boost)), blockInfo(() -> !(state.isCampaign() && state.rules.sector == SectorPresets.groundZero.sector && state.wave < 3), () -> ui.content.isShown()), diff --git a/tests/src/test/java/ApplicationTests.java b/tests/src/test/java/ApplicationTests.java index 2e2f0b968c..1160fea462 100644 --- a/tests/src/test/java/ApplicationTests.java +++ b/tests/src/test/java/ApplicationTests.java @@ -393,6 +393,7 @@ public class ApplicationTests{ void liquidOutput(){ world.loadMap(testMap); state.set(State.playing); + state.rules.limitMapArea = false; world.tile(0, 0).setBlock(Blocks.liquidSource, Team.sharded); world.tile(0, 0).build.configureAny(Liquids.water); @@ -409,6 +410,7 @@ public class ApplicationTests{ void liquidJunctionOutput(){ world.loadMap(testMap); state.set(State.playing); + state.rules.limitMapArea = false; Tile source = world.rawTile(0, 0), tank = world.rawTile(1, 4), junction = world.rawTile(0, 1), conduit = world.rawTile(0, 2); @@ -431,9 +433,10 @@ public class ApplicationTests{ void liquidRouterOutputAll() { world.loadMap(testMap); state.set(State.playing); + state.rules.limitMapArea = false; Tile source = world.rawTile(4,0), router = world.rawTile(4, 2), conduitUp1 = world.rawTile(4,1), - conduitLeft = world.rawTile(3,2), conduitUp2 = world.rawTile(4, 3), conduitRight = world.rawTile(5, 2), - leftTank = world.rawTile(1, 2), topTank = world.rawTile(4,5), rightTank = world.rawTile(7, 2); + conduitLeft = world.rawTile(3,2), conduitUp2 = world.rawTile(4, 3), conduitRight = world.rawTile(5, 2), + leftTank = world.rawTile(1, 2), topTank = world.rawTile(4,5), rightTank = world.rawTile(7, 2); source.setBlock(Blocks.liquidSource, Team.sharded); source.build.configureAny(Liquids.water); @@ -456,10 +459,11 @@ public class ApplicationTests{ void sorterOutputCorrect() { world.loadMap(testMap); state.set(State.playing); + state.rules.limitMapArea = false; Tile source1 = world.rawTile(4, 0), source2 = world.rawTile(6, 0), s1conveyor = world.rawTile(4, 1), - s2conveyor = world.rawTile(6, 1), s1s2conveyor = world.rawTile(5, 1), sorter = world.rawTile(5, 2), - leftconveyor = world.rawTile(4, 2), rightconveyor = world.rawTile(6, 2), sortedconveyor = world.rawTile(5, 3), - leftVault = world.rawTile(2, 2), rightVault = world.rawTile(8, 2), topVault = world.rawTile(5, 5); + s2conveyor = world.rawTile(6, 1), s1s2conveyor = world.rawTile(5, 1), sorter = world.rawTile(5, 2), + leftconveyor = world.rawTile(4, 2), rightconveyor = world.rawTile(6, 2), sortedconveyor = world.rawTile(5, 3), + leftVault = world.rawTile(2, 2), rightVault = world.rawTile(8, 2), topVault = world.rawTile(5, 5); source1.setBlock(Blocks.itemSource, Team.sharded); source1.build.configureAny(Items.coal); @@ -488,10 +492,11 @@ public class ApplicationTests{ void routerOutputAll() { world.loadMap(testMap); state.set(State.playing); + state.rules.limitMapArea = false; Tile source1 = world.rawTile(5, 0), conveyor = world.rawTile(5, 1), - router = world.rawTile(5, 2), leftconveyor = world.rawTile(4, 2), rightconveyor = world.rawTile(6, 2), - middleconveyor = world.rawTile(5, 3), leftVault = world.rawTile(2, 2), - rightVault = world.rawTile(8, 2), topVault = world.rawTile(5, 5); + router = world.rawTile(5, 2), leftconveyor = world.rawTile(4, 2), rightconveyor = world.rawTile(6, 2), + middleconveyor = world.rawTile(5, 3), leftVault = world.rawTile(2, 2), + rightVault = world.rawTile(8, 2), topVault = world.rawTile(5, 5); source1.setBlock(Blocks.itemSource, Team.sharded); source1.build.configureAny(Items.coal); @@ -515,9 +520,10 @@ public class ApplicationTests{ void junctionOutputCorrect() { world.loadMap(testMap); state.set(State.playing); + state.rules.limitMapArea = false; Tile source1 = world.rawTile(5,0),source2 = world.rawTile(7, 2), conveyor1 = world.rawTile(5, 1), - conveyor2 = world.rawTile(6,2), junction = world.rawTile(5, 2), conveyor3 = world.rawTile(5,3), - conveyor4 = world.rawTile(4,2), vault2 = world.rawTile(3, 1), vault1 = world.rawTile(5,5); + conveyor2 = world.rawTile(6,2), junction = world.rawTile(5, 2), conveyor3 = world.rawTile(5,3), + conveyor4 = world.rawTile(4,2), vault2 = world.rawTile(3, 1), vault1 = world.rawTile(5,5); source1.setBlock(Blocks.itemSource, Team.sharded); source1.build.configureAny(Items.coal); source2.setBlock(Blocks.itemSource, Team.sharded); @@ -565,6 +571,7 @@ public class ApplicationTests{ world.loadMap(testMap); state.set(State.playing); + state.rules.limitMapArea = false; int length = 128; world.tile(0, 0).setBlock(Blocks.itemSource, Team.sharded); world.tile(0, 0).build.configureAny(Items.copper); @@ -873,7 +880,6 @@ public class ApplicationTests{ Time.setDeltaProvider(() -> 1f); logic.reset(); - state.rules.sector = zone.sector; try{ world.loadGenerator(zone.generator.map.width, zone.generator.map.height, zone.generator::generate); }catch(SaveException e){ @@ -934,6 +940,7 @@ public class ApplicationTests{ } assertEquals(1, Team.sharded.cores().size, "Sector must have one core: " + zone); + assertTrue(Team.sharded.core().items.total() < 1000, "Sector must not have starting resources: " + zone); assertTrue(hasSpawnPoint, "Sector \"" + zone.name + "\" has no spawn points."); assertTrue(spawner.countSpawns() > 0 || (state.rules.attackMode && state.rules.waveTeam.data().hasCore()), "Sector \"" + zone.name + "\" has no enemy spawn points: " + spawner.countSpawns()); @@ -975,4 +982,4 @@ public class ApplicationTests{ tile.build.handleStack(item, 1, unit); assertEquals(capacity, tile.build.items.get(item)); } -} +} \ No newline at end of file