Sie sind nicht angemeldet.

Lieber Besucher, herzlich willkommen bei: AnnoZone Forum. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

mrboese

Boardsmutje

  • »mrboese« ist der Autor dieses Themas

Beiträge: 994

Registrierungsdatum: 19. Juli 2009

  • Nachricht senden

61

Dienstag, 22. Juni 2010, 15:29

Zitat

schade, dass ich es nicht benutzen kann :-(


Wieso?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »mrboese« (22. Juni 2010, 15:29)


sanktdonut

Ausguck

Beiträge: 58

Registrierungsdatum: 29. März 2010

  • Nachricht senden

62

Dienstag, 22. Juni 2010, 17:18

wenn ich den explorer starten will kommt ne meldung dass man net framework 4.irgendwas braucht. habe xp und das neueste net framework ist für xp 3.5;
ohne es zu wissen schätze ich mal das 4+ von vista und windows 7 ist, oder?
ehrlich gesagt hab ich keine ahnung^^

habs gerade nochmal gedownloadet, war aber immer noch dasselbe, dabei steht da ja auch was von windows xp + n f 3.5 + service pack 1; hab ich alles so...

oder steh ich auf nem schlauch?
 
Wegweisend, innovativ und schön fürs Auge: die Judekwmod!

Das Original: ... KI-Werft ... Handelsflugzeuge ... Bodeneinheiten ... Hafenstädte ... Ziergebäude & Beleuchtung ...

...und vieles mehr!

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »sanktdonut« (22. Juni 2010, 17:24)


mrboese

Boardsmutje

  • »mrboese« ist der Autor dieses Themas

Beiträge: 994

Registrierungsdatum: 19. Juli 2009

  • Nachricht senden

63

Dienstag, 22. Juni 2010, 17:44

http://www.microsoft.com/downloads/detai…e5-b386f32c0992

Zitat


* Unterstützte Betriebssysteme: Windows 7; Windows Server 2003 Service Pack 2; Windows Server 2008; Windows Server 2008 R2; Windows Vista Service Pack 1; Windows XP Service Pack 3

o Windows XP SP3
o Windows Server 2003 SP2
o Windows Vista SP1 oder höher
o Windows Server 2008 (nicht unterstützt unter der Server Core-Rolle)
o Windows 7
o Windows Server 2008 R2 (nicht unterstützt unter der Server Core-Rolle)

S.D.

Boardsmutje

Beiträge: 1 051

Registrierungsdatum: 21. Oktober 2006

  • Nachricht senden

64

Dienstag, 22. Juni 2010, 19:24

so, hab mal wieder zeit gefunden mich näher mit dem teil zu beschäftigen.
wirklich fertig ist das ding nicht.

das tool überwacht, ob eine datei geändert wird aber nicht ob eine ersetzt werden soll.
daraus entstehen fehlerhafte rda's.
klar, man könnte die datei vorher löschen und dann die neue hinzufügen.... :rolleyes:

in bezug auf den rdu's man kann sie entpacken aber beim einpacken gibts noch probleme.
das game erkennt sie nachher nicht mehr richitg. meldet falsches dateiformat.

und zu der komprimierung:

du solltest von anfang an die option für die png und fx raus nehmen.
macht man das mit png, meckert der we2. komprimierst du die fx, hast du keine häuser mehr.


p.s.:ich persönlich halte nichts vom verändern in den rda's.
einmal auspacken, ändern und wieder einpacken ist die sicherste variante. =)

Admiral Drake

Schatzjäger

Beiträge: 2 696

Registrierungsdatum: 3. November 2004

  • Nachricht senden

65

Mittwoch, 23. Juni 2010, 09:31

Hi, nur mal aus Neugierde ne Frage:
kann ich in den entpackten Dateien noch sehen, wie die in der RDA gepackt waren, also mit welcher Kompression die ursprünglich versehen waren ?
  Nur wer nichts tut, macht auch keine Fehler. Nicht meckern, sondern anpacken !

mrboese

Boardsmutje

  • »mrboese« ist der Autor dieses Themas

Beiträge: 994

Registrierungsdatum: 19. Juli 2009

  • Nachricht senden

66

Mittwoch, 23. Juni 2010, 11:28

Nö.

Admiral Drake

Schatzjäger

Beiträge: 2 696

Registrierungsdatum: 3. November 2004

  • Nachricht senden

67

Mittwoch, 23. Juni 2010, 11:38

