More research tweaks / Balancing
This commit is contained in:
@@ -1717,7 +1717,7 @@ public class Blocks implements ContentList{
|
|||||||
}};
|
}};
|
||||||
|
|
||||||
additiveReconstructor = new Reconstructor("additive-reconstructor"){{
|
additiveReconstructor = new Reconstructor("additive-reconstructor"){{
|
||||||
requirements(Category.units, with(Items.copper, 50, Items.lead, 120, Items.silicon, 230));
|
requirements(Category.units, with(Items.copper, 200, Items.lead, 120, Items.silicon, 90));
|
||||||
|
|
||||||
size = 3;
|
size = 3;
|
||||||
consumes.power(3f);
|
consumes.power(3f);
|
||||||
@@ -1736,7 +1736,7 @@ public class Blocks implements ContentList{
|
|||||||
}};
|
}};
|
||||||
|
|
||||||
multiplicativeReconstructor = new Reconstructor("multiplicative-reconstructor"){{
|
multiplicativeReconstructor = new Reconstructor("multiplicative-reconstructor"){{
|
||||||
requirements(Category.units, with(Items.copper, 50, Items.lead, 120, Items.silicon, 230));
|
requirements(Category.units, with(Items.lead, 650, Items.silicon, 350, Items.titanium, 350, Items.thorium, 650));
|
||||||
|
|
||||||
size = 5;
|
size = 5;
|
||||||
consumes.power(6f);
|
consumes.power(6f);
|
||||||
@@ -1755,7 +1755,7 @@ public class Blocks implements ContentList{
|
|||||||
}};
|
}};
|
||||||
|
|
||||||
exponentialReconstructor = new Reconstructor("exponential-reconstructor"){{
|
exponentialReconstructor = new Reconstructor("exponential-reconstructor"){{
|
||||||
requirements(Category.units, with(Items.copper, 50, Items.lead, 120, Items.silicon, 230));
|
requirements(Category.units, with(Items.lead, 2000, Items.silicon, 750, Items.titanium, 950, Items.thorium, 450, Items.plastanium, 350, Items.phasefabric, 250));
|
||||||
|
|
||||||
size = 7;
|
size = 7;
|
||||||
consumes.power(12f);
|
consumes.power(12f);
|
||||||
@@ -1771,7 +1771,7 @@ public class Blocks implements ContentList{
|
|||||||
}};
|
}};
|
||||||
|
|
||||||
tetrativeReconstructor = new Reconstructor("tetrative-reconstructor"){{
|
tetrativeReconstructor = new Reconstructor("tetrative-reconstructor"){{
|
||||||
requirements(Category.units, with(Items.copper, 50, Items.lead, 120, Items.silicon, 230));
|
requirements(Category.units, with(Items.lead, 4000, Items.silicon, 1500, Items.thorium, 500, Items.plastanium, 50, Items.phasefabric, 600, Items.surgealloy, 500));
|
||||||
|
|
||||||
size = 9;
|
size = 9;
|
||||||
consumes.power(25f);
|
consumes.power(25f);
|
||||||
|
|||||||
@@ -20,9 +20,7 @@ public class TechTree implements ContentList{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void load(){
|
public void load(){
|
||||||
TechNode.context = null;
|
setup();
|
||||||
map = new ObjectMap<>();
|
|
||||||
all = new Seq<>();
|
|
||||||
|
|
||||||
root = node(coreShard, () -> {
|
root = node(coreShard, () -> {
|
||||||
|
|
||||||
@@ -406,6 +404,12 @@ public class TechTree implements ContentList{
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void setup(){
|
||||||
|
TechNode.context = null;
|
||||||
|
map = new ObjectMap<>();
|
||||||
|
all = new Seq<>();
|
||||||
|
}
|
||||||
|
|
||||||
private static TechNode node(UnlockableContent content, Runnable children){
|
private static TechNode node(UnlockableContent content, Runnable children){
|
||||||
ItemStack[] requirements;
|
ItemStack[] requirements;
|
||||||
|
|
||||||
@@ -452,7 +456,7 @@ public class TechTree implements ContentList{
|
|||||||
/** Item requirements for this content. */
|
/** Item requirements for this content. */
|
||||||
public ItemStack[] requirements;
|
public ItemStack[] requirements;
|
||||||
/** Extra objectives needed to research this. TODO implement */
|
/** Extra objectives needed to research this. TODO implement */
|
||||||
public Objective[] objectives = {};
|
public Seq<Objective> objectives = new Seq<>();
|
||||||
/** Time required to research this content, in seconds. */
|
/** Time required to research this content, in seconds. */
|
||||||
public float time = 60;
|
public float time = 60;
|
||||||
/** Nodes that depend on this node. */
|
/** Nodes that depend on this node. */
|
||||||
@@ -471,7 +475,8 @@ public class TechTree implements ContentList{
|
|||||||
this.depth = parent == null ? 0 : parent.depth + 1;
|
this.depth = parent == null ? 0 : parent.depth + 1;
|
||||||
this.progress = Core.settings == null ? 0 : Core.settings.getFloat("research-" + content.name, 0f);
|
this.progress = Core.settings == null ? 0 : Core.settings.getFloat("research-" + content.name, 0f);
|
||||||
|
|
||||||
objectives = Seq.with(requirements).select(i -> !i.item.alwaysUnlocked).map(i -> new Research(i.item)).toArray(Objective.class);
|
//add dependencies as objectives.
|
||||||
|
content.getDependencies(d -> objectives.add(new Research(d)));
|
||||||
|
|
||||||
map.put(content, this);
|
map.put(content, this);
|
||||||
context = this;
|
context = this;
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package mindustry.ctype;
|
package mindustry.ctype;
|
||||||
|
|
||||||
import arc.*;
|
import arc.*;
|
||||||
|
import arc.func.*;
|
||||||
import arc.graphics.g2d.*;
|
import arc.graphics.g2d.*;
|
||||||
import arc.scene.ui.layout.*;
|
import arc.scene.ui.layout.*;
|
||||||
import arc.util.ArcAnnotate.*;
|
import arc.util.ArcAnnotate.*;
|
||||||
@@ -59,6 +60,12 @@ public abstract class UnlockableContent extends MappableContent{
|
|||||||
return cicons[icon.ordinal()];
|
return cicons[icon.ordinal()];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Iterates through any implicit dependencies of this content.
|
||||||
|
* For blocks, this would be the items required to build it. */
|
||||||
|
public void getDependencies(Cons<UnlockableContent> cons){
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/** This should show all necessary info about this content in the specified table. */
|
/** This should show all necessary info about this content in the specified table. */
|
||||||
public abstract void displayInfo(Table table);
|
public abstract void displayInfo(Table table);
|
||||||
|
|
||||||
|
|||||||
@@ -24,8 +24,10 @@ import mindustry.game.*;
|
|||||||
import mindustry.gen.*;
|
import mindustry.gen.*;
|
||||||
import mindustry.graphics.*;
|
import mindustry.graphics.*;
|
||||||
import mindustry.ui.*;
|
import mindustry.ui.*;
|
||||||
|
import mindustry.world.*;
|
||||||
import mindustry.world.blocks.environment.*;
|
import mindustry.world.blocks.environment.*;
|
||||||
import mindustry.world.blocks.payloads.*;
|
import mindustry.world.blocks.payloads.*;
|
||||||
|
import mindustry.world.blocks.units.*;
|
||||||
|
|
||||||
import static mindustry.Vars.*;
|
import static mindustry.Vars.*;
|
||||||
|
|
||||||
@@ -150,6 +152,23 @@ public class UnitType extends UnlockableContent{
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void getDependencies(Cons<UnlockableContent> cons){
|
||||||
|
//units require reconstructors being researched
|
||||||
|
for(Block block : content.blocks()){
|
||||||
|
if(block instanceof Reconstructor){
|
||||||
|
Reconstructor r = (Reconstructor)block;
|
||||||
|
for(UnitType[] recipe : r.upgrades){
|
||||||
|
//result of reconstruction is this, so it must be a dependency
|
||||||
|
if(recipe[1] == this){
|
||||||
|
cons.get(block);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void displayInfo(Table table){
|
public void displayInfo(Table table){
|
||||||
ContentDisplay.displayUnit(table, this);
|
ContentDisplay.displayUnit(table, this);
|
||||||
|
|||||||
@@ -170,12 +170,17 @@ public class ResearchDialog extends BaseDialog{
|
|||||||
void checkNodes(TechTreeNode node){
|
void checkNodes(TechTreeNode node){
|
||||||
boolean locked = locked(node.node);
|
boolean locked = locked(node.node);
|
||||||
if(!locked) node.visible = true;
|
if(!locked) node.visible = true;
|
||||||
|
node.selectable = selectable(node.node);
|
||||||
for(TechTreeNode l : node.children){
|
for(TechTreeNode l : node.children){
|
||||||
l.visible = !locked;
|
l.visible = !locked;
|
||||||
checkNodes(l);
|
checkNodes(l);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boolean selectable(TechNode node){
|
||||||
|
return !node.objectives.contains(i -> !i.complete());
|
||||||
|
}
|
||||||
|
|
||||||
void showToast(String info){
|
void showToast(String info){
|
||||||
Table table = new Table();
|
Table table = new Table();
|
||||||
table.actions(Actions.fadeOut(0.5f, Interp.fade), Actions.remove());
|
table.actions(Actions.fadeOut(0.5f, Interp.fade), Actions.remove());
|
||||||
@@ -189,7 +194,7 @@ public class ResearchDialog extends BaseDialog{
|
|||||||
}
|
}
|
||||||
|
|
||||||
boolean locked(TechNode node){
|
boolean locked(TechNode node){
|
||||||
return node.content.locked() || Structs.contains(node.requirements, i -> i.item.locked());
|
return node.content.locked();
|
||||||
}
|
}
|
||||||
|
|
||||||
class LayoutNode extends TreeNode<LayoutNode>{
|
class LayoutNode extends TreeNode<LayoutNode>{
|
||||||
@@ -207,7 +212,7 @@ public class ResearchDialog extends BaseDialog{
|
|||||||
|
|
||||||
class TechTreeNode extends TreeNode<TechTreeNode>{
|
class TechTreeNode extends TreeNode<TechTreeNode>{
|
||||||
final TechNode node;
|
final TechNode node;
|
||||||
boolean visible = true;
|
boolean visible = true, selectable = true;
|
||||||
|
|
||||||
TechTreeNode(TechNode node, TechTreeNode parent){
|
TechTreeNode(TechNode node, TechTreeNode parent){
|
||||||
this.node = node;
|
this.node = node;
|
||||||
@@ -278,10 +283,10 @@ public class ResearchDialog extends BaseDialog{
|
|||||||
button.update(() -> {
|
button.update(() -> {
|
||||||
float offset = (Core.graphics.getHeight() % 2) / 2f;
|
float offset = (Core.graphics.getHeight() % 2) / 2f;
|
||||||
button.setPosition(node.x + panX + width / 2f, node.y + panY + height / 2f + offset, Align.center);
|
button.setPosition(node.x + panX + width / 2f, node.y + panY + height / 2f + offset, Align.center);
|
||||||
button.getStyle().up = !locked(node.node) ? Tex.buttonOver : !items().has(node.node.requirements) ? Tex.buttonRed : Tex.button;
|
button.getStyle().up = !locked(node.node) ? Tex.buttonOver : selectable(node.node) && !items().has(node.node.requirements) ? Tex.buttonRed : Tex.button;
|
||||||
((TextureRegionDrawable)button.getStyle().imageUp)
|
|
||||||
.setRegion(node.visible ? node.node.content.icon(Cicon.medium) : Icon.lock.getRegion());
|
((TextureRegionDrawable)button.getStyle().imageUp).setRegion(node.selectable ? node.node.content.icon(Cicon.medium) : Icon.lock.getRegion());
|
||||||
button.getImage().setColor(!locked(node.node) ? Color.white : Color.gray);
|
button.getImage().setColor(!locked(node.node) ? Color.white : node.selectable ? Color.gray : Pal.gray);
|
||||||
});
|
});
|
||||||
addChild(button);
|
addChild(button);
|
||||||
}
|
}
|
||||||
@@ -314,7 +319,7 @@ public class ResearchDialog extends BaseDialog{
|
|||||||
}
|
}
|
||||||
|
|
||||||
boolean canUnlock(TechNode node){
|
boolean canUnlock(TechNode node){
|
||||||
return items().has(node.requirements) && !Structs.contains(node.objectives, o -> !o.complete());
|
return items().has(node.requirements) && selectable(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
void unlock(TechNode node){
|
void unlock(TechNode node){
|
||||||
@@ -353,36 +358,42 @@ public class ResearchDialog extends BaseDialog{
|
|||||||
infoTable.left();
|
infoTable.left();
|
||||||
infoTable.background(Tex.button).margin(8f);
|
infoTable.background(Tex.button).margin(8f);
|
||||||
|
|
||||||
|
boolean selectable = selectable(node);
|
||||||
|
|
||||||
infoTable.table(b -> {
|
infoTable.table(b -> {
|
||||||
b.margin(0).left().defaults().left();
|
b.margin(0).left().defaults().left();
|
||||||
|
|
||||||
b.button(Icon.info, Styles.cleari, () -> ui.content.show(node.content)).growY().width(50f);
|
if(selectable){
|
||||||
|
b.button(Icon.info, Styles.cleari, () -> ui.content.show(node.content)).growY().width(50f);
|
||||||
|
}
|
||||||
b.add().grow();
|
b.add().grow();
|
||||||
b.table(desc -> {
|
b.table(desc -> {
|
||||||
desc.left().defaults().left();
|
desc.left().defaults().left();
|
||||||
desc.add(node.content.localizedName);
|
desc.add(selectable ? node.content.localizedName : "[accent]???");
|
||||||
desc.row();
|
desc.row();
|
||||||
if(locked(node)){
|
if(locked(node)){
|
||||||
|
|
||||||
desc.table(t -> {
|
desc.table(t -> {
|
||||||
t.left();
|
t.left();
|
||||||
for(ItemStack req : node.requirements){
|
if(selectable){
|
||||||
t.table(list -> {
|
for(ItemStack req : node.requirements){
|
||||||
list.left();
|
t.table(list -> {
|
||||||
list.image(req.item.icon(Cicon.small)).size(8 * 3).padRight(3);
|
list.left();
|
||||||
list.add(req.item.localizedName).color(Color.lightGray);
|
list.image(req.item.icon(Cicon.small)).size(8 * 3).padRight(3);
|
||||||
list.label(() -> " " + (player.team().core() != null ? Math.min(player.team().core().items.get(req.item), req.amount) + " / " : "") + req.amount)
|
list.add(req.item.localizedName).color(Color.lightGray);
|
||||||
.update(l -> l.setColor(items().has(req.item, req.amount) ? Color.lightGray : Color.scarlet));//TODO
|
list.label(() -> " " + (player.team().core() != null ? Math.min(player.team().core().items.get(req.item), req.amount) + " / " : "") + req.amount)
|
||||||
}).fillX().left();
|
.update(l -> l.setColor(items().has(req.item, req.amount) ? Color.lightGray : Color.scarlet));//TODO
|
||||||
t.row();
|
}).fillX().left();
|
||||||
}
|
t.row();
|
||||||
|
}
|
||||||
//TODO test if this works
|
}else if(node.objectives.size > 0){
|
||||||
if(node.objectives.length > 0){
|
|
||||||
t.table(r -> {
|
t.table(r -> {
|
||||||
r.add("$complete").colspan(2).left();
|
r.add("$complete").colspan(2).left();
|
||||||
r.row();
|
r.row();
|
||||||
for(Objective o : node.objectives){
|
for(Objective o : node.objectives){
|
||||||
r.add(o.display()).color(Color.lightGray).left().padLeft(15f);
|
if(o.complete()) continue;
|
||||||
|
|
||||||
|
r.add("> " + o.display()).color(Color.lightGray).left();
|
||||||
r.image(o.complete() ? Icon.ok : Icon.cancel, o.complete() ? Color.lightGray : Color.scarlet).padLeft(3);
|
r.image(o.complete() ? Icon.ok : Icon.cancel, o.complete() ? Color.lightGray : Color.scarlet).padLeft(3);
|
||||||
r.row();
|
r.row();
|
||||||
}
|
}
|
||||||
@@ -403,7 +414,7 @@ public class ResearchDialog extends BaseDialog{
|
|||||||
});
|
});
|
||||||
|
|
||||||
infoTable.row();
|
infoTable.row();
|
||||||
if(node.content.description != null){
|
if(node.content.description != null && selectable){
|
||||||
infoTable.table(t -> t.margin(3f).left().labelWrap(node.content.displayDescription()).color(Color.lightGray).growX()).fillX();
|
infoTable.table(t -> t.margin(3f).left().labelWrap(node.content.displayDescription()).color(Color.lightGray).growX()).fillX();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -584,6 +584,14 @@ public class Block extends UnlockableContent{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void getDependencies(Cons<UnlockableContent> cons){
|
||||||
|
//just requires items
|
||||||
|
for(ItemStack stack : requirements){
|
||||||
|
cons.get(stack.item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void displayInfo(Table table){
|
public void displayInfo(Table table){
|
||||||
ContentDisplay.displayBlock(table, this);
|
ContentDisplay.displayBlock(table, this);
|
||||||
|
|||||||
Reference in New Issue
Block a user