Global sector items / Mod file reading

This commit is contained in:
Anuken
2020-07-27 20:18:07 -04:00
parent 44e150638d
commit 1100803af4
12 changed files with 279 additions and 94 deletions

View File

@@ -1,23 +1,30 @@
package mindustry.ui;
import arc.graphics.*;
import arc.math.*;
import arc.scene.actions.*;
import arc.scene.ui.*;
import arc.scene.ui.layout.*;
import arc.util.ArcAnnotate.*;
import mindustry.core.*;
import mindustry.gen.*;
import mindustry.graphics.*;
import mindustry.type.*;
import static mindustry.Vars.*;
/** Displays a list of items, e.g. launched items.*/
public class ItemsDisplay extends Table{
private StringBuilder builder = new StringBuilder();
public ItemsDisplay(){
rebuild();
rebuild(new ItemSeq());
}
public void rebuild(){
public void rebuild(ItemSeq items){
rebuild(items, null);
}
public void rebuild(ItemSeq items, @Nullable boolean[] shine){
clear();
top().left();
margin(0);
@@ -31,17 +38,21 @@ public class ItemsDisplay extends Table{
t.marginRight(30f);
t.left();
for(Item item : content.items()){
if(item.unlocked()){
t.label(() -> format(item)).left();
t.image(item.icon(Cicon.small)).size(8 * 3).padLeft(4).padRight(4);
t.add(item.localizedName).color(Color.lightGray).left();
t.row();
if(!items.has(item)) continue;
Label label = t.add(UI.formatAmount(items.get(item))).left().get();
t.image(item.icon(Cicon.small)).size(8 * 3).padLeft(4).padRight(4);
t.add(item.localizedName).color(Color.lightGray).left();
t.row();
if(shine != null && shine[item.id]){
label.setColor(Pal.accent);
label.actions(Actions.color(Color.white, 0.75f, Interp.fade));
}
}
}).get().setScrollingDisabled(true, false), false).setDuration(0.3f);
c.button("$launcheditems", Icon.downOpen, Styles.clearTogglet, col::toggle).update(t -> {
t.setText(state.isMenu() ? "$launcheditems" : "$launchinfo");
c.button("$globalitems", Icon.downOpen, Styles.clearTogglet, col::toggle).update(t -> {
t.setChecked(col.isCollapsed());
((Image)t.getChildren().get(1)).setDrawable(col.isCollapsed() ? Icon.upOpen : Icon.downOpen);
}).padBottom(4).left().fillX().margin(12f).minWidth(200f);
@@ -49,15 +60,4 @@ public class ItemsDisplay extends Table{
c.add(col);
});
}
private String format(Item item){
builder.setLength(0);
builder.append("[TODO implement]");
//builder.append(UI.formatAmount(data.getItem(item)));
if(state.isGame() && player.team().data().hasCore() && player.team().core().items.get(item) > 0){
builder.append(" [unlaunched]+ ");
builder.append(UI.formatAmount(state.teams.get(player.team()).core().items.get(item)));
}
return builder.toString();
}
}

View File

@@ -11,7 +11,6 @@ import arc.scene.*;
import arc.scene.event.*;
import arc.scene.ui.*;
import arc.scene.ui.layout.*;
import arc.struct.*;
import arc.util.*;
import arc.util.ArcAnnotate.*;
import mindustry.core.*;
@@ -342,17 +341,14 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
t.left();
t.table(res -> {
ObjectIntMap<Item> map = sector.save.meta.secinfo.getCurrentItems(sector);
ItemSeq items = sector.calculateItems();
int i = 0;
for(Item item : content.items()){
int amount = Math.min(map.get(item), sector.save.meta.secinfo.storageCapacity);
if(amount > 0){
res.image(item.icon(Cicon.small)).padRight(3);
res.add(UI.formatAmount(amount)).color(Color.lightGray);
if(++i % 2 == 0){
res.row();
}
for(ItemStack stack : items){
res.image(stack.item.icon(Cicon.small)).padRight(3);
res.add(UI.formatAmount(stack.amount)).color(Color.lightGray);
if(++i % 2 == 0){
res.row();
}
}
});

View File

@@ -26,7 +26,6 @@ import mindustry.type.*;
import mindustry.ui.*;
import mindustry.ui.layout.*;
import mindustry.ui.layout.TreeLayout.*;
import mindustry.world.modules.*;
import java.util.*;
@@ -37,20 +36,69 @@ public class ResearchDialog extends BaseDialog{
private ObjectSet<TechTreeNode> nodes = new ObjectSet<>();
private TechTreeNode root = new TechTreeNode(TechTree.root, null);
private Rect bounds = new Rect();
private ItemsDisplay itemDisplay;
private View view;
private ItemSeq items;
public ResearchDialog(){
super("");
titleTable.remove();
margin(0f).marginBottom(8);
cont.add(view = new View()).grow().get();
cont.stack(view = new View(), itemDisplay = new ItemsDisplay()).grow();
shouldPause = true;
shown(() -> {
items = new ItemSeq(){
//store sector item amounts for modifications
ObjectMap<Sector, ItemSeq> cache = new ObjectMap<>();
{
//add global counts of each sector
for(Planet planet : content.planets()){
for(Sector sector : planet.sectors){
if(sector.hasSave()){
ItemSeq cached = sector.calculateItems();
add(cached);
cache.put(sector, cached);
}
}
}
}
//this is the only method that actually modifies the sequence itself.
@Override
public void add(Item item, int amount){
//only have custom removal logic for when the sequence gets items taken out of it (e.g. research)
if(amount < 0){
//remove items from each sector's storage, one by one
//% that gets removed from each sector
double percentage = (double)amount / get(item);
int[] counter = {amount};
cache.each((sector, seq) -> {
if(counter[0] == 0) return;
//amount that will be removed
int toRemove = Math.min((int)Math.ceil(percentage * seq.get(item)), counter[0]);
//actually remove it from the sector
sector.removeItem(item, toRemove);
seq.remove(item, toRemove);
counter[0] -= toRemove;
});
}
super.add(item, amount);
}
};
checkNodes(root);
treeLayout();
});
hidden(ui.planet::setup);
@@ -106,10 +154,6 @@ public class ResearchDialog extends BaseDialog{
});
}
ItemModule items(){
return state.rules.defaultTeam.items();
}
void treeLayout(){
float spacing = 20f;
LayoutNode node = new LayoutNode(root, null);
@@ -177,6 +221,8 @@ public class ResearchDialog extends BaseDialog{
l.visible = !locked;
checkNodes(l);
}
itemDisplay.rebuild(items);
}
boolean selectable(TechNode node){
@@ -320,29 +366,30 @@ public class ResearchDialog extends BaseDialog{
panY = ry - bounds.y - oy;
}
boolean canUnlock(TechNode node){
return items().has(node.requirements) && selectable(node);
}
boolean canSpend(TechNode node){
//can spend when there's at least 1 item that can be spent
return selectable(node) && (node.requirements.length == 0 || Structs.contains(node.requirements, i -> items().has(i.item)));
return selectable(node) && (node.requirements.length == 0 || Structs.contains(node.requirements, i -> items.has(i.item)));
}
void spend(TechNode node){
boolean complete = true;
boolean[] shine = new boolean[node.requirements.length];
boolean[] usedShine = new boolean[content.items().size];
for(int i = 0; i < node.requirements.length; i++){
ItemStack req = node.requirements[i];
ItemStack completed = node.finishedRequirements[i];
//amount actually taken from inventory
int used = Math.min(req.amount - completed.amount, items().get(req.item));
int used = Math.min(req.amount - completed.amount, items.get(req.item));
items.remove(req.item, used);
completed.amount += used;
if(used > 0) shine[i] = true;
if(used > 0){
shine[i] = true;
usedShine[req.item.id] = true;
}
//disable completion if the completed amount has not reached requirements
if(completed.amount < req.amount){
@@ -356,11 +403,11 @@ public class ResearchDialog extends BaseDialog{
node.save();
rebuild(shine);
itemDisplay.rebuild(items, usedShine);
}
void unlock(TechNode node){
node.content.unlock();
items().remove(node.requirements);
showToast(Core.bundle.format("researched", node.content.localizedName));
checkNodes(root);
hoverNode = null;
@@ -462,7 +509,7 @@ public class ResearchDialog extends BaseDialog{
"")
+ UI.formatAmount(reqAmount)).get();
Color targetColor = items().has(req.item) ? Color.lightGray : Color.scarlet;
Color targetColor = items.has(req.item) ? Color.lightGray : Color.scarlet;
if(shiny){
label.setColor(Pal.accent);

View File

@@ -573,11 +573,14 @@ public class HudFragment extends Fragment{
dialog.show();
}
//TODO launching is disabled, possibly forever
private boolean inLaunchWave(){
return false;
/*
return state.hasSector() &&
state.getSector().metCondition() &&
!net.client() &&
state.wave % state.getSector().launchPeriod == 0 && !spawner.isSpawning();
state.wave % state.getSector().launchPeriod == 0 && !spawner.isSpawning();*/
}
private boolean canLaunch(){