Hm, könntest du das nicht irgendwo in einem Header unterbringen ? Das würde doch beim erzeugen der RDA sicher helfen, wieder die richtige (also die gleiche) Kompression zu verwenden ?
  Nur wer nichts tut, macht auch keine Fehler. Nicht meckern, sondern anpacken !

mrboese

Boardsmutje

  • »mrboese« ist der Autor dieses Themas

Beiträge: 994

Registrierungsdatum: 19. Juli 2009

  • Nachricht senden

68

Mittwoch, 23. Juni 2010, 12:01

Da muss man halt mal Auffälligkeiten herausfinden (das Mit der Kompression ist von RDA-File zu RDA-File schon unterschiedlich).
Notfalls lässt man die Kompression raus.

Wer will, der kann sich näher mit dem Kompressions-Kram beschäftigen und herausfinden, was es da noch für Infos gibt.
Der Quellcode ist öffentlich - jeder kann am Programm rumpfuschen, wie er lustig ist.
Alles ist in C# geschrieben, sodass man die C#-Version vom kostenlosen Visual Studio 2010 Express verwenden kann (auch das normale VS geht natürlich)

Admiral Drake

Schatzjäger

Beiträge: 2 696

Registrierungsdatum: 3. November 2004

  • Nachricht senden

69

Mittwoch, 23. Juni 2010, 12:07

:lol: bis zum selber rumpfuschen ist es bei mir noch ein ganzes Stück ...

Meine Vorstellung war halt, dass man für jede entpackte Datei nen Header schreibt, in dem drinsteht, wie die Datei gepackt war. Das ist zum einen informativ, zum anderen hilft es beim zusammenpacken udn drittens kann man dann für neue Dateien die erforderliche Komression dort angeben.

Ich kann übrigens gut verstehen, dass du nach der ganzen Fummelei nicht begeistert bist, wenn andere dir da reinquatschen wollen ...

Meine Idee muss ich dann notfalls halt irgendwann mal selbst umsetzen. In meiner Vorstellung sollte ein RDA-Packer allerdings in jedem Fall die Originaldatei wieder erzeugen, wenn einfach nur ausgepackt und eingepackt wird, ohne was zu verändern.
  Nur wer nichts tut, macht auch keine Fehler. Nicht meckern, sondern anpacken !

mrboese

Boardsmutje

  • »mrboese« ist der Autor dieses Themas

Beiträge: 994

Registrierungsdatum: 19. Juli 2009

  • Nachricht senden

70

Mittwoch, 23. Juni 2010, 12:25

Dieser RDA-Packer kann nur in den seltensten Fällen die originale Struktur wiederherstellen.
Da sieht man in etwa so was hier:
Öffnen: 2000 Files, 8 Blocks read
Speichern: Saving 1/5 Blocks (112 Files)

Der Block-Generator (Es gibt 3 stück: FileType, Directory und OneBlock) erstellt standardmäßig für jeden Dateityp einen Block (-> FileType).
Kompression darf der Benutzer wählen.
Ich habe das System hinter dem originalen Block-Generator noch nicht erkannt (wie die komischen Byte-Folgen im Header bei Savegames)

Deshalb habe ich auch den Quellcode veröffentlicht, sodass ein programmierer, der Lust darauf hat (Ich nämlich nicht mehr so, weil ich gerade "Pause" mache und Risen spiele) gerne sich weiter damit beschäftigen kann.

Admiral Drake

Schatzjäger

Beiträge: 2 696

Registrierungsdatum: 3. November 2004

  • Nachricht senden

71

Mittwoch, 23. Juni 2010, 13:07

:D verstanden, es gibt bessere Möglichkeiten, seine Freizeit rumzukriegen, als Bits und Bytes auseinanderzufieseln (kenne ich zu gut von AD1503).
Also schaun wir mal, ob jemand anderes sich der Sache annimmt, immerhin hast du es wieder in C konvertiert und ein Stück weitergebracht.
  Nur wer nichts tut, macht auch keine Fehler. Nicht meckern, sondern anpacken !

TELEKOM

Piratenschreck

Beiträge: 501

Registrierungsdatum: 27. März 2004

  • Nachricht senden

72

Mittwoch, 23. Juni 2010, 19:39

Zitat

Original von mrboese
Version 1.0.3.2 ist fertig:

