3D spaceshooter with online scoreboard, online demos, ship building. Now entirely defunct, but might be resurrected
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
sector/src/net/sector/gui/panels/designer/PanelDesigner.java

939 lines
27 KiB

package net.sector.gui.panels.designer;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.Map.Entry;
import net.sector.App;
import net.sector.gui.panels.Panel;
import net.sector.gui.panels.PanelGui;
import net.sector.gui.panels.designer.PanelShipLoad.IShipLoadDialogListener;
import net.sector.gui.panels.designer.PanelShipSave.IShipSaveDialogListener;
import net.sector.gui.panels.dialogs.EDialogColor;
import net.sector.gui.panels.dialogs.PanelDialogCaptureInput;
import net.sector.gui.panels.dialogs.PanelDialogCaptureInput.ICaptureInputDialogListener;
import net.sector.gui.panels.dialogs.PanelDialogModal;
import net.sector.gui.panels.dialogs.PanelDialogModal.IDialogListener;
import net.sector.gui.screens.Screen;
import net.sector.gui.screens.ScreenDesigner;
import net.sector.gui.screens.ScreenGame;
import net.sector.gui.screens.ScreenLevels;
import net.sector.gui.widgets.ETheme;
import net.sector.gui.widgets.GuiRoot;
import net.sector.gui.widgets.Widget;
import net.sector.gui.widgets.composite.*;
import net.sector.gui.widgets.composite.ShipDesignerTable.EShipStructureError;
import net.sector.gui.widgets.composite.ShipDesignerTable.EdMode;
import net.sector.gui.widgets.display.Text;
import net.sector.gui.widgets.display.TextDouble;
import net.sector.gui.widgets.input.Button;
import net.sector.gui.widgets.input.ButtonIcon;
import net.sector.gui.widgets.input.ButtonVertical;
import net.sector.gui.widgets.layout.Gap;
import net.sector.gui.widgets.layout.LayoutH;
import net.sector.gui.widgets.layout.LayoutV;
import net.sector.gui.widgets.layout.WindowFrame;
import net.sector.input.TriggerBundle;
import net.sector.level.EBuildingMode;
import net.sector.level.GameContext;
import net.sector.level.GameCursor;
import net.sector.level.ship.DiscoveryTable;
import net.sector.level.ship.PieceBundle;
import net.sector.level.ship.PieceRegistry;
import net.sector.level.ship.ShipBundle;
import net.sector.level.ship.modules.EnergySystem;
import net.sector.level.ship.modules.Shield;
import net.sector.util.Align;
import net.sector.util.Log;
import org.lwjgl.input.Keyboard;
import com.porcupine.color.RGB;
import com.porcupine.coord.CoordI;
import com.porcupine.struct.Struct3;
import com.porcupine.util.StringUtils;
/**
* Main menu panel
*
* @author Ondřej Hruška (MightyPork)
*/
public class PanelDesigner extends PanelGui {
private static final int id_BACK = 0, id_PLAY = 1, id_SHIELD_UP = 2, id_SHIELD_DOWN = 3, id_ENERGY_UP = 4, id_ENERGY_DOWN = 5;
private ShipDesignerTable table;
private Text txDesignStatus;
private ShipDesignerController ctrl;
private ShipDesignerShop shop;
private Button bnPlay, bnShUp, bnShDown, bnEnUp, bnEnDown, bnBack;
private ArrayList<ButtonVertical> groupButtons = new ArrayList<ButtonVertical>();
private static final int id_ARRANGE = 30, id_SELECT = 31, id_UNSELECT = 32, id_LEVEL_UP = 33;
private static final int id_LEVEL_DOWN = 34, id_MOVE_UP = 35, id_MOVE_DOWN = 36, id_MOVE_LEFT = 37;
private static final int id_MOVE_RIGHT = 38, id_DELETE = 39, id_ROT_CW = 40, id_ROT_CCW = 41, id_CONTROLS = 42, id_SELECT_ALL = 23;
private static final int id_ANY_TAB = 53, id_SAVE = 54, id_LOAD = 55;
@SuppressWarnings("unused")
private Button bnArrang, bnSel, bnUnsel, bnLvlUp, bnLvlDn, bnMvUp, bnMvDn, bnMvLt, bnMvRt, bnDel, bnRotCW, bnRotCCW, bnControls, bnSelAll,
bnSave, bnLoad;
private Text txShLevel, txEnLevel;
private TextDouble[] infoTexts;
private int shieldLevel = 1;
private int shieldLevelMax = Shield.getLevelMax();
private int energyLevel = 1;
private int energyLevelMax = EnergySystem.getLevelMax();
private RGB white = new RGB(1, 1, 1);
private RGB orange = new RGB(1, 0.7, 0);
private RGB red = new RGB(1, 0, 0);
private RGB green = new RGB(0, 1, 0);
private RGB blue = new RGB(0.4, 0.5, 1);
private RGB purple = new RGB(0.7, 0.3, 1);
private GameContext context;
private GameCursor cursor;
private ShipBundle shipBundle;
private DiscoveryTable discoveries;
private Text txtControl;
/**
* Create designer
*
* @param screen screen
* @param context game context
*/
public PanelDesigner(Screen screen, GameContext context) {
super(screen);
context.restoreCursor();
this.context = context;
this.cursor = context.getCursor();
this.discoveries = context.getCursor().discoveryTable;
this.shipBundle = context.getCursor().shipBundle;
shieldLevelMax = discoveries.getDiscoveryLevel("shield");
energyLevelMax = discoveries.getDiscoveryLevel("energy");
shieldLevel = shipBundle.shieldLevel;
energyLevel = shipBundle.energyLevel;
if (shieldLevelMax > 0 && shieldLevel == 0) shieldLevel = 1;
if (energyLevelMax > 0 && energyLevel == 0) energyLevel = 1;
}
@Override
public void onFocus() {
super.onFocus();
Keyboard.enableRepeatEvents(false);
}
@Override
public void onBlur() {
super.onBlur();
}
private ButtonVertical makeLeftTab(int id, String text) {
ButtonVertical bv = new ButtonVertical(id, text, "small_button");
bv.setTheme(ETheme.DES_TAB_BUTTON);
bv.setMargins(0, 3, 0, 3);
bv.setPadding(0, 8);
bv.bdrs[0] = true;
bv.bdrs[1] = false;
bv.bdrs[2] = true;
bv.bdrs[3] = true;
bv.sndClick = true;
return bv;
}
@Override
public void initGui(GuiRoot gui) {
LayoutH h1, h2;
LayoutV v1, v2;
WindowFrame frame, f2;
frame = new WindowFrame();
frame.setPadding(5, 5, 5, 5);
frame.enableShadow(false);
//@formatter:off
v1 = new LayoutV(Align.CENTER);
// TOP MENU BUTTONS
h1 = new LayoutH(Align.CENTER);
bnBack = new Button(id_BACK, "Back");
bnBack.setMinWidth(100);
h1.add(bnBack);
txDesignStatus = (Text) new Text("", "designer_info").setTextAlign(Align.CENTER).setMinWidth(500);
h1.add(txDesignStatus);
bnPlay = new Button(id_PLAY, "Play");
bnPlay.setMinWidth(100);
h1.add(bnPlay);
v1.add(h1);
h1 = new LayoutH(Align.TOP);
v2 = (LayoutV) new LayoutV(Align.CENTER).setMargins(0, 0, 0, 0);
v2.add(new Gap(0, 10));
for(Entry<String,String> g: PieceRegistry.groups.entrySet()) {
ButtonVertical bv;
String text = g.getValue();
v2.add(bv = (ButtonVertical) makeLeftTab(id_ANY_TAB, text).setTag(g.getKey()));
groupButtons.add(bv);
}
groupButtons.get(0).setSelected(true);
h1.add(v2);
table = new ShipDesignerTable(shipBundle.getShipDesign(), discoveries);
shop = new ShipDesignerShop(table, discoveries);
ctrl = new ShipDesignerController(cursor.money);
ctrl.buildMode = cursor.buildMode;
if(ctrl.buildMode==EBuildingMode.LOCKED) {
for(Widget w: groupButtons) {
w.setEnabled(false);
}
}
shop.setMarginsH(0, 5);
ctrl.addTable(shop);
ctrl.addTable(table);
table.setDesignerGui(this);
h1.add(shop);
h1.add(table);
f2 = new WindowFrame();
f2.enableShadow(false);
f2.setPadding(10, 10, 10, 10);
f2.setMinHeight(380);
f2.setBorderSize(2);
f2.setTheme(ETheme.DES_PANEL);
f2.setAlignH(Align.CENTER);
f2.setAlignV(Align.TOP);
v2 = new LayoutV(Align.CENTER);
infoTexts = new TextDouble[4];
// MONEY INDICATORS
v2.add(new Gap(0,4));
v2.add(infoTexts[0] = mkSidebarTextDouble());
v2.add(new Gap(0,10));
v2.add(infoTexts[1] = mkSidebarTextDouble());
v2.add(new Gap(0,3));
v2.add(infoTexts[2] = mkSidebarTextDouble());
v2.add(new Gap(0,3));
v2.add(infoTexts[3] = mkSidebarTextDouble());
// TRIGGER INDICATOR
v2.add(new Gap(0,20));
v2.add(txtControl = mkSidebarTextSimple().setColorText(RGB.RED).setTextAlign(0));
v2.add(new Gap(0,50));
Widget w;
// ENERGY
v2.add(w=new Text("Energy System", "designer_infopanel").setColorText(white).setMargins(0, 15, 0, -6));
if(energyLevelMax==0) w.setVisible(false);
h2 = new LayoutH(Align.CENTER);
h2.setMargins(0, -6, 0, 0);
h2.add(bnEnDown = new Button(id_ENERGY_DOWN, "<<", "designer_infopanel"));
h2.add(txEnLevel = (Text) new Text(energyLevel+"", "designer_infopanel").setTextAlign(Align.CENTER).setColorText(green).setMinWidth(20));
h2.add(bnEnUp = new Button(id_ENERGY_UP, ">>", "designer_infopanel"));
v2.add(h2);
if(energyLevelMax==0) {
h2.setVisible(false);
w.setVisible(false);
}
if(ctrl.buildMode==EBuildingMode.LOCKED) {
bnEnDown.setEnabled(false);
bnEnUp.setEnabled(false);
}
// SHIELD
v2.add(w = new Text("Force Shield", "designer_infopanel").setColorText(white).setMargins(0, 15, 0, -6));
if(shieldLevelMax==0) w.setVisible(false);
h2 = new LayoutH(Align.CENTER);
h2.setMargins(0, -6, 0, 0);
h2.add(bnShDown = new Button(id_SHIELD_DOWN, "<<", "designer_infopanel"));
h2.add(txShLevel = (Text) new Text(shieldLevel+"", "designer_infopanel").setTextAlign(Align.CENTER).setColorText(green).setMinWidth(20));
h2.add(bnShUp = new Button(id_SHIELD_UP, ">>", "designer_infopanel"));
v2.add(h2);
if(shieldLevelMax==0) {
h2.setVisible(false);
w.setVisible(false);
}
if(ctrl.buildMode==EBuildingMode.LOCKED) {
bnShDown.setEnabled(false);
bnShUp.setEnabled(false);
}
bnShDown.sndClick = bnShUp.sndClick = bnEnDown.sndClick = bnEnUp.sndClick = true;
f2.add(v2);
h1.add(f2);
v1.add(h1);
// LOWER NAVBAR
h1 = new LayoutH(Align.CENTER);
String texture = "designer_icons";
RGB color = RGB.WHITE;
h1.add(bnArrang = new ButtonIcon(id_ARRANGE, texture, 0, 0).setTooltip("Editing", color));
h1.add(bnSel = new ButtonIcon(id_SELECT, texture, 1, 0).setTooltip("Selecting", color));
h1.add(new Gap(4,0));
h1.add(bnSelAll = new ButtonIcon(id_SELECT_ALL, texture, 7, 0).setTooltip("Select all", color));
h1.add(bnUnsel = new ButtonIcon(id_UNSELECT, texture, 2, 0).setTooltip("Cancel selection", color));
h1.add(bnDel = new ButtonIcon(id_DELETE, texture, 4, 1).setTooltip("Destroy", color));
h1.add(new Gap(8,0));
h1.add(bnLvlDn = new ButtonIcon(id_LEVEL_DOWN, texture, 4, 0).setTooltip("Level down", color));
h1.add(bnLvlUp = new ButtonIcon(id_LEVEL_UP, texture, 3, 0).setTooltip("Level up", color));
h1.add(new Gap(4,0));
h1.add(bnRotCCW = new ButtonIcon(id_ROT_CCW, texture, 6, 0).setTooltip("Rotate", color));
h1.add(bnRotCW = new ButtonIcon(id_ROT_CW, texture, 5, 0).setTooltip("Rotate", color));
h1.add(new Gap(4,0));
h1.add(bnMvLt = new ButtonIcon(id_MOVE_LEFT, texture, 3, 1).setTooltip("Move left", color));
h1.add(bnMvRt = new ButtonIcon(id_MOVE_RIGHT, texture, 2, 1).setTooltip("Move right", color));
h1.add(bnMvUp = new ButtonIcon(id_MOVE_UP, texture, 0, 1).setTooltip("Move up", color));
h1.add(bnMvDn = new ButtonIcon(id_MOVE_DOWN, texture, 1, 1).setTooltip("Move down", color));
h1.add(new Gap(4,0));
h1.add(bnControls = new ButtonIcon(id_CONTROLS, texture, 5, 1).setTooltip("Controls", color));
h1.add(new Gap(8,0));
h1.add(bnSave = new ButtonIcon(id_SAVE, texture, 6, 1).setTooltip("Save", color));
h1.add(bnLoad = new ButtonIcon(id_LOAD, texture, 7, 1).setTooltip("Load", color));
if(ctrl.buildMode == EBuildingMode.LOCKED) {
bnDel.enabled = bnLvlUp.enabled = bnLvlDn.enabled = bnRotCCW.enabled = bnRotCW.enabled = false;
bnLoad.enabled = bnMvDn.enabled = bnMvLt.enabled = bnMvRt.enabled = bnMvUp.enabled = false;
}
v1.add(h1);
// size-less drag controlling widget.
v1.add(ctrl);
frame.add(v1);
gui.setRootWidget(frame);
actionPerformed(frame);
if(ctrl.buildMode==EBuildingMode.LOCKED) shop.clearSlots();
//@formatter:on
}
private TextDouble mkSidebarTextDouble() {
return (TextDouble) new TextDouble(140).setFonts("designer_infopanel", "designer_infopanel").setMarginsH(2, 4).setMarginsV(-1, -1);
}
private Text mkSidebarTextSimple() {
return (Text) new Text("", "smaller_text").setMinWidth(140).setMarginsH(2, 4).setMarginsV(-1, -1);
}
@Override
public boolean hasBackgroundLayer() {
return false;
}
@Override
protected void renderPanel() {
super.renderPanel();
if (!isTop()) return;
txtControl.setText(ctrl.pieceTriggerDesc);
// if not locked, show validity test.
if (ctrl.buildMode != EBuildingMode.LOCKED) {
txDesignStatus.setText(table.lastErrorFound.getString());
if (!table.lastErrorFound.isValid()) {
txDesignStatus.setColorText(red);
} else {
txDesignStatus.setColorText(green);
}
} else {
txDesignStatus.setText("Design is locked.");
txDesignStatus.setColorText(orange);
}
// if locked or free, hide all sidebar texts.
if (ctrl.buildMode == EBuildingMode.LOCKED || ctrl.buildMode == EBuildingMode.FREE) {
txDesignStatus.text = "";
for (int cnt = 0; cnt < infoTexts.length; cnt++) {
infoTexts[cnt].eraseTexts();
}
if (ctrl.buildMode == EBuildingMode.FREE) {
infoTexts[0].setTextLeft("Free building mode.", orange);
}
return;
}
// update context info.
// label, text, color
ArrayList<Struct3<String, String, RGB>> infos = new ArrayList<Struct3<String, String, RGB>>();
infos.add(new Struct3<String, String, RGB>("Your Cash", StringUtils.formatInt(ctrl.getTotalMoney()), orange));
if (ctrl.infoIsBought) {
if (ctrl.infoValue) {
infos.add(new Struct3<String, String, RGB>("Piece value", StringUtils.formatInt(ctrl.infoValueCost), green));
}
if (ctrl.infoRepair) {
infos.add(new Struct3<String, String, RGB>("Repair", StringUtils.formatInt(ctrl.infoRepairCost), red));
} else {
if (ctrl.infoUpgrade) {
infos.add(new Struct3<String, String, RGB>("Upgrade", StringUtils.formatInt(ctrl.infoUpgradeCost), blue));
}
if (ctrl.infoDowngrade) {
infos.add(new Struct3<String, String, RGB>("Downgrade", StringUtils.formatInt(ctrl.infoDowngradeCost), purple));
}
}
} else {
if (ctrl.infoBuy) {
infos.add(new Struct3<String, String, RGB>("Price", StringUtils.formatInt(ctrl.infoBuyCost), blue));
}
if (ctrl.infoUpgrade) {
infos.add(new Struct3<String, String, RGB>("Upgrade", StringUtils.formatInt(ctrl.infoUpgradeCost), blue));
}
if (ctrl.infoDowngrade) {
infos.add(new Struct3<String, String, RGB>("Downgrade", StringUtils.formatInt(ctrl.infoDowngradeCost), purple));
}
}
if (!ctrl.isDragging()) {
if (bnEnUp.lastRenderHover && bnEnUp.isEnabled()) {
int n = PieceRegistry.getLevelChangeCost(EnergySystem.getBaseCost(), energyLevel, energyLevel + 1);
infos.add(new Struct3<String, String, RGB>("Upgrade", StringUtils.formatInt(n), blue));
}
if (bnEnDown.lastRenderHover && bnEnDown.isEnabled()) {
int n = PieceRegistry.getLevelChangeCost(EnergySystem.getBaseCost(), energyLevel, energyLevel - 1);
infos.add(new Struct3<String, String, RGB>("Downgrade", StringUtils.formatInt(n), purple));
}
if (bnShUp.lastRenderHover && bnShUp.isEnabled()) {
int n = PieceRegistry.getLevelChangeCost(Shield.getBaseCost(), shieldLevel, shieldLevel + 1);
infos.add(new Struct3<String, String, RGB>("Upgrade", StringUtils.formatInt(n), blue));
}
if (bnShDown.lastRenderHover && bnShDown.isEnabled()) {
int n = PieceRegistry.getLevelChangeCost(Shield.getBaseCost(), shieldLevel, shieldLevel - 1);
infos.add(new Struct3<String, String, RGB>("Downgrade", StringUtils.formatInt(n), purple));
}
}
for (int cnt = 0; cnt < infoTexts.length; cnt++) {
if (cnt < infos.size()) {
Struct3<String, String, RGB> info = infos.get(cnt);
infoTexts[cnt].setTextLeft(info.a, white).setTextRight(info.b, info.c);
} else {
infoTexts[cnt].setTextLeft("", white).setTextRight("", white);
}
}
}
@Override
public void actionPerformed(Widget widget) {
int id = widget.getId();
if (ctrl.buildMode == EBuildingMode.LOCKED && id == id_ANY_TAB) {
return;
}
CoordI move;
switch (id) {
case id_ANY_TAB:
String group = widget.getTag();
shop.fillWithPieceGroup(group);
for (ButtonVertical b : groupButtons) {
b.setSelected(false);
}
((ButtonVertical) widget).setSelected(true);
break;
case id_PLAY:
EShipStructureError e = table.checkDesign();
if (e.isValid()) {
PieceBundle[][] pieces = table.exportShipDesign();
cursor.shipBundle = new ShipBundle(pieces, shieldLevel, energyLevel);
cursor.money = ctrl.getTotalMoney();
if (!context.levelBundle.hadDefaultShip || cursor.buildMode == EBuildingMode.LOCKED) context.saveCursorInBundle();
context.saveShipToFile();
app.replaceScreen(new ScreenGame(context));
} else {
PanelDialogModal p = new PanelDialogModal(screen, null, -1, true, e.getDescription(), "OK");
openPanel(p);
}
break;
case id_LOAD:
if (cursor.buildMode == EBuildingMode.LOCKED) {
break;
}
openPanel(new PanelShipLoad(screen, new IShipLoadDialogListener() {
@Override
public void onFileSelected(File inFile) {
try {
PieceBundle[][] pieces = table.exportShipDesign();
int cost = new ShipBundle(pieces, shieldLevel, energyLevel).getTotalCost();
cursor.money = ctrl.getTotalMoney() + cost;
if (inFile == null) {
// empty design requested...
cursor.shipBundle = new ShipBundle(new PieceBundle[1][1], 1, 1);
cursor.shipBundle.reduceForDiscoveryTable(cursor.discoveryTable);
} else {
// load ship
cursor.shipBundle.xmlFromStream(new FileInputStream(inFile));
// reduce for discovery table and cost
cursor.shipBundle.reduceForDiscoveryTable(cursor.discoveryTable);
if (cursor.buildMode != EBuildingMode.FREE) {
cursor.shipBundle.reduceForTotalCost(cursor.money);
// pay for new ship
cursor.money -= cursor.shipBundle.getTotalCost();
}
}
// save to context
context.saveCursor();
// reload designer
App.inst.replaceScreen(new ScreenDesigner());
} catch (Exception e) {
Log.e("Error loading file.", e);
Panel p = new PanelDialogModal(screen, null, -1, true, "Loading failed.\n" + e.getMessage(), "OK");
PanelDesigner.this.openPanel(p);
}
}
}));
break;
case id_SAVE:
final ShipBundle currentShip = new ShipBundle(table.exportShipDesign(), shieldLevel, energyLevel);
openPanel(new PanelShipSave(screen, new IShipSaveDialogListener() {
@Override
public void onFileSelected(File outFile) {
try {
currentShip.xmlToStream(new FileOutputStream(outFile));
} catch (Exception e) {
Log.e("Error saving file.", e);
Panel p = new PanelDialogModal(screen, null, -1, true, "The ship could not be saved.\n" + e.getMessage(), "OK");
openPanel(p);
}
}
}));
break;
case id_BACK:
cursor.shipBundle = new ShipBundle(table.exportShipDesign(), shieldLevel, energyLevel);
cursor.money = ctrl.getTotalMoney();
if (!context.levelBundle.hadDefaultShip || cursor.buildMode == EBuildingMode.LOCKED) context.saveCursorInBundle();
app.replaceScreen(new ScreenLevels());
break;
case id_SHIELD_DOWN:
if (shieldLevel > 1) {
int mny = Math.abs(PieceRegistry.getLevelChangeCost(Shield.getBaseCost(), shieldLevel, shieldLevel - 1));
ctrl.addMoney(mny);
shieldLevel--;
txShLevel.setText(shieldLevel + "");
}
break;
case id_SHIELD_UP:
if (shieldLevel < shieldLevelMax) {
int mny = Math.abs(PieceRegistry.getLevelChangeCost(Shield.getBaseCost(), shieldLevel, shieldLevel + 1));
if (ctrl.hasMoney(mny)) {
ctrl.consumeMoney(mny);
shieldLevel++;
txShLevel.setText(shieldLevel + "");
}
}
break;
case id_ENERGY_DOWN:
if (energyLevel > 1) {
int mny = Math.abs(PieceRegistry.getLevelChangeCost(EnergySystem.getBaseCost(), energyLevel, energyLevel - 1));
ctrl.addMoney(mny);
energyLevel--;
txEnLevel.setText(energyLevel + "");
}
break;
case id_ENERGY_UP:
if (energyLevel < energyLevelMax) {
int mny = Math.abs(PieceRegistry.getLevelChangeCost(EnergySystem.getBaseCost(), energyLevel, energyLevel + 1));
if (ctrl.hasMoney(mny)) {
ctrl.consumeMoney(mny);
energyLevel++;
txEnLevel.setText(energyLevel + "");
}
}
break;
case id_ARRANGE:
if (table.getEditMode() == EdMode.ARRANGE) break;
ctrl.cancelDrag();
table.setEditMode(EdMode.ARRANGE);
bnArrang.setSelected(true);
bnSel.setSelected(false);
bnDel.setSelected(false);
break;
case id_SELECT:
if (table.getEditMode() == EdMode.SELECT) break;
ctrl.cancelDrag();
table.setEditMode(EdMode.SELECT);
bnArrang.setSelected(false);
bnSel.setSelected(true);
bnDel.setSelected(false);
break;
case id_SELECT_ALL:
table.selectAll();
break;
case id_UNSELECT:
table.unselectAll();
break;
case id_LEVEL_UP:
if (ctrl.buildMode == EBuildingMode.LOCKED) break;
if (ctrl.isDragging()) {
table.levelChangeDragged(1);
} else {
table.levelChangeSelected(1);
}
break;
case id_LEVEL_DOWN:
if (ctrl.buildMode == EBuildingMode.LOCKED) break;
if (ctrl.isDragging()) {
table.levelChangeDragged(-1);
} else {
table.levelChangeSelected(-1);
}
break;
case id_ROT_CCW:
if (ctrl.buildMode == EBuildingMode.LOCKED) break;
if (ctrl.isDragging()) {
table.rotatePiece(ctrl.getDragged(), 1);
} else {
table.rotateSelected(1);
}
break;
case id_ROT_CW:
if (ctrl.buildMode == EBuildingMode.LOCKED) break;
if (ctrl.isDragging()) {
table.rotatePiece(ctrl.getDragged(), -1);
} else {
table.rotateSelected(-1);
}
break;
case id_MOVE_UP:
if (ctrl.buildMode == EBuildingMode.LOCKED) break;
move = new CoordI(0, -1);
if (table.isAnySelected()) {
table.moveSelected(move);
} else {
table.moveAll(move);
}
break;
case id_MOVE_DOWN:
if (ctrl.buildMode == EBuildingMode.LOCKED) break;
move = new CoordI(0, 1);
if (table.isAnySelected()) {
table.moveSelected(move);
} else {
table.moveAll(move);
}
break;
case id_MOVE_LEFT:
if (ctrl.buildMode == EBuildingMode.LOCKED) break;
move = new CoordI(-1, 0);
if (table.isAnySelected()) {
table.moveSelected(move);
} else {
table.moveAll(move);
}
break;
case id_MOVE_RIGHT:
if (ctrl.buildMode == EBuildingMode.LOCKED) break;
move = new CoordI(1, 0);
if (table.isAnySelected()) {
table.moveSelected(move);
} else {
table.moveAll(move);
}
break;
case id_DELETE:
if (ctrl.isDragging()) {
table.sellPiece(ctrl.getDragged());
ctrl.resetDragInfo();
break;
} else {
deleteSelectedAsk();
}
break;
case id_CONTROLS:
if (ctrl.isDragging()) {
// can't set controls of dragged piece
break;
} else if (table.isAnySelected()) {
// set controls of selected pieces
editControlsSelected();
} else {
// let the table handle this event.
//openPanel(new PanelDialogModal(screen, this, dlg_INFO, true, "No pieces selected!", "OK"));
}
break;
}
boolean locked = ctrl.buildMode == EBuildingMode.LOCKED;
bnShDown.setEnabled(shieldLevel > 1 && !locked);
bnShUp.setEnabled(shieldLevel < shieldLevelMax && !locked);
bnEnDown.setEnabled(energyLevel > 1 && !locked);
bnEnUp.setEnabled(energyLevel < energyLevelMax && !locked);
EdMode mode = table.getEditMode();
bnArrang.setSelected(mode == EdMode.ARRANGE);
bnSel.setSelected(mode == EdMode.SELECT);
bnDel.setSelected(mode == EdMode.DELETE);
getRootWidget().updatePositions();
table.checkDesign();
}
@Override
public void onKey(int key, char c, boolean down) {
super.onKey(key, c, down);
if (down) {
switch (key) {
case Keyboard.KEY_ESCAPE:
actionPerformed(bnBack);
break;
case Keyboard.KEY_RETURN:
case Keyboard.KEY_E:
actionPerformed(bnControls);
break;
case Keyboard.KEY_LEFT:
actionPerformed(bnMvLt);
break;
case Keyboard.KEY_RIGHT:
actionPerformed(bnMvRt);
break;
case Keyboard.KEY_UP:
actionPerformed(bnMvUp);
break;
case Keyboard.KEY_DOWN:
actionPerformed(bnMvDn);
break;
case Keyboard.KEY_DELETE:
actionPerformed(bnDel);
break;
case Keyboard.KEY_N:
actionPerformed(bnRotCCW);
break;
case Keyboard.KEY_M:
actionPerformed(bnRotCW);
break;
}
}
table.checkDesign();
}
public void deleteSelectedAsk() {
if (ctrl.buildMode == EBuildingMode.LOCKED) return;
if (table.isAnySelected()) {
int count = table.selectedSlots.size();
String msg = "";
if (count > 1) {
msg = "Really delete " + count + " selected pieces?";
} else {
msg = "Really delete 1 selected piece?";
}
IDialogListener handler = new IDialogListener() {
@Override
public void onDialogButton(int id, int btn) {
if (btn == 1) {
table.deleteSelected();
}
}
};
openPanel(new PanelDialogModal(screen, handler, -1, true, msg, "No", "Yes").setEnterButton(1));
}
}
public void editControlsSelected() {
if (table.isAnySelected()) {
// set controls of selected pieces
boolean differentTriggers = false;
boolean differentPieces = false;
TriggerBundle trigger = null;
String pieceLabel = null;
boolean anyTriggerPresent = false;
for (CoordI tile : table.selectedSlots) {
DraggablePiece p = table.slots[tile.y][tile.x];
if (p != null) {
if (p.hasTrigger()) {
if (trigger != null && !trigger.equals(p.getTrigger())) differentTriggers = true;
String name = PieceRegistry.getPieceLabel(p.id);
if (pieceLabel != null && !pieceLabel.equals(name)) differentPieces = true;
trigger = p.getTrigger();
pieceLabel = name;
anyTriggerPresent = true;
}
}
}
if (!anyTriggerPresent) {
openPanel(new PanelDialogModal(screen, null, -1, true, "Selected pieces are passive.\nTry with weapons.", "OK"));
return;
}
String triggerName = "";
if (differentPieces) pieceLabel = "Various pieces";
if (differentTriggers) {
triggerName = "Various triggers";
} else if (trigger != null) {
triggerName = trigger.getLabel(false);
}
ICaptureInputDialogListener handler = new ICaptureInputDialogListener() {
@Override
public void onCaptureInputDialogClosed(int dialogId, TriggerBundle newTrigger) {
if (newTrigger == null) {
table.unselectAll();
return;
}
for (CoordI tile : table.selectedSlots) {
DraggablePiece p = table.slots[tile.y][tile.x];
if (p != null) {
if (p.hasTrigger()) {
p.setTrigger(newTrigger);
}
}
}
table.unselectAll();
}
};
PanelDialogCaptureInput p = new PanelDialogCaptureInput(screen, handler, -1, true, pieceLabel, triggerName);
p.setColorTheme(EDialogColor.BLUE);
openPanel(p);
}
}
}