public static Furniture.Flag FillBinaryFlags2(IMutagenReadStream stream, Func <int, FurnitureMarker> getter, Furniture.Flag?existingFlag) { var subFrame = stream.ReadSubrecordFrame(); uint raw = BinaryPrimitives.ReadUInt32LittleEndian(subFrame.Content); // Clear out upper bytes of existing flags var curFlags = (uint)(existingFlag ?? 0); curFlags &= ~UpperFlagsMask; // Add in new upper flags uint upperFlags = raw & UpperFlagsMask; var ret = (Furniture.Flag)(curFlags | upperFlags); // Create marker objects for sit flags uint markers = raw & 0x00FF_FFFF; uint indexToCheck = 1; for (int i = 0; i < NumSits; i++) { var has = EnumExt.HasFlag(markers, indexToCheck); indexToCheck <<= 1; if (!has) { continue; } var marker = getter(i); marker.Enabled = true; } return(ret); }
public static void FillCloudTexture(IMutagenReadStream stream, RecordType nextRecordType, string?[] textures) { int layer = nextRecordType.TypeInt - TextureIntBase; if (layer > 29 || layer < 0) { throw new ArgumentException(); } var subRec = stream.ReadSubrecordFrame(); textures[layer] = BinaryStringUtility.ProcessWholeToZString(subRec.Content, stream.MetaData.Encodings.NonTranslated); }
public static ExtendedList<IFormLinkGetter<IIdleAnimationGetter>> ParseAnimations(IMutagenReadStream stream) { var subFrame = stream.ReadSubrecordFrame(); var ret = new ExtendedList<IFormLinkGetter<IIdleAnimationGetter>>(); int pos = 0; while (pos < subFrame.Content.Length) { ret.Add( new FormLink<IIdleAnimationGetter>( FormKeyBinaryTranslation.Instance.Parse(subFrame.Content.Slice(pos), stream.MetaData.MasterReferences!))); pos += 4; } return ret; }
public void PerkStringHandler( IMutagenReadStream stream, MajorRecordHeader major, BinaryFileProcessor.ConfigConstructor instr, List <KeyValuePair <uint, uint> > processedStrings, IStringsLookup overlay, ref uint newIndex) { var majorCompletePos = stream.Position + major.ContentLength; long?lastepft = null; while (stream.Position < majorCompletePos) { var sub = stream.GetSubrecord(); switch (sub.RecordTypeInt) { case RecordTypeInts.FULL: case RecordTypeInts.EPF2: AStringsAlignment.ProcessStringLink(stream, instr, processedStrings, overlay, ref newIndex); break; case RecordTypeInts.EPFT: lastepft = stream.Position; break; case RecordTypeInts.EPFD: var pos = stream.Position; stream.Position = lastepft.Value; var epftFrame = stream.ReadSubrecordFrame(); if (epftFrame.Content[0] == (byte)APerkEntryPointEffect.ParameterType.LString) { stream.Position = pos; AStringsAlignment.ProcessStringLink(stream, instr, processedStrings, overlay, ref newIndex); } stream.Position = pos; break; default: break; } stream.Position += sub.TotalLength; } }