Da jetzt alles funktioniert, gibt es nur oberflächliche Änderungen:
Bei "Add files", "Add folder" und "Add folder as root" werden bereits existierende Dateien ersetzt.


Irgendwie funktioniert das aber immer noch nicht auf diese Weise, die Dateien sind immer noch doppelt in der RDA

Hoenir

Vollmatrose

Beiträge: 114

Registrierungsdatum: 4. Dezember 2006

  • Nachricht senden

73

Dienstag, 6. Juli 2010, 20:40

Zitat

Original von mrboese
es war sehr schwierig, Hoenir's D-Code in C# umzuwandeln (Unmanaged zu managed).

Hat Windoze meinen Code abgestoßen, weil es kein .NET ist? :hey:
  D Programming Language - R.I.P. C++

mrboese

Boardsmutje

  • »mrboese« ist der Autor dieses Themas

Beiträge: 994

Registrierungsdatum: 19. Juli 2009

  • Nachricht senden

74

Dienstag, 6. Juli 2010, 21:33

.NET und D sind komplett verschieden:
Bei .NET gibt es z.B. sowas nicht: byte-Array in ein short-Array umwandeln.
Auch Pointer sind nicht direkt realisierbar (sind aber möglich). Die gehören zum "unsafe" Code.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
 public static byte[] Decrypt(byte[] buffer)
        {
            if (buffer.Length == 0)
                return buffer;

            //if (buffer.Length % 2 != 0)
            //{
            //    List<byte> _buffer = new List<byte>(buffer);
            //    _buffer.Add(0);
            //    buffer = _buffer.ToArray();
            //}

            MemoryStream stream=new MemoryStream(buffer);
            BinaryReader reader = new BinaryReader(stream);           

            //Collect short
            List<short> collectedshortList = new List<short>();
            //for (int i = 0; i < buffer.Length / 2; i++)
            while(true)
            {
                collectedshortList.Add(reader.ReadInt16());

                if (reader.BaseStream.Position + 2 > reader.BaseStream.Length)
                    break;
            }

            reader.Close();

            //Output
            MemoryStream writerStream=new MemoryStream();
            BinaryWriter writer = new BinaryWriter(writerStream);

            int x = 0xA2C2A;
            short y = 0;

            for (int i = 0; i < collectedshortList.Count; i++)
            {
                x = x * 0x343FD + 0x269EC3;
                y = (short)(x >> 16 & 0x7FFF);

                short w = (short)(collectedshortList[i] ^ y);

                writer.Write(w);
            }

            if (buffer.Length % 2 != 0)
            {
                writer.Write(buffer[buffer.Length - 1]);
            }

            byte[] output = writerStream.ReadAll();
           
            return output;
        }


Es wird nicht direkt auf den Speicher zugegriffen (Also: Zugriff auf ein Int -> Lese 4 Byte), sondern alles wird durch die Laufzeitumgebung verwaltet.
Alles in der .NET Umgebung wird als Objekt behandelt!

Demzufolge kann man auch nicht ein Byte-Array in ein Struct "pressen". Das wird dort über eine spezielle Klasse gelöst ("Marshal").

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 public static object ReadToStructure(BinaryReader reader, Type outputtype)
        {
            unsafe
            {
                object output;

                object testInstance = Activator.CreateInstance(outputtype);
                int sz = Marshal.SizeOf(testInstance);

                IntPtr buffer = Marshal.AllocCoTaskMem(sz);
                Marshal.Copy(reader.ReadBytes(sz), 0, buffer, sz);

                output = Marshal.PtrToStructure(buffer, outputtype);

                Marshal.FreeCoTaskMem(buffer);

                return output;
            }
        }


Das klingt zwar alles schlimm/nach sehr vielen Nachteilen, aber mit .NET lässt's sich wunderbar entwickeln. Alles ist sehr logisch aufgebaut (die sehr mächtige Standardbibliothek) und es wird alles schön in Klassen "verpackt", die sehr leicht handzuhaben sind.

Und natürlich ist es auch leichter, eine Benutzeroberfläche zu erstellen, wie man sieht.

Ach ja: Das Laden bei deinem Explorer ist langsamer als bei meinem, da:
  • Die Zahl in der Statusleiste nach jedem Lesen einer Datei aktualisiert wird (Ja, das macht bei so viel Dateien schon viel aus!)
  • Es bei meinem eine Baum-Struktur gibt, wo alle die TreeViewItem-Subitems erst beim Erweitern des Items geladen werden


