PDA

View Full Version : Idea



Hapuga
September 5th, 2009, 18:07
Howe about bringing the aggressive AI back? I am now trying to figure it out what files and commands are responsible for AI in DK2. I want o copy AI from DK2 1.51 (best AI) to current version. I am not a programmer, so I will appreciate all help and suggestions.

dk2player
September 5th, 2009, 18:55
don't know much about that stuff, but it would be nice to see more aggresive ai, like in dk1

Ðârk Âñgêl
September 6th, 2009, 15:02
that would be nice,
but i cant help, too :S

dk2player
September 6th, 2009, 15:08
I might, if you can tell me exactly what to do.

Hapuga
September 6th, 2009, 16:50
My plan is very simple. I want to open dk2 1.7 exe, find the code responsible for AI and replace it with the 1.51 version. Bingo. I suspect that some problems may occur with the Maiden or Elite creatures, but maidens are avoided easily through options, AI never builds rooms to get Elites, its too complicated for him and other things should be fine. Well, Hero portal maps should be avoided too I suppose.

nebster
September 6th, 2009, 17:27
My plan is very simple. I want to open dk2 1.7 exe, find the code responsible for AI and replace it with the 1.51 version. Bingo. I suspect that some problems may occur with the Maiden or Elite creatures, but maidens are avoided easily through options, AI never builds rooms to get Elites, its too complicated for him and other things should be fine. Well, Hero portal maps should be avoided too I suppose.

If you're planning on doing that, would you be able to look up how the DK2 master server works? Like what the exe is expecting as a reply. Me and Dotted had a look at it and the data doesn't seem to make much sense.

Hapuga
September 6th, 2009, 19:22
I am not a programmer, but I'll see what I can do

Madkill
September 7th, 2009, 23:10
Best of luck dude. :spider:

Hapuga
September 8th, 2009, 19:01
Progress report:

Good news. It looks like the initial AI sits not in the EXE file. Will doublecheck, but so far it looks like this. This is very good news, because exe editing is hell.

Duke Ragereaver
September 8th, 2009, 19:26
Does the probbability exist of conflicting files if transferred? Or bad side effects?

Ps: I really hope you will be succesfull. :)

Madkill
September 8th, 2009, 21:29
Seeing as how you're doing this. Have you ever thought of helping us mappers out by fixing the code which cuts out certain missing objects ?


If this has already been done then... Linky? :spider:

Hapuga
September 8th, 2009, 21:51
All the huge files like graphics and engine data lie in separate folders. EXE (normally) has only waypoints to this data. exe is an executable file.

Now about cutting something. This is close to impossible. Even with having an EXE decompiled, it has very litthe sense. EXE is an executable file, made of binary coding. Unless you're a hi-grade programmer, or a computer geek, you can't read it. Even if you can, It takes very long to figure it out, what does that code mean, and to what it relates to.

I can tell you a bit about the 1.73 exe. Someone who did it, knows much more than me. He figured it out, that the file dk2.icd is responsible for disk-checking. so he included the file in the EXE, and by doing so, avoided disk-check. It's easily seen from file size, normal v1.7 exe is 263 kb, and cracked one is 3megs I think.

Now, what I try to do is basically an attempt to find the right binary code that is responsible for AI. If I am succesful, I will simply change the 1.51 code with the 1.7 code, making normal DK2 v1.7 to have good AI. This is a very inaccurate and crude way of making things, but hey, I'm not a programmer =)

I will teach you how to edit campaign maps in the future. It's simple.

Ðârk Âñgêl
September 9th, 2009, 12:07
instead of replacing the binary code for ai, it is also possible to create a new one, isnt it ? in order to make ai mega strong.
would that be possible only for real programmers ?

dk2player
September 9th, 2009, 15:34
Mayb but most of the coders are probably working on nbk and dk3. Where are they going to find the time to make new codes for dk2.

Hapuga
September 9th, 2009, 16:59
Dos moipu sto, kai tan gan kinaso. (c) Archimed

Show me where AI sits, rest is piece of cake.

Ðârk Âñgêl
September 9th, 2009, 18:44
that means if you find where the code of ai is, you could make ai mega strong, stronger than in all versions ? that would be cool.

ask some programmers, they might know where you can find such codes.

Hapuga
September 9th, 2009, 21:26
that means if you find where the code of ai is, you could make ai mega strong, stronger than in all versions ? that would be cool.

ask some programmers, they might know where you can find such codes.

Probably.

Dont know any programmers.

dk2player
September 9th, 2009, 22:06
Try to look at the old forum, the names of the coders are there, and see if they're on this forum too

Dark_Omega MK2
September 10th, 2009, 11:09
it would be nice and challenging to have a stronger AI...

or... at the VERY least... one that does something for a change...

good luck with that :)

Hapuga
September 10th, 2009, 16:34
I have to admit, that it is beyond me. Reverse Engineering is very difficult by itself, even for skilled programmers. No, I can't find a solution. I did learn a lot about gaming and about creating games, however =) It was a great trip across the game. But I'm not doing it again, unless a skilled programmer is willing to help me.

FREEZED.

Jibbits
September 13th, 2009, 04:10
I've been trying to do this but the program I use to convert the machine code into something I can read always crashes. And if the machine code itself is readable I can't find anywhere to learn how to do it. I'm trying to learn assembly code but I don't think that is the same

So if I try to do this in a hex editor I am completely lost

I wonder what you did lol

btw I am not a programmer but I have helped programmers and I know hexadecimal and DK1 scripting lol :P (well maybe this does make me a crappy programmer technically...)

Well now that I looked again i guess you did the exact same as me :p

WEll if anyone will get me a program that can decompile / (deassemble?) without crashing I have enough time such that I may experiment and maybe after a period of months I'll find what code in the .exe controls ai :p

Hapuga
September 13th, 2009, 08:00
What I used:

Hex Workshop Hex Editor

PE Explorer

neuronshell

and another prog called EXE.

If you have difficulty finding those I can help.

dotted
September 13th, 2009, 13:24
Try this disassembler, worked for me - i attached the disassembled DK2 exe aswell, beware tho the extracted text file is 40MB

Jibbits
September 14th, 2009, 02:31
Try this disassembler, worked for me - i attached the disassembled DK2 exe aswell, beware tho the extracted text file is 40MB

Thanks

Jibbits
September 15th, 2009, 10:12
I think I've found the 1.7 ai, now i need someone to send me dk2 1.51 DKII.icd file so i can replace the 1.7 ai

