示例#1
0
        public void addDialoge(ref byte[] data, List<CDSAFileLoader.CFileSet> TLKs, DSAVersion version)
        {
            foreach (CDSAFileLoader.CFileSet set in TLKs)
            {
                this.itsDialoge.Add(new KeyValuePair<string, CDialog>(set.filename, new CDialog(ref data, set, version)));
            }

            CDebugger.addDebugLine("Dialoge wurden erfolgreich geladen");
        }
示例#2
0
        public void addMonsters(ref byte[] data, CDSAFileLoader.CFileSet monster_dat, CDSAFileLoader.CFileSet monstername, DSAVersion version)
        {
            itsMonsterStats.Clear();

            if (data == null)
                return;

            if (monster_dat != null)
            {
                //blocklänge 44Bytes
                Int32 blockLength = 44;

                if (version == DSAVersion.Schweif)
                    blockLength = 48;

                Int32 position = monster_dat.startOffset;
                while ((position + blockLength) < monster_dat.endOffset)
                {
                    itsMonsterStats.Add(new CMonsterStats(ref data, position, version));
                    position += blockLength;
                }
                CDebugger.addDebugLine("Monster: MONSTER.DAT wurde erfolgreich extrahiert");
            }
            else
                CDebugger.addDebugLine("Monster: MONSTER.DAT konnte nicht extrahiert werden");

            if (monstername != null)
            {
                itsMonsterNames.Clear();

                // alle Texte der Datei auslesen
                Int32 position = monstername.startOffset;

                string text = CHelpFunctions.readDSAString(ref data, ref position, 0, monstername.endOffset);
                itsMonsterNames.Add(text);
                position++;

                while ((position) < monstername.endOffset)
                {
                    text = CHelpFunctions.readDSAString(ref data, ref position, 0, monstername.endOffset);
                    itsMonsterNames.Add(text);
                    position++;
                }
                CDebugger.addDebugLine("Monster: MONSTERNAME wurde erfolgreich extrahiert");
            }
            else
                CDebugger.addDebugLine("Monster: MONSTERNAME konnte nicht extrahiert werden");
        }
示例#3
0
        public void addItems(ref byte[] data, CDSAFileLoader.CFileSet items_dat, CDSAFileLoader.CFileSet itemname, DSAVersion version)
        {
            if (data == null)
                return;

            if (items_dat != null)
            {
                //blocklänge 12Bytes
                Int32 blockLength = 12;
                if (version == DSAVersion.Schweif)
                    blockLength = 14;

                Int32 position = items_dat.startOffset;
                while ((position + blockLength) < items_dat.endOffset)
                {
                    itsItems.Add(new CItem(ref data, position, version));
                    position += blockLength;
                }
                CDebugger.addDebugLine("Items: ITEM.DAT wurde erfolgreich extrahiert");
            }
            else
                CDebugger.addDebugLine("Items: ITEM.DAT konnte nicht extrahiert werden");

            if (itemname != null)
            {
                // alle Texte der Datei auslesen
                Int32 position = itemname.startOffset;

                string text = CHelpFunctions.readDSAString(ref data, ref position, 0, itemname.endOffset);
                itsItemNames.Add(text);
                position++;

                while (position < itemname.endOffset)
                {
                    text = CHelpFunctions.readDSAString(ref data, ref position, 0, itemname.endOffset);
                    itsItemNames.Add(text);
                    position++;
                }
                CDebugger.addDebugLine("Items: ITEMNAME wurde erfolgreich extrahiert");
            }
            else
                CDebugger.addDebugLine("Items: ITEMNAME konnte nicht extrahiert werden");
        }
示例#4
0
        public Image getMonsterImageByID(Int32 MonsterBildID, DSAVersion version)
        {
            switch (version)
            {
                case DSAVersion.Blade:
                case DSAVersion.Schick:
                    return this.getMonsterImageByID_DSA_1(MonsterBildID);

                case DSAVersion.Schweif:
                    return this.getMonsterImageByID_DSA_2(MonsterBildID);

                default:
                    return null;
            }
        }
示例#5
0
        //fügt den Bildern ein einzelnes Bild hinzu
        public void addPictureToList(ref byte[] data, CDSAFileLoader.CFileSet NVF, DSAVersion version)
        {
            if (data == null || NVF == null)
                return;

            this.itsImages.Add(new KeyValuePair<string, List<Image>>(NVF.filename, this.loadNVF(ref data, NVF, version)));
        }
示例#6
0
        public void addPictures(ref byte[] MAIN_DAT, List<CDSAFileLoader.CFileSet> MAIN_NVFs, DSAVersion version)
        {
            if (MAIN_DAT == null || MAIN_NVFs == null)
                return;

            if (MAIN_NVFs.Count == 0)
                CDebugger.addDebugLine("Bilder: keine NVF Dateien gefunden");
            else
                CDebugger.addDebugLine("Bilder: es wurden " + MAIN_NVFs.Count.ToString() + " NVF Dateien gefunden");

            foreach (CDSAFileLoader.CFileSet fileset in MAIN_NVFs)
            {
                this.itsImages.Add(new KeyValuePair<string, List<Image>>(fileset.filename, this.loadNVF(ref MAIN_DAT, fileset, version)));
            }
        }