... So, was gibt es noch ???
Ja:

Bei deinem Code wird ja ein Archiv an Blöcken geladen. Mein Explorer lädt jede Datei in eine Klasse "RDAFile", die eine Referenz zu einem Stream (die geladene Datei ODER ein FileStream, wo die Startposition dann 0 ist) beinhaltet und sachen wie "Entpacken" und so.
Nach dem Laden der Datei wird eine virtuelle Ordnerstruktur erstellt, die aus "RDAFolder"-Klassen besteht. Es wird ein Root-RDAFolder-Element erstellt, was dann alles beinhaltet.
Die RDAFolder-Klasse beinhaltet einen string Path, ein List<RDAFile> Files, ein List<RDAFolder> Subfolder und Methoden, die z.B. alle Dateien in dem Order und den Unterordnern ausgibt.

Du kannst dir mal den Code ansehen. Der RDAExplorer ist OpenSource.

Hoenir

Vollmatrose

Beiträge: 114

Registrierungsdatum: 4. Dezember 2006

  • Nachricht senden

75

Mittwoch, 7. Juli 2010, 00:34

Zitat

Original von mrboese
Auch Pointer sind nicht direkt realisierbar (sind aber möglich). Die gehören zum "unsafe" Code.

Für die meisten Anwendungen genügt bei D eh eine ähnlichen Untermenge namens SafeD

Man kann jetzt schon meist vollkommen ohne Zeiger und ähnliches auskommen, Speicherverwaltung ist auch automatisch. Die Standardbibliothek muss natürlich noch ein bisschen erwachsen werden, ganz klar.


Zitat

Original von mrboese
Demzufolge kann man auch nicht ein Byte-Array in ein Struct "pressen". Das wird dort über eine spezielle Klasse gelöst ("Marshal").

Das array->struct ist eher ein kleiner Hack von mir, weil ich bei solchen Werkzeugen immer lieber mit structs arbeite als mit einzelnen Leseoperationen, ist viel übersichtlicher und effizienter.


Zitat

Original von mrboese
Und natürlich ist es auch leichter, eine Benutzeroberfläche zu erstellen, wie man sieht.

Joa hab damit au schon mal gearbeitet. Mit Qt für D dürfte das ähnlich einfach sein.


Zitat

Original von mrboese
Ach ja: Das Laden bei deinem Explorer ist langsamer als bei meinem

Ist auch nichts optimiert, nur ein kleines Werkzeug zum Entpacken. Normalerweise mach ich bei sowas nicht mal ne GUI :)
  D Programming Language - R.I.P. C++

mrboese

Boardsmutje

  • »mrboese« ist der Autor dieses Themas

Beiträge: 994

Registrierungsdatum: 19. Juli 2009

  • Nachricht senden

76

Mittwoch, 7. Juli 2010, 01:17

Zitat

Das array->struct ist eher ein kleiner Hack von mir, weil ich bei solchen Werkzeugen immer lieber mit structs arbeite als mit einzelnen Leseoperationen, ist viel übersichtlicher und effizienter.

Einzelne Leseoperationen werden beim "Vorgänger" des aktuellen Entpackers für Anno-Ahoi benutzt. Das mit den Structs ist aber viel besser :up:

Zitat

Joa hab damit au schon mal gearbeitet. Mit Qt für D dürfte das ähnlich einfach sein.

Es gibt ja zwei Systeme für C#:
WindowsForms (.NET 2.0)
Windows Presentation Foundation (.NET 3.0)

