{"format":"sotn-holy-water-green-particles-static-v1","originalDiscVersion":"SLUS-00067","decoderReferenceCommit":"0622fcfd37311fd21baf2938c6bd74cea63005ba","name":"func_8011E4BC","entityId":5,"profileIndex":7,"particleFields":[8,63,240,63,1,1,4,115,3,142606336],"profileFields10":[8,63,240,63,1,1,4,115,3,142606336],"particleFieldNames":["count","r","g","b","w","h","priority","drawMode","behavior","flags"],"factoryBlueprint":[5,1,193,0,0,0],"factoryBlueprint6":[5,1,193,0,0,0],"profileDefinition":{"sourceFile":"DRA.BIN","pointerTableOffset":56216,"entryOffset":56244,"pointer":"0x800adb18","recordOffset":56088,"recordBytes":16,"rawBytesHex":"083ff03f010104007300030000008008","sourceStruct":"unkStr_8011E4BC","behaviorSourceFieldName":"unkA"},"factory":{"sourceFile":"DRA.BIN","blueprintId":4,"offset":53740,"rawBytesHex":"0501c1000000","packedFactoryFlags":458756,"factoryArgumentParams":7,"actualChildParams":1792,"actualChildProfileIndexFormula":"child.params>>8","childEntityId":5,"callbackTableOffset":53464,"callbackPointer":"0x8011e4bc","kind":0,"kindRangeTableOffset":54456,"kindRangeRawBytesHex":"203f","firstEntitySlot":32,"endEntitySlotExclusive":64,"allocationOrder":"reverse","parentReferenceRetained":true,"sourceOriginYOffset":-10,"sourceFlameOriginRestoredAfterFactoryCall":true},"render":{"primitiveAllocationType":17,"primitiveAllocationTypeName":"PRIM_TILE_ALT","drawablePrimitiveType":17,"terminalPrimitiveType":1,"allocatedPrimitiveCount":9,"drawableCount":8,"contiguousPrimitiveAllocation":true,"zeroWidthControlPrimitiveIndex":8,"zeroWidthControlPrimitiveRgbUnassigned":true,"terminalCoordinates":[0,0],"terminalWidth":0,"sourcePrimitivePaintOrder":[8,7,6,5,4,3,2,1,0],"drawablePaintOrder":[7,6,5,4,3,2,1,0],"width":1,"height":1,"priorityRelativeToPlayer":4,"drawMode":115,"drawStatePageBits":96,"abr":3,"semitransparent":true,"rgbBytes":[63,240,63],"rgb5":[7,30,7],"quarterForegroundRgb5":[1,7,1],"quarterForegroundRgb8":[8,57,8],"allTilesUseBlendWithoutStp":true,"untextured":true,"noRasterTextureRequired":true,"paletteRequired":false,"ditheringRequested":false,"colorByteToRgb5":"sourceByte>>3","quarterContributionToRgb5":"foregroundRgb5>>2","color8Expansion":"floor(channel5*255/31)","terminalDrawStatePrecedesAltTilesThroughLifo":true,"canvasNote":"Integer1-by1 fills preserve flat geometry. The prepared quarter foreground contribution matches originalRGB5 integerdivision; Canvaslighter still approximates background RGB555 quantization and saturation."},"behavior":{"sourceBehavior":3,"initialFlags":142606336,"initialLifetime":31,"lifetimeDecrementsPerMovementCall":2,"doubleDecrementSourceReason":"case7 falls through into case5/6","motionUpdateCount":15,"destroyingUpdateCall":16,"initMovesParticles":false,"allocatesBeforeRng":true,"rngCallsOnSuccessfulInit":24,"rngCallsPerParticle":3,"rngCallOrder":["xOffset","yOffset","velocityY"],"xRandomMask":15,"xRandomBias":-7,"xOffsetInclusiveRange":[-7,8],"yRandomMask":31,"yOffsetFormula":"-(rand()&31)","yOffsetInclusiveRange":[-31,0],"velocityYBaseFixed":-49152,"velocityYRandomMask":32767,"velocityYFormula":"-49152-(rand()&32767)","velocityYInclusiveRangeFixed":[-81919,-49152],"delayBase":15,"delayStep":2,"delayFormula":"sourcePrimitiveIndex*2+15","delayIsSigned":true,"hideWhenDecrementedDelayBelow":0,"horizontalVelocityInheritedFromParent":true,"horizontalVelocityIntegrated":false,"verticalVelocityIntegrated":true,"gravityFixed":0,"rgbChangesDuringSelectedBehavior":false,"sizeChangesDuringSelectedBehavior":false,"fractionalPositionZeroedAtInit":true,"fractionRetainedOnHighHalfResync":true,"allSelectedTilesRemainVisibleUntilEntityDestroy":true,"noCollisionOrHitbox":true,"parentEntityCanBeDestroyedBeforeParticleExpiry":true,"rngProofMetadata":"holy-water-attack.json#rng","sharedRngConsumptionRequiresRegistration":true,"otherParticleProfilesImplemented":false},"code":{"selectedRoutine":{"sourceFile":"DRA.BIN","name":"func_8011E4BC","startOffset":517308,"endOffsetExclusive":519584,"bytes":2276,"sha256":"a19d5535ef6584847b599b170d27e0f23079b875d4d9fa7a84b42db939a6a636","reference":"https://github.com/Xeeynamo/sotn-decomp/blob/0622fcfd37311fd21baf2938c6bd74cea63005ba/src/dra/7E4BC.c"},"contiguousAllocator":{"sourceFile":"DRA.BIN","name":"func_800EDB58","startOffset":318296,"endOffsetExclusive":318592,"bytes":296,"sha256":"aabad16791a82ba3ab27257d8635b8f965bf7a8f194dac4085f149d29387c7a6","reference":"https://github.com/Xeeynamo/sotn-decomp/blob/0622fcfd37311fd21baf2938c6bd74cea63005ba/src/dra/4DA70.c"}},"observedBinaryInstructions":[{"sourceFile":"DRA.BIN","offset":517376,"runtimeAddress":"0x8011e500","word":"0x28202","littleEndianBytes":"02820200","fact":"params upper8 selects profile"},{"sourceFile":"DRA.BIN","offset":517392,"runtimeAddress":"0x8011e510","word":"0x8c35db98","littleEndianBytes":"98db358c","fact":"profile pointertableDB98"},{"sourceFile":"DRA.BIN","offset":517440,"runtimeAddress":"0x8011e540","word":"0x34040011","littleEndianBytes":"11000434","fact":"allocator primitiveTypeTILE_ALT17"},{"sourceFile":"DRA.BIN","offset":517444,"runtimeAddress":"0x8011e544","word":"0xc03b6d6","littleEndianBytes":"d6b6030c","fact":"contiguous allocatorfunc800EDB58 before RNG"},{"sourceFile":"DRA.BIN","offset":517448,"runtimeAddress":"0x8011e548","word":"0x24a50001","littleEndianBytes":"0100a524","fact":"alloc count equals original count+1"},{"sourceFile":"DRA.BIN","offset":517456,"runtimeAddress":"0x8011e550","word":"0x1043018d","littleEndianBytes":"8d014310","fact":"allocation failure skips all initializer RNG"},{"sourceFile":"DRA.BIN","offset":517564,"runtimeAddress":"0x8011e5bc","word":"0x3402001f","littleEndianBytes":"1f000234","fact":"params7 initial timer31"},{"sourceFile":"DRA.BIN","offset":517540,"runtimeAddress":"0x8011e5a4","word":"0xa240000c","littleEndianBytes":"0c0040a2","fact":"terminal zero width"},{"sourceFile":"DRA.BIN","offset":517548,"runtimeAddress":"0x8011e5ac","word":"0xa640000a","littleEndianBytes":"0a0040a6","fact":"terminal integer Y0"},{"sourceFile":"DRA.BIN","offset":517552,"runtimeAddress":"0x8011e5b0","word":"0x3042fff7","littleEndianBytes":"f7ff4230","fact":"terminal hide bit cleared"},{"sourceFile":"DRA.BIN","offset":517652,"runtimeAddress":"0x8011e614","word":"0xa6570012","littleEndianBytes":"120057a6","fact":"particle integer X from actor"},{"sourceFile":"DRA.BIN","offset":517660,"runtimeAddress":"0x8011e61c","word":"0xa6400014","littleEndianBytes":"140040a6","fact":"initializer discards low Y fraction"},{"sourceFile":"DRA.BIN","offset":517664,"runtimeAddress":"0x8011e620","word":"0xa6400010","littleEndianBytes":"100040a6","fact":"initializer discards low X fraction"},{"sourceFile":"DRA.BIN","offset":518080,"runtimeAddress":"0x8011e7c0","word":"0xc005839","littleEndianBytes":"3958000c","fact":"behavior3 first RNG X"},{"sourceFile":"DRA.BIN","offset":518088,"runtimeAddress":"0x8011e7c8","word":"0x3042000f","littleEndianBytes":"0f004230","fact":"X jitter mask15"},{"sourceFile":"DRA.BIN","offset":518096,"runtimeAddress":"0x8011e7d0","word":"0x2442fff9","littleEndianBytes":"f9ff4224","fact":"X jitter subtract7"},{"sourceFile":"DRA.BIN","offset":518100,"runtimeAddress":"0x8011e7d4","word":"0xc005839","littleEndianBytes":"3958000c","fact":"behavior3 second RNG Y"},{"sourceFile":"DRA.BIN","offset":518108,"runtimeAddress":"0x8011e7dc","word":"0x3042001f","littleEndianBytes":"1f004230","fact":"Y jitter mask31"},{"sourceFile":"DRA.BIN","offset":518116,"runtimeAddress":"0x8011e7e4","word":"0xc005839","littleEndianBytes":"3958000c","fact":"behavior3 third RNG velocityY"},{"sourceFile":"DRA.BIN","offset":518128,"runtimeAddress":"0x8011e7f0","word":"0x34634000","littleEndianBytes":"00406334","fact":"negative.75 base FFFF4000"},{"sourceFile":"DRA.BIN","offset":518132,"runtimeAddress":"0x8011e7f4","word":"0x30427fff","littleEndianBytes":"ff7f4230","fact":"velocity RNG mask32767"},{"sourceFile":"DRA.BIN","offset":518136,"runtimeAddress":"0x8011e7f8","word":"0x621823","littleEndianBytes":"23186200","fact":"velocityY negative base minus RNG"},{"sourceFile":"DRA.BIN","offset":518168,"runtimeAddress":"0x8011e818","word":"0xae420018","littleEndianBytes":"180042ae","fact":"optional parent velocityX copied"},{"sourceFile":"DRA.BIN","offset":518176,"runtimeAddress":"0x8011e820","word":"0x2442000f","littleEndianBytes":"0f004224","fact":"particle delay2*i+15"},{"sourceFile":"DRA.BIN","offset":518648,"runtimeAddress":"0x8011e9f8","word":"0x2442ffff","littleEndianBytes":"ffff4224","fact":"FIRST actor timer decrement"},{"sourceFile":"DRA.BIN","offset":518660,"runtimeAddress":"0x8011ea04","word":"0x10400060","littleEndianBytes":"60004010","fact":"FIRST zero return branch precedes movement"},{"sourceFile":"DRA.BIN","offset":518676,"runtimeAddress":"0x8011ea14","word":"0x2442ffff","littleEndianBytes":"ffff4224","fact":"SECOND timer decrement via source case fallthrough"},{"sourceFile":"DRA.BIN","offset":518692,"runtimeAddress":"0x8011ea24","word":"0x1440000a","littleEndianBytes":"0a004014","fact":"SECOND zero check before motion"},{"sourceFile":"DRA.BIN","offset":518816,"runtimeAddress":"0x8011eaa0","word":"0x1040ffe4","littleEndianBytes":"e4ff4010","fact":"terminal branch skips movement"},{"sourceFile":"DRA.BIN","offset":519156,"runtimeAddress":"0x8011ebf4","word":"0x8e420014","littleEndianBytes":"1400428e","fact":"behavior3 reads old Y"},{"sourceFile":"DRA.BIN","offset":519168,"runtimeAddress":"0x8011ec00","word":"0x441021","littleEndianBytes":"21104400","fact":"behavior3 adds constant velocityY only"},{"sourceFile":"DRA.BIN","offset":519172,"runtimeAddress":"0x8011ec04","word":"0x2463ffff","littleEndianBytes":"ffff6324","fact":"particle delay decrement"},{"sourceFile":"DRA.BIN","offset":519184,"runtimeAddress":"0x8011ec10","word":"0x461004f","littleEndianBytes":"4f006104","fact":"hide only on signed negative delay"},{"sourceFile":"DRA.BIN","offset":519188,"runtimeAddress":"0x8011ec14","word":"0xae420014","littleEndianBytes":"140042ae","fact":"Y movement committed in delay slot"},{"sourceFile":"DRA.BIN","offset":318400,"runtimeAddress":"0x800edbc0","word":"0x2a220400","littleEndianBytes":"0004222a","fact":"original contiguous allocator scans1024 records"},{"sourceFile":"DRA.BIN","offset":318504,"runtimeAddress":"0x800edc28","word":"0xa2160007","littleEndianBytes":"070016a2","fact":"allocator sets supplied primitive type"},{"sourceFile":"DRA.BIN","offset":318536,"runtimeAddress":"0x800edc48","word":"0xae00ffcc","littleEndianBytes":"ccff00ae","fact":"terminal next pointer NULL"},{"sourceFile":"DRA.BIN","offset":318540,"runtimeAddress":"0x800edc4c","word":"0x306300ef","littleEndianBytes":"ef006330","fact":"terminal primitive type clears ALT bit10"},{"sourceFile":"DRA.BIN","offset":549908,"runtimeAddress":"0x80126414","word":"0x2442fff6","littleEndianBytes":"f6ff4224","fact":"flame copies origin Yminus10 for BP4 child"},{"sourceFile":"DRA.BIN","offset":549912,"runtimeAddress":"0x80126418","word":"0xc046abf","littleEndianBytes":"bf6a040c","fact":"flame creates secondary factory"},{"sourceFile":"DRA.BIN","offset":549932,"runtimeAddress":"0x8012642c","word":"0x2442000a","littleEndianBytes":"0a004224","fact":"flame restores Yplus10"},{"sourceFile":"DRA.BIN","offset":549888,"runtimeAddress":"0x80126400","word":"0x34a50004","littleEndianBytes":"0400a534","fact":"flame FACTORY4/params7"},{"sourceFile":"DRA.BIN","offset":549872,"runtimeAddress":"0x801263f0","word":"0xc0468a4","littleEndianBytes":"a468040c","fact":"flame damage helper call precedes secondary factory queue"},{"sourceFile":"DRA.BIN","offset":549884,"runtimeAddress":"0x801263fc","word":"0x3c050007","littleEndianBytes":"0700053c","fact":"factory params7 upper16"},{"sourceFile":"DRA.BIN","offset":549916,"runtimeAddress":"0x8012641c","word":"0xa6620006","littleEndianBytes":"060062a6","fact":"origin Yminus10 is stored in factory call delay slot"},{"sourceFile":"DRA.BIN","offset":549936,"runtimeAddress":"0x80126430","word":"0xc005839","littleEndianBytes":"3958000c","fact":"height RNG call follows secondary factory queue"},{"sourceFile":"DRA.BIN","offset":549940,"runtimeAddress":"0x80126434","word":"0xa6620006","littleEndianBytes":"060062a6","fact":"origin Yplus10 is stored in height RNG delay slot"}],"emitterOrder":{"sourceFile":"DRA.BIN","flameDamageHelperCallOffset":549872,"packedFactoryFlagsInstructions":[549884,549888],"originMinus10Offset":549908,"factoryCallOffset":549912,"factoryOriginStoreDelaySlotOffset":549916,"originPlus10Offset":549932,"heightRandCallOffset":549936,"heightOriginStoreDelaySlotOffset":549940,"factoryQueuedBeforeHeightRng":true,"particleRngOccursAtLaterChildInit":true},"independentBinaryEvidence":"../references/green-particles-evidence.json","sourceHashes":{"DRA.BIN":"6cb1383b5b94e0bcad041af9856853907226091c184071917a739b91734af66b"},"references":["https://github.com/Xeeynamo/sotn-decomp/blob/0622fcfd37311fd21baf2938c6bd74cea63005ba/src/dra/7E4BC.c","https://github.com/Xeeynamo/sotn-decomp/blob/0622fcfd37311fd21baf2938c6bd74cea63005ba/src/dra/7879C.c","https://github.com/Xeeynamo/sotn-decomp/blob/0622fcfd37311fd21baf2938c6bd74cea63005ba/src/dra/4DA70.c","https://github.com/Xeeynamo/sotn-decomp/blob/0622fcfd37311fd21baf2938c6bd74cea63005ba/src/dra/84B88.c","https://github.com/Xeeynamo/sotn-decomp/blob/0622fcfd37311fd21baf2938c6bd74cea63005ba/include/game.h","https://github.com/Xeeynamo/sotn-decomp/blob/0622fcfd37311fd21baf2938c6bd74cea63005ba/include/primitive.h"],"scopeNote":"Selected original Holy Water secondary effect profile7, factory4/params7, flat TILE primitives and behavior constants are recovered statically. Java ports this profile separately. Other particle profiles, complete original factory/contiguous allocator competition, global RNG phase, audio and exact GPU background arithmetic remain unfinished. Existing120 generated files, including historical Holy Water metadata, remain byte-identical."}
