From dbcce9663cb100b6e36ab133561d821f59fffb9f Mon Sep 17 00:00:00 2001 From: Anuken Date: Thu, 11 Oct 2018 12:18:23 -0400 Subject: [PATCH] Improved base generation --- core/src/io/anuke/mindustry/Vars.java | 1 - .../entities/bullet/LiquidBulletType.java | 2 +- core/src/io/anuke/mindustry/maps/Sector.java | 2 + core/src/io/anuke/mindustry/maps/Sectors.java | 11 +- .../maps/generation/FortressGenerator.java | 110 +++++++----------- .../maps/missions/BattleMission.java | 39 ++++--- core/src/io/anuke/mindustry/world/Tile.java | 2 +- .../world/blocks/defense/ForceProjector.java | 3 +- .../world/blocks/defense/MendProjector.java | 2 +- .../world/blocks/units/UnitFactory.java | 2 +- 10 files changed, 77 insertions(+), 97 deletions(-) diff --git a/core/src/io/anuke/mindustry/Vars.java b/core/src/io/anuke/mindustry/Vars.java index 7917c91a1a..cd8891e462 100644 --- a/core/src/io/anuke/mindustry/Vars.java +++ b/core/src/io/anuke/mindustry/Vars.java @@ -97,7 +97,6 @@ public class Vars{ public static boolean headless = false; public static float controllerMin = 0.25f; public static float baseControllerSpeed = 11f; - //only if smoothCamera public static boolean snapCamera = true; public static ContentLoader content; public static GameState state; diff --git a/core/src/io/anuke/mindustry/entities/bullet/LiquidBulletType.java b/core/src/io/anuke/mindustry/entities/bullet/LiquidBulletType.java index 49d2c119e5..fa8b7164ee 100644 --- a/core/src/io/anuke/mindustry/entities/bullet/LiquidBulletType.java +++ b/core/src/io/anuke/mindustry/entities/bullet/LiquidBulletType.java @@ -37,7 +37,7 @@ public class LiquidBulletType extends BulletType{ if(liquid.canExtinguish()){ Tile tile = world.tileWorld(b.x, b.y); - if(Fire.has(tile.x, tile.y) && tile != null){ + if(tile != null && Fire.has(tile.x, tile.y)){ Fire.extinguish(tile, 100f); b.remove(); hit(b); diff --git a/core/src/io/anuke/mindustry/maps/Sector.java b/core/src/io/anuke/mindustry/maps/Sector.java index 80eff44da5..acbdce135a 100644 --- a/core/src/io/anuke/mindustry/maps/Sector.java +++ b/core/src/io/anuke/mindustry/maps/Sector.java @@ -38,6 +38,8 @@ public class Sector{ public transient int difficulty; /**Items the player starts with on this sector.*/ public transient Array startingItems; + /**Last expansion parameters.*/ + public transient int lastExpandX, lastExpandY; public Mission currentMission(){ return completedMissions >= missions.size ? victoryMission : missions.get(completedMissions); diff --git a/core/src/io/anuke/mindustry/maps/Sectors.java b/core/src/io/anuke/mindustry/maps/Sectors.java index 04f9e60328..99b50170a3 100644 --- a/core/src/io/anuke/mindustry/maps/Sectors.java +++ b/core/src/io/anuke/mindustry/maps/Sectors.java @@ -115,6 +115,9 @@ public class Sectors{ } } + sector.lastExpandX = expandX; + sector.lastExpandY = expandY; + //add new sector spaces for(int x = sector.x; x < sector.x+sector.width; x++){ for(int y = sector.y; y < sector.y+sector.height; y++){ @@ -292,7 +295,7 @@ public class Sectors{ } private void initSector(Sector sector){ - sector.difficulty = (int)(Mathf.dst(sector.x, sector.y)); + sector.difficulty = (int)(Mathf.dst(sector.x, sector.y) / 2); if(presets.get(sector.x, sector.y) != null){ SectorPreset p = presets.get(sector.x, sector.y); @@ -357,8 +360,12 @@ public class Sectors{ //expand addExpandMission(sector, 16); + if((sector.width + sector.height) <= 3){ + sector.difficulty = Math.max(sector.difficulty - 3, 0); + } + //50% chance to get a wave mission - if(Mathf.randomSeed(sector.getSeed() + 6) < 0.5){ + if(Mathf.randomSeed(sector.getSeed() + 6) < 0.5 || (sector.width + sector.height) <= 3){ sector.missions.add(new WaveMission(sector.difficulty*5 + Mathf.randomSeed(sector.getSeed(), 0, 3)*5)); }else{ sector.missions.add(new BattleMission()); diff --git a/core/src/io/anuke/mindustry/maps/generation/FortressGenerator.java b/core/src/io/anuke/mindustry/maps/generation/FortressGenerator.java index f06447a3db..28f26d7f0a 100644 --- a/core/src/io/anuke/mindustry/maps/generation/FortressGenerator.java +++ b/core/src/io/anuke/mindustry/maps/generation/FortressGenerator.java @@ -10,21 +10,23 @@ import io.anuke.mindustry.content.Liquids; import io.anuke.mindustry.content.blocks.*; import io.anuke.mindustry.game.Team; import io.anuke.mindustry.type.AmmoType; -import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Recipe; import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Edges; import io.anuke.mindustry.world.Tile; +import io.anuke.mindustry.world.blocks.PowerBlock; import io.anuke.mindustry.world.blocks.defense.Door; +import io.anuke.mindustry.world.blocks.defense.ForceProjector; import io.anuke.mindustry.world.blocks.defense.MendProjector; import io.anuke.mindustry.world.blocks.defense.Wall; import io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret; +import io.anuke.mindustry.world.blocks.defense.turrets.LiquidTurret; import io.anuke.mindustry.world.blocks.defense.turrets.PowerTurret; import io.anuke.mindustry.world.blocks.defense.turrets.Turret; import io.anuke.mindustry.world.blocks.power.NuclearReactor; import io.anuke.mindustry.world.blocks.power.PowerGenerator; +import io.anuke.mindustry.world.blocks.power.SolarGenerator; import io.anuke.mindustry.world.blocks.production.Drill; -import io.anuke.mindustry.world.blocks.production.Pump; import io.anuke.mindustry.world.blocks.storage.CoreBlock; import io.anuke.mindustry.world.blocks.storage.StorageBlock; import io.anuke.mindustry.world.blocks.units.UnitFactory; @@ -34,10 +36,11 @@ import io.anuke.ucore.function.IntPositionConsumer; import io.anuke.ucore.function.TriFunction; import io.anuke.ucore.util.Geometry; import io.anuke.ucore.util.Mathf; + import static io.anuke.mindustry.Vars.content; public class FortressGenerator{ - private final static int coreDst = 120; + private final static int coreDst = 60; private int enemyX, enemyY, coreX, coreY; private Team team; @@ -54,23 +57,11 @@ public class FortressGenerator{ gen(); } - enum Pass{ - walls((x, y) -> { - - }); - - final IntPositionConsumer cons; - - Pass(IntPositionConsumer cons){ - this.cons = cons; - } - } - void gen(){ gen.setBlock(enemyX, enemyY, StorageBlocks.core, team); float difficultyScl = Mathf.clamp(gen.sector.difficulty / 20f + gen.random.range(1f/2f), 0f, 0.9999f); - int coreDst = FortressGenerator.coreDst*gen.sector.width; + int coreDst = FortressGenerator.coreDst*Math.min(gen.sector.width, gen.sector.height); Array turrets = find(b -> b instanceof ItemTurret); Array powerTurrets = find(b -> b instanceof PowerTurret); @@ -117,68 +108,27 @@ public class FortressGenerator{ } }; + BiFunction placer = (block, chance) -> (x, y) -> { + if(gen.canPlace(x, y, block) && gen.random.chance(chance)){ + gen.setBlock(x, y, block, team); + } + }; + Array passes = Array.with( //initial seeding solar panels - (x, y) -> { - Block block = PowerBlocks.largeSolarPanel; - - if(gen.random.chance(0.001*placeChance) && gen.canPlace(x, y, block)){ - gen.setBlock(x, y, block, team); - } - }, + placer.get(PowerBlocks.largeSolarPanel, 0.001f), //extra seeding seeder.get(PowerBlocks.solarPanel, tile -> tile.block() == PowerBlocks.largeSolarPanel && gen.random.chance(0.3)), - //drills (not powered) - (x, y) -> { - if(!gen.random.chance(0.1*placeChance)) return; - - Item item = gen.drillItem(x, y, drill); - if(item != null && item != Items.stone && item != Items.sand && gen.canPlace(x, y, drill)){ - gen.setBlock(x, y, drill, team); - } - }, - - //drills (not powered) - (x, y) -> { - if(!gen.random.chance(0.1*placeChance)) return; - - if(gen.tile(x, y).floor().isLiquid && gen.tile(x, y).floor().liquidDrop == Liquids.water){ - gen.setBlock(x, y, LiquidBlocks.mechanicalPump, team); - } - }, - //coal gens - seeder.get(PowerBlocks.combustionGenerator, tile -> tile.block() instanceof Drill && gen.drillItem(tile.x, tile.y, (Drill)tile.block()) == Items.coal && gen.random.chance(0.2)), - - //drills (powered) - (x, y) -> { - if(gen.random.chance(0.4*placeChance) && gen.canPlace(x, y, powerDrill) && gen.drillItem(x, y, powerDrill) == Items.thorium && checker.get(gen.tile(x, y), powerDrill, other -> other.block() instanceof PowerGenerator)){ - gen.setBlock(x, y, powerDrill, team); - } - }, - - //nuclear reactors - seeder.get(PowerBlocks.thoriumReactor, tile -> tile.block() instanceof Drill && gen.random.chance(0.2) && gen.drillItem(tile.x, tile.y, (Drill)tile.block()) == Items.thorium && gen.random.chance(0.3)), + seeder.get(PowerBlocks.combustionGenerator, tile -> tile.block() instanceof SolarGenerator && gen.random.chance(0.2)), //water extractors seeder.get(ProductionBlocks.waterExtractor, tile -> tile.block() instanceof NuclearReactor && gen.random.chance(0.5)), - //mend cores - seeder.get(DefenseBlocks.mendProjector, tile -> tile.block() instanceof PowerGenerator && gen.random.chance(0.03)), - - //unit pads (assorted) - seeder.get(UnitBlocks.daggerFactory, tile -> tile.block() instanceof MendProjector && gen.random.chance(0.3)), - - //unit pads (assorted) - seeder.get(UnitBlocks.wraithFactory, tile -> tile.block() instanceof MendProjector && gen.random.chance(0.3)), - - //unit pads (assorted) - seeder.get(UnitBlocks.titanFactory, tile -> tile.block() instanceof MendProjector && gen.random.chance(0.23)), - - //unit pads (assorted) - seeder.get(UnitBlocks.ghoulFactory, tile -> tile.block() instanceof MendProjector && gen.random.chance(0.23)), + //mend projectors + seeder.get(DefenseBlocks.mendProjector, tile -> tile.block() instanceof PowerGenerator && gen.random.chance(0.04)), //power turrets seeder.get(powerTurret, tile -> tile.block() instanceof PowerGenerator && gen.random.chance(0.04)), @@ -187,13 +137,28 @@ public class FortressGenerator{ seeder.get(UnitBlocks.repairPoint, tile -> tile.block() instanceof PowerGenerator && gen.random.chance(0.1)), //turrets1 - seeder.get(turret1, tile -> tile.block() instanceof Pump && gen.random.chance(0.22 - turret1.size*0.02)), + seeder.get(turret1, tile -> tile.block() instanceof PowerBlock && gen.random.chance(0.22 - turret1.size*0.02)), //turrets2 - seeder.get(turret2, tile -> tile.block() instanceof Drill && gen.random.chance(0.12 - turret2.size*0.02)), + seeder.get(turret2, tile -> tile.block() instanceof PowerBlock && gen.random.chance(0.12 - turret2.size*0.02)), + + //shields + seeder.get(DefenseBlocks.forceProjector, tile -> tile.block() instanceof CoreBlock || tile.block() instanceof UnitFactory && gen.random.chance(0.08)), + + //unit pads (assorted) + seeder.get(UnitBlocks.daggerFactory, tile -> tile.block() instanceof MendProjector || tile.block() instanceof ForceProjector && gen.random.chance(0.3)), + + //unit pads (assorted) + seeder.get(UnitBlocks.wraithFactory, tile -> tile.block() instanceof MendProjector || tile.block() instanceof ForceProjector && gen.random.chance(0.3)), + + //unit pads (assorted) + seeder.get(UnitBlocks.titanFactory, tile -> tile.block() instanceof MendProjector || tile.block() instanceof ForceProjector && gen.random.chance(0.23)), + + //unit pads (assorted) + seeder.get(UnitBlocks.ghoulFactory, tile -> tile.block() instanceof MendProjector || tile.block() instanceof ForceProjector && gen.random.chance(0.23)), //vaults - seeder.get(StorageBlocks.vault, tile -> tile.block() instanceof CoreBlock && gen.random.chance(0.4)), + seeder.get(StorageBlocks.vault, tile -> (tile.block() instanceof CoreBlock || tile.block() instanceof ForceProjector) && gen.random.chance(0.4)), //big turrets seeder.get(bigTurret, tile -> tile.block() instanceof StorageBlock && gen.random.chance(0.65)), @@ -214,6 +179,9 @@ public class FortressGenerator{ } }, + //mines + placer.get(DefenseBlocks.shockMine, 0.02f * difficultyScl), + //fill up turrets w/ ammo (x, y) -> { Tile tile = gen.tile(x, y); @@ -228,6 +196,8 @@ public class FortressGenerator{ block.handleStack(type[index].item, block.acceptStack(type[index].item, 1000, tile, null), tile, null); }else if(block instanceof NuclearReactor){ tile.entity.items.add(Items.thorium, 30); + }else if(block instanceof LiquidTurret){ + tile.entity.liquids.add(Liquids.water, tile.block().liquidCapacity); } } ); diff --git a/core/src/io/anuke/mindustry/maps/missions/BattleMission.java b/core/src/io/anuke/mindustry/maps/missions/BattleMission.java index be0b4d8769..ddea172cc7 100644 --- a/core/src/io/anuke/mindustry/maps/missions/BattleMission.java +++ b/core/src/io/anuke/mindustry/maps/missions/BattleMission.java @@ -1,15 +1,18 @@ package io.anuke.mindustry.maps.missions; -import com.badlogic.gdx.math.GridPoint2; -import com.badlogic.gdx.utils.Array; import io.anuke.mindustry.Vars; import io.anuke.mindustry.game.GameMode; import io.anuke.mindustry.game.Team; +import io.anuke.mindustry.maps.generation.FortressGenerator; import io.anuke.mindustry.maps.generation.Generation; +import io.anuke.mindustry.world.Tile; import io.anuke.ucore.util.Bundles; +import io.anuke.ucore.util.SeedRandom; + +import static io.anuke.mindustry.Vars.*; public class BattleMission extends Mission{ - private final static int coreX = 60, coreY = 60; + final int spacing = 20; @Override public GameMode getMode(){ @@ -21,19 +24,22 @@ public class BattleMission extends Mission{ return Bundles.get("text.mission.battle"); } - @Override - public void generate(Generation gen){ - //int enemyX = gen.width-1-coreX, enemyY = gen.height-1-coreX; - - //generateCoreAt(gen, coreX, coreY, Team.blue); - //generateCoreAt(gen, enemyX, enemyY, Team.red); - - //new FortressGenerator().generate(gen, Team.red, coreX, coreY, enemyX, enemyY); - } - @Override public void onBegin(){ - + if(state.teams.get(defaultTeam).cores.size == 0){ + return; + } + Tile core = state.teams.get(defaultTeam).cores.first(); + Generation gen = new Generation(world.getSector(), world.getTiles(), world.width(), world.height(), new SeedRandom(world.getSector().getSeed()-1)); + int ex = world.getSector().lastExpandX; + int ey = world.getSector().lastExpandY; + int enx = world.width() - 1 - spacing; + int eny = world.height() - 1 - spacing; + if(ex < 0) enx = spacing*gen.sector.width; + if(ex > 0) enx = world.width() - 1 - spacing*gen.sector.width; + if(ey < 0) eny = spacing*gen.sector.height; + if(ey > 0) eny = world.height() - 1 - spacing*gen.sector.height; + new FortressGenerator().generate(gen, Team.red, core.x, core.y, enx, eny); } @Override @@ -45,9 +51,4 @@ public class BattleMission extends Mission{ } return true; } - - @Override - public Array getSpawnPoints(Generation gen){ - return Array.with(new GridPoint2(coreX, coreY), new GridPoint2(gen.width - 1 - coreX, gen.height - 1 - coreY)); - } } diff --git a/core/src/io/anuke/mindustry/world/Tile.java b/core/src/io/anuke/mindustry/world/Tile.java index 868b919c52..79520f01b8 100644 --- a/core/src/io/anuke/mindustry/world/Tile.java +++ b/core/src/io/anuke/mindustry/world/Tile.java @@ -260,7 +260,7 @@ public class Tile implements PosTrait, TargetTrait{ } public boolean isEnemyCheat(){ - return getTeam() == waveTeam && state.mode.enemyCheat; + return getTeam() == waveTeam && !state.mode.isPvp; } public boolean isLinked(){ diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/ForceProjector.java b/core/src/io/anuke/mindustry/world/blocks/defense/ForceProjector.java index f4c6abd1dd..ad6aa4d585 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/ForceProjector.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/ForceProjector.java @@ -71,6 +71,7 @@ public class ForceProjector extends Block { @Override public void update(Tile tile){ ForceEntity entity = tile.entity(); + boolean cheat = tile.isEnemyCheat(); if(entity.shield == null){ entity.shield = new ShieldEntity(tile); @@ -89,7 +90,7 @@ public class ForceProjector extends Block { Effects.effect(BlockFx.reactorsmoke, tile.drawx() + Mathf.range(tilesize/2f), tile.drawy() + Mathf.range(tilesize/2f)); } - if(!entity.cons.valid()){ + if(!entity.cons.valid() && !cheat){ entity.warmup = Mathf.lerpDelta(entity.warmup, 0f, 0.1f); if(entity.warmup <= 0.09f){ entity.broken = true; diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/MendProjector.java b/core/src/io/anuke/mindustry/world/blocks/defense/MendProjector.java index fa9559e101..c8951d62c9 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/MendProjector.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/MendProjector.java @@ -56,7 +56,7 @@ public class MendProjector extends Block{ @Override public void update(Tile tile){ MendEntity entity = tile.entity(); - entity.heat = Mathf.lerpDelta(entity.heat, entity.cons.valid() ? 1f : 0f, 0.08f); + entity.heat = Mathf.lerpDelta(entity.heat, entity.cons.valid() || tile.isEnemyCheat() ? 1f : 0f, 0.08f); entity.charge += entity.heat * entity.delta(); entity.phaseHeat = Mathf.lerpDelta(entity.phaseHeat, (float)entity.items.get(consumes.item()) / itemCapacity, 0.1f); diff --git a/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java b/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java index 5a6091d27a..0a49db2229 100644 --- a/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java +++ b/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java @@ -35,7 +35,7 @@ import java.io.DataOutputStream; import java.io.IOException; public class UnitFactory extends Block{ - protected float gracePeriodMultiplier = 23f; + protected float gracePeriodMultiplier = 2f; protected float speedupTime = 60f * 60f * 20; protected float maxSpeedup = 2f;