More localization, Object reading refactor, image viewer refactor. Now image viewer can display counters.

master
1987kostya 4 years ago
parent f16ce17bbe
commit 24853e3da3

@ -18,6 +18,7 @@ using CTFAK.MMFParser.EXE.Loaders.Objects;
using CTFAK.MMFParser.Translation;
using CTFAK.Utils;
namespace CTFAK.GUI
{
public partial class MainForm : Form
@ -91,6 +92,7 @@ namespace CTFAK.GUI
imagesButton.Text = Properties.GlobalStrings.dumpImages;
soundsButton.Text = Properties.GlobalStrings.dumpSounds;
musicsButton.Text = Properties.GlobalStrings.dumpMusics;
dumpSortedBtn.Text = Properties.GlobalStrings.dumpSorted;
FolderBTN.Text=Properties.GlobalStrings.openFolder;
@ -304,17 +306,17 @@ namespace CTFAK.GUI
InitKeyTab();
InitPlugins();
var toLog = "";
toLog += $"Title:{Exe.Instance.GameData.Name}\n";
toLog += $"Copyright:{Exe.Instance.GameData.Copyright}\n";
toLog += $"{Properties.Locale.ChunkNames.title}: {Exe.Instance.GameData.Name}\n";
toLog += $"{Properties.Locale.ChunkNames.copyright}: {Exe.Instance.GameData.Copyright}\n";
//toLog += $"Editor Filename: {Exe.Instance.GameData.EditorFilename}\n";
toLog += $"Product Version: {Exe.Instance.GameData.ProductVersion}\n";
toLog += $"Build: {Exe.Instance.GameData.Build}\n";
toLog += $"Runtime Version: {Exe.Instance.GameData.RuntimeVersion}\n";
toLog += $"Number Of Images: {Exe.Instance.GameData.Images?.NumberOfItems ?? 0}\n";
toLog += $"Number Of Sounds: {Exe.Instance.GameData.Sounds?.NumOfItems ?? 0}\n";
toLog += $"Number Of Musics: {Exe.Instance.GameData.Music?.NumOfItems ?? 0}\n";
toLog += $"Unique FrameItems: {Exe.Instance.GameData.Frameitems?.NumberOfItems}\n";
toLog += $"Frame Count: {Exe.Instance.GameData.Frames.Count}\n";
toLog += $"{Properties.GlobalStrings.imageCount}: {Exe.Instance.GameData.Images?.NumberOfItems ?? 0}\n";
toLog += $"{Properties.GlobalStrings.soundCount}: {Exe.Instance.GameData.Sounds?.NumOfItems ?? 0}\n";
toLog += $"{Properties.GlobalStrings.musicCount}: {Exe.Instance.GameData.Music?.NumOfItems ?? 0}\n";
toLog += $"{Properties.GlobalStrings.frameitemCount}: {Exe.Instance.GameData.Frameitems?.NumberOfItems}\n";
toLog += $"{Properties.GlobalStrings.frameCount}: {Exe.Instance.GameData.Frames.Count}\n";
toLog += $"Chunks Count: {Exe.Instance.GameData.GameChunks.Chunks.Count}\n";
if (Exe.Instance.GameData.GameChunks.GetChunk<ImageBank>() != null)
Exe.Instance.GameData.GameChunks.GetChunk<ImageBank>().OnImageSaved += UpdateImageBar;
@ -608,43 +610,62 @@ namespace CTFAK.GUI
var loader = objInst.FrameItem.Properties.Loader;
if (loader is ObjectCommon common)
{
if (common.Animations != null)
foreach (var pair in common.Animations.AnimationDict)
{
var animNode = new ChunkNode($"Animation {pair.Key}", pair.Value);
objInstNode.Nodes.Add(animNode);
foreach (var dir in pair.Value.DirectionDict)
if (pair.Value.DirectionDict.Count > 1)
{
var dirNode = new ChunkNode(
$"Direction {pair.Value.DirectionDict.ToList().IndexOf(dir)}",
dir.Value);
animNode.Nodes.Add(dirNode);
for (var a = 0; a < dir.Value.Frames.Count; a++)
if (common.Parent.ObjectType == 2) //Active
{
if (common.Animations != null)
foreach (var pair in common.Animations.AnimationDict)
{
var animNode = new ChunkNode($"Animation {pair.Key}", pair.Value);
objInstNode.Nodes.Add(animNode);
foreach (var dir in pair.Value.DirectionDict)
if (pair.Value.DirectionDict.Count > 1)
{
var animFrame = dir.Value.Frames[a];
bank.Images.TryGetValue(animFrame, out var img);
if (img != null)
var dirNode = new ChunkNode(
$"Direction {pair.Value.DirectionDict.ToList().IndexOf(dir)}",
dir.Value);
animNode.Nodes.Add(dirNode);
for (var a = 0; a < dir.Value.Frames.Count; a++)
{
var animFrameNode = new ChunkNode(a.ToString(), img);
dirNode.Nodes.Add(animFrameNode);
var animFrame = dir.Value.Frames[a];
bank.Images.TryGetValue(animFrame, out var img);
if (img != null)
{
var animFrameNode = new ChunkNode(a.ToString(), img);
dirNode.Nodes.Add(animFrameNode);
}
}
}
}
else
{
for (var a = 0; a < dir.Value.Frames.Count; a++)
else
{
var animFrame = dir.Value.Frames[a];
bank.Images.TryGetValue(animFrame, out var img);
if (img != null)
for (var a = 0; a < dir.Value.Frames.Count; a++)
{
var animFrameNode = new ChunkNode(a.ToString(), img);
animNode.Nodes.Add(animFrameNode);
var animFrame = dir.Value.Frames[a];
bank.Images.TryGetValue(animFrame, out var img);
if (img != null)
{
var animFrameNode = new ChunkNode(a.ToString(), img);
animNode.Nodes.Add(animFrameNode);
}
}
}
}
}
}
else if(common.Parent.ObjectType==7)//Counter
{
for (var a = 0; a < common.Counters?.Frames?.Count; a++)
{
var animFrame = common.Counters.Frames[a];
bank.Images.TryGetValue(animFrame, out var img);
if (img != null)
{
var animFrameNode = new ChunkNode(a.ToString(), img);
objInstNode.Nodes.Add(animFrameNode);
}
}
}
}
else if (loader is Backdrop backdrop)
{

@ -137,19 +137,12 @@ namespace CTFAK.MMFParser.EXE
}
public void BuildKey()
{
Settings.AppName=_chunkList.GetChunk<AppName>()?.Value??"";
Settings.Copyright = _chunkList.GetChunk<Copyright>()?.Value??"";
Settings.ProjectPath = _chunkList.GetChunk<EditorFilename>()?.Value??"";
if (Exe.Instance.GameData.ProductBuild > 284)Decryption.MakeKey(Settings.AppName,Settings.Copyright,Settings.ProjectPath);
else Decryption.MakeKey(Settings.ProjectPath, Settings.AppName, Settings.Copyright);
}
}
@ -257,22 +250,18 @@ namespace CTFAK.MMFParser.EXE
case 13117:
// loader = new Events(chunk);//NOT WORKING
break;
}
loader?.Read();
return loader;
}
public T GetChunk<T>() where T : ChunkLoader
{
foreach (Chunk chunk in Chunks)
{
if (chunk.Loader != null)
{
if (chunk.Loader.GetType().Name == typeof(T).Name)
if (chunk.Loader.GetType() == typeof(T))
{
return (T) chunk.Loader;
}
@ -288,13 +277,11 @@ namespace CTFAK.MMFParser.EXE
var chunk = Chunks[i];
if (chunk.Loader != null)
{
if (chunk.Loader.GetType().Name == typeof(T).Name)
if (chunk.Loader.GetType() == typeof(T))
{
Chunks.Remove(chunk);
return (T) chunk.Loader;
}
}
}
return null;

@ -100,6 +100,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks
public override void Read()
{
}
public SoundBase(ByteReader reader) : base(reader)
@ -122,6 +123,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks
public override void Read()
{
base.Read();
var start = Reader.Tell();
Handle = (int) Reader.ReadUInt32();
@ -153,6 +155,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Banks
this.Data = soundData.ReadBytes((int) soundData.Size());
//Logger.Log("SoundHeader: "+Data.GetHex(4));
if (Settings.DumpSounds)
{
Name = Helper.CleanInput(Name);

@ -6,16 +6,16 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects
{
public class ObjectCommon : ChunkLoader
{
private short _valuesOffset;
private short _stringsOffset;
private ushort _valuesOffset;
private ushort _stringsOffset;
private byte[] Identifier;
private int _fadeinOffset;
private int _fadeoutOffset;
private ushort _fadeinOffset;
private ushort _fadeoutOffset;
private ushort _movementsOffset;
private short _animationsOffset;
private short _systemObjectOffset;
public short CounterOffset;
public short ExtensionOffset;
private ushort _animationsOffset;
private ushort _systemObjectOffset;
public ushort _counterOffset;
public ushort _extensionOffset;
public Animations Animations;
private long _end;
@ -99,45 +99,48 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects
public override void Read()
{
if (Parent.ObjectType != 2) return;
long currentPosition = Reader.Tell();
int size = Reader.ReadInt32();
bool newobj = Settings.Build >= 284;
if (newobj)
//if(Parent.ObjectType!=2)return;
var currentPosition = Reader.Tell();
var size = Reader.ReadInt32();
if (Settings.Build >= 284)
{
_animationsOffset = (short) Reader.ReadUInt16();
_animationsOffset = Reader.ReadUInt16();
_movementsOffset = Reader.ReadUInt16();
var version = Reader.ReadUInt16();
Reader.Skip(2); //TODO: Find out
_counterOffset = Reader.ReadUInt16();
_systemObjectOffset = Reader.ReadUInt16();
}
else
{
_movementsOffset = Reader.ReadUInt16();
_animationsOffset = Reader.ReadInt16();
_animationsOffset = Reader.ReadUInt16();
var version = Reader.ReadUInt16();
_counterOffset = Reader.ReadUInt16();
_systemObjectOffset = Reader.ReadUInt16();
}
short version = Reader.ReadInt16();
CounterOffset = (short) Reader.ReadUInt16();
_systemObjectOffset = (short) Reader.ReadUInt16();
Flags.flag = Reader.ReadUInt32();
var end = Reader.Tell() + 16;
//Ignoring qualifiers
Reader.Seek(end);
if (newobj)
if (Settings.Build == 284)
{
_systemObjectOffset = Reader.ReadInt16();
_systemObjectOffset = Reader.ReadUInt16();
}
else
{
ExtensionOffset = Reader.ReadInt16();
_extensionOffset = Reader.PeekUInt16();
}
_valuesOffset = Reader.ReadInt16();
_stringsOffset = Reader.ReadInt16();
NewFlags.flag = Reader.ReadUInt16();
preferences.flag = Reader.ReadUInt16();
byte[] identifier = Reader.ReadFourCc();
_valuesOffset = Reader.ReadUInt16();
_stringsOffset = Reader.ReadUInt16();
NewFlags.flag = Reader.ReadUInt32();
preferences.flag = Reader.ReadUInt32();
Identifier = Reader.ReadBytes(4);
BackColor = Reader.ReadColor();
_fadeinOffset = Reader.ReadInt32();
_fadeoutOffset = Reader.ReadInt32();
_fadeinOffset = (ushort) Reader.ReadUInt32();
_fadeoutOffset = (ushort) Reader.ReadUInt32();
if (_movementsOffset != 0)
{
@ -194,9 +197,9 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects
}*/
if (_systemObjectOffset > 0)
if (_systemObjectOffset != 0)
{
Console.WriteLine("Reading System Object");
Logger.Log("Reading System Object: "+_systemObjectOffset);
Reader.Seek(currentPosition+_systemObjectOffset);
if (Parent.ObjectType == ((int) Constants.ObjectType.Text) ||
Parent.ObjectType == ((int) Constants.ObjectType.Question))
@ -207,15 +210,20 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects
Parent.ObjectType == ((int) Constants.ObjectType.Lives)||
Parent.ObjectType == ((int) Constants.ObjectType.Counter))
{
Logger.Log("Counter: "+Parent.Name);
Counters = new Counters(Reader);
Counters.Read();
}
}
// Logger.Log("anims: "+_animationsOffset);
// Logger.Log("fadeIn: "+_fadeinOffset);
// Logger.Log("fadeOut: "+_fadeoutOffset);
// Logger.Log("movements: "+_movementsOffset);
// Logger.Log("strings: "+_stringsOffset);
// Logger.Log("values: "+_valuesOffset);
// Logger.Log("sysObj: "+_systemObjectOffset);
// Console.WriteLine("SysObjOff: " + _systemObjectOffset);
// Console.WriteLine("ExtOff: " + _extensionOffset);
}
public override void Print(bool ext)

@ -1,6 +1,7 @@
using System;
using System.Diagnostics;
using System.Drawing;
using System.Globalization;
using System.IO;
using System.Runtime.InteropServices;
using System.Threading;
@ -34,10 +35,11 @@ namespace CTFAK
// Environment.Exit(0);
AppDomain.CurrentDomain.FirstChanceException += (sender, eventArgs) =>
{
if (eventArgs.Exception is ThreadAbortException) return;
if (eventArgs.Exception is ThreadAbortException) return;
var ex = (Exception) eventArgs.Exception;
Logger.Log("ERROR: ");
Logger.Log(eventArgs.Exception.ToString());
Logger.Log(ex.ToString());
};
Settings.UseGUI = true;

@ -79,7 +79,7 @@ namespace CTFAK.Properties.Locale {
}
/// <summary>
/// Looks up a localized string similar to Additinal Frame Item.
/// Looks up a localized string similar to Additional Frame Item.
/// </summary>
internal static string additionalFrameItem {
get {
@ -88,7 +88,7 @@ namespace CTFAK.Properties.Locale {
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Additional Object Inst.
/// </summary>
internal static string additionalObjectInstance {
get {
@ -97,7 +97,7 @@ namespace CTFAK.Properties.Locale {
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to App Doc.
/// </summary>
internal static string appDoc {
get {
@ -124,7 +124,7 @@ namespace CTFAK.Properties.Locale {
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Binary Files.
/// </summary>
internal static string binaryFiles {
get {
@ -133,7 +133,7 @@ namespace CTFAK.Properties.Locale {
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Bluray Options.
/// </summary>
internal static string blurayOptions {
get {
@ -151,7 +151,7 @@ namespace CTFAK.Properties.Locale {
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Demo File Path.
/// </summary>
internal static string demoFilePath {
get {
@ -160,7 +160,7 @@ namespace CTFAK.Properties.Locale {
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Demo Version.
/// </summary>
internal static string demoVersion {
get {
@ -169,7 +169,7 @@ namespace CTFAK.Properties.Locale {
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to EXE Only.
/// </summary>
internal static string exeOnly {
get {
@ -187,7 +187,7 @@ namespace CTFAK.Properties.Locale {
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Extented Header.
/// </summary>
internal static string extHeader {
get {
@ -196,7 +196,7 @@ namespace CTFAK.Properties.Locale {
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Extension List.
/// </summary>
internal static string extList {
get {
@ -205,7 +205,7 @@ namespace CTFAK.Properties.Locale {
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Extra Data.
/// </summary>
internal static string extraData {
get {
@ -214,7 +214,7 @@ namespace CTFAK.Properties.Locale {
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Extra Path.
/// </summary>
internal static string extraPath {
get {
@ -223,7 +223,7 @@ namespace CTFAK.Properties.Locale {
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Font Bank.
/// </summary>
internal static string fontBank {
get {
@ -232,7 +232,7 @@ namespace CTFAK.Properties.Locale {
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Font Offsets.
/// </summary>
internal static string fontOffsets {
get {
@ -520,7 +520,7 @@ namespace CTFAK.Properties.Locale {
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Music Bank.
/// </summary>
internal static string musicBank {
get {
@ -529,7 +529,7 @@ namespace CTFAK.Properties.Locale {
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Music Offsets.
/// </summary>
internal static string musicOffsets {
get {
@ -538,7 +538,7 @@ namespace CTFAK.Properties.Locale {
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to MV Timer Base.
/// </summary>
internal static string mvTimerBase {
get {
@ -547,7 +547,7 @@ namespace CTFAK.Properties.Locale {
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Object Bank.
/// </summary>
internal static string objectBank {
get {
@ -556,7 +556,7 @@ namespace CTFAK.Properties.Locale {
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Object Bank 2.
/// </summary>
internal static string objectBank2 {
get {
@ -565,7 +565,7 @@ namespace CTFAK.Properties.Locale {
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Object Common.
/// </summary>
internal static string objectCommon {
get {
@ -574,7 +574,7 @@ namespace CTFAK.Properties.Locale {
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Object Effects.
/// </summary>
internal static string objectEffects {
get {
@ -583,7 +583,7 @@ namespace CTFAK.Properties.Locale {
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Object Header.
/// </summary>
internal static string objectHeader {
get {
@ -592,7 +592,7 @@ namespace CTFAK.Properties.Locale {
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Object Name.
/// </summary>
internal static string objectName {
get {
@ -601,7 +601,7 @@ namespace CTFAK.Properties.Locale {
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Object Unknown.
/// </summary>
internal static string objectUnknown {
get {
@ -610,7 +610,7 @@ namespace CTFAK.Properties.Locale {
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Other Extensions.
/// </summary>
internal static string otherExts {
get {
@ -619,7 +619,7 @@ namespace CTFAK.Properties.Locale {
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Output Path.
/// </summary>
internal static string outputPath {
get {
@ -628,7 +628,7 @@ namespace CTFAK.Properties.Locale {
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Project Path.
/// </summary>
internal static string projectPath {
get {
@ -637,7 +637,7 @@ namespace CTFAK.Properties.Locale {
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Protection.
/// </summary>
internal static string protection {
get {
@ -646,7 +646,7 @@ namespace CTFAK.Properties.Locale {
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Random Seed.
/// </summary>
internal static string randomSeed {
get {
@ -655,7 +655,7 @@ namespace CTFAK.Properties.Locale {
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Security Number.
/// </summary>
internal static string secNum {
get {
@ -664,7 +664,7 @@ namespace CTFAK.Properties.Locale {
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Shaders.
/// </summary>
internal static string shaders {
get {
@ -673,7 +673,7 @@ namespace CTFAK.Properties.Locale {
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Sound Bank.
/// </summary>
internal static string soundBank {
get {
@ -682,7 +682,7 @@ namespace CTFAK.Properties.Locale {
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Sound Offsets.
/// </summary>
internal static string soundOffsets {
get {
@ -700,7 +700,7 @@ namespace CTFAK.Properties.Locale {
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Unknown-.
/// </summary>
internal static string unknown {
get {

@ -47,4 +47,184 @@
<data name="frameEffects" xml:space="preserve">
<value>Frame Effects</value>
</data>
<data name="unknown" xml:space="preserve">
<value>Unknown-</value>
</data>
<data name="soundOffsets" xml:space="preserve">
<value>Sound Offsets</value>
</data>
<data name="additionalObjectInstance" xml:space="preserve">
<value>Additional Object Inst</value>
</data>
<data name="appDoc" xml:space="preserve">
<value>App Doc</value>
</data>
<data name="binaryFiles" xml:space="preserve">
<value>Binary Files</value>
</data>
<data name="blurayOptions" xml:space="preserve">
<value>Bluray Options</value>
</data>
<data name="demoFilePath" xml:space="preserve">
<value>Demo File Path</value>
</data>
<data name="demoVersion" xml:space="preserve">
<value>Demo Version</value>
</data>
<data name="exeOnly" xml:space="preserve">
<value>EXE Only</value>
</data>
<data name="extHeader" xml:space="preserve">
<value>Extented Header</value>
</data>
<data name="extList" xml:space="preserve">
<value>Extension List</value>
</data>
<data name="extraData" xml:space="preserve">
<value>Extra Data</value>
</data>
<data name="extraPath" xml:space="preserve">
<value>Extra Path</value>
</data>
<data name="fontBank" xml:space="preserve">
<value>Font Bank</value>
</data>
<data name="fontOffsets" xml:space="preserve">
<value>Font Offsets</value>
</data>
<data name="FrameFadeIn" xml:space="preserve">
<value>Frame Fade In</value>
</data>
<data name="frameFadeInFrame" xml:space="preserve">
<value>Frame Fade In Frame</value>
</data>
<data name="frameFadeOut" xml:space="preserve">
<value>Frame Fade Out</value>
</data>
<data name="frameFadeOutFrame" xml:space="preserve">
<value>Frame Fade Out Frame</value>
</data>
<data name="frameHandles" xml:space="preserve">
<value>Frame Handles</value>
</data>
<data name="frameHeader" xml:space="preserve">
<value>Frame Header</value>
</data>
<data name="frameIphoneOptions" xml:space="preserve">
<value>Frame IPhone Options</value>
</data>
<data name="frameLayerEffects" xml:space="preserve">
<value>Frame Layer Effects</value>
</data>
<data name="frameLayers" xml:space="preserve">
<value>Frame Layers</value>
</data>
<data name="frameObjects" xml:space="preserve">
<value>Frame Objects</value>
</data>
<data name="framePalette" xml:space="preserve">
<value>Frame Palette</value>
</data>
<data name="framePassword" xml:space="preserve">
<value>Frame Password</value>
</data>
<data name="framePlayHeader" xml:space="preserve">
<value>Frame Play Header</value>
</data>
<data name="frameVirtualRect" xml:space="preserve">
<value>Frame Virtual Rect</value>
</data>
<data name="globalEvents" xml:space="preserve">
<value>Global Events</value>
</data>
<data name="globalStringNames" xml:space="preserve">
<value>Global String Names</value>
</data>
<data name="globalStrings" xml:space="preserve">
<value>Global Strings</value>
</data>
<data name="globalValueNames" xml:space="preserve">
<value>Global Value Names</value>
</data>
<data name="globalValues" xml:space="preserve">
<value>Global Values</value>
</data>
<data name="icon" xml:space="preserve">
<value>Icon</value>
</data>
<data name="imageBank" xml:space="preserve">
<value>Image Bank</value>
</data>
<data name="imagesOffsets" xml:space="preserve">
<value>Image Offsets</value>
</data>
<data name="last" xml:space="preserve">
<value>Last</value>
</data>
<data name="menu" xml:space="preserve">
<value>Menu</value>
</data>
<data name="menuImages" xml:space="preserve">
<value>Menu Images</value>
</data>
<data name="miniHeader" xml:space="preserve">
<value>Mini Header</value>
</data>
<data name="mosaicImageTable" xml:space="preserve">
<value>Mosaic Image Table</value>
</data>
<data name="musicBank" xml:space="preserve">
<value>Music Bank</value>
</data>
<data name="musicOffsets" xml:space="preserve">
<value>Music Offsets</value>
</data>
<data name="mvTimerBase" xml:space="preserve">
<value>MV Timer Base</value>
</data>
<data name="objectBank" xml:space="preserve">
<value>Object Bank</value>
</data>
<data name="objectBank2" xml:space="preserve">
<value>Object Bank 2</value>
</data>
<data name="objectCommon" xml:space="preserve">
<value>Object Common</value>
</data>
<data name="objectEffects" xml:space="preserve">
<value>Object Effects</value>
</data>
<data name="objectHeader" xml:space="preserve">
<value>Object Header</value>
</data>
<data name="objectName" xml:space="preserve">
<value>Object Name</value>
</data>
<data name="objectUnknown" xml:space="preserve">
<value>Object Unknown</value>
</data>
<data name="otherExts" xml:space="preserve">
<value>Other Extensions</value>
</data>
<data name="outputPath" xml:space="preserve">
<value>Output Path</value>
</data>
<data name="projectPath" xml:space="preserve">
<value>Project Path</value>
</data>
<data name="protection" xml:space="preserve">
<value>Protection</value>
</data>
<data name="randomSeed" xml:space="preserve">
<value>Random Seed</value>
</data>
<data name="secNum" xml:space="preserve">
<value>Security Number</value>
</data>
<data name="shaders" xml:space="preserve">
<value>Shaders</value>
</data>
<data name="soundBank" xml:space="preserve">
<value>Sound Bank</value>
</data>
</root>

@ -34,13 +34,13 @@
<value>Menu</value>
</data>
<data name="extraPath" xml:space="preserve">
<value />
<value>Extra Path</value>
</data>
<data name="extensions" xml:space="preserve">
<value>Extensions</value>
</data>
<data name="objectBank" xml:space="preserve">
<value />
<value>Object Bank</value>
</data>
<data name="globalEvents" xml:space="preserve">
<value>Global Events</value>
@ -49,22 +49,22 @@
<value>Frame Handles</value>
</data>
<data name="extraData" xml:space="preserve">
<value />
<value>Extra Data</value>
</data>
<data name="additionalExts" xml:space="preserve">
<value>Additional Extensions</value>
</data>
<data name="projectPath" xml:space="preserve">
<value />
<value>Project Path</value>
</data>
<data name="outputPath" xml:space="preserve">
<value />
<value>Output Path</value>
</data>
<data name="appDoc" xml:space="preserve">
<value />
<value>App Doc</value>
</data>
<data name="otherExts" xml:space="preserve">
<value />
<value>Other Extensions</value>
</data>
<data name="globalValues" xml:space="preserve">
<value>Global Values</value>
@ -73,19 +73,19 @@
<value>Global Strings</value>
</data>
<data name="extList" xml:space="preserve">
<value />
<value>Extension List</value>
</data>
<data name="icon" xml:space="preserve">
<value>Icon</value>
</data>
<data name="demoVersion" xml:space="preserve">
<value />
<value>Demo Version</value>
</data>
<data name="secNum" xml:space="preserve">
<value />
<value>Security Number</value>
</data>
<data name="binaryFiles" xml:space="preserve">
<value />
<value>Binary Files</value>
</data>
<data name="menuImages" xml:space="preserve">
<value>Menu Images</value>
@ -103,19 +103,19 @@
<value>Global String Names</value>
</data>
<data name="objectBank2" xml:space="preserve">
<value />
<value>Object Bank 2</value>
</data>
<data name="exeOnly" xml:space="preserve">
<value />
<value>EXE Only</value>
</data>
<data name="protection" xml:space="preserve">
<value />
<value>Protection</value>
</data>
<data name="shaders" xml:space="preserve">
<value />
<value>Shaders</value>
</data>
<data name="extHeader" xml:space="preserve">
<value />
<value>Extented Header</value>
</data>
<data name="frame" xml:space="preserve">
<value>Frame</value>
@ -154,10 +154,10 @@
<value>Frame Play Header</value>
</data>
<data name="additionalFrameItem" xml:space="preserve">
<value>Additinal Frame Item</value>
<value>Additional Frame Item</value>
</data>
<data name="additionalObjectInstance" xml:space="preserve">
<value />
<value>Additional Object Inst</value>
</data>
<data name="frameLayers" xml:space="preserve">
<value>Frame Layers</value>
@ -166,19 +166,19 @@
<value>Frame Virtual Rect</value>
</data>
<data name="demoFilePath" xml:space="preserve">
<value />
<value>Demo File Path</value>
</data>
<data name="randomSeed" xml:space="preserve">
<value />
<value>Random Seed</value>
</data>
<data name="frameLayerEffects" xml:space="preserve">
<value>Frame Layer Effects</value>
</data>
<data name="blurayOptions" xml:space="preserve">
<value />
<value>Bluray Options</value>
</data>
<data name="mvTimerBase" xml:space="preserve">
<value />
<value>MV Timer Base</value>
</data>
<data name="mosaicImageTable" xml:space="preserve">
<value>Mosaic Image Table</value>
@ -190,48 +190,48 @@
<value>Frame IPhone Options</value>
</data>
<data name="objectHeader" xml:space="preserve">
<value />
<value>Object Header</value>
</data>
<data name="objectName" xml:space="preserve">
<value />
<value>Object Name</value>
</data>
<data name="objectCommon" xml:space="preserve">
<value />
<value>Object Common</value>
</data>
<data name="objectUnknown" xml:space="preserve">
<value />
<value>Object Unknown</value>
</data>
<data name="objectEffects" xml:space="preserve">
<value />
<value>Object Effects</value>
</data>
<data name="imagesOffsets" xml:space="preserve">
<value>Image Offsets</value>
</data>
<data name="fontOffsets" xml:space="preserve">
<value />
<value>Font Offsets</value>
</data>
<data name="soundOffsets" xml:space="preserve">
<value />
<value>Sound Offsets</value>
</data>
<data name="musicOffsets" xml:space="preserve">
<value />
<value>Music Offsets</value>
</data>
<data name="imageBank" xml:space="preserve">
<value>Image Bank</value>
</data>
<data name="fontBank" xml:space="preserve">
<value />
<value>Font Bank</value>
</data>
<data name="soundBank" xml:space="preserve">
<value />
<value>Sound Bank</value>
</data>
<data name="musicBank" xml:space="preserve">
<value />
<value>Music Bank</value>
</data>
<data name="last" xml:space="preserve">
<value>Last</value>
</data>
<data name="unknown" xml:space="preserve">
<value />
<value>Unknown-</value>
</data>
</root>

@ -24,7 +24,7 @@
<value>Автор</value>
</data>
<data name="copyright" xml:space="preserve">
<value>Copyright</value>
<value>Копирайт</value>
</data>
<data name="frameName" xml:space="preserve">
<value>Название Сцены</value>
@ -44,4 +44,187 @@
<data name="frameEvents" xml:space="preserve">
<value>События Сцены</value>
</data>
<data name="unknown" xml:space="preserve">
<value>Неизвестный-</value>
</data>
<data name="soundOffsets" xml:space="preserve">
<value>Смещения звуков</value>
</data>
<data name="additionalObjectInstance" xml:space="preserve">
<value>Дополнительный инстанс сцены помогите</value>
</data>
<data name="appDoc" xml:space="preserve">
<value>Документация</value>
</data>
<data name="binaryFiles" xml:space="preserve">
<value>Бинарные файлы</value>
</data>
<data name="blurayOptions" xml:space="preserve">
<value>Настройки Bluray</value>
</data>
<data name="demoFilePath" xml:space="preserve">
<value>Путь к демо-файлу</value>
</data>
<data name="demoVersion" xml:space="preserve">
<value>Демо</value>
</data>
<data name="exeOnly" xml:space="preserve">
<value>Только для exe</value>
</data>
<data name="extHeader" xml:space="preserve">
<value>Расширенный заголовок</value>
</data>
<data name="extList" xml:space="preserve">
<value>Список расширений</value>
</data>
<data name="extraData" xml:space="preserve">
<value>Дополнительные данные</value>
</data>
<data name="extraPath" xml:space="preserve">
<value>Дополнительный путь</value>
</data>
<data name="fontBank" xml:space="preserve">
<value>Шрифты</value>
</data>
<data name="fontOffsets" xml:space="preserve">
<value>Смещения шрифтов</value>
</data>
<data name="frameEffects" xml:space="preserve">
<value>Эффекты Сцены</value>
</data>
<data name="FrameFadeIn" xml:space="preserve">
<value>Вход Сцены</value>
</data>
<data name="frameFadeInFrame" xml:space="preserve">
<value>Кадр Входа Сцены</value>
</data>
<data name="frameFadeOut" xml:space="preserve">
<value>Выход Сцены</value>
</data>
<data name="frameFadeOutFrame" xml:space="preserve">
<value>Кадр Выхода Сцены</value>
</data>
<data name="frameHandles" xml:space="preserve">
<value>Идентификаторы Сцен</value>
</data>
<data name="frameHeader" xml:space="preserve">
<value>Заголовок Сцены</value>
</data>
<data name="frameIphoneOptions" xml:space="preserve">
<value>Настройки айфона?</value>
</data>
<data name="frameLayerEffects" xml:space="preserve">
<value>Эффекты слоев сцены</value>
</data>
<data name="frameLayers" xml:space="preserve">
<value>Слои Сцены</value>
</data>
<data name="frameObjects" xml:space="preserve">
<value>Объекты Сцены</value>
</data>
<data name="framePalette" xml:space="preserve">
<value>Палитра Сцены</value>
</data>
<data name="framePassword" xml:space="preserve">
<value>Пароль Сцены</value>
</data>
<data name="framePlayHeader" xml:space="preserve">
<value>Заголовок воспроизведения</value>
</data>
<data name="frameVirtualRect" xml:space="preserve">
<value>Виртуальный член сцены</value>
</data>
<data name="globalEvents" xml:space="preserve">
<value>Глобальные события</value>
</data>
<data name="globalStringNames" xml:space="preserve">
<value>Названия глобальных строк</value>
</data>
<data name="globalStrings" xml:space="preserve">
<value>Глобальные строки</value>
</data>
<data name="globalValueNames" xml:space="preserve">
<value>Названия глобальных чисел</value>
</data>
<data name="globalValues" xml:space="preserve">
<value>Глобальные числа</value>
</data>
<data name="icon" xml:space="preserve">
<value>Иконка</value>
</data>
<data name="imageBank" xml:space="preserve">
<value>Изображения</value>
</data>
<data name="imagesOffsets" xml:space="preserve">
<value>Смещения изображений</value>
</data>
<data name="last" xml:space="preserve">
<value>Последний чанк</value>
</data>
<data name="menu" xml:space="preserve">
<value>Меню</value>
</data>
<data name="menuImages" xml:space="preserve">
<value>Изображения меню</value>
</data>
<data name="miniHeader" xml:space="preserve">
<value>Мини заголовок</value>
</data>
<data name="mosaicImageTable" xml:space="preserve">
<value>мозайка какая-то</value>
</data>
<data name="musicBank" xml:space="preserve">
<value>Музыка</value>
</data>
<data name="musicOffsets" xml:space="preserve">
<value>Смещения музыки</value>
</data>
<data name="mvTimerBase" xml:space="preserve">
<value>База таймера</value>
</data>
<data name="objectBank" xml:space="preserve">
<value>Объекты</value>
</data>
<data name="objectBank2" xml:space="preserve">
<value>Объекты 2</value>
</data>
<data name="objectCommon" xml:space="preserve">
<value>Данные Объекта</value>
</data>
<data name="objectEffects" xml:space="preserve">
<value>Эффекты Объекта</value>
</data>
<data name="objectHeader" xml:space="preserve">
<value>Заголовок Объекта</value>
</data>
<data name="objectName" xml:space="preserve">
<value>Название Объекта</value>
</data>
<data name="objectUnknown" xml:space="preserve">
<value>Неизвестная часть объекта</value>
</data>
<data name="otherExts" xml:space="preserve">
<value>Дополнительные Расширения</value>
</data>
<data name="outputPath" xml:space="preserve">
<value>Выходной путь</value>
</data>
<data name="projectPath" xml:space="preserve">
<value>Путь проекта</value>
</data>
<data name="protection" xml:space="preserve">
<value>Защита</value>
</data>
<data name="randomSeed" xml:space="preserve">
<value>Рандомное семя</value>
</data>
<data name="secNum" xml:space="preserve">
<value>Защитное число</value>
</data>
<data name="shaders" xml:space="preserve">
<value>Шейдеры</value>
</data>
<data name="soundBank" xml:space="preserve">
<value>Звуки</value>
</data>
</root>

@ -105,6 +105,24 @@ namespace CTFAK.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to Frame Count.
/// </summary>
internal static string frameCount {
get {
return ResourceManager.GetString("frameCount", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Unique FrameItems.
/// </summary>
internal static string frameitemCount {
get {
return ResourceManager.GetString("frameitemCount", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Copyright.
/// </summary>
@ -123,6 +141,15 @@ namespace CTFAK.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to Number of Images.
/// </summary>
internal static string imageCount {
get {
return ResourceManager.GetString("imageCount", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Loading.
/// </summary>
@ -132,6 +159,15 @@ namespace CTFAK.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to Number of Musics.
/// </summary>
internal static string musicCount {
get {
return ResourceManager.GetString("musicCount", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Open Dump Folder.
/// </summary>
@ -158,5 +194,14 @@ namespace CTFAK.Properties {
return ResourceManager.GetString("selectFile", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Number of Sounds.
/// </summary>
internal static string soundCount {
get {
return ResourceManager.GetString("soundCount", resourceCulture);
}
}
}
}

@ -44,4 +44,19 @@
<data name="readingFrame" xml:space="preserve">
<value>Reading Frame:</value>
</data>
<data name="imageCount" xml:space="preserve">
<value>Number of Images</value>
</data>
<data name="musicCount" xml:space="preserve">
<value>Number of Musics</value>
</data>
<data name="soundCount" xml:space="preserve">
<value>Number of Sounds</value>
</data>
<data name="frameCount" xml:space="preserve">
<value>Frame Count</value>
</data>
<data name="frameitemCount" xml:space="preserve">
<value>Unique FrameItems</value>
</data>
</root>

@ -51,4 +51,19 @@
<data name="readingFrame" xml:space="preserve">
<value>Reading Frame:</value>
</data>
<data name="imageCount" xml:space="preserve">
<value>Number of Images</value>
</data>
<data name="soundCount" xml:space="preserve">
<value>Number of Sounds</value>
</data>
<data name="musicCount" xml:space="preserve">
<value>Number of Musics</value>
</data>
<data name="frameCount" xml:space="preserve">
<value>Frame Count</value>
</data>
<data name="frameitemCount" xml:space="preserve">
<value>Unique FrameItems</value>
</data>
</root>

@ -21,7 +21,7 @@
<value>Сохранить Музыку</value>
</data>
<data name="dumpSorted" xml:space="preserve">
<value>Сохранение с сортировкой</value>
<value>Сохранить Картинки с сортировкой</value>
</data>
<data name="dumpSounds" xml:space="preserve">
<value>Сохранить звуки</value>
@ -44,4 +44,19 @@
<data name="readingFrame" xml:space="preserve">
<value>Чтение сцены:</value>
</data>
<data name="imageCount" xml:space="preserve">
<value>Количество Картинок</value>
</data>
<data name="musicCount" xml:space="preserve">
<value>Количество Музыки</value>
</data>
<data name="soundCount" xml:space="preserve">
<value>Количество Звуков</value>
</data>
<data name="frameCount" xml:space="preserve">
<value>Количество Сцен</value>
</data>
<data name="frameitemCount" xml:space="preserve">
<value>Уникальных Объектов</value>
</data>
</root>

@ -26,50 +26,17 @@ namespace CTFAK.Utils
public static void MakeKey(string data1, string data2, string data3)
{
var russian = false;
IntPtr keyPtr=new IntPtr();
if (russian)
{
var fixed1 = FixString(Encoding.Unicode.GetBytes(data1));
var data1Ptr = Marshal.AllocHGlobal(fixed1.Length);
Marshal.Copy(fixed1,0,data1Ptr,fixed1.Length);
var fixed2 = FixString(Encoding.Unicode.GetBytes(data2));
var data2Ptr = Marshal.AllocHGlobal(fixed2.Length);
Marshal.Copy(fixed2,0,data2Ptr,fixed2.Length);
var fixed3 = FixString(Encoding.Unicode.GetBytes(data3));
var data3Ptr = Marshal.AllocHGlobal(fixed3.Length);
Marshal.Copy(fixed3,0,data1Ptr,fixed3.Length);
keyPtr = make_key_w(data1Ptr,data2Ptr,data3Ptr,MagicChar);
Marshal.FreeHGlobal(data1Ptr);
Marshal.FreeHGlobal(data2Ptr);
Marshal.FreeHGlobal(data3Ptr);
}
else
{
var rawKey = "";
rawKey += data1;
rawKey += data2;
rawKey += data3;
Logger.Log("Combined data " + rawKey, true, ConsoleColor.Yellow);
keyPtr = Marshal.StringToHGlobalAnsi(rawKey);
keyPtr = make_key_combined(keyPtr, MagicChar);
}
IntPtr keyPtr;
var combined = "";
combined += data1;
combined += data2;
combined += data3;
Logger.Log("Combined data " + combined, true, ConsoleColor.Yellow);
keyPtr = Marshal.StringToHGlobalAnsi(combined);
keyPtr = make_key_combined(keyPtr, MagicChar);
byte[] key = new byte[256];
Marshal.Copy(keyPtr, key, 0, 256);
_decryptionKey = key;
Logger.Log($"First 16-Bytes of key: {_decryptionKey.GetHex(16)}", true, ConsoleColor.Yellow);
Logger.Log(Encoding.Unicode.GetString(_decryptionKey));
File.WriteAllBytes($"{Settings.DumpPath}\\key.bin", _decryptionKey);

@ -7,6 +7,13 @@ namespace CTFAK.Utils
public static class Logger
{
static StreamWriter _writer;
public static void Log(object text, bool logToScreen = true, ConsoleColor color = ConsoleColor.White,
bool logToConsole = true)
{
Log(text.ToString(), logToScreen, color, logToConsole);
}
public static void Log(string text, bool logToScreen = true,ConsoleColor color = ConsoleColor.White, bool logToConsole=true)
{

Loading…
Cancel
Save