-
Notifications
You must be signed in to change notification settings - Fork 15
How to create actor texture maps
LostMyCode edited this page Feb 12, 2023
·
3 revisions
Leave a comment and let us know if you have a better way
First of all, we need to get a hardcoded list of texture filename in RedStone.exe using binary editor
Here is a extracted list of NPC texture filenames from RedStone.exe
_C@_09JOAG@ANGEL?4sad
?$AA@.??_C@_0BK@LHDN@PITCHMAN_GRAND_MOTHER?4sad
?$AA@.??_C@_0BK@MGJI@PITCHMAN_GRAND_FATHER?4sad
?$AA@.??_C@_0P@GKLF@PITCHMAN_F?4sad
?$AA@.??_C@_0P@ILPA@PITCHMAN_M?4sad
?$AA@.??_C@_0N@OHMB@GROCER_F?4sad
?$AA@.??_C@_0N@GIE@GROCER_M?4sad
?$AA@.??_C@_0BG@GKPM@SHOPKEEPER_WEAPON?4sad
?$AA@.??_C@_0P@MJNB@MAGICIAN_F?4sad
?$AA@.??_C@_0P@CIJE@MAGICIAN_M?4sad
?$AA@.??_C@_0L@NJNI@WIZARD?4sad
?$AA@.??_C@_0L@HDCM@CADET2?4sad
?$AA@.??_C@_0L@JDED@CADET1?4sad
?$AA@.??_C@_0BB@BJML@INSTRUCTOR_F?4sad
?$AA@.??_C@_0BB@PIIO@INSTRUCTOR_M?4sad
?$AA@.??_C@_0BB@EABO@DANCING_GIRL?4sad
?$AA@.??_C@_0L@LLOK@BAGGER?4sad
?$AA@.??_C@_0BI@ILFK@MERCENARY_SOLDIER_F?4sad
?$AA@.??_C@_0BI@GKBP@MERCENARY_SOLDIER_M?4sad
?$AA@.??_C@_07HEAD@NUN?4sad
?$AA@.??_C@_0L@HBLF@PRIEST?4sad
?$AA@.??_C@_0L@HALG@BISHOP?4sad
?$AA@.??_C@_0BE@DOKD@TEMPLE_KNIGHT_F?4sad
?$AA@.??_C@_0BE@NPOG@TEMPLE_KNIGHT_M?4sad
?$AA@.??_C@_0BA@GNFP@HALBERD_MAN?4sad
?$AA@.??_C@_0L@DOIM@SAILER?4sad
?$AA@.??_C@_09OEDG@MINER?4sad
?$AA@.??_C@_0BA@DACN@WOODCUTTER2?4sad
?$AA@.??_C@_0BA@NAEC@WOODCUTTER1?4sad
?$AA@.??_C@_0M@KGLI@FARMER2?4sad
?$AA@.??_C@_0M@EGNH@FARMER1?4sad
?$AA@.??_C@_0BA@BHN@GYPSY_GIRL2?4sad
?$AA@.??_C@_0BA@OBBC@GYPSY_GIRL1?4sad
?$AA@.??_C@_0P@NAHB@GYPSY_BOY2?4sad
?$AA@.??_C@_0P@DABO@GYPSY_BOY1?4sad
?$AA@.??_C@_0BB@EDNO@GYPSY_WOMAN2?4sad
?$AA@.??_C@_0BB@KDLB@GYPSY_WOMAN1?4sad
?$AA@.??_C@_0P@EIHO@GYPSY_MAN2?4sad
?$AA@.??_C@_0P@KIBB@GYPSY_MAN1?4sad
?$AA@.??_C@_0P@CA@NOBLE_GIRL?4sad
?$AA@.??_C@_0O@IJPL@NOBLE_BOY?4sad
?$AA@.??_C@_0BB@KBJP@NOBLE_WOMAN2?4sad
?$AA@.??_C@_0BB@EBPA@NOBLE_WOMAN1?4sad
?$AA@.??_C@_0P@MKHJ@NOBLE_MAN2?4sad
?$AA@.??_C@_0P@CKBG@NOBLE_MAN1?4sad
?$AA@.??_C@_09GABJ@GIRL2?4sad
?$AA@.??_C@_09IAHG@GIRL1?4sad
?$AA@.??_C@_08LEPL@BOY2?4sad
?$AA@.??_C@_08FEJE@BOY1?4sad
?$AA@.??_C@_0BB@EIK@GRAND_MOTHER?4sad
?$AA@.??_C@_0BB@HFCP@GRAND_FATHER?4sad
?$AA@.??_C@_09OCPB@LADY2?4sad
?$AA@.??_C@_09CJO@LADY1?4sad
?$AA@.??_C@_0P@LLHP@YOUNG_MAN2?4sad
?$AA@.??_C@_0P@FLBA@YOUNG_MAN1?4sad
?$AA@.??_C@_0L@EALP@WOMAN2?4sad
?$AA@.??_C@_0L@KANA@WOMAN1?4sad
?$AA@.??_C@_08CMPE@MAN2?4sad
?$AA@.??_C@_08MMJL@MAN1?4sad
Remove unnecessary parts and replace garbled strings like below:
- ?$AA@.??_C@_09GABJ@GIRL2?4sad
- ?$AA@.??_C@_09IAHG@GIRL1?4sad
- ?$AA@.??_C@_08LEPL@BOY2?4sad
- ?$AA@.??_C@_08FEJE@BOY1?4sad
+ GYPSY_GIRL2.sad
+ GYPSY_GIRL1.sad
+ GYPSY_BOY2.sad
+ GYPSY_BOY1.sad
Now you have a cleaned list like this
ANGEL.sad
PITCHMAN_GRAND_MOTHER.sad
PITCHMAN_GRAND_FATHER.sad
PITCHMAN_F.sad
PITCHMAN_M.sad
GROCER_F.sad
GROCER_M.sad
SHOPKEEPER_WEAPON.sad
MAGICIAN_F.sad
MAGICIAN_M.sad
WIZARD.sad
CADET2.sad
CADET1.sad
INSTRUCTOR_F.sad
INSTRUCTOR_M.sad
DANCING_GIRL.sad
BAGGER.sad
MERCENARY_SOLDIER_F.sad
MERCENARY_SOLDIER_M.sad
NUN.sad
PRIEST.sad
BISHOP.sad
TEMPLE_KNIGHT_F.sad
TEMPLE_KNIGHT_M.sad
HALBERD_MAN.sad
SAILER.sad
MINER.sad
WOODCUTTER2.sad
WOODCUTTER1.sad
FARMER2.sad
FARMER1.sad
GYPSY_GIRL2.sad
GYPSY_GIRL1.sad
GYPSY_BOY2.sad
GYPSY_BOY1.sad
GYPSY_WOMAN2.sad
GYPSY_WOMAN1.sad
GYPSY_MAN2.sad
GYPSY_MAN1.sad
NOBLE_GIRL.sad
NOBLE_BOY.sad
NOBLE_WOMAN2.sad
NOBLE_WOMAN1.sad
NOBLE_MAN2.sad
NOBLE_MAN1.sad
GIRL2.sad
GIRL1.sad
BOY2.sad
BOY1.sad
GRAND_MOTHER.sad
GRAND_FATHER.sad
LADY2.sad
LADY1.sad
YOUNG_MAN2.sad
YOUNG_MAN1.sad
WOMAN2.sad
WOMAN1.sad
MAN2.sad
MAN1.sad
The order of the hardcoded listings is reversed.
In JavaScript, Array object has reverse()
method so it is easy to do reverse order using it or use some online tools
Reversed:
MAN1.sad
MAN2.sad
WOMAN1.sad
WOMAN2.sad
YOUNG_MAN1.sad
YOUNG_MAN2.sad
LADY1.sad
LADY2.sad
GRAND_FATHER.sad
GRAND_MOTHER.sad
BOY1.sad
BOY2.sad
GIRL1.sad
GIRL2.sad
NOBLE_MAN1.sad
NOBLE_MAN2.sad
NOBLE_WOMAN1.sad
NOBLE_WOMAN2.sad
NOBLE_BOY.sad
NOBLE_GIRL.sad
GYPSY_MAN1.sad
GYPSY_MAN2.sad
GYPSY_WOMAN1.sad
GYPSY_WOMAN2.sad
GYPSY_BOY1.sad
GYPSY_BOY2.sad
GYPSY_GIRL1.sad
GYPSY_GIRL2.sad
FARMER1.sad
FARMER2.sad
WOODCUTTER1.sad
WOODCUTTER2.sad
MINER.sad
SAILER.sad
HALBERD_MAN.sad
TEMPLE_KNIGHT_M.sad
TEMPLE_KNIGHT_F.sad
BISHOP.sad
PRIEST.sad
NUN.sad
MERCENARY_SOLDIER_M.sad
MERCENARY_SOLDIER_F.sad
BAGGER.sad
DANCING_GIRL.sad
INSTRUCTOR_M.sad
INSTRUCTOR_F.sad
CADET1.sad
CADET2.sad
WIZARD.sad
MAGICIAN_M.sad
MAGICIAN_F.sad
SHOPKEEPER_WEAPON.sad
GROCER_M.sad
GROCER_F.sad
PITCHMAN_M.sad
PITCHMAN_F.sad
PITCHMAN_GRAND_FATHER.sad
PITCHMAN_GRAND_MOTHER.sad
ANGEL.sad
First item of the list, MAN1 has index 250 so get them incremental indexes from 250

