Page 3 of 5

Re: Shandalar Deck Injector

PostPosted: 17 Jul 2011, 08:57
by RyanfaeScotland
Osquou wrote:Any luck on adding health? Did you ever figure out what the offset is for it? I was working on learning hex before I found your program and figured out money and food on my own. BTW though you can type in FF FF FF FF on money and food, neither are acceptable values. I've managed to get FF FF FF FD on money, haven't played around enough on food but it's MUCH lower. Anyways, health and gems would be nice if you've got the offsets I can edit them on my own. Thanks for the great program and all your hard work!
Good to hear someone else is looking into this game and hex editing in general. It's a pretty good one to get started with as it has some easy values to find such as food and money as you've discovered, some medium ones, and harder ones such as health which sadly isn't stored in just a numeric value.

I'm hoping to update my site tonight as I have finally finished the new version! so want to get it up as soon as possible so people can try it out and I can get the latest bugs reported and fixed. When I do update the site I'll add in the new download and all the information I have recently found.

However for your specific questions/comments there are a couple of things that you may be aware of but I'll point them out anyway. First off the data is stored little endian meaning although you are reading FF FF FF FD in your editor the game actually reads that as FD FF FF FF. This makes a big difference when changing/searching for things because if we wanted our hero to have 1 gold we'd probably think we should enter 00 00 00 01 when actually it should be 01 00 00 00. There is a terribly complicated wikipedia article on it here but as long as you remember things can appear back to front you should get used to it.

Second you'll find that food and health both use a sign bit as they can show negitive numbers. This means rather than 00 to FF meaning 0 to 255 it actually shows -128 to +127. If you convert the number to binary and find the left most bit is a 1 then the number is negitive but remember that windows calculator and most other programs drop any preceding 0s so make sure the number of bits equals what you expect. This means the highest value 4 bytes can show is 7F FF FF FF because after this (80 00 00 00) the sign bit is flipped to a 1 and the numbers become negitive. Of course entering 7F FF FF FF into the hex editor will give you a really low value because of the damn endianness ;) I'll leave you to figure out what you need to enter for the highest possible value.

Finally the values you were looking for, Gems (Amulets) start at offset 21D0C and have 4 bytes each. Health is tied in with manalinks and so is more complicated. I've only looked at it breifly but by comparing 2 saves, one just before going into a town to get a manalink and one after getting it, I've found that the point the data changed was offset 20980 (hex) but I'm not sure if that will be the same across all saves as I think each town has a bit of memory that stores its data such as cards available, missions available and so on along with if you have that towns manalink or no. This gives us a good news / bad news situation. Good news, manalink is probably just a flag set in the town data; Bad news, towns probably change on each map so god knows if the data stays in the same place. Best case secenaro the data for each town stays in the same place each time and there is a bit of its memory that stores its location (I know this is true to an extent because I accidently obliterated a town from the map when playing around with the data once!)

Sorry for the wall of text, this is what happens when I start talking shop! Hopefully some of it is useful to you.

TL:DR - New version of the deck injector is ready and just needs uploaded. Gems offset - 21D0C. Health offset - Linked in with indivdual town data which is unknown, yet.

EDIT - Oops put up the offsets wrong :oops: fixed now.

Re: Shandalar Deck Injector

