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