示例#7
0
        //fügt den Animationen ein Archiv hinzu
        public void addArchivToList(ref byte[] data, CDSAFileLoader.CFileSet ARCHIV, CDSAFileLoader.CFileSet TAB, DSAVersion version)
        {
            if (data == null || ARCHIV == null || TAB == null)
                return;

            CDebugger.addDebugLine("Bild Archiv " + ARCHIV.filename + " wird geladen. Bitte warten...");

            List<Int32> offsets = new List<int>();

            //TAB enthält offsets mit Int32
            for (Int32 i = TAB.startOffset; i < TAB.endOffset; i += 4)
            {
                offsets.Add(CHelpFunctions.byteArrayToInt32(ref data, i));  //letzter eintrag in der TAB ist das offset des endes des letzten bildes
            }

            CDSAFileLoader.CFileSet fileSet;
            List<List<Image>> list = new List<List<Image>>(); ;
            for (int i = 0; i < offsets.Count - 1; i++)
            {
                try
                {
                    fileSet = new CDSAFileLoader.CFileSet(ARCHIV.filename, ARCHIV.startOffset + offsets[i], ARCHIV.startOffset + offsets[i + 1]);
                    list.Add(this.loadNVF(ref data, fileSet, version));
                }
                catch (SystemException e)
                {
                    CDebugger.addErrorLine("Fehler beim Entpacken des Archivs " + ARCHIV.filename+" Bild "+i.ToString()+": "+e.Message);
                }
            }

            //this.itsImages.Add(new KeyValuePair<string, List<Image>>(ARCHIV.filename, images));
            this.itsAnimations.Add(new KeyValuePair<string, List<List<Image>>>(ARCHIV.filename, list));
            CDebugger.addDebugLine(list.Count.ToString() + " Animationen wurden aus dem Archiv " + ARCHIV.filename + " geladen");
        }
示例#8
0
        private List<Image> loadImageWithoutHeader(ref byte[] data, CDSAFileLoader.CFileSet NVF, CImageHeader header, DSAVersion version)
        {
            List<Image> images = new List<Image>();

            if (header == null)
            {
                CDebugger.addErrorLine("Fehler beim laden der Datei " + NVF.filename + " (es wurde kein Header übergeben)");
                return images;
            }

            //int position = NVF.startOffset + header.height * header.width;
            int position = NVF.endOffset - header.anzahlFarben*3 - 2;

            Color[] colors = null;
            int helpvalue = 0;
            int anzahlFarben = 0;
            if (header.anzahlFarben != 0)
            {
                anzahlFarben = CHelpFunctions.byteArrayToInt16(ref data, position);

                if (anzahlFarben != header.anzahlFarben)
                    CDebugger.addErrorLine("Anzahl der Farben in der Datei " + NVF.filename + " wurde nicht korrekt angegeben (" + anzahlFarben.ToString() + ")");

                helpvalue = 2;
                position += 2;

                try
                {
                    colors = new Color[anzahlFarben];
                    for (int i = 0; i < anzahlFarben; i++)
                    {
                        colors[i] = Color.FromArgb((byte)(data[position++] * 4), (byte)(data[position++] * 4), (byte)(data[position++] * 4));
                    }
                }
                catch(SystemException)
                {
                    CDebugger.addErrorLine("Fehler beim Laden der Farbpaltte in der Datei " + NVF.filename + " (kein Header)");
                    return images;
                }
            }

            position = NVF.startOffset;
            CFarbPalette.palettenTyp typ = this.getPalettenTyp(NVF.filename, version);

            while ((position + header.height*header.width + anzahlFarben + helpvalue) <= NVF.endOffset)    //solange das ende der Datei nicht erreicht ist, sind noch bilder vorhanden
            {
                Bitmap image = new Bitmap(header.width, header.height);

                for (int y = 0; y < header.height; y++)
                {
                    for (int x = 0; x < header.width; x++)
                    {
                        if (header.anzahlFarben == 0)
                            image.SetPixel(x, y, CFarbPalette.getColor(typ, data[position]));
                        else
                            image.SetPixel(x, y, colors[data[position] % colors.Length]);

                        position++;
                    }
                }

                images.Add(image);
            }

            return images;
        }
示例#9
0
        private CFarbPalette.palettenTyp getPalettenTyp(string filename, DSAVersion version)
        {
            switch (version)
            {
                case DSAVersion.Blade:
                case DSAVersion.Schick:
                    foreach (string s in itsTownPictures_SCHICK)
                    {
                        if (s == filename)
                            return CFarbPalette.palettenTyp.Town_Pal;
                    }

                    foreach (string s in itsFightPictures_SCHICK)
                    {
                        if (s == filename)
                            return CFarbPalette.palettenTyp.Fight_Pal;
                    }

                    foreach (string s in itsCharMenüPictures_SCHICK)
                    {
                        if (s == filename)
                            return CFarbPalette.palettenTyp.CharMenü_Pal;
                    }

                    if (filename == "ATTIC")
                        return CFarbPalette.palettenTyp.Logo_Attic;

                    if (filename == "DSALOGO.DAT")
                        return CFarbPalette.palettenTyp.GEN_Pal;

                    if (filename == "GENTIT.DAT")
                        return CFarbPalette.palettenTyp.GEN_Pal;

                    if (filename == "ROALOGUS.DAT")
                        return CFarbPalette.palettenTyp.GEN_Pal;

                    return CFarbPalette.palettenTyp.default_Pal;

                case DSAVersion.Schweif:
                    return CFarbPalette.palettenTyp.default_Pal;

                default:
                    return CFarbPalette.palettenTyp.default_Pal;
            }
        }