PostPosted: 17 Jul 2011, 19:25
by Snacko
Code: Select all
 v1 = sub_5030BD(&byte_594208[72 * dword_73C00C], 1152) & 1;
  v2 = sub_5030BD(&dword_58D3C8, 3200) & v1;
  v3 = sub_5030BD(&dword_77E6CC, 4) & v2;
  v4 = sub_5030BD(&dword_74B15C, 4) & v3;
  v5 = sub_5030BD(&dword_7658C0, 4) & v4;
  v6 = sub_5030BD(&dword_74F1E0, 4) & v5;
  v7 = sub_5030BD(&dword_74D26C, 4) & v6;
  v8 = sub_5030BD(&dword_74B8B8, 4) & v7;
  v9 = sub_5030BD(&dword_74C95C, 4) & v8;
  v10 = sub_5030BD(&dword_77E590, 4) & v9;
  v11 = sub_5030BD(&dword_765E24, 4) & v10;
  v12 = sub_5030BD(&dword_97F1B0, 4) & v11;
  v13 = sub_5030BD(&dword_77CF1C, 4) & v12;
  v14 = sub_5030BD(&dword_77EDC0, 4) & v13;
  v15 = sub_5030BD(&dword_77E058, 4) & v14;
  v16 = sub_5030BD(&dword_77F1C4, 4) & v15;
  v17 = sub_5030BD(&unk_74C940, 4) & v16;
  v18 = sub_5030BD(&dword_7806E8, 4) & v17;
  v19 = sub_5030BD(&dword_77CA10, 4) & v18;
  v20 = sub_5030BD(&dword_77C57C, 4) & v19;
  v21 = sub_5030BD(&dword_74C960, 4) & v20;
  v22 = sub_5030BD(&dword_77D170, 64) & v21;
  v23 = sub_5030BD(&dword_74C790, 408) & v22;
  v24 = sub_5030BD(&dword_74CDC0, 88) & v23;
  v25 = sub_5030BD(&dword_7806E0, 8) & v24;
  v26 = sub_5030BD(&dword_7806A0, 64) & v25;
  v27 = sub_5030BD(&dword_77ED80, 64) & v26;
  v28 = sub_5030BD(&X, 4) & v27;
  v29 = sub_5030BD(&dword_74C0E8, 4) & v28;
  v30 = sub_5030BD(&dword_77F438, 4) & v29;
  v31 = sub_5030BD(&dword_77E58C, 4) & v30;
  v32 = sub_5030BD(&dword_74CDB4, 4) & v31;
  v33 = sub_5030BD(&dword_77E6D0, 4) & v32;
  v34 = sub_5030BD(&dword_77E588, 4) & v33;
  v35 = sub_5030BD(&deck, 2000) & v34;
  v36 = sub_5030BD(&dword_8CA270, 90600) & v35;
  v37 = sub_5030BD(&dword_94F3A0, 9664) & v36;
  v38 = sub_5030BD(&dword_94D930, 4000) & v37;
  v39 = sub_5030BD(&dword_8E0B00, 4000) & v38;
  v40 = sub_5030BD(&dword_8A9410, 4000) & v39;
  v41 = sub_5030BD(&dword_8E2E10, 128) & v40;
  v42 = sub_5030BD(&dword_94E968, 4) & v41;
  v43 = sub_5030BD(&dword_93A798, 4) & v42;
  v44 = sub_5030BD(&dword_94D46C, 4) & v43;
  v45 = sub_5030BD(&dword_939CE8, 4) & v44;
  v46 = sub_5030BD(&dword_8E3EC0, 96) & v45;
  v47 = sub_5030BD(&unk_7A0228, 8) & v46;
  v48 = sub_5030BD(&dword_8E2690, 32) & v47;
  v49 = sub_5030BD(&dword_92F414, 4) & v48;
  v50 = sub_5030BD(&dword_7BEAA0, 16) & v49;
  v51 = sub_5030BD(&dword_8C83EC, 4) & v50;
  v52 = sub_5030BD(dword_78E970, 8) & v51;
  v53 = sub_5030BD(&dword_78E5E0, 4) & v52;
  v54 = sub_5030BD(byte_7BE9F0, 100) & v53;
  v55 = sub_5030BD(&dword_8C83F0, 8) & v54;
  v56 = sub_5030BD(&Val, 8) & v55;
  v57 = sub_5030BD(&dword_94CF68, 8) & v56;
  v58 = sub_5030BD(&dword_7BEB10, 16) & v57;
  v59 = sub_5030BD(&dword_7A82E0, 4) & v58;
  v60 = sub_5030BD(&dword_8E26B8, 4) & v59;
  v61 = sub_5030BD(&dword_94D63C, 4) & v60;
  v62 = sub_5030BD(&dword_94D464, 4) & v61;
  v63 = sub_5030BD(&dword_8C83F8, 4) & v62;
  v64 = sub_5030BD(&dword_8CA260, 4) & v63;
  v65 = sub_5030BD(&dword_7A04A4, 4) & v64;
  v66 = sub_5030BD(&dword_8A93C8, 4) & v65;
  v67 = sub_5030BD(&dword_7BE604, 4) & v66;
  v68 = sub_5030BD(&dword_8C8274, 4) & v67;
  v69 = sub_5030BD(&dword_8E26BC, 4) & v68;
  v70 = sub_5030BD(&dword_8C776C, 4) & v69;
  v71 = sub_5030BD(&dword_8C7468, 4) & v70;
  v72 = sub_5030BD(&dword_8E1AA8, 4) & v71;
  v73 = sub_5030BD(&dword_951BDC, 4) & v72;
  v74 = sub_5030BD(&dword_8C8F50, 4) & v73;
  v75 = sub_5030BD(&dword_8E3824, 4) & v74;
  v76 = sub_5030BD(&dword_94E928, 4) & v75;
  v77 = sub_5030BD(&dword_8E26B0, 4) & v76;
  v78 = sub_5030BD(&dword_7A01E0, 4) & v77;
  v79 = sub_5030BD(&dword_8BCF74, 4) & v78;
  v80 = sub_5030BD(&dword_8BCF7C, 4) & v79;
  v81 = sub_5030BD(&dword_7A009C, 4) & v80;
  v82 = sub_5030BD(&dword_7A090C, 4) & v81;
  v83 = sub_5030BD(&dword_939E5C, 4) & v82;
  v84 = sub_5030BD(&dword_8BCF6C, 4) & v83;
  v85 = sub_5030BD(&dword_7BEFF0, 4) & v84;
  v86 = sub_5030BD(&dword_93A794, 4) & v85;
  v87 = sub_5030BD(&dword_8E2688, 4) & v86;
  v88 = sub_5030BD(&dword_8E2674, 4) & v87;
  v89 = sub_5030BD(&dword_8E3E70, 4) & v88;
  v90 = sub_5030BD(&dword_94D178, 4) & v89;
  v91 = sub_5030BD(&dword_7BF4B8, 4) & v90;
  v92 = sub_5030BD(&dword_8E2FC4, 4) & v91;
  v93 = sub_5030BD(&dword_94F280, 4) & v92;
  v94 = sub_5030BD(&dword_930F5C, 4) & v93;
  v95 = sub_5030BD(&dword_8C8AFC, 4) & v94;
  v96 = sub_5030BD(&dword_7BEFEC, 4) & v95;
  v97 = sub_5030BD(&dword_7A0098, 4) & v96;
  v98 = sub_5030BD(&dword_8E3820, 4) & v97;
  v99 = sub_5030BD(&dword_939BF4, 4) & v98;
  v100 = sub_5030BD(&dword_7BFE00, 64) & v99;
  v101 = sub_5030BD(&dword_8BCFE4, 4) & v100;
  v102 = sub_5030BD(&dword_8E1C30, 8) & v101;
  v103 = sub_5030BD(&dword_9300B0, 64) & v102;
  v104 = sub_5030BD(&dword_8AA72C, 4) & v103;
  v105 = sub_5030BD(&unk_8E2670, 4) & v104;
  v106 = sub_5030BD(&dword_78E5D8, 4) & v105;
  v107 = sub_5030BD(&dword_951970, 4) & v106;
  v108 = sub_5030BD(&dword_7BF4BC, 4) & v107;
  v109 = sub_5030BD(&dword_7A81A0, 4) & v108;
  v110 = sub_5030BD(&dword_78E5DC, 4) & v109;
  v111 = sub_5030BD(&dword_9300F4, 4) & v110;
  v112 = sub_5030BD(&dword_8E3310, 64) & v111;
  v113 = sub_5030BD(&dword_8E37E0, 64) & v112;
  v114 = sub_5030BD(&dword_94D650, 64) & v113;
  v115 = sub_5030BD(&dword_8BCE38, 8) & v114;
  v116 = sub_5030BD(&dword_8C8468, 8) & v115;
  v117 = sub_5030BD(&dword_8C6A30, 4) & v116;
  v118 = sub_5030BD(&dword_930640, 4) & v117;
  v119 = sub_5030BD(&dword_78E82C, 4) & v118;
  v120 = sub_5030BD(&dword_7BE9E8, 8) & v119;
  v121 = sub_5030BD(&dword_8C73F0, 48) & v120;
  v122 = sub_5030BD(&dword_8C759C, 4) & v121;
  v123 = sub_5030BD(&dword_94CF5C, 4) & v122;
  v124 = sub_5030BD(&dword_8C89CC, 4) & v123;
  v125 = sub_5030BD(&dword_8BD1FC, 4) & v124;
  v126 = sub_5030BD(&dword_7BE740, 8) & v125;
  v127 = sub_5030BD(&dword_94D2B0, 128) & v126;
  v128 = sub_5030BD(&dword_939310, 256) & v127;
  v129 = sub_5030BD(&dword_93A940, 256) & v128;
  v130 = sub_5030BD(&dword_8A9230, 128) & v129;
  v131 = sub_5030BD(&dword_7BE4E0, 128) & v130;
  v132 = sub_5030BD(&dword_8C6AE4, 4) & v131;
  v133 = sub_5030BD(&dword_8C7420, 4) & v132;
  v134 = sub_5030BD(&dword_8E09C4, 4) & v133;
  v135 = sub_5030BD(&dword_7A07D4, 4) & v134;
  v136 = sub_5030BD(&dword_8E3308, 4) & v135;
  v137 = sub_5030BD(&dword_78E838, 4) & v136;
  v138 = sub_5030BD(&dword_7BE9AC, 4) & v137;
  v139 = sub_5030BD(&dword_8E09C0, 4) & v138;
  v140 = sub_5030BD(&dword_94EAB0, 2000) & v139;
  v141 = sub_5030BD(&dword_8C9A90, 2000) & v140;
  v142 = sub_5030BD(&dword_94D45C, 4) & v141;
  v143 = sub_5030BD(&dword_93063C, 4) & v142;
  v144 = sub_5030BD(&dword_7A01DC, 4) & v143;
  v145 = sub_5030BD(&dword_94D640, 4) & v144;
  v146 = sub_5030BD(&dword_8E266C, 4) & v145;
  v147 = sub_5030BD(&dword_92E820, 4) & v146;
  v148 = sub_5030BD(&dword_93A8C0, 4) & v147;
  v149 = sub_5030BD(&dword_591200, 4) & v148;
  v150 = sub_5030BD(&dword_591204, 4) & v149;
  v151 = sub_5030BD(&dword_591208, 4) & v150;
  v152 = sub_5030BD(&dword_78CF04, 4) & v151;
  v153 = sub_5030BD(&dword_78DF34, 4) & v152;
  v154 = sub_5030BD(&dword_78CE20, 192) & v153;
  v155 = sub_5030BD(&dword_5911F8, 4) & v154;
  v156 = sub_5030BD(&dword_5911FC, 4) & v155;
  v157 = sub_5030BD(&dword_78CF00, 4) & v156;
  v158 = sub_5030BD(&dword_789940, 12800) & v157;
  v159 = sub_5030BD(&dword_78CE10, 4) & v158;
  v160 = sub_5030BD(&dword_5863B0, 4) & v159;
  v161 = sub_5030BD(&dword_7894F0, 4) & v160;
  v162 = sub_5030BD(&dword_78DF6C, 4) & v161;
  v163 = sub_5030BD(&dword_78992C, 4) & v162;
  v164 = sub_5030BD(&dword_789910, 20) & v163;
  v165 = sub_5030BD(&Gold, 4) & v164;
  v166 = sub_5030BD(&dword_5863A8, 4) & v165;
  v167 = sub_5030BD(&byte_789500, 1000) & v166;
  v168 = sub_5030BD(&dword_78CEE4, 4) & v167;
  v169 = sub_5030BD(&Scards, 192) & v168;
  v170 = sub_5030BD(&dword_789904, 4) & v169;
  v171 = sub_5030BD(&dword_78CB40, 720) & v170;
  v172 = sub_5030BD(&dword_59120C, 4) & v171;
  v173 = sub_5030BD(&dword_78DF30, 4) & v172;
  v174 = sub_5030BD(&dword_73EA20, 4) & v173;
  v175 = sub_5030BD(&dword_94D634, 4) & v174;
  v176 = sub_5030BD(&dword_73EA88, 4) & v175;
  v177 = sub_5030BD(&X, 4) & v176;
  v178 = sub_5030BD(&dword_5863B4, 4) & v177;
  v179 = sub_5030BD(&currentDeck, 4) & v178;
  v180 = sub_5030BD(&dword_7817F0, 32000) & v179;
  v181 = sub_5030BD(&dword_789930, 4) & v180;
  v182 = sub_5030BD(&dword_930AB0 + 11, 4) & v181;
  v183 = sub_5030BD(&dword_930AB0 + 12, 4) & v182;
  v184 = sub_5030BD(&dword_8C6A24, 4) & v183;
  v185 = sub_5030BD(&dword_931384, 4) & v184;
  v186 = sub_5030BD(&dword_8C746C, 4) & v185;
  v187 = sub_5030BD("Ned Way the Ratiocinator", 64) & v186;
  strcpy(byte_7A0770, "Ned Way the Ratiocinator");
  return sub_5030BD(&dword_73EA64, 4) & v187;
