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

View File

@@ -2,7 +2,6 @@ package mindustry.core;
import arc.*;
import arc.math.*;
import arc.struct.*;
import arc.util.*;
import mindustry.annotations.Annotations.*;
import mindustry.content.*;
@@ -88,27 +87,35 @@ public class Logic implements ApplicationListener{
//when loading a 'damaged' sector, propagate the damage
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();
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
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);
}
//add resources based on turns passed
if(state.rules.sector.save != null && core != null){
//add new items recieved
state.rules.sector.calculateRecievedItems().each((item, amount) -> core.items.add(item, amount));
//update correct storage capacity
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
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);
@@ -262,15 +269,15 @@ public class Logic implements ApplicationListener{
Time.runTask(30f, () -> {
Sector origin = sector.save.meta.secinfo.origin;
if(origin != null){
Seq<ItemStack> stacks = origin.getReceivedItems();
ItemSeq stacks = origin.getExtraItems();
//add up all items into list
for(Building entity : state.teams.playerCores()){
entity.items.each((item, amount) -> ItemStack.insert(stacks, item, amount));
entity.items.each(stacks::add);
}
//save received items
origin.setReceivedItems(stacks);
origin.setExtraItems(stacks);
}
//remove all the cores

View File

@@ -17,7 +17,7 @@ import java.net.*;
import java.util.regex.*;
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",
".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.");

View File

@@ -1,13 +1,16 @@
package mindustry.type;
import arc.struct.*;
import arc.util.serialization.*;
import arc.util.serialization.Json.*;
import mindustry.*;
import mindustry.io.*;
import mindustry.world.modules.*;
import mindustry.world.modules.ItemModule.*;
import java.util.*;
public class ItemSeq implements Iterable<ItemStack>{
public class ItemSeq implements Iterable<ItemStack>, Serializable{
private final static ItemStack tmp = new ItemStack();
protected final int[] values;
@@ -19,7 +22,7 @@ public class ItemSeq implements Iterable<ItemStack>{
public void each(ItemConsumer cons){
for(int i = 0; i < values.length; i++){
if(values[i] > 0){
if(values[i] != 0){
cons.accept(Vars.content.item(i), values[i]);
}
}
@@ -28,7 +31,7 @@ public class ItemSeq implements Iterable<ItemStack>{
public Seq<ItemStack> toSeq(){
Seq<ItemStack> out = new Seq<>();
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;
}
@@ -78,6 +81,27 @@ public class ItemSeq implements Iterable<ItemStack>{
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
public Iterator<ItemStack> iterator(){
return toSeq().iterator();

View File

@@ -149,12 +149,16 @@ public class Sector{
}
//TODO this should be stored in a more efficient structure, and be updated each turn
public Seq<ItemStack> getReceivedItems(){
return Core.settings.getJson(key("received-items"), Seq.class, ItemStack.class, Seq::new);
public ItemSeq getExtraItems(){
return Core.settings.getJson(key("extra-items"), ItemSeq.class, ItemSeq::new);
}
public void setReceivedItems(Seq<ItemStack> stacks){
Core.settings.putJson(key("received-items"), ItemStack.class, stacks);
public void setExtraItems(ItemSeq 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){
@@ -163,16 +167,11 @@ public class Sector{
state.rules.defaultTeam.items().remove(item, amount);
}
}else{
Seq<ItemStack> recv = getReceivedItems();
ItemSeq recv = getExtraItems();
ItemStack fit = recv.find(i -> i.item == item);
if(fit != null){
fit.amount -= amount;
}else{
recv.add(new ItemStack(item, amount));
}
recv.remove(item, amount);
setReceivedItems(recv);
setExtraItems(recv);
}
}
@@ -188,26 +187,9 @@ public class Sector{
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;
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
for(Item item : content.items()){
@@ -221,6 +203,22 @@ public class Sector{
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
public void setSpawnPosition(int position){
put("spawn-position", position);

View File

@@ -76,7 +76,7 @@ public class ResearchDialog extends BaseDialog{
if(amount < 0){
//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;
//% that gets removed from each sector
@@ -91,6 +91,7 @@ public class ResearchDialog extends BaseDialog{
//actually remove it from the sector
sector.removeItem(item, toRemove);
seq.remove(item, 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.add(req.item.localizedName).color(Color.lightGray);
Label label = list.label(() -> " " +
(player.team().core() != null ?
UI.formatAmount(Math.min(player.team().core().items.get(req.item), reqAmount)) + " / " :
"")
UI.formatAmount(Math.min(items.get(req.item), reqAmount)) + " / "
+ UI.formatAmount(reqAmount)).get();
Color targetColor = items.has(req.item) ? Color.lightGray : Color.scarlet;

View File

@@ -61,6 +61,7 @@ public class HudFragment extends Fragment{
//TODO full implementation
Events.on(ResetEvent.class, e -> {
coreItems.resetUsed();
coreItems.clear();
});
Events.on(TurnEvent.class, e -> {
@@ -216,7 +217,7 @@ public class HudFragment extends Fragment{
//core items
parent.fill(t -> {
t.top().add(coreItems);
t.visible(() -> Core.settings.getBool("coreitems") && !mobile);
t.visible(() -> Core.settings.getBool("coreitems") && !mobile && !state.isPaused());
});
//spawner warning

View File

@@ -177,22 +177,17 @@ public class LaunchPad extends Block{
//actually launch the items upon removal
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){
ItemStack sto = dest.find(i -> i.item == stack.item);
if(sto != null){
sto.amount += stack.amount;
}else{
dest.add(stack);
}
dest.add(stack);
//update export
state.secinfo.handleItemExport(stack);
Events.fire(new LaunchItemEvent(stack));
}
state.secinfo.origin.setReceivedItems(dest);
state.secinfo.origin.setExtraItems(dest);
}
}
}

View File

@@ -134,6 +134,8 @@ public class ItemBridge extends Block{
@Override
public void playerPlaced(){
super.playerPlaced();
Tile link = findLink(tile.x, tile.y);
if(linkValid(tile, link)){
link.build.configure(tile.pos());

View File

@@ -128,12 +128,15 @@ public class OverflowGate extends Block{
@Override
public void write(Writes write){
super.write(write);
write.i(lastInput == null ? -1 : lastInput.pos());
}
@Override
public void read(Reads read, byte revision){
super.read(read, revision);
if(revision == 1){
new DirectionalItemBuffer(25).read(read);
}else if(revision == 3){