diff --git a/BUILD_ENV b/BUILD_ENV index fb8445548..ee0768d75 100644 --- a/BUILD_ENV +++ b/BUILD_ENV @@ -1,3 +1,3 @@ -TABLE_VERSION=1.15.0 -GAME_VERSION=1.13.0 +TABLE_VERSION=1.16.0 +GAME_VERSION=1.14.0 MIN_CE_VERSION=7.4 \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index c39467f53..c088b91f9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,26 @@ # Changelog ## [Unreleased] +## [v1.16.0] - 2024-09-11 +### Added + - by [Umgak](https://github.com/Umgak): + - Ranni's Tower Fix script for Seamless Co-op + - by [Dasaav](https://github.com/Dasaav-dsv/): + - TGA read/write extensions for C strings and singular bits +### Changed + - "Print player inventory items" has been renamed to "Print items" and now prints the currently selected type of inventory + - by [Dasaav](https://github.com/Dasaav-dsv/): + - ThingName to support writes (and never return nil) + - Change position of "Sword of Night" in ItemDropdownDLC and WEAPON_ID dropdowns + - Supported version to v1.14.0 +### Removed + - "Print storage chest items +### Fixed + - getItemIdx, getItemByIdx, RemoveItem when no inventory specified + - equipItem when missing the "empty slot" weapons and protectors + - by [Umgak](https://github.com/Umgak): + - Model Masks offset in Last Protector Highlighted + ## [v1.15.0] - 2024-08-10 ### Added - Support for "key items" in EquipInventoryData header and RemoveItem, getItemIdx, getItemByIdx, isInventoryFull functions diff --git a/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/Hero/EquipInventoryData/.xml b/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/Hero/EquipInventoryData/.xml index ab4264760..5295e4976 100644 --- a/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/Hero/EquipInventoryData/.xml +++ b/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/Hero/EquipInventoryData/.xml @@ -15,6 +15,5 @@ - diff --git a/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/Hero/EquipInventoryData/Print Storage Chest items.cea b/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/Hero/EquipInventoryData/Print Storage Chest items.cea deleted file mode 100644 index 9e82057f8..000000000 --- a/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/Hero/EquipInventoryData/Print Storage Chest items.cea +++ /dev/null @@ -1,35 +0,0 @@ -{$lua} -if syntaxcheck then return end -[ENABLE] -local GameDataMan = readPointer("GameDataMan") -local PlayerGameData = readPointer(GameDataMan + 0x8) -local EquipInventoryData = readPointer(PlayerGameData + 0x8D0) - -local inventoryList = readPointer(EquipInventoryData + 0x10) -local inventoryNum = readInteger(EquipInventoryData + 0x18) - -print("---- Storage Chest ----") -local itemCount = 0 -for i=0,1920 do - local item = getAddress(inventoryList + i * 0x18) - local GaItemHandle = readInteger(item) - local itemId = readInteger(item + 4) - local itemType = getItemType(itemId) - local quantity = readInteger(item + 8) - if itemType[3] ~= -1 then - itemId = itemId - itemType[1] - - if itemId ~= nil and itemId <= 0x8FFFFFFF and itemId ~= 0xFFFFFFFF and quantity ~= nil and GaItemHandle ~= 0 then - print(string.format("#%d | Type: %s | ID: %d | Quantity: %d", i, itemType[2], itemId, quantity)) - itemCount = itemCount + 1 - end - end - - if itemCount >= inventoryNum then break end -end ---print(string.format("itemCount: %d | inventoryNum: %d",itemCount,inventoryNum)) - -disableMemrec(memrec) - -[DISABLE] - diff --git a/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/Hero/EquipInventoryData/Print Player Inventory items.cea b/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/Hero/EquipInventoryData/Print items.cea similarity index 62% rename from CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/Hero/EquipInventoryData/Print Player Inventory items.cea rename to CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/Hero/EquipInventoryData/Print items.cea index b85def4cf..52e7c8ac6 100644 --- a/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/Hero/EquipInventoryData/Print Player Inventory items.cea +++ b/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/Hero/EquipInventoryData/Print items.cea @@ -1,16 +1,27 @@ {$lua} if syntaxcheck then return end [ENABLE] +local invChoice = readByte(EquipInventoryDataIdx + 4) +local inv = getInvData(invChoice) +local keyOffset = inv[2] * 0x10 + local GameDataMan = readPointer("GameDataMan") local PlayerGameData = readPointer(GameDataMan + 0x8) -local EquipInventoryData = readPointer(PlayerGameData + 0x5D0) +local EquipInventoryData = readPointer(PlayerGameData + inv[1]) + +local inventoryList = readPointer(EquipInventoryData + 0x10 + keyOffset) +local inventoryNum = readInteger(EquipInventoryData + 0x18 + keyOffset) -local inventoryList = readPointer(EquipInventoryData + 0x10) -local inventoryNum = readInteger(EquipInventoryData + 0x18) +local invName = { + [0] = "Player Inventory" + [1] = "Storage Chest" + [2] = "Key Items (Player Inventory)" + [3] = "Key Items (Storage Chest)" +} -print("---- Player Inventory ----") +print("---- "..invName[invChoice].." ----") local itemCount = 0 -for i=0,2688 do +for i=0,inv[3] do local item = getAddress(inventoryList + i * 0x18) local GaItemHandle = readInteger(item) local itemId = readInteger(item + 4) @@ -32,4 +43,3 @@ end disableMemrec(memrec) [DISABLE] - diff --git a/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/Hero/EquipInventoryData/Print Player Inventory items.xml b/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/Hero/EquipInventoryData/Print items.xml similarity index 100% rename from CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/Hero/EquipInventoryData/Print Player Inventory items.xml rename to CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/Hero/EquipInventoryData/Print items.xml diff --git a/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/MiscWIP/Dependencies/Global Functions/.xml b/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/MiscWIP/Dependencies/Global Functions/.xml index d27246bf2..91a25e553 100644 --- a/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/MiscWIP/Dependencies/Global Functions/.xml +++ b/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/MiscWIP/Dependencies/Global Functions/.xml @@ -21,5 +21,6 @@ + diff --git a/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/MiscWIP/Dependencies/Global Functions/Get functions.cea b/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/MiscWIP/Dependencies/Global Functions/Get functions.cea index dd11ca827..79597f4fa 100644 --- a/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/MiscWIP/Dependencies/Global Functions/Get functions.cea +++ b/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/MiscWIP/Dependencies/Global Functions/Get functions.cea @@ -9,7 +9,7 @@ function getInvData(value) [2] = { 0x5D0, 1, 384}, -- key items on player [3] = { 0x8D0, 1, 128} -- key items in chest } - if value ~= nil and value >= 0 and value <= 4 then + if value ~= nil and value >= 0 and value < 4 then return inv[value] else return false @@ -24,7 +24,7 @@ function getItemIdx(inputId, inv) local GameDataMan = readPointer("GameDataMan") local PlayerGameData = readPointer(GameDataMan + 0x8) - local inv = getInvData(inv) + local inv = getInvData(inv or 0) local invOffset = inv[1] local keyOffset = inv[2] * 0x10 @@ -53,7 +53,7 @@ function getItemByIdx(idx, inv) local GameDataMan = readPointer("GameDataMan") local PlayerGameData = readPointer(GameDataMan + 0x8) - local inv = getInvData(inv) + local inv = getInvData(inv or 0) local invOffset = inv[1] local keyOffset = inv[2] * 0x10 diff --git a/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/MiscWIP/Dependencies/Global Functions/GetThingName_Code.cea b/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/MiscWIP/Dependencies/Global Functions/GetThingName_code.cea similarity index 57% rename from CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/MiscWIP/Dependencies/Global Functions/GetThingName_Code.cea rename to CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/MiscWIP/Dependencies/Global Functions/GetThingName_code.cea index 3debbbba6..3014bfa30 100644 --- a/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/MiscWIP/Dependencies/Global Functions/GetThingName_Code.cea +++ b/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/MiscWIP/Dependencies/Global Functions/GetThingName_code.cea @@ -1,6 +1,59 @@ {$lua} if syntaxcheck then return end [ENABLE] +ThingName = {} + +function ThingName:new(pName, length, fallback) + local o = {} + setmetatable(o, self) + self.__index = self + local str = fallback and tostring(fallback) or "?ThingName?" + self.fallback = str + if pName ~= nil then + local read = readString(pName, length, true) + if read ~= nil then + str = read + self.ptr = pName + end + end + self.length = str:len() + return o +end + +function ThingName:len() + return self.length +end + +function ThingName:default() + return self.fallback +end + +function ThingName:read() + if self:len() <= 0 then + return "" + end + return self.ptr and tga.readWCStr(self.ptr, self.length) or self:default() +end + +ThingName.__tostring = ThingName.read + +function ThingName:write(name) + name = name and tostring(name) + if name == nil then return end + local len = self.length - string.len(name) + if len > 0 then + -- pad with spaces (or we lose null terminated length information) + name = table.concat{name, string.rep(" ", len)} + end + -- already does boundary checking + tga.writeWCStr(self.ptr, name, self.length) +end + +-- minimal buffer size in bytes to store the name or its default +function ThingName:buf() + return (math.max(self.length, self.fallback:len()) + 1) * 2 +end + local function findByFmgIndex(fmgIndex, id) if fmgIndex < 0 or fmgIndex >= 512 or id < 0 then return nil @@ -59,48 +112,45 @@ local function findInFmgs(fmgIndexTable, id) return nil end -local function getThingName(fmgIndices, id, length, default) - if type(id) ~= "number" then return default end +local function getThingName(fmgIndices, id, length, fallback) local pName = findInFmgs(fmgIndices, id) - if pName ~= nil then - return readString(pName, length, true) - end - return default + return ThingName:new(pName, length, fallback) end function getGoodsName(goodsId) - return getThingName({111, 10, 319, 419}, goodsId, 128, "?GoodsName?") + return getThingName({111, 10, 319, 419}, goodsId, 256, "?GoodsName?") end function getWeaponName(weaponId) - return getThingName({115, 11, 310, 410}, weaponId, 128, "?WeaponName?") + return getThingName({115, 11, 310, 410}, weaponId, 256, "?WeaponName?") end function getProtectorName(protectorId) - return getThingName({117, 12, 313, 413}, protectorId, 128, "?ProtectorName?") + return getThingName({117, 12, 313, 413}, protectorId, 256, "?ProtectorName?") end function getAccessoryName(accessoryId) - return getThingName({113, 13, 316, 416}, accessoryId, 128, "?AccessoryName?") + return getThingName({113, 13, 316, 416}, accessoryId, 256, "?AccessoryName?") end function getMagicName(magicId) - return getThingName({118, 14, 325, 425}, magicId, 128, "?MagicName?") + return getThingName({118, 14, 325, 425}, magicId, 256, "?MagicName?") end function getArtsName(artsId) - return getThingName({42, 331, 431}, artsId, 128, "?ArtsName?") + return getThingName({42, 331, 431}, artsId, 256, "?ArtsName?") end function getNpcName(npcId) - return getThingName({119, 18, 328, 428}, npcId, 128, "?NpcName?") + return getThingName({119, 18, 328, 428}, npcId, 256, "?NpcName?") end function getPlaceName(placeId) - return getThingName({120, 19, 329, 429}, placeId, 128, "?PlaceName?") + return getThingName({120, 19, 329, 429}, placeId, 256, "?PlaceName?") end [DISABLE] +ThingName = nil getGoodsName = nil getWeaponName = nil getProtectorName = nil diff --git a/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/MiscWIP/Dependencies/Global Functions/GetThingName_Code.xml b/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/MiscWIP/Dependencies/Global Functions/GetThingName_code.xml similarity index 66% rename from CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/MiscWIP/Dependencies/Global Functions/GetThingName_Code.xml rename to CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/MiscWIP/Dependencies/Global Functions/GetThingName_code.xml index 91ef7939a..74fa3f2a6 100644 --- a/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/MiscWIP/Dependencies/Global Functions/GetThingName_Code.xml +++ b/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/MiscWIP/Dependencies/Global Functions/GetThingName_code.xml @@ -1,5 +1,5 @@ 108255 - "GetThingName_Code" + "GetThingName_code" Auto Assembler Script diff --git a/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/MiscWIP/Dependencies/Global Functions/RemoveItem_code.cea b/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/MiscWIP/Dependencies/Global Functions/RemoveItem_code.cea index d61a1250e..874b01cc0 100644 --- a/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/MiscWIP/Dependencies/Global Functions/RemoveItem_code.cea +++ b/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/MiscWIP/Dependencies/Global Functions/RemoveItem_code.cea @@ -6,7 +6,7 @@ local func_addr = AOBScanModuleUnique(process,"?? 83 ec ?? 8b f2 ?? 8b e9 ?? 85 function RemoveItem(idx, inv) local GameDataMan = readPointer("GameDataMan") local PlayerGameData = readPointer(GameDataMan + 8) - inv = getInvData(inv) + inv = getInvData(inv or 0) local EquipInventoryData = readPointer(PlayerGameData + inv[1]) local tailDataIdx = readInteger(EquipInventoryData + 0x1C + inv[2] * 0x10) return executeCodeEx(0, 100, func_addr, EquipInventoryData, idx + tailDataIdx, 1) diff --git a/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/MiscWIP/Dependencies/Global Functions/equipItem_code.cea b/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/MiscWIP/Dependencies/Global Functions/equipItem_code.cea index 3a05336ea..462720f10 100644 --- a/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/MiscWIP/Dependencies/Global Functions/equipItem_code.cea +++ b/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/MiscWIP/Dependencies/Global Functions/equipItem_code.cea @@ -22,6 +22,15 @@ function equipItem(slot, invIdx) return false end + local function getItemIfMissing(id) + local idx = getItemIdx(id) + if not idx then + ItemGive(id) + return getItemIdx(id) + end + return idx + end + local GameDataMan = readPointer("GameDataMan") local PlayerGameData = readPointer(GameDataMan + 0x8) local EquipGameData = PlayerGameData + 0x2B0 @@ -40,31 +49,20 @@ function equipItem(slot, invIdx) local protector_type = 0x10000000 if slot <= 5 then item = 110000 - invIdx = getItemIdx(item) elseif slot == 12 then item = 10000 + protector_type - invIdx = getItemIdx(item) elseif slot == 13 then item = 10100 + protector_type - invIdx = getItemIdx(item) elseif slot == 14 then item = 10200 + protector_type - invIdx = getItemIdx(item) elseif slot == 15 then item = 10300 + protector_type - invIdx = getItemIdx(item) - else invIdx = 0xFFFFFFFF tailDataIdx = 0 end - - if not invIdx then - local e = "Item not found" - print(e) - error(e, 2) - end - + if invIdx ~= 0xFFFFFFFF then invIdx = getItemIfMissing(item) end + if not invIdx then throwError("Item not found") end writeInteger(equipItem_data + 0x10, item) end @@ -79,4 +77,4 @@ end deAlloc(equipItem_data) equipItem_data = nil equipItem = nil -unequipItem = nil +unequipItem = nil \ No newline at end of file diff --git a/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/MiscWIP/Dependencies/Global Functions/tgaMemory_code.cea b/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/MiscWIP/Dependencies/Global Functions/tgaMemory_code.cea new file mode 100644 index 000000000..0cfb821fb --- /dev/null +++ b/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/MiscWIP/Dependencies/Global Functions/tgaMemory_code.cea @@ -0,0 +1,125 @@ +{$lua} +if syntaxcheck then return end +[ENABLE] +tga = tga or {} + +-- read the n-th bit starting at an address (integer or CEAddressString) +-- and return its numeric value or nil on failure +function tga.readBit(address, bit) + if type(bit) ~= "number" then + return nil + end + local index = bit >> 3 + if type(address) == "number" then + address = address + index + elseif type(address) == "string" then + address = string.format("%s+%x", address, index) + else + return nil + end + -- test(mem[bit / 8], bit % 8) + local byte = readByte(address) + return byte + and (byte >> (bit & 7)) & 1 + or nil +end + +-- set the n-th bit starting at an address (integer or CEAddressString) +-- to a numeric value of 0 or 1 or 1 for a truthy input and 0 otherwise +function tga.writeBit(address, bit, value) + if type(bit) ~= "number" then + return + end + local index = bit >> 3 + if type(address) == "number" then + address = address + index + elseif type(address) == "string" then + address = string.format("%s+%x", address, index) + else + return + end + local byte = readByte(address) + if byte ~= nil then + local set = 1 << (bit & 7) + -- map 0 => false + value = value and value ~= 0 + writeByte(address, + value + and byte | set + or byte & ~set) + end +end + +-- read count >= 0 characters at address from a null terminated +-- char string, excluding the null terminator and return a lua +-- string or nil on failure +function tga.readCStr(address, count) + if type(count) ~= "number" then + return nil + end + count = count // 1 + return count >= 0 + and readString(address, count, false) + or nil +end + +-- read count >= 0 characters at address from a null terminated +-- wchar string, excluding the null terminator and return a lua +-- string or nil on failure +function tga.readWCStr(address, count) + if type(count) ~= "number" then + return nil + end + count = (count // 1) * 2 + return count >= 0 + and readString(address, count, true) + or nil +end + +-- copy characters from a lua string to a null terminated +-- char string up to its length or count >= 0 as the capacity +-- of the target in characters and append a null terminator +-- +-- count does not include the null terminator, e.g. +-- the capacity of the char string "Start" is 5 +function tga.writeCStr(address, str, count) + if type(count) ~= "number" or count < 0 then + error("invalid character count") + end + str = stringToByteTable(str) + if str == nil then + return + end + -- add the null terminator and truncate if needed + count = math.min(count // 1, #str) + 1 + str[count] = 0 + for i = count + 1, #str do + str[i] = nil + end + writeBytes(address, str) +end + +-- copy characters from a lua string to a null terminated +-- wchar string up to its length or count >= 0 as the capacity +-- of the target in characters and append a null terminator +-- +-- count does not include the null terminator, e.g. +-- the capacity of the wchar string L"Start" is 5 +function tga.writeWCStr(address, str, count) + if type(count) ~= "number" or count < 0 then + error("invalid character count") + end + str = wideStringToByteTable(str) + if str == nil then + return + end + -- add the null terminator and truncate if needed + count = math.min((count // 1) * 2, #str) + 2 + str[count] = 0; str[count - 1] = 0 + for i = count + 1, #str do + str[i] = nil + end + writeBytes(address, str) +end + +[DISABLE] \ No newline at end of file diff --git a/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/Hero/EquipInventoryData/Print Storage Chest items.xml b/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/MiscWIP/Dependencies/Global Functions/tgaMemory_code.xml similarity index 51% rename from CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/Hero/EquipInventoryData/Print Storage Chest items.xml rename to CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/MiscWIP/Dependencies/Global Functions/tgaMemory_code.xml index bfe4c2b54..6501ea7e2 100644 --- a/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/Hero/EquipInventoryData/Print Storage Chest items.xml +++ b/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/MiscWIP/Dependencies/Global Functions/tgaMemory_code.xml @@ -1,5 +1,5 @@ - 100604 - "Print Storage Chest items" + 108256 + "tgaMemory_code" Auto Assembler Script diff --git a/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/MiscWIP/Dropdowns/GOODS_ID.xml b/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/MiscWIP/Dropdowns/GOODS_ID.xml index 6b47da75a..8230f8490 100644 --- a/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/MiscWIP/Dropdowns/GOODS_ID.xml +++ b/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/MiscWIP/Dropdowns/GOODS_ID.xml @@ -2113,6 +2113,7 @@ 2219000:Swordhand of Night Jolán 2220000:Jolán and Anna 999999999:?GoodsName? +268435455: 1 diff --git a/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/MiscWIP/Dropdowns/ItemDropdownDLC.xml b/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/MiscWIP/Dropdowns/ItemDropdownDLC.xml index 54fa2ac71..c13753e95 100644 --- a/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/MiscWIP/Dropdowns/ItemDropdownDLC.xml +++ b/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/MiscWIP/Dropdowns/ItemDropdownDLC.xml @@ -30,6 +30,7 @@ 001FBD00:Nox Flowing Sword 001FE410:Inseparable Sword 00203230:Coded Sword +0090F560:Sword of Night 0020A760:Sword of Night and Flame 0020CE70:Crystal Sword 002143A0:Carian Knight's Sword @@ -469,7 +470,6 @@ 0081B320:Putrescence Cleaver 0081DA30:Freyja's Greatsword 00820140:Horned Warrior's Greatsword -0090F560:Sword of Night 00A037A0:Euporia 00A05EB0:Black Steel Twinblade 00AF79E0:Flowerstone Gavel diff --git a/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/MiscWIP/Dropdowns/WEAPON_ID.xml b/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/MiscWIP/Dropdowns/WEAPON_ID.xml index 96acbf2a8..3b1b7b5ce 100644 --- a/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/MiscWIP/Dropdowns/WEAPON_ID.xml +++ b/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/MiscWIP/Dropdowns/WEAPON_ID.xml @@ -274,6 +274,7 @@ 2090000:Inseparable Sword 2092000:?WeaponName? 2110000:Coded Sword +9500000:Sword of Night 2140000:Sword of Night and Flame 2150000:Crystal Sword 2180000:Carian Knight's Sword @@ -891,7 +892,6 @@ 9081000:Poison Serpentbone Blade 9081100:Blood Serpentbone Blade 9081200:Occult Serpentbone Blade -9500000:Sword of Night 9900000:?WeaponName? 9910000:?WeaponName? 9911000:?WeaponName? diff --git a/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/Scripts/Helpers/Last Protector Highlighted/Start/Model Masks/.xml b/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/Scripts/Helpers/Last Protector Highlighted/Start/Model Masks/.xml index 56e19106e..9350a45e2 100644 --- a/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/Scripts/Helpers/Last Protector Highlighted/Start/Model Masks/.xml +++ b/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/Scripts/Helpers/Last Protector Highlighted/Start/Model Masks/.xml @@ -6,7 +6,7 @@ 0 Array of byte 0 -
+130
+
+132
diff --git a/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/Scripts/Seamless Co-op/.xml b/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/Scripts/Seamless Co-op/.xml index f561c4080..1f036cf17 100644 --- a/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/Scripts/Seamless Co-op/.xml +++ b/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/Scripts/Seamless Co-op/.xml @@ -6,5 +6,6 @@ + diff --git a/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/Scripts/Seamless Co-op/Ranni's Tower Fix.cea b/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/Scripts/Seamless Co-op/Ranni's Tower Fix.cea new file mode 100644 index 000000000..a0ef292db --- /dev/null +++ b/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/Scripts/Seamless Co-op/Ranni's Tower Fix.cea @@ -0,0 +1,65 @@ +{$lua} +if syntaxcheck then return end +[ENABLE] +local flagsBaseOn = { +-- Choosing to enter Ranni's service +1034509410, +1034509412, +1034500738, +1034500732, +1034500736, +1034505015, +1034509361, +1034500715, +1034500710, +1034500700, +1034490701, +1034490700, +1034509413, +1034509418, + +-- Exhausting Iji's dialogue in Ranni's Rise +1034509355, +1034509357, +1034509358, + +-- Exhausting Blaidd's dialogue in Ranni's Rise +1034509205, +1045379208, + +-- Exhausting Seluvis' dialogue in Ranni's Rise +1034509305, +1034509306, + +-- Exhausting all 3 dialogues activating Ranni's next dialogue/step +1034509417, +1034500734, + +-- Exhausting Ranni's dialogue after talking to all 3 spirits +1034509416, +1034500739, +1034500733, +1034502610, +1034505002, +1034505003, +1034505004, +1034500716, +1034503600, +} + +local flagsOn = {flagsBaseOn} +local flagsOff = 1034500738 -- Toggled on when choosing to enter, and off when exhausting dialogue +ef.batchSetFlags(flagsOn, 1, "RanniFlagsThread") + +local t = createTimer(nil) +t.interval = 100 +t.onTimer = function (t) + if function() return not ef.RanniFlagsThread end then + ef.setFlag(flagsOff, 0) + -- lua_warp(1034502950) -- [Liurnia of the Lakes] Ranni's Rise. Not necessary, works instantly without it + disableMemrec(memrec) + end +end +[DISABLE] +ef.RanniFlagsThread = false +t.destroy() \ No newline at end of file diff --git a/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/Scripts/Seamless Co-op/Ranni's Tower Fix.xml b/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/Scripts/Seamless Co-op/Ranni's Tower Fix.xml new file mode 100644 index 000000000..a2485ddb2 --- /dev/null +++ b/CheatTable/CheatEntries/Open - The Grand Archives - Elden Ring/Scripts/Seamless Co-op/Ranni's Tower Fix.xml @@ -0,0 +1,5 @@ + + 106156 + "Ranni's Tower Fix" + Auto Assembler Script + diff --git a/README.md b/README.md index 75c258e74..fe5d11002 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ If it doesn't work, try this [alternative invite](https://discord.gg/2RTW6BFgeX) ### Requirements Cheat Engine: [7.4](https://github.com/cheat-engine/cheat-engine/releases/7.4) -Game: App ver. 1.12.3 +Game: App ver. 1.14 ## How to use