sub_5030BD reads into the first variable N amount of bytes which is specified as 2nd parameter; this should help you out to get values of the save file
the code for this function is at 5022FD

Re: Shandalar Deck Injector

PostPosted: 17 Jul 2011, 21:05
by RyanfaeScotland
Just a quick reply cause I'm shattered and want to get off to bed. That's the file updated on my site so feel free to have a play about. I haven't updated the info on the page yet, will get to it this week at some point.

Cheers for that post Snacko, is that the routine that is run when loading a game?

Re: Shandalar Deck Injector

PostPosted: 18 Jul 2011, 10:57
by Snacko
Yes the function is called when the save is loaded during game initialization.

Re: Shandalar Deck Injector

PostPosted: 18 Jul 2011, 15:25
by RyanfaeScotland
Ok, we just had a really good demo at work so I'm celebrating by taking a little time out to get things updated here.

That is the website updated with the newest info that I've got namely amulet locations and World Magics which is a little secret bonus I threw into the editor. I recommend giving yourself millions of the appropriate coloured amulet (you have to do this yourself just now) and the Staff of Thunder and then walking the plains smite-ing anyone who dares to even consider challanging you! Good fun haha.

There are a few parts of the editor that aren't completed. You'll notice a 'Preferences' and 'About' option in the menus, neither of which do anything yet. Also there is an unused 'Save All' button. The functions for them will be added in with the next release which is not going to add too much more in the way of editing functionality (amulets will be in there for sure) but will look more at non-functional properties such as auto-backups, setting default directories, auto-save opening on start up that sort of thing. The code itself is not too messy just now but as always there are some parts I want to tidy up.

