Skip to content

Commit

Permalink
PNG import/export and Disasm export implemented !
Browse files Browse the repository at this point in the history
  • Loading branch information
wizardwhosaysni committed Sep 12, 2017
1 parent f598c9f commit 2ec93f7
Show file tree
Hide file tree
Showing 5 changed files with 150 additions and 73 deletions.
28 changes: 16 additions & 12 deletions src/com/sfc/sf2/battlesprite/BattleSpriteManager.java
Expand Up @@ -26,12 +26,14 @@ public class BattleSpriteManager {
public void importDisassembly(String filePath){
System.out.println("com.sfc.sf2.battlesprite.BattleSpriteManager.importDisassembly() - Importing disassembly ...");
battlesprite = DisassemblyManager.importDisassembly(filePath);
int blockColumnsNumber = (battlesprite.getType()==BattleSprite.TYPE_ALLY)?3:4;
tiles = new Tile[battlesprite.getFrames().length*blockColumnsNumber*4*12];
for(int i=0;i<battlesprite.getFrames().length;i++){
System.arraycopy(battlesprite.getFrames()[i], 0, tiles, i*blockColumnsNumber*4*12, blockColumnsNumber*4*12);
if(battlesprite.getFrames() != null && battlesprite.getFrames().length > 0){
int blockColumnsNumber = (battlesprite.getType()==BattleSprite.TYPE_ALLY)?3:4;
tiles = new Tile[battlesprite.getFrames().length*blockColumnsNumber*4*12];
for(int i=0;i<battlesprite.getFrames().length;i++){
System.arraycopy(battlesprite.getFrames()[i], 0, tiles, i*blockColumnsNumber*4*12, blockColumnsNumber*4*12);
}
graphicsManager.setTiles(tiles);
}
graphicsManager.setTiles(tiles);
System.out.println("com.sfc.sf2.battlesprite.BattleSpriteManager.importDisassembly() - Disassembly imported.");
}

Expand All @@ -44,19 +46,21 @@ public void exportDisassembly(String filepath, String animSpeed, String unknown)

public void importPng(String filepath, boolean usePngPalette){
System.out.println("com.sfc.sf2.battlesprite.BattleSpriteManager.importPng() - Importing PNG ...");
battlesprite = PngManager.importPng(filepath, battlesprite);
int blockColumnsNumber = (battlesprite.getType()==BattleSprite.TYPE_ALLY)?3:4;
tiles = new Tile[battlesprite.getFrames().length*blockColumnsNumber*4*12];
for(int i=0;i<battlesprite.getFrames().length;i++){
System.arraycopy(battlesprite.getFrames()[i], 0, tiles, i*blockColumnsNumber*4*12, blockColumnsNumber*4*12);
battlesprite = PngManager.importPng(filepath, battlesprite, usePngPalette);
if(battlesprite.getFrames() != null && battlesprite.getFrames().length > 0){
int blockColumnsNumber = (battlesprite.getType()==BattleSprite.TYPE_ALLY)?3:4;
tiles = new Tile[battlesprite.getFrames().length*blockColumnsNumber*4*12];
for(int i=0;i<battlesprite.getFrames().length;i++){
System.arraycopy(battlesprite.getFrames()[i], 0, tiles, i*blockColumnsNumber*4*12, blockColumnsNumber*4*12);
}
graphicsManager.setTiles(tiles);
}
graphicsManager.setTiles(tiles);
System.out.println("com.sfc.sf2.battlesprite.BattleSpriteManager.importPng() - PNG imported.");
}

public void exportPng(String filepath, int selectedPalette){
System.out.println("com.sfc.sf2.battlesprite.BattleSpriteManager.exportPng() - Exporting PNG ...");
PngManager.exportPng(battlesprite, filepath);
PngManager.exportPng(battlesprite, filepath, selectedPalette);
System.out.println("com.sfc.sf2.battlesprite.BattleSpriteManager.exportPng() - PNG exported.");
}

Expand Down
10 changes: 5 additions & 5 deletions src/com/sfc/sf2/battlesprite/gui/MainEditor.form
Expand Up @@ -480,7 +480,7 @@
</Component>
<Component class="javax.swing.JTextField" name="jTextField9">
<Properties>
<Property name="text" type="java.lang.String" value="D:\u005cSEGADEV\u005cGITHUB\u005cSF2DISASM\u005cdisasm\u005cdata\u005cgraphics\u005cbattles\u005cbattlesprites\u005callies\u005callybattlesprite00.bin" containsInvalidXMLChars="true"/>
<Property name="text" type="java.lang.String" value=".\u005callies\u005callybattlesprite01.bin" containsInvalidXMLChars="true"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jTextField9ActionPerformed"/>
Expand Down Expand Up @@ -521,7 +521,7 @@
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" attributes="0">
<Component id="jTextField11" max="32767" attributes="0"/>
<Component id="jTextField11" pref="311" max="32767" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="jButton17" min="-2" max="-2" attributes="0"/>
</Group>
Expand Down Expand Up @@ -569,7 +569,7 @@
</Component>
<Component class="javax.swing.JTextField" name="jTextField11">
<Properties>
<Property name="text" type="java.lang.String" value=".\u005cbattlesprite00" containsInvalidXMLChars="true"/>
<Property name="text" type="java.lang.String" value=".\u005callies\u005cbattlesprite01" containsInvalidXMLChars="true"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jTextField11ActionPerformed"/>
Expand Down Expand Up @@ -711,7 +711,7 @@
</Component>
<Component class="javax.swing.JTextField" name="jTextField13">
<Properties>
<Property name="text" type="java.lang.String" value=".\u005cnewbattlesprite00.bin" containsInvalidXMLChars="true"/>
<Property name="text" type="java.lang.String" value=".\u005callies\u005cnewallybattlesprite01.bin" containsInvalidXMLChars="true"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jTextField13ActionPerformed"/>
Expand Down Expand Up @@ -788,7 +788,7 @@
</Component>
<Component class="javax.swing.JTextField" name="jTextField15">
<Properties>
<Property name="text" type="java.lang.String" value=".\u005cbattlesprite00" containsInvalidXMLChars="true"/>
<Property name="text" type="java.lang.String" value=".\u005callies\u005cbattlesprite01" containsInvalidXMLChars="true"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jTextField15ActionPerformed"/>
Expand Down
11 changes: 6 additions & 5 deletions src/com/sfc/sf2/battlesprite/gui/MainEditor.java
Expand Up @@ -296,7 +296,7 @@ public void actionPerformed(java.awt.event.ActionEvent evt) {

jLabel2.setText("<html>Select a battlesprite file.<br/>Typical disassembly path : data/graphics/battles/battlesprites/</html>");

jTextField9.setText("D:\\SEGADEV\\GITHUB\\SF2DISASM\\disasm\\data\\graphics\\battles\\battlesprites\\allies\\allybattlesprite00.bin");
jTextField9.setText(".\\allies\\allybattlesprite01.bin");
jTextField9.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jTextField9ActionPerformed(evt);
Expand Down Expand Up @@ -349,7 +349,7 @@ public void actionPerformed(java.awt.event.ActionEvent evt) {

jLabel11.setText("Path prefix :");

jTextField11.setText(".\\battlesprite00");
jTextField11.setText(".\\allies\\battlesprite01");
jTextField11.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jTextField11ActionPerformed(evt);
Expand Down Expand Up @@ -386,7 +386,7 @@ public void actionPerformed(java.awt.event.ActionEvent evt) {
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel9Layout.createSequentialGroup()
.addComponent(jTextField11)
.addComponent(jTextField11, javax.swing.GroupLayout.DEFAULT_SIZE, 311, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jButton17))
.addGroup(jPanel9Layout.createSequentialGroup()
Expand Down Expand Up @@ -444,7 +444,7 @@ public void actionPerformed(java.awt.event.ActionEvent evt) {

jLabel14.setText("File :");

jTextField13.setText(".\\newbattlesprite00.bin");
jTextField13.setText(".\\allies\\newallybattlesprite01.bin");
jTextField13.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jTextField13ActionPerformed(evt);
Expand Down Expand Up @@ -495,7 +495,7 @@ public void actionPerformed(java.awt.event.ActionEvent evt) {

jLabel15.setText("Path prefix :");

jTextField15.setText(".\\battlesprite00");
jTextField15.setText(".\\allies\\battlesprite01");
jTextField15.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jTextField15ActionPerformed(evt);
Expand Down Expand Up @@ -657,6 +657,7 @@ private void jButton12ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIR
jPanel2.setLayout(new GridLayout(1,1));
BattleSpriteLayout battlespriteLayout = new BattleSpriteLayout();
battlespriteLayout.setTiles(tiles);
battlespriteLayout.setBattlespriteType(battlespriteManager.getBattleSprite().getType());
jPanel2.add(battlespriteLayout);
jPanel2.setSize(battlespriteLayout.getWidth(), battlespriteLayout.getHeight());
jPanel2.revalidate();
Expand Down
85 changes: 58 additions & 27 deletions src/com/sfc/sf2/battlesprite/io/DisassemblyManager.java
Expand Up @@ -60,14 +60,15 @@ public static BattleSprite importDisassembly(String filepath){
int frameOffset = 6+i*2 + getNextWord(data,6+i*2);
int dataLength = 0;
if((6+(i+1)*2)<palettesOffset){
dataLength = 6+i*2 + getNextWord(data,6+(i+1)*2) - frameOffset;
dataLength = 6+i*2 + getNextWord(data,6+(i+1)*2)+2 - frameOffset;
}else{
dataLength = data.length - frameOffset;
}
byte[] tileData = new byte[dataLength];
System.arraycopy(data, frameOffset, tileData, 0, dataLength);
Tile[] frame = new StackGraphicsDecoder().decodeStackGraphics(tileData, paletteList.get(0));
frameList.add(frame);
System.out.println("Frame "+i+" length="+dataLength+", offset="+frameOffset+", tiles="+frame.length);
}
battlesprite.setFrames(frameList.toArray(new Tile[frameList.size()][]));
if(battlesprite.getFrames()[0].length>144){
Expand All @@ -88,36 +89,66 @@ public static BattleSprite importDisassembly(String filepath){
public static void exportDisassembly(BattleSprite battlesprite, String filepath){
System.out.println("com.sfc.sf2.battlesprite.io.DisassemblyManager.exportDisassembly() - Exporting disassembly ...");
try{
/* byte[] eyeTiles = new byte[2+battlesprite.getEyeTiles().length*4];
eyeTiles[0] = 0;
eyeTiles[1] = (byte)(battlesprite.getEyeTiles().length & 0xFF);
for(int i=0;i<battlesprite.getEyeTiles().length;i++){
eyeTiles[2+i*4+0] = (byte)(battlesprite.getEyeTiles()[i][0] & 0xFF);
eyeTiles[2+i*4+1] = (byte)(battlesprite.getEyeTiles()[i][1] & 0xFF);
eyeTiles[2+i*4+2] = (byte)(battlesprite.getEyeTiles()[i][2] & 0xFF);
eyeTiles[2+i*4+3] = (byte)(battlesprite.getEyeTiles()[i][3] & 0xFF);


short animSpeed = (short)(battlesprite.getAnimSpeed()&0xFFFF);
short unknown = battlesprite.getUnknown();

Color[][] palettes = battlesprite.getPalettes();
byte[][] paletteBytes = new byte[palettes.length][];

Tile[][] frames = battlesprite.getFrames();

byte[][] frameBytes = new byte[frames.length][];
short[] frameOffsets = new short[frames.length];

short palettesOffset = (short) (frames.length * 2 + 2);

for(int i=0;i<palettes.length;i++){
PaletteEncoder.producePalette(palettes[i]);
paletteBytes[i] = PaletteEncoder.getNewPaletteFileBytes();
}
byte[] mouthTiles = new byte[2+battlesprite.getMouthTiles().length*4];
mouthTiles[0] = 0;
mouthTiles[1] = (byte)(battlesprite.getMouthTiles().length & 0xFF);
for(int i=0;i<battlesprite.getMouthTiles().length;i++){
mouthTiles[2+i*4+0] = (byte)(battlesprite.getMouthTiles()[i][0] & 0xFF);
mouthTiles[2+i*4+1] = (byte)(battlesprite.getMouthTiles()[i][1] & 0xFF);
mouthTiles[2+i*4+2] = (byte)(battlesprite.getMouthTiles()[i][2] & 0xFF);
mouthTiles[2+i*4+3] = (byte)(battlesprite.getMouthTiles()[i][3] & 0xFF);

int framesSize = 0;
int totalSize = 6 + frames.length * 2 + palettes.length * 32;
for(int i=0;i<frames.length;i++){
StackGraphicsEncoder.produceGraphics(frames[i]);
frameBytes[i] = StackGraphicsEncoder.getNewGraphicsFileBytes();
if(i==0){
frameOffsets[i] = (short)(frames.length * 2 + palettes.length * 32);
System.out.println("Frame "+i+" length="+frameBytes[i].length+", offset="+frameOffsets[i]);
}else{
int target = frameOffsets[i-1] + 6 + (i-1)*2 + frameBytes[i-1].length;
int offsetLocation = 6 + i*2;
frameOffsets[i] = (short)((target - offsetLocation)&0xFFFF);
System.out.println("Frame "+i+" length="+frameBytes[i].length+", offset="+frameOffsets[i]);
}
framesSize += frameBytes[i].length;
totalSize += frameBytes[i].length;
}

byte[] newBattleSpriteFileBytes = new byte[totalSize];

newBattleSpriteFileBytes[0] = (byte) ((animSpeed&0xFF00) >> 8);
newBattleSpriteFileBytes[1] = (byte) (animSpeed&0xFF);
newBattleSpriteFileBytes[2] = (byte) ((unknown&0xFF00) >> 8);
newBattleSpriteFileBytes[3] = (byte) (unknown&0xFF);
newBattleSpriteFileBytes[4] = (byte) ((palettesOffset&0xFF00) >> 8);
newBattleSpriteFileBytes[5] = (byte) (palettesOffset&0xFF);
for(int i=0;i<frameOffsets.length;i++){
newBattleSpriteFileBytes[6+i*2] = (byte) ((frameOffsets[i]&0xFF00) >> 8);
newBattleSpriteFileBytes[6+i*2+1] = (byte) (frameOffsets[i]&0xFF);
}
for(int i=0;i<paletteBytes.length;i++){
System.arraycopy(paletteBytes[i], 0, newBattleSpriteFileBytes, 6+frameOffsets.length*2+i*32, 32);
}
for(int i=0;i<frameBytes.length;i++){
System.out.println("Writing frame "+i+" with length="+frameBytes[i].length+" at offset="+(int)(frameOffsets[i]+6+i*2));
System.arraycopy(frameBytes[i], 0, newBattleSpriteFileBytes, frameOffsets[i]+6+i*2, frameBytes[i].length);
}
PaletteEncoder.producePalette(battlesprite.getTiles()[0].getPalette());
byte[] palette = PaletteEncoder.getNewPaletteFileBytes();
StackGraphicsEncoder.produceGraphics(battlesprite.getTiles());
byte[] tileset = StackGraphicsEncoder.getNewGraphicsFileBytes();
byte[] newBattleSpriteFileBytes = new byte[eyeTiles.length+mouthTiles.length+palette.length+tileset.length];
System.arraycopy(eyeTiles, 0, newBattleSpriteFileBytes, 0, eyeTiles.length);
System.arraycopy(mouthTiles, 0, newBattleSpriteFileBytes, eyeTiles.length, mouthTiles.length);
System.arraycopy(palette, 0, newBattleSpriteFileBytes, eyeTiles.length+mouthTiles.length, palette.length);
System.arraycopy(tileset, 0, newBattleSpriteFileBytes, eyeTiles.length+mouthTiles.length+palette.length, tileset.length);
Path graphicsFilePath = Paths.get(filepath);
Files.write(graphicsFilePath,newBattleSpriteFileBytes);
System.out.println(newBattleSpriteFileBytes.length + " bytes into " + graphicsFilePath); */
System.out.println(newBattleSpriteFileBytes.length + " bytes into " + graphicsFilePath);
} catch (Exception ex) {
Logger.getLogger(DisassemblyManager.class.getName()).log(Level.SEVERE, null, ex);
ex.printStackTrace();
Expand Down

0 comments on commit 2ec93f7

Please sign in to comment.