|
Post by Woitek on Feb 27, 2017 18:08:21 GMT
Which moves you delete from SmokinJoe exactly? It's been a long time but here's what I have in the exe: in hexdeximals it looks like this: Well, it's working like that: Game have specified memory where are all ghosts in the game. Every ghost have 528 bytes array, and game load them until in name not find symbol "!" in hex 0x21. After that, every ghost name from this array is compared with name existing in exe. Game does it by making from them hashsums. So first, they add all existing ghosts names to hash table, and then when ghost load, game compare new hash with existing table, if new hash match with any existing hash, then game link it with specific ghost. Ghost are link with TEXT name. So if you want to add ghost to menu, you have to apply for specific ghost class his text ID. In this article I wrote how look like this specific array: bspviewer.wiki-site.com/index.php/Haunter_data. Generally, all you have to do for make rejected ghost work is change isAtStart to 1, and add ghost to menu. Life starts to be more complicated when you want add ghost to ghoulroom. This game is very static, and all scripts are builded in exe. I've done it by replacing some useless structures in script, with ghost one. In exe it use structure like this: GhostNameAdress,SpawnTextAdress,IsHookToAdress,CameraTalkAdress D8 55 8C 00 A4 15 8E 00 88 2B 8E 00 B0 15 8E 00 GhostName we already know from exe, but for add new spawns we need text what was never used by game, because we need hook it to specific ghost in hash table. Thats why I use for spawns and camera texts for unused objects from Trainspook level. And that's it. Last thing you have to do is open scenario file(gamedata.bsp), open chunk with type 1020, add spawn point with camera, and in place where is hash, replace it with new one based on text what you use in exe.
|
|
|
Post by Woitek on Feb 27, 2017 18:15:03 GMT
Hashsums are calculated from this formula:
int[]hashvalues = {0,79764919,159529838,222504665,319059676,398814059,445009330,507990021,638119352,583659535,797628118,726387553,890018660,835552979,1015980042,944750013,1276238704,1221641927,1167319070,1095957929,1595256236,1540665371,1452775106,1381403509,1780037320,1859660671,1671105958,1733955601,2031960084,2111593891,1889500026,1952343757,-1742489888,-1662866601,-1851683442,-1788833735,-1960329156,-1880695413,-2103051438,-2040207643,-1104454824,-1159051537,-1213636554,-1284997759,-1389417084,-1444007885,-1532160278,-1603531939,-734892656,-789352409,-575645954,-646886583,-952755380,-1007220997,-827056094,-898286187,-231047128,-151282273,-71779514,-8804623,-515967244,-436212925,-390279782,-327299027,881225847,809987520,1023691545,969234094,662832811,591600412,771767749,717299826,311336399,374308984,453813921,533576470,25881363,88864420,134795389,214552010,2023205639,2086057648,1897238633,1976864222,1804852699,1867694188,1645340341,1724971778,1587496639,1516133128,1461550545,1406951526,1302016099,1230646740,1142491917,1087903418,-1398421865,-1469785312,-1524105735,-1578704818,-1079922613,-1151291908,-1239184603,-1293773166,-1968362705,-1905510760,-2094067647,-2014441994,-1716953613,-1654112188,-1876203875,-1796572374,-525066777,-462094256,-382327159,-302564546,-206542021,-143559028,-97365931,-17609246,-960696225,-1031934488,-817968335,-872425850,-709327229,-780559564,-600130067,-654598054,1762451694,1842216281,1619975040,1682949687,2047383090,2127137669,1938468188,2001449195,1325665622,1271206113,1183200824,1111960463,1543535498,1489069629,1434599652,1363369299,622672798,568075817,748617968,677256519,907627842,853037301,1067152940,995781531,51762726,131386257,177728840,240578815,269590778,349224269,429104020,491947555,-248556018,-168932423,-122852000,-60002089,-500490030,-420856475,-341238852,-278395381,-685261898,-739858943,-559578920,-630940305,-1004286614,-1058877219,-845023740,-916395085,-1119974018,-1174433591,-1262701040,-1333941337,-1371866206,-1426332139,-1481064244,-1552294533,-1690935098,-1611170447,-1833673816,-1770699233,-2009983462,-1930228819,-2119160460,-2056179517,1569362073,1498123566,1409854455,1355396672,1317987909,1246755826,1192025387,1137557660,2072149281,2135122070,1912620623,1992383480,1753615357,1816598090,1627664531,1707420964,295390185,358241886,404320391,483945776,43990325,106832002,186451547,266083308,932423249,861060070,1041341759,986742920,613929101,542559546,756411363,701822548,-978770311,-1050133554,-869589737,-924188512,-693284699,-764654318,-550540341,-605129092,-475935807,-413084042,-366743377,-287118056,-257573603,-194731862,-114850189,-35218492,-1984365303,-1921392450,-2143631769,-2063868976,-1698919467,-1635936670,-1824608069,-1744851700,-1347415887,-1418654458,-1506661409,-1561119128,-1129027987,-1200260134,-1254728445,-1309196108}; int hashsum = 0; byte[] hasharray = debugTextArea.getText().getBytes(); for (int u = 0; u<hasharray.length;u++){ hashsum = hashvalues[(int)((hashsum >> 24) ^ (hasharray[ u ])) & 0xFF] ^ (hashsum << 8); } int hashsumfinal = (hasharray.length ^ hashsum);
Where hashValues are hardcored integers from exe.
|
|