As far as actual deck injecting goes I think that is almost at its finished state. I want to add in some warnings such as 'There are more than 4 duplicate cards in this deck. You will not be allowed to edit it in game without having to remove them.' and that sort of thing but as for the actual function of injecting I think that's done bar any bug fixes.

Extraction will get it's own window so that you can alter things like Name, Date and all the other properties. Also I will look at changing the algorithm for reading from .dck saves so that comments don't break it.

Then I think I'll be looking at health, manalinks and enemy manalinks to see if we can get them editable but after that I'm not certain yet (map editor anyone?) we'll see ;)

Till then please continue to post up error reports and feel free to suggest any features you'd like to see in future versions. Not promising anything but I'll certainly check them out.

@Snacko Nice, that looks like it could be really useful. Am I right in assuming this is some form of C as I'm not too familar with it but it certainly looks like it from my perspective. Also from what I can see the reads are all done in order, there is no jumping about the file to different offsets, so it should be possible to associate each read with a certain position in the save just by seeing how far it has travelled up to each point. This all means the variable names such as &dword_930AB0 don't actually mean anything, at lease not as far as I am concerned.

Re: Shandalar Deck Injector

PostPosted: 18 Jul 2011, 16:06
by Snacko
Yes it's C syntax pseudo code from decompiling Shandalar.
All the reads, as you noticed, are done in order so this shows all the variables that are in the save in the correct order.

