Rusty Hearts

Status
Not open for further replies.
Joined
Jan 21, 2007
Messages
4,485
Reaction score
158
I've been playing this game for the past few days. It seems really promising. I love the anime style theme. The characters were well thought out with their background and their special abilities and weapons. The dungeon exploring could have been more thought out, but still good. I still like the game though. I'm currently using Angela with the nickname Milady, usually in the top right world or whatever they call it.

What about you guys?
 
I'm using Frantz and he's pretty good at skill combo'ing. IGN is Dell. I love the cutscenes but the loading time between cutscenes and map loading seem a bit too long especially the tutorial stage. Also the whole character select/create thing was really cool looking, but they should have removed the character that we can't play yet.

I find it great except for the item shop/mailbox glitches. Also the whole stamina thing is lame in mmorpgs. I also found it dumb that after I registered for CBT they started giving out keys that come with special packages and costumes and I have no idea if I can get these packages now since I can't enter in another key. Another thing I found dumb is that their client is easily editable and un-packable just like Perfect World. You'd think they would learn by now.

I'd rate the game around 8/10 for now even though it's still in CBT. I'm sure it'll get better, also hoping for some nice CBT rewards.
 
Last edited:
Yeah, the loading times take forever on it. Might be due to server load and my computer specs though.
My tutorial was lagging so much that it skipped most of it.
Yes, they should remove the character we can't play yet.

I haven't heard of the glitches yet. Harmful glitches or what?
I'm sure it will get better also, it's only in Closed Beta.
 
Yeah, the loading times take forever on it. Might be due to server load and my computer specs though.
My tutorial was lagging so much that it skipped most of it.
Yes, they should remove the character we can't play yet.

I haven't heard of the glitches yet. Harmful glitches or what?
I'm sure it will get better also, it's only in Closed Beta.

I've noticed only the fashion crafting glitch and mailbox/item mall glitch.

There is like 21 pages of bugs/glitches on the RH forums though lol.
 
IGN Kamijo. I play Frantz also.
It's still CB, so I don't really mind the bugs and glitches.
Overall the whole concept is truly awesome.
I just hope they fix what needs to be fixed and don't mess things up.
The character that we can't play yet is already in the Korean version.
It isn't really a problem. I think it's cool you already get a preview for the next playable character.
Anyway, that's what I think. :P

@Dell Honne: What game is the picture in your signature from?
 
IGN Kamijo. I play Frantz also.
It's still CB, so I don't really mind the bugs and glitches.
Overall the whole concept is truly awesome.
I just hope they fix what needs to be fixed and don't mess things up.
The character that we can't play yet is already in the Korean version.
It isn't really a problem. I think it's cool you already get a preview for the next playable character.
Anyway, that's what I think. :P

@Dell Honne: What game is the picture in your signature from?

It's an animation of Ragnarok online. You can find it on youtube by searching Ragnarok battle animation.

Frantz is pretty cool to play with his rape skill combos. I can't wait to see his axe moves.

I also tried out Tude. He's got this epic stun skill which is a beast skill to use against bosses since it stuns them too.

@Anyone looking to emulate this game as of now, Wait till at least official launch or OBT before starting as the game has tons of bugs/glitches that would affect players.
 
Last edited:
i have a Angela, Frantz, and a Tude they are all amazing characters to play but if you want a straight skill chain whore Tude is amazing at chains lol at lv3 i pulled a 43 chain on 5 mobs xD it was insane
 
@Dell Honne: Thanks. It did look like RO, but I wasn't sure, cause RO isn't like that when you play it. Cool how they made that. I kinda wanna play RO now. lol.

Private server for this would be pretty awesome.

I found this video with some material of lvl 40's fighting and it also shows some pets and new bosses.

It's pretty awesome. :)
 
It depends on the quests and dungeons you do xD

Solo'ing VH will net you alot of EXP (I'm not sure which characters can solo VH but I know I've been solo'ing till wine cellar with frantz)

I just follow what ever the main quest is but yeah... took almost 1hour to get to level 5 xD, even with normal quest... it takes forever
 
hehe glad to see people playin it... my ign is ofc 'tinkle' that's my frantz ;> he's pretty much my main although Angela does rock too. I made one of each of course... but I wait for Natasha (4th char) since she'll be ranged (dual guns/rifle)... Frantz is pretty good at soloing VH but I think they all can... just takes some time to get used to it... Also it's super fun to play with a controller xD... I agree a PS would be nice though. :D
 
Seems like most of the configs are readable by notepad++

Also the client uses pck files... just like JD and PW.

I can't extract them using PW/JD's tools though so something must be different.

Here's a file extractor I just wrote. Their format is pretty simple, just XOR encrypted file headers that are compressed and uncompressed data entries. They also have a hash value for the data, but I haven't tracked that down yet. I'll look into it later maybe.

