diff --git a/core/assets/maps/tutorial.png b/core/assets/maps/tutorial.png index 8b03ea4112..5e4ddfeae5 100644 Binary files a/core/assets/maps/tutorial.png and b/core/assets/maps/tutorial.png differ diff --git a/core/src/io/anuke/mindustry/Renderer.java b/core/src/io/anuke/mindustry/Renderer.java index fde5c5616c..036835eed7 100644 --- a/core/src/io/anuke/mindustry/Renderer.java +++ b/core/src/io/anuke/mindustry/Renderer.java @@ -64,9 +64,15 @@ public class Renderer extends RendererModule{ if(GameState.is(State.menu)){ clearScreen(); }else{ - + boolean smoothcam = Settings.getBool("smoothcam"); + if(World.core.block() == ProductionBlocks.core){ - smoothCamera(player.x, player.y, android ? 0.3f : 0.14f); + + if(!smoothcam){ + setCamera(player.x, player.y); + }else{ + smoothCamera(player.x, player.y, android ? 0.3f : 0.14f); + } }else{ smoothCamera(World.core.worldx(), World.core.worldy(), 0.4f); } @@ -87,9 +93,11 @@ public class Renderer extends RendererModule{ } float lastx = camera.position.x, lasty = camera.position.y; - - camera.position.set((int) camera.position.x, (int) camera.position.y, 0); - + + if(Vars.snapCamera && smoothcam){ + camera.position.set((int) camera.position.x, (int) camera.position.y, 0); + } + if(Gdx.graphics.getHeight() / Core.cameraScale % 2 == 1){ camera.position.add(0, -0.5f, 0); } @@ -319,12 +327,14 @@ public class Renderer extends RendererModule{ tile.block().drawPixelOverlay(tile); } } + + boolean smoothcam = Settings.getBool("smoothcam"); for(Entity entity : Entities.all()){ if(entity instanceof DestructibleEntity && !(entity instanceof TileEntity)){ DestructibleEntity dest = ((DestructibleEntity) entity); - if(dest instanceof Player){ + if(dest instanceof Player && Vars.snapCamera && smoothcam){ drawHealth((int)dest.x, (int)dest.y, dest.health, dest.maxhealth); }else{ drawHealth(dest.x, dest.y, dest.health, dest.maxhealth); diff --git a/core/src/io/anuke/mindustry/Tutorial.java b/core/src/io/anuke/mindustry/Tutorial.java index 9e53b90a2e..c0c8662fe2 100644 --- a/core/src/io/anuke/mindustry/Tutorial.java +++ b/core/src/io/anuke/mindustry/Tutorial.java @@ -199,7 +199,7 @@ public class Tutorial{ blockPlaceX = 0; blockPlaceY = -1; targetBlock = ProductionBlocks.conveyor; - text = "Use [orange][[R][] to rotate the conveyor to face up, then place it in the [yellow]marked location[] using the [orange][[left mouse button]"; + text = "Use [orange][[R][] to rotate the conveyor to face [orange]forwards[], then place it in the [yellow]marked location[] using the [orange][[left mouse button][]."; } }, placeConveyorAndroid{ @@ -212,7 +212,7 @@ public class Tutorial{ blockPlaceX = 0; blockPlaceY = -1; targetBlock = ProductionBlocks.conveyor; - text = "Use the [orange][[rotate button][] to rotate the conveyor to face up, drag it into position with one finger, then place it in the [yellow]marked location[] using the [orange][[checkmark]"; + text = "Use the [orange][[rotate button][] to rotate the conveyor to face [orange]forwards[], drag it into position with one finger, then place it in the [yellow]marked location[] using the [orange][[checkmark][]."; } }, placeConveyorAndroidInfo{ @@ -270,7 +270,7 @@ public class Tutorial{ }, drillInfo{ { - text = "Different types of ores require different types of drills. Stone requires stone drills, iron requires iron drills, and so on."; + text = "Different ores need different drills. Stone requires stone drills, iron requires iron drills, etc."; } }, drillPlaced2{ @@ -365,14 +365,14 @@ public class Tutorial{ pausingDesktop{ { desktopOnly = true; - text = "If you ever feel overwhelmed by enemies, you can press the [orange]pause button[] in the top right or [orange]space[] " + text = "If you ever need to take a break, press the [orange]pause button[] in the top right or [orange]space[] " + "to pause the game. You can still select and place blocks while paused, but cannot move or shoot."; } }, pausingAndroid{ { androidOnly = true; - text = "If you ever feel overwhelmed by enemies, you can press the [orange]pause button[] in the top right" + text = "If you ever need to take a break, press the [orange]pause button[] in the top right" + " to pause the game. You can still place select and place blocks while paused."; } }, @@ -422,7 +422,6 @@ public class Tutorial{ Vars.control.runWave(); } }, - /* pumpDesc{ { canBack = false; @@ -438,7 +437,7 @@ public class Tutorial{ targetBlock = ProductionBlocks.pump; blockPlaceX = 6; blockPlaceY = -2; - text = "Pumps work similarly to drills, except that they produce liquids instead of items. Try placing a pump on the [yellow]designated area[]."; + text = "Pumps work similarly to drills, except that they produce liquids instead of items. Try placing a pump on the [yellow]designated water[]."; } void onSwitch(){ @@ -457,11 +456,12 @@ public class Tutorial{ blockPlaceX = 5; blockPlaceY = -2; blockRotation = 2; - text = "Now place a conduit leading away from the pump."; + text = "Now place a [orange]conduit[] leading away from the pump."; } void onSwitch(){ Vars.ui.find("sectionbuttondistribution").fireClick(); + World.tile(blockPlaceX + World.core.x, blockPlaceY + World.core.y).setBlock(Blocks.air); } }, conduitUse2{ @@ -473,9 +473,13 @@ public class Tutorial{ targetBlock = ProductionBlocks.conduit; blockPlaceX = 4; blockPlaceY = -2; - blockRotation = 2; + blockRotation = 1; text = "And a few more..."; } + + void onSwitch(){ + World.tile(blockPlaceX + World.core.x, blockPlaceY + World.core.y).setBlock(Blocks.air); + } }, conduitUse3{ { @@ -489,11 +493,65 @@ public class Tutorial{ blockRotation = 1; text = "And a few more..."; } - }*/ + + void onSwitch(){ + World.tile(blockPlaceX + World.core.x, blockPlaceY + World.core.y).setBlock(Blocks.air); + } + }, + extractor{ + { + canBack = false; + canForward = false; + showBlock = true; + canPlace = true; + targetBlock = ProductionBlocks.coalpurifier; + blockPlaceX = 4; + blockPlaceY = 0; + text = "Now, place a [orange]coal extractor[] block at the end of the conduit."; + } + + void onSwitch(){ + World.tile(blockPlaceX + World.core.x, blockPlaceY + World.core.y).setBlock(Blocks.air); + Vars.ui.find("sectionbuttonproduction").fireClick(); + Vars.control.addItem(Item.steel, 60); + Vars.control.addItem(Item.iron, 60); + } + }, + extractorExplain{ + { + canBack = false; + text = "The extractor will now produce [orange]coal[] from the stone and water, then move it to the core."; + } + + void onSwitch(){ + for(int i = -2; i <= 2; i ++){ + World.tile(World.core.x + i + 4, World.core.y + 2).setBlock(ProductionBlocks.stonedrill); + World.tile(World.core.x + i + 4, World.core.y + 2).setFloor(Blocks.stone); + } + + for(int i = 0; i < 3; i ++){ + World.tile(World.core.x + 4 - 1 - i, World.core.y).setBlock(ProductionBlocks.conveyor, 2); + } + + World.tile(World.core.x + 2, World.core.y + 1).setBlock(ProductionBlocks.conveyor, 0); + World.tile(World.core.x + 3, World.core.y + 1).setBlock(ProductionBlocks.conveyor, 0); + World.tile(World.core.x + 4, World.core.y + 1).setBlock(ProductionBlocks.conveyor, 3); + World.tile(World.core.x + 5, World.core.y + 1).setBlock(ProductionBlocks.conveyor, 2); + World.tile(World.core.x + 6, World.core.y + 1).setBlock(ProductionBlocks.conveyor, 2); + + } + }, + extractorMore{ + { + canBack = false; + canPlace = true; + text = "The [orange]smeltery[] and [orange]crucible[] blocks work similarly to extractors, except they accept only items."; + } + }, end{ { text = "And that concludes the tutorial!"; - canBack =false; + canBack = false; } }; String text = "no text"; diff --git a/core/src/io/anuke/mindustry/UI.java b/core/src/io/anuke/mindustry/UI.java index c91cbe37be..b5156bafa5 100644 --- a/core/src/io/anuke/mindustry/UI.java +++ b/core/src/io/anuke/mindustry/UI.java @@ -139,9 +139,9 @@ public class UI extends SceneModule{ prefs.screenshakePref(); prefs.volumePrefs(); - prefs.checkPref("tutorial", "Show tutorial Window", true); prefs.checkPref("fps", "Show FPS", false); prefs.checkPref("noshadows", "Disable shadows", false); + prefs.checkPref("smoothcam", "Smooth Camera", true); prefs.hidden(()->{ if(!GameState.is(State.menu)){ diff --git a/core/src/io/anuke/mindustry/Vars.java b/core/src/io/anuke/mindustry/Vars.java index facc2b0f80..f3f4f953af 100644 --- a/core/src/io/anuke/mindustry/Vars.java +++ b/core/src/io/anuke/mindustry/Vars.java @@ -31,6 +31,9 @@ public class Vars{ //TODO named save slots, possibly with a scroll dialog public static final int saveSlots = 4; + //only if smoothCamera + public static boolean snapCamera = true; + //turret and enemy shoot speed inverse multiplier public static final float multiplier = android ? 3 : 2; diff --git a/core/src/io/anuke/mindustry/entities/Player.java b/core/src/io/anuke/mindustry/entities/Player.java index 1f3df969ff..30a2d91cf3 100644 --- a/core/src/io/anuke/mindustry/entities/Player.java +++ b/core/src/io/anuke/mindustry/entities/Player.java @@ -44,7 +44,12 @@ public class Player extends DestructibleEntity{ @Override public void draw(){ - Draw.rect("player", (int)x, (int)y, direction.angle()-90); + if(Vars.snapCamera && Settings.getBool("smoothcam")){ + Draw.rect("player", (int)x, (int)y, direction.angle()-90); + }else{ + Draw.rect("player", x, y, direction.angle()-90); + } + } @Override