The naming of the variables is as follows:
& -> makes a pointer of a variable (all java objects are passed as reference so it's alike)
dword_ -> most likely a dword variable meaning int, however this could be a pointer too
930AB0 -> the address of the variable, this is only useful if you want to memory edit those values while Shandalar is running

The rule of a thumb is if you see & this means this is a single variable either a struct ( like java class but only for data) or a int or an array. If you see read <=4 it means this is int. If its >4 this is either a struct (packed data) or an array. The problem is most of the arrays are arrays of structs, so there's a lot of data to analyze to make sense of it.
If you don't see & this means it's a pointer so most likely an array but could be a struct too.

Re: Shandalar Deck Injector

PostPosted: 27 Sep 2011, 19:59
by benthetenor
Perhaps this is a silly question, but how do I run your program? I downloaded it from your website and it has a bunch of .java and .jar files but no .exe files. Is there something I need to have to run it? Thanks!

Re: Shandalar Deck Injector

PostPosted: 27 Sep 2011, 21:33
by RyanfaeScotland
benthetenor wrote:Perhaps this is a silly question, but how do I run your program? I downloaded it from your website and it has a bunch of .java and .jar files but no .exe files. Is there something I need to have to run it? Thanks!
The jar file is the one you want to run. Just double clicking it should do it as it is the Java equivalent of an exe. If double clicking doesn't do it you probably don't have a java runtime environment installed which you can get here http://www.java.com/en/download/index.jsp.

Re: Shandalar Deck Injector

PostPosted: 27 Sep 2011, 23:15
by benthetenor
Thanks so much. I thought it would be something simple like that. I can't believe I didn't have java installed on this computer....

Re: Shandalar Deck Injector

PostPosted: 28 Sep 2011, 10:32
by RyanfaeScotland
No problem.

Re: Shandalar Deck Injector

PostPosted: 08 Jun 2012, 04:45
by Zac Attack
Thanks for the program, but I can't get it to work. :( I am running XP and followed all the steps. After injecting the cards I want, I return to the play Shandalar to find no change.
What do you suggest?

Re: Shandalar Deck Injector

PostPosted: 11 Jun 2012, 19:03
by RyanfaeScotland
Zac Attack wrote:Thanks for the program, but I can't get it to work. :( I am running XP and followed all the steps. After injecting the cards I want, I return to the play Shandalar to find no change.
What do you suggest?
Hmm this is strange. I uploaded a new version recently that shows some extra error messages when there are cards it cannot inject so try downloading and running it again to see if any errors come up now.

Sadly there are cards that can be added in the Deck Builder program that can't be used in Shandalar (presumably they can be used in Manalink or something) which can make adding decks a bit more problematic than it should be but ce-la-vie, such is life.

You could also try editing some of the player stats and see if those changes take effect in game, this will narrow down the problem a little.

Let me know how you get on and I'll get back to you as soon as I can.

:)