well actually

you dont have to but you will late longer then, for decent ai ;)

Hapuga
September 15th, 2009, 11:40
(Hugs Jibbits)

Here ye go dear lad!

Jibbits
September 15th, 2009, 12:22
(Hugs Jibbits)

Here ye go dear lad!

thank you

dotted
September 15th, 2009, 12:58
thank you

The ICD is a encrypted version of the DK2.exe, so you need a cracked version.

Hapuga
September 16th, 2009, 16:20
Nope, imp wars, as always.

Jibbits
September 16th, 2009, 17:27
Nope, imp wars, as always.

you're right :-/ i thought the ai used the call to arms more but i watched it more now and i think im just hallucinating

but wait what exactly does the ai do in 1.51?

does it build any different?

Madkill
September 16th, 2009, 23:28
Nope, imp wars, as always.

I think I remade that Imp Wars map from DKI for DKII.


I edited the variables of the Imps so they wouldn't fear everything. I think I still have it...somewhere.

dk2player
September 16th, 2009, 23:47
but wait what exactly does the ai do in 1.51?

does it build any different?

It just attacks better. It accually tries to kill you, not just be an obstical

Jibbits
September 17th, 2009, 10:33
It just attacks better. It accually tries to kill you, not just be an obstical

That's it? Well this is the only changes I noticed with 1.51 code in it, that the ais seem to use call to arms more, they drop creatures one by one into battle, and they seem to put more in the combat pit at once even when the combat pit is too small. But I'm not really sure, could already be doing these in 1.7 and I'm just imagining things :rolleyes: Also they seem to use traps and doors more but this last one im really not sure

Other than that they build exactly the same, mine exactly the same, are generally retarded, the same :p

Someone needs to play 1.51 and tell me whats the difference in the ai really because i cant :p

I have to say though, I think now, that Bullfrog, when they made their maps they customized the skirmish ai somehow for each map, because if you play say the Clover map, the master keeper will not build 5x5 rooms separated by two tiles of land, they will build 3x3 rooms separated by nothing

I think people need to try this modification themselves and see if they notice anything different

http://www.2shared.com/file/7843638/c4522da9/DKII_17302_improved_ai_test_1.html


The ICD is a encrypted version of the DK2.exe, so you need a cracked version.

it is ;)

Hapuga
September 17th, 2009, 10:42
This is 1.7.

1) o o o o o o o o:imp:----------:imp: o o o o o o o o o two imps claim

2) o o o o o o o o o :imp::imp: o o o o o o o o o o o two imps meet

3) o o o o o o o o o o :imp::imp: o o o o o o o o o o two imps fight FOREVER

Here is 1.51

1) o o o o o o o o:imp:----------:imp: o o o o o o o o o two imps claim

2) o o o o o o o o o :imp::imp: o o o o o o o o o o o two imps meet

3) o o o o o o o o o o :troll::giant::fly::demon::archer::samurai::troll: :skeleton::skeleton::ghost::dog::vampire::avatar:: :demon::spider::giant: o o o o o o o o o o PARTY! AI throws at you all he has!

THAT is the BIGGEST difference.

QUOTE:
I have to say though, I think now, that Bullfrog, when they made their maps they customized the skirmish ai somehow for each map, because if you play say the Clover map, the master keeper will not build 5x5 rooms separated by two tiles of land, they will build 3x3 rooms separated by nothing

Wrong. The maps have very little to do with AI behaviour modification. This is clearly seen from custom maps.

Jibbits
September 17th, 2009, 11:23
QUOTE:
I have to say though, I think now, that Bullfrog, when they made their maps they customized the skirmish ai somehow for each map, because if you play say the Clover map, the master keeper will not build 5x5 rooms separated by two tiles of land, they will build 3x3 rooms separated by nothing

Wrong. The maps have very little to do with AI behaviour modification. This is clearly seen from custom maps.

No. At least some of the Bullfrog maps have custom skirmish ai somehow. If you play the Clover map in skirmish with master keepers you will see that the master keepers their behave differently then if you played a custom map in skirmish. If you go in editor and save the Clover map as 'Clover2' or something and play it in skirmish you will see that the master ai is normal again

or maybe the map itself has little to do with it... but somehow they made their skirmish maps have custom ais that you cant do (or we havent figured out yet)

oh wait? you mean how the ai attacks in the game? yes that has very little to do with the maps ;)

But wait again, do you mean I am wrong about how the skirmish ai is different on the clover map for the master keeper than other maps? Well I invite you to try it for yourself

Hapuga
September 17th, 2009, 12:43
You are complicating things up to the point that what made sense before doesnt make sense now.

Look. AI does not throw creatures into battle.

No battle>no challenge>no progression/regression on the map>no point to play.

If you dig to the enemy, and if imps meet at the center of a corridor, you can leave your pc for a day, come back, and you'll see the same imps fighting in a same place +/- 5 tiles from the initial point.

THIS IS WHAT IMPORTANT.

Dont try to find problems where they do not exist. AI may be a bit modified for better performance in terms of expansion etc. That is so miserable and minor that it shouldnt be taken into consideration.

Please, Jib find how he analyzes the combat in 1.3 1.51. Thats what matters.

I remember someone saying that it somehow may be related to creature threat value, so the value of dropped creatures does not correspond to creatures attacking the AI. For example, if enemy discovered ur imp in 1.51, hed throw a goblin. if youd throw 2 goblins hed throw 2-3 more. if you continue to throw creatures in combat, so does he. Now in 1.7, even if you throw all your army on his poor imp at once, he will ignore it. As if your creature's threat value is so low, that he doesnt care.

NO. you can not change it through official map editor. Though this function exists in AI options of a player, it seems to be useless, because moving bars and changing numbers does nothing.

Jibbits
September 18th, 2009, 02:41
I don't know what to do now, the 1.7 .exe has almost been completely replaced and nothing changes, that doesn't make sense?

I must be missing something :rolleyes:

wait is there some part of .exe file that can't be edited with hex editor? I'm learning this while I go along

Hapuga
September 18th, 2009, 09:37
there some parts that you CAN NOT decompile into a code, but Hex editor sees all the code. So with Hex you are able to do all you wish.

This proves my previous thought. AI is not in the EXE.

In fact, it is rather stupid to put things like AI in EXE. That is done very rarely. Exe is just a guideline, just a manager of other files.

DK2 maps work in the same way. KLD files store all the data and KWD files are ust executables.

