예제 #1
0
        private static void InitGetItemList()
        {
            GetItemList = new List <GetItemEntry>();
            int f = AddrToFile((uint)GetItemTable);

            CheckCompressed(f);
            int baseaddr = GetItemTable - MMFileList[f].Addr;

            for (int i = 0; i < GetItemIndices.Count; i++)
            {
                if (GetItemIndices[i] == -1)
                {
                    GetItemList.Add(null);
                }
                else
                {
                    int          offset = (GetItemIndices[i] - 1) * 8;
                    GetItemEntry g      = new GetItemEntry();
                    g.ItemGained = MMFileList[f].Data[baseaddr + offset];
                    g.Flag       = MMFileList[f].Data[baseaddr + offset + 1];
                    g.Index      = MMFileList[f].Data[baseaddr + offset + 2];
                    g.Type       = MMFileList[f].Data[baseaddr + offset + 3];
                    g.Message    = (short)((MMFileList[f].Data[baseaddr + offset + 4] << 8) | MMFileList[f].Data[baseaddr + offset + 5]);
                    g.Object     = (short)((MMFileList[f].Data[baseaddr + offset + 6] << 8) | MMFileList[f].Data[baseaddr + offset + 7]);
                    GetItemList.Add(g);
                };
            }
            ;
        }
예제 #2
0
        private static void InitGetItemList()
        {
            RomData.GetItemList = new List <GetItemEntry>();
            int f        = RomUtils.GetFileIndexForWriting(GET_ITEM_TABLE);
            int baseaddr = GET_ITEM_TABLE - RomData.MMFileList[f].Addr;
            var fileData = RomData.MMFileList[f].Data;

            for (int i = 0; i < RomData.GetItemIndices.Count; i++)
            {
                if (RomData.GetItemIndices[i] == -1)
                {
                    RomData.GetItemList.Add(null);
                }
                else
                {
                    int          offset = (RomData.GetItemIndices[i] - 1) * 8 + baseaddr;
                    GetItemEntry g      = new GetItemEntry
                    {
                        ItemGained = fileData[offset],
                        Flag       = fileData[offset + 1],
                        Index      = fileData[offset + 2],
                        Type       = fileData[offset + 3],
                        Message    = (short)((fileData[offset + 4] << 8) | fileData[offset + 5]),
                        Object     = (short)((fileData[offset + 6] << 8) | fileData[offset + 7])
                    };
                    RomData.GetItemList.Add(g);
                }
            }
        }
예제 #3
0
        public static void WriteNewItem(ItemObject itemObject, List <MessageEntry> newMessages, GameplaySettings settings, ChestTypeAttribute.ChestType?overrideChestType, MessageTable messageTable, ExtendedObjects extendedObjects)
        {
            var item     = itemObject.Item;
            var location = itemObject.NewLocation.Value;

            System.Diagnostics.Debug.WriteLine($"Writing {item.Name()} --> {location.Location()}");

            if (!itemObject.IsRandomized)
            {
                var indices = location.GetCollectableIndices();
                if (indices.Any())
                {
                    foreach (var collectableIndex in location.GetCollectableIndices())
                    {
                        ReadWriteUtils.Arr_WriteU16(RomData.MMFileList[COLLECTABLE_TABLE_FILE_INDEX].Data, collectableIndex * 2, 0);
                    }
                    return;
                }
            }

            int f            = RomUtils.GetFileIndexForWriting(GET_ITEM_TABLE);
            int baseaddr     = GET_ITEM_TABLE - RomData.MMFileList[f].Addr;
            var getItemIndex = location.GetItemIndex().Value;
            int offset       = (getItemIndex - 1) * 8 + baseaddr;
            var fileData     = RomData.MMFileList[f].Data;

            GetItemEntry newItem;

            if (!itemObject.IsRandomized && location.IsNullableItem())
            {
                newItem = new GetItemEntry();
            }
            else if (item.IsExclusiveItem())
            {
                newItem = item.ExclusiveItemEntry();
            }
            else
            {
                newItem = RomData.GetItemList[item.GetItemIndex().Value];
            }

            // Attempt to resolve extended object Id, which should affect "Exclusive Items" as well.
            var graphics = extendedObjects.ResolveGraphics(newItem);

            if (graphics.HasValue)
            {
                newItem.Object = graphics.Value.objectId;
                newItem.Index  = graphics.Value.graphicId;
            }

            var data = new byte[]
            {
                newItem.ItemGained,
                newItem.Flag,
                newItem.Index,
                newItem.Type,
                (byte)(newItem.Message >> 8),
                (byte)(newItem.Message & 0xFF),
                (byte)(newItem.Object >> 8),
                (byte)(newItem.Object & 0xFF),
            };

            ReadWriteUtils.Arr_Insert(data, 0, data.Length, fileData, offset);

            int?refillGetItemIndex = item switch
            {
                Item.ItemBottleMadameAroma => 0x91,
                Item.ItemBottleAliens => 0x92,
                _ => null,
            };

            if (refillGetItemIndex.HasValue)
            {
                var refillItem     = RomData.GetItemList[refillGetItemIndex.Value];
                var refillGraphics = extendedObjects.ResolveGraphics(refillItem);
                if (refillGraphics.HasValue)
                {
                    refillItem.Object = refillGraphics.Value.objectId;
                    refillItem.Index  = refillGraphics.Value.graphicId;
                }
                var refillData = new byte[]
                {
                    refillItem.ItemGained,
                    refillItem.Flag,
                    refillItem.Index,
                    refillItem.Type,
                    (byte)(refillItem.Message >> 8),
                    (byte)(refillItem.Message & 0xFF),
                    (byte)(refillItem.Object >> 8),
                    (byte)(refillItem.Object & 0xFF),
                };
                var refillOffset = (refillGetItemIndex.Value - 1) * 8 + baseaddr;
                ReadWriteUtils.Arr_Insert(refillData, 0, refillData.Length, fileData, refillOffset);
            }

            if (location.IsRupeeRepeatable())
            {
                settings.AsmOptions.MMRConfig.RupeeRepeatableLocations.Add(getItemIndex);
            }

            var isRepeatable = item.IsRepeatable(settings) || (!settings.PreventDowngrades && item.IsDowngradable());

            if (settings.ProgressiveUpgrades && item.HasAttribute <ProgressiveAttribute>())
            {
                isRepeatable = false;
            }
            if (item.IsReturnable(settings))
            {
                isRepeatable = false;
                settings.AsmOptions.MMRConfig.ItemsToReturnIds.Add(getItemIndex);
            }
            if (!isRepeatable)
            {
                SceneUtils.UpdateSceneFlagMask(getItemIndex);
            }

            if (settings.UpdateChests)
            {
                UpdateChest(location, item, overrideChestType);
            }

            if (settings.UpdateShopAppearance)
            {
                UpdateShop(itemObject, newMessages, messageTable);
            }

            if (itemObject.IsRandomized)
            {
                var hackContentAttributes = location.GetAttributes <HackContentAttribute>();
                if (location == item)
                {
                    hackContentAttributes = hackContentAttributes.Where(h => !h.ApplyOnlyIfItemIsDifferent);
                }
                foreach (var hackContent in hackContentAttributes.Select(h => h.HackContent))
                {
                    ResourceUtils.ApplyHack(hackContent);
                }
            }
        }