Improved base generation

This commit is contained in:
Anuken 2018-10-11 12:18:23 -04:00
parent 6ee7dd56fe
commit dbcce9663c
10 changed files with 77 additions and 97 deletions

View File

@ -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;

View File

@ -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);

View File

@ -38,6 +38,8 @@ public class Sector{
public transient int difficulty;
/**Items the player starts with on this sector.*/
public transient Array<ItemStack> startingItems;
/**Last expansion parameters.*/
public transient int lastExpandX, lastExpandY;
public Mission currentMission(){
return completedMissions >= missions.size ? victoryMission : missions.get(completedMissions);

View File

@ -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());

View File

@ -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<Block> turrets = find(b -> b instanceof ItemTurret);
Array<Block> powerTurrets = find(b -> b instanceof PowerTurret);
@ -117,68 +108,27 @@ public class FortressGenerator{
}
};
BiFunction<Block, Float, IntPositionConsumer> placer = (block, chance) -> (x, y) -> {
if(gen.canPlace(x, y, block) && gen.random.chance(chance)){
gen.setBlock(x, y, block, team);
}
};
Array<IntPositionConsumer> 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);
}
}
);

View File

@ -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<GridPoint2> getSpawnPoints(Generation gen){
return Array.with(new GridPoint2(coreX, coreY), new GridPoint2(gen.width - 1 - coreX, gen.height - 1 - coreY));
}
}

View File

@ -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(){

View File

@ -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;

View File

@ -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);

View File

@ -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;