The best idea for now would be to check the refference. To find what files EXE uses. When we see what files it uses, well take them apart.

I have some thoughts about the WAD files. Those store mostly game graphics and effects, but who knows?
I'll get back to working on DK2 this evening.

Jibbits
September 18th, 2009, 12:21
well I only have these .dll files

aweman32.dll (soundfile?)
qmixer.dll (sound file?)
sfman.dll (sound file?)
UNINST.dll (uninstaller?)
weanetr.dll (multiplayer?)

and the ai and game still work

in fact the only other file other than the .exe i have in the main directory is Uninst.isu

so maybe it is the wad files...

Hapuga
September 18th, 2009, 13:00
I did a very simple test by copying 1.51 files that you have just listed over 1.7 ones, the game still runs, with some crashes, but AI behaves in the same way.

So yes, its either WADS or cursed EXE.

Jibbits
September 18th, 2009, 13:16
Well can anyone make sense of this I wonder? :p


L00500950()
{
/* unknown */ void ecx;
/* unknown */ void ebx;
/* unknown */ void V10;
/* unknown */ void ebp;
/* unknown */ void esi;
/* unknown */ void edi;



esi = ecx;
L00555B60(7674920, " Computer Player\n");
L00555B60(7674920, " Opened %d\n", *esi & 1);
L00555B60(7674920, " WallHug %d\n", *esi >> 1 & 1);
L00555B60(7674920, " WallHugLeft %d\n", *esi >> 2 & 1);
L00555B60(7674920, " FightGoingOn %d\n", *esi >> 3 & 1);
L00555B60(7674920, " NextRoomToBuildSet %d\n", *esi >> 4 & 1);
L00555B60(7674920, " AllRoomsBuilt %d\n", *esi >> 5 & 1);
L00555B60(7674920, " HaveBeenAttacked %d\n", *esi >> 6 & 1);
L00555B60(7674920, " CallToArmsInUse %d\n", *esi >> 7 & 1);
L00555B60(7674920, " gtDirection %d\n", *esi >> 8 & 3);
L00555B60(7674920, " DefendDirection %d\n", *esi >> 0xa & 3);
L00555B60(7674920, " OpenDirection %d\n", *esi >> 0xc & 3);
L00555B60(7674920, " CurrentEventTask %d\n", *esi >> 0xe & 0xf);
L00555B60(7674920, " NumberOfEventTasks %d\n", *esi >> 0x12 & 0xf);
L00555B60(7674920, " Task %d\n", *esi >> 0x16 & 0xf);
L00555B60(7674920, " NextTask %d\n", *esi >> 0x1a & 0xf);
L00555B60(7674920, " AttackingPlayerId %d\n", *(esi + 4) & 65535);
ecx = *(esi + 0x1a);
edx = *(esi + 0x16);
eax = *(esi + 0x12);
L00555B60(7674920, " MaxBuildArea (%d, %d, %d, %d)\n", *(esi + 0xe), eax, edx, ecx);
edx = *(esi + 0x52);
eax = *(esi + 0x4e);
L00555B60(7674920, " CallToArmsPos (%d, %d, %d)\n", *(esi + 0x4a), eax, edx);
edx = *(esi + 0x70) & 65535;
L00555B60(7674920, " DigRoomAt (%d, %d)\n", *(esi + 0x6e) & 65535, edx);
ecx = *(esi + 0x74) & 65535;
L00555B60(7674920, " DigRoomAtCurrent (%d, %d)\n", *(esi + 0x72) & 65535, ecx);
eax = *(esi + 0x78) & 65535;
L00555B60(7674920, " WallHugStart (%d, %d)\n", *(esi + 0x76) & 65535, eax);
edx = *(esi + 0x7c) & 65535;
L00555B60(7674920, " WallHugEnd (%d, %d)\n", *(esi + 0x7a) & 65535, edx);
ecx = *(esi + 0x80) & 65535;
L00555B60(7674920, " JoinPathStart (%d, %d)\n", *(esi + 0x7e) & 65535, ecx);
eax = *(esi + 0x84) & 65535;
L00555B60(7674920, " JoinPathEnd (%d, %d)\n", *(esi + 0x82) & 65535, eax);
L00555B60(7674920, " WallHugDistance %d\n", *(esi + 0x86));
L00555B60(7674920, " WallHugHeading %d\n", *(esi + 0x8a) & 0xff);
L00555B60(7674920, " DigDX %d\n", *(esi + 0x8b));
L00555B60(7674920, " DigDY %d\n", *(esi + 0x8c));
L00555B60(7674920, " InnerLoopXOrY %d\n", *(esi + 0x8d) & 0xff);
L00555B60(7674920, " MaxX %d\n", *(esi + 0x8e));
L00555B60(7674920, " MaxY %d\n", *(esi + 0x8f));
L00555B60(7674920, " SquaresTarget %d\n", *(esi + 0x90));
L00555B60(7674920, " SquaresCurrent %d\n", *(esi + 0x91));
L00555B60(7674920, " Flags %d\n", *(esi + 0x92) & 65535);
L00555B60(7674920, " CurrentRoomToBuild %d\n", *(esi + 0x94) & 0xff);
L00555B60(7674920, " NextRoomToBuild %d\n", *(esi + 0x95) & 0xff);
L00555B60(7674920, " CurrentGoldArea %d\n", *(esi + 0x96) & 0xff);
L00555B60(7674920, " PlayersAttackedFlags %d\n", *(esi + 0x97) & 65535);
L00555B60(7674920, " FirstAttackFlag %d\n", *(esi + 0x99) & 65535);
L00555B60(7674920, " TendancyMoney %d\n", *(esi + 0x4ab) & 65535);
L00555B60(7674920, " TendancyType %d\n", *(esi + 0x4ad) & 0xff);
L00555B60(7674920, " CreateEmptyRoomShapeAreasWhenIdle %d\n", *(esi + 0x4ae) & 1);
L00555B60(7674920, " AutomaticallyBuildBiggerLairWhenPortalTakenOver %d\n", *(esi + 0x4ae) >> 1 & 1);
L00555B60(7674920, " TilesLeftBetweenRooms %d\n", *(esi + 0x4ae) >> 2 & 0xf);
L00555B60(7674920, " PlaceRoomsNextToIdeal %d\n", *(esi + 0x4ae) >> 6 & 1);
L00555B60(7674920, " BuildNewRoomWhenMoreSpaceRequired %d\n", *(esi + 0x4ae) >> 7 & 3);
L00555B60(7674920, " AggressiveVsDefensiveTrapPreference %d\n", *(esi + 0x4ae) >> 9 & 7);
L00555B60(7674920, " TrapVsDoorPreference %d\n", *(esi + 0x4ae) >> 0xc & 7);
L00555B60(7674920, " DoorPreference %d\n", *(esi + 0x4ae) >> 0xf & 3);
L00555B60(7674920, " ProbabilityOfMovingCreatureForResearch %d\n", *(esi + 0x4ae) >> 0x11 & 3);
L00555B60(7674920, " IACreatureSkillLevel %d\n", *(esi + 0x4ae) >> 0x13 & 0xf);
L00555B60(7674920, " IAAllRoomsPlaced %d\n", *(esi + 0x4ae) >> 0x17 & 1);
L00555B60(7674920, " IAAllSpellsResearched %d\n", *(esi + 0x4ae) >> 0x18 & 1);
L00555B60(7674920, " IAOnlyAttackAttackers %d\n", *(esi + 0x4ae) >> 0x19 & 1);
L00555B60(7674920, " AttackingVsDefensiveSpellPreference %d\n", *(esi + 0x4ae) >> 0x1a & 7);
L00555B60(7674920, " BoulderTrapsOnLongCorridors %d\n", *(esi + 0x4ae) >> 0x1d & 1);
L00555B60(7674920, " BARemoveIfCantReinforce %d\n", *(esi + 0x4ae) >> 0x1e & 1);
L00555B60(7674920, " UseKeeperSpells %d\n", *(esi + 0x4b2) & 7);
L00555B60(7674920, " IAFirstStart %d\n", *(esi + 0x4b2) >> 3 & 3);
L00555B60(7674920, " IAFirstEnd %d\n", *(esi + 0x4b2) >> 5 & 3);
L00555B60(7674920, " SellRecentlyTakenOverRoom %d\n", *(esi + 0x4b2) >> 7 & 1);
L00555B60(7674920, " CorridorStyle %d\n", *(esi + 0x4b2) >> 8 & 3);
L00555B60(7674920, " BoulderTrapOnBreachRoute %d\n", *(esi + 0x4b2) >> 0xa & 1);
L00555B60(7674920, " BreachAtXPoints %d\n", *(esi + 0x4b2) >> 0xb & 0xf);
L00555B60(7674920, " UnhappyCreaturesHappy %d\n", *(esi + 0x4b2) >> 0xf & 1);
L00555B60(7674920, " AngryCreaturesHappy %d\n", *(esi + 0x4b2) >> 0x10 & 1);
L00555B60(7674920, " AngryCreaturesDisposeOf %d\n", *(esi + 0x4b2) >> 0x11 & 1);
L00555B60(7674920, " AngryDisposalMethod %d\n", *(esi + 0x4b2) >> 0x12 & 1);
L00555B60(7674920, " UnwantedCreatureDisposeOf %d\n", *(esi + 0x4b2) >> 0x13 & 1);
L00555B60(7674920, " UseSightOfEvil %d\n", *(esi + 0x4b2) >> 0x14 & 3);
L00555B60(7674920, " LightningInWater %d\n", *(esi + 0x4b2) >> 0x16 & 1);
L00555B60(7674920, " SpellPreference %d\n", *(esi + 0x4b2) >> 0x17 & 7);
L00555B60(7674920, " CallToArmsUsage %d\n", *(esi + 0x4b2) >> 0x1a & 3);
L00555B60(7674920, " ImprisonedCreatureAction %d\n", *(esi + 0x4b2) >> 0x1c & 3);
L00555B60(7674920, " NeverAttack %d\n", *(esi + 0x4b2) >> 0x1e & 1);
L00555B60(7674920, " BlibBlubBlob %d\n", *(esi + 0x4b6) & 0xf);
L00555B60(7674920, " MinimumRandomTimeBeforePlacingReseachedRoom %d\n", *(esi + 0x4ba) & 0xff);
L00555B60(7674920, " DefaultRoomSize %d\n", *(esi + 0x4bb) & 0xff);
L00555B60(7674920, " TrapAndDoorUsage %d\n", *(esi + 0x4bc) & 0xff);
L00555B60(7674920, " MaximumImps %d\n", *(esi + 0x4bd) & 0xff);
L00555B60(7674920, " TilesPerImpRatio %d\n", *(esi + 0x4be) & 0xff);
L00555B60(7674920, " ImprisonPercentage %d\n", *(esi + 0x4bf) & 0xff);
L00555B60(7674920, " BARetreatHealth %d\n", *(esi + 0x4c0) & 0xff);
L00555B60(7674920, " SpecialSearchChance %d\n", *(esi + 0x4c1) & 0xff);
L00555B60(7674920, " SpecialFindChance %d\n", *(esi + 0x4d1) & 0xff);
L00555B60(7674920, " Flexibility %d\n", *(esi + 0x4d2) & 0xff);
L00555B60(7674920, " IAMinimumCreatures %d\n", *(esi + 0x4d3) & 0xff);
L00555B60(7674920, " IAThreatSuperiority %d\n", *(esi + 0x4d4) & 65535);
L00555B60(7674920, " BAThreatSuperiority %d\n", *(esi + 0x4d6) & 65535);
L00555B60(7674920, " BACallToArmsValue %d\n", *(esi + 0x4d8) & 65535);
L00555B60(7674920, " BuildLostRoomAfterMinimumTime %d\n", *(esi + 0x4da) & 0xff);
L00555B60(7674920, " SpecialRange %d\n", *(esi + 0x4db) & 0xff);
L00555B60(7674920, " NeutralRoomRangeFromHeart %d\n", *(esi + 0x4dc) & 0xff);
L00555B60(7674920, " NeutralRoomRangeFromClaimedArea %d\n", *(esi + 0x4dd) & 0xff);
L00555B60(7674920, " IAUseCreatures %d\n", *(esi + 0x4de) & 0xff);
L00555B60(7674920, " TendancySpeed %d\n", *(esi + 0x4df) & 0xff);
L00555B60(7674920, " Openness %d\n", *(esi + 0x4e0) & 0xff);
L00555B60(7674920, " GoldValue %d\n", *(esi + 0x4e1) & 65535);
L00555B60(7674920, " ManaValue %d\n", *(esi + 0x4e3) & 65535);
L00555B60(7674920, " RemoveCallToArmsAfter %d\n", *(esi + 0x4e5) & 65535);
L00555B60(7674920, " RemoveCallToArmsEnemyCreatures %d\n", *(esi + 0x4e7) & 0xff);
L00555B60(7674920, " RemoveCallToArmsWithinRange %d\n", *(esi + 0x4e8) & 0xff);
L00555B60(7674920, " RemoveCallToArmsOwnCreatures %d\n", *(esi + 0x4e9) & 0xff);
L00555B60(7674920, " WaitBeforeAttackingAgain %d\n", *(esi + 0x4ea) & 0xff);
L00555B60(7674920, " CallToArmsCounter %d\n", *(esi + 0x4eb));
L00555B60(7674920, " CannotAttackCounter %d\n", *(esi + 0x4ef));
L00555B60(7674920, " UntagGoldCounter %d\n", *(esi + 0x4f3));
edi = 0;
ebx = esi + 0x5a;
ebp = esi + 0x1e;
do {
L00555B60(7674920, " EventTask[%2d] = %d", edi, *ebp);
if(eax = *ebp - 1) {
ecx = *(ebx - 2);
edx = *(ebx + 2) & 65535;
L00555B60(7674920, "(RespondToAttack) %d, %d (%d, %d)\n", *(ebx - 4), ecx, *ebx & 65535, edx);
} else {
L00555B60(7674920, 0x694998);
}
edi = edi + 1;
ebp = ebp + 4;
ebx = ebx + 8;
} while(edi < 3);
ebx = 0;
edi = esi + 0x2c;
do {
eax = *(edi + 2);
ecx = *edi & 65535;
L00555B60(7674920, " GoldDeposits[%2d] (%d, %d) %d\n", ebx, *(edi - 2) & 65535, ecx, eax);
ebx = ebx + 1;
edi = edi + 8;
} while(ebx < 4);
ebx = 0;
edi = 7241344;
do {
L00555B60(7674920, " JobRooms[%2d] %d\n", ebx, *edi & 0xff);
edi = edi + 0x11;
ebx = ebx + 1;
} while(edi < 7241514);
ebx = esi + 0x9d;
ebp = 0;
for(V10 = ebx; 1; ebx = V10) {
L00555B60(7674920, " EnemyBreaches[ %2d].TunnelsLeft = %d\n", ebp, *(ebx + 0x3e) & 0xff);
edi = 0;
do {
L00555B60(7674920, " EnemyBreaches[ %2d].Tunnels[ %2d].Start.X = %d\n", ebp, edi, *(ebx - 2) & 65535);
L00555B60(7674920, " EnemyBreaches[ %2d].Tunnels[ %2d].Start.Y = %d\n", ebp, edi, *ebx & 65535);
L00555B60(7674920, " EnemyBreaches[ %2d].Tunnels[ %2d].End.X = %d\n", ebp, edi, *(ebx + 2) & 65535);
L00555B60(7674920, " EnemyBreaches[ %2d].Tunnels[ %2d].End.Y = %d\n", ebp, edi, *(ebx + 4) & 65535);
edi = edi + 1;
ebx = ebx + 8;
} while(edi < 8);
ebp = ebp + 1;
ebp :: 0x10;
if(!(V10 = V10 + 0x41)) {
break;
}
}
edi = 0;
do {
eax = L00555B60(7674920, " RoomList[%2d] = %d\n", edi, *(edi + esi + 0x4c2) & 0xff);
edi = edi + 1;
} while(edi < 0xf);
}

