Global inventory / 'Deploying' / Removed command center
This commit is contained in:
@@ -16,6 +16,7 @@ import io.anuke.mindustry.entities.effect.Fire;
|
||||
import io.anuke.mindustry.entities.effect.Puddle;
|
||||
import io.anuke.mindustry.entities.traits.SyncTrait;
|
||||
import io.anuke.mindustry.entities.units.BaseUnit;
|
||||
import io.anuke.mindustry.game.GlobalData;
|
||||
import io.anuke.mindustry.game.Team;
|
||||
import io.anuke.mindustry.game.Version;
|
||||
import io.anuke.mindustry.gen.Serialization;
|
||||
@@ -110,6 +111,7 @@ public class Vars{
|
||||
|
||||
public static ContentLoader content;
|
||||
public static GameState state;
|
||||
public static GlobalData data;
|
||||
|
||||
public static Control control;
|
||||
public static Logic logic;
|
||||
@@ -175,6 +177,7 @@ public class Vars{
|
||||
}
|
||||
|
||||
state = new GameState();
|
||||
data = new GlobalData();
|
||||
|
||||
mobile = Core.app.getType() == ApplicationType.Android || Core.app.getType() == ApplicationType.iOS || testMobile;
|
||||
ios = Core.app.getType() == ApplicationType.iOS;
|
||||
|
||||
@@ -64,7 +64,7 @@ public class Blocks implements ContentList{
|
||||
|
||||
//units
|
||||
spiritFactory, phantomFactory, wraithFactory, ghoulFactory, revenantFactory, daggerFactory, titanFactory,
|
||||
fortressFactory, reconstructor, repairPoint, commandCenter,
|
||||
fortressFactory, reconstructor, repairPoint,
|
||||
|
||||
//upgrades
|
||||
alphaPad, deltaPad, tauPad, omegaPad, dartPad, javelinPad, tridentPad, glaivePad;
|
||||
@@ -1056,10 +1056,6 @@ public class Blocks implements ContentList{
|
||||
reconstructor = new Reconstructor("reconstructor"){{
|
||||
size = 2;
|
||||
}};
|
||||
|
||||
commandCenter = new CommandCenter("command-center"){{
|
||||
size = 2;
|
||||
}};
|
||||
|
||||
//endregion
|
||||
//region upgrades
|
||||
|
||||
@@ -43,11 +43,12 @@ public class Recipes implements ContentList{
|
||||
new Recipe(effect, Blocks.container, new ItemStack(Items.titanium, 200));
|
||||
new Recipe(effect, Blocks.vault, new ItemStack(Items.titanium, 500), new ItemStack(Items.thorium, 250));
|
||||
|
||||
new Recipe(effect, Blocks.core,
|
||||
//removed; no longer fits gameplay
|
||||
/*new Recipe(effect, Blocks.core,
|
||||
new ItemStack(Items.copper, 2000), new ItemStack(Items.titanium, 2000),
|
||||
new ItemStack(Items.silicon, 1750), new ItemStack(Items.thorium, 1000),
|
||||
new ItemStack(Items.surgealloy, 500), new ItemStack(Items.phasefabric, 750)
|
||||
);
|
||||
);*/
|
||||
|
||||
//projectors
|
||||
new Recipe(effect, Blocks.mendProjector, new ItemStack(Items.lead, 200), new ItemStack(Items.titanium, 150), new ItemStack(Items.titanium, 50), new ItemStack(Items.silicon, 180));
|
||||
|
||||
@@ -20,7 +20,7 @@ import io.anuke.mindustry.entities.TileEntity;
|
||||
import io.anuke.mindustry.game.Content;
|
||||
import io.anuke.mindustry.game.EventType.*;
|
||||
import io.anuke.mindustry.game.Saves;
|
||||
import io.anuke.mindustry.game.Unlocks;
|
||||
import io.anuke.mindustry.game.GlobalData;
|
||||
import io.anuke.mindustry.gen.Call;
|
||||
import io.anuke.mindustry.input.Binding;
|
||||
import io.anuke.mindustry.input.DesktopInput;
|
||||
@@ -45,16 +45,15 @@ import static io.anuke.mindustry.Vars.*;
|
||||
*/
|
||||
public class Control implements ApplicationListener{
|
||||
public final Saves saves;
|
||||
public final Unlocks unlocks;
|
||||
|
||||
private Interval timerRPC = new Interval(), timerUnlock = new Interval();
|
||||
private Interval timerRPC = new Interval();
|
||||
private boolean hiscore = false;
|
||||
private boolean wasPaused = false;
|
||||
private InputHandler[] inputs = {};
|
||||
|
||||
public Control(){
|
||||
saves = new Saves();
|
||||
unlocks = new Unlocks();
|
||||
data = new GlobalData();
|
||||
|
||||
Core.input.setCatch(KeyCode.BACK, true);
|
||||
|
||||
@@ -70,7 +69,7 @@ public class Control implements ApplicationListener{
|
||||
"If more textures are used, the map editor will not display them correctly.");
|
||||
}
|
||||
|
||||
unlocks.load();
|
||||
data.load();
|
||||
|
||||
Core.settings.setAppName(appName);
|
||||
Core.settings.defaults(
|
||||
@@ -228,10 +227,10 @@ public class Control implements ApplicationListener{
|
||||
|
||||
if(entity == null) return;
|
||||
|
||||
entity.items.forEach((item, amount) -> unlocks.unlockContent(item));
|
||||
entity.items.forEach((item, amount) -> data.unlockContent(item));
|
||||
|
||||
if(players[0].inventory.hasItem()){
|
||||
unlocks.unlockContent(players[0].inventory.getItem().item);
|
||||
data.unlockContent(players[0].inventory.getItem().item);
|
||||
}
|
||||
|
||||
outer:
|
||||
@@ -242,7 +241,7 @@ public class Control implements ApplicationListener{
|
||||
if(!entity.items.has(stack.item, Math.min((int) (stack.amount), 2000))) continue outer;
|
||||
}
|
||||
|
||||
if(unlocks.unlockContent(recipe)){
|
||||
if(data.unlockContent(recipe)){
|
||||
ui.hudfrag.showUnlock(recipe);
|
||||
}
|
||||
}
|
||||
@@ -315,16 +314,6 @@ public class Control implements ApplicationListener{
|
||||
Platform.instance.updateRPC();
|
||||
}
|
||||
|
||||
//check unlocks every 2 seconds
|
||||
if(!state.mode.infiniteResources && timerUnlock.get(120)){
|
||||
checkUnlockableBlocks();
|
||||
|
||||
//save if the unlocks changed
|
||||
if(unlocks.isDirty()){
|
||||
unlocks.save();
|
||||
}
|
||||
}
|
||||
|
||||
if(Core.input.keyTap(Binding.pause) && !ui.restart.isShown() && (state.is(State.paused) || state.is(State.playing))){
|
||||
state.set(state.is(State.playing) ? State.paused : State.playing);
|
||||
}
|
||||
|
||||
@@ -50,7 +50,7 @@ public class Logic implements ApplicationListener{
|
||||
/**Handles the event of content being used by either the player or some block.*/
|
||||
public void handleContent(UnlockableContent content){
|
||||
if(!headless){
|
||||
control.unlocks.unlockContent(content);
|
||||
data.unlockContent(content);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -66,6 +66,7 @@ public class UI implements ApplicationListener{
|
||||
public LocalPlayerDialog localplayers;
|
||||
public UnlocksDialog unlocks;
|
||||
public ContentInfoDialog content;
|
||||
public DeployDialog deploy;
|
||||
|
||||
public Cursor drillCursor, unloadCursor;
|
||||
|
||||
@@ -175,6 +176,7 @@ public class UI implements ApplicationListener{
|
||||
maps = new MapsDialog();
|
||||
localplayers = new LocalPlayerDialog();
|
||||
content = new ContentInfoDialog();
|
||||
deploy = new DeployDialog();
|
||||
|
||||
Group group = Core.scene.root;
|
||||
|
||||
|
||||
@@ -520,7 +520,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
||||
|
||||
for(Block block : Vars.content.blocks()){
|
||||
TextureRegion[] regions = block.getCompactIcon();
|
||||
if((block.synthetic() && (Recipe.getByResult(block) == null || !control.unlocks.isUnlocked(Recipe.getByResult(block))))
|
||||
if((block.synthetic() && (Recipe.getByResult(block) == null || !data.isUnlocked(Recipe.getByResult(block))))
|
||||
&& block != Blocks.core){
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -525,7 +525,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
|
||||
return;
|
||||
}else{
|
||||
//unlock mech when used
|
||||
control.unlocks.unlockContent(mech);
|
||||
data.unlockContent(mech);
|
||||
}
|
||||
|
||||
if(mobile){
|
||||
|
||||
@@ -15,9 +15,7 @@ import java.io.DataOutput;
|
||||
import java.io.IOException;
|
||||
|
||||
import static io.anuke.mindustry.Vars.content;
|
||||
/**
|
||||
* Class for controlling status effects on an entity.
|
||||
*/
|
||||
/** Class for controlling status effects on an entity.*/
|
||||
public class StatusController implements Saveable{
|
||||
private static final StatusEntry globalResult = new StatusEntry();
|
||||
private static final Array<StatusEntry> removals = new Array<>();
|
||||
|
||||
@@ -31,7 +31,6 @@ import io.anuke.mindustry.type.ContentType;
|
||||
import io.anuke.mindustry.type.ItemStack;
|
||||
import io.anuke.mindustry.type.Weapon;
|
||||
import io.anuke.mindustry.world.Tile;
|
||||
import io.anuke.mindustry.world.blocks.units.CommandCenter.CommandCenterEntity;
|
||||
import io.anuke.mindustry.world.meta.BlockFlag;
|
||||
|
||||
import java.io.DataInput;
|
||||
@@ -100,17 +99,6 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{
|
||||
this.team = team;
|
||||
}
|
||||
|
||||
public boolean isCommanded(){
|
||||
return !isWave && world.indexer.getAllied(team, BlockFlag.comandCenter).size != 0 && world.indexer.getAllied(team, BlockFlag.comandCenter).first().entity instanceof CommandCenterEntity;
|
||||
}
|
||||
|
||||
public UnitCommand getCommand(){
|
||||
if(isCommanded()){
|
||||
return world.indexer.getAllied(team, BlockFlag.comandCenter).first().<CommandCenterEntity>entity().command;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public UnitType getType(){
|
||||
return type;
|
||||
}
|
||||
@@ -350,10 +338,6 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{
|
||||
state.set(getStartState());
|
||||
|
||||
health(maxHealth());
|
||||
|
||||
if(isCommanded()){
|
||||
onCommand(getCommand());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -29,7 +29,7 @@ public class UnitDrops{
|
||||
for(int i = 0; i < 3; i++){
|
||||
for(Item item : dropTable){
|
||||
//only drop unlocked items
|
||||
if(!Vars.headless && !Vars.control.unlocks.isUnlocked(item)){
|
||||
if(!Vars.headless && !Vars.data.isUnlocked(item)){
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,33 +1,32 @@
|
||||
package io.anuke.mindustry.game;
|
||||
|
||||
import io.anuke.arc.Core;
|
||||
import io.anuke.arc.Events;
|
||||
import io.anuke.arc.collection.ObjectIntMap;
|
||||
import io.anuke.arc.collection.ObjectMap;
|
||||
import io.anuke.arc.collection.ObjectSet;
|
||||
import io.anuke.mindustry.Vars;
|
||||
import io.anuke.mindustry.game.EventType.UnlockEvent;
|
||||
import io.anuke.mindustry.type.ContentType;
|
||||
import io.anuke.arc.Events;
|
||||
import io.anuke.arc.Settings;
|
||||
import io.anuke.mindustry.type.Item;
|
||||
|
||||
/**Stores player unlocks. Clientside only.*/
|
||||
public class Unlocks{
|
||||
public class GlobalData{
|
||||
private ObjectMap<ContentType, ObjectSet<String>> unlocked = new ObjectMap<>();
|
||||
private boolean dirty;
|
||||
private ObjectIntMap<Item> items = new ObjectIntMap<>();
|
||||
|
||||
public Unlocks(){
|
||||
public GlobalData(){
|
||||
Core.settings.setSerializer(ContentType.class, (stream, t) -> stream.writeInt(t.ordinal()), stream -> ContentType.values()[stream.readInt()]);
|
||||
Core.settings.setSerializer(Item.class, (stream, t) -> stream.writeUTF(t.name), stream -> Vars.content.getByName(ContentType.item, stream.readUTF()));
|
||||
}
|
||||
|
||||
public ObjectIntMap<Item> items(){
|
||||
return items;
|
||||
}
|
||||
|
||||
/** Returns whether or not this piece of content is unlocked yet.*/
|
||||
public boolean isUnlocked(UnlockableContent content){
|
||||
if(content.alwaysUnlocked()) return true;
|
||||
|
||||
if(!unlocked.containsKey(content.getContentType())){
|
||||
unlocked.put(content.getContentType(), new ObjectSet<>());
|
||||
}
|
||||
|
||||
ObjectSet<String> set = unlocked.get(content.getContentType());
|
||||
|
||||
return set.contains(content.getContentName());
|
||||
return content.alwaysUnlocked() || unlocked.getOr(content.getContentType(), ObjectSet::new).contains(content.getContentName());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -40,27 +39,18 @@ public class Unlocks{
|
||||
public boolean unlockContent(UnlockableContent content){
|
||||
if(!content.canBeUnlocked() || content.alwaysUnlocked()) return false;
|
||||
|
||||
if(!unlocked.containsKey(content.getContentType())){
|
||||
unlocked.put(content.getContentType(), new ObjectSet<>());
|
||||
}
|
||||
|
||||
boolean ret = unlocked.get(content.getContentType()).add(content.getContentName());
|
||||
boolean ret = unlocked.getOr(content.getContentType(), ObjectSet::new).add(content.getContentName());
|
||||
|
||||
//fire unlock event so other classes can use it
|
||||
if(ret){
|
||||
content.onUnlock();
|
||||
Events.fire(new UnlockEvent(content));
|
||||
dirty = true;
|
||||
save();
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/** Returns whether unlockables have changed since the last save.*/
|
||||
public boolean isDirty(){
|
||||
return dirty;
|
||||
}
|
||||
|
||||
/** Clears all unlocked content. Automatically saves.*/
|
||||
public void reset(){
|
||||
save();
|
||||
@@ -68,11 +58,13 @@ public class Unlocks{
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public void load(){
|
||||
unlocked = Core.settings.getObject("unlockset", ObjectMap.class, ObjectMap::new);
|
||||
unlocked = Core.settings.getObject("unlocks", ObjectMap.class, ObjectMap::new);
|
||||
items = Core.settings.getObject("items", ObjectIntMap.class, ObjectIntMap::new);
|
||||
}
|
||||
|
||||
public void save(){
|
||||
Core.settings.putObject("unlockset", unlocked);
|
||||
Core.settings.putObject("unlocks", unlocked);
|
||||
Core.settings.putObject("items", items);
|
||||
Core.settings.save();
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@ package io.anuke.mindustry.game;
|
||||
import io.anuke.arc.graphics.g2d.TextureRegion;
|
||||
import io.anuke.arc.scene.ui.layout.Table;
|
||||
|
||||
import static io.anuke.mindustry.Vars.control;
|
||||
import static io.anuke.mindustry.Vars.data;
|
||||
|
||||
/**Base interface for an unlockable content type.*/
|
||||
public abstract class UnlockableContent extends MappableContent{
|
||||
@@ -41,7 +41,7 @@ public abstract class UnlockableContent extends MappableContent{
|
||||
return true;
|
||||
}else{
|
||||
for(UnlockableContent cont : depend){
|
||||
if(!control.unlocks.isUnlocked(cont)){
|
||||
if(!data.isUnlocked(cont)){
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -143,7 +143,7 @@ public class Recipe extends UnlockableContent{
|
||||
ContentStatValue stat = (ContentStatValue) value;
|
||||
UnlockableContent[] content = stat.getValueContent();
|
||||
for(UnlockableContent c : content){
|
||||
control.unlocks.unlockContent(c);
|
||||
data.unlockContent(c);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
35
core/src/io/anuke/mindustry/ui/dialogs/DeployDialog.java
Normal file
35
core/src/io/anuke/mindustry/ui/dialogs/DeployDialog.java
Normal file
@@ -0,0 +1,35 @@
|
||||
package io.anuke.mindustry.ui.dialogs;
|
||||
|
||||
import io.anuke.arc.collection.ObjectIntMap;
|
||||
import io.anuke.arc.scene.ui.layout.Table;
|
||||
import io.anuke.mindustry.Vars;
|
||||
import io.anuke.mindustry.type.Item;
|
||||
|
||||
public class DeployDialog extends FloatingDialog{
|
||||
|
||||
public DeployDialog(){
|
||||
super("$text.play");
|
||||
|
||||
shown(this::setup);
|
||||
}
|
||||
|
||||
void setup(){
|
||||
content().clear();
|
||||
|
||||
content().stack(new Table(){{
|
||||
top().left().margin(10);
|
||||
|
||||
ObjectIntMap<Item> items = Vars.data.items();
|
||||
for(Item item : Vars.content.items()){
|
||||
if(Vars.data.isUnlocked(item)){
|
||||
add(items.get(item, 0) + "");
|
||||
addImage(item.region).size(8*3).pad(3);
|
||||
add(item.localizedName());
|
||||
row();
|
||||
}
|
||||
}
|
||||
}}, new Table(){{
|
||||
addButton("$text.play", () -> Vars.world.generator.playRandomMap()).margin(15);
|
||||
}}).grow();
|
||||
}
|
||||
}
|
||||
@@ -145,7 +145,7 @@ public class SettingsMenuDialog extends SettingsDialog{
|
||||
dialog.addCloseButton();
|
||||
dialog.content().addButton("$text.settings.clearunlocks", () -> {
|
||||
ui.showConfirm("$text.confirm", "$text.settings.clear.confirm", () -> {
|
||||
control.unlocks.reset();
|
||||
data.reset();
|
||||
dialog.hide();
|
||||
});
|
||||
});
|
||||
|
||||
@@ -13,8 +13,7 @@ import io.anuke.arc.scene.ui.Tooltip;
|
||||
import io.anuke.arc.scene.ui.layout.Table;
|
||||
import io.anuke.arc.scene.utils.UIUtils;
|
||||
|
||||
import static io.anuke.mindustry.Vars.content;
|
||||
import static io.anuke.mindustry.Vars.control;
|
||||
import static io.anuke.mindustry.Vars.*;
|
||||
|
||||
public class UnlocksDialog extends FloatingDialog{
|
||||
|
||||
@@ -59,11 +58,11 @@ public class UnlocksDialog extends FloatingDialog{
|
||||
|
||||
if(unlock.isHidden()) continue;
|
||||
|
||||
Image image = control.unlocks.isUnlocked(unlock) ? new Image(unlock.getContentIcon()) : new Image("icon-locked");
|
||||
Image image = data.isUnlocked(unlock) ? new Image(unlock.getContentIcon()) : new Image("icon-locked");
|
||||
image.addListener(new HandCursorListener());
|
||||
list.add(image).size(size).pad(3);
|
||||
|
||||
if(control.unlocks.isUnlocked(unlock)){
|
||||
if(data.isUnlocked(unlock)){
|
||||
image.clicked(() -> Vars.ui.content.show(unlock));
|
||||
image.addListener(new Tooltip<>(new Table("button"){{
|
||||
add(unlock.localizedName());
|
||||
|
||||
@@ -1,17 +1,16 @@
|
||||
package io.anuke.mindustry.ui.fragments;
|
||||
|
||||
import io.anuke.arc.Core;
|
||||
import io.anuke.arc.Events;
|
||||
import io.anuke.arc.scene.Group;
|
||||
import io.anuke.arc.scene.ui.layout.Table;
|
||||
import io.anuke.arc.util.Strings;
|
||||
import io.anuke.mindustry.core.GameState.State;
|
||||
import io.anuke.mindustry.core.Platform;
|
||||
import io.anuke.mindustry.game.EventType.ResizeEvent;
|
||||
import io.anuke.mindustry.game.Version;
|
||||
import io.anuke.mindustry.ui.MenuButton;
|
||||
import io.anuke.mindustry.ui.MobileButton;
|
||||
import io.anuke.mindustry.ui.dialogs.FloatingDialog;
|
||||
import io.anuke.arc.Events;
|
||||
import io.anuke.arc.scene.Group;
|
||||
import io.anuke.arc.scene.ui.layout.Table;
|
||||
import io.anuke.arc.util.Strings;
|
||||
|
||||
import static io.anuke.mindustry.Vars.*;
|
||||
|
||||
@@ -139,6 +138,9 @@ public class MenuFragment extends Fragment{
|
||||
}
|
||||
|
||||
private void showPlaySelect(){
|
||||
ui.deploy.show();
|
||||
|
||||
/*
|
||||
float w = 220f;
|
||||
float bw = w * 2f + 10f;
|
||||
|
||||
@@ -169,6 +171,6 @@ public class MenuFragment extends Fragment{
|
||||
dialog.hide();
|
||||
})).width(bw).colspan(2);
|
||||
|
||||
dialog.show();
|
||||
dialog.show();*/
|
||||
}
|
||||
}
|
||||
|
||||
@@ -80,7 +80,7 @@ public class PlacementFragment extends Fragment{
|
||||
if(tile != null){
|
||||
tile = tile.target();
|
||||
Recipe tryRecipe = Recipe.getByResult(tile.block());
|
||||
if(tryRecipe != null && control.unlocks.isUnlocked(tryRecipe)){
|
||||
if(tryRecipe != null && data.isUnlocked(tryRecipe)){
|
||||
input.recipe = tryRecipe;
|
||||
currentCategory = input.recipe.category;
|
||||
return true;
|
||||
@@ -91,7 +91,7 @@ public class PlacementFragment extends Fragment{
|
||||
Array<Recipe> recipes = Recipe.getByCategory(currentCategory);
|
||||
for(KeyCode key : inputGrid){
|
||||
if(Core.input.keyDown(key))
|
||||
input.recipe = (i < recipes.size && control.unlocks.isUnlocked(recipes.get(i))) ? recipes.get(i) : null;
|
||||
input.recipe = (i < recipes.size && data.isUnlocked(recipes.get(i))) ? recipes.get(i) : null;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
@@ -126,13 +126,13 @@ public class PlacementFragment extends Fragment{
|
||||
boolean[] unlocked = {false};
|
||||
|
||||
ImageButton button = blockTable.addImageButton("icon-locked", "select", 8 * 4, () -> {
|
||||
if(control.unlocks.isUnlocked(recipe)){
|
||||
if(data.isUnlocked(recipe)){
|
||||
input.recipe = input.recipe == recipe ? null : recipe;
|
||||
}
|
||||
}).size(46f).group(group).get();
|
||||
|
||||
button.update(() -> { //color unplacable things gray
|
||||
boolean ulock = control.unlocks.isUnlocked(recipe);
|
||||
boolean ulock = data.isUnlocked(recipe);
|
||||
TileEntity core = players[0].getClosestCore();
|
||||
Color color = core != null && (core.items.has(recipe.requirements) || state.mode.infiniteResources) ? Color.WHITE : ulock ? Color.GRAY : Color.WHITE;
|
||||
button.forEach(elem -> elem.setColor(color));
|
||||
@@ -176,10 +176,10 @@ public class PlacementFragment extends Fragment{
|
||||
header.left();
|
||||
header.add(new ImageStack(lastDisplay.getCompactIcon())).size(8 * 4);
|
||||
header.labelWrap(() ->
|
||||
!control.unlocks.isUnlocked(Recipe.getByResult(lastDisplay)) ? Core.bundle.get("text.blocks.unknown") : lastDisplay.formalName)
|
||||
!data.isUnlocked(Recipe.getByResult(lastDisplay)) ? Core.bundle.get("text.blocks.unknown") : lastDisplay.formalName)
|
||||
.left().width(190f).padLeft(5);
|
||||
header.add().growX();
|
||||
if(control.unlocks.isUnlocked(Recipe.getByResult(lastDisplay))){
|
||||
if(data.isUnlocked(Recipe.getByResult(lastDisplay))){
|
||||
header.addButton("?", "clear-partial", () -> ui.content.show(Recipe.getByResult(lastDisplay)))
|
||||
.size(8 * 5).padTop(-5).padRight(-5).right().grow();
|
||||
}
|
||||
|
||||
@@ -9,8 +9,7 @@ import io.anuke.arc.scene.ui.ButtonGroup;
|
||||
import io.anuke.arc.scene.ui.ImageButton;
|
||||
import io.anuke.arc.scene.ui.layout.Table;
|
||||
|
||||
import static io.anuke.mindustry.Vars.content;
|
||||
import static io.anuke.mindustry.Vars.control;
|
||||
import static io.anuke.mindustry.Vars.*;
|
||||
|
||||
public interface SelectionTrait{
|
||||
|
||||
@@ -26,7 +25,7 @@ public interface SelectionTrait{
|
||||
int i = 0;
|
||||
|
||||
for(Item item : items){
|
||||
if(!control.unlocks.isUnlocked(item)) continue;
|
||||
if(!data.isUnlocked(item)) continue;
|
||||
|
||||
ImageButton button = cont.addImageButton("white", "clear-toggle", 24, () -> {}).group(group).get();
|
||||
button.changed(() -> consumer.accept(button.isChecked() ? item : null));
|
||||
|
||||
@@ -19,8 +19,7 @@ import java.io.DataInput;
|
||||
import java.io.DataOutput;
|
||||
import java.io.IOException;
|
||||
|
||||
import static io.anuke.mindustry.Vars.content;
|
||||
import static io.anuke.mindustry.Vars.control;
|
||||
import static io.anuke.mindustry.Vars.*;
|
||||
|
||||
public class LiquidSource extends Block{
|
||||
|
||||
@@ -63,7 +62,7 @@ public class LiquidSource extends Block{
|
||||
Table cont = new Table();
|
||||
|
||||
for(int i = 0; i < items.size; i++){
|
||||
if(!control.unlocks.isUnlocked(items.get(i))) continue;
|
||||
if(!data.isUnlocked(items.get(i))) continue;
|
||||
|
||||
final int f = i;
|
||||
ImageButton button = cont.addImageButton("liquid-icon-" + items.get(i).name, "clear-toggle", 24,
|
||||
|
||||
@@ -1,132 +0,0 @@
|
||||
package io.anuke.mindustry.world.blocks.units;
|
||||
|
||||
import io.anuke.annotations.Annotations.Loc;
|
||||
import io.anuke.annotations.Annotations.Remote;
|
||||
import io.anuke.arc.Core;
|
||||
import io.anuke.arc.collection.EnumSet;
|
||||
import io.anuke.arc.collection.ObjectSet;
|
||||
import io.anuke.arc.entities.Effects;
|
||||
import io.anuke.arc.entities.Effects.Effect;
|
||||
import io.anuke.arc.graphics.Color;
|
||||
import io.anuke.arc.graphics.g2d.Draw;
|
||||
import io.anuke.arc.graphics.g2d.TextureRegion;
|
||||
import io.anuke.arc.scene.ui.ButtonGroup;
|
||||
import io.anuke.arc.scene.ui.ImageButton;
|
||||
import io.anuke.arc.scene.ui.layout.Table;
|
||||
import io.anuke.mindustry.content.Fx;
|
||||
import io.anuke.mindustry.entities.Player;
|
||||
import io.anuke.mindustry.entities.TileEntity;
|
||||
import io.anuke.mindustry.entities.units.BaseUnit;
|
||||
import io.anuke.mindustry.entities.units.UnitCommand;
|
||||
import io.anuke.mindustry.game.Team;
|
||||
import io.anuke.mindustry.gen.Call;
|
||||
import io.anuke.mindustry.graphics.Palette;
|
||||
import io.anuke.mindustry.world.Block;
|
||||
import io.anuke.mindustry.world.Tile;
|
||||
import io.anuke.mindustry.world.meta.BlockFlag;
|
||||
|
||||
import java.io.DataInput;
|
||||
import java.io.DataOutput;
|
||||
import java.io.IOException;
|
||||
|
||||
import static io.anuke.mindustry.Vars.*;
|
||||
|
||||
public class CommandCenter extends Block{
|
||||
protected TextureRegion[] commandRegions = new TextureRegion[UnitCommand.values().length];
|
||||
protected Color topColor = Palette.command;
|
||||
protected Color bottomColor = Color.valueOf("5e5e5e");
|
||||
protected Effect effect = Fx.commandSend;
|
||||
|
||||
public CommandCenter(String name){
|
||||
super(name);
|
||||
|
||||
flags = EnumSet.of(BlockFlag.comandCenter);
|
||||
destructible = true;
|
||||
solid = true;
|
||||
configurable = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void playerPlaced(Tile tile){
|
||||
ObjectSet<Tile> set = world.indexer.getAllied(tile.getTeam(), BlockFlag.comandCenter);
|
||||
|
||||
if(set.size > 0){
|
||||
CommandCenterEntity entity = tile.entity();
|
||||
CommandCenterEntity oe = set.first().entity();
|
||||
entity.command = oe.command;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void load(){
|
||||
super.load();
|
||||
|
||||
for(UnitCommand cmd : UnitCommand.values()){
|
||||
commandRegions[cmd.ordinal()] = Core.atlas.find("command-" + cmd.name());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void draw(Tile tile){
|
||||
CommandCenterEntity entity = tile.entity();
|
||||
super.draw(tile);
|
||||
|
||||
Draw.color(bottomColor);
|
||||
Draw.rect(commandRegions[entity.command.ordinal()], tile.drawx(), tile.drawy() - 1);
|
||||
Draw.color(topColor);
|
||||
Draw.rect(commandRegions[entity.command.ordinal()], tile.drawx(), tile.drawy());
|
||||
Draw.color();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void buildTable(Tile tile, Table table){
|
||||
CommandCenterEntity entity = tile.entity();
|
||||
ButtonGroup<ImageButton> group = new ButtonGroup<>();
|
||||
Table buttons = new Table();
|
||||
|
||||
for(UnitCommand cmd : UnitCommand.values()){
|
||||
buttons.addImageButton("command-" + cmd.name(), "clear-toggle", 8*3, () -> Call.onCommandCenterSet(players[0], tile, cmd))
|
||||
.size(38f).group(group).update(b -> b.setChecked(entity.command == cmd));
|
||||
}
|
||||
table.add(buttons);
|
||||
table.row();
|
||||
table.table("pane", t -> t.label(() -> entity.command.localized()).center().growX()).growX();
|
||||
}
|
||||
|
||||
@Remote(called = Loc.server, forward = true, targets = Loc.both)
|
||||
public static void onCommandCenterSet(Player player, Tile tile, UnitCommand command){
|
||||
Effects.effect(((CommandCenter)tile.block()).effect, tile);
|
||||
|
||||
for(Tile center : world.indexer.getAllied(tile.getTeam(), BlockFlag.comandCenter)){
|
||||
if(center.block() instanceof CommandCenter){
|
||||
CommandCenterEntity entity = center.entity();
|
||||
entity.command = command;
|
||||
}
|
||||
}
|
||||
|
||||
Team team = (player == null ? tile.getTeam() : player.getTeam());
|
||||
|
||||
for(BaseUnit unit : unitGroups[team.ordinal()].all()){
|
||||
unit.onCommand(command);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public TileEntity newEntity(){
|
||||
return new CommandCenterEntity();
|
||||
}
|
||||
|
||||
public class CommandCenterEntity extends TileEntity{
|
||||
public UnitCommand command = UnitCommand.attack;
|
||||
|
||||
@Override
|
||||
public void writeConfig(DataOutput stream) throws IOException{
|
||||
stream.writeByte(command.ordinal());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void readConfig(DataInput stream) throws IOException{
|
||||
command = UnitCommand.values()[stream.readByte()];
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
package io.anuke.mindustry.world.meta;
|
||||
|
||||
//TODO fix flagging system, currently doesn't really work
|
||||
public enum BlockFlag{
|
||||
/**General important target for all types of units.*/
|
||||
target(0),
|
||||
@@ -14,9 +15,7 @@ public enum BlockFlag{
|
||||
/**Producer or storage unit of volatile materials.*/
|
||||
explosive(Float.MAX_VALUE),
|
||||
/**Repair point.*/
|
||||
repair(Float.MAX_VALUE),
|
||||
/**Special flag for command center blocks.*/
|
||||
comandCenter(Float.MAX_VALUE);
|
||||
repair(Float.MAX_VALUE);
|
||||
|
||||
public final static BlockFlag[] all = values();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user