This commit is contained in:
Anuken
2020-07-30 14:24:23 -04:00
parent b46a8263ba
commit 99fafc47f2
9 changed files with 88 additions and 59 deletions
+19 -12
View File
@@ -2,7 +2,6 @@ package mindustry.core;
import arc.*; import arc.*;
import arc.math.*; import arc.math.*;
import arc.struct.*;
import arc.util.*; import arc.util.*;
import mindustry.annotations.Annotations.*; import mindustry.annotations.Annotations.*;
import mindustry.content.*; import mindustry.content.*;
@@ -88,27 +87,35 @@ public class Logic implements ApplicationListener{
//when loading a 'damaged' sector, propagate the damage //when loading a 'damaged' sector, propagate the damage
Events.on(WorldLoadEvent.class, e -> { Events.on(WorldLoadEvent.class, e -> {
if(state.isCampaign() && state.rules.sector.getSecondsPassed() > 0 && state.rules.sector.hasBase()){ if(state.isCampaign()){
long seconds = state.rules.sector.getSecondsPassed(); long seconds = state.rules.sector.getSecondsPassed();
CoreEntity core = state.rules.defaultTeam.core(); CoreEntity core = state.rules.defaultTeam.core();
//update correct storage capacity
state.rules.sector.save.meta.secinfo.storageCapacity = core.storageCapacity;
//apply fractional damage based on how many turns have passed for this sector //apply fractional damage based on how many turns have passed for this sector
float turnsPassed = seconds / (turnDuration / 60f); float turnsPassed = seconds / (turnDuration / 60f);
if(state.rules.sector.hasWaves()){ if(state.rules.sector.hasWaves() && turnsPassed > 0 && state.rules.sector.hasBase()){
SectorDamage.apply(turnsPassed / sectorDestructionTurns); SectorDamage.apply(turnsPassed / sectorDestructionTurns);
} }
//add resources based on turns passed //add resources based on turns passed
if(state.rules.sector.save != null && core != null){ if(state.rules.sector.save != null && core != null){
//add new items recieved //update correct storage capacity
state.rules.sector.calculateRecievedItems().each((item, amount) -> core.items.add(item, amount)); state.rules.sector.save.meta.secinfo.storageCapacity = core.storageCapacity;
//add new items received
state.rules.sector.calculateReceivedItems().each((item, amount) -> core.items.add(item, amount));
//clear received items //clear received items
state.rules.sector.setReceivedItems(new Seq<>()); state.rules.sector.setExtraItems(new ItemSeq());
//validation
for(Item item : content.items()){
//ensure positive items
if(core.items.get(item) < 0) core.items.set(item, 0);
//cap the items
if(core.items.get(item) > core.storageCapacity) core.items.set(item, core.storageCapacity);
}
} }
state.rules.sector.setSecondsPassed(0); state.rules.sector.setSecondsPassed(0);
@@ -262,15 +269,15 @@ public class Logic implements ApplicationListener{
Time.runTask(30f, () -> { Time.runTask(30f, () -> {
Sector origin = sector.save.meta.secinfo.origin; Sector origin = sector.save.meta.secinfo.origin;
if(origin != null){ if(origin != null){
Seq<ItemStack> stacks = origin.getReceivedItems(); ItemSeq stacks = origin.getExtraItems();
//add up all items into list //add up all items into list
for(Building entity : state.teams.playerCores()){ for(Building entity : state.teams.playerCores()){
entity.items.each((item, amount) -> ItemStack.insert(stacks, item, amount)); entity.items.each(stacks::add);
} }
//save received items //save received items
origin.setReceivedItems(stacks); origin.setExtraItems(stacks);
} }
//remove all the cores //remove all the cores
+1 -1
View File
@@ -17,7 +17,7 @@ import java.net.*;
import java.util.regex.*; import java.util.regex.*;
public class Scripts implements Disposable{ public class Scripts implements Disposable{
private final Seq<String> blacklist = Seq.with("net", "files", "reflect", "javax", "rhino", "file", "channels", "jdk", private final Seq<String> blacklist = Seq.with(".net.", "java.net", "files", "reflect", "javax", "rhino", "file", "channels", "jdk",
"runtime", "util.os", "rmi", "security", "org.", "sun.", "beans", "sql", "http", "exec", "compiler", "process", "system", "runtime", "util.os", "rmi", "security", "org.", "sun.", "beans", "sql", "http", "exec", "compiler", "process", "system",
".awt", "socket", "classloader", "oracle", "invoke", "java.util.function", "java.util.stream"); ".awt", "socket", "classloader", "oracle", "invoke", "java.util.function", "java.util.stream");
private final Seq<String> whitelist = Seq.with("mindustry.net", "netserver", "netclient", "com.sun.proxy.$proxy", "mindustry.gen."); private final Seq<String> whitelist = Seq.with("mindustry.net", "netserver", "netclient", "com.sun.proxy.$proxy", "mindustry.gen.");
+27 -3
View File
@@ -1,13 +1,16 @@
package mindustry.type; package mindustry.type;
import arc.struct.*; import arc.struct.*;
import arc.util.serialization.*;
import arc.util.serialization.Json.*;
import mindustry.*; import mindustry.*;
import mindustry.io.*;
import mindustry.world.modules.*; import mindustry.world.modules.*;
import mindustry.world.modules.ItemModule.*; import mindustry.world.modules.ItemModule.*;
import java.util.*; import java.util.*;
public class ItemSeq implements Iterable<ItemStack>{ public class ItemSeq implements Iterable<ItemStack>, Serializable{
private final static ItemStack tmp = new ItemStack(); private final static ItemStack tmp = new ItemStack();
protected final int[] values; protected final int[] values;
@@ -19,7 +22,7 @@ public class ItemSeq implements Iterable<ItemStack>{
public void each(ItemConsumer cons){ public void each(ItemConsumer cons){
for(int i = 0; i < values.length; i++){ for(int i = 0; i < values.length; i++){
if(values[i] > 0){ if(values[i] != 0){
cons.accept(Vars.content.item(i), values[i]); cons.accept(Vars.content.item(i), values[i]);
} }
} }
@@ -28,7 +31,7 @@ public class ItemSeq implements Iterable<ItemStack>{
public Seq<ItemStack> toSeq(){ public Seq<ItemStack> toSeq(){
Seq<ItemStack> out = new Seq<>(); Seq<ItemStack> out = new Seq<>();
for(int i = 0; i < values.length; i++){ for(int i = 0; i < values.length; i++){
if(values[i] > 0) out.add(new ItemStack(Vars.content.item(i), values[i])); if(values[i] != 0) out.add(new ItemStack(Vars.content.item(i), values[i]));
} }
return out; return out;
} }
@@ -78,6 +81,27 @@ public class ItemSeq implements Iterable<ItemStack>{
add(item, -amount); add(item, -amount);
} }
@Override
public void write(Json json){
for(Item item : Vars.content.items()){
if(values[item.id] != 0){
json.writeValue(item.name, values[item.id]);
}
}
}
@Override
public void read(Json json, JsonValue jsonData){
for(Item item : Vars.content.items()){
values[item.id] = jsonData.getInt(item.name, 0);
}
}
@Override
public String toString(){
return JsonIO.write(this);
}
@Override @Override
public Iterator<ItemStack> iterator(){ public Iterator<ItemStack> iterator(){
return toSeq().iterator(); return toSeq().iterator();
+28 -30
View File
@@ -149,12 +149,16 @@ public class Sector{
} }
//TODO this should be stored in a more efficient structure, and be updated each turn //TODO this should be stored in a more efficient structure, and be updated each turn
public Seq<ItemStack> getReceivedItems(){ public ItemSeq getExtraItems(){
return Core.settings.getJson(key("received-items"), Seq.class, ItemStack.class, Seq::new); return Core.settings.getJson(key("extra-items"), ItemSeq.class, ItemSeq::new);
} }
public void setReceivedItems(Seq<ItemStack> stacks){ public void setExtraItems(ItemSeq stacks){
Core.settings.putJson(key("received-items"), ItemStack.class, stacks); Core.settings.putJson(key("extra-items"), stacks);
}
public void addItem(Item item, int amount){
removeItem(item, -amount);
} }
public void removeItem(Item item, int amount){ public void removeItem(Item item, int amount){
@@ -163,16 +167,11 @@ public class Sector{
state.rules.defaultTeam.items().remove(item, amount); state.rules.defaultTeam.items().remove(item, amount);
} }
}else{ }else{
Seq<ItemStack> recv = getReceivedItems(); ItemSeq recv = getExtraItems();
ItemStack fit = recv.find(i -> i.item == item); recv.remove(item, amount);
if(fit != null){
fit.amount -= amount;
}else{
recv.add(new ItemStack(item, amount));
}
setReceivedItems(recv); setExtraItems(recv);
} }
} }
@@ -188,26 +187,9 @@ public class Sector{
count.add(ent.key, ent.value); count.add(ent.key, ent.value);
} }
count.add(calculateRecievedItems()); count.add(calculateReceivedItems());
}
return count;
}
public ItemSeq calculateRecievedItems(){
ItemSeq count = new ItemSeq();
if(save != null){
int capacity = save.meta.secinfo.storageCapacity; int capacity = save.meta.secinfo.storageCapacity;
long seconds = getSecondsPassed();
//add produced items
save.meta.secinfo.production.each((item, stat) -> {
count.add(item, (int)(stat.mean * seconds));
});
//add received items
getReceivedItems().each(stack -> count.add(stack.item, stack.amount));
//validation //validation
for(Item item : content.items()){ for(Item item : content.items()){
@@ -221,6 +203,22 @@ public class Sector{
return count; return count;
} }
public ItemSeq calculateReceivedItems(){
ItemSeq count = new ItemSeq();
if(save != null){
long seconds = getSecondsPassed();
//add produced items
save.meta.secinfo.production.each((item, stat) -> count.add(item, (int)(stat.mean * seconds)));
//add received items
getExtraItems().each(count::add);
}
return count;
}
//TODO these methods should maybe move somewhere else and/or be contained in a data object //TODO these methods should maybe move somewhere else and/or be contained in a data object
public void setSpawnPosition(int position){ public void setSpawnPosition(int position){
put("spawn-position", position); put("spawn-position", position);
@@ -76,7 +76,7 @@ public class ResearchDialog extends BaseDialog{
if(amount < 0){ if(amount < 0){
//remove items from each sector's storage, one by one //remove items from each sector's storage, one by one
//negate amount since it's being *removed* //negate amount since it's being *removed* - this makes it positive
amount = -amount; amount = -amount;
//% that gets removed from each sector //% that gets removed from each sector
@@ -91,6 +91,7 @@ public class ResearchDialog extends BaseDialog{
//actually remove it from the sector //actually remove it from the sector
sector.removeItem(item, toRemove); sector.removeItem(item, toRemove);
seq.remove(item, toRemove); seq.remove(item, toRemove);
counter[0] -= toRemove; counter[0] -= toRemove;
}); });
@@ -513,9 +514,7 @@ public class ResearchDialog extends BaseDialog{
list.image(req.item.icon(Cicon.small)).size(8 * 3).padRight(3); list.image(req.item.icon(Cicon.small)).size(8 * 3).padRight(3);
list.add(req.item.localizedName).color(Color.lightGray); list.add(req.item.localizedName).color(Color.lightGray);
Label label = list.label(() -> " " + Label label = list.label(() -> " " +
(player.team().core() != null ? UI.formatAmount(Math.min(items.get(req.item), reqAmount)) + " / "
UI.formatAmount(Math.min(player.team().core().items.get(req.item), reqAmount)) + " / " :
"")
+ UI.formatAmount(reqAmount)).get(); + UI.formatAmount(reqAmount)).get();
Color targetColor = items.has(req.item) ? Color.lightGray : Color.scarlet; Color targetColor = items.has(req.item) ? Color.lightGray : Color.scarlet;
@@ -61,6 +61,7 @@ public class HudFragment extends Fragment{
//TODO full implementation //TODO full implementation
Events.on(ResetEvent.class, e -> { Events.on(ResetEvent.class, e -> {
coreItems.resetUsed(); coreItems.resetUsed();
coreItems.clear();
}); });
Events.on(TurnEvent.class, e -> { Events.on(TurnEvent.class, e -> {
@@ -216,7 +217,7 @@ public class HudFragment extends Fragment{
//core items //core items
parent.fill(t -> { parent.fill(t -> {
t.top().add(coreItems); t.top().add(coreItems);
t.visible(() -> Core.settings.getBool("coreitems") && !mobile); t.visible(() -> Core.settings.getBool("coreitems") && !mobile && !state.isPaused());
}); });
//spawner warning //spawner warning
@@ -177,22 +177,17 @@ public class LaunchPad extends Block{
//actually launch the items upon removal //actually launch the items upon removal
if(team() == state.rules.defaultTeam && state.secinfo.origin != null){ if(team() == state.rules.defaultTeam && state.secinfo.origin != null){
Seq<ItemStack> dest = state.secinfo.origin.getReceivedItems(); ItemSeq dest = state.secinfo.origin.getExtraItems();
for(ItemStack stack : stacks){ for(ItemStack stack : stacks){
ItemStack sto = dest.find(i -> i.item == stack.item); dest.add(stack);
if(sto != null){
sto.amount += stack.amount;
}else{
dest.add(stack);
}
//update export //update export
state.secinfo.handleItemExport(stack); state.secinfo.handleItemExport(stack);
Events.fire(new LaunchItemEvent(stack)); Events.fire(new LaunchItemEvent(stack));
} }
state.secinfo.origin.setReceivedItems(dest); state.secinfo.origin.setExtraItems(dest);
} }
} }
} }
@@ -134,6 +134,8 @@ public class ItemBridge extends Block{
@Override @Override
public void playerPlaced(){ public void playerPlaced(){
super.playerPlaced();
Tile link = findLink(tile.x, tile.y); Tile link = findLink(tile.x, tile.y);
if(linkValid(tile, link)){ if(linkValid(tile, link)){
link.build.configure(tile.pos()); link.build.configure(tile.pos());
@@ -128,12 +128,15 @@ public class OverflowGate extends Block{
@Override @Override
public void write(Writes write){ public void write(Writes write){
super.write(write);
write.i(lastInput == null ? -1 : lastInput.pos()); write.i(lastInput == null ? -1 : lastInput.pos());
} }
@Override @Override
public void read(Reads read, byte revision){ public void read(Reads read, byte revision){
super.read(read, revision); super.read(read, revision);
if(revision == 1){ if(revision == 1){
new DirectionalItemBuffer(25).read(read); new DirectionalItemBuffer(25).read(read);
}else if(revision == 3){ }else if(revision == 3){