示例#10
0
            public CMonsterStats(ref byte[] data, Int32 position, DSAVersion version)
            {
                switch (version)
                {
                    case DSAVersion.Blade:
                    case DSAVersion.Schick:
                        this.MonsterID = data[position];
                        this.MonsterGraphicID = data[position + 1];
                        this.RS = (sbyte)data[position + 2];

                        this.MU_Würfel[0] = data[position + 3]; this.MU_Würfel[1] = data[position + 4];
                        this.KL_Würfel[0] = data[position + 5]; this.KL_Würfel[1] = data[position + 6];
                        this.CH_Würfel[0] = data[position + 7]; this.CH_Würfel[1] = data[position + 8];
                        this.FF_Würfel[0] = data[position + 9]; this.FF_Würfel[1] = data[position + 10];
                        this.GE_Würfel[0] = data[position + 11]; this.GE_Würfel[1] = data[position + 12];
                        this.IN_Würfel[0] = data[position + 13]; this.IN_Würfel[1] = data[position + 14];
                        this.KK_Würfel[0] = data[position + 15]; this.KK_Würfel[1] = data[position + 16];
                        this.LE_Würfel[0] = data[position + 17]; this.LE_Würfel[1] = data[position + 18];
                        this.AE_Würfel[0] = data[position + 19]; this.AE_Würfel[1] = data[position + 20];

                        this.MR_Würfel[0] = data[position + 21]; this.MR_Würfel[1] = data[position + 22];
                        this.erstAP = data[position + 23];
                        this.Anzahl_Attacken = data[position + 24];

                        this.AT = (sbyte)data[position + 25];
                        this.PA = (sbyte)data[position + 26];

                        this.Schaden_1_Angriff_Würfel[0] = data[position + 27]; this.Schaden_1_Angriff_Würfel[1] = data[position + 28];
                        this.Schaden_2_Angriff_Würfel[0] = data[position + 29]; this.Schaden_2_Angriff_Würfel[1] = data[position + 30];

                        this.BP = data[position + 31];

                        this.Immunität_gegen_Normale_Waffen = data[position + 32];
                        this.ID_Magierklasse = (sbyte)data[position + 33];
                        this.Stufe = data[position + 34];

                        this.Größenklasse = data[position + 35];
                        this.MonsterTyp = data[position + 36];

                        this.Anzahl_Geschosse = data[position + 37];
                        this.Schaden_Schusswaffen_Würfel[0] = data[position + 38]; this.Schaden_Schusswaffen_Würfel[1] = data[position + 39];
                        this.Anzahl_Wurfwaffen = data[position + 40];
                        this.Schaden_Wurfwaffen_Würfel[0] = data[position + 41]; this.Schaden_Wurfwaffen_Würfel[1] = data[position + 42];

                        this.Flucht_Bei_XX_LP = data[position + 43];
                        break;

                    case DSAVersion.Schweif:
                        this.MonsterID = data[position];
                        this.MonsterGraphicID = data[position + 1];
                        this.RS = (sbyte)data[position + 2];

                        this.unbekannterWert_1_DSA_2 = data[position + 3];

                        this.MU_Würfel[0] = data[position + 4]; this.MU_Würfel[1] = data[position + 5];
                        this.KL_Würfel[0] = data[position + 6]; this.KL_Würfel[1] = data[position + 7];
                        this.CH_Würfel[0] = data[position + 8]; this.CH_Würfel[1] = data[position + 9];
                        this.FF_Würfel[0] = data[position + 10]; this.FF_Würfel[1] = data[position + 11];
                        this.GE_Würfel[0] = data[position + 12]; this.GE_Würfel[1] = data[position + 13];
                        this.IN_Würfel[0] = data[position + 14]; this.IN_Würfel[1] = data[position + 15];
                        this.KK_Würfel[0] = data[position + 16]; this.KK_Würfel[1] = data[position + 17];
                        this.LE_Würfel[0] = data[position + 18]; this.LE_Würfel[1] = data[position + 19];
                        this.AE_Würfel[0] = data[position + 20]; this.AE_Würfel[1] = data[position + 21];

                        this.MR_Würfel[0] = data[position + 22]; this.MR_Würfel[1] = data[position + 23];
                        this.erstAP = data[position + 24];
                        this.Anzahl_Attacken = data[position + 25];

                        this.AT = (sbyte)data[position + 26];
                        this.PA = (sbyte)data[position + 27];

                        this.Schaden_1_Angriff_Würfel[0] = data[position + 28]; this.Schaden_1_Angriff_Würfel[1] = data[position + 29];
                        this.Schaden_2_Angriff_Würfel[0] = data[position + 30]; this.Schaden_2_Angriff_Würfel[1] = data[position + 31];

                        this.BP = data[position + 32];

                        this.Immunität_gegen_Normale_Waffen = data[position + 33];
                        this.ID_Magierklasse = (sbyte)data[position + 34];
                        this.Stufe = data[position + 35];

                        this.Größenklasse = data[position + 36];
                        this.MonsterTyp = data[position + 37];

                        this.unbekannterWert_2_DSA_2 = data[position + 38];
                        this.unbekannterWert_3_DSA_2 = data[position + 39];

                        //-------------------------------------------
                        this.Anzahl_Geschosse = data[position + 40];
                        this.Schaden_Schusswaffen_Würfel[0] = data[position + 41]; this.Schaden_Schusswaffen_Würfel[1] = data[position + 42];
                        this.Anzahl_Wurfwaffen = data[position + 43];
                        this.Schaden_Wurfwaffen_Würfel[0] = data[position + 44]; this.Schaden_Wurfwaffen_Würfel[1] = data[position + 45];

                        this.Flucht_Bei_XX_LP = data[position + 46];

                        this.unbekannterWert_4_DSA_2 = data[position + 47];

                        break;
                }
            }
