Jump to content

Daemonjax

Supporter
  • Posts

    267
  • Joined

  • Last visited

Everything posted by Daemonjax

  1. You can do that, but I'm not sure you'd want to. What I'm really saying is that you can have getdistance target the player. Since player is a unique reference, you won't run into the problem where it grabs the first reference of your non-unique object. "At first GetDistance looked promising, but it only looks for the first reference used, rather than the one in the current cell." You were on the right track, it just sounds like you were trying to do something like this: Player->GetDistance "<object_ID>" ... is bad if your object is non-unique, as you found out. GetDistance, Player ... is good if your object is non-unique, but requires being run from a local script on the object or from a global script targeting the object (started from either a local script or dialogue result). If you're a using targeted global script, then you'll need to be aware of their limitations (especially to prevent CTDs). Without knowing the full details of what you're trying to do, it's hard to say much more. Also... GetDistance Limitations from Morrowind Scripting for Dummies 9.0: • GetDistance requires that the object given as parameter is placed in the gameworld (inthe editor) and has references persist checked (or is naturally persistent such as anNPC).• Note that you should use this function only with unique ID's or in environments whereyou exactly know that there is only one instance of the ID – otherwise the Gameengine will just grab the first instance of the ID it finds and report that distance – mostlikely not the distance to the object you want. Thus, a script that warns the player ofthe presence of a slaughterfish that is closer than 800 units would have to be attachedto the ID of the slaughterfish, and check the distance to "player" (which is unique), notvice versa.• If you determine distance to an object you are moving with Move or MoveWorld,GetDistance will still report the distance to the original location of the object (theone you set in the editor). Use GetPos and good ol' Pythagoras (c2 = a2 + b2) todetermine distances in these instances.• GetDistance won't work on disabled objects.
  2. I use an FXAA shader in mge xe without regular AA and it looks fine. The only way to absolutely remove all shimmering in any game is to use SSAA. That's it. A lot of it can come from using compressed normal/bump maps, or normal/bump maps that are too extreme/bumpy. Mipmaps (specifically the lack of them) has nothing to do with it -- any 3D game engine will create them on the fly if they're not included in the texture file... they'll actually look blurrier than usual, further reducing shimmering. Pre-generated mipmaps can cause shimmering if bad settings/techniques (over-sharpening, bad gamma correction, etc.) are used when creating them, but I've never seen that actually happen by accident. A moire pattern effect is far more likely (fences). Try not to notice. Otherwise, you can do things to hide it, like use an always-on DOF distance/fog based blur shader (probably why that ENB you mentioned helped). EDIT: I just remembered that MGE has a mipmap bias setting, and that MGSO (hilariously) sets it to -1.0 by default -- that would cause shimmering.
  3. There's no good way to do it without using mwse. Well... on second thought... If the reference in question is non-unique, that's fine... you can have a targetted global script use the getdistance function with the player as the target (because the player IS unique)... if it returns a very large number (like greater than 10000) , then you know it's not in the current cell. int curDist set curDist to ( GetDistance, Player ) if ( curDist < 10000 ) ;PC is effectively in same cell endif Unless you have some other reason for using a targeted global script, I would try to do it all with just a local script, though... they only run when the player is in the same cell, so that may be good enough in and of itself. Alternatively, if you need to know when the player leaves the cell the object is in, then you'll need to use a targeted global script (which can stop itself shortly afterwards). If you end up needing to directly compare an arbitrary number of cell names or do anything much fancier than the above, then you're going to end up using mwse functions (xPCCellID, and possibly xStringcompare). Some MWSE function are buggy, some aren't... these aren't.
  4. I would just... acquire... the goty edition from... that site that starts with a T and ends in a B... there's a P in there somewhere, too.
  5. Liztail's animation kit 2.1 works great for pulling apart the monolithic .kf files, doing whatever it is you want to do to them, and then merge them all back together into a new monolithic file. What doesn't seem to work properly is using the feature that lets you use the animation kit GUI to create/run multiple layers of animation folders that work together. But whatever... just having the split and merge command line tools is good enough.
  6. Heh. Supposedly, the USAF tested pilots for required times for identifying aircraft... they were able to do it from an image flashed for just 1/225th of a second. And that's time required for actual identification... not to notice that 'something' was there or not. I can't find a reliable source on that info, though, but it's interesting nonetheless. I wouldn't get anything above a 60hz lcd panel for just morrowind, though. And I'd get a gsync or freesync lcd panel, if anything. Your money is probably better spent on other things, even if just a bigger standard lcd panel (like 32")... but a 24" is pretty much the sweet spot for gaming @ 1920x1080. Personally, I'd prefer a 22" @ 1680x1050 (mine died) but those are like impossible to find these days.
  7. What's the best way to go about increasing spear and/or all thrust damage while underwater? I imagine decreasing slash/chop would work the same way. Would I need to use mwse / mwe? Can either accomplish that? Because... it would be cool. Just think about it. :D Would a script need to be added to all weapons? Just spears? That would suck, and I'd want to avoid doing that. I'd prefer to have a script (or something) fire which increases/decreases the relevant weapon/damage types when in/under water, and it cancels itself when not... event based... is that possible by any means? EDIT: I'm thinking I'd have to use GetWaterLevel and check the player's position to see if they're under water.
  8. Er... that looks fantastic :thumbsup: Sadly, no constructive criticism here I think: 1) the foam should be slightly whiter during the day, but I had to think about how best to do it while preserving the perceived lumen value of the existing color -- so whiter but not any brighter (there's a difference). I've made a decision, and will update this post once the change is implemented. I'm happy enough with how foam looks at night and I think that's in part due to it being whiter (the color is based entirely on SunCol at night, which is a very pale color by default at night), so it better maintains the illusion of being foam? Not sure. I don't want to just ditch SkyCol from the day color calculation, though... that would feel artificial. 2) when water tinting is enabled, water color should be whiter, brighter, and possibly more reflective (just to grab more grey from the sky) in the foggy weather climate to maintain the illusion of fog rising off the water. I purposefully didn't include sky color in the water tint color calculation because SkyCol is not exposed in mge xe for custom shaders (specifically the one for underwater effects). I'm working on an underwater shader that will match the water tint the user chose in water.fx as accurately as possible. That would be impossible if SkyCol was used in above-ground calculation, but I may be able to work something in under these circumstances. It's harder than I thought it would be due to engine limitations (namely I have to work with an original image that looks terrible underwater -- I can only polish a turd so much). What I have done so far for the underwater shader looks photo-realistic under certain conditions, but not good at all in others. 3) The optional sewer waves should look more like the ripple effects created by player movement through water, because right now it doesn't look good enough to actually use (imo). My hope is that someone takes this code an improves on it, or at the very least finds better settings via defined values, because (and I'm not ashamed to say it) I'm nearing the limit of my capability. UPDATE: Addressed point #1 with the following defines: #define USE_FOAM_DYNAMIC_BRIGHTNESS_WHITER // (optional) makes foam whiter during the day, without significantly changing brightness. #define FOAM_DYNAMIC_BRIGHTNESS_WHITER_MUL 0.33 // [0.1, 1.0] at 1.00, foam will be 100% white during the day (but will otherwise retain the same brightness level).
  9. Do yourself a favor and get AOMEI backup, and do incremental backups before/after installing mods/textures/meshes. Save yourself time and headaches.
  10. Youtube video: https://youtu.be/Ai_FmTyQnGc Thoughts?
  11. Building on what phal created, I added some options and tweaks. Screenshot comparison: ENBPalette off: ENBPalette (weighted color lum: off, curve: off -- phal's stock shader): ENBPalette (weighted color lum: ON, curve: ON -- using a curve that's pretty close to being linear): 0.8x^{1.2} + 0.2sqrt{x} ENBPalette (weighted color lum: ON, curve: ON -- using a more pronounced curve): 0.8x^{2} + 0.2sqrt{x} ENBPalette (weighted color lum: ON, curve: ON -- using a slightly different curve): 0.6x^{2} + 0.4sqrt{x} The curve is configurable, and the shader has the following defined values: //#define USE_ENB_PALELETTE_STRENGTH 0.75 // (optional) [0, 1.0] ; decreases strength of the palette shift. 1.0 would be full strength, while 0 would effectively disable this shader. #define ENB_PALETTE_MINIMUM_CONTRAST 0.10 //[.05, .15] This intentionally has very little effect when USE_CURVE is enabled #define RED_WEIGHT 0.2126 // 1.0/3.0 or 0.299 or 0.2126 are sane values (as long as the sum of the three channels equal 1.0) #define GREEN_WEIGHT 0.7152 // 1.0/3.0 or 0.587 or 0.7152 are sane values (as long as the sum of the three channels equal 1.0) #define BLUE_WEIGHT 0.0722 // 1.0/3.0 or 0.114 or 0.0722 are sane values (as long as the sum of the three channels equal 1.0) #define USE_CURVE // default is enabled #define CURVE_DARK_CONTRAST 0.20 // higher values darken the image and reduce contrast #define CURVE_LIGHT_POWER 2 // [1.2, 5] -- higher values increase the contrast of mid and bright tones (you may need to reduce the strength of your bloom shader) It may be hard to see in these screenshots, but even using a weak curve gives more contrast to the scene, which was my intended goal. You can make it lighter or darker while still increasing or at least maintaining contrast (especially in dark areas). Download link: https://dl.dropboxusercontent.com/u/32777109/Mods/Morrowind/shaders/enbpalette.zip Note: I've included my enbpalette.tga in the zip. It's a modified version of the one I found included with the original shader code, but it had some noise in it which wasn't good. I really liked it, otherwise. I recommend... for interiors: #define CURVE_DARK_CONTRAST 0.20 #define CURVE_LIGHT_POWER 2 for exteriors: #define CURVE_DARK_CONTRAST 0.10 #define CURVE_LIGHT_POWER 1.2 ... But this all depends on your particular palette. Technically, all of this can be done by altering your palette file -- but that's not really practical. You'll still probably need to lower the strength of your bloom shader (if using one). I also recommend https://www.desmos.com/calculator if you want to see what the curves look like (you're only interested in the 0 to 1 range of x). EDIT: Looks like I forgot to actually unclude the palette,tga file in the above zip. Fixed. EDIT2: I should probably add an option to exclude or reduce the strength of the effect on your hands in 1st person. Thoughts? EDIT3: So, I see all my dropbox links are broken. Here's a share link to my morrowind stuff: https://www.dropbox.com/sh/n5e9lobjgj0n8so/AADdZO-DSUc-LHbYxd_8UNSxa?dl=0
  12. Cool. I was going to make an account an post this over there, but: I noticed every single thread I was interested in reading and responding to was locked by moderators... which kinda turns me off. EDIT: Just tried to create an account to post in the thread you linked, but I can't figure out how to get past the zenimax privacy agreement. EDIT2: Ok, I can magically get to the account creation screen but it says my account already exists, and when I try to reset the password for it I get the "oops something went wrong screen". I give up on those forums. Anyways, I made a few changes to the shader throughout the day without realizing anyone took notice... still the same download link... gotta love dropbox.
  13. Ok, so I solved the last problem I needed to solve (reduction of specular highlights on foam as shown in this screenshot): Just going to do a code cleanup then post the download links. EDIT: Download link: https://dl.dropboxusercontent.com/u/32777109/Mods/Morrowind/shaders/XE%20Water.fx I should probably make a video. EDIT2: Youtube video link: https://youtu.be/Ai_FmTyQnGc
  14. Featuring shoreline foam based on Abot's work (but heavily modified) among other user configurable options. It's not done yet, but I'm making progress. I should be mostly done like tomorrow or something, and I'll see about making it available for download somewhere: EDIT: Updated dropbox link since I noticed they all broke over the years: https://www.dropbox.com/sh/n5e9lobjgj0n8so/AADdZO-DSUc-LHbYxd_8UNSxa?dl=0
  15. In response to post #23745064. Yes... Unless, you want claw hands... but, you don't, of course. 2.2 was released many years ago, although it's still the latest official version. The meshes are from, like, 2005. EDIT: There's a slightly updated unofficial version (2.4) put together by zw olol... that includes liztail's fixes: http://www.nexusmods.com/morrowind/mods/42395/? But... it also makes other changes which which are less desirable... see discussion: http://www.gamesas.com/better-morrowind-replacers-t327619.html EDIT2: There's another russian unofficial version (3.0) here: http://tesall.ru/files/file/1632-better-bodies/ It seems to be a continuation of the other unofficial version. If I were going to experiment, it would be with that one. It's interesting, anyways. Those russians seem to have their own vibrant modding scene for TES games.
  16. That's awesome! Exactly what I needed. I doubt that I would have figured it out eventually... I couldn't find upkutils examples of the above, so thanks again. Small addition so it hits the checkpoint record as well: UPK_FILE=XComStrategyGame.upk EXPORT_ENTRY=XGStrategyAI.m_arrUFOsShotDown.m_arrUFOsShotDown OBJIDX=Core.FloatProperty // Type EXPORT_ENTRY=XGStrategyAI.CheckpointRecord.m_arrUFOsShotDown.m_arrUFOsShotDown OBJIDX=Core.FloatProperty // Type Applied and looks good in UE Explorer: struct CheckpointRecord { var bool m_bFirstMission; var array<XGShip_UFO> m_arrUFOs; var array<float> m_arrUFOsShotDown; ... } var array<float> m_arrUFOsShotDown;
  17. m_arrUFOsShotDown isn't used in many places. I can make better use of it if it were an array of floats... but I can work around it if it's not possible or too difficult... Not having an array of floats to work with would just be a handicap of sorts.
  18. Is it possible to change the declaration of a class variable from an array of ints to an array of floats? Particularly XGStrategyAI.m_arrUFOsShotDown (which is currently an array of ints).
  19. XCOM Strategic Alien AI Rework The current AI operates mostly randomly, with some scripted elements thrown in mainly for plot advancement. At no time does the AI even attempt to implement any kind of strategy try to win at the Strategic level. There's no decision-making involved, except to make things even easier for the player on lower difficulty levels. That doesn't even qualify as an AI. How many times would you want to play a chess game against another player that makes mostly random moves, except to actively set you up with an uneven trade that almost always works in your favor? This mod aims to change that by implementing an AI that can make strategic decisions using Game Theory. The AI will try to win by generating missions (using limited resources) with the highest chance of success to: Generate panic to increase its resource pool for future operations. Disrupt XCOM plans (satellite coverage, continent bonuses, tactical preparedness) If the AI is doing poorly on the Strategic level, it will consider shifting resources to punish xcom on the tactical level, and vice versa. Decision selection will be based on finding Nash Equilibriums – Mixed Strategies using probabilities based on statistical analysis of information that the AI could reasonably know or infer (e.g. it knows you have a satellite over a country when you shoot down UFOs there, not by simply calling the function HasSatelliteCoverage()) and proper weighting for the expected utility of potential increased panic offset by potential lost resources. The following are ideas that may change and/or be expanded upon. Where possible, draw inspiration from the original 1994 game: I. Alien AI Goals A. Create Alien Base(s) The Alien Base is the Alien equivalent to XCOM's base. Some time after XCOM chooses its starting country, the Alien AI will also choose a country to place its alien base in. The Alien AI will also receive some kind of bonus based upon the country selected (just like XCOM does). Whenever selecting an Alien Base location, it will not choose a country that it knows has satellite coverage. New alien bases can (only?) be created when the old base is destroyed – the creation of a new Alien Base becomes a high priority. Some bonuses the AI receive can help directly within the Strategic or Tactical game, so the AI may delay the choice until near the end of the first month to make a better decision. The presence of an Alien base will generate a large amount of panic in that country each month, and that country will most likely drop out of the Council. The AI will aggressively search for and shoot down satellites over countries containing the alien base. B. Increase Panic The AI must know that it needs to generate X amount of panic to remove Y number of countries from the Council in order to attain victory.There are 16 counties, with panic ranging from 1 (16 min) to 5 (80 max). The AI doesn't need to generate the full 80 points to win, and it should know that as well.Whenever panic increases, the Alien AI gets additional points that it can spend on subsequent missions.When a country withdraws from the council, they receive additional points for that country every month (just like xcom does for satellite coverage).When they control each country in a continent they get another bonus (similar to what XCOM gets). I'm currently in the R&D stage, but I already have a fairly good idea of how to accomplish the above, and will be throwing up all my notes and code changes here. List of potential unused/Repurposeable variables and functions: XComGameStrategy.upk XGStrategyAI var array<int> m_arrUFOsShotDown: Dynamic array of size 8, which can be resized for additional data storage. var int m_iAlienMonth ....: Incremented in XGStrategyAI.EndOfMonth(), but I don't think it's actually used anywhere. var int m_iTerrorCounter: Used in XGStrategyAI.AIAddNewObjectives() only to ensure terror missions occur only every other month. function XComGame.XGGameData.ECountry ChooseOverseerTarget().........................: Used to purposefully have the AI make a bad decision. function array<XComGame.XGGameData.ECountry> DetermineBestOverseerTargets(): Used to purposefully have the AI make a bad decision. function bool IsGoodOverseerTarget(XComGame.XGGameData.ECountry eTarget)......: Used to purposefully have the AI make a bad decision. function array<int> DetermineBestHuntTargets().......................................................: Doesn't seem to be used anywhere. function int GetNumResistingContinents()..................................................................: Seems to only be used in DetermineBestHuntTargets() (which doesn't seem to be used anywhere). function bool IsGoodUFOMissionChoice(TUFO kUFO)..................................................: Used only to unintelligently restrict choice. Other notes: 1) This function seems to be the only one with tasty local variables suitable for making calculations: function NormalizeValues(out array<TAlienChance> arrPossibles) { local int iTotal, iChance; local float fFactor, fChance, fTotal; ... } 2) There's no array of floats to subvert anywhere (that I can find), so I may have to store float information in fractional form (pairs) using arrays of ints, or change an existing array of ints to be an array of floats (better). How hard would it be to change array<int> m_arrUFOsShotDown into a float array? Queston asked (and answered) here: http://forums.nexusmods.com/index.php?/topic/2551689-changing-class-variable-type/ Also, the struct TSatellite does contain an array of Vector2D, which contains two floats... so I could use that (XGHeadquarter's TSatellite[] m_arrSatellites accessible from XGStrategyAI via HQ().m_arrSatellites). I'm currently recreating the existing strategy-level AI (if you want to call it that) in Java (I'm really just interested in the logic of it, so it's not going to have a fancy GUI). Once that's done I'll be in a better place to implement and test new code... I'll throw it up on google code when it's done-ish.
  20. Flipping it to true did the trick for me. Nice find! Took me longer to figure out how to pan the camera than doing the edit. :wink: I'll throw the code edit up in patchergui format... DESCRIPTION=Enables freecam zoom for latest EW version as of today. Pan the camera by edgescrolling, and zoom using mousewheel. /* Changes bFreeCam = false to bFreeCam = true */ UPK_FILE=XComStrategyGame.upk Object=XComHeadquartersCamera.FreeMovementView.LookRelative [bEFORE_CODE] 14 2D 00 C8 21 00 00 28 [AFTER_CODE] 14 2D 00 C8 21 00 00 27 EDIT: LOL you're right! Zooming in on the antfarm already worked without the above code edit... I guess I just assumed it wasn't working, and didn't actually try until I saw you're post. Oops. :wink:
  21. I remember that it worked properly when the game was initially released... Also, the very first patch (IIRC) fixed zooming in on the antfarm with the mousewheel. Might be able to look at how the code worked in that version. Dunno where it is in the UPKs, though... or whether it was in the exe.
  22. Started playing this game after all these years (the mod unfriendliness of it just pissed me off, but it's a little better now) , and (of course) can't help but get back into modding it... I've implemented this: function ApplyHPStatPenalties(){ BB C9 00 00 51 60 00 00 00 00 00 00 A3 C9 00 00 00 00 00 00 00 00 00 00 A4 C9 00 00 00 00 00 00 EA 19 00 00 86 38 03 00 31 03 00 00 29 02 00 00 local float fPct; if(XComGameReplicationInfo(class'Engine'.static.GetCurrentWorldInfo().GRI).m_kGameCore.CharacterHasProperty(GetCharacter().m_kChar.iType, 3)) 07 B0 00 19 19 2E 54 32 00 00 19 12 20 35 FE FF FF 0A 00 92 F9 FF FF 00 1C D5 FB FF FF 16 09 00 50 F9 FF FF 00 01 50 F9 FF FF 09 00 46 32 00 00 00 01 46 32 00 00 3E 00 14 10 00 00 00 1B 27 12 00 00 00 00 00 00 35 56 0F 00 00 58 0F 00 00 00 00 19 1B E5 37 00 00 00 00 00 00 16 09 00 03 B8 00 00 00 01 03 B8 00 00 2C 03 16 { return; 04 0B } m_aCurrentStats[1] += m_iBWAimPenalty; A1 1A 26 01 63 3A 00 00 01 C6 C4 00 00 16 m_aCurrentStats[3] += m_iBWMobPenalty; A1 1A 2C 03 01 63 3A 00 00 01 C5 C4 00 00 16 fPct = float(1) - (float(GetUnitHP()) / float(GetUnitMaxHP())); 0F 00 A4 C9 00 00 AF 38 3F 26 AC 38 3F 1B 01 3C 00 00 00 00 00 00 16 38 3F 1B 04 3C 00 00 00 00 00 00 16 16 16 m_iBWAimPenalty = int(fPct * (float(m_aCurrentStats[1]) / float(2))); 0F 01 C6 C4 00 00 38 44 AB 00 A4 C9 00 00 AC 38 3F 1A 26 01 63 3A 00 00 38 3F 2C 02 16 16 m_iBWMobPenalty = int(fPct * (float(m_aCurrentStats[3]) / float(2))); 0F 01 C5 C4 00 00 38 44 AB 00 A4 C9 00 00 AC 38 3F 1A 2C 03 01 63 3A 00 00 38 3F 2C 02 16 16 m_aCurrentStats[1] -= m_iBWAimPenalty; A2 1A 26 01 63 3A 00 00 01 C6 C4 00 00 16 m_aCurrentStats[3] -= m_iBWMobPenalty; A2 1A 2C 03 01 63 3A 00 00 01 C5 C4 00 00 16 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 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 //return; 04 0B 53 00 00 00 02 00 02 00 78 04 00 00 00 00 00 00 } Frees up 331 bytes for something more complex... (Haha! Just found out that doesn't even matter anymore since function length can now be changed! Life just got easy! I spoke too soon -- there's still some benefits to keeping the function size original)... maybe to add hard max values to m_iBWAimPenalty and m_iBWMobPenalty (not required imo), or use a nonlinear function to determine the penalty (that may be a little anal, not sure). The above code caps the penalties to just under half the value of the unit's max aim and max mobility (m_aCurrentStats[x] / 2) when at 1 health, with no penalty at full health, and appropriate linear penalties for health values in between (of course). It's a simple matter of changing the 2's to a higher number to decrease the penalty if desired. Original code (latest EW as of this date): BB C9 00 00 51 60 00 00 00 00 00 00 A3 C9 00 00 00 00 00 00 00 00 00 00 A4 C9 00 00 00 00 00 00 EA 19 00 00 86 38 03 00 31 03 00 00 29 02 00 00 07 0F 00 1B 53 44 00 00 00 00 00 00 16 04 0B 07 B0 00 19 19 2E 54 32 00 00 19 12 20 35 FE FF FF 0A 00 92 F9 FF FF 00 1C D5 FB FF FF 16 09 00 50 F9 FF FF 00 01 50 F9 FF FF 09 00 46 32 00 00 00 01 46 32 00 00 3E 00 14 10 00 00 00 1B 27 12 00 00 00 00 00 00 35 56 0F 00 00 58 0F 00 00 00 00 19 1B E5 37 00 00 00 00 00 00 16 09 00 03 B8 00 00 00 01 03 B8 00 00 2C 03 16 04 0B A1 1A 26 01 63 3A 00 00 8F 01 C6 C4 00 00 16 16 A1 1A 2C 03 01 63 3A 00 00 8F 01 C5 C4 00 00 16 16 0F 00 A4 C9 00 00 AC 38 3F 1B 01 3C 00 00 00 00 00 00 16 38 3F 1B 04 3C 00 00 00 00 00 00 16 16 07 2F 01 B3 00 A4 C9 00 00 38 3F 26 16 0F 01 C6 C4 00 00 25 0F 01 C5 C4 00 00 25 06 01 03 07 1F 02 B3 00 A4 C9 00 00 1E 00 00 00 3F 16 0F 01 C6 C4 00 00 19 19 2E 54 32 00 00 19 12 20 35 FE FF FF 0A 00 92 F9 FF FF 00 1C D5 FB FF FF 16 09 00 50 F9 FF FF 00 01 50 F9 FF FF 09 00 46 32 00 00 00 01 46 32 00 00 05 00 46 32 00 00 00 1D F1 FF FF FF 0F 01 C5 C4 00 00 19 19 2E 54 32 00 00 19 12 20 35 FE FF FF 0A 00 92 F9 FF FF 00 1C D5 FB FF FF 16 09 00 50 F9 FF FF 00 01 50 F9 FF FF 09 00 46 32 00 00 00 01 46 32 00 00 05 00 46 32 00 00 00 1D FE FF FF FF 06 01 03 0F 01 C6 C4 00 00 90 19 19 2E 54 32 00 00 19 12 20 35 FE FF FF 0A 00 92 F9 FF FF 00 1C D5 FB FF FF 16 09 00 50 F9 FF FF 00 01 50 F9 FF FF 09 00 46 32 00 00 00 01 46 32 00 00 05 00 46 32 00 00 00 1D F1 FF FF FF 2C 02 16 0F 01 C5 C4 00 00 90 19 19 2E 54 32 00 00 19 12 20 35 FE FF FF 0A 00 92 F9 FF FF 00 1C D5 FB FF FF 16 09 00 50 F9 FF FF 00 01 50 F9 FF FF 09 00 46 32 00 00 00 01 46 32 00 00 05 00 46 32 00 00 00 1D FE FF FF FF 2C 02 16 A1 1A 26 01 63 3A 00 00 01 C6 C4 00 00 16 A1 1A 2C 03 01 63 3A 00 00 01 C5 C4 00 00 16 04 0B 53 00 00 00 02 00 02 00 78 04 00 00 00 00 00 00Modifed code (with updated jump): BB C9 00 00 51 60 00 00 00 00 00 00 A3 C9 00 00 00 00 00 00 00 00 00 00 A4 C9 00 00 00 00 00 00 EA 19 00 00 86 38 03 00 99 02 00 00 29 02 00 00 07 A1 00 19 19 2E 54 32 00 00 19 12 20 35 FE FF FF 0A 00 92 F9 FF FF 00 1C D5 FB FF FF 16 09 00 50 F9 FF FF 00 01 50 F9 FF FF 09 00 46 32 00 00 00 01 46 32 00 00 3E 00 14 10 00 00 00 1B 27 12 00 00 00 00 00 00 35 56 0F 00 00 58 0F 00 00 00 00 19 1B E5 37 00 00 00 00 00 00 16 09 00 03 B8 00 00 00 01 03 B8 00 00 2C 03 16 04 0B A1 1A 26 01 63 3A 00 00 01 C6 C4 00 00 16 A1 1A 2C 03 01 63 3A 00 00 01 C5 C4 00 00 16 0F 00 A4 C9 00 00 AF 38 3F 26 AC 38 3F 1B 01 3C 00 00 00 00 00 00 16 38 3F 1B 04 3C 00 00 00 00 00 00 16 16 16 0F 01 C6 C4 00 00 38 44 AB 00 A4 C9 00 00 AC 38 3F 1A 26 01 63 3A 00 00 38 3F 2C 02 16 16 0F 01 C5 C4 00 00 38 44 AB 00 A4 C9 00 00 AC 38 3F 1A 2C 03 01 63 3A 00 00 38 3F 2C 02 16 16 A2 1A 26 01 63 3A 00 00 01 C6 C4 00 00 16 A2 1A 2C 03 01 63 3A 00 00 01 C5 C4 00 00 16 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 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 04 0B 53 00 00 00 02 00 02 00 78 04 00 00 00 00 00 00P.S. you guys have it easy now compared to back in the day. :wink: EDIT1: Small typo fixed and tested/verified. As a side note, Using positive numbers for the penalty variables fixes the aiming info display for the fatigue penalty for me (before this code modification it was displaying as a bonus, rather than a penalty) -- that may have been caused by someone else's mod I have installed, dunno... either way it was just a display error. I found this code which was the cause of the display error for me (fixed by the above modifcation using positive values for m_iBWAimPenalty): if(m_kUnit.m_iBWAimPenalty != 0) { kInfo.arrHitPenaltyStrings.AddItem(PERKS().m_strPenaltyTitle[106]); kInfo.arrHitPenaltyValues.AddItem(-m_kUnit.m_iBWAimPenalty); }EDIT2: Both before and after the above modification, for me at least, Red Fog's penalty to mobility doesn't actually result in any reduced movement. I suspect my problem lies in GetMaxPathLength(). EDIT3: Testing confirms that (in my game at least) that m_aCurrentStats[3] always has a value of 0 (well, not always... just when it matters). Furthermore, nothing in GetMaxPathLength() even checks what value is in m_aCurrentStats[3]. I checked all my mods, and I don't believe I have anything running that makes any changes which would affect Red Fog... but I'm going to uninstall all of them and see if the issue persists in a pure vanilla state. EDIT4: Re-verified cache integrity of the game via Steam, and confirmed the problems (Battle Fatigue showing as a bonus rather than a penalty on the aiming info card), and that Red Fog doesn't actually affect mobility are both issues present in a vanilla game (EW w/latest patch). Getting mobility penalties to work will require additional upk edits -- GetMaxPathLength() needs to return the movement distance with the penalty applied. EDIT5: So, I went ahead and fixed the issue... Red Fog's mobility penalty now works as expected in vanilla EW... tested and verified (albeit briefly). Here's the code changes: function ApplyHPStatPenalties() { local float fPct; if(XComGameReplicationInfo(class'Engine'.static.GetCurrentWorldInfo().GRI).m_kGameCore.CharacterHasProperty(GetCharacter().m_kChar.iType, 3)) { return; } m_aCurrentStats[1] += m_iBWAimPenalty; fPct = float(1) - (float(GetUnitHP()) / float(GetUnitMaxHP())); m_iBWAimPenalty = int(fPct * (float(m_aCurrentStats[1]) / float(2))); m_iBWMobPenalty = 0; m_iBWMobPenalty = int(fPct * (float(GetMaxPathLength()) / float(2))); m_aCurrentStats[1] -= m_iBWAimPenalty; //return; }Notice I don't touch m_aCurrentStats[3] since it does not have the desired effect; Original hex code can be found at the top of the post... here's the modifed hex code: BB C9 00 00 51 60 00 00 00 00 00 00 A3 C9 00 00 00 00 00 00 00 00 00 00 A4 C9 00 00 00 00 00 00 EA 19 00 00 86 38 03 00 89 02 00 00 29 02 00 00 07 A1 00 19 19 2E 54 32 00 00 19 12 20 35 FE FF FF 0A 00 92 F9 FF FF 00 1C D5 FB FF FF 16 09 00 50 F9 FF FF 00 01 50 F9 FF FF 09 00 46 32 00 00 00 01 46 32 00 00 3E 00 14 10 00 00 00 1B 27 12 00 00 00 00 00 00 35 56 0F 00 00 58 0F 00 00 00 00 19 1B E5 37 00 00 00 00 00 00 16 09 00 03 B8 00 00 00 01 03 B8 00 00 2C 03 16 04 0B A1 1A 26 01 63 3A 00 00 01 C6 C4 00 00 16 0F 00 A4 C9 00 00 AF 38 3F 26 AC 38 3F 1B 01 3C 00 00 00 00 00 00 16 38 3F 1B 04 3C 00 00 00 00 00 00 16 16 16 0F 01 C6 C4 00 00 38 44 AB 00 A4 C9 00 00 AC 38 3F 1A 26 01 63 3A 00 00 38 3F 2C 02 16 16 0F 01 C5 C4 00 00 25 0F 01 C5 C4 00 00 38 44 AB 00 A4 C9 00 00 AC 38 3F 1B CB 39 00 00 00 00 00 00 4A 16 38 3F 2C 02 16 16 A2 1A 26 01 63 3A 00 00 01 C6 C4 00 00 16 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 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 04 0B 53 00 00 00 02 00 02 00 78 04 00 00 00 00 00 00And... simulated event int GetMaxPathLength(optional bool bIgnorePoison) { local int iMaxMobility; bIgnorePoison = false; iMaxMobility = (m_kCharacter.GetCharMaxPathLength() + m_aInventoryStats[3]) - XGUnit(self).m_iBWMobPenalty; if((GetAppliedAbility(31)) != none) { iMaxMobility += 4; } if(IsAffectedByAbility(72)) { iMaxMobility += 4; } if(IsAffectedByAbility(74)) { iMaxMobility += 2; } if(GetCharacter().HasUpgrade(122)) { if((IsATank()) || IsAugmented()) { iMaxMobility += 3; } } if((IsAugmented()) && GetInventory().HasItemOfType(22)) { iMaxMobility += 4; } if(IsAffectedByAbility(57)) { iMaxMobility *= 0.50; } if(!bIgnorePoison && IsPoisoned()) { iMaxMobility *= 0.75000380; } if(IsAffectedByAbility(15)) { iMaxMobility *= 0.50; } if(m_bWasJustStrangling && m_kCharacter.m_kChar.iType != 23) { iMaxMobility *= 0.250; } iMaxMobility = Max(iMaxMobility, 2); return iMaxMobility; //return ReturnValue; } Notice the mobility penalty applied at iMaxMobility = (m_kCharacter.GetCharMaxPathLength() + m_aInventoryStats[3]) - XGUnit(self).m_iBWMobPenalty; Original hex: EB 38 00 00 51 60 00 00 00 00 00 00 E2 38 00 00 00 00 00 00 00 00 00 00 E5 38 00 00 00 00 00 00 BB 09 00 00 D5 91 01 00 A5 04 00 00 4D 03 00 00 49 02 00 28 15 0F 00 E3 38 00 00 92 19 01 60 3A 00 00 0A 00 1D B8 00 00 00 1B F0 37 00 00 00 00 00 00 16 1A 2C 03 01 62 3A 00 00 16 07 B9 00 77 1B 86 37 00 00 00 00 00 00 2C 1F 16 2A 16 A1 00 E3 38 00 00 19 19 2E 54 32 00 00 19 12 20 35 FE FF FF 0A 00 92 F9 FF FF 00 1C D5 FB FF FF 16 09 00 50 F9 FF FF 00 01 50 F9 FF FF 09 00 46 32 00 00 00 01 46 32 00 00 02 00 46 32 00 00 00 2C 04 16 07 33 01 1B 4E 44 00 00 00 00 00 00 2C 48 16 A1 00 E3 38 00 00 19 19 2E 54 32 00 00 19 12 20 35 FE FF FF 0A 00 92 F9 FF FF 00 1C D5 FB FF FF 16 09 00 50 F9 FF FF 00 01 50 F9 FF FF 09 00 46 32 00 00 00 01 46 32 00 00 02 00 46 32 00 00 00 2C 04 16 07 AD 01 1B 4E 44 00 00 00 00 00 00 2C 4A 16 A1 00 E3 38 00 00 19 19 2E 54 32 00 00 19 12 20 35 FE FF FF 0A 00 92 F9 FF FF 00 1C D5 FB FF FF 16 09 00 50 F9 FF FF 00 01 50 F9 FF FF 09 00 46 32 00 00 00 01 46 32 00 00 02 00 46 32 00 00 00 2C 02 16 07 59 02 19 1B E5 37 00 00 00 00 00 00 16 0C 00 2F B8 00 00 00 1B B7 3D 00 00 00 00 00 00 2C 7A 16 07 59 02 84 1B 68 44 00 00 00 00 00 00 16 18 0B 00 1B 70 44 00 00 00 00 00 00 16 16 A1 00 E3 38 00 00 19 19 2E 54 32 00 00 19 12 20 35 FE FF FF 0A 00 92 F9 FF FF 00 1C D5 FB FF FF 16 09 00 50 F9 FF FF 00 01 50 F9 FF FF 09 00 46 32 00 00 00 01 46 32 00 00 02 00 46 32 00 00 00 2C 03 16 07 F8 02 82 1B 70 44 00 00 00 00 00 00 16 18 23 00 19 1B 56 39 00 00 00 00 00 00 16 0C 00 C8 BB 00 00 00 1B 75 3D 00 00 00 00 00 00 24 16 16 16 A1 00 E3 38 00 00 19 19 2E 54 32 00 00 19 12 20 35 FE FF FF 0A 00 92 F9 FF FF 00 1C D5 FB FF FF 16 09 00 50 F9 FF FF 00 01 50 F9 FF FF 09 00 46 32 00 00 00 01 46 32 00 00 02 00 46 32 00 00 00 2C 04 16 07 8C 03 1B 4E 44 00 00 00 00 00 00 2C 39 16 9F 00 E3 38 00 00 19 19 2E 54 32 00 00 19 12 20 35 FE FF FF 0A 00 92 F9 FF FF 00 1C D5 FB FF FF 16 09 00 50 F9 FF FF 00 01 50 F9 FF FF 09 00 46 32 00 00 00 01 46 32 00 00 05 00 46 32 00 00 00 1E 00 00 00 3F 16 0F 00 E3 38 00 00 FA 00 E3 38 00 00 2C 02 16 07 D8 03 82 81 2D 00 E5 38 00 00 16 18 0B 00 1B DC 45 00 00 00 00 00 00 16 16 9F 00 E3 38 00 00 AF 1E 00 00 80 3F 1E 00 00 80 3E 16 16 0F 00 E3 38 00 00 FA 00 E3 38 00 00 2C 02 16 07 15 04 1B 4E 44 00 00 00 00 00 00 2C 0F 16 9F 00 E3 38 00 00 AF 1E 00 00 80 3F 1E 00 00 00 3F 16 16 0F 00 E3 38 00 00 FA 00 E3 38 00 00 2C 02 16 07 90 04 82 2D 01 4A 3A 00 00 18 36 00 9B 35 56 0F 00 00 58 0F 00 00 00 00 19 01 60 3A 00 00 09 00 03 B8 00 00 00 01 03 B8 00 00 2C 17 16 16 9F 00 E3 38 00 00 AC AF 1E 00 00 C8 42 38 3F 2C 4B 16 1E 00 00 C8 42 16 16 0F 00 E3 38 00 00 FA 00 E3 38 00 00 2C 02 16 04 00 E3 38 00 00 04 3A E4 38 00 00 53 00 00 00 02 49 02 00 CB 39 00 00 00 00 00 00Modified hex: EB 38 00 00 51 60 00 00 00 00 00 00 E2 38 00 00 00 00 00 00 00 00 00 00 E5 38 00 00 00 00 00 00 BB 09 00 00 D5 91 01 00 C1 03 00 00 4D 03 00 00 49 02 00 28 15 0F 00 E3 38 00 00 93 92 19 01 60 3A 00 00 0A 00 1D B8 00 00 00 1B F0 37 00 00 00 00 00 00 16 1A 2C 03 01 62 3A 00 00 16 19 2E 3F CE 00 00 17 09 00 C5 C4 00 00 00 01 C5 C4 00 00 16 07 7C 00 77 1B 86 37 00 00 00 00 00 00 2C 1F 16 2A 16 A1 00 E3 38 00 00 2C 04 16 07 98 00 1B 4E 44 00 00 00 00 00 00 2C 48 16 A1 00 E3 38 00 00 2C 04 16 07 B4 00 1B 4E 44 00 00 00 00 00 00 2C 4A 16 A1 00 E3 38 00 00 2C 02 16 07 02 01 19 1B E5 37 00 00 00 00 00 00 16 0C 00 2F B8 00 00 00 1B B7 3D 00 00 00 00 00 00 2C 7A 16 07 02 01 84 1B 68 44 00 00 00 00 00 00 16 18 0B 00 1B 70 44 00 00 00 00 00 00 16 16 A1 00 E3 38 00 00 2C 03 16 07 43 01 82 1B 70 44 00 00 00 00 00 00 16 18 23 00 19 1B 56 39 00 00 00 00 00 00 16 0C 00 C8 BB 00 00 00 1B 75 3D 00 00 00 00 00 00 24 16 16 16 A1 00 E3 38 00 00 2C 04 16 07 62 01 1B 4E 44 00 00 00 00 00 00 2C 39 16 9F 00 E3 38 00 00 1E 00 00 00 3F 16 07 90 01 82 81 2D 00 E5 38 00 00 16 18 0B 00 1B DC 45 00 00 00 00 00 00 16 16 9F 00 E3 38 00 00 1E 3F 00 40 3F 16 07 AF 01 1B 4E 44 00 00 00 00 00 00 2C 0F 16 9F 00 E3 38 00 00 1E 00 00 00 3F 16 07 06 02 82 2D 01 4A 3A 00 00 18 36 00 9B 35 56 0F 00 00 58 0F 00 00 00 00 19 01 60 3A 00 00 09 00 03 B8 00 00 00 01 03 B8 00 00 2C 17 16 16 9F 00 E3 38 00 00 1E 00 00 80 3E 16 0F 00 E3 38 00 00 FA 00 E3 38 00 00 2C 02 16 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 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 04 00 E3 38 00 00 04 3A E4 38 00 00 53 00 00 00 02 49 02 00 CB 39 00 00 00 00 00 00I don't know if/how any of the above applies to the Long War mod since I don't use it. EDIT6: I liked Drakous79's idea to add a "(Fatigued)" string after aliens' names... and since Wghost81's "Display Soldier XP, PsiXP and Mobility in Barracks and in Battle" mod also modifies that same function (UpdateHeader), I've combined the changes here... with 21 bytes to spare, but there's some more that can be freed up with additional code optimizations: modified code: 13 2E 00 00 51 60 00 00 00 00 00 00 0E 2E 00 00 00 00 00 00 00 00 00 00 13 2E 00 00 00 00 00 00 9A 00 00 00 F8 15 00 00 D3 09 00 00 37 07 00 00 0F 00 12 2E 00 00 19 01 F2 2D 00 00 0A 00 D0 C9 00 00 00 1B E5 37 00 00 00 00 00 00 16 07 7B 08 84 19 01 F2 2D 00 00 0A 00 EC 37 00 00 00 1B 25 45 00 00 00 00 00 00 16 18 20 00 19 01 F2 2D 00 00 0A 00 EE 37 00 00 00 1B 12 46 00 00 00 00 00 00 16 16 07 61 01 9A 35 56 0F 00 00 58 0F 00 00 00 00 19 00 12 2E 00 00 09 00 03 B8 00 00 00 01 03 B8 00 00 26 16 07 1C 01 7B 19 01 F2 2D 00 00 0A 00 02 38 00 00 00 1B BE 6A 00 00 00 00 00 00 16 1F 00 16 1B 5F 06 00 00 00 00 00 00 19 01 F2 2D 00 00 0A 00 02 38 00 00 00 1B BE 6A 00 00 00 00 00 00 16 19 01 F2 2D 00 00 0A 00 08 38 00 00 00 1B C1 6A 00 00 00 00 00 00 16 1F 00 1F 00 28 16 06 53 01 1B 5F 06 00 00 00 00 00 00 19 01 F2 2D 00 00 0A 00 00 38 00 00 00 1B C0 6A 00 00 00 00 00 00 16 01 F7 2D 00 00 1F 00 1F 00 28 16 1B 6F 06 00 00 00 00 00 00 28 16 06 93 07 0F 00 13 2E 00 00 2E 0F B9 00 00 00 12 2E 00 00 07 D7 01 19 01 F2 2D 00 00 0A 00 E7 38 00 00 00 1B 68 44 00 00 00 00 00 00 16 0F 00 0F 2E 00 00 19 01 F2 2D 00 00 0A 00 C8 C9 00 00 00 1B 66 3B 00 00 00 00 00 00 16 14 2D 00 10 2E 00 00 27 06 1E 02 0F 00 0F 2E 00 00 35 94 0F 00 00 99 0F 00 00 00 00 19 00 13 2E 00 00 09 00 D4 B8 00 00 00 01 D4 B8 00 00 14 2D 00 10 2E 00 00 28 07 61 05 35 4E 0F 00 00 58 0F 00 00 00 00 19 00 13 2E 00 00 09 00 03 B8 00 00 00 01 03 B8 00 00 1B 5F 06 00 00 00 00 00 00 19 01 F2 2D 00 00 0A 00 02 38 00 00 00 1B BE 6A 00 00 00 00 00 00 16 70 70 70 70 70 1F 58 50 3A 20 00 38 53 19 00 13 2E 00 00 0A 00 0B B9 00 00 00 1B 57 3C 00 00 00 00 00 00 16 16 1F 2F 00 16 38 53 19 19 2E 54 32 00 00 19 12 20 35 FE FF FF 0A 00 92 F9 FF FF 00 1C D5 FB FF FF 16 09 00 50 F9 FF FF 00 01 50 F9 FF FF 09 00 46 32 00 00 00 01 46 32 00 00 3E 00 F3 85 00 00 00 1B 58 3C 00 00 00 00 00 00 92 35 94 0F 00 00 99 0F 00 00 00 00 19 00 13 2E 00 00 09 00 D4 B8 00 00 00 01 D4 B8 00 00 26 16 16 16 1F 20 20 20 00 16 70 70 70 70 70 1F 50 73 69 58 50 3A 20 00 38 53 19 00 13 2E 00 00 0A 00 05 B9 00 00 00 1B 0A 3B 00 00 00 00 00 00 16 16 1F 2F 00 16 38 53 19 19 2E 54 32 00 00 19 12 20 35 FE FF FF 0A 00 92 F9 FF FF 00 1C D5 FB FF FF 16 09 00 50 F9 FF FF 00 01 50 F9 FF FF 09 00 46 32 00 00 00 01 46 32 00 00 3E 00 F6 85 00 00 00 1B 0B 3B 00 00 00 00 00 00 92 35 93 0F 00 00 99 0F 00 00 00 00 19 00 13 2E 00 00 09 00 D4 B8 00 00 00 01 D4 B8 00 00 26 16 16 16 1F 20 20 20 00 16 19 01 F2 2D 00 00 0A 00 08 38 00 00 00 1B C1 6A 00 00 00 00 00 00 16 16 16 12 20 EC 2F 00 00 AD 00 E4 2E 00 00 00 1B FE 37 00 00 00 00 00 00 38 3A 19 01 F2 2D 00 00 0A 00 D2 C9 00 00 00 1B 77 3B 00 00 00 00 00 00 16 2D 35 4E 0F 00 00 58 0F 00 00 00 00 19 00 13 2E 00 00 09 00 03 B8 00 00 00 01 03 B8 00 00 12 20 A7 71 00 00 3B 00 8F 71 00 00 00 1B 45 3D 00 00 00 00 00 00 35 54 0F 00 00 58 0F 00 00 00 00 19 00 13 2E 00 00 09 00 03 B8 00 00 00 01 03 B8 00 00 16 16 12 20 EC 2F 00 00 1D 00 DF 2E 00 00 00 1B 1A 3B 00 00 00 00 00 00 00 0F 2E 00 00 2D 00 10 2E 00 00 16 19 00 13 2E 00 00 0A 00 FD B8 00 00 00 1B 2C 4C 00 00 00 00 00 00 16 16 06 93 07 1B 5F 06 00 00 00 00 00 00 19 01 F2 2D 00 00 0A 00 02 38 00 00 00 1B BE 6A 00 00 00 00 00 00 16 70 70 70 70 70 1F 58 50 3A 20 00 38 53 19 00 13 2E 00 00 0A 00 0B B9 00 00 00 1B 57 3C 00 00 00 00 00 00 16 16 1F 2F 00 16 38 53 19 19 2E 54 32 00 00 19 12 20 35 FE FF FF 0A 00 92 F9 FF FF 00 1C D5 FB FF FF 16 09 00 50 F9 FF FF 00 01 50 F9 FF FF 09 00 46 32 00 00 00 01 46 32 00 00 3E 00 F3 85 00 00 00 1B 58 3C 00 00 00 00 00 00 92 35 94 0F 00 00 99 0F 00 00 00 00 19 00 13 2E 00 00 09 00 D4 B8 00 00 00 01 D4 B8 00 00 26 16 16 16 1F 20 20 20 00 16 19 01 F2 2D 00 00 0A 00 08 38 00 00 00 1B C1 6A 00 00 00 00 00 00 16 16 12 20 EC 2F 00 00 AD 00 E4 2E 00 00 00 1B FE 37 00 00 00 00 00 00 38 3A 19 01 F2 2D 00 00 0A 00 D2 C9 00 00 00 1B 77 3B 00 00 00 00 00 00 16 2D 35 4E 0F 00 00 58 0F 00 00 00 00 19 00 13 2E 00 00 09 00 03 B8 00 00 00 01 03 B8 00 00 12 20 A7 71 00 00 3B 00 8F 71 00 00 00 1B 45 3D 00 00 00 00 00 00 35 54 0F 00 00 58 0F 00 00 00 00 19 00 13 2E 00 00 09 00 03 B8 00 00 00 01 03 B8 00 00 16 16 12 20 EC 2F 00 00 1D 00 DF 2E 00 00 00 1B 1A 3B 00 00 00 00 00 00 00 0F 2E 00 00 2D 00 10 2E 00 00 16 19 00 13 2E 00 00 0A 00 FD B8 00 00 00 1B 2C 4C 00 00 00 00 00 00 16 16 1B 70 06 00 00 00 00 00 00 70 70 70 1F 4D 6F 62 69 6C 69 74 79 3A 20 00 38 53 19 01 F2 2D 00 00 0B 00 E4 38 00 00 00 1B CB 39 00 00 00 00 00 00 4A 16 16 1F 20 20 00 16 A8 01 FB 2D 00 00 38 53 19 01 F2 2D 00 00 0A 00 D3 3A 00 00 00 1B 04 3C 00 00 00 00 00 00 16 16 16 A8 01 FA 2D 00 00 38 53 1B 44 3C 00 00 00 00 00 00 01 F2 2D 00 00 16 16 A8 01 F9 2D 00 00 38 53 19 01 F2 2D 00 00 0A 00 61 C8 00 00 00 1B 71 3A 00 00 00 00 00 00 16 16 A8 01 F8 2D 00 00 38 53 1B 8D 38 00 00 00 00 00 00 01 F2 2D 00 00 16 16 16 1B 6F 06 00 00 00 00 00 00 28 16 06 D0 09 07 45 09 9B 19 01 F2 2D 00 00 09 00 C6 C4 00 00 00 01 C6 C4 00 00 25 16 1B 29 06 00 00 00 00 00 00 A8 A8 A8 1F 3C 66 6F 6E 74 20 63 6F 6C 6F 72 3D 27 23 45 45 31 43 32 35 27 3E 00 19 01 F2 2D 00 00 0A 00 00 38 00 00 00 1B C0 6A 00 00 00 00 00 00 16 16 1F 3C 2F 66 6F 6E 74 3E 00 16 1F 3C 66 6F 6E 74 20 73 69 7A 65 3D 27 32 34 27 20 63 6F 6C 6F 72 3D 27 23 46 46 44 30 33 38 27 3E 28 46 61 74 69 67 75 65 64 29 3C 2F 66 6F 6E 74 3E 00 16 28 19 01 F2 2D 00 00 0A 00 F5 37 00 00 00 1B EB 44 00 00 00 00 00 00 16 16 06 B0 09 1B 29 06 00 00 00 00 00 00 12 20 EC 2F 00 00 2C 00 D3 2E 00 00 00 1B 34 39 00 00 00 00 00 00 19 01 F2 2D 00 00 0A 00 00 38 00 00 00 1B C0 6A 00 00 00 00 00 00 16 2C 03 4A 16 28 19 01 F2 2D 00 00 0A 00 F5 37 00 00 00 1B EB 44 00 00 00 00 00 00 16 16 1B 6F 06 00 00 00 00 00 00 27 16 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 04 0B 53 00 00 00 03 01 04 00 AD 7B 00 00 00 00 00 00 private final simulated function UpdateHeader() { local XGCharacter_Soldier kCharacterSoldier; local XGCharacter kChar; local bool bIsFriendly, bIsShiv; local int iRank; kChar = m_kUnit.GetCharacter(); if(m_kUnit.isHuman() || m_kUnit.IsShiv()) { if(kChar.m_kChar.iType == 1) { if(m_kUnit.SafeGetCharacterFullName() != "") { AS_SetSoldierInformation(m_kUnit.SafeGetCharacterFullName(), m_kUnit.SafeGetCharacterNickname(), "", "", false); } else { AS_SetSoldierInformation(m_kUnit.SafeGetCharacterName(), m_strCivilianNickname, "", "", false); } AS_SetUnitAllegiance(false); } else { kCharacterSoldier = XGCharacter_Soldier(kChar); if(m_kUnit.IsATank()) { iRank = m_kUnit.GetSHIVRank(); bIsShiv = true; } else { iRank = kCharacterSoldier.m_kSoldier.iRank; bIsShiv = false; } if(kCharacterSoldier.m_kChar.bHasPsiGift) { AS_SetSoldierInformation(m_kUnit.SafeGetCharacterFullName(), (((("XP: " $ string(kCharacterSoldier.GetXP())) $ "/") $ string(XComGameReplicationInfo(class'Engine'.static.GetCurrentWorldInfo().GRI).m_kGameCore.GetXPRequired(kCharacterSoldier.m_kSoldier.iRank + 1))) $ " ") $ ((((("PsiXP: " $ string(kCharacterSoldier.GetPsiXP())) $ "/") $ string(XComGameReplicationInfo(class'Engine'.static.GetCurrentWorldInfo().GRI).m_kGameCore.GetPsiXPRequired(kCharacterSoldier.m_kSoldier.iPsiRank + 1))) $ " ") $ m_kUnit.SafeGetCharacterNickname()), class'UIUtilities'.static.GetClassLabel(m_kUnit.GetSoldierClass(), kCharacterSoldier.m_kChar.bHasPsiGift, class'XComPerkManager'.static.HasAnyGeneMod(kCharacterSoldier.m_kChar.aUpgrades)), class'UIUtilities'.static.GetRankLabel(iRank, bIsShiv), kCharacterSoldier.LeveledUp()); } else { AS_SetSoldierInformation(m_kUnit.SafeGetCharacterFullName(), (((("XP: " $ string(kCharacterSoldier.GetXP())) $ "/") $ string(XComGameReplicationInfo(class'Engine'.static.GetCurrentWorldInfo().GRI).m_kGameCore.GetXPRequired(kCharacterSoldier.m_kSoldier.iRank + 1))) $ " ") $ m_kUnit.SafeGetCharacterNickname(), class'UIUtilities'.static.GetClassLabel(m_kUnit.GetSoldierClass(), kCharacterSoldier.m_kChar.bHasPsiGift, class'XComPerkManager'.static.HasAnyGeneMod(kCharacterSoldier.m_kChar.aUpgrades)), class'UIUtilities'.static.GetRankLabel(iRank, bIsShiv), kCharacterSoldier.LeveledUp()); } } AS_SetUnitStats((("Mobility: " $ string(m_kUnit.GetMaxPathLength())) $ " ") $ (m_strHealthLabel @ string(m_kUnit.GetUnitMaxHP())), m_strWillLabel @ string(GetWillBonus(m_kUnit)), m_strOffenseLabel @ string(m_kUnit.GetOffense()), m_strDefenseLabel @ string(GetDefenseBonus(m_kUnit))); AS_SetUnitAllegiance(false); } else { if(m_kUnit.m_iBWAimPenalty != 0) { AS_SetAlienInformation((("<font color='#EE1C25'>" @ m_kUnit.SafeGetCharacterName()) @ "</font>") @ "<font size='24' color='#FFD038'>(Fatigued)</font>", false, m_kUnit.IsExalt()); } else { AS_SetAlienInformation(class'UIUtilities'.static.GetHTMLColoredText(m_kUnit.SafeGetCharacterName(), 3), false, m_kUnit.IsExalt()); } AS_SetUnitAllegiance(true); } //return; } Alternatively: 13 2E 00 00 51 60 00 00 00 00 00 00 0E 2E 00 00 00 00 00 00 00 00 00 00 13 2E 00 00 00 00 00 00 9A 00 00 00 F8 15 00 00 D7 09 00 00 37 07 00 00 0F 00 12 2E 00 00 19 01 F2 2D 00 00 0A 00 D0 C9 00 00 00 1B E5 37 00 00 00 00 00 00 16 07 7C 08 84 19 01 F2 2D 00 00 0A 00 EC 37 00 00 00 1B 25 45 00 00 00 00 00 00 16 18 20 00 19 01 F2 2D 00 00 0A 00 EE 37 00 00 00 1B 12 46 00 00 00 00 00 00 16 16 07 61 01 9A 35 56 0F 00 00 58 0F 00 00 00 00 19 00 12 2E 00 00 09 00 03 B8 00 00 00 01 03 B8 00 00 26 16 07 1C 01 7B 19 01 F2 2D 00 00 0A 00 02 38 00 00 00 1B BE 6A 00 00 00 00 00 00 16 1F 00 16 1B 5F 06 00 00 00 00 00 00 19 01 F2 2D 00 00 0A 00 02 38 00 00 00 1B BE 6A 00 00 00 00 00 00 16 19 01 F2 2D 00 00 0A 00 08 38 00 00 00 1B C1 6A 00 00 00 00 00 00 16 1F 00 1F 00 28 16 06 53 01 1B 5F 06 00 00 00 00 00 00 19 01 F2 2D 00 00 0A 00 00 38 00 00 00 1B C0 6A 00 00 00 00 00 00 16 01 F7 2D 00 00 1F 00 1F 00 28 16 1B 6F 06 00 00 00 00 00 00 28 16 06 93 07 0F 00 13 2E 00 00 2E 0F B9 00 00 00 12 2E 00 00 07 D7 01 19 01 F2 2D 00 00 0A 00 E7 38 00 00 00 1B 68 44 00 00 00 00 00 00 16 0F 00 0F 2E 00 00 19 01 F2 2D 00 00 0A 00 C8 C9 00 00 00 1B 66 3B 00 00 00 00 00 00 16 14 2D 00 10 2E 00 00 27 06 1E 02 0F 00 0F 2E 00 00 35 94 0F 00 00 99 0F 00 00 00 00 19 00 13 2E 00 00 09 00 D4 B8 00 00 00 01 D4 B8 00 00 14 2D 00 10 2E 00 00 28 07 61 05 35 4E 0F 00 00 58 0F 00 00 00 00 19 00 13 2E 00 00 09 00 03 B8 00 00 00 01 03 B8 00 00 1B 5F 06 00 00 00 00 00 00 19 01 F2 2D 00 00 0A 00 02 38 00 00 00 1B BE 6A 00 00 00 00 00 00 16 70 70 70 70 70 1F 58 50 3A 20 00 38 53 19 00 13 2E 00 00 0A 00 0B B9 00 00 00 1B 57 3C 00 00 00 00 00 00 16 16 1F 2F 00 16 38 53 19 19 2E 54 32 00 00 19 12 20 35 FE FF FF 0A 00 92 F9 FF FF 00 1C D5 FB FF FF 16 09 00 50 F9 FF FF 00 01 50 F9 FF FF 09 00 46 32 00 00 00 01 46 32 00 00 3E 00 F3 85 00 00 00 1B 58 3C 00 00 00 00 00 00 92 35 94 0F 00 00 99 0F 00 00 00 00 19 00 13 2E 00 00 09 00 D4 B8 00 00 00 01 D4 B8 00 00 26 16 16 16 1F 20 20 20 00 16 70 70 70 70 70 1F 50 73 69 58 50 3A 20 00 38 53 19 00 13 2E 00 00 0A 00 05 B9 00 00 00 1B 0A 3B 00 00 00 00 00 00 16 16 1F 2F 00 16 38 53 19 19 2E 54 32 00 00 19 12 20 35 FE FF FF 0A 00 92 F9 FF FF 00 1C D5 FB FF FF 16 09 00 50 F9 FF FF 00 01 50 F9 FF FF 09 00 46 32 00 00 00 01 46 32 00 00 3E 00 F6 85 00 00 00 1B 0B 3B 00 00 00 00 00 00 92 35 93 0F 00 00 99 0F 00 00 00 00 19 00 13 2E 00 00 09 00 D4 B8 00 00 00 01 D4 B8 00 00 26 16 16 16 1F 20 20 20 00 16 19 01 F2 2D 00 00 0A 00 08 38 00 00 00 1B C1 6A 00 00 00 00 00 00 16 16 16 12 20 EC 2F 00 00 AD 00 E4 2E 00 00 00 1B FE 37 00 00 00 00 00 00 38 3A 19 01 F2 2D 00 00 0A 00 D2 C9 00 00 00 1B 77 3B 00 00 00 00 00 00 16 2D 35 4E 0F 00 00 58 0F 00 00 00 00 19 00 13 2E 00 00 09 00 03 B8 00 00 00 01 03 B8 00 00 12 20 A7 71 00 00 3B 00 8F 71 00 00 00 1B 45 3D 00 00 00 00 00 00 35 54 0F 00 00 58 0F 00 00 00 00 19 00 13 2E 00 00 09 00 03 B8 00 00 00 01 03 B8 00 00 16 16 12 20 EC 2F 00 00 1D 00 DF 2E 00 00 00 1B 1A 3B 00 00 00 00 00 00 00 0F 2E 00 00 2D 00 10 2E 00 00 16 19 00 13 2E 00 00 0A 00 FD B8 00 00 00 1B 2C 4C 00 00 00 00 00 00 16 16 06 93 07 1B 5F 06 00 00 00 00 00 00 19 01 F2 2D 00 00 0A 00 02 38 00 00 00 1B BE 6A 00 00 00 00 00 00 16 70 70 70 70 70 1F 58 50 3A 20 00 38 53 19 00 13 2E 00 00 0A 00 0B B9 00 00 00 1B 57 3C 00 00 00 00 00 00 16 16 1F 2F 00 16 38 53 19 19 2E 54 32 00 00 19 12 20 35 FE FF FF 0A 00 92 F9 FF FF 00 1C D5 FB FF FF 16 09 00 50 F9 FF FF 00 01 50 F9 FF FF 09 00 46 32 00 00 00 01 46 32 00 00 3E 00 F3 85 00 00 00 1B 58 3C 00 00 00 00 00 00 92 35 94 0F 00 00 99 0F 00 00 00 00 19 00 13 2E 00 00 09 00 D4 B8 00 00 00 01 D4 B8 00 00 26 16 16 16 1F 20 20 20 00 16 19 01 F2 2D 00 00 0A 00 08 38 00 00 00 1B C1 6A 00 00 00 00 00 00 16 16 12 20 EC 2F 00 00 AD 00 E4 2E 00 00 00 1B FE 37 00 00 00 00 00 00 38 3A 19 01 F2 2D 00 00 0A 00 D2 C9 00 00 00 1B 77 3B 00 00 00 00 00 00 16 2D 35 4E 0F 00 00 58 0F 00 00 00 00 19 00 13 2E 00 00 09 00 03 B8 00 00 00 01 03 B8 00 00 12 20 A7 71 00 00 3B 00 8F 71 00 00 00 1B 45 3D 00 00 00 00 00 00 35 54 0F 00 00 58 0F 00 00 00 00 19 00 13 2E 00 00 09 00 03 B8 00 00 00 01 03 B8 00 00 16 16 12 20 EC 2F 00 00 1D 00 DF 2E 00 00 00 1B 1A 3B 00 00 00 00 00 00 00 0F 2E 00 00 2D 00 10 2E 00 00 16 19 00 13 2E 00 00 0A 00 FD B8 00 00 00 1B 2C 4C 00 00 00 00 00 00 16 16 1B 70 06 00 00 00 00 00 00 70 70 70 1F 4D 6F 62 69 6C 69 74 79 3A 20 00 38 53 19 01 F2 2D 00 00 0B 00 E4 38 00 00 00 1B CB 39 00 00 00 00 00 00 4A 16 16 1F 20 20 00 16 A8 01 FB 2D 00 00 38 53 1A 25 19 01 F2 2D 00 00 09 00 63 3A 00 00 00 01 63 3A 00 00 16 16 A8 01 FA 2D 00 00 38 53 1B 44 3C 00 00 00 00 00 00 01 F2 2D 00 00 16 16 A8 01 F9 2D 00 00 38 53 19 01 F2 2D 00 00 0A 00 61 C8 00 00 00 1B 71 3A 00 00 00 00 00 00 16 16 A8 01 F8 2D 00 00 38 53 1B 8D 38 00 00 00 00 00 00 01 F2 2D 00 00 16 16 16 1B 6F 06 00 00 00 00 00 00 28 16 06 D4 09 07 46 09 9B 19 01 F2 2D 00 00 09 00 C6 C4 00 00 00 01 C6 C4 00 00 25 16 1B 29 06 00 00 00 00 00 00 A8 A8 A8 1F 3C 66 6F 6E 74 20 63 6F 6C 6F 72 3D 27 23 45 45 31 43 32 35 27 3E 00 19 01 F2 2D 00 00 0A 00 00 38 00 00 00 1B C0 6A 00 00 00 00 00 00 16 16 1F 3C 2F 66 6F 6E 74 3E 00 16 1F 3C 66 6F 6E 74 20 73 69 7A 65 3D 27 32 34 27 20 63 6F 6C 6F 72 3D 27 23 46 46 44 30 33 38 27 3E 28 46 61 74 69 67 75 65 64 29 3C 2F 66 6F 6E 74 3E 00 16 28 19 01 F2 2D 00 00 0A 00 F5 37 00 00 00 1B EB 44 00 00 00 00 00 00 16 16 06 B1 09 1B 29 06 00 00 00 00 00 00 12 20 EC 2F 00 00 2C 00 D3 2E 00 00 00 1B 34 39 00 00 00 00 00 00 19 01 F2 2D 00 00 0A 00 00 38 00 00 00 1B C0 6A 00 00 00 00 00 00 16 2C 03 4A 16 28 19 01 F2 2D 00 00 0A 00 F5 37 00 00 00 1B EB 44 00 00 00 00 00 00 16 16 1B 6F 06 00 00 00 00 00 00 27 16 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 04 0B 53 00 00 00 03 01 04 00 AD 7B 00 00 00 00 00 00swapped: 19 01 F2 2D 00 00 0A 00 D3 3A 00 00 00 1B 04 3C 00 00 00 00 00 00 16 = m_kUnit.GetUnitMaxHP()with: 1A 25 19 01 F2 2D 00 00 09 00 63 3A 00 00 00 01 63 3A 00 00 = m_kUnit.m_aCurrentStats[0]... which frees up another 3 bytes and the info displayed is more consistent with everything else (current stats, rather than max stats).
  23. @Miin Hop over to the XSHAPE thread here http://forums.nexusmods.com/index.php?/topic/810950-xshape/ and I'll help you out.
  24. Ok... I think Gildor has explained that textures work this way: 1) TFC files are compressed (LZO, ZLIB, LZX), and that single compression type is used throughout the entire file. 2) The compression type used isn't stored within that TFC file, but is stored in other upk files within a Texture2D object data (explained here: http://www.gildor.org/smf/index.php/topic,297.0.htm) 3) Uncompressed TFC files contain concatenated textures of various formats (most are dxt), and different resolutions (mipmaps) for streaming purposes. 4) Each of these mipmaps has a length in bytes that is some multiple of 0x8000 (32768 in decimal). XCOM Modmanager (as written) cannot do this. Writing a program to do what's needed would not be simple, but it's doable.
  25. Yeah, it's the byte after 07 that controls the jump ;)
×
×
  • Create New...