/* Procedure: 0x00501708 - 0x0050170F
* Argument size: 0
* Local size: 0
* Save regs size: 0
*/

Hapuga
September 18th, 2009, 13:32
so u found it! good!!! Now lets analyze what this means.

Btw is this the 1.7 version? could you extract and post data from 1.51, so we could make cross-reference??

Jibbits
September 18th, 2009, 13:35
That is 1.51 code

This is 1.73:




L00503F50()
{
/* unknown */ void ecx;
/* unknown */ void ebx;
/* unknown */ void V10;
/* unknown */ void ebp;
/* unknown */ void esi;
/* unknown */ void edi;



esi = ecx;
L005595C0(7696104, " Computer Player\n");
L005595C0(7696104, " Opened %d\n", *esi & 1);
L005595C0(7696104, " WallHug %d\n", *esi >> 1 & 1);
L005595C0(7696104, " WallHugLeft %d\n", *esi >> 2 & 1);
L005595C0(7696104, " FightGoingOn %d\n", *esi >> 3 & 1);
L005595C0(7696104, " NextRoomToBuildSet %d\n", *esi >> 4 & 1);
L005595C0(7696104, " AllRoomsBuilt %d\n", *esi >> 5 & 1);
L005595C0(7696104, " HaveBeenAttacked %d\n", *esi >> 6 & 1);
L005595C0(7696104, " CallToArmsInUse %d\n", *esi >> 7 & 1);
L005595C0(7696104, " gtDirection %d\n", *esi >> 8 & 3);
L005595C0(7696104, " DefendDirection %d\n", *esi >> 0xa & 3);
L005595C0(7696104, " OpenDirection %d\n", *esi >> 0xc & 3);
L005595C0(7696104, " CurrentEventTask %d\n", *esi >> 0xe & 0xf);
L005595C0(7696104, " NumberOfEventTasks %d\n", *esi >> 0x12 & 0xf);
L005595C0(7696104, " Task %d\n", *esi >> 0x16 & 0xf);
L005595C0(7696104, " NextTask %d\n", *esi >> 0x1a & 0xf);
L005595C0(7696104, " AttackingPlayerId %d\n", *(esi + 8) & 65535);
ecx = *(esi + 0x1e);
edx = *(esi + 0x1a);
eax = *(esi + 0x16);
L005595C0(7696104, " MaxBuildArea (%d, %d, %d, %d)\n", *(esi + 0x12), eax, edx, ecx);
edx = *(esi + 0x56);
eax = *(esi + 0x52);
L005595C0(7696104, " CallToArmsPos (%d, %d, %d)\n", *(esi + 0x4e), eax, edx);
edx = *(esi + 0x74) & 65535;
L005595C0(7696104, " DigRoomAt (%d, %d)\n", *(esi + 0x72) & 65535, edx);
ecx = *(esi + 0x78) & 65535;
L005595C0(7696104, " DigRoomAtCurrent (%d, %d)\n", *(esi + 0x76) & 65535, ecx);
eax = *(esi + 0x7c) & 65535;
L005595C0(7696104, " WallHugStart (%d, %d)\n", *(esi + 0x7a) & 65535, eax);
edx = *(esi + 0x80) & 65535;
L005595C0(7696104, " WallHugEnd (%d, %d)\n", *(esi + 0x7e) & 65535, edx);
ecx = *(esi + 0x84) & 65535;
L005595C0(7696104, " JoinPathStart (%d, %d)\n", *(esi + 0x82) & 65535, ecx);
eax = *(esi + 0x88) & 65535;
L005595C0(7696104, " JoinPathEnd (%d, %d)\n", *(esi + 0x86) & 65535, eax);
L005595C0(7696104, " WallHugDistance %d\n", *(esi + 0x8a));
L005595C0(7696104, " WallHugHeading %d\n", *(esi + 0x8e) & 0xff);
L005595C0(7696104, " DigDX %d\n", *(esi + 0x8f));
L005595C0(7696104, " DigDY %d\n", *(esi + 0x90));
L005595C0(7696104, " InnerLoopXOrY %d\n", *(esi + 0x91) & 0xff);
L005595C0(7696104, " MaxX %d\n", *(esi + 0x92));
L005595C0(7696104, " MaxY %d\n", *(esi + 0x93));
L005595C0(7696104, " SquaresTarget %d\n", *(esi + 0x94));
L005595C0(7696104, " SquaresCurrent %d\n", *(esi + 0x95));
L005595C0(7696104, " Flags %d\n", *(esi + 0x96) & 65535);
L005595C0(7696104, " CurrentRoomToBuild %d\n", *(esi + 0x98) & 0xff);
L005595C0(7696104, " NextRoomToBuild %d\n", *(esi + 0x99) & 0xff);
L005595C0(7696104, " CurrentGoldArea %d\n", *(esi + 0x9a) & 0xff);
L005595C0(7696104, " PlayersAttackedFlags %d\n", *(esi + 0x9b) & 65535);
L005595C0(7696104, " FirstAttackFlag %d\n", *(esi + 0x9d) & 65535);
L005595C0(7696104, " TendancyMoney %d\n", *(esi + 0x4af) & 65535);
L005595C0(7696104, " TendancyType %d\n", *(esi + 0x4b1) & 0xff);
L005595C0(7696104, " CreateEmptyRoomShapeAreasWhenIdle %d\n", *(esi + 0x4b2) & 1);
L005595C0(7696104, " AutomaticallyBuildBiggerLairWhenPortalTakenOver %d\n", *(esi + 0x4b2) >> 1 & 1);
L005595C0(7696104, " TilesLeftBetweenRooms %d\n", *(esi + 0x4b2) >> 2 & 0xf);
L005595C0(7696104, " PlaceRoomsNextToIdeal %d\n", *(esi + 0x4b2) >> 6 & 1);
L005595C0(7696104, " BuildNewRoomWhenMoreSpaceRequired %d\n", *(esi + 0x4b2) >> 7 & 3);
L005595C0(7696104, " AggressiveVsDefensiveTrapPreference %d\n", *(esi + 0x4b2) >> 9 & 7);
L005595C0(7696104, " TrapVsDoorPreference %d\n", *(esi + 0x4b2) >> 0xc & 7);
L005595C0(7696104, " DoorPreference %d\n", *(esi + 0x4b2) >> 0xf & 3);
L005595C0(7696104, " ProbabilityOfMovingCreatureForResearch %d\n", *(esi + 0x4b2) >> 0x11 & 3);
L005595C0(7696104, " IACreatureSkillLevel %d\n", *(esi + 0x4b2) >> 0x13 & 0xf);
L005595C0(7696104, " IAAllRoomsPlaced %d\n", *(esi + 0x4b2) >> 0x17 & 1);
L005595C0(7696104, " IAAllSpellsResearched %d\n", *(esi + 0x4b2) >> 0x18 & 1);
L005595C0(7696104, " IAOnlyAttackAttackers %d\n", *(esi + 0x4b2) >> 0x19 & 1);
L005595C0(7696104, " AttackingVsDefensiveSpellPreference %d\n", *(esi + 0x4b2) >> 0x1a & 7);
L005595C0(7696104, " BoulderTrapsOnLongCorridors %d\n", *(esi + 0x4b2) >> 0x1d & 1);
L005595C0(7696104, " BARemoveIfCantReinforce %d\n", *(esi + 0x4b2) >> 0x1e & 1);
L005595C0(7696104, " UseKeeperSpells %d\n", *(esi + 0x4b6) & 7);
L005595C0(7696104, " IAFirstStart %d\n", *(esi + 0x4b6) >> 3 & 3);
L005595C0(7696104, " IAFirstEnd %d\n", *(esi + 0x4b6) >> 5 & 3);
L005595C0(7696104, " SellRecentlyTakenOverRoom %d\n", *(esi + 0x4b6) >> 7 & 1);
L005595C0(7696104, " CorridorStyle %d\n", *(esi + 0x4b6) >> 8 & 3);
L005595C0(7696104, " BoulderTrapOnBreachRoute %d\n", *(esi + 0x4b6) >> 0xa & 1);
L005595C0(7696104, " BreachAtXPoints %d\n", *(esi + 0x4b6) >> 0xb & 0xf);
L005595C0(7696104, " UnhappyCreaturesHappy %d\n", *(esi + 0x4b6) >> 0xf & 1);
L005595C0(7696104, " AngryCreaturesHappy %d\n", *(esi + 0x4b6) >> 0x10 & 1);
L005595C0(7696104, " AngryCreaturesDisposeOf %d\n", *(esi + 0x4b6) >> 0x11 & 1);
L005595C0(7696104, " AngryDisposalMethod %d\n", *(esi + 0x4b6) >> 0x12 & 1);
L005595C0(7696104, " UnwantedCreatureDisposeOf %d\n", *(esi + 0x4b6) >> 0x13 & 1);
L005595C0(7696104, " UseSightOfEvil %d\n", *(esi + 0x4b6) >> 0x14 & 3);
L005595C0(7696104, " LightningInWater %d\n", *(esi + 0x4b6) >> 0x16 & 1);
L005595C0(7696104, " SpellPreference %d\n", *(esi + 0x4b6) >> 0x17 & 7);
L005595C0(7696104, " CallToArmsUsage %d\n", *(esi + 0x4b6) >> 0x1a & 3);
L005595C0(7696104, " ImprisonedCreatureAction %d\n", *(esi + 0x4b6) >> 0x1c & 3);
L005595C0(7696104, " NeverAttack %d\n", *(esi + 0x4b6) >> 0x1e & 1);
L005595C0(7696104, " BlibBlubBlob %d\n", *(esi + 0x4ba) & 0xf);
L005595C0(7696104, " MinimumRandomTimeBeforePlacingReseachedRoom %d\n", *(esi + 0x4be) & 0xff);
L005595C0(7696104, " DefaultRoomSize %d\n", *(esi + 0x4bf) & 0xff);
L005595C0(7696104, " TrapAndDoorUsage %d\n", *(esi + 0x4c0) & 0xff);
L005595C0(7696104, " MaximumImps %d\n", *(esi + 0x4c1) & 0xff);
L005595C0(7696104, " TilesPerImpRatio %d\n", *(esi + 0x4c2) & 0xff);
L005595C0(7696104, " ImprisonPercentage %d\n", *(esi + 0x4c3) & 0xff);
L005595C0(7696104, " BARetreatHealth %d\n", *(esi + 0x4c4) & 0xff);
L005595C0(7696104, " SpecialSearchChance %d\n", *(esi + 0x4c5) & 0xff);
L005595C0(7696104, " SpecialFindChance %d\n", *(esi + 0x4d5) & 0xff);
L005595C0(7696104, " Flexibility %d\n", *(esi + 0x4d6) & 0xff);
L005595C0(7696104, " IAMinimumCreatures %d\n", *(esi + 0x4d7) & 0xff);
L005595C0(7696104, " IAThreatSuperiority %d\n", *(esi + 0x4d8) & 65535);
L005595C0(7696104, " BAThreatSuperiority %d\n", *(esi + 0x4da) & 65535);
L005595C0(7696104, " BACallToArmsValue %d\n", *(esi + 0x4dc) & 65535);
L005595C0(7696104, " BuildLostRoomAfterMinimumTime %d\n", *(esi + 0x4de) & 0xff);
L005595C0(7696104, " SpecialRange %d\n", *(esi + 0x4df) & 0xff);
L005595C0(7696104, " NeutralRoomRangeFromHeart %d\n", *(esi + 0x4e0) & 0xff);
L005595C0(7696104, " NeutralRoomRangeFromClaimedArea %d\n", *(esi + 0x4e1) & 0xff);
L005595C0(7696104, " IAUseCreatures %d\n", *(esi + 0x4e2) & 0xff);
L005595C0(7696104, " TendancySpeed %d\n", *(esi + 0x4e3) & 0xff);
L005595C0(7696104, " Openness %d\n", *(esi + 0x4e4) & 0xff);
L005595C0(7696104, " GoldValue %d\n", *(esi + 0x4e5) & 65535);
L005595C0(7696104, " ManaValue %d\n", *(esi + 0x4e7) & 65535);
L005595C0(7696104, " RemoveCallToArmsAfter %d\n", *(esi + 0x4e9) & 65535);
L005595C0(7696104, " RemoveCallToArmsEnemyCreatures %d\n", *(esi + 0x4eb) & 0xff);
L005595C0(7696104, " RemoveCallToArmsWithinRange %d\n", *(esi + 0x4ec) & 0xff);
L005595C0(7696104, " RemoveCallToArmsOwnCreatures %d\n", *(esi + 0x4ed) & 0xff);
L005595C0(7696104, " WaitBeforeAttackingAgain %d\n", *(esi + 0x4ee) & 0xff);
L005595C0(7696104, " CallToArmsCounter %d\n", *(esi + 0x4ef));
L005595C0(7696104, " CannotAttackCounter %d\n", *(esi + 0x4f3));
L005595C0(7696104, " UntagGoldCounter %d\n", *(esi + 0x4f7));
L005595C0(7696104, "\t\tTrapsStartFights %d\n", *esi >> 0x1e & 1);
L005595C0(7696104, "\t\tTimesOut %d\n", *esi >> 0x1f);
L005595C0(7696104, "\t\tTaskTimeCounter %d\n", *(esi + 4));
edi = 0;
ebx = esi + 0x5e;
ebp = esi + 0x22;
do {
L005595C0(7696104, " EventTask[%2d] = %d", edi, *ebp);
if(eax = *ebp - 1) {
ecx = *(ebx - 2);
edx = *(ebx + 2) & 65535;
L005595C0(7696104, "(RespondToAttack) %d, %d (%d, %d)\n", *(ebx - 4), ecx, *ebx & 65535, edx);
} else {
L005595C0(7696104, "\n");
}
edi = edi + 1;
ebp = ebp + 4;
ebx = ebx + 8;
} while(edi < 3);
ebx = 0;
edi = esi + 0x30;
do {
eax = *(edi + 2);
ecx = *edi & 65535;
L005595C0(7696104, " GoldDeposits[%2d] (%d, %d) %d\n", ebx, *(edi - 2) & 65535, ecx, eax);
ebx = ebx + 1;
edi = edi + 8;
} while(ebx < 4);
ebx = 0;
edi = 7263376;
do {
L005595C0(7696104, " JobRooms[%2d] %d\n", ebx, *edi & 0xff);
edi = edi + 0x11;
ebx = ebx + 1;
} while(edi < 7263546);
ebx = esi + 0xa1;
ebp = 0;
for(V10 = ebx; 1; ebx = V10) {
L005595C0(7696104, " EnemyBreaches[ %2d].TunnelsLeft = %d\n", ebp, *(ebx + 0x3e) & 0xff);
edi = 0;
do {
L005595C0(7696104, " EnemyBreaches[ %2d].Tunnels[ %2d].Start.X = %d\n", ebp, edi, *(ebx - 2) & 65535);
L005595C0(7696104, " EnemyBreaches[ %2d].Tunnels[ %2d].Start.Y = %d\n", ebp, edi, *ebx & 65535);
L005595C0(7696104, " EnemyBreaches[ %2d].Tunnels[ %2d].End.X = %d\n", ebp, edi, *(ebx + 2) & 65535);
L005595C0(7696104, " EnemyBreaches[ %2d].Tunnels[ %2d].End.Y = %d\n", ebp, edi, *(ebx + 4) & 65535);
edi = edi + 1;
ebx = ebx + 8;
} while(edi < 8);
ebp = ebp + 1;
ebp :: 0x10;
if(!(V10 = V10 + 0x41)) {
break;
}
}
edi = 0;
do {
eax = L005595C0(7696104, " RoomList[%2d] = %d\n", edi, *(edi + esi + 0x4c6) & 0xff);
edi = edi + 1;
} while(edi < 0xf);
}