示例#11
0
            public string AnziehbarAnPositionToString(DSAVersion version)
            {
                switch (version)
                {
                    case DSAVersion.Blade:
                    case DSAVersion.Schick:
                        if ((this.ItemTyp & 0x01) != 0)
                        {
                            switch (this.AnziehbarAnPosition)
                            {
                                case 0:
                                    return ("Kopf(" + AnziehbarAnPosition.ToString() + ")");
                                case 1:
                                    return ("Arme(" + AnziehbarAnPosition.ToString() + ")");
                                case 2:
                                    return ("Brust(" + AnziehbarAnPosition.ToString() + ")");
                                case 5:
                                    return ("Beine(" + AnziehbarAnPosition.ToString() + ")");
                                case 6:
                                    return ("Schuhe(" + AnziehbarAnPosition.ToString() + ")");
                                case 9:
                                    return ("Schildhand(" + AnziehbarAnPosition.ToString() + ")");
                            }
                        }
                        else if ((this.ItemTyp & 0x02) != 0)
                        {
                            switch (this.AnziehbarAnPosition)
                            {
                                case 0:
                                    return ("Waffenlos(Pfeile|Bolzen)(" + AnziehbarAnPosition.ToString() + ")");
                                case 1:
                                    return ("Hiebwaffe(" + AnziehbarAnPosition.ToString() + ")");
                                case 2:
                                    return ("Stichwaffe(" + AnziehbarAnPosition.ToString() + ")");
                                case 3:
                                    return ("Schwerter(" + AnziehbarAnPosition.ToString() + ")");
                                case 4:
                                    return ("Äxte(" + AnziehbarAnPosition.ToString() + ")");
                                case 5:
                                    return ("Speere(" + AnziehbarAnPosition.ToString() + ")");
                                case 6:
                                    return ("Zweihänder(" + AnziehbarAnPosition.ToString() + ")");
                                case 7:
                                    return ("Schusswaffe(" + AnziehbarAnPosition.ToString() + ")");
                                case 8:
                                    return ("Wurfwaffe(" + AnziehbarAnPosition.ToString() + ")");
                            }
                        }
                        else if (AnziehbarAnPosition == 0)
                            return ("Gegenstand(" + AnziehbarAnPosition.ToString() + ")");

                        break;

                    //-------------------------------------------------------------
                    case DSAVersion.Schweif:
                        if ((this.ItemTyp & 0x01) != 0)
                        {
                            switch (this.AnziehbarAnPosition)
                            {
                                case 0:
                                    return ("Kopf(" + AnziehbarAnPosition.ToString() + ")");
                                case 1:
                                    return ("Arme(" + AnziehbarAnPosition.ToString() + ")");
                                //case 2:
                                //    return ("Brust(" + AnziehbarAnPosition.ToString() + ")");
                                case 5:
                                    return ("Beine(" + AnziehbarAnPosition.ToString() + ")");
                                //case 6:
                                //    return ("Schuhe(" + AnziehbarAnPosition.ToString() + ")");
                                case 9:
                                    return ("Schildhand(" + AnziehbarAnPosition.ToString() + ")");
                                case 10:
                                    return ("Brust(" + AnziehbarAnPosition.ToString() + ")");
                                case 14:
                                    return ("Schuhe(" + AnziehbarAnPosition.ToString() + ")");
                            }
                        }
                        else if ((this.ItemTyp & 0x02) != 0)
                        {
                            switch (this.AnziehbarAnPosition)
                            {
                                case 0:
                                    return ("Waffenlos(Pfeile|Bolzen)(" + AnziehbarAnPosition.ToString() + ")");
                                case 1:
                                    return ("Hiebwaffe(" + AnziehbarAnPosition.ToString() + ")");
                                case 2:
                                    return ("Stichwaffe(" + AnziehbarAnPosition.ToString() + ")");
                                case 3:
                                    return ("Schwerter(" + AnziehbarAnPosition.ToString() + ")");
                                case 4:
                                    return ("Äxte(" + AnziehbarAnPosition.ToString() + ")");
                                case 5:
                                    return ("Speere(" + AnziehbarAnPosition.ToString() + ")");
                                case 6:
                                    return ("Zweihänder(" + AnziehbarAnPosition.ToString() + ")");
                                case 7:
                                    return ("Schusswaffe(" + AnziehbarAnPosition.ToString() + ")");
                                case 8:
                                    return ("Wurfwaffe(" + AnziehbarAnPosition.ToString() + ")");
                            }
                        }
                        else if ((this.ItemTyp & 0x08) != 0)
                        {
                            switch (this.AnziehbarAnPosition)
                            {
                                case 0:
                                    return ("Trinken(" + AnziehbarAnPosition.ToString() + ")");
                                case 1:
                                    return ("Essen(" + AnziehbarAnPosition.ToString() + ")");
                            }
                        }
                        else if ((this.ItemTyp & 0x20) != 0)
                        {
                            switch (this.AnziehbarAnPosition)
                            {
                                case 0:
                                    return ("Kräuter(" + AnziehbarAnPosition.ToString() + ")");
                                case 1:
                                    return ("Trank(" + AnziehbarAnPosition.ToString() + ")");
                            }
                        }
                        else if (AnziehbarAnPosition == 0)
                            return ("Gegenstand(" + AnziehbarAnPosition.ToString() + ")");

                        break;
                }

                return ("???(" + AnziehbarAnPosition.ToString() + ")");
            }
示例#12
0
            public CItem(ref byte[] data, int position, DSAVersion version)
            {
                switch (version)
                {
                    case DSAVersion.Blade:
                    case DSAVersion.Schick:
                        this.IconID = CHelpFunctions.byteArrayToInt16(ref data, position);
                        this.ItemTyp = data[position + 2];
                        this.AnziehbarAnPosition = data[position + 3];
                        this.Gewicht = CHelpFunctions.byteArrayToInt16(ref data, position + 5);
                        this.Preis_Grundeinheit = data[position + 7];
                        this.Preis = CHelpFunctions.byteArrayToInt16(ref data, position + 8);
                        this.SortimentsID = data[position + 10];
                        this.Magisch = data[position + 11];
                        break;

                    case DSAVersion.Schweif:
                        this.IconID = CHelpFunctions.byteArrayToInt16(ref data, position);
                        this.ItemTyp = data[position + 2];

                        //position 3 + 5 sind noch unbekannt
                        this.erweiterterTyp = data[position + 3];

                        this.AnziehbarAnPosition = data[position + 4];

                        this.unbekannt_2_DSA2 = data[position + 5];

                        this.Gewicht = CHelpFunctions.byteArrayToInt16(ref data, position + 6);
                        this.Preis = CHelpFunctions.byteArrayToInt16(ref data, position + 8);
                        this.Preis_Grundeinheit = data[position + 10];
                        this.SortimentsID = data[position + 11];

                        this.Magisch = data[position + 12];
                        break;
                }
            }
示例#13
0
            //---------------------------------
            public CGesprächspartner(ref byte[] data, Int32 position, DSAVersion version)
            {
                switch (version)
                {
                    case DSAVersion.Blade:
                    case DSAVersion.Schick:
                        this.loadDSA1(ref data, position);
                        break;

                    case DSAVersion.Schweif:
                        this.loadDSA2(ref data, position);
                        break;
                }
            }