Re: Shandalar Deck Injector

PostPosted: 03 Jul 2012, 04:36
by CirothUngol
First of all, thanx for the uber-nifty program. It's a lot of fun!

I'm building a Stand-Alone Install for Mok's updated Shandalar.exe (dated 20111207) and I plan on including the current version of your application (I hope that's OK).
I've edited the Manalink 3.0 .CSV to reflect the proper spellings, coded status, and correct number of available cards for Shandalar and rebuilt all of the .DAT files so that the new DeckBuilder could be used to build decks exclusively for the purpose of Injecting them into Shandalar .SVE files. Neat, huh?

While testing all of the cards, I noticed that 3 out of the 649 cards that should be available in Shandalar are rejected by the DeckInjector:
Channel
Elder Land Wurm
Ring of Ma'rûf

The Injector will gloss right over Channel but Elder Land Wurm and Ring of Ma'rûf will stop the injection in it's tracks. Is there a reason you've excluded these, or is there something else going on?

I realize that you've never asked for requests (in fact, you've even expressed the opposite)
Allowing the above 3 cards to be injected would make the Shandalar 2.0(?) install that much more complete.
...and since you weren't asking, there's one other issue that would make your application much easier to use. I've placed it in the Shandalar \Program\ Folder inside a subfolder (\DeckInjector\), and it'd be great if it could automatically look in the proper place when attempting to load a file (up one folder for .SVE; up one folder and inside the \PlayDeck\ folder for .DCK). This single alteration would make your program at least twice as easy to use. Please consider it.

