/**
*
*/
package logbook.gui;
import java.util.List;
import logbook.dto.BattleExDto;
import logbook.dto.DockDto;
import logbook.dto.EnemyShipDto;
import logbook.dto.ShipDto;
import logbook.gui.logic.DamageRate;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;
/**
* @author Nekopanda
* 戦況ウィンドウ通常版
*/
public class BattleWindowLarge extends BattleWindow {
// 名前
private final Label[] friendLabels = new Label[12];
// 0,1: 開始前, 2,3,4: 昼戦後, 5,6,7: 夜戦後
private final Label[][] friendHpLabels = new Label[8][12];
private final Label[][] enemyHpLabels = new Label[8][6];
private final Label[] hpLabels = new Label[2];
public BattleWindowLarge(Shell parent, MenuItem menuItem) {
super(parent, menuItem);
}
private void addInfoLabel(Label[] labels, int row) {
switch (row) {
case 0:
labels[0] = this.addLabelWithSpan("艦隊名", 2, 1);
break;
case 1:
labels[1] = this.addLabel("陣形:単縦陣");
labels[2] = this.addLabel("触接:あり");
break;
case 2:
labels[3] = this.addLabelWithSpan("索敵", 2, 1);
break;
case 3:
labels[4] = this.addLabel("航空戦:");
labels[5] = this.addLabel("制空状態");
break;
case 4:
labels[6] = this.addLabel("Stage1");
labels[7] = this.addLabel("Stage2");
break;
case 5:
labels[8] = this.addLabel("000→000");
labels[9] = this.addLabel("000→000");
break;
case 6:
labels[10] = this.addLabel("000→000");
labels[11] = this.addLabel("000→000");
break;
default:
this.skipSlot();
this.skipSlot();
break;
}
}
private void addEnemyInfoLabel(Label[] labels, int row) {
switch (row) {
case 0:
labels[0] = this.addLabelWithSpan("艦隊名", 2, 1);
break;
case 1:
labels[1] = this.addLabel("陣形:単縦陣");
labels[2] = this.addLabel("触接:あり");
break;
case 2:
labels[3] = this.addLabelWithSpan("索敵:", 2, 1);
break;
case 3:
labels[4] = labels[5] = labels[6] = this.addLabel("Stage1");
labels[7] = this.addLabel("Stage2");
break;
case 4:
labels[8] = this.addLabel("000→000");
labels[9] = this.addLabel("000→000");
break;
case 5:
labels[10] = this.addLabel("000→000");
labels[11] = this.addLabel("000→000");
break;
}
}
private void createHpLabels(Label[][] labels, int i) {
if ((i == 0) || (i == 6)) {
this.addVerticalSeparator(6); //2
this.addLabelWithSpan("→", 1, 6);//12
this.addVerticalSeparator(6); //2
}
labels[2][i] = this.addLabel("000"); //13 HP
labels[3][i] = this.addLabel("000"); //13 HP
labels[4][i] = this.addLabel("健在"); //14 HP
if ((i == 0) || (i == 6)) {
this.addVerticalSeparator(6); //2
this.addLabelWithSpan("→", 1, 6);//15
this.addVerticalSeparator(6); //2
}
labels[5][i] = this.addLabel("000"); //13 HP
labels[6][i] = this.addLabel("000"); //13 HP
labels[7][i] = this.addLabel("健在"); //17 HP
}
@Override
protected void createContents() {
int numColumns = 20;
GridLayout layout = new GridLayout(numColumns, false);
layout.marginWidth = 0;
layout.marginHeight = 0;
layout.verticalSpacing = 0;
layout.horizontalSpacing = 0;
this.getShell().setLayout(layout);
//フォント取得
this.title = new Label(this.getShell(), SWT.NONE);
this.title.setFont(this.getBoldFont());
this.title.setLayoutData(new GridData(SWT.FILL, SWT.LEFT, false, false, numColumns, 1));
this.title.setText("出撃中ではありません");
// 各カラムの最小幅を定義 //
/*
int battleWidth = 130;
int nameWidth = 110;
int hpWidth = 40;
int statusWidth = 25;
int damWidth = 28;
*/
int nameWidth = 60;
this.skipSlot();//1
this.skipSlot(); //2 separator
this.addLabelWithSpan("状態", 2, 1);//3-4
this.skipSlot(); //5 separator
this.addLabel("艦名", SWT.CENTER, nameWidth);//6
this.addLabel("HP");//7-8
this.addLabel("");//7-8
this.skipSlot(); //5 separator
this.addLabel("");//9
this.skipSlot(); //5 separator
this.addLabel("Dmg");//10
this.addLabel("残");//11
this.addLabel("");//12
this.skipSlot(); //5 separator
this.addLabel("");//13
this.skipSlot(); //5 separator
this.addLabel("Dmg");//14
this.addLabel("残");//15
this.addLabel("");//16
this.addHorizontalSeparator(numColumns);
// 味方エリア
for (int i = 0; i < 12; ++i) {
if (i == 6) {
this.beginCombined();
}
if (i == 0) {
this.addLabelWithSpan("自", 1, 6); //1
}
if (i == 6) {
this.addLabelWithSpan("", 1, 6); //1
}
if ((i == 0) || (i == 6))
this.addVerticalSeparator(6); //2
this.addInfoLabel(this.infoLabels[0], i);//3-4
if ((i == 0) || (i == 6))
this.addVerticalSeparator(6);//5
this.friendLabels[i] = this.addLabel("艦名" + (i + 1), SWT.LEFT, nameWidth);//6
this.friendHpLabels[0][i] = this.addLabel("000/000"); //10 HP
this.friendHpLabels[1][i] = this.addLabel("健在"); //10 HP
this.createHpLabels(this.friendHpLabels, i); // 10-17
}
this.endCombined();
this.addHorizontalSeparator(numColumns);
// 間
this.skipSlot();//1
this.skipSlot();//2
this.matchLabel = this.addLabelWithSpan("会敵", 2, 1);//3-4
this.addLabelWithSpan("", 2, 1);//5-6
this.addLabelWithSpan("開始時", 2, 1);//7-8
this.addLabelWithSpan("→", 3, 1);//8
this.hpLabels[0] = this.addLabelWithSpan(AFTER_DAY, 3, 1);//9-11
this.addLabelWithSpan("→", 3, 1);//12
this.hpLabels[1] = this.addLabelWithSpan(AFTER_NIGHT, 3, 1);//13-15
this.addHorizontalSeparator(numColumns);
// 敵エリア
for (int i = 0; i < 6; ++i) {
if (i == 0) {
this.addLabelWithSpan("敵", 1, 6); //1
this.addVerticalSeparator(6); //2
}
this.addEnemyInfoLabel(this.infoLabels[1], i);//3-4
if (i == 0)
this.addVerticalSeparator(6); //5
this.enemyLabels[i] = this.addLabel("艦名" + (i + 1), SWT.LEFT, nameWidth); //6
this.enemyHpLabels[1][i] = this.enemyHpLabels[0][i] =
this.addLabelWithSpan("0000", 2, 1); //10 HP
this.createHpLabels(this.enemyHpLabels, i); // 10-17
}
this.addHorizontalSeparator(numColumns);
// 最後
this.resultLabel[0] = this.addLabel("結果予想", SWT.DEFAULT, SWT.CENTER, SWT.FILL, true, numColumns, 1);//6-17
this.beginCombined();
this.resultLabel[1] = this.addLabel("結果予想", SWT.DEFAULT, SWT.CENTER, SWT.FILL, true, numColumns, 1);//6-17
this.endCombined();
this.resultLabel[2] = this.addLabel("結果予想", SWT.DEFAULT, SWT.CENTER, SWT.FILL, true, numColumns, 1);//6-17
// この状態で長さを決める
this.getShell().layout();
}
@Override
protected void clearText() {
super.clearText();
// 味方
for (int i = 0; i < 12; ++i) {
setLabelText(this.friendLabels[i], "-", "");
for (int c = 0; c < 8; ++c) {
setLabelText(this.friendHpLabels[c][i], "");
if ((c == 1) || (c == 4) || (c == 7))
setLabelNone(this.friendHpLabels[c][i]);
}
}
// 敵
for (int i = 0; i < 6; ++i) {
for (int c = 0; c < 8; ++c) {
setLabelText(this.enemyHpLabels[c][i], "");
if ((c == 4) || (c == 7))
setLabelNone(this.enemyHpLabels[c][i]);
}
}
}
private void printDock(DockDto dock, int base) {
List<ShipDto> ships = dock.getShips();
boolean[] escaped = dock.getEscaped();
for (int i = 0; i < ships.size(); ++i) {
ShipDto ship = ships.get(i);
this.friendLabels[base + i].setText(String.valueOf(i + 1) + "." +
ship.getFriendlyName());
this.friendLabels[base + i].setToolTipText(ship.getDetailedString());
printFriendHp(this.friendHpLabels, base + i,
ship.getNowhp(), ship.getMaxhp(), true, (escaped != null) && escaped[i]);
}
}
@Override
protected void printDock() {
super.printDock();
List<DockDto> docks = this.getDocks();
if (docks == null)
return;
this.setCombinedMode(docks.size() == 2);
for (int i = 0; i < docks.size(); ++i) {
DockDto dock = docks.get(i);
this.printDock(dock, i * 6);
}
}
@Override
protected void printMap() {
super.printMap();
if (this.getMapCellDto() == null)
return;
this.title.setText(this.getMapCellDto().detailedString());
}
private static void setDamageLabel(Label label, DamageRate rate, boolean friend) {
label.setText(rate.toString(friend));
label.setBackground(rate.getBackground());
label.setForeground(rate.getForeground());
}
private static void printDamageLebel(Label label, int nowhp, int maxhp, boolean friend) {
setDamageLabel(label, DamageRate.fromHP(nowhp, maxhp), friend);
}
private static void printFriendHp(Label[][] labels, int index, int nowhp, int maxhp, boolean friend, boolean escaped) {
if (escaped) {
setDamageLabel(labels[1][index], DamageRate.ESCAPED, friend);
}
else {
printHp(labels[0][index], nowhp, maxhp);
printDamageLebel(labels[1][index], nowhp, maxhp, friend);
}
}
private static void printHp(
Label[][] labels, int base1, int base2, int[] dam, int[] nowhp, int[] maxhp, boolean[] escaped,
boolean friend)
{
for (int i = 0; i < nowhp.length; ++i) {
if ((escaped != null) && escaped[i]) {
continue;
}
labels[base1 + 0][base2 + i].setText(String.valueOf(dam[base2 + i]));
labels[base1 + 1][base2 + i].setText(String.valueOf(nowhp[i]));
printDamageLebel(labels[base1 + 2][base2 + i], nowhp[i], maxhp[i], friend);
}
}
@Override
protected void printBattle() {
super.printBattle();
BattleExDto battle = this.getBattle();
BattleExDto.Phase phase1 = battle.getPhase1();
BattleExDto.Phase phase2 = battle.getPhase2();
BattleExDto.Phase lastPhase = battle.getLastPhase();
if (lastPhase == null)
return;
// 初戦が夜戦?
if (phase1.isNight()) {
this.hpLabels[0].setText(AFTER_NIGHT);
this.hpLabels[1].setText(AFTER_DAY);
}
else {
this.hpLabels[0].setText(AFTER_DAY);
this.hpLabels[1].setText(AFTER_NIGHT);
}
// 味方
int[][] friendStartHp = new int[][] { battle.getStartFriendHp(), battle.getStartFriendHpCombined() };
int[][] friendMaxHp = new int[][] { battle.getMaxFriendHp(), battle.getMaxFriendHpCombined() };
List<DockDto> docks = this.getDocks();
for (int i = 0; i < friendStartHp.length; ++i) {
int[] startHp = friendStartHp[i];
int[] maxHp = friendMaxHp[i];
if (startHp != null) {
boolean[] dockEscaped = docks.get(i).getEscaped();
for (int c = 0; c < startHp.length; ++c) {
printFriendHp(this.friendHpLabels, (i * 6) + c,
startHp[c], maxHp[c], true, (dockEscaped != null) && dockEscaped[c]);
}
}
}
// 敵
List<EnemyShipDto> enemyShips = battle.getEnemy();
int[] maxEnemyHp = battle.getMaxEnemyHp();
for (int i = 0; i < enemyShips.size(); ++i) {
EnemyShipDto ship = enemyShips.get(i);
this.enemyLabels[i].setText(String.valueOf(i + 1) + "." + ship.getFriendlyName());
this.enemyLabels[i].setToolTipText(ship.getDetailedString());
this.enemyHpLabels[0][i].setText(String.valueOf(maxEnemyHp[i]) + "/" + maxEnemyHp[i]);
}
// 昼戦後HP
printHp(this.friendHpLabels, 2, 0, this.friendDamages[0],
phase1.getNowFriendHp(), friendMaxHp[0], docks.get(0).getEscaped(), true);
if (battle.isCombined()) {
printHp(this.friendHpLabels, 2, 6, this.friendDamages[0],
phase1.getNowFriendHpCombined(), friendMaxHp[1], docks.get(1).getEscaped(), true);
}
printHp(this.enemyHpLabels, 2, 0, this.enemyDamages[0], phase1.getNowEnemyHp(), maxEnemyHp, null, false);
// 夜戦後HP
if (phase2 != null) {
printHp(this.friendHpLabels, 5, 0, this.friendDamages[1],
phase2.getNowFriendHp(), friendMaxHp[0], docks.get(0).getEscaped(), true);
if (battle.isCombined()) {
printHp(this.friendHpLabels, 5, 6, this.friendDamages[1],
phase2.getNowFriendHpCombined(), friendMaxHp[1], docks.get(1).getEscaped(), true);
}
printHp(this.enemyHpLabels, 5, 0, this.enemyDamages[1], phase2.getNowEnemyHp(), maxEnemyHp, null, false);
}
}
}