campaign progress

This commit is contained in:
Anuken 2020-10-01 11:19:42 -04:00
parent 4264b960cd
commit 085bc2ee9c
9 changed files with 65 additions and 79 deletions

View File

@ -87,8 +87,8 @@ public class BuilderAI extends AIController{
}
//find new request
if(!unit.team().data().blocks.isEmpty() && following == null && timer.get(timerTarget3, 60 * 2f)){
Queue<BlockPlan> blocks = unit.team().data().blocks;
if(!unit.team.data().blocks.isEmpty() && following == null && timer.get(timerTarget3, 60 * 2f)){
Queue<BlockPlan> blocks = unit.team.data().blocks;
BlockPlan block = blocks.first();
//check if it's already been placed

View File

@ -1580,13 +1580,13 @@ public class Blocks implements ContentList{
requirements(Category.turret, with(Items.silicon, 130, Items.thorium, 80, Items.phasefabric, 40));
health = 250 * size * size;
range = 140f;
range = 160f;
hasPower = true;
consumes.powerCond(8f, (PointDefenseBuild b) -> b.target != null);
size = 2;
shootLength = 5f;
bulletDamage = 25f;
reloadTime = 10f;
reloadTime = 9f;
}};
tsunami = new LiquidTurret("tsunami"){{
@ -1701,7 +1701,7 @@ public class Blocks implements ContentList{
trailEffect = Fx.instTrail;
despawnEffect = Fx.instBomb;
trailSpacing = 20f;
damage = 1250;
damage = 1350;
tileDamageMultiplier = 0.5f;
speed = brange;
hitShake = 6f;

View File

@ -24,7 +24,7 @@ public class SectorInfo{
/** Export statistics. */
public ObjectMap<Item, ExportStat> export = new ObjectMap<>();
/** Items stored in all cores. */
public ObjectIntMap<Item> coreItems = new ObjectIntMap<>();
public ItemSeq coreItems = new ItemSeq();
/** The best available core type. */
public Block bestCoreType = Blocks.air;
/** Max storage capacity. */
@ -80,7 +80,7 @@ public class SectorInfo{
if(entity != null){
ItemModule items = entity.items;
for(int i = 0; i < items.length(); i++){
coreItems.put(content.item(i), items.get(i));
coreItems.set(content.item(i), items.get(i));
}
}
@ -88,7 +88,7 @@ public class SectorInfo{
bestCoreType = !hasCore ? Blocks.air : state.rules.defaultTeam.cores().max(e -> e.block.size).block;
storageCapacity = entity != null ? entity.storageCapacity : 0;
//update sector's internal time spent counter1
//update sector's internal time spent counter
state.rules.sector.setTimeSpent(internalTimeSpent);
}
@ -100,6 +100,12 @@ public class SectorInfo{
internalTimeSpent += Time.delta;
//autorun turns
if(internalTimeSpent >= turnDuration){
internalTimeSpent = 0;
universe.runTurn();
}
//create last stored core items
if(lastCoreItems == null){
lastCoreItems = new int[content.items().size];

View File

@ -5,7 +5,6 @@ import arc.math.*;
import arc.struct.*;
import arc.util.*;
import mindustry.content.*;
import mindustry.core.GameState.*;
import mindustry.game.EventType.*;
import mindustry.type.*;
import mindustry.world.blocks.storage.*;
@ -54,25 +53,9 @@ public class Universe{
}
}
public void displayTimeEnd(){
if(!headless){
//check if any sectors are under attack to display this
Seq<Sector> attacked = state.getSector().planet.sectors.select(s -> s.hasWaves() && s.hasBase() && !s.isBeingPlayed() && s.getSecondsPassed() > 1);
if(attacked.any()){
state.set(State.paused);
//TODO localize
String text = attacked.size > 1 ? attacked.size + " sectors attacked." : "Sector " + attacked.first().id + " under attack.";
ui.hudfrag.sectorText = text;
ui.hudfrag.attackedSectors = attacked;
ui.announce(text);
}else{
//autorun next turn
universe.runTurn();
}
}
/** @return sectors attacked on the current planet, minus the ones that are being played on right now. */
public Seq<Sector> getAttacked(Planet planet){
return planet.sectors.select(s -> s.hasWaves() && s.hasBase() && !s.isBeingPlayed() && s.getSecondsPassed() > 1);
}
/** Update planet rotations, global time and relevant state. */

View File

@ -98,8 +98,10 @@ public class ItemSeq implements Iterable<ItemStack>, Serializable{
@Override
public void read(Json json, JsonValue jsonData){
total = 0;
for(Item item : Vars.content.items()){
values[item.id] = jsonData.getInt(item.name, 0);
total += values[item.id];
}
}

View File

@ -3,7 +3,6 @@ package mindustry.type;
import arc.*;
import arc.func.*;
import arc.math.geom.*;
import arc.struct.ObjectIntMap.*;
import arc.struct.*;
import arc.util.ArcAnnotate.*;
import arc.util.*;
@ -152,6 +151,26 @@ public class Sector{
}else{
ItemSeq recv = getExtraItems();
if(save != null){
//"shave off" extra items
ItemSeq count = new ItemSeq();
//add items already present
count.add(save.meta.secinfo.coreItems);
count.add(calculateReceivedItems());
int capacity = save.meta.secinfo.storageCapacity;
//when over capacity, add that to the extra items
count.each((i, a) -> {
if(a > capacity){
recv.remove(i, (a - capacity));
}
});
}
recv.remove(item, amount);
setExtraItems(recv);
@ -166,21 +185,19 @@ public class Sector{
count.add(state.rules.defaultTeam.items());
}else if(save != null){
//add items already present
for(Entry<Item> ent : save.meta.secinfo.coreItems){
count.add(ent.key, ent.value);
}
count.add(save.meta.secinfo.coreItems);
count.add(calculateReceivedItems());
int capacity = save.meta.secinfo.storageCapacity;
//validation
for(Item item : content.items()){
count.each((item, amount) -> {
//ensure positive items
if(count.get(item) < 0) count.set(item, 0);
if(amount < 0) count.set(item, 0);
//cap the items
if(count.get(item) > capacity) count.set(item, capacity);
}
if(amount > capacity) count.set(item, capacity);
});
}
return count;
@ -196,7 +213,7 @@ public class Sector{
save.meta.secinfo.production.each((item, stat) -> count.add(item, (int)(stat.mean * seconds)));
//add received items
getExtraItems().each(count::add);
count.add(getExtraItems());
}
return count;
@ -244,14 +261,14 @@ public class Sector{
return Core.settings.getFloat(key("time-spent"));
}
public void setSecondsPassed(long number){
put("seconds-passed", number);
public void setSecondsPassed(int number){
put("secondsi-passed", number);
}
/** @return how much time has passed in this sector without the player resuming here.
* Used for resource production calculations. */
public long getSecondsPassed(){
return Core.settings.getLong(key("seconds-passed"));
public int getSecondsPassed(){
return Core.settings.getInt(key("secondsi-passed"));
}
private String key(String key){

View File

@ -381,7 +381,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
}
//stored resources
if(sector.hasBase() && sector.save.meta.secinfo.coreItems.size > 0){
if(sector.hasBase() && sector.save.meta.secinfo.coreItems.total > 0){
stable.add("@sectors.stored").row();
stable.table(t -> {
t.left();

View File

@ -33,10 +33,6 @@ public class HudFragment extends Fragment{
public final PlacementFragment blockfrag = new PlacementFragment();
//TODO localize
public String sectorText = "Out of sector time.";
public Seq<Sector> attackedSectors = new Seq<>();
private ImageButton flip;
private Table lastUnlockTable;
private Table lastUnlockLayout;
@ -68,6 +64,20 @@ public class HudFragment extends Fragment{
coreItems.clear();
});
Events.on(TurnEvent.class, e -> {
Seq<Sector> attacked = universe.getAttacked(state.getSector().planet);
if(attacked.any()){
//TODO localize
String text = attacked.size > 1 ? attacked.size + " sectors attacked." : "Sector " + attacked.first().id + " under attack.";
showToast(Icon.warning, text);
}
//ui.announce("[accent][[ Turn " + universe.turn() + " ]\n[scarlet]" + attackedSectors.size + "[lightgray] sector(s) attacked.");
});
//paused table
parent.fill(t -> {
t.top().visible(() -> state.isPaused()).touchable = Touchable.disabled;
@ -273,37 +283,6 @@ public class HudFragment extends Fragment{
.update(label -> label.color.set(Color.orange).lerp(Color.scarlet, Mathf.absin(Time.time(), 2f, 1f)))).touchable(Touchable.disabled);
});
//paused table for when the player is out of time
parent.fill(t -> {
t.top().visible(() -> false);
t.table(Styles.black5, top -> {
//TODO localize
top.add(sectorText).style(Styles.outlineLabel).color(Pal.accent).update(l -> {
l.color.a = Mathf.absin(Time.globalTime(), 7f, 1f);
l.setText(sectorText);
}).colspan(2);
top.row();
top.defaults().pad(2).size(150f, 54f);
//TODO localize
top.button("Skip", () -> {
universe.runTurn();
state.set(State.playing);
//announce turn info only when something is skipped.
ui.announce("[accent][[ Turn " + universe.turn() + " ]\n[scarlet]" + attackedSectors.size + "[lightgray] sector(s) attacked.");
});
//TODO localize
top.button("Switch Sectors", () -> {
ui.paused.runExitSave();
//switch to first attacked sector
control.playSector(attackedSectors.first());
}).disabled(b -> attackedSectors.isEmpty());
}).margin(8).growX();
});
//tutorial text
parent.fill(t -> {
Runnable resize = () -> {

View File

@ -13,8 +13,7 @@ import mindustry.world.meta.values.*;
import static mindustry.Vars.*;
public class ConsumeItemFilter extends Consume{
public final @NonNull
Boolf<Item> filter;
public final @NonNull Boolf<Item> filter;
public ConsumeItemFilter(Boolf<Item> item){
this.filter = item;