New mission classes

This commit is contained in:
Anuken
2018-09-21 19:36:19 -04:00
parent 3bd40eeb27
commit d067bbfa65
18 changed files with 172 additions and 40 deletions

View File

@@ -7,6 +7,7 @@ import io.anuke.mindustry.game.Difficulty;
import io.anuke.mindustry.game.Saves.SaveSlot;
import io.anuke.mindustry.game.SpawnGroup;
import io.anuke.mindustry.maps.missions.Mission;
import io.anuke.mindustry.maps.missions.VictoryMission;
import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.type.ItemStack;
import io.anuke.ucore.util.Bits;
@@ -15,6 +16,8 @@ import static io.anuke.mindustry.Vars.control;
@Serialize
public class Sector{
private static final Mission victoryMission = new VictoryMission();
/**Position on the map, can be positive or negative.*/
public short x, y;
/**Whether this sector has already been completed.*/
@@ -52,7 +55,7 @@ public class Sector{
}
public Mission currentMission(){
return missions.get(Math.min(completedMissions, missions.size - 1));
return completedMissions >= missions.size ? victoryMission : missions.get(completedMissions);
}
public int getSeed(){

View File

@@ -20,7 +20,6 @@ import io.anuke.mindustry.world.blocks.Floor;
import io.anuke.mindustry.world.blocks.OreBlock;
import io.anuke.ucore.noise.RidgedPerlin;
import io.anuke.ucore.noise.Simplex;
import io.anuke.ucore.noise.VoronoiNoise;
import io.anuke.ucore.util.Geometry;
import io.anuke.ucore.util.Mathf;
import io.anuke.ucore.util.SeedRandom;
@@ -37,15 +36,12 @@ public class WorldGenerator{
private Simplex sim2 = new Simplex(baseSeed + 1);
private Simplex sim3 = new Simplex(baseSeed + 2);
private RidgedPerlin rid = new RidgedPerlin(baseSeed + 4, 1);
private VoronoiNoise vn = new VoronoiNoise(baseSeed + 2, (short)0);
private SeedRandom random = new SeedRandom(baseSeed + 3);
private GenResult result = new GenResult();
private ObjectMap<Block, Block> decoration;
public WorldGenerator(){
vn.setUseDistance(true);
decoration = Mathf.map(
Blocks.grass, Blocks.shrub,
Blocks.stone, Blocks.rock,

View File

@@ -0,0 +1,34 @@
package io.anuke.mindustry.maps.missions;
import io.anuke.mindustry.Vars;
import io.anuke.mindustry.game.GameMode;
import static io.anuke.mindustry.Vars.threads;
/**A mission which simply runs a single action and is completed instantly.*/
public abstract class ActionMission implements Mission{
private Runnable runner;
public ActionMission(Runnable runner){
this.runner = runner;
}
@Override
public boolean isComplete(){
if(runner != null){
threads.run(runner);
runner = null;
}
return true;
}
@Override
public String displayString(){
return "";
}
@Override
public GameMode getMode(){
return Vars.state.mode;
}
}

View File

@@ -7,15 +7,10 @@ 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.ucore.scene.ui.layout.Table;
import io.anuke.ucore.util.Bundles;
public class BattleMission implements Mission{
private final static int coreX = 60, coreY = 60;
@Override
public void display(Table table){
table.add("$text.mission.battle");
}
@Override
public GameMode getMode(){

View File

@@ -0,0 +1,49 @@
package io.anuke.mindustry.maps.missions;
import io.anuke.mindustry.game.EventType.BlockBuildEvent;
import io.anuke.mindustry.game.GameMode;
import io.anuke.mindustry.world.Block;
import io.anuke.ucore.core.Events;
import io.anuke.ucore.util.Bundles;
import static io.anuke.mindustry.Vars.defaultTeam;
import static io.anuke.mindustry.Vars.world;
/**A mission in which the player must place a block.*/
public class BlockMission implements Mission{
private final Block block;
private boolean complete;
static{
Events.on(BlockBuildEvent.class, event -> {
if(world.getSector() != null && event.team == defaultTeam){
Mission mission = world.getSector().currentMission();
if(mission instanceof BlockMission){
BlockMission block = (BlockMission)world.getSector().currentMission();
if(block.block == event.tile.block()){
block.complete = true;
}
}
}
});
}
public BlockMission(Block block){
this.block = block;
}
@Override
public boolean isComplete(){
return complete;
}
@Override
public String displayString(){
return Bundles.format("text.mission.block", block.formalName);
}
@Override
public GameMode getMode(){
return GameMode.noWaves;
}
}

View File

@@ -0,0 +1,17 @@
package io.anuke.mindustry.maps.missions;
import static io.anuke.mindustry.Vars.*;
/**An action mission which simply expands the sector.*/
public class ExpandMission extends ActionMission{
public ExpandMission(int expandX, int expandY){
super(() -> {
if(headless){
world.sectors().expandSector(world.getSector(), expandX, expandY);
}else{
ui.loadLogic(() -> world.sectors().expandSector(world.getSector(), expandX, expandY));
}
});
}
}

View File

@@ -14,7 +14,10 @@ public interface Mission{
boolean isComplete();
String displayString();
GameMode getMode();
void display(Table table);
default void display(Table table){
table.add(displayString());
}
default Array<SpawnGroup> getWaves(Sector sector){
return new Array<>();

View File

@@ -3,9 +3,12 @@ package io.anuke.mindustry.maps.missions;
import io.anuke.mindustry.Vars;
import io.anuke.mindustry.game.GameMode;
import io.anuke.mindustry.type.Item;
import io.anuke.ucore.scene.ui.layout.Table;
import io.anuke.mindustry.world.Tile;
import io.anuke.ucore.util.Bundles;
import static io.anuke.mindustry.Vars.state;
/**A mission that is completed when the player obtains items in their core.*/
public class ResourceMission implements Mission{
private final Item item;
private final int amount;
@@ -15,11 +18,6 @@ public class ResourceMission implements Mission{
this.amount = amount;
}
@Override
public void display(Table table){
}
@Override
public GameMode getMode(){
return GameMode.waves;
@@ -27,7 +25,12 @@ public class ResourceMission implements Mission{
@Override
public boolean isComplete(){
return Vars.state.teams.get(Vars.defaultTeam).cores.first().entity.items.has(item, amount);
for(Tile tile : state.teams.get(Vars.defaultTeam).cores){
if(tile.entity.items.has(item, amount)){
return true;
}
}
return false;
}
@Override

View File

@@ -0,0 +1,26 @@
package io.anuke.mindustry.maps.missions;
import io.anuke.mindustry.game.GameMode;
import io.anuke.ucore.scene.ui.layout.Table;
public class VictoryMission implements Mission{
@Override
public boolean isComplete(){
return false;
}
@Override
public String displayString(){
return "none";
}
@Override
public GameMode getMode(){
return GameMode.victory;
}
@Override
public void display(Table table){
}
}

View File

@@ -2,10 +2,12 @@ package io.anuke.mindustry.maps.missions;
import com.badlogic.gdx.math.GridPoint2;
import com.badlogic.gdx.utils.Array;
import io.anuke.mindustry.game.*;
import io.anuke.mindustry.game.GameMode;
import io.anuke.mindustry.game.SpawnGroup;
import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.game.Waves;
import io.anuke.mindustry.maps.Sector;
import io.anuke.mindustry.maps.generation.Generation;
import io.anuke.ucore.scene.ui.layout.Table;
import io.anuke.ucore.util.Bundles;
import static io.anuke.mindustry.Vars.state;
@@ -28,11 +30,6 @@ public class WaveMission implements Mission{
generateCoreAt(gen, coreX, coreY, Team.blue);
}
@Override
public void display(Table table){
table.add(Bundles.format("text.mission.wave", target));
}
@Override
public GameMode getMode(){
return GameMode.waves;