...or don't. The DeckInjector is great as it is; and there's simply nothing else like it. I just hope that you don't mind me including it along with the rest of the install.

SideNote:
The DeckInjector will allow you to inject the two cards that are only available inside of Shandalar (you can't use these inside the duel portion of the original game).
Akron Legionnaire
Stone-Throwing Devils

...not that those cards are a big deal (especially the Legionnaire), but I can't ever recall seeing them in Shandalar and I got a real kick out of playing with them. So, thanx again for the great little app that allows one to utterly annihilate and lay total waste to the friendly land of Shandalar (I am the Dark Ruler! All will bow before ME! Cower in fear, puny infidels, for I am the Bringer of Destruction and the entire realm of Shandalar is now MINE! Mwaa-Ha-Ha-Ha!)

Like I said, it's a lot of fun. ^_^

Re: Shandalar Deck Injector

PostPosted: 03 Jul 2012, 08:46
by RyanfaeScotland
Hey there CirothUngol,

Thanks for the high praise! Always nice to hear someone enjoys one of my programs.

I'm afraid I haven't really looked into Manalink so am not sure what editing the CSV files or rebuilding the DAT files entails but I am sure it is very neat. :)

I'm surprised that Channel doesn't work because someone else pointed out that it wasn't available and I'm pretty sure I updated the program and fixed the error. It is however perfectly possible that I didn't upload the latest version to my site o.O I'll check when I get home tonight and make any fixes that are needed over the course of the week.

Currently the program should look in the last opened directory when looking for .SVE and .DCK files although this information is lost once the program is closed. What I planned to do once the program was a bit bigger was have some extra options for customising and tailoring it to your preferences, things like having the default directory saved, allowing auto-backups before injecting, storing a list of cards that can't be injected so that it doesn't prompt everytime... that sort of thing. I'll look at adding the directory part of that lot in for the same update above.

At first I was inserting every card manually and testing that it worked but with help I managed to get all the 'ripping' done automatically so gave up on checking each card since it was a mammoth task. It was much easier to create the program and just fix errors in cards as I found them, I never even considered the help I'd find from the community in spotting errors which makes the task of creating a complete program a lot easier. Cheers guys!

