Second map polish
This commit is contained in:
@@ -32,7 +32,6 @@ public class RtsAI{
|
||||
//in order of priority??
|
||||
static final BlockFlag[] flags = {BlockFlag.generator, BlockFlag.factory, BlockFlag.core, BlockFlag.battery};
|
||||
static final ObjectFloatMap<Building> weights = new ObjectFloatMap<>();
|
||||
//TODO max squad size
|
||||
static final boolean debug = OS.hasProp("mindustry.debug");
|
||||
|
||||
final Interval timer = new Interval(10);
|
||||
|
||||
@@ -4143,10 +4143,10 @@ public class Blocks{
|
||||
//region units - erekir
|
||||
|
||||
fabricator = new UnitFactory("fabricator"){{
|
||||
requirements(Category.units, with(Items.silicon, 200, Items.beryllium, 250));
|
||||
requirements(Category.units, with(Items.silicon, 200, Items.beryllium, 200));
|
||||
size = 3;
|
||||
configurable = false;
|
||||
plans.add(new UnitPlan(UnitTypes.stell, 60f * 60f * 1f, with(Items.beryllium, 50f, Items.silicon, 60f)));
|
||||
plans.add(new UnitPlan(UnitTypes.stell, 60f * 45f * 1f, with(Items.beryllium, 50f, Items.silicon, 60f)));
|
||||
researchCost = with(Items.beryllium, 200, Items.graphite, 80, Items.silicon, 80);
|
||||
regionSuffix = "-dark";
|
||||
fogRadius = 3;
|
||||
|
||||
@@ -2,6 +2,7 @@ package mindustry.content;
|
||||
|
||||
import mindustry.game.MapObjectives.*;
|
||||
import mindustry.game.Team;
|
||||
import mindustry.graphics.*;
|
||||
import mindustry.type.*;
|
||||
|
||||
import static mindustry.content.Planets.*;
|
||||
@@ -186,12 +187,15 @@ public class SectorPresets{
|
||||
|
||||
rules = r -> {
|
||||
r.objectives.addAll(
|
||||
new TimerObjective("Enemy detection", 5 * 60 * 60).withMarkers(
|
||||
new TextMarker("The enemy will begin constructing units in 5 minutes.", 276f * 8f, 164f * 8f)
|
||||
new TimerObjective("[lightgray]Enemy detection:[] [accent]{0}", 5 * 60 * 60).withMarkers(
|
||||
new TextMarker("The enemy will begin constructing units in 5 minutes.", 276f * 8f, 164f * 8f)
|
||||
).withFlags("beginBuilding"),
|
||||
new ProduceObjective(Items.tungsten).withMarkers(
|
||||
new ShapeTextMarker("Tungsten can be mined using an [accent]impact drill[].\nThis structure requires [accent]water[] and [accent]power[].", 220f * 8f, 181f * 8f)
|
||||
),
|
||||
new DestroyBlockObjective(Blocks.largeShieldProjector, 210, 278, Team.malis).withMarkers(
|
||||
new TextMarker("The enemy is protected by shields.\nAn experimental shield breaker module has been detected in this sector.\nFind and activate it using tungsten.", 276f * 8f, 164f * 8f),
|
||||
new ShapeTextMarker("Tungsten can be mined using an [accent]impact drill[].\nIt requires water.", 220f * 8f, 181f * 8f)
|
||||
new TextMarker("The enemy is protected by shields.\nAn experimental shield breaker module has been detected in this sector.\nFind and activate it using tungsten.", 276f * 8f, 164f * 8f),
|
||||
new MinimapMarker(23f, 137f, Pal.accent)
|
||||
)
|
||||
);
|
||||
};
|
||||
|
||||
@@ -2878,7 +2878,7 @@ public class UnitTypes{
|
||||
smoothReloadSpeed = 0.15f;
|
||||
recoil = 2f;
|
||||
|
||||
bullet = new BasicBulletType(3.5f, 50){{
|
||||
bullet = new BasicBulletType(3.5f, 55){{
|
||||
backColor = trailColor = hitColor = Pal.techBlue;
|
||||
frontColor = Color.white;
|
||||
width = 7.5f;
|
||||
@@ -3323,7 +3323,7 @@ public class UnitTypes{
|
||||
shoot = new ShootHelix();
|
||||
|
||||
//TODO cooler + balancing
|
||||
bullet = new BasicBulletType(5f, 25){{
|
||||
bullet = new BasicBulletType(5f, 30){{
|
||||
width = 7f;
|
||||
height = 12f;
|
||||
lifetime = 25f;
|
||||
|
||||
@@ -211,16 +211,17 @@ public class Control implements ApplicationListener, Loadable{
|
||||
|
||||
if(state.isCampaign()){
|
||||
|
||||
//TODO add a delay for landing.
|
||||
if(state.rules.sector.planet.prebuildBase){
|
||||
float unitsPerTick = 1f;
|
||||
float buildRadius = state.rules.enemyCoreBuildRadius * 1.5f;
|
||||
|
||||
//TODO if the save is unloaded, these blocks do not get built.
|
||||
boolean anyBuilds = false;
|
||||
for(var build : state.rules.defaultTeam.data().buildings.copy()){
|
||||
if(!(build instanceof CoreBuild) && !build.block.privileged){
|
||||
var ccore = build.closestCore();
|
||||
|
||||
if(ccore != null && build.within(ccore, state.rules.enemyCoreBuildRadius)){
|
||||
if(ccore != null && build.within(ccore, buildRadius)){
|
||||
build.pickedUp();
|
||||
build.tile.remove();
|
||||
anyBuilds = true;
|
||||
@@ -242,7 +243,7 @@ public class Control implements ApplicationListener, Loadable{
|
||||
if(anyBuilds){
|
||||
for(var ccore : state.rules.defaultTeam.data().cores){
|
||||
Time.run(coreDelay, () -> {
|
||||
Fx.coreBuildShockwave.at(ccore.x, ccore.y, state.rules.enemyCoreBuildRadius);
|
||||
Fx.coreBuildShockwave.at(ccore.x, ccore.y, buildRadius);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,7 +20,7 @@ public class MapObjectives{
|
||||
public static Prov<MapObjective>[] allObjectiveTypes = new Prov[]{
|
||||
ResearchObjective::new, BuildCountObjective::new, UnitCountObjective::new, ItemObjective::new,
|
||||
CommandModeObjective::new, CoreItemObjective::new, DestroyCoreObjective::new, DestroyUnitsObjective::new,
|
||||
TimerObjective::new, FlagObjective::new, DestroyBlockObjective::new
|
||||
TimerObjective::new, FlagObjective::new, DestroyBlockObjective::new, ProduceObjective::new
|
||||
};
|
||||
|
||||
public static Prov<ObjectiveMarker>[] allMarkerTypes = new Prov[]{
|
||||
@@ -49,6 +49,28 @@ public class MapObjectives{
|
||||
}
|
||||
}
|
||||
|
||||
/** Produce a specific piece of content in the tech tree (essentially research with different text). */
|
||||
public static class ProduceObjective extends MapObjective{
|
||||
public UnlockableContent content = Items.copper;
|
||||
|
||||
public ProduceObjective(UnlockableContent content){
|
||||
this.content = content;
|
||||
}
|
||||
|
||||
public ProduceObjective(){
|
||||
}
|
||||
|
||||
@Override
|
||||
public String text(){
|
||||
return Core.bundle.format("objective.produce", content.emoji(), content.localizedName);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean complete(){
|
||||
return content.unlocked();
|
||||
}
|
||||
}
|
||||
|
||||
/** Have a certain amount of item in your core. */
|
||||
public static class ItemObjective extends MapObjective{
|
||||
public Item item = Items.copper;
|
||||
@@ -432,6 +454,12 @@ public class MapObjectives{
|
||||
this.y = y;
|
||||
}
|
||||
|
||||
public MinimapMarker(float x, float y, Color color){
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.color = color;
|
||||
}
|
||||
|
||||
public MinimapMarker(){
|
||||
}
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@ public class BlockInventoryFragment{
|
||||
private static final float holdShrink = 120f;
|
||||
|
||||
Table table = new Table();
|
||||
Building tile;
|
||||
Building build;
|
||||
float holdTime = 0f, emptyTime;
|
||||
boolean holding, held;
|
||||
float[] shrinkHoldTimes = new float[content.items().size];
|
||||
@@ -46,13 +46,14 @@ public class BlockInventoryFragment{
|
||||
}
|
||||
|
||||
public void showFor(Building t){
|
||||
if(this.tile == t){
|
||||
if(this.build == t){
|
||||
hide();
|
||||
return;
|
||||
}
|
||||
this.tile = t;
|
||||
if(tile == null || !tile.block.isAccessible() || tile.items.total() == 0)
|
||||
this.build = t;
|
||||
if(build == null || !build.block.isAccessible() || build.items == null || build.items.total() == 0){
|
||||
return;
|
||||
}
|
||||
rebuild(true);
|
||||
}
|
||||
|
||||
@@ -65,7 +66,7 @@ public class BlockInventoryFragment{
|
||||
table.update(null);
|
||||
}), Actions.visible(false));
|
||||
table.touchable = Touchable.disabled;
|
||||
tile = null;
|
||||
build = null;
|
||||
}
|
||||
|
||||
private void takeItem(int requested){
|
||||
@@ -73,12 +74,12 @@ public class BlockInventoryFragment{
|
||||
int amount = Math.min(requested, player.unit().maxAccepted(lastItem));
|
||||
|
||||
if(amount > 0){
|
||||
Call.requestItem(player, tile, lastItem, amount);
|
||||
Call.requestItem(player, build, lastItem, amount);
|
||||
holding = false;
|
||||
holdTime = 0f;
|
||||
held = true;
|
||||
|
||||
if(net.client()) Events.fire(new WithdrawEvent(tile, player, lastItem, amount));
|
||||
if(net.client()) Events.fire(new WithdrawEvent(build, player, lastItem, amount));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -94,10 +95,10 @@ public class BlockInventoryFragment{
|
||||
table.touchable = Touchable.enabled;
|
||||
table.update(() -> {
|
||||
|
||||
if(state.isMenu() || tile == null || !tile.isValid() || !tile.block.isAccessible() || emptyTime >= holdShrink){
|
||||
if(state.isMenu() || build == null || !build.isValid() || !build.block.isAccessible() || emptyTime >= holdShrink){
|
||||
hide();
|
||||
}else{
|
||||
if(tile.items.total() == 0){
|
||||
if(build.items.total() == 0){
|
||||
emptyTime += Time.delta;
|
||||
}else{
|
||||
emptyTime = 0f;
|
||||
@@ -111,12 +112,12 @@ public class BlockInventoryFragment{
|
||||
}
|
||||
|
||||
updateTablePosition();
|
||||
if(tile.block.hasItems){
|
||||
if(build.block.hasItems){
|
||||
boolean dirty = false;
|
||||
if(shrinkHoldTimes.length != content.items().size) shrinkHoldTimes = new float[content.items().size];
|
||||
|
||||
for(int i = 0; i < content.items().size; i++){
|
||||
boolean has = tile.items.has(content.item(i));
|
||||
boolean has = build.items.has(content.item(i));
|
||||
boolean had = container.contains(i);
|
||||
if(has){
|
||||
shrinkHoldTimes[i] = 0f;
|
||||
@@ -141,28 +142,28 @@ public class BlockInventoryFragment{
|
||||
table.margin(4f);
|
||||
table.defaults().size(8 * 5).pad(4f);
|
||||
|
||||
if(tile.block.hasItems){
|
||||
if(build.block.hasItems){
|
||||
|
||||
for(int i = 0; i < content.items().size; i++){
|
||||
Item item = content.item(i);
|
||||
if(!tile.items.has(item)) continue;
|
||||
if(!build.items.has(item)) continue;
|
||||
|
||||
container.add(i);
|
||||
|
||||
Boolp canPick = () -> player.unit().acceptsItem(item) && !state.isPaused() && player.within(tile, itemTransferRange);
|
||||
Boolp canPick = () -> player.unit().acceptsItem(item) && !state.isPaused() && player.within(build, itemTransferRange);
|
||||
|
||||
HandCursorListener l = new HandCursorListener();
|
||||
l.enabled = canPick;
|
||||
|
||||
Element image = itemImage(item.uiIcon, () -> {
|
||||
if(tile == null || !tile.isValid()){
|
||||
if(build == null || !build.isValid()){
|
||||
return "";
|
||||
}
|
||||
return round(tile.items.get(item));
|
||||
return round(build.items.get(item));
|
||||
});
|
||||
image.addListener(l);
|
||||
|
||||
Boolp validClick = () -> !(!canPick.get() || tile == null || !tile.isValid() || tile.items == null || !tile.items.has(item));
|
||||
Boolp validClick = () -> !(!canPick.get() || build == null || !build.isValid() || build.items == null || !build.items.has(item));
|
||||
|
||||
image.addListener(new ClickListener(){
|
||||
|
||||
@@ -182,7 +183,7 @@ public class BlockInventoryFragment{
|
||||
if(!validClick.get() || held) return;
|
||||
|
||||
//take all
|
||||
takeItem(tile.items.get(lastItem = item));
|
||||
takeItem(build.items.get(lastItem = item));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -227,7 +228,7 @@ public class BlockInventoryFragment{
|
||||
}
|
||||
|
||||
private void updateTablePosition(){
|
||||
Vec2 v = Core.input.mouseScreen(tile.x + tile.block.size * tilesize / 2f, tile.y + tile.block.size * tilesize / 2f);
|
||||
Vec2 v = Core.input.mouseScreen(build.x + build.block.size * tilesize / 2f, build.y + build.block.size * tilesize / 2f);
|
||||
table.pack();
|
||||
table.setPosition(v.x, v.y, Align.topLeft);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user