Skip to content

Commit

Permalink
Support 27-bit reference chain offsets
Browse files Browse the repository at this point in the history
  • Loading branch information
colinator27 committed Dec 4, 2022
1 parent 39d6cf0 commit c897860
Showing 1 changed file with 9 additions and 8 deletions.
17 changes: 9 additions & 8 deletions UndertaleModLib/Models/UndertaleCode.cs
Original file line number Diff line number Diff line change
Expand Up @@ -213,23 +213,23 @@ public Reference(T target, VariableType type)

public Reference(int int32Value)
{
NextOccurrenceOffset = (uint)int32Value & 0x00FFFFFF;
Type = (VariableType)(int32Value >> 24);
NextOccurrenceOffset = (uint)int32Value & 0x07FFFFFF;
Type = (VariableType)((int32Value >> 24) & 0xF8);
}

/// <inheritdoc />
public void Serialize(UndertaleWriter writer)
{
NextOccurrenceOffset = 0xdead;
writer.WriteUInt24(NextOccurrenceOffset);
writer.Write((byte)Type);
writer.Write((NextOccurrenceOffset & 0x07FFFFFF) | (((uint)Type & 0xF8) << 24));
}

/// <inheritdoc />
public void Unserialize(UndertaleReader reader)
{
NextOccurrenceOffset = reader.ReadUInt24();
Type = (VariableType)reader.ReadByte();
int int32Value = reader.ReadInt32();
NextOccurrenceOffset = (uint)int32Value & 0x07FFFFFF;
Type = (VariableType)((int32Value >> 24) & 0xF8);
}

/// <inheritdoc />
Expand Down Expand Up @@ -289,8 +289,9 @@ public static void SerializeReferenceChain(UndertaleWriter writer, IList<Underta
}
else
addrDiff = var.NameStringID;
writer.Position = writer.GetAddressForUndertaleObject(references[var][i].GetReference<T>());
writer.WriteInt24(addrDiff);
Reference<T> thisRef = references[var][i].GetReference<T>();
writer.Position = writer.GetAddressForUndertaleObject(thisRef);
writer.Write((addrDiff & 0x07FFFFFF) | (((int)thisRef.Type & 0xF8) << 24));
}
}
else
Expand Down

0 comments on commit c897860

Please sign in to comment.