Included is complete source + binary. Using is simple, just copy "RustyHeartsExtractor.exe" and "ZlibDll.dll" to the "Rusty Hearts" folder and run "RustyHeartsExtractor.exe". There's a ton of files, so it takes a long time to run (probably because it's single threaded, but oh well, it's just a quick tool). Any errors encountered will be output to the console (make sure RustyHearts is not running and files are not locked!)

RustyHeartsExtractor.cs
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime.InteropServices;
using System.Security.Cryptography;

namespace RustyHeartsExtractor
{
    class Program
    {
        [DllImport("ZlibDll.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern int Decompress(byte[] compressed_buffer, int compressed_size, byte[] decompressed_buffer, ref int decompressed_size);

        static void Main(string[] args)
        {
            try
            {
                byte[] DecryptTable1 = new byte[]
                {
                      0x30, 0x22, 0x41, 0xA8, 0x5B, 0xA6, 0x6A, 0x49, 0xBF, 0x53, 0x35, 0xE5, 0x9E, 0x0E, 0xEC, 0xB8, 0x5E, 0x15, 0x1F, 0xC1, 0x4F, 0xEC, 0x77, 0xE8, 0xB7, 0x4E, 0x87, 0xE6, 0xF5, 0x3C, 0xB3, 0x43
                    , 0xCC, 0x53, 0x36, 0xAC, 0x5A, 0x77, 0xB8, 0xDD, 0x30, 0x74, 0x8C, 0x4A, 0x9A, 0x9B, 0xBC, 0x0A, 0xA4, 0xAD, 0xBB, 0x13, 0x4B, 0x8C, 0xD4, 0x80, 0xCE, 0x65, 0x1D, 0x08, 0x5A, 0x6A, 0x6F, 0x25
                    , 0xF9, 0x3F, 0xEF, 0x1B, 0xA4, 0x72, 0x14, 0xED, 0x97, 0x22, 0x4A, 0x2E, 0xB8, 0x96, 0x4B, 0x8E, 0x96, 0x93, 0xF1, 0x28, 0xB2, 0x0B, 0x3C, 0xF8, 0x5D, 0xAA, 0xA9, 0x82, 0x13, 0x6E, 0xC1, 0xA9
                    , 0x20, 0x57, 0xB2, 0x5B, 0x16, 0xCF, 0x9E, 0x5F, 0xD4, 0xCC, 0x2E, 0xF5, 0xC9, 0x4C, 0x1C, 0xEE, 0xE3, 0x3F, 0x29, 0xB3, 0x06, 0x70, 0x43, 0x3D, 0xF5, 0x90, 0xA2, 0x42, 0x02, 0x98, 0x50, 0xFD
                    , 0x5D, 0x4E, 0x92, 0xAD, 0xAD, 0x7F, 0xAB, 0x60, 0x2C, 0xB8, 0x43, 0x76, 0x8F, 0x5F, 0xE6, 0xA7, 0x19, 0xE0, 0xB9, 0xB5, 0x62, 0x6B, 0xD4, 0x47, 0x69, 0x34, 0x0E, 0x6D, 0xA4, 0x52, 0xE3, 0x64
                    , 0x4A, 0x65, 0x47, 0xF5, 0x3F, 0x53, 0x5E, 0x8B, 0x1B, 0xFD, 0x21, 0xF7, 0xBA, 0x68, 0xF9, 0xDF, 0x68, 0xA8, 0x96, 0x0F, 0x8B, 0x01, 0x97, 0x58, 0x8C, 0x1E, 0xEF, 0xB3, 0x41, 0x44, 0x21, 0xDA
                    , 0xE0, 0xF4, 0xE0, 0x2D, 0xCD, 0x0B, 0xF0, 0x5C, 0x59, 0xD6, 0x99, 0xE7, 0x01, 0x15, 0x67, 0x32, 0xE0, 0x12, 0x2F, 0xCD, 0xA2, 0xDE, 0x52, 0xCE, 0xEC, 0xEF, 0x77, 0x0E, 0xBC, 0x38, 0x64, 0x8D
                    , 0xB4, 0xDB, 0x67, 0xFF, 0xC8, 0x66, 0x0C, 0x8A, 0x60, 0xE1, 0x2E, 0x00, 0x43, 0xA9, 0x37, 0x9C, 0x11, 0xAA, 0xB9, 0x98, 0xED, 0x21, 0x35, 0xD4, 0xC3, 0xDE, 0x65, 0x54, 0x9D, 0x1C, 0xB0, 0xA9
                };

                byte[] compressed_bytes = null;

                using (FileStream fs = new FileStream("f00X.dat", FileMode.Open, FileAccess.Read))
                {
                    using (BinaryReader br = new BinaryReader(fs))
                    {
                        compressed_bytes = br.ReadBytes((int)br.BaseStream.Length);
                    }
                }

                for (int x = 0; x < compressed_bytes.Length; ++x)
                {
                    compressed_bytes[x] ^= DecryptTable1[x & 0xFF];
                }

                int decompressed_size = (compressed_bytes.Length << 4) - compressed_bytes.Length;
                byte[] decompressed_bytes = new byte[decompressed_size];

                int result = Decompress(compressed_bytes, compressed_bytes.Length, decompressed_bytes, ref decompressed_size);
                if (result != 0)
                {
                    Console.WriteLine("Error: Decompress returned error code {0}.", result);
                    return;
                }

                Dictionary<int, FileStream> archives = new Dictionary<int, FileStream>();
                Dictionary<int, BinaryReader> readers = new Dictionary<int, BinaryReader>();
                String[] files = Directory.GetFiles(Directory.GetCurrentDirectory(), "*.pck");
                foreach (String file in files)
                {
                    FileStream ofs = new FileStream(file, FileMode.Open, FileAccess.Read);
                    BinaryReader obr = new BinaryReader(ofs);
                    Int32 key = Int32.Parse(Path.GetFileNameWithoutExtension(file));
                    archives.Add(key, ofs);
                    readers.Add(key, obr); 
                }

                using (MemoryStream ms = new MemoryStream(decompressed_bytes, 0, decompressed_size, false))
                {
                    using (BinaryReader br = new BinaryReader(ms))
                    {
                        while (br.BaseStream.Position != br.BaseStream.Length)
                        {
                            try
                            {
                                UInt16 len = br.ReadUInt16();
                                String name = Encoding.Unicode.GetString(br.ReadBytes(len * 2));
                                byte archive = br.ReadByte(); // Which archive is it in
                                Int32 size = br.ReadInt32(); // Size of the file
                                UInt32 hash = br.ReadUInt32(); // Guessing the hash of the data, might check it out later
                                long offset = br.ReadInt64(); // Offset in the file

                                BinaryReader br2 = readers[archive];
                                br2.BaseStream.Position = offset;
                                byte[] bytes = br2.ReadBytes(size);

                                Directory.CreateDirectory(Path.GetDirectoryName(Directory.GetCurrentDirectory() + "\\output\\" + name));
                                using (FileStream ofs = new FileStream(Directory.GetCurrentDirectory() + "\\output\\" + name, FileMode.Create, FileAccess.Write))
                                {
                                    using (BinaryWriter bw = new BinaryWriter(ofs))
                                    {
                                        bw.Write(bytes);
                                        bw.Flush();
                                    }
                                }
                            }
                            catch (Exception ex)
                            {
                                Console.WriteLine("Error: {0}", ex);
                            }
                        }
                    }
                }

                foreach (var kvp in archives)
                {
                    kvp.Value.Close();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error: {0}", ex);
            }
        }
    }
}

zlibdll.cpp (zlib can be downloaded from its if needed.)
Code:
#include <windows.h>
#include "zlib/zlib.h"
#include <stdio.h>

extern "C" __declspec(dllexport) int Decompress(unsigned char * compressed, unsigned int compressed_size, unsigned char * decompressed, unsigned int * decompressed_size )
{
	unsigned int est_size = *decompressed_size * 5;
	if( est_size < 4096 ) est_size = 4096;
	unsigned char * workspace = (unsigned char *)malloc( est_size );
	int result = Z_OK;
	do 
	{
		result = uncompress((Bytef*)workspace, (uLongf *)&est_size, (Bytef*)compressed, compressed_size);
		if( result == Z_OK )
		{
			if( *decompressed_size >= est_size )
			{
				*decompressed_size = est_size;
				memcpy( decompressed, workspace, est_size );
			}
			else
			{
				result = -10; // decompression size mismatch
			}
		}
		else if( result == Z_BUF_ERROR )
		{
			est_size *= 2;
			workspace = (unsigned char *)realloc(workspace, est_size);
		}
	} while( result == Z_BUF_ERROR );
	free( workspace );
	return result;
}

extern "C" __declspec(dllexport) int Compress(unsigned char * decompressed, unsigned int decompressed_size, unsigned char * compressed, unsigned int * compressed_size )
{
	unsigned int est_size = decompressed_size * 5;
	if( est_size < 4096 ) est_size = 4096;
	unsigned char * workspace = (unsigned char *)malloc( est_size );
	int result = Z_OK;
	do 
	{
		result = compress((Bytef*)workspace, (uLongf *)&est_size, (Bytef*)decompressed, decompressed_size);
		if( result == Z_OK )
		{
			*compressed_size = est_size;
			memcpy( compressed, workspace, est_size );
		}
		else if( result == Z_BUF_ERROR )
		{
			est_size *= 2;
			workspace = (unsigned char *)realloc(workspace, est_size);
		}
	} while( result == Z_BUF_ERROR );
	free( workspace );
	return result;
}

Some screens:
wesman2232 - Rusty Hearts - RaGEZONE Forums


This game has some pretty nice music! Everyone one is free to extend the code to make it threaded, add guis, or allow specific extraction capabilities. Packing shouldn't be too hard once the last field is worked out and any file headers in the data files. If you post anywhere else, please refer back to ragezone.

Download: Attached w/ Full Source ( )
 

Attachments

Status
Not open for further replies.
Back