示例#14
0
        private bool checkForRLEPackedFile(string filename, DSAVersion version)
        {
            switch(version)
            {
                case DSAVersion.Blade:
                case DSAVersion.Schick:
                    foreach (string s in this.itsRLEPackedFiles_DSAGEN)
                    {
                        if (s == filename)
                            return true;
                    }

                    return false;

                case DSAVersion.Schweif:
                    foreach (string s in this.itsRLEPackedFiles_SCHWEIF)
                    {
                        if (s == filename)
                            return true;
                    }

                    return false;

                default:
                    return false;
            }
        }
示例#15
0
        public bool unpackAll(string directoryPath)
        {
            CDebugger.clearDebugText();

            this.itsDSAGENOffsets.Clear();
            this.itsSCHICKFilenames.Clear();
            this.itsSCHICKOffsets.Clear();
            this.SCHICK_DAT = null;
            this.DSAGEN_DAT = null;

            foreach (DSA2_Archiv archiv in this.DSA2_Archive)
            {
                archiv.data_Install = null;
                archiv.data_CD = null;
                archiv.entries_Install.Clear();
                archiv.entries_CD.Clear();
            }

            bool found = false;

            List<string> files = new List<string>();
            files.AddRange(Directory.GetFiles(directoryPath));

            if (files.Count == 0)
            {
                CDebugger.addErrorLine("keine .exe Dateien gefunden");
                return false;
            }

            foreach (string filepath in files)
            {
                if (String.Compare("SCHICKM.EXE", Path.GetFileName(filepath), true) == 0)
                {
                    Properties.Settings.Default.DefaultDSAPath = directoryPath;
                    Properties.Settings.Default.Save();

                    CDebugger.addDebugLine("SCHICKM.EXE wurde erkannt ");
                    this.loadFilenames_DSA_1(filepath);   //  dateinamen sind in der exe verankert

                    foreach (string s in files)
                    {
                        if (this.SCHICK_DAT == null && String.Compare("SCHICK.DAT", Path.GetFileName(s), true) == 0)
                            this.unpack_SCHICK(s);
                        if (this.DSAGEN_DAT == null && String.Compare("DSAGEN.DAT", Path.GetFileName(s), true) == 0)
                            this.unpack_DSAGEN(s);
                    }

                    if (this.SCHICK_DAT == null || this.DSAGEN_DAT == null)
                    {
                        CDebugger.addErrorLine("Fehler beim laden der .DAT Dateien");
                        return false;
                    }

                    found = true;
                    this._version = DSAVersion.Schick;
                    break;
                }
                else if (String.Compare("BLADEM.EXE", Path.GetFileName(filepath), true) == 0)
                {
                    Properties.Settings.Default.DefaultDSAPath = directoryPath;
                    Properties.Settings.Default.Save();

                    CDebugger.addDebugLine("BLADEM.EXE wurde erkannt ");
                    this.loadFilenames_DSA_1(filepath);   //  dateinamen sind in der exe verankert

                    foreach (string s in files)
                    {
                        if (this.SCHICK_DAT == null && String.Compare("BLADE.DAT", Path.GetFileName(s), true) == 0)
                            this.unpack_SCHICK(s);

                        if (this.DSAGEN_DAT == null && String.Compare("DSAGEN.DAT", Path.GetFileName(s), true) == 0)
                            this.unpack_DSAGEN(s);
                    }

                    if (this.SCHICK_DAT == null || this.DSAGEN_DAT == null)
                    {
                        CDebugger.addErrorLine("Fehler beim laden der .DAT Dateien");
                        return false;
                    }

                    found = true;
                    this._version = DSAVersion.Blade;
                    break;
                }
                else if (String.Compare("SCHWEIF.EXE", Path.GetFileName(filepath), true) == 0)
                {
                    Properties.Settings.Default.DefaultDSAPath = directoryPath;
                    Properties.Settings.Default.Save();

                    CDebugger.addDebugLine("SCHWEIF.EXE wurde erkannt ");

                    this._version = DSAVersion.Schweif;

                    string[] helper = Directory.GetDirectories(directoryPath);
                    foreach (var s in helper)
                    {
                        if (String.Compare(new DirectoryInfo(s).Name, "DATA", true) == 0)
                        {
                            this.unpack_SCHWEIF(s);
                            found = true;
                            break;
                        }
                    }
                    if (!found)
                    {
                        CDebugger.addErrorLine("DATA Verzeichnis wurde nicht gefunden");
                        return false;
                    }

                    break;
                }
                else if (String.Compare("STAR.EXE", Path.GetFileName(filepath), true) == 0)
                {
                    Properties.Settings.Default.DefaultDSAPath = directoryPath;
                    Properties.Settings.Default.Save();

                    CDebugger.addDebugLine("STAR.EXE wurde erkannt ");

                    this._version = DSAVersion.Schweif;

                    string[] helper = Directory.GetDirectories(directoryPath);
                    foreach (var s in helper)
                    {
                        if (String.Compare(new DirectoryInfo(s).Name, "DATA", true) == 0)
                        {
                            this.unpack_SCHWEIF(s);
                            found = true;
                            break;
                        }
                    }
                    if (!found)
                    {
                        CDebugger.addErrorLine("DATA Verzeichnis wurde nicht gefunden");
                        return false;
                    }

                    break;
                }
            }

            if (!found)
            {
                CDebugger.addErrorLine("DSA Version konnte nicht erkannt werden");
                string[] exe_Files = Directory.GetFiles(directoryPath, "*.exe");
                string[] EXE_Files = Directory.GetFiles(directoryPath, "*.EXE");
                CDebugger.addErrorLine("es wurden " + (exe_Files.Length + EXE_Files.Length).ToString() + " .exe Dateien gefunden:");
                if (exe_Files.Length > 0)
                {
                    foreach (string s in exe_Files)
                        CDebugger.addErrorLine("  - exe: " + s);
                    foreach (string s in EXE_Files)
                        CDebugger.addErrorLine("  - EXE: " + s);
                }
                return false;
            }

            return true;
        }