Ich nutze nur noch die WPF, da die XAML-Sprache wirkich sehr gut zum Erstellen von UIs ist (Besonders, weil es sich wunderbar dazu eignet, Anwendungen zu erstellen, deren Fenstergröße variabel ist*)
Ich habe mir mal QT angesehen und festgestellt, dass ... es nicht richtig für mich ist (Nicht unlogisch, aber Sachen, die eleganter gehen:
QT:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 <widget class="QToolButton" name="readMemoryButton" >
    <property name="geometry" >
     <rect>
      <x>10</x>
      <y>150</y>
      <width>41</width>
      <height>41</height>
     </rect>
    </property>
    <property name="text" >
     <string>MR</string>
    </property>
   </widget>
...


XAML:

Quellcode

1
2
3
4
<UniformGrid Rows="4" Columns="5"> **
    <Button Name="readMemoryButton" Content="MR" Width="41" Height="41"/>
    ...
</UniformGrid>


* z.B. im Grid-Element: Margin="Left, Top, Right, Bottom" -> Passt sich an
oder bei der ListView die Spalten <GridViewColumnDefinition Width="5*"/> -> Wenn alle anderen auch 5*, dann 1/5
** Wenn man gerne mit Pixeln arbeitet, dann in Canvas-Element platzieren und angefügte Eigenschaften verwenden:

Quellcode

1
2
3
4
5
<Canvas> 
    <Button Name="readMemoryButton" Content="MR" Width="41" Height="41"
Canvas.Left="10" Canvas.Top="150"/>
    ...
</Canvas>



Zitat

Ist auch nichts optimiert, nur ein kleines Werkzeug zum Entpacken. Normalerweise mach ich bei sowas nicht mal ne GUI

Ich kenne dieses Problem auch beim AMM (den ich jetzt versuche aus der Weltgeschichte zu verbannen, wie du an meiner Signatur, an meinen Posts bez. des AMM und dem Internetauftritt siehst). Die GUI laufend zu aktualisieren verlangsamt den Prozess ganz schön: 5s mit lauf. Akt., 2s ohne lauf. Akt. bei 30 Mods.
Ich benutze da zwei Varianten (eine davon beim RDAEx, die andere beim AMM) :
Wenn x % y == 0, dann aktualisieren oder
Alle x% (z.B. 20%) aktualisieren

Inselpapst

R.I.P Inseldruide

Beiträge: 588

Registrierungsdatum: 10. August 2003

  • Nachricht senden

77

Mittwoch, 7. Juli 2010, 07:52

@mrboese

Hut ab, Geiles Teil und es funktioniert... :D

Mal ne Frage, bei öffnen oder Einlesen der Dateien dauert es mit unter etwas
bis der Explorer alles eingelesen hat. Leider hat man da keinen Überblick
ob der Explorer noch arbeitet oder ob er abgeschmiert is.

Beim Speichern oder Extrahieren wird ja der Fortschrittsbalken angezeigt.
Geht sowas auch bei einlesen?

zB. Lese Datei x von y
Nur das man hat noch weis das er arbeitet... und man warten muß bis man
den nächsten Arbeitsschritt machen kann...
  Euer Inselpapst... Nobody's perfect, noch nischmal isch... :scratch:
:hinweis: Der Inselpapst - Anno1404 - Mods - Anno1404 - Scenarios

mrboese

Boardsmutje

  • »mrboese« ist der Autor dieses Themas

Beiträge: 994

Registrierungsdatum: 19. Juli 2009

  • Nachricht senden

78

Mittwoch, 7. Juli 2010, 09:46

Da gibt es sogar einen Fortschrittsbalken.
Nur geht er bei dir irgendwie nicht.

UUUBerlin888

Is Seefest

Beiträge: 45

Registrierungsdatum: 19. Februar 2010

  • Nachricht senden

79

Mittwoch, 7. Juli 2010, 15:37

@InselPapst
Habe es gerade noch mal probiert:
Also es gibt ja eigentlich zwei Balken; der erste ist ein Windows-Fenster mit Fortschrittsanzeige (Inhalt: Kopiere Datei x nach "Instance") und der zweite ist im Fenster unten vom RDAProg und der verändert sich erst wenn das Windows-Fenster fertig ist und zwar schlagartig auf 100%. Meine Vermutung ist wenn das Windows-Fenster nicht sichtbar ist dann ist Reaktion in RDA gleich null beim einlesen. Vielleicht ist Dein RDA immer im Vordergrund?
Gruß aus HH
»UUUBerlin888« hat folgendes Bild angehängt:
  • RDAFenster.jpg

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »UUUBerlin888« (7. Juli 2010, 16:40)


mrboese

Boardsmutje

  • »mrboese« ist der Autor dieses Themas

Beiträge: 994

Registrierungsdatum: 19. Juli 2009

  • Nachricht senden

80

Mittwoch, 7. Juli 2010, 15:45

Da ist kein externes Fenster integriert.
Alles wird von dem einem Hauptfenster angezeigt.

Im unteren Bereich des Fensters gibt es einen versteckten Fortschrittsbalken, der nur angezeigt wird, wenn er benötigt wird.


Es könnte irgentetwas mit Windows zu tun haben, dass das so nicht funktioniert.
Ich habe das Gefühl, dass die WPF eine Technologie ist, die für XP nur halbherzig implementiert wurde.