/* Procedure: 0x00504D57 - 0x00504D5F
* Argument size: 0
* Local size: 0
* Save regs size: 0
*/

this is what I don't understand, this has been replaced, nothing changes??

the 1.51 version WAS in the .exe i uploaded

Hapuga
September 18th, 2009, 13:53
Well. This means one thing. At least, I'll make an assumption.

This is the code okay. You change it, probably this is ready to make difference.

As mentioned before, EXE only uses other files. What I mean by this is, we have changed the code to an earlier version, but if some file in game dir, say, contains bad creature threat values, EXE will use those numbers with THIS code.

We are half way there. We now have to find the list with CREATURE STATS and replace 1.7 stats with 1.51.

I hope that I'm right.

Please, replace those once again and send me the file. I have some weird ideas.

Jibbits
September 18th, 2009, 13:55
The '.exe' is actually both .exe and .icd combined into one thing ;)

But I'm sorry I do not have time for this right now, I will post these files:

http://www.2shared.com/file/7885667/c90176a0/151_and_173_codes.html

Hapuga
September 18th, 2009, 15:30
You probably did something wrong while replacing. Hex editor shows that like 100 bites of text was repaced, while In truth there should be a few kilobites.

Stiekel
September 19th, 2009, 00:52
Maybe the AI is stored in GlobalVariables.kwd in the folder 'editor', just a guess :P