示例#16
0
        private CImageHeader checkForSpezialFile(string filename, DSAVersion version)
        {
            switch (version)
            {
                case DSAVersion.Blade:
                case DSAVersion.Schick:
                    foreach (KeyValuePair<string,CImageHeader> pair in this.itsSpezialFiles_SCHICK)
                    {
                        if (pair.Key == filename)
                            return pair.Value;
                    }
                    foreach (KeyValuePair<string, CImageHeader> pair in this.itsSpezialFiles_DSAGEN)
                    {
                        if (pair.Key == filename)
                            return pair.Value;
                    }
                    return null;

                case DSAVersion.Schweif:
                    foreach (KeyValuePair<string,CImageHeader> pair in this.itsSpezialFiles_SCHWEIF)
                    {
                        if (pair.Key == filename)
                            return pair.Value;
                    }
                    return null;

                default:
                    return null;
            }
        }
示例#17
0
        private List<Image> loadRLEImage(ref byte[] data, CDSAFileLoader.CFileSet NVF, DSAVersion version)
        {
            List<Image> images = new List<Image>();
            int beginOfDataBlock;
            int dataBlocklength = 0;
            int headerblocklength;

            int offset = NVF.startOffset;

            //-------------Header auslesen----------------------------
            int anzahlBilder = CHelpFunctions.byteArrayToInt16(ref data, offset + 1);
            int[] width = new int[anzahlBilder];
            int[] height = new int[anzahlBilder];

            if ((data[offset] & 0x01) == 0)
                headerblocklength = 4;
            else
                headerblocklength = 8;

            int position = offset + 3;

            //int helpvalue = 0;  //gibt die Länge eines Datenblocks an
            if ((data[offset] & 0x01) != 0)
            {
                //unterschiedliche Auflösungen der Bilder
                for (int i = 0; i < anzahlBilder; i++)
                {
                    width[i] = CHelpFunctions.byteArrayToInt16(ref data, position);
                    height[i] = CHelpFunctions.byteArrayToInt16(ref data, position + 2);

                    int value = CHelpFunctions.byteArrayToInt32(ref data, position + 4);
                    dataBlocklength += value;

                    position += headerblocklength;
                }
            }
            else
            {
                //gleiche Auflösungen der Bilder
                int tempwidth = CHelpFunctions.byteArrayToInt16(ref data, position);
                int tempheight = CHelpFunctions.byteArrayToInt16(ref data, position + 2);

                position += 4;

                for (int i = 0; i < anzahlBilder; i++)
                {
                    width[i] = tempwidth;
                    height[i] = tempheight;

                    int value = CHelpFunctions.byteArrayToInt32(ref data, position);
                    dataBlocklength += value;

                    position += headerblocklength;
                }
            }

            beginOfDataBlock = position;    //am ende des headers beginnt der Datenblock

            //---------Prüfen ob Farbpalette am ende des Datenblocks vorhanden ist-----------------
            bool hasFarbpalette = ((beginOfDataBlock + dataBlocklength) < NVF.endOffset);
            Color[] colors = null;

            if (hasFarbpalette)
            {
                position = beginOfDataBlock + dataBlocklength;
                UInt32 anzahlFarben = (UInt16)CHelpFunctions.byteArrayToInt16(ref data, position);

                //---auslesen der Farbpalette---
                try
                {
                    position += 2;
                    colors = new Color[anzahlFarben];
                    for (int i = 0; i < anzahlFarben; i++)
                    {
                        colors[i] = Color.FromArgb((byte)(data[position++] * 4), (byte)(data[position++] * 4), (byte)(data[position++] * 4));
                    }
                }
                catch (SystemException)
                {
                    CDebugger.addDebugLine("Fehler beim Laden der Farbpaltte in der Datei " + NVF.filename + " (RLE)");
                    return images;
                }
            }

            position = beginOfDataBlock;
            CFarbPalette.palettenTyp typ = this.getPalettenTyp(NVF.filename, version);

            //---------Bilddaten auslesen-----------
            for (int i = 0; i < anzahlBilder; i++)
            {
                Bitmap image = new Bitmap(width[i], height[i]);

                //---zum Entpacken---
                bool unpacking = false; //gibt an, ob gerade entpackt wird
                byte wiederholungen = 0;
                byte aktuelleWiederholung = 0;
                byte value = 0;
                //-------------------

                for (int y = 0; y < height[i]; y++)
                {
                    for (int x = 0; x < width[i]; x++)
                    {
                        if (data[position] != 0x7F && !unpacking)
                        {
                            //hier ist keine komopression
                            if (!hasFarbpalette)
                                image.SetPixel(x, y, CFarbPalette.getColor(typ, data[position]));
                            else
                                image.SetPixel(x, y, colors[data[position] % colors.Length]);

                            position++;
                        }
                        else
                        {
                            //entpacken...
                            if (!unpacking)
                            {
                                // starten eines neuen entpackvorgangen
                                position++;
                                wiederholungen = data[position++];
                                aktuelleWiederholung = 0;
                                value = data[position++];

                                unpacking = true;

                                if (!hasFarbpalette)
                                    image.SetPixel(x, y, CFarbPalette.getColor(this.getPalettenTyp(NVF.filename, version), value));
                                else
                                    image.SetPixel(x, y, colors[value % colors.Length]);

                                aktuelleWiederholung++;
                            }
                            else
                            {
                                // es läuft bereits ein entpackvorgang

                                if (!hasFarbpalette)
                                    image.SetPixel(x, y, CFarbPalette.getColor(this.getPalettenTyp(NVF.filename, version), value));
                                else
                                    image.SetPixel(x, y, colors[value % colors.Length]);

                                if (++aktuelleWiederholung >= wiederholungen)
                                    unpacking = false;
                            }
                        }
                    }
                }
                images.Add(image);
            }

            return images;
        }