Talking about the community, yeah you can include my program in your pack. Were you thinking of including the whole zip (source and program) or just the program? I'd appreciate credit (a link to my site will do (http://www.mybrillgamesite.com)) some where. I don't update it as often as I should but I'd still like her to know I haven't forgotten about her ;)

Right I think that covers everything. I'll have a look over it tonight and get back to you about the missing / broken cards.

Oh PS:
CirothUngol wrote:...I realize that you've never asked for requests (in fact, you've even expressed the opposite)...
Proof or it never happened :P I welcome feature requests with open arms!

EDIT - Right, investigating done and it turns out the cards were being injected but they just weren't being shown in my program, an easy fix and whilst I was there I fixed the U in Ring of Ma'rûf so it shows properly (ok it doesn't have an accent but it is a u instead of a ? which is much better).

I'll add in directory support tomorrow and get the newest version up soon after.

Re: Shandalar Deck Injector

PostPosted: 04 Jul 2012, 02:23
by CirothUngol
This is great! I tried your app when it first appeared, and again a couple of times when updates came out, initially just to see how it worked. But once I seperated Shandalar from Manalink and started trying to identify exactly which files were needed to run the game it became invaluable. It's helped me to sort out several graphics issues by allowing me to insert the exact card I need, when I need it. It's the closest thing to a DeBug Mode that we have for Shandalar.

As for the .CSV\.DAT thing that I mentioned; both Shandalar 2.0 and the new DeckBuilder require the use of Manalink 3.0 compatible .DAT files. To produce .DATs that would only display Shandalar-compatible cards in the DeckBuilder I edited the .CSV file appropriately... otherwise over 5000 cards would show when you tried to build a PlayDeck to inject. I did this solely for the purpose of including your Deck Injector... otherwise Deck.exe would be pointless to include.

I'm unsure if I have your latest version, but the one I recently download from your site is dated 7/17/2011. It'll be great to have the option of setting a Default Path... any chance of that being relative to the program folder? I ask only because the Deck Injector's position in the install is static and predictable... we already know where the source files are (perhaps Java supports ".\" and "..\").

I initially tested your app by running the Shandalar .CSV file through my PlayDeck Analyser and exporting it as a PlayDeck.dck (Coded Cards Only). I then split it into two decks and loaded them into your Deck Injector... the whole thing took a couple of minutes. I'm still testing all of my old-skool PlayDecks in Shandalar and am happy to report no other issues with Injection or GamePlay. In fact, by removing the need to collect things (Gold, Food, Cards, Amulets, World Magics, etc.) and allowing you to play with any standard PlayDeck, the Deck Injector allows one to treat Shandalar like The Gauntlet... with some adventure on the side. ^_^

I plan on including only the files essential to your app with the install, no archive. Of course, to me, that means everything from your archive, plus a ReadMe of some sort, inside of the \DeckInjector\ folder. I'll probably just assemble a brief .TXT file from the contents of your WebSite and this thread, unless you'd prefer something else. All credit is yours, naturally, and I'll be sure to mention the WebSite.

RyanfaeScotland wrote:Till then please continue to post up error reports and feel free to suggest any features you'd like to see in future versions.
Well, it seems that I owe you an apology, Sir. I remember reading that you'd dropped the project due to lack of time, but a re-read of the thread produced the preceding quote just a few posts back. Therefore, my apologies... and thanx for coming up with a solution so quickly! It's great to know that you're still willing to expand on your rather singular little application.

Have you had any luck mapping the rest of the Shandalar .SVE file? While re-reading the thread I came across Snacko's post about the load routine... now that we know exactly were to look, it should be easier to figure out exactly what they are. He's came forward and revealed Magic's innards to me a couple of times (like when I was mapping the Manalink 2.0 CARDS.DAT file). He's kinda cool like that.