Jump to content

Daemonjax

Supporter
  • Posts

    267
  • Joined

  • Last visited

Everything posted by Daemonjax

  1. Yeah, some constants in some of the UPKs seem to have no effect.
  2. Well, maybe we won't do it in Java then :D What programming languages do you know? I'll put you down as a volunteer for now at least.
  3. That sounds good, but let's take a step back here... What I'm talking about is a program that would make a mod like the mod you're describing easy to distribute to non-modders so they can use it themselves :D I want to write a program that has the goal of answering the question: How does Player A get and "install" the Mod that Player B wrote? While I agree with what you said, I don't want to raise everyone's expectations to unreasonable levels here. :D I'm just one guy.
  4. You can skip this step if you just edit the hexedit the upk directly :D Good info. Someone should take all that information and make it something easily human readable/searchable. Yeps. I think we should do it, because I get the feeling we'll be limited to modding this way for a long while.
  5. Original hex of that code: Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 00000000 DA 35 00 00 9F 1F 00 00 00 00 00 00 D5 35 00 00 Ú5..Ÿ.......Õ5.. 00000010 00 00 00 00 00 00 00 00 DA 35 00 00 00 00 00 00 ........Ú5...... 00000020 91 03 00 00 D5 C1 00 00 A2 00 00 00 76 00 00 00 ‘...ÕÁ..¢...v... 00000030 07 19 00 9A 00 D8 35 00 00 1D FF FF FF FF 16 04 ...š.Ø5...ÿÿÿÿ.. 00000040 1D FF FF FF FF 07 52 00 84 9B 38 3A 00 D9 35 00 .ÿÿÿÿ.R.„›8:.Ù5. 00000050 00 38 3A 24 03 16 18 16 00 1B BF 14 00 00 00 00 .8:$......¿..... 00000060 00 00 38 3A 00 DA 35 00 00 16 16 0F 00 D8 35 00 ..8:.Ú5......Ø5. 00000070 00 25 0F 00 D6 35 00 00 12 20 6D FE FF FF 09 00 .%..Ö5... mþÿÿ.. 00000080 F7 FD FF FF 00 02 F7 FD FF FF 04 38 44 AB 38 3F ÷ýÿÿ..÷ýÿÿ.8D«8? 00000090 90 00 D8 35 00 00 2C 18 16 00 D6 35 00 00 16 04 ..Ø5..,...Ö5.... 000000A0 3A D7 35 00 00 53 00 00 00 02 00 02 00 5E 0F 00 :×5..S.......^.. 000000B0 00 00 00 00 00 ..... I can't find these: EX_NotEqual_DelDel = 0x3C; EX_NotEqual_DelFunc = 0x3E; So maybe I'll change one of the jumps from: EX_JumpIfNot = 0x07; to: EX_Jump = 0x06; and see what that does. UPDATE: Also can't find EX_StructCmpNe = 0x33; in the code, either. What gives? Why can't I find anything to match a "!=" ? The only explanation I can think of is that it just didn't compile that way, and it's effectively doing the != another way. Or that code in unhoop is incorrect for xcom (this appears to be true). Or both. Dunno. function int GetItemBuildTime(XComGame.XGGameData.EItemType eItem, XGStrategyActor.EItemCategory eItemCat, int iEngineerDays) { local float fBalanceFactor; // End:0x19 Loop:False if(iEngineerDays == -1) { return -1; } // This is an implied JumpToken; //goto J0x52; //eItemCat != 3 || (IsShipWeapon(eItem)); //iEngineerDays = 0; //J0x52: fBalanceFactor = class'XGTacticalGameCore'.default.ITEM_TIME_BALANCE; return int(float(iEngineerDays * 24) * fBalanceFactor); } Flipping the second 07 (at location 45) to an 06 gives us that... So it should skip all the code I commented out. :D Thanks for the help dreadylein. :D
  6. Found stuff: class BytecodeReader { private const int EX_LocalVariable = 0x00; private const int EX_InstanceVariable = 0x01; private const int EX_DefaultVariable = 0x02; private const int EX_Return = 0x04; private const int EX_Switch = 0x05; private const int EX_Jump = 0x06; private const int EX_JumpIfNot = 0x07; private const int EX_Stop = 0x08; private const int EX_Assert = 0x09; private const int EX_Case = 0x0A; private const int EX_Nothing = 0x0B; private const int EX_LabelTable = 0x0C; private const int EX_GotoLabel = 0x0D; private const int EX_EatReturnValue = 0x0E; private const int EX_Let = 0x0F; private const int EX_DynArrayElement = 0x10; private const int EX_New = 0x11; private const int EX_ClassContext = 0x12; private const int EX_Metacast = 0x13; private const int EX_LetBool = 0x14; // EX_EndParmValue = 0x15? private const int EX_EndFunctionParms = 0x16; private const int EX_Self = 0x17; private const int EX_Skip = 0x18; private const int EX_Context = 0x19; private const int EX_ArrayElement = 0x1A; private const int EX_VirtualFunction = 0x1B; private const int EX_FinalFunction = 0x1C; private const int EX_IntConst = 0x1D; private const int EX_FloatConst = 0x1E; private const int EX_StringConst = 0x1F; private const int EX_ObjectConst = 0x20; private const int EX_NameConst = 0x21; private const int EX_RotationConst = 0x22; private const int EX_VectorConst = 0x23; private const int EX_ByteConst = 0x24; private const int EX_IntZero = 0x25; private const int EX_IntOne = 0x26; private const int EX_True = 0x27; private const int EX_False = 0x28; private const int EX_NativeParm = 0x29; private const int EX_NoObject = 0x2A; private const int EX_IntConstByte = 0x2C; private const int EX_BoolVariable = 0x2D; private const int EX_DynamicCast = 0x2E; private const int EX_Iterator = 0x2F; private const int EX_IteratorPop = 0x30; private const int EX_IteratorNext = 0x31; private const int EX_StructCmpEq = 0x32; private const int EX_StructCmpNe = 0x33; private const int EX_UnicodeStringConst = 0x34; private const int EX_StructMember = 0x35; private const int EX_DynArrayLength = 0x36; private const int EX_GlobalFunction = 0x37; private const int EX_PrimitiveCast = 0x38; private const int EX_DynArrayInsert = 0x39; private const int EX_ByteToInt = 0x3A; // EX_ReturnNothing = 0x3A private const int EX_EqualEqual_DelDel = 0x3B; private const int EX_NotEqual_DelDel = 0x3C; private const int EX_EqualEqual_DelFunc = 0x3D; private const int EX_NotEqual_DelFunc = 0x3E; private const int EX_EmptyDelegate = 0x3F; private const int EX_DynArrayRemove = 0x40; private const int EX_DebugInfo = 0x41; private const int EX_DelegateFunction = 0x42; private const int EX_DelegateProperty = 0x43; private const int EX_LetDelegate = 0x44; private const int EX_Conditional = 0x45; private const int EX_DynArrayFind = 0x46; private const int EX_DynArrayFindStruct = 0x47; private const int EX_LocalOutVariable = 0x48; private const int EX_DefaultParmValue = 0x49; private const int EX_EmptyParmValue = 0x4A; private const int EX_InstanceDelegate = 0x4B; private const int EX_GoW_DefaultValue = 0x50; private const int EX_InterfaceContext = 0x51; private const int EX_InterfaceCast = 0x52; private const int EX_EndOfScript = 0x53; private const int EX_DynArrayAdd = 0x54; private const int EX_DynArrayAddItem = 0x55; private const int EX_DynArrayRemoveItem = 0x56; private const int EX_DynArrayInsertItem = 0x57; private const int EX_DynArrayIterator = 0x58; private const int EX_ExtendedNative = 0x60; private const int EX_FirstNative = 0x70;
  7. How about you help a brother out and show us how to do something like that? ;)
  8. <stuff about java> if(eItemCat != 3 I think I found the 3, but how do we change the != into an == ? Where do I get that information from on the web? I'd like to rewrite it as: if(eItemCat == 255 That should essentially remove that code, since I doubt there's an item category 255, and even if there is, whatever. ;)
  9. Great find, man! But what the code actually does: if item category is NOT category 3, or it's a aircraft weapon, the time to build is 0 hours. :D I'll look at it, and try to come up with a mod that'll work.
  10. BETA (11/2/2012) is available for download. MAIN DOWNLOAD LINK (r31) Important updates: ModInstaller.bat direct download link (r33) README: The GUI that dose coded is in the first link above. I can't promise that it'll work for you. We're working on it. ;) Installation: 1) Extract anywhere (hereafter referred to as this folder). 2) Extract any important updates to this folder. 3) You may have to edit the config\config.xml file manually (it does have sane defaults). 4) Download and extract XSHAPE v0.14+ into your xcom folder. 5) Download and extract Gildor's Unreal Package Decompressor into this folder. 6) Open a command prompt to that folder. 7) Use ModMaker.bat and ModInstaller.bat with the /? switch to see usage info. i.e. modinstaller /? Comes with: Batch files: ModMaker.bat : Generates the .xcom_mod file. ModInstaller.bat: Installs patch data in .xcom_mod files and runs XSHAPE, decompressor, and renames .uncompressed_size files as needed. Example mod: EqualGenderRatioMod : Instead of a 33% chance of having a female soldier, it will be a 50% chance. Modifies: XComGame.upk Also, for testing purposes, located in the folder is all the data you need to actually create the EqualGenderRatioMod.xcom_mod. Committers : Daemonjax, dose206 Contributors: Iluvatarwc Project Requirements for Release Candidate 1: 1) Patching the UPK bytecode (ModInstaller) 2) Creation of UPK bytecode patches (ModMaker) 3) Uninstallation of mods (not yet implemented / do manually) 4) Decompressing UPKs (ModInstaller Batch File / Gildor's decompressor tool) 5) Handling of <filename>.uncompressed_size files (ModInstaller Batch File) 6) SHA hash patching of the main executable file (ModInstaller Batch File / XSHAPE) 7) Unpacking (not yet implemented / use Gildor's extractor tool manually) 8 ) The option to include additional info when making a mod to speed up installation. (not yet implemented) 9) Support for multiple modified files within the same mod. (not yet implemented) Possible Future Features: 1) GUI (currently broken, at least for me) 2) Backup handling (kinda simple) (Probably won't make it into first beta) 3) Version checks (this could mean almost anything, so someone explain this one) 4) Modpatcher support (easy) 5) Hexediting support (easy) 6) UE Explorer support (easy) 7) Merging mods that modify the same extracted file(s) (moderately time-consuming) 8 ) The ability to quickly "flashmod" using info simply copy/pasted from a forum, and revert those changes. (moderately time consuming) Programming Language: Probably C# and Java Project Page: http://code.google.com/p/xcom-modmanager/ IRC: Server: chat.freenode.net -- Channel: #xcom-mod-manager Note: Be sure to download any important updates. Sometimes I notice a problem with a particular file, and I fix it rather quickly. I try to limit repacking the main distribution file to once per day. Right now, at r32, ModInstaller is pretty solid.
  11. So, does it let you bypass any of the steps we've come up with to sidestep the game's compression/hashing?
  12. Where ya been the past couple days? We solved that one. :D
  13. Ok, I'm interested. :D What are you modifying?
  14. Sometimes the game doesn't actually use the constant value, but they're somewhere else as some magic number. Sucks, right? Let us know what works!!! :D I use modpatcher without problems... shouldn't matter either way, as those two sections of the exe are far away from each other. Also, my program actually performs a search for the data to modify... so, even if the locations in your exe are different from mine, or change in the future, for whatever reason, it'll still work! :D But, whatever works for you. :D
  15. That's weird, right? Try using gildor's extract tool, instead of the other unpacker. What does the code look like in the class view in UE Explorer? Does it say 1.75 there? Are you using this explorer? http://eliotvu.com/portfolio/view/21/ue-explorer EDIT: Actually, it's not so weird... my bad. You'll want to open the executing.state file in those respective folders for the classes :D e.g \unpacked\XComGame\XGAction_Overwatch\Executing.State simulated state Executing { Begin: Sleep(1.75); CompleteAction(); }
  16. Yeps, XGTacticalGameCoreNativeBase has the cover constants... some good stuff there: const SCREEN_PC_BUFFER = 0.25f; const FLYING_MAXPATHCOST = 20; const LOW_COVER_BONUS = 20; const HIGH_COVER_BONUS = 40; const HUNKER_BONUS = 2.0; const AIR_EVADE_DEF = 20; const NO_COVER_DEF = 20; const REACTION_PENALTY = 0.7; const LIGHTNING_REACTION_PENALTY = 0.375; const DASHING_REACTION_MODIFIER = 0.7f; const WEAPON_COOLDOWN_PER_TURN = 5; const WEAPON_OVERHEAT_BASE = 0; const GRENADE_TOUCH_RADIUS = 46.0f; const FOUNDRY_PISTOL_AIM_BONUS = 10; const FOUNDRY_SCOPE_CRIT_BONUS = 10; const FOUNDRY_PISTOL_CRIT_BONUS = 20; const HARDENED_ENEMY_CRIT_VALUE = 60; const FLANKING_CRIT_BONUS = 50; const FLUSH_MIN_DIST = 480; const FLUSH_AIM_BONUS = 30; const FLUSH_DMG_REDUCTION = 0.50f; const FALLENCOMRADES_PENALTY = 5; const BATTLEFATIGUE_PENALTY = 5; const BATTLEFATIGUE = 1.0f; const BATTLEFATIGUE = 0.51f; const AIM_BONUS = 20; const PRECISION_SHOT_DAMAGE_BONUS = 2; const PRECISION_SHOT_CRITICAL_CHANCE_BONUS = 30; const TELEKINETIC_FIELD_DEFENSE_BONUS = 40; const MINDFRAY_MOBILITY_PENALTY = 0.5; const BRING_EM_ON_DAMAGE_BONUS = 1; const BRING_EM_ON_MAX_ENEMIES = 5; const BUTTON_UP_SHOT_OFFENSE_MOD = -20; const DANGER_ZONE_RADIUS_BONUS = 192; const DAMN_GOOD_GROUND_OFFENSE_BONUS = 10; const DAMN_GOOD_GROUND_DEFENSE_BONUS = 10; const SNAP_SHOT_AIM_PENALTY = 20; const DENSE_SMOKE_DEFENSE_BONUS = 20; const SMOKE_BOMB_DEFENSE_BONUS = 20; const COMBAT_DRUGS_AIM_CHANCE_BONUS = 20; const COMBAT_DRUGS_CRITICAL_CHANCE_BONUS = 10; const COMBAT_DRUGS_WILL_BONUS = 20; const BASE_NUM_ROCKETS = 1; const ROCKETEER_BONUS_ROCKETS = 1; const BASE_SMOKE_BOMBS = 1; const SMOKEANDMIRROR_BONUS_BOMBS = 1; const HEATAMMO_DMG_MULTIPLIER = 2; const TRACER_BEAMS_BONUS = 10; const BASE_BATTLESCANNERS = 2; const CHITIN_PLATING_DMG_MULT = 0.5f; const COMBAT_STIM_DMG_MULT = 0.5f; const COMBAT_STIM_WILL_BONUS = 40; const COMBAT_STIM_MOBILITY_BONUS = 4; const EXECUTIONER_AIM_BONUS = 10; const EXECUTIONER_HP_MIN = 0.5f; const BATTLE_SCANNER_DURATION = 2; const AGGRESSION_CRIT_BONUS = 10; const AGGRESSION_MAX_ENEMIES = 3; const TACTICALSENSE_DEFENSE_BONUS = 5; const TACTICALSENSE_MAX_ENEMIES = 4; const CLOSECOMBATSPECIALIST_RANGE = 6; const WILLTOSURVIVE_DMG_REDUCTION = 2; const KILLERINSTINCT_CRIT_DMG_MULT = 0.5f; const SHREDDER_ROCKET_DURATION = 4; const FIELDMEDIC_CHARGES = 3; const GRENADIER_CHARGES = 2; const PSIINSPIRED_WILL_BONUS = 30; const DOUBLETAP_COOLDOWN = 3; const BLOODCALL_AIM_BONUS = 10; const BLOODCALL_WILL_BONUS = 10; const BLOODCALL_MOBILITY_BONUS = 4; const MINDMERGE_CRIT_BONUS = 25; const MINDMERGE_HP_BONUS = 1; const LOW_AMMO_PERCENT = 23; const SPREAD_THETA = 75; const MAX_SPREAD_LENGTH = 576; const DEATH_BLOSSOM_RANGE = 384; const DEATH_BLOSSOM_COOLDOWN = 4; const DEATH_BLOSSOM_DAMAGE_MIN = 4; const DEATH_BLOSSOM_DAMAGE_MAX = 6; const MINDFRAY_BASE_DMG = 5; const FLAME_NUM_BURN_TURNS = 4; const FLAME_MAX_SPREAD_HOPS = 1; const FLAME_MAX_FIRES_FROM_EXPLOSION = 4; const SMOKE_NUM_TURNS = 4; const DENSE_SMOKE_RADIUS_MULT = 1.25f; const POISONED_DAMAGE_PER_TURN = 1; const POISONED_AIM_PENALTY = 20; const POISONED_REACTION_PENALTY = 0.5f; const POISONED_MOVEMENT_PENALTY = 0.25f; const POISONED_INITIAL_DURATION = 2; const POISONED_REMISSION_CHANCE = 0.33f; const POISONED_REMISSION_CHANCE = 0.66f; const POISON_ATTACK_CHANCE = 0.5f; const POISON_NUM_TURNS = 4; const RAPIDFIRE_AIM_PENALTY = 15; const DISABLINGSHOT_AIM_PENALTY = 10; const CHRYSSALID_SPAWN_HP_REDUCTION = 4; const FLAME_UNIT_DOT = 2; const ACID_UNIT_DOT = 6; const FLAME_WORLD_DOT = 201; const ACID_WORLD_DOT = 201; const STATIC_HEIGHT_BONUS_Z = 192.0f; const HEIGHT_OFF_BONUS = 20; const HEARING_RADIUS = 40.0f; const CRITICAL_BLEED_OUT = 3; const BASE_CRITWOUND_CHANCE = 15; const OTS_CRITICAL_WOUND_BONUS = 5; const CRITWOUND_WILL_PENALTY = 15; const LUCK_ROLL_BONUS = 5; const CB_XP_BONUS = 0.25f; const PANIC_TURNS = 1; const PANIC_RANDOM_TURNS = 0; const PANIC_BASE_VALUE = 30; const MEDIKIT_HEAL_HP = 4; const MEDIKIT_FOUNDRY_BONUS = 2; const MEDIKIT_SAVIOR_BONUS = 4; const REVIVE_HEALTH_AMOUNT = 0.33f; const SPRINTER_MOBILITY_BONUS = 4; const RAPIDREACTION_MIN_DIST = 192; const TRACER_BEAM_DURATION = 1; const CLUSTER_BOMB_PREVIEW_RADIUS = 432; const MIN_TIME_ARC_HEIGHT = 3.0f; const MAX_TIME_ARC_HEIGHT = 6.0f; const MAX_ENGAGED_AI = 5; const MIN_AI_TURN_LENGTH = 4; const MAX_OVERMIND_REVEAL_TILES = 4; const OVERLOAD_DAMAGE_DRONE = 3; const DEATH_DAMAGE_CYBERDISC = 3; const DEATH_DAMAGE_SECTOPOD = 5; const DEATH_DAMAGE_ETHEREAL = 4; const OVERLOAD_RADIUS_DRONE = 192.0f; const DEATH_RADIUS_CYBERDISC = 192.0f; const DEATH_RADIUS_SECTOPOD = 320.0f; const DEATH_RADIUS_ETHEREAL = 144.0f; const INTIMIDATE_CHANCE_MUTON = 33; const INTIMIDATE_CHANCE_BERSERKER = 66; const CC_RANGE = 3.0f; const CC_INSTIGATOR_BASE = 20; const CC_ASSAULT_BONUS = 10; const CC_SECOND_MOVE_PENALTY = 20; const CC_RUN_PATH_PCT = 50; const RIFLE_I_MOB_BONUS = 2; const RIFLE_II_SUPP_BONUS = 10; const PISTOL_I_CRIT_BONUS = 25; const PISTOL_II_DEF_BONUS = 15; const HEAVY_I_OFF_BONUS = 10; const HEAVY_II_OFF_BONUS = 20; const SNIPER_I_OFF_BONUS = 10; const SNIPER_II_CRIT_BONUS = 25; const XP_KILL = 50; const HP_PER_TICK = 1; const HP_PULSE_PCT = 25; const LOOT_RANGE = 3; const LOOT_DESTRUCT_TIMER = 5; const MIND_PROBE_INTEL = 10; const NAV_INTEL = 5; const COVER_DRAW_RADIUS = 1; const JETPACK_FUEL_HOVER_COST = 1; const MOVE_INTERVAL_REACTION_PROCESSING = 96.0f; const SAFE_FROM_REACTION_FIRE_MIN_DIST_TO_DEST = 96.0f; const REACTION_MINIMUM = 1; const REACTION_BONUS_FOR_OVERWATCH = 20; const REACTION_BONUS_FOR_DASH = 20; const REACTION_FIRE_AMMO_COST_PERCENTAGE = 25; const REACTION_FIRE_AMMO_COST_PERCENTAGE_HEAVY = 33; const REPAIR_SHIV_HP = 6; const STUN_I_HP_THRESHHOLD = 3; const STUN_II_HP_THRESHHOLD = 6; const STUN_BASE_CHANCE = 70; const STUN_MAX_CHANCE = 95; const STUN_MIN_CHANCE = 1; const TIMEDILATION_APPROACHRATE = 15.0f; const TIMEDILATION_MODE_NORMAL = 1.0f; const TIMEDILATION_MODE_VICTIMOFOVERWATCH = 0.01f; const TIMEDILATION_MODE_REACTIONFIRING = 0.4f; const TIMEDILATION_MODE_TRIGGEREDPODACTIVATION = 0.0f; const CYBERDISC_MIN_CLOSED_MOVE_DIST = 320.0f; const CYBERDISC_MAX_FLIGHT_DURATION = 3; const MAX_REPAIRS_PER_TURN = 1; const DRONE_REPAIR_HP = 3; const DRONE_COUNT_OVERRIDE = false; const DRONES_PER_CYBERDISC = 1; const DRONES_PER_SECTOPOD = 3; const DRONE_MAX_FLIGHT_DURATION = 6; const FLOATER_MAX_FLIGHT_DURATION = 3; const HEAVY_FLOATER_MAX_FLIGHT_DURATION = 4; const PSI_DRAIN_HP = 4; const RIFT_MAX_DISTANCE = 100; const RIFT_DAMAGE_RADIUS = 6.75; const RIFT_WILL_BALANCE = 20; const RIFT_WILL_DMG_SLICE = 10; const RIFT_START_DMG = 8; const RIFT_END_DMG = 10; const RIFT_START_DMG_MIN = 4; const RIFT_END_DMG_MIN = 5; const PSI_LANCE_WILL_BALANCE = 20; const PSI_LANCE_WILL_DMG_SLICE = 10; const PSI_LANCE_BASE_DMG = 7; const PSI_LANCE_MIN_DMG = 2; const PSI_LANCE_MAX_DMG = 20; const TELEKINETIC_FIELD_RADIUS = 12.75; const PSI_INSPIRE_FIELD_RADIUS = 3.75; const SUPPRESSION_AIM_PENALTY = 30; const CLOSEANDPERSONAL_MAX_DIST = 9.0f; const CLOSEANDPERSONAL_PER_DIST = 1.5f; const CLOSEANDPERSONAL_BONUS = 5; const RAND_DMG_VARIANCE = 1.5f; const WOUND_AIM_PENALTY = -15; const WOUND_MOB_PENALTY = -2; const TINVENTORY_MAX_LARGE_ITEMS = 16; const TINVENTORY_MAX_SMALL_ITEMS = 16; const TINVENTORY_MAX_CUSTOM_ITEMS = 16; const RELATIVE_HEIGHT_BONUS_ZDIFF = 192.0f; const RELATIVE_HEIGHT_BONUS_WEAPON_RANGE = 1.5f; const MAX_SIGHTLINES = 10;
  17. If you delete/rename <filename>.uncompressed_size, then the game will load the uncompressed version of it without a hitch. ;) So, yeah, you delete or rename the original to something else, then plop the new uncompressed and edited one into the folder. Finally, you must delete or rename <filename>.uncompressed_size to something else, or XSHAPE won't patch the exe for that file. Oh, and, make sure the filename is in XSHAPE.config. :D Also, if you ever want to patch the exe back to using the original compressed file, you can. All you have to do is: 1) Put the original uncompressed file back, then run XSHAPE again. 2) Replace the uncompressed file with the compressed version. 3) Finally, you must restore the <filename>.uncompressed_size file, so the game will load the compressed. I recommend not going through all that hassle. Once you uncompress it, there's no real reason to go back to the compressed version. Just keep the original uncompressed around just in case, because it's very easy to switch back to the original uncompressed file (it's just step one above).
  18. 5: You have files in the configuration file that are normally compressed, but then failed to remove/rename X.uncompressed_size file. Normally, this isn't fatal, except that there were no files left to check, so the program had nothing to do. :D
  19. We've got nothing like the G.E.C.K. you had for modding in New Vegas... In fact, we have nothing at all from the devs. It's just stuff we've hacked together in the past weeks, and only recently could people start loading modified upk files. We'll see where this road leads, but it's going to be bumby as hell, so get your hemmorhoid cream ready and invest in a donut cushion seat. ;)
  20. Second modding attempt (and this one actually worked): I wanted to mod the delays on hunkering down and overwatch to something reasonable. Ok, so, XComGame.upk is the file the holds the info for in tactical so I start there. 1) Uncompress XComGame.upk 2) Open it in UE Explorer 3) Go fishing... find the class: XGAction_Overwatch 4) Click on it and see: class XGAction_Overwatch extends XGAction hidecategories(Navigation) notplaceable; simulated function bool Init(XGUnit kUnit) { BaseInit(kUnit); return CanBePerformed(); } simulated state Executing { Begin: Sleep(1.75); CompleteAction(); } 5) So, I realize I need to change 1.75. So, I google for a float to hex converter (http://gregstoll.dyndns.org/~gregstoll/floattohex/), and plug that number in and get: 0x3fe00000 6) Now, I open up the class (Executing.State, actually) in my unpacked folder with my hexeditor and see: BC 86 00 00 32 55 00 00 00 00 00 00 A7 86 00 00 C2 7F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0C 00 00 00 B0 00 00 00 2D 00 00 00 29 00 00 00 61 00 1E 00 00 E0 3F 16 1C B2 7F 00 00 16 08 0C 9A 08 00 00 00 00 00 00 00 00 00 00 32 55 00 00 00 00 00 00 FF FF 00 00 53 00 02 00 00 14 00 04 00 00 00 00 00 00 00 7) Near the middle you'll see E0 3F... that's the float 1.75 in little endian (backwards ;) ) format. 8 ) Using the same online calculator, I calculate the float 0.25 as hex, which gives: 0x3e800000 9) So, if I change the E0 3F to 80 3E, I'll change 1.75 to 0.25 10) I make the changes to the uncompressed .upk, save, rename the original file and it's .compressed_save, run XSHAPE, and then I was done. * I basically repeated the above for hunkering down, which was unpacked as class: XGAction_HunkerDown I must say, I'm having fun with my shortened delay on overwatch and hunkering down. :D Hope that helps someone else. ^^^ I'd like to see more tutorials like this on here ;)
  21. It only hash checks some files, which is weird. It's to guard against modifying the files. If they were concerned with data corruption, then they'd be hash checking everything (but, as I proved in another thread, that would take too long haha... like 12+ seconds additional startup time). Anyways... I've been pouring over some of these scripts via hexediting, and the bytecode just sucks. Big time. I'm used to seeing java bytecode, but this is nothing like it. The format for it seems to try to obfuscate the code. For example: ¢…..2U.......…..Â...................±...-...)...a....à?..²......š...........2U......ÿÿ..S.............. Is supposedly the bytecode for: simulated state Executing { Begin: Sleep(1.75); CompleteAction(); } Really? Because that makes me want to punch myself in the face. It just screams obfuscation. EDIT: Ok, I'm being a little dramatic. ;) But still. It's ugly ass bytecode, heh. I hate looking at little endian numbers. Anyways, I'm going to test reducing the delay when you overwatch/hunker down. I know you can just switch to another character manually during the delay, but whatever. The delay is unnecessary. UPDATE: Yeah, I did it! haha... my first xcom mod :D I changed the delays from 1.75 seconds to .25, and it's awesome. :D
  22. You seem to know exactly what to say to brighten my day. ;)
  23. Doesn't mean we shouldn't just go ahead and do it anyways ;) I think as long as we don't redistribute any of their actual assets, we're fine. I mean, wtf, come on... we're paying customers. If we don't get modding tools, we need to write our own. That would mean a bytecode editor that looks significantly better than a hexeditor... otherwise, it's all rather 'meh'. I heard the Gears of War source code got leaked, and people have complete table data for the bytecode from that.... anyone know where I could get my hands on that data?
  24. Jumping through all these hoops just to flip a few bytes... I don't think we're ever going to see jack for modding tools from Firaxis/2K. I hope I'm wrong.
×
×
  • Create New...