21.01.2012, 15:22
Vielleicht kann mir ja hier jemand auf die Sprünge helfen: Ich möchte gerne - wie so viele andere - eigene Porträts in Sternenschweif einbauen. Die Überlegung war, dass die Bilder ja IRGENDWO in den Spiel-Dateien vorhanden sein müssen. Also habe ich ein Programm geschrieben, dass alle Schweif-Dateien nach einem von mir angegebenem Muster durchsucht.
Im Detail sollte das folgendermaßen funktionieren:
Ich mache in DOSBox einen Screenshot und schaue mir die oberste Pixelreihe des ersten Zwergenporträts an ("Arbosh"). Daraus erkenne ich dieses Muster in den 32 Pixeln:
0 0 0 0 0 | 0 1 2 2 2 | 2 2 2 1 1 | 1 1 1 1 3 | 3 4 4 4 3 | 3 1 5 0 0 | 0 0
Die Trennstriche sind nur zur optischen Unterteilung da (alle 5 Pixel ein "|"). Das bedeutet: Alle Pixel, die dieselbe Farbe haben, erhalten dieselbe Zahl.
Mein Java-Programm parst nun ALLE Dateien von SCHWEIF und sucht nach diesem Muster. Allerdings erhalte ich keinen Treffer.
Das müsste heißen, dass die Bilder nicht pixelweise gespeichert sind. Aber wie sonst?? Hat hier irgendjemand eine Idee?
P.S.: Ich denke nicht, dass es an einem Fehler meines Programms liegt: In Schicksalsklinge habe ich die Porträts ohne Probleme gefunden.
Im Detail sollte das folgendermaßen funktionieren:
Ich mache in DOSBox einen Screenshot und schaue mir die oberste Pixelreihe des ersten Zwergenporträts an ("Arbosh"). Daraus erkenne ich dieses Muster in den 32 Pixeln:
0 0 0 0 0 | 0 1 2 2 2 | 2 2 2 1 1 | 1 1 1 1 3 | 3 4 4 4 3 | 3 1 5 0 0 | 0 0
Die Trennstriche sind nur zur optischen Unterteilung da (alle 5 Pixel ein "|"). Das bedeutet: Alle Pixel, die dieselbe Farbe haben, erhalten dieselbe Zahl.
Mein Java-Programm parst nun ALLE Dateien von SCHWEIF und sucht nach diesem Muster. Allerdings erhalte ich keinen Treffer.
Das müsste heißen, dass die Bilder nicht pixelweise gespeichert sind. Aber wie sonst?? Hat hier irgendjemand eine Idee?
P.S.: Ich denke nicht, dass es an einem Fehler meines Programms liegt: In Schicksalsklinge habe ich die Porträts ohne Probleme gefunden.
Code:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
class Program
{
//Arbosh (DSA 2):
int[] pattern={0,0,0,0,0,0,1,2,2,2,2,2,2,1,1,1,1,1,1,3,3,4,4,4,3,3,1,5,0,0,0,0};
int[] zeile=new int[pattern.length];
boolean[][] patternMatrix;
public static void main(String[] args)
{
Program p=new Program();
p.whenProgramStarts();
}
/**
* Spiegelt das Pattern, wird nicht benutzt, war nur zum ausprobieren
*/
void reflectPattern(){
int[] patternCopy=new int[pattern.length];
for(int i=0;i<pattern.length;i++)
patternCopy[i]=pattern[i];
for(int i=0;i<pattern.length;i++)
pattern[i]=patternCopy[pattern.length-1-i];
}
void genPatternMatrix(){
//maximale Zahl in pattern suchen:
int max=0;
for(int i=0;i<pattern.length;i++){
if(pattern[i]>max){
max=pattern[i];
}
}
max++;
patternMatrix=new boolean[max][pattern.length];
for(int i=0;i<max;i++)
for(int j=0;j<pattern.length;j++)
patternMatrix[i][j]=false;
for(int i=0;i<max;i++){
for(int j=0;j<pattern.length;j++){
patternMatrix[i][j]=(pattern[j]==i);
}
}
}
void shiftAndAppend(int newByte){
for(int i=0;i<pattern.length-1;i++){
zeile[i]=zeile[i+1];
}
zeile[pattern.length-1]=newByte;
}
boolean match(){
for(int patternCode=0;patternCode<patternMatrix.length;patternCode++){
int pos=0;
while(!patternMatrix[patternCode][pos])
pos++;
int colorCandidate=zeile[pos];
for(int index=0;index<patternMatrix[0].length;index++){
if(patternMatrix[patternCode][index]){
if(zeile[index]!=colorCandidate){
return false;
}
}else{
if(zeile[index]==colorCandidate){
return false;
}
}
}
}
return true;
}
void checkFile(File f){
// System.out.println("Start File "+f.getName());
if(f.isDirectory()){
for (File fi : f.listFiles()) {
checkFile(fi);
}
}else{
long offset=0;
int currentByte=-1;
try {
InputStream is=new FileInputStream(f);
for(int i=0;i<pattern.length;i++){
currentByte=is.read();
zeile[i]=currentByte;
}
while(currentByte!=-1){
boolean matches=match();
if(matches){
System.out.println("*******************************Treffer: Offset="+offset);
printZeile();
}
currentByte=is.read();
offset++;
shiftAndAppend(currentByte);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("Ende File "+f.getName());
}
void printZeile(){
for(int i=0;i<zeile.length;i++)
System.out.print(zeile[i]);
}
void whenProgramStarts()
{
System.out.println("***********START****************");
genPatternMatrix();
File dir;
//CD durchsuchen:
dir=new File("../../../Spiele/SCHWEIF/");
checkFile(dir);
System.out.println("Ende");
}
}