示例#18
0
        private List<Image> loadAmigaImage(ref byte[] data, CDSAFileLoader.CFileSet NVF, DSAVersion version)
        {
            List<Image> images = new List<Image>();
            int beginOfDataBlock;
            int dataBlocklength = 0;
            int headerblocklength;

            int offset = NVF.startOffset;

            //-------------Header auslesen----------------------------
            int anzahlBilder = CHelpFunctions.byteArrayToInt16(ref data, offset + 1);
            int[] width = new int[anzahlBilder];
            int[] height = new int[anzahlBilder];
            Int32[] depackLengths = new Int32[anzahlBilder];
            Int32 unpackesDataLength = 0;

            if ((data[offset] & 0x01) == 0)
                headerblocklength = 4;
            else
                headerblocklength = 8;

            int position = offset + 3;

            //int helpvalue = 0;  //gibt die Länge eines Datenblocks an
            if ((data[offset] & 0x01) != 0)
            {
                //unterschiedliche Auflösungen der Bilder
                for (int i = 0; i < anzahlBilder; i++)
                {
                    width[i] = CHelpFunctions.byteArrayToInt16(ref data, position);
                    height[i] = CHelpFunctions.byteArrayToInt16(ref data, position + 2);

                    unpackesDataLength += width[i]*height[i];

                    int value = CHelpFunctions.byteArrayToInt32(ref data, position + 4);
                    dataBlocklength += value;
                    depackLengths[i] = value;

                    position += headerblocklength;

                }
            }
            else
            {
                //gleiche Auflösungen der Bilder
                int tempwidth = CHelpFunctions.byteArrayToInt16(ref data, position);
                int tempheight = CHelpFunctions.byteArrayToInt16(ref data, position + 2);

                position += 4;

                for (int i = 0; i < anzahlBilder; i++)
                {
                    width[i] = tempwidth;
                    height[i] = tempheight;

                    unpackesDataLength += tempwidth*tempheight;

                    int value = CHelpFunctions.byteArrayToInt32(ref data, position);
                    dataBlocklength += value;
                    depackLengths[i] = value;

                    position += headerblocklength;
                }
            }

            beginOfDataBlock = position;    //am ende des headers beginnt der Datenblock

            //---------Prüfen ob Farbpalette am ende des Datenblocks vorhanden ist-----------------
            bool hasFarbpalette = ((beginOfDataBlock + dataBlocklength) < NVF.endOffset);
            Color[] colors = null;

            if (hasFarbpalette)
            {
                position = beginOfDataBlock + dataBlocklength;
                UInt32 anzahlFarben = (UInt16)CHelpFunctions.byteArrayToInt16(ref data, position);

                //---auslesen der Farbpalette---
                try
                {
                    position += 2;
                    colors = new Color[anzahlFarben];
                    for (int i = 0; i < anzahlFarben; i++)
                    {
                        colors[i] = Color.FromArgb((byte)(data[position++] * 4), (byte)(data[position++] * 4), (byte)(data[position++] * 4));
                    }
                }
                catch (SystemException)
                {
                    CDebugger.addDebugLine("Fehler beim Laden der Farbpaltte in der Datei " + NVF.filename + " (Amiga)");
                    return images;
                }
            }

            position = beginOfDataBlock;
            CFarbPalette.palettenTyp typ = this.getPalettenTyp(NVF.filename, version);

            //---------Bilddaten auslesen-----------
            for (int i = 0; i < anzahlBilder; i++)
            {
                byte[] bytes = CHelpFunctions.unpackAmiga2Data(ref data, position, depackLengths[i]);

                Int32 bytePosition = 0;

                Bitmap image = new Bitmap(width[i], height[i]);

                for (int y = 0; y < image.Height; y++)
                {
                    for (int x = 0; x < image.Width; x++)
                    {
                        if (!hasFarbpalette)
                        {
                            image.SetPixel(x, y, CFarbPalette.getColor(typ, bytes[bytePosition]));
                        }
                        else
                            image.SetPixel(x, y, colors[bytes[bytePosition] % colors.Length]);

                        bytePosition++;
                    }
                }

                position += depackLengths[i];
                images.Add(image);
            }

            return images;
        }
示例#19
0
        private List<Image> loadUncompressedImage(ref byte[] data, CDSAFileLoader.CFileSet NVF, DSAVersion version)
        {
            List<Image> images = new List<Image>();

            int offset = NVF.startOffset;

            int anzahlBilder = CHelpFunctions.byteArrayToInt16(ref data, offset + 1);

            int[] width = new int[anzahlBilder];
            int[] height = new int[anzahlBilder];

            int headerblocklength = 0;  //die länge des Variablen Headerblock (Auflösung + gepackte Dateilänge)(8 Bytes) oder (gepackte Dateilänge)(4 Bytes)

            int beginOfDataBlock;
            int dataBlocklength = 0;

            if ((data[offset] & 0x01) == 0)
                headerblocklength = 0;
            else
                headerblocklength = 4;

            int position = offset + 3;

            //---------bestimmen der Datenblock und Bild Größen-----------------
            //int helpvalue = 0;  //gibt die Länge eines Datenblocks an
            if ((data[offset] & 0x01) != 0)
            {
                //unterschiedliche Auflösungen der Bilder
                for (int i = 0; i < anzahlBilder; i++)
                {

                    width[i] = CHelpFunctions.byteArrayToInt16(ref data, position);
                    height[i] = CHelpFunctions.byteArrayToInt16(ref data, position + 2);

                    dataBlocklength += width[i] * height[i];

                    position += headerblocklength;
                }
            }
            else
            {
                //gleiche Auflösungen der Bilder
                int tempwidth = CHelpFunctions.byteArrayToInt16(ref data, position);
                int tempheight = CHelpFunctions.byteArrayToInt16(ref data, position + 2);

                position += 4;

                for (int i = 0; i < anzahlBilder; i++)
                {
                    width[i] = tempwidth;
                    height[i] = tempheight;

                    dataBlocklength += tempwidth * tempheight;
                }
            }

            beginOfDataBlock = position;

            bool hasFarbPalette = ((beginOfDataBlock + dataBlocklength) < NVF.endOffset);
            position = beginOfDataBlock + dataBlocklength;

            Color[] colors = null;
            if (hasFarbPalette)
            {

                int anzahlFarben = CHelpFunctions.byteArrayToInt16(ref data, position);
                position += 2;
                colors = new Color[anzahlFarben];
                for (int i = 0; i < anzahlFarben; i++)
                {
                    colors[i] = Color.FromArgb((byte)(data[position++] * 4), (byte)(data[position++] * 4), (byte)(data[position++] * 4));
                }
            }

            position = beginOfDataBlock;
            CFarbPalette.palettenTyp typ = this.getPalettenTyp(NVF.filename, version);

            for (int i = 0; i < anzahlBilder; i++)
            {
                Bitmap image = new Bitmap(width[i], height[i]);
                //keine farbpalette
                for (int y = 0; y < height[i]; y++)
                {
                    for (int x = 0; x < width[i]; x++)
                    {
                        if (hasFarbPalette)
                            image.SetPixel(x, y, colors[data[position]]);
                        else
                            image.SetPixel(x, y, CFarbPalette.getColor(typ, data[position]));
                        position++;
                    }
                }
                images.Add(image);
            }

            return images;
        }