dk2player
September 19th, 2009, 01:10
You know, I've been giving this some thought, but I think the Ai is determined by the map. It would explain why you can cahnge the ai controled setting in a map, not the game

Jibbits
September 19th, 2009, 08:02
You probably did something wrong while replacing. Hex editor shows that like 100 bites of text was repaced, while In truth there should be a few kilobites.

Hmm. Well I'm daft :D

Yes, the hex editor I used only replaced like 100 bits lol

Edit:

Ok, this isn't going to be so easy as copy and pasting. This will take awhile.

Hapuga
September 19th, 2009, 09:39
You know, I've been giving this some thought, but I think the Ai is determined by the map. It would explain why you can cahnge the ai controled setting in a map, not the game

How many times do I have to repeat myself. AI IS NOT DETERMINED BY THE MAP.

Create a map in 1.7 and copy it in 1.51 folder. you'll have 2 different games.

Jibbits
September 19th, 2009, 11:09
I've made that 1.7 ai code have 1.51 values and well, its not what we're looking for, the ai still refuses to drop anything.


You know, I've been giving this some thought, but I think the Ai is determined by the map. It would explain why you can cahnge the ai controled setting in a map, not the game

I think only thing map determines is how ai builds, it has nothing to do with how ai attacks or drops creatures, I think.

