rossy__

Raw FFX HD Equipment handling function

Jul 5th, 2021 (edited)
692
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.35 KB | None | 0 0
  1. int CreateDroppedEquipment_FUN_00798c20(int KillerIndex, int TargetPrizeStructAddress, int SomeAddress)
  2.  
  3. {
  4.  
  5.   NumberOfDroppedEquipment = NumberOfDroppedEquipmentDuringFight_FUN_00798be0(SomeAddress); // returns -1 if 8 or more equipment have been dropped
  6.  
  7.   if (NumberOfDroppedEquipment < 0) {
  8.     return -1;
  9.   }
  10.  
  11.   DroppedEquipmentArrayOffset = NumberOfDroppedEquipment * 22;
  12.   CurrentDroppedEquipmentAddress = SomeAddress + 0xfe + DroppedEquipmentArrayOffset;
  13.   *(DroppedEquipmentArrayOffset + 0x100 + SomeAddress) = 1;
  14.   PartyMemberIndexLoop = 0;
  15.   EquipmentOwnerBase = 0;
  16.  
  17.   do {
  18.     IsPartyMemberEnabled = IsPartyMemberEnabled_FUN_00785460(PartyMemberIndexLoop);
  19.     if (IsPartyMemberEnabled != 0) {
  20.       EquipmentOwnerBase = EquipmentOwnerBase + 1;
  21.     }
  22.     PartyMemberIndexLoop = PartyMemberIndexLoop + 1;
  23.   } while (PartyMemberIndexLoop < 7);
  24.  
  25.   if (KillerIndex < 7) {    // If killer is not one of the regular 7 party members (Seymour or aeons, and possibly enemies themselves?)
  26.     EquipmentOwnerBase = EquipmentOwnerBase + 3;    // Presumbly a bonus chance for killer to be equipment owner
  27.   }
  28.   else {
  29.     KillerIndex = 0;    // Tidus gets preferential treatment for non-party kills?
  30.   }
  31.  
  32.   RNG_EquipmentOwner = ShuffleRNGSeed_FUN_00798900(12);
  33.   NumberEnabledPartyMembers = 0;
  34.   PartyMemberIndexLoop = 0;
  35.  
  36.   do {
  37.     IsPartyMemberEnabled = IsPartyMemberEnabled_FUN_00785460(PartyMemberIndexLoop);
  38.     if (IsPartyMemberEnabled != 0) {
  39.       NumberEnabledPartyMembers = NumberEnabledPartyMembers + 1;
  40.       if (RNG_EquipmentOwner % EquipmentOwnerBase < NumberEnabledPartyMembers) {
  41.         KillerIndex = PartyMemberIndexLoop;
  42.         break;
  43.       }
  44.     }
  45.     PartyMemberIndexLoop = PartyMemberIndexLoop + 1;
  46.   } while (PartyMemberIndexLoop < 7);
  47.  
  48.   RNG_WeaponOrArmor = ShuffleRNGSeed_FUN_00798900(12);
  49.    
  50.   *(byte *)(NumberOfDroppedEquipment + 0x102 + SomeAddress) = KillerIndex;
  51.   *(byte *)(DroppedEquipmentArrayOffset + 0x103 + SomeAddress) = RNG_WeaponOrArmor & 1;
  52.   *(byte *)(DroppedEquipmentArrayOffset + 0x104 + SomeAddress) = 0xff;
  53.   *(byte *)(DroppedEquipmentArrayOffset + 0x106 + SomeAddress) = *(byte *)(TargetPrizeStructAddress + 0x2e);
  54.   *(byte *)(DroppedEquipmentArrayOffset + 0x107 + SomeAddress) = *(byte *)(TargetPrizeStructAddress + 0x30);
  55.   *(byte *)(DroppedEquipmentArrayOffset + 0x108 + SomeAddress) = *(byte *)(TargetPrizeStructAddress + 0x2f);
  56.    
  57.   RNG_NumberOfSlots = ShuffleRNGSeed_FUN_00798900(12);
  58.   NumberOfSlotsModifier = (uint)*(byte *)(TargetPrizeStructAddress + 0x2d) + ((RNG_NumberOfSlots & 7) - 4);
  59.   NumberOfSlots = FixOutOfBoundsValue_FUN_0079a0d0((int)(NumberOfSlotsModifier + (NumberOfSlotsModifier >> 31 & 3)) >> 2,1,4);
  60.   *(byte *)(NumberOfDroppedEquipment + 0x109 + SomeAddress) = NumberOfSlots;
  61.    
  62.   RNG_NumberOfAbilities = ShuffleRNGSeed_FUN_00798900(12);
  63.   NumberOfAbilitiesModifier = (uint)*(byte *)(TargetPrizeStructAddress + 0x31) + ((RNG_NumberOfAbilities & 7) - 4);
  64.   NumberOfAutoAbilities = (int)(NumberOfAbilitiesModifier + (NumberOfAbilitiesModifier >> 31 & 7)) >> 3;
  65.    
  66.   PossibleAutoAbilitiesArrayAddress = (ushort *)(TargetPrizeStructAddress + 0x32 + ((uint)*(byte *)(NumberOfDroppedEquipment + 0x103 + SomeAddress) + (uint)*(byte *)(NumberOfDroppedEquipment + 0x102 + SomeAddress) * 2) * 16);
  67.   PiercingAutoAbilityValue = *PossibleAutoAbilitiesArrayAddress;
  68.    
  69.   if ((NumberOfSlots == 0) || (PiercingAutoAbilityValue == 0)) {
  70.     NumberOfAbilitiesAdded = 0;
  71.   }
  72.   else {
  73.     CurrentDroppedEquipmentAddress + 14 = PiercingAutoAbilityValue;
  74.     NumberOfAbilitiesAdded = 1;
  75.   }
  76.    
  77.   if (0 < NumberOfAutoAbilities) {
  78.     CurrentDroppedEquipmentAbilityAddress = CurrentDroppedEquipmentAddress + NumberOfAbilitiesAdded + 14;
  79.      
  80.     do {
  81.       if ((int)(uint)*(byte *)((int)CurrentDroppedEquipmentAddress + 11) <= NumberOfAbilitiesAdded) break;
  82.        
  83.       RNG_AbilityArrayIndex = ShuffleRNGSeed_FUN_00798900(13);
  84.       AutoAbilityToBeAdded = PossibleAutoAbilitiesArrayAddress[RNG_AbilityArrayIndex % 7 + 1];
  85.        
  86.       if (AutoAbilityToBeAdded != 0) {
  87.         PickedAutoAbility = PickAutoAbilityFromArray_FUN_00798aa0((uint)AutoAbilityToBeAdded);
  88.         NumberAddedAbilities = 0;
  89.          
  90.         if (0 < NumberOfAbilitiesAdded) {
  91.           CurrentEquipmentAbilitySlotAddress = CurrentDroppedEquipmentAddress + 14;
  92.            
  93.           do {
  94.             PickedAutoAbility2 = PickAutoAbilityFromArray_FUN_00798aa0((uint)*CurrentEquipmentAbilitySlotAddress);
  95.              
  96.             if (PickedAutoAbility2 == PickedAutoAbility) goto LAB_00798e2c;
  97.              
  98.             NumberAddedAbilities = NumberAddedAbilities + 1;
  99.             CurrentEquipmentAbilitySlotAddress = CurrentEquipmentAbilitySlotAddress + 2;
  100.           } while (NumberAddedAbilities < NumberOfAbilitiesAdded);
  101.            
  102.         }
  103.          
  104.         *CurrentDroppedEquipmentAbilityAddress = AutoAbilityToBeAdded;
  105.         NumberOfAbilitiesAdded = NumberOfAbilitiesAdded + 1;
  106.         CurrentDroppedEquipmentAbilityAddress = CurrentDroppedEquipmentAbilityAddress + 2;
  107.          
  108.       }
  109. LAB_00798e2c:
  110.       NumberOfAutoAbilities = NumberOfAutoAbilities + -1;
  111.     } while (0 < NumberOfAutoAbilities);
  112.      
  113.   }
  114.    
  115.   if (NumberOfAbilitiesAdded < 4) {
  116.     NumberOfAbilitySlotsToNULL = (4 - NumberOfAbilitiesAdded) >> 1;
  117.     AddressOfEquipmentAbilitySlotsToNULL = (undefined4 *)(CurrentDroppedEquipmentAddress + (NumberOfAbilitiesAdded + 14));
  118.      
  119.     while (NumberOfAbilitySlotsToNULL != 0) {
  120.       NumberOfAbilitySlotsToNULL = NumberOfAbilitySlotsToNULL - 1;
  121.       *AddressOfEquipmentAbilitySlotsToNULL = 0x00ff00ff;
  122.       AddressOfEquipmentAbilitySlotsToNULL = AddressOfEquipmentAbilitySlotsToNULL + 2;
  123.     }
  124.      
  125.     NumberOfAbilitySlotsToNULL = (uint)((4 - NumberOfAbilitiesAdded & 1) != 0);
  126.      
  127.     while (NumberOfAbilitySlotsToNULL != 0) {
  128.       NumberOfAbilitySlotsToNULL = NumberOfAbilitySlotsToNULL - 1;
  129.       *(byte *)AddressOfEquipmentAbilitySlotsToNULL = 0xff;
  130.       AddressOfEquipmentAbilitySlotsToNULL = AddressOfEquipmentAbilitySlotsToNULL + 2);
  131.     }
  132.      
  133.   }
  134.    
  135.   WeaponGroupID = I_THINK_DetermineWeaponNameBasedOnAutoAbilities_FUN_007a0d10(CurrentDroppedEquipmentAddress);
  136.   *CurrentDroppedEquipmentAddress = WeaponGroupID;
  137.   I_THINK_DetermineWeaponDesignBasedOnAutoAbilities_FUN_007a0c70(WeaponGroupID, (byte *)(CurrentDroppedEquipmentAddress + 4), 0, CurrentDroppedEquipmentAddress + 12);
  138.   return 0;
  139. }
  140.  
  141.  
Add Comment
Please, Sign In to add comment