示例#20
0
        //----------------------------------------------------------
        private List<Image> loadNVF(ref byte[] data, CDSAFileLoader.CFileSet NVF, DSAVersion version)
        {
            List<Image> images = new List<Image>();
            byte[] unpackedData = null;

            CImageHeader header = this.checkForSpezialFile(NVF.filename, version); // header == null wenn es keine spezielle Datei ist und einen eigenen Header besitzt

            //----------------------------------------
            //  schauen ob das Bild gepackt ist
            if (checkForAmigaPackedFile(NVF.filename, version))
            {
                try
                {
                    unpackedData = CHelpFunctions.unpackAmiga2Data(ref data, NVF.startOffset, NVF.endOffset - NVF.startOffset);
                    NVF.endOffset = unpackedData.Length;
                    NVF.startOffset = 0;
                }
                catch (SystemException)
                {
                    CDebugger.addErrorLine("Fehler beim entpacken der Datei " + NVF.filename + " (amiga)");
                    return images;
                }
            }
            else if (checkForRLEPackedFile(NVF.filename, version))
            {
                if (header == null)
                {
                    CDebugger.addErrorLine("kein Header für die RLE gepackte Datei " + NVF.filename + " gefunden");
                    return images;
                }
                try
                {
                    unpackedData = CHelpFunctions.unpackRLEFile(ref data, NVF.startOffset, NVF.endOffset - NVF.startOffset, (UInt32)(header.height*header.width + 2 + 3*header.anzahlFarben));
                    NVF.endOffset = unpackedData.Length;
                    NVF.startOffset = 0;
                }
                catch (SystemException)
                {
                    CDebugger.addErrorLine("Fehler beim entpacken der Datei " + NVF.filename + " (RLE)");
                    return images;
                }
            }
            else
                unpackedData = data;
            //----------------------------------------

            int offset = NVF.startOffset;

            if (NVF.filename.Substring(0, 4) == "ANIS")
            {
                images.AddRange(this.loadANISImages(ref data, NVF));
                return images;
            }
            else if (header == null)
            {
                //header vorhanden
                byte crunchmode = unpackedData[offset];

                if (crunchmode <= 1)
                {
                    try
                    {
                        //unkomrimiert
                        images.AddRange(this.loadUncompressedImage(ref unpackedData, NVF, version));
                    }
                    catch (SystemException)
                    {
                        CDebugger.addErrorLine("Fehler beim laden des Bildes: " + NVF.filename + "(Unkomprimiert)");
                        return images;
                    }
                }
                else if (crunchmode == 2 || crunchmode == 3)
                {
                    try
                    {
                        //Amiga Power Pack 2.0 Kompression
                        images.AddRange(this.loadAmigaImage(ref unpackedData, NVF, version));
                    }
                    catch (SystemException)
                    {
                        CDebugger.addErrorLine("Fehler beim laden des Bildes: " + NVF.filename + "(Amiga)");
                        return images;
                    }
                }
                else if (crunchmode == 4 || crunchmode == 5)
                {
                    try
                    {
                        //RLE Kompression
                        images.AddRange(this.loadRLEImage(ref unpackedData, NVF, version));
                    }
                    catch (SystemException)
                    {
                        CDebugger.addErrorLine("Fehler beim laden des Bildes: " + NVF.filename + "(RLE)");
                        return images;
                    }
                }
                else
                {
                    CDebugger.addErrorLine("Unbekannter Crunchmode: " + crunchmode.ToString() + " in der Datei " + NVF.filename);
                    return images;
                }
            }
            else
            {
                //Bild ist nicht gepackt
                //besitzt aber auch keinen Header und beginnt direkt mit den Bilddaten
                try
                {
                    images.AddRange(this.loadImageWithoutHeader(ref unpackedData, NVF, header, version));
                }
                catch (SystemException)
                {
                    CDebugger.addErrorLine("Fehler beim laden des Bildes: " + NVF.filename + "(kein Header)");
                    return images;
                }
            }

            return images;
        }
示例#21
0
            //-----------------------------------------
            public CDialog(ref byte[] data, CDSAFileLoader.CFileSet TLK, DSAVersion version)
            {
                this.itsDSA1DialogZeile.Clear();
                this.itsDSA1Partner.Clear();
                this.itsTexte.Clear();

                if (data == null || TLK == null)
                    return;

                switch (version)
                {
                    case DSAVersion.Blade:
                    case DSAVersion.Schick:
                        this.loadDSA1(ref data, TLK);
                        break;

                    case DSAVersion.Schweif:
                        bool found = false;
                        for (int i = TLK.startOffset; i < (TLK.endOffset - 3); i++)
                        {
                            if (data[i] == 'P' && data[i + 1] == 'I' && data[i + 2] == 'C')
                            {
                                found = true;
                                break;
                            }
                        }
                        if (found)
                            this.loadDSA2_info(ref data, TLK);
                        else
                            this.loadDSA2_dialog(ref data, TLK);

                        break;
                }
            }