-
Posts
26 -
Joined
-
Last visited
Nexus Mods Profile
About zyllos
zyllos's Achievements
-
I would agree with this also. Man, the amount of work it just took me to do that up there, I couldn't imagine trying to keep all the jump offsets and references straight for both EU and EW with the amount of bytes changed for the Long War mod.
-
Well, that did the trick for running the game. But I am not sure if it did anything. Apparently I need to research what that function does. I thought it would be called each time an interceptor is sent out, but that doesn't seem to be the case. How do I go about testing these? I heard that it's been pretty hard to get the console and developer functions available to test these changes so do I just load up the game and start playing?
-
Interesting. What I was doing to calculate the function virtual size was by totaling the first number in each (#/#) pair of each token, which ended up being 400 or 0x190. UE Explorer says the first number is Token(Memory Size/...) but apparently this isn't true. So, the function memory size is always just the last (#/#) pair's first number plus the token's memory size? Hmm, looking at the "View Buffer" and the corresponding (#/#) pair, now I see what the problem with what I was doing. Each token shows the memory size alright, but it includes parts of other tokens to make up the entire symbol. Thus, the L (Let) symbol includes the C (Context) symbol and ICB (Int Const Byte) symbol. As such, some of those bytes overlap each other, thus I can't add up each symbol's memory size, but instead I just need to add up each full statement's memory size, or the value presented by UE Explorer. Ok, so here we go...
-
Ok, I have failed my first attempt at editing a function. I edited the XGFacility_Hanger.DetermineInterceptorStatus to just assign the m_iStatus and m_iHoursDown as straight up values (basically making the interceptor down indefinitely because the call will keep resetting the values). UE Explorer seems to decompile into code that makes sense but I was unsure how to deal with some values with the function. There was a sequence of values, the last 3 words + 3 bytes, I was unsure what to do with but I am going to assume it's needed for the function so I left those alone. The EOS token I added to right before the end of the sequence of values at the end of the function. But the problem is that I was unsure where to put the 0B (None Token) values at, so I placed them all in between the EOS token and the return NONE token. Here is my function call: function DetermineInterceptorStatus(XGShip_Interceptor kInterceptor) { kInterceptor.m_iStatus = 4; kInterceptor.m_iHoursDown = 255; return; } (000/000) [0F 19 00 22 36 00 00 09 00 99 4A 00 00 00 01 99 4A 00 00 2C 04] L(33/21) -> C(30/18) -> LV(9/5) -> IV(9/5) -> ICB(2/2) kInterceptor.m_iStatus = 4 (021/015) [0F 19 00 22 36 00 00 09 00 31 4B 00 00 00 01 31 4B 00 00 2C FF] L(33/21) -> C(30/18) -> LV(9/5) -> IV(9/5) -> ICB(2/2) kInterceptor.m_iHoursDown = 255 (042/02A) [04 0B] R(2/2) -> N(1/1) return (044/02C) [0B] N(1/1) (045/02D) [0B] N(1/1) (046/02E) [0B] N(1/1) (047/02F) [0B] N(1/1) (048/030) [0B] N(1/1) (049/031) [0B] N(1/1) (04A/032) [0B] N(1/1) (04B/033) [0B] N(1/1) (04C/034) [0B] N(1/1) (04D/035) [0B] N(1/1) (04E/036) [0B] N(1/1) (04F/037) [0B] N(1/1) (050/038) [0B] N(1/1) (051/039) [0B] N(1/1) (052/03A) [0B] N(1/1) (053/03B) [0B] N(1/1) (054/03C) [0B] N(1/1) (055/03D) [0B] N(1/1) (056/03E) [0B] N(1/1) (057/03F) [0B] N(1/1) (058/040) [0B] N(1/1) (059/041) [0B] N(1/1) (05A/042) [0B] N(1/1) (05B/043) [0B] N(1/1) (05C/044) [0B] N(1/1) (05D/045) [0B] N(1/1) (05E/046) [0B] N(1/1) (05F/047) [0B] N(1/1) (060/048) [0B] N(1/1) (061/049) [0B] N(1/1) (062/04A) [0B] N(1/1) (063/04B) [0B] N(1/1) (064/04C) [0B] N(1/1) (065/04D) [0B] N(1/1) (066/04E) [0B] N(1/1) (067/04F) [0B] N(1/1) (068/050) [0B] N(1/1) (069/051) [0B] N(1/1) (06A/052) [0B] N(1/1) (06B/053) [0B] N(1/1) (06C/054) [0B] N(1/1) (06D/055) [0B] N(1/1) (06E/056) [0B] N(1/1) (06F/057) [0B] N(1/1) (070/058) [0B] N(1/1) (071/059) [0B] N(1/1) (072/05A) [0B] N(1/1) (073/05B) [0B] N(1/1) (074/05C) [0B] N(1/1) (075/05D) [0B] N(1/1) (076/05E) [0B] N(1/1) (077/05F) [0B] N(1/1) (078/060) [0B] N(1/1) (079/061) [0B] N(1/1) (07A/062) [0B] N(1/1) (07B/063) [0B] N(1/1) (07C/064) [0B] N(1/1) (07D/065) [0B] N(1/1) (07E/066) [0B] N(1/1) (07F/067) [0B] N(1/1) (080/068) [0B] N(1/1) (081/069) [0B] N(1/1) (082/06A) [0B] N(1/1) (083/06B) [0B] N(1/1) (084/06C) [0B] N(1/1) (085/06D) [0B] N(1/1) (086/06E) [0B] N(1/1) (087/06F) [0B] N(1/1) (088/070) [0B] N(1/1) (089/071) [0B] N(1/1) (08A/072) [0B] N(1/1) (08B/073) [0B] N(1/1) (08C/074) [0B] N(1/1) (08D/075) [0B] N(1/1) (08E/076) [0B] N(1/1) (08F/077) [0B] N(1/1) (090/078) [0B] N(1/1) (091/079) [0B] N(1/1) (092/07A) [0B] N(1/1) (093/07B) [0B] N(1/1) (094/07C) [0B] N(1/1) (095/07D) [0B] N(1/1) (096/07E) [0B] N(1/1) (097/07F) [0B] N(1/1) (098/080) [0B] N(1/1) (099/081) [0B] N(1/1) (09A/082) [0B] N(1/1) (09B/083) [0B] N(1/1) (09C/084) [0B] N(1/1) (09D/085) [0B] N(1/1) (09E/086) [0B] N(1/1) (09F/087) [0B] N(1/1) (0A0/088) [0B] N(1/1) (0A1/089) [0B] N(1/1) (0A2/08A) [0B] N(1/1) (0A3/08B) [0B] N(1/1) (0A4/08C) [0B] N(1/1) (0A5/08D) [0B] N(1/1) (0A6/08E) [0B] N(1/1) (0A7/08F) [0B] N(1/1) (0A8/090) [0B] N(1/1) (0A9/091) [0B] N(1/1) (0AA/092) [0B] N(1/1) (0AB/093) [0B] N(1/1) (0AC/094) [0B] N(1/1) (0AD/095) [0B] N(1/1) (0AE/096) [0B] N(1/1) (0AF/097) [0B] N(1/1) (0B0/098) [0B] N(1/1) (0B1/099) [0B] N(1/1) (0B2/09A) [0B] N(1/1) (0B3/09B) [0B] N(1/1) (0B4/09C) [0B] N(1/1) (0B5/09D) [0B] N(1/1) (0B6/09E) [0B] N(1/1) (0B7/09F) [0B] N(1/1) (0B8/0A0) [0B] N(1/1) (0B9/0A1) [0B] N(1/1) (0BA/0A2) [0B] N(1/1) (0BB/0A3) [0B] N(1/1) (0BC/0A4) [0B] N(1/1) (0BD/0A5) [0B] N(1/1) (0BE/0A6) [0B] N(1/1) (0BF/0A7) [0B] N(1/1) (0C0/0A8) [0B] N(1/1) (0C1/0A9) [0B] N(1/1) (0C2/0AA) [0B] N(1/1) (0C3/0AB) [0B] N(1/1) (0C4/0AC) [0B] N(1/1) (0C5/0AD) [0B] N(1/1) (0C6/0AE) [0B] N(1/1) (0C7/0AF) [0B] N(1/1) (0C8/0B0) [0B] N(1/1) (0C9/0B1) [0B] N(1/1) (0CA/0B2) [0B] N(1/1) (0CB/0B3) [0B] N(1/1) (0CC/0B4) [0B] N(1/1) (0CD/0B5) [0B] N(1/1) (0CE/0B6) [0B] N(1/1) (0CF/0B7) [0B] N(1/1) (0D0/0B8) [0B] N(1/1) (0D1/0B9) [0B] N(1/1) (0D2/0BA) [0B] N(1/1) (0D3/0BB) [0B] N(1/1) (0D4/0BC) [0B] N(1/1) (0D5/0BD) [0B] N(1/1) (0D6/0BE) [0B] N(1/1) (0D7/0BF) [0B] N(1/1) (0D8/0C0) [0B] N(1/1) (0D9/0C1) [0B] N(1/1) (0DA/0C2) [0B] N(1/1) (0DB/0C3) [0B] N(1/1) (0DC/0C4) [0B] N(1/1) (0DD/0C5) [0B] N(1/1) (0DE/0C6) [0B] N(1/1) (0DF/0C7) [0B] N(1/1) (0E0/0C8) [0B] N(1/1) (0E1/0C9) [0B] N(1/1) (0E2/0CA) [0B] N(1/1) (0E3/0CB) [0B] N(1/1) (0E4/0CC) [0B] N(1/1) (0E5/0CD) [0B] N(1/1) (0E6/0CE) [0B] N(1/1) (0E7/0CF) [0B] N(1/1) (0E8/0D0) [0B] N(1/1) (0E9/0D1) [0B] N(1/1) (0EA/0D2) [0B] N(1/1) (0EB/0D3) [0B] N(1/1) (0EC/0D4) [0B] N(1/1) (0ED/0D5) [0B] N(1/1) (0EE/0D6) [0B] N(1/1) (0EF/0D7) [0B] N(1/1) (0F0/0D8) [0B] N(1/1) (0F1/0D9) [0B] N(1/1) (0F2/0DA) [0B] N(1/1) (0F3/0DB) [0B] N(1/1) (0F4/0DC) [0B] N(1/1) (0F5/0DD) [0B] N(1/1) (0F6/0DE) [0B] N(1/1) (0F7/0DF) [0B] N(1/1) (0F8/0E0) [0B] N(1/1) (0F9/0E1) [0B] N(1/1) (0FA/0E2) [0B] N(1/1) (0FB/0E3) [0B] N(1/1) (0FC/0E4) [0B] N(1/1) (0FD/0E5) [0B] N(1/1) (0FE/0E6) [0B] N(1/1) (0FF/0E7) [0B] N(1/1) (100/0E8) [0B] N(1/1) (101/0E9) [0B] N(1/1) (102/0EA) [0B] N(1/1) (103/0EB) [0B] N(1/1) (104/0EC) [0B] N(1/1) (105/0ED) [0B] N(1/1) (106/0EE) [0B] N(1/1) (107/0EF) [0B] N(1/1) (108/0F0) [0B] N(1/1) (109/0F1) [0B] N(1/1) (10A/0F2) [0B] N(1/1) (10B/0F3) [0B] N(1/1) (10C/0F4) [0B] N(1/1) (10D/0F5) [0B] N(1/1) (10E/0F6) [0B] N(1/1) (10F/0F7) [0B] N(1/1) (110/0F8) [0B] N(1/1) (111/0F9) [0B] N(1/1) (112/0FA) [0B] N(1/1) (113/0FB) [0B] N(1/1) (114/0FC) [0B] N(1/1) (115/0FD) [0B] N(1/1) (116/0FE) [0B] N(1/1) (117/0FF) [0B] N(1/1) (118/100) [0B] N(1/1) (119/101) [0B] N(1/1) (11A/102) [0B] N(1/1) (11B/103) [0B] N(1/1) (11C/104) [0B] N(1/1) (11D/105) [0B] N(1/1) (11E/106) [0B] N(1/1) (11F/107) [0B] N(1/1) (120/108) [0B] N(1/1) (121/109) [0B] N(1/1) (122/10A) [0B] N(1/1) (123/10B) [0B] N(1/1) (124/10C) [0B] N(1/1) (125/10D) [0B] N(1/1) (126/10E) [0B] N(1/1) (127/10F) [0B] N(1/1) (128/110) [0B] N(1/1) (129/111) [0B] N(1/1) (12A/112) [0B] N(1/1) (12B/113) [53] EOS(1/1) 22 36 00 00 94 25 00 00 00 00 00 00 21 36 00 00 00 00 00 00 00 00 00 00 22 36 00 00 00 00 00 00 04 01 00 00 83 1F 00 00 90 01 00 00 14 01 00 00 0F 19 00 22 36 00 00 09 00 99 4A 00 00 00 01 99 4A 00 00 2C 04 0F 19 00 22 36 00 00 09 00 31 4B 00 00 00 01 31 4B 00 00 2C FF 04 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 53 00 00 00 02 00 02 00 03 09 00 00 00 00 00 00 Now, I have not done anything else to to EW, so maybe I need to modify the EXE to get it to read the uncompressed UPK files but I thought I read they no longer check. Not sure where to go from here.
-
Sweet. Thanks.
-
Ok, so I have a question, again. Sorry about all this, trying to get to a point where I can actually get a successful modification going. If I say I wanted to rewrite the XGFacility_Hanger.DetermineInterceptorStatus function from the series of if statements it is now, to a simple straight up "always equal to a value". According to your previous statements, the function's file byte size has to remain the same size but the virtual size can change, which means the 11th byte can be whatever size it ends up being calculated to, which I am still kinda hung up on how to calculate, but I am taking baby steps right now. Does this mean I have to utilize the if statements and just make them assign the same values so the file byte size of the function stays the same size or is there a technique to place a bunch of "blank" data in there? Maybe I could do bunch of assignment statements to equal the same number of file bytes?
-
Ok, so the size of the function must remain the same (thus take up the same virtual space in memory), the signature of the function must stay the same (inputs/outputs), and it's pretty hard to create new local variables within a function? Really, the major problem at this point is what was newly added with EW, what is the new hexes of variables in these classes, and what is the new hex values needed to be placed in the UPK files to get the old functionality back into the new code. Hmm, does the EW discovery thread contain everything that has been determined so far? I think I am going to just start on the next hex edit in the Changes.txt file and determine what is now needed for it to work.
-
Ya, it seeming not nearly as bad as I thought, initially. Thanks for the resource. Just a quick question, I am going to assume we can't change the signature of a function because the EXE is looking for the return type and parameters involved, thus "rewriting" functions actually just means repurposing the statements within the scope of the function, correct? Or, is it possible to rewrite entire functions?
-
That is the exact explanation I needed. I have never actually just compiled C++ code then looked at the binary to see what the hex values became. Is there a resources of values, as per you explanation of (0F = for assignment, 35 = for struct construction, ...) or is it basically trial and error? Mainly, your step (4) - Manually convert each line of target code into hex, would be my hardest part in an attempt to be useful here.
-
Thanks for the offer! To a certain degree, with respect to EW, we just "don't know what we don't know". The overall structure of the code has remain mostly unchanged (thankfully). However so many new mechanics have been spliced in that we're having to assess what all is new. A fair bit of big stuff and some little stuff too. At this point the biggest amount of work is simply updating for the (minor) Enemy Unknown patch. Basically all of the code-wise changes should be unchanged (code as in what UE Explorer kicks out). However jump offsets and function/variable references have changed so the before/after hex replacements don't work any more. In the Miscellaneous files section of Long War is the 'Long War 2 hex and localization changes' file. It contains basically every hex change made for Long War. Currently it's for the 2.12 beta4, which in terms of hex/localization changes is identical to 2.12 beta5 and 2.12 release. Most (but not all) of the changes refer to the class.function that is being changed. In that function in the XCOM:EU with patch 5 should be very similar code but with function/variable references changed. The challenge is finding the new "before" hex, and then generating new "after" hex with correct references. The file has 3000 lines and is ~780k, so there's a fair number of changes. Any help with this would be much appreciated. Ok, now I see the "overall" issue, I think. Bear with me, while I might have a degree in Computer Science, typically, I write code then compile instead of decompile (actually, I have never done this before) then modify. But from what I gather, using this UE Explorer, you can decompile the EXE (EDIT: ...I mean the .UPKs, which are apparently like .DLL files utilized by the XCom EXE) file into readable code, modify the function parameters (as you can't physically change the functions themselves) and see how that effects the binary afterwards. Then, you have to match these references so you can get the code to perform "new functionality"? Am I even close? I will take time this weekend and try to understand the hex changes in what they are attempting to accomplish. Hopefully by the end of the weekend, I can actually be of some help. Just like adding a new team member to a development group...basically be useless and will take up a lot of resources/time to get up to speed.
-
Anything I could possibly help with? I won't touch the base game so I won't be playing until this mod is officially able to be used with EW. What files/code/ect is still needed to be found?
-
I would double check to see if those steps are correct and if you would update/change any of them for unstandability/readability/consistency purposes, but no problem.
-
No, you do not. The installation moves all the files to the correct spot (I think) and the XComEUModHelper edits the files with the Config.xml as the instructions.
-
If you have your Steam library in a different place from the default and XCom is in that different library, do this instead: After selecting the "../Steam Library/common/" directory to install Long War at, let it finish and fail to run XComEUModHelper executable. Let the installer finish. After this happens, go to: Win XP: Windows Start Button > Run > Type in "Command" in the text box and hit enter Win 7: Windows Start Button > Type in "Command" in the text box at the bottom > Click "Command Prompt" Once running this, a command line prompt will open up, which will look like a black box window. Here, type in: x: X should be the driver letter that XCom is installed on. If the command prompt is already displaying "X:\...>", which is the drive you want, you can skip this. For example, if your XCom is installed in drive D, then type "D:" and hit Enter. This will set you to the root of drive D. Now you need to navigate to the XComEUModHelper program, which is located in the "Long War Files" folder in the XCom directory in which you installed the mod to. To do this, use the "cd" command in the prompt (stands for Change Directory). cd x:\...\Long War Files\ The "..." is your directory path to this folder, so it is unique to every installation, thus you need to find this path and type it in your self. For example, if you installed XCom in the "F:\Games\Steam Library\common\XCom-Enemy-Unknown\" directory path, you would type in "cd f:\games\steam library\common\xcom-enemy-unknown\long war files\" at the command prompt to navigate to it. Now, type in "dir/w". This will display whats contained in the directory, and the /w command makes it print out in wide mode, used to display directories with many files in it. It also helps with readability. Make sure the "XComEUModHelper" file exists. Once this is verified, now you need to execute the program with some special flags, that is utilized by the XComEUModHelper program. Type this in: XComEUModHelper -x "..." -c "Config.xml" The "..." is the directory path to where your XCom-Enemy-Unknown is installed at. The "-x" flag says "use this directory path for attempting to run this program" and the "-c" flag tells what config file to use. So, for example, if your XCom game was installed at F:\Games\Steam Library\common\XCom-Enemy-Unknown\ then you would type in: XComEUModHelper -x "F:\Games\Steam Library\common\XCom-Enemy-Unknown\" -c "Config.xml" After typing this in, you will get a list of echo'ed commands, telling you what was modified. And just an FYI, some of these steps might be wrong, I am at work and I don't remember off the top of my head the "exact" steps I took.
-
Well, my initial run "seems" like it works. Thanks for the help, johnnylump.