Result:
{
250: "MAN1.sad",
251: "MAN2.sad",
252: "WOMAN1.sad",
253: "WOMAN2.sad",
254: "YOUNG_MAN1.sad",
255: "YOUNG_MAN2.sad",
256: "LADY1.sad",
257: "LADY2.sad",
258: "GRAND_FATHER.sad",
259: "GRAND_MOTHER.sad",
260: "BOY1.sad",
261: "BOY2.sad",
262: "GIRL1.sad",
263: "GIRL2.sad",
264: "NOBLE_MAN1.sad",
265: "NOBLE_MAN2.sad",
266: "NOBLE_WOMAN1.sad",
267: "NOBLE_WOMAN2.sad",
268: "NOBLE_BOY.sad",
269: "NOBLE_GIRL.sad",
270: "GYPSY_MAN1.sad",
271: "GYPSY_MAN2.sad",
272: "GYPSY_WOMAN1.sad",
273: "GYPSY_WOMAN2.sad",
274: "GYPSY_BOY1.sad",
275: "GYPSY_BOY2.sad",
276: "GYPSY_GIRL1.sad",
277: "GYPSY_GIRL2.sad",
278: "FARMER1.sad",
279: "FARMER2.sad",
280: "WOODCUTTER1.sad",
281: "WOODCUTTER2.sad",
282: "MINER.sad",
283: "SAILER.sad",
284: "HALBERD_MAN.sad",
285: "TEMPLE_KNIGHT_M.sad",
286: "TEMPLE_KNIGHT_F.sad",
287: "BISHOP.sad",
288: "PRIEST.sad",
289: "NUN.sad",
290: "MERCENARY_SOLDIER_M.sad",
291: "MERCENARY_SOLDIER_F.sad",
292: "BAGGER.sad",
293: "DANCING_GIRL.sad",
294: "INSTRUCTOR_M.sad",
295: "INSTRUCTOR_F.sad",
296: "CADET1.sad",
297: "CADET2.sad",
298: "WIZARD.sad",
299: "MAGICIAN_M.sad",
300: "MAGICIAN_F.sad",
301: "SHOPKEEPER_WEAPON.sad",
302: "GROCER_M.sad",
303: "GROCER_F.sad",
304: "PITCHMAN_M.sad",
305: "PITCHMAN_F.sad",
306: "PITCHMAN_GRAND_FATHER.sad",
307: "PITCHMAN_GRAND_MOTHER.sad",
308: "ANGEL.sad"
}