mirror of
https://github.com/Anuken/Mindustry.git
synced 2025-03-13 19:39:04 +07:00
Improved base generation
This commit is contained in:
parent
6ee7dd56fe
commit
dbcce9663c
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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());
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
@ -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(){
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user