Stiekel
September 19th, 2009, 12:39
I think you guys are looking on the wrong 'level'. Both 1.51 and 1.7 got AI value settings defined in every map. Those value settings between the 2 versions are a bit different (sometimes to low or to high) but still he does not execute them at all and simple ignore them. Example the setting/value attack when all creatures are lvl X, this one is in 1.7 ignored dunno about 1.51. Same goes for dropping creatures near a enemy.

The settings and there values are there, but simply ignored.

DK2 got a different loader for each "type" of map:

- Official campaign levels: Loader A

- Self made levels played as single player mode: Loader B

- Self made levels played as campaign level: Leader B

- Self made levels played as MPD: Loader B

- Self made levels played as skirmish: Loader C

Loader C is the best in 1.7, it does follow "attack when all creatures are lvl X" (and thus using the combat pit) and dropping creatures better near a enemy.

A simple test is pick a campaign level, save it but don't change anything and play it as a campaign level or as a single player level and most settings are then simply ignored. Play it as skirmish and the AI is better and follow all settings.

Maybe its the editor itself that fucks things up i dunno.

The game clearly distinguish what loader it has to use. If you can change this, that it will always use Loader C instead of the others, then you got a way better AI in every map :)

dk2player
September 19th, 2009, 13:03
But what we want to know is why the ai acts like that. and if possible, how do we make it better.

Hapuga
September 19th, 2009, 15:39
I think you guys are looking on the wrong 'level'. Both 1.51 and 1.7 got AI value settings defined in every map. Those value settings between the 2 versions are a bit different (sometimes to low or to high) but still he does not execute them at all and simple ignore them. Example the setting/value attack when all creatures are lvl X, this one is in 1.7 ignored dunno about 1.51. Same goes for dropping creatures near a enemy.

The settings and there values are there, but simply ignored.

DK2 got a different loader for each "type" of map:

- Official campaign levels: Loader A

- Self made levels played as single player mode: Loader B

- Self made levels played as campaign level: Leader B

- Self made levels played as MPD: Loader B

- Self made levels played as skirmish: Loader C

Loader C is the best in 1.7, it does follow "attack when all creatures are lvl X" (and thus using the combat pit) and dropping creatures better near a enemy.

A simple test is pick a campaign level, save it but don't change anything and play it as a campaign level or as a single player level and most settings are then simply ignored. Play it as skirmish and the AI is better and follow all settings.

Maybe its the editor itself that fucks things up i dunno.

The game clearly distinguish what loader it has to use. If you can change this, that it will always use Loader C instead of the others, then you got a way better AI in every map :)

No no no. AI does not attack you in 1.7 in any case. yes, it builds, yes it spreads, but it doesnt drop creatures. Neither in campaign nor in skirmish.

That is the only problem we are trying to solve

Ðârk Âñgêl
September 22nd, 2009, 14:14
as far as i know ai sets call to arms in 1.7. from time to time he sets it to the heart. stupid thing is that creatures never manage to come to the heart.
thats a kind of attack.

Hapuga
September 22nd, 2009, 15:40
as far as i know ai sets call to arms in 1.7. from time to time he sets it to the heart. stupid thing is that creatures never manage to come to the heart.
thats a kind of attack.

He did the same in 1.0 but more often, more rapidly and eventually, more effectively.

Jibbits
October 7th, 2009, 21:03
I'm just going to say I'm not doing this anymore, I play v1.3

Hapuga
October 8th, 2009, 13:16
Reverse engineering is more difficult than making a program from scrap. Not only you have to be able to understand programming, you also have to be very good at it, with lots of experience.

We need a serious programmer dude. Our feeble attempts to dig the game are nothing but a waste of time.