From ec1510adcdaf506fd2056189f1a60182dc985225 Mon Sep 17 00:00:00 2001 From: Retera Date: Sat, 23 Jan 2021 23:03:03 -0500 Subject: [PATCH] Update ramps and cliffs --- .../handlers/w3x/environment/Terrain.java | 54 +++++------ .../warsmash/desktop/util/TerrainView.java | 36 +++++++ .../desktop/util/TerrainViewPanel.java | 93 +++++++++++++++++++ 3 files changed, 156 insertions(+), 27 deletions(-) create mode 100644 desktop/src/com/etheller/warsmash/desktop/util/TerrainView.java create mode 100644 desktop/src/com/etheller/warsmash/desktop/util/TerrainViewPanel.java diff --git a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/environment/Terrain.java b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/environment/Terrain.java index 8fef83a..fcb3325 100644 --- a/core/src/com/etheller/warsmash/viewer5/handlers/w3x/environment/Terrain.java +++ b/core/src/com/etheller/warsmash/viewer5/handlers/w3x/environment/Terrain.java @@ -594,25 +594,24 @@ public class Terrain { } if (!(facingDown && (j == 0)) && !(!facingDown && (j >= (this.rows - 2))) && !(facingLeft && (i == 0)) && !(!facingLeft && (i >= (this.columns - 2)))) { - final boolean br = ((bottomLeft.getRamp() != 0) != (bottomRight.getRamp() != 0)) - && ((topLeft.getRamp() != 0) != (topRight.getRamp() != 0)) - && !this.corners[i + (bottomRight.getRamp() != 0 ? 1 : 0)][j - + (facingDown ? -1 : 1)].cliff; + final boolean verticalRamp = ((bottomLeft.isRamp()) != (bottomRight.isRamp())) + && ((topLeft.isRamp()) != (topRight.isRamp())) + && !this.corners[i][j + (facingDown ? -1 : 1)].cliff; - final boolean bo = ((bottomLeft.getRamp() != 0) != (topLeft.getRamp() != 0)) - && ((bottomRight.getRamp() != 0) != (topRight.getRamp() != 0)) - && !this.corners[i + (facingLeft ? -1 : 1)][j + (topLeft.getRamp() != 0 ? 1 : 0)].cliff; + final boolean horizontalRamp = ((bottomLeft.isRamp()) != (topLeft.isRamp())) + && ((bottomRight.isRamp()) != (topRight.isRamp())) + && !this.corners[i + (facingLeft ? -1 : 1)][j].cliff; - if (br || bo) { - String fileName = "" + (char) ((bottomLeft.getRamp() != 0 ? 'L' : 'A') - + ((bottomLeft.getLayerHeight() - base) * (bottomLeft.getRamp() != 0 ? -4 : 1))) - + (char) ((topLeft.getRamp() != 0 ? 'L' : 'A') - + ((topLeft.getLayerHeight() - base) * (topLeft.getRamp() != 0 ? -4 : 1))) - + (char) ((topRight.getRamp() != 0 ? 'L' : 'A') - + ((topRight.getLayerHeight() - base) * (topRight.getRamp() != 0 ? -4 : 1))) - + (char) ((bottomRight.getRamp() != 0 ? 'L' : 'A') - + ((bottomRight.getLayerHeight() - base) - * (bottomRight.getRamp() != 0 ? -4 : 1))); + if (verticalRamp || horizontalRamp) { + String fileName = "" + + (char) ((topLeft.isRamp() ? 'L' : 'A') + + ((topLeft.getLayerHeight() - base) * (topLeft.isRamp() ? -4 : 1))) + + (char) ((topRight.isRamp() ? 'L' : 'A') + + ((topRight.getLayerHeight() - base) * (topRight.isRamp() ? -4 : 1))) + + (char) ((bottomRight.isRamp() ? 'L' : 'A') + + ((bottomRight.getLayerHeight() - base) * (bottomRight.isRamp() ? -4 : 1))) + + (char) ((bottomLeft.isRamp() ? 'L' : 'A') + + ((bottomLeft.getLayerHeight() - base) * (bottomLeft.isRamp() ? -4 : 1))); final String rampModelDir = this.cliffTextures.get(bottomLeftCliffTex).rampModelDir; fileName = "Doodads\\Terrain\\" + rampModelDir + "\\" + rampModelDir + fileName + "0.mdx"; @@ -625,19 +624,20 @@ public class Terrain { for (int ji = this.cliffs.size(); ji-- > 0;) { final IVec3 pos = this.cliffs.get(ji); - if ((pos.x == (i + ((bo ? 1 : 0) * (facingLeft ? 0 : 1)))) - && (pos.y == (j - ((br ? 1 : 0) * (facingDown ? 1 : 0))))) { + if ((pos.x == (i + ((horizontalRamp ? 1 : 0) * (facingLeft ? -1 : 0)))) + && (pos.y == (j - ((verticalRamp ? 1 : 0) * (facingDown ? 1 : 0))))) { this.cliffs.remove(ji); break; } } - this.cliffs.add(new IVec3((i + ((bo ? 1 : 0) * (facingLeft ? 0 : 1))), - (j - ((br ? 1 : 0) * (facingDown ? 1 : 0))), this.pathToCliff.get(fileName))); + this.cliffs.add(new IVec3((i + ((horizontalRamp ? 1 : 0) * (facingLeft ? -1 : 0))), + (j - ((verticalRamp ? 1 : 0) * (facingDown ? 1 : 0))), + this.pathToCliff.get(fileName))); bottomLeft.romp = true; - this.corners[i + ((facingLeft ? -1 : 1) * (bo ? 1 : 0))][j - + ((facingDown ? -1 : 1) * (br ? 1 : 0))].romp = true; + this.corners[i + ((facingLeft ? -1 : 1) * (horizontalRamp ? 1 : 0))][j + + ((facingDown ? -1 : 1) * (verticalRamp ? 1 : 0))].romp = true; continue; } @@ -788,8 +788,8 @@ public class Terrain { final RenderCorner topLeft = this.corners[x + i][y + j + 1]; final RenderCorner topRight = this.corners[x + i + 1][y + j + 1]; - if ((bottomLeft.getRamp() != 0) && (topLeft.getRamp() != 0) && (bottomRight.getRamp() != 0) - && (topRight.getRamp() != 0) && (!bottomLeft.romp) && (!bottomRight.romp) + if ((bottomLeft.isRamp()) && (topLeft.isRamp()) && (bottomRight.isRamp()) + && (topRight.isRamp()) && (!bottomLeft.romp) && (!bottomRight.romp) && (!topLeft.romp) && (!topRight.romp)) { break ILoop; } @@ -825,8 +825,8 @@ public class Terrain { final RenderCorner topLeft = this.corners[x][y + 1]; final RenderCorner topRight = this.corners[x + 1][y + 1]; - return (bottomLeft.getRamp() != 0) && (topLeft.getRamp() != 0) && (bottomRight.getRamp() != 0) - && (topRight.getRamp() != 0) && !((bottomLeft.getLayerHeight() == topRight.getLayerHeight()) + return (bottomLeft.isRamp()) && (topLeft.isRamp()) && (bottomRight.isRamp()) && (topRight.isRamp()) + && !((bottomLeft.getLayerHeight() == topRight.getLayerHeight()) && (topLeft.getLayerHeight() == bottomRight.getLayerHeight())); } diff --git a/desktop/src/com/etheller/warsmash/desktop/util/TerrainView.java b/desktop/src/com/etheller/warsmash/desktop/util/TerrainView.java new file mode 100644 index 0000000..3ef9214 --- /dev/null +++ b/desktop/src/com/etheller/warsmash/desktop/util/TerrainView.java @@ -0,0 +1,36 @@ +package com.etheller.warsmash.desktop.util; + +import java.io.IOException; + +import javax.swing.JFrame; +import javax.swing.JScrollPane; +import javax.swing.WindowConstants; + +import com.etheller.warsmash.WarsmashGdxMapGame; +import com.etheller.warsmash.datasources.DataSource; +import com.etheller.warsmash.desktop.DesktopLauncher; +import com.etheller.warsmash.parsers.w3x.War3Map; +import com.etheller.warsmash.parsers.w3x.w3e.War3MapW3e; +import com.etheller.warsmash.units.DataTable; + +public class TerrainView { + public static void main(final String[] args) { + final DataTable warsmashIni = DesktopLauncher.loadWarsmashIni(); + final DataSource dataSources = WarsmashGdxMapGame.parseDataSources(warsmashIni); + final War3Map war3Map = new War3Map(dataSources, warsmashIni.get("Map").getField("FilePath")); + try { + final War3MapW3e environmentFile = war3Map.readEnvironment(); + final TerrainViewPanel terrainViewPanel = new TerrainViewPanel(environmentFile); + + final JFrame frame = new JFrame("TerrainView"); + frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); + frame.setContentPane(new JScrollPane(terrainViewPanel)); + frame.setBounds(0, 0, 800, 600); + frame.setLocationRelativeTo(null); + frame.setVisible(true); + } + catch (final IOException e) { + e.printStackTrace(); + } + } +} diff --git a/desktop/src/com/etheller/warsmash/desktop/util/TerrainViewPanel.java b/desktop/src/com/etheller/warsmash/desktop/util/TerrainViewPanel.java new file mode 100644 index 0000000..d1055c7 --- /dev/null +++ b/desktop/src/com/etheller/warsmash/desktop/util/TerrainViewPanel.java @@ -0,0 +1,93 @@ +package com.etheller.warsmash.desktop.util; + +import java.awt.Dimension; +import java.awt.Font; +import java.awt.Graphics; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; + +import javax.swing.Box; +import javax.swing.JPanel; + +import com.etheller.warsmash.parsers.w3x.w3e.Corner; +import com.etheller.warsmash.parsers.w3x.w3e.War3MapW3e; + +public class TerrainViewPanel extends JPanel { + private final War3MapW3e environmentFile; + private final Font baseFont; + private final Font biggerFont; + private int cliffMode = 0; + + public TerrainViewPanel(final War3MapW3e environmentFile) { + this.environmentFile = environmentFile; + add(Box.createRigidArea(new Dimension(this.environmentFile.getCorners()[0].length * 32, + this.environmentFile.getCorners().length * 32))); + this.baseFont = getFont(); + this.biggerFont = this.baseFont.deriveFont(24f); + addMouseListener(new MouseListener() { + @Override + public void mouseReleased(final MouseEvent e) { + + } + + @Override + public void mousePressed(final MouseEvent e) { + TerrainViewPanel.this.cliffMode = (TerrainViewPanel.this.cliffMode + 1) % 4; + repaint(); + } + + @Override + public void mouseExited(final MouseEvent e) { + + } + + @Override + public void mouseEntered(final MouseEvent e) { + + } + + @Override + public void mouseClicked(final MouseEvent e) { + + } + }); + } + + @Override + protected void paintComponent(final Graphics g) { + super.paintComponent(g); + final Corner[][] corners = this.environmentFile.getCorners(); + for (int i = 0; i < corners.length; i++) { + final int length = corners[i].length; + for (int j = 0; j < length; j++) { + int base = 0; + final int value; + switch (this.cliffMode) { + case 0: + value = corners[i][j].getRamp(); + break; + case 1: + value = corners[i][j].getLayerHeight(); + base = 2; + break; + case 2: + value = corners[i][j].getGroundTexture(); + break; + case 3: + value = corners[i][j].getCliffTexture(); + break; + default: + value = 0; + break; + } + if (value != base) { + g.setFont(this.biggerFont); + } + else { + g.setFont(this.baseFont); + } + g.drawString(value + "", j * 32, (length - i - 1) * 32); + } + } + } +}