{"id":"mindustry","title":"Mindustry","genre":"Factory / tower defense","rank":11,"status":"partial static study","version":"v160.7","sourceBasis":"release source","fileCount":5237,"imageFileCount":40,"modelCandidates":0,"assetNote":"File-level inventory. Image files are not a count of unique sprites. Models and images may also be embedded in containers.","extensions":{".class":4486,".ogg":221,".msch":210,".msav":114,".frag":53,".properties":40,".png":40,".vert":17,".so":16,".dylib":13,".dll":8,"(none)":3,".woff":3,".ttf":3,".js":2,".aatls":2,".dat":1,".icns":1,".mf":1,".json":1,".xml":1,".html":1},"commonImageDimensions":{"2048×2048":11,"64×64":7,"1024×1024":6,"256×256":4,"128×128":3,"512×512":3,"447×1":1,"48×48":1},"claims":[{"domain":"simulation","title":"Capacity constrains production","finding":"GenericCrafter advances progress when efficient, emits liquids within remaining capacity, crafts at completed progress and attempts to dump outputs. Liquid fullness can limit progress; options alter how excess output is treated. The inspected method also appears in the decompiled downloaded class.","basis":"source inspection + bytecode decompilation","evidence":{"path":"core/src/mindustry/world/blocks/production/GenericCrafter.java","url":"https://github.com/Anuken/Mindustry/blob/17012d61d9e4c3cbd9820d87e81c24495486ac53/core/src/mindustry/world/blocks/production/GenericCrafter.java#L237-L286","blobSha":"1f73d69156893b800d9af6741573c3fd1731e3d3","lines":[237,286]},"flow":{"trigger":"Building update","state":"Efficiency, progress, warmup, output capacity","output":"Crafted items and liquid output","failure":"Insufficient output capacity can limit progress; behavior depends on liquid-output options."}},{"domain":"procedural-generation","title":"Sector identity controls seeded generation","finding":"PlanetGenerator seeds its random generator from sector ID, seed offset and base seed. Its noise helper projects sector coordinates into 3D before sampling simplex noise.","basis":"source inspection","evidence":{"path":"core/src/mindustry/maps/generators/PlanetGenerator.java","url":"https://github.com/Anuken/Mindustry/blob/17012d61d9e4c3cbd9820d87e81c24495486ac53/core/src/mindustry/maps/generators/PlanetGenerator.java#L166-L190","blobSha":"11821a77a0894fedefac385cb38a12a49cb05e71","lines":[166,190]}},{"domain":"ui","title":"Favorites are persistent selection state","finding":"The HUD toggles named block favorites, saves them in settings and builds the selection list with favorites first. This establishes implementation behavior, not an observed usability result.","basis":"source inspection","evidence":{"path":"core/src/mindustry/ui/fragments/HudFragment.java","url":"https://github.com/Anuken/Mindustry/blob/17012d61d9e4c3cbd9820d87e81c24495486ac53/core/src/mindustry/ui/fragments/HudFragment.java#L115-L143","blobSha":"51f20bcc24954275f749eefb4d100cdbe45194ac","lines":[115,143]}},{"domain":"assets","title":"Bytecode, schematics and maps are distinct","finding":"The extracted JAR contains 4,486 .class files, 210 .msch files and 114 .msav files. Five selected top-level classes were decompiled with CFR 0.152; this is not decompilation of every class.","basis":"package inspection + bytecode decompilation","evidence":{"url":"/data/anatomy/mindustry.json","path":"package inventory / static analysis"}},{"domain":"systems","title":"Conveyor motion propagates spacing constraints upstream","finding":"updateTile processes items from the forward end backward, clamps movement against the next item minus itemSpace, and applies a downstream limit derived from an aligned conveyor minitem. Motion uses speed times edelta. This traces local spacing and blocking, not whole-network throughput or conservation.","basis":"source inspection","evidence":{"path":"core/src/mindustry/world/blocks/distribution/Conveyor.java","url":"https://github.com/Anuken/Mindustry/blob/17012d61d9e4c3cbd9820d87e81c24495486ac53/core/src/mindustry/world/blocks/distribution/Conveyor.java#L265-L288","blobSha":"feebf21dd352470c4b8b75af2cff4f516043999f","lines":[265,288]}},{"domain":"systems","title":"Conveyor transfer checks receiver acceptance before local removal","finding":"pass requires a nonnull item and next building, same team, and receiver acceptItem. It invokes receiver handleItem and returns true; updateTile removes its local item only on that success. A rejected transfer remains on the belt. No transaction rollback or exception guarantee was established.","basis":"source inspection","evidence":{"path":"core/src/mindustry/world/blocks/distribution/Conveyor.java","url":"https://github.com/Anuken/Mindustry/blob/17012d61d9e4c3cbd9820d87e81c24495486ac53/core/src/mindustry/world/blocks/distribution/Conveyor.java#L278-L305","blobSha":"feebf21dd352470c4b8b75af2cff4f516043999f","lines":[278,305]}},{"domain":"systems","title":"Side loading uses stricter spacing and inserts halfway along the belt","finding":"acceptItem rejects full capacity or an absent facing edge. Direction-zero input needs minitem>=itemSpace; side input needs minitem>0.7. A rotating source that is also the next building is rejected. handleItem inserts direction-zero input at y=0 and side input at y=0.5 with lateral offset. External callers must honor acceptance; handleItem itself only checks capacity before using the facing edge.","basis":"source inspection","evidence":{"path":"core/src/mindustry/world/blocks/distribution/Conveyor.java","url":"https://github.com/Anuken/Mindustry/blob/17012d61d9e4c3cbd9820d87e81c24495486ac53/core/src/mindustry/world/blocks/distribution/Conveyor.java#L353-L383","blobSha":"feebf21dd352470c4b8b75af2cff4f516043999f","lines":[353,383]}},{"domain":"systems","title":"Conveyor saves quantize positions and retain legacy decoding","finding":"Revision 1 writes item count, short item ID and signed-byte encodings of lateral and forward position. read consumes every declared entry but stores only up to capacity; revision 0 decodes an older packed integer representation. It invokes updateTile after loading, so deserialization includes an update rather than only field assignment. This is not a runtime save/load round-trip or malformed-input validation result.","basis":"source inspection","evidence":{"path":"core/src/mindustry/world/blocks/distribution/Conveyor.java","url":"https://github.com/Anuken/Mindustry/blob/17012d61d9e4c3cbd9820d87e81c24495486ac53/core/src/mindustry/world/blocks/distribution/Conveyor.java#L387-L432","blobSha":"feebf21dd352470c4b8b75af2cff4f516043999f","lines":[387,432]}},{"domain":"systems","title":"Output room gates actual efficiency separately from potential efficiency","finding":"GenericCrafter.shouldConsume rejects an output item when stored quantity plus scaled batch exceeds itemCapacity. Liquid fullness uses ignoreLiquidFullness and dumpExtraLiquid policy. BuildingComp computes minimum required-consumer efficiency, preserves it as potentialEfficiency, then zeros actual efficiency when shouldConsume/productionValid rejects updating. This separates available inputs from permitted production.","basis":"source inspection","evidence":{"path":"core/src/mindustry/world/blocks/production/GenericCrafter.java","url":"https://github.com/Anuken/Mindustry/blob/17012d61d9e4c3cbd9820d87e81c24495486ac53/core/src/mindustry/world/blocks/production/GenericCrafter.java#L205-L233","blobSha":"1f73d69156893b800d9af6741573c3fd1731e3d3","lines":[205,233]}},{"domain":"systems","title":"Craft completion triggers item consumption before output emission","finding":"craft invokes consume before item offload. BuildingComp.consume calls each consumer trigger; ConsumeItems.trigger removes rounded scaled recipe amounts. ConsumeItems.efficiency separately checks consumeTriggerValid or required items. This traces these classes, not atomic rollback, every consumer type or every recipe.","basis":"source inspection","evidence":{"path":"core/src/mindustry/world/blocks/production/GenericCrafter.java","url":"https://github.com/Anuken/Mindustry/blob/17012d61d9e4c3cbd9820d87e81c24495486ac53/core/src/mindustry/world/blocks/production/GenericCrafter.java#L308-L325","blobSha":"1f73d69156893b800d9af6741573c3fd1731e3d3","lines":[308,325]}},{"domain":"systems","title":"Blocked production still attempts output dumping","finding":"updateTile advances production only at positive efficiency and otherwise cools warmup. dumpOutputs is called outside that branch; item dumps use a timer and stop on a rejected dump, while liquids call dumpLiquid. This allows output drainage while production is blocked, subject to receiver behavior. The actual acceptance and recovery sequence remains to be traced.","basis":"source inspection","evidence":{"path":"core/src/mindustry/world/blocks/production/GenericCrafter.java","url":"https://github.com/Anuken/Mindustry/blob/17012d61d9e4c3cbd9820d87e81c24495486ac53/core/src/mindustry/world/blocks/production/GenericCrafter.java#L237-L265","blobSha":"1f73d69156893b800d9af6741573c3fd1731e3d3","lines":[237,265]}},{"domain":"systems","title":"Fresh output falls back to local storage; stored output leaves only after acceptance","finding":"offload records production, checks nearby acceptItem and canDump, and sends a fresh item directly to the first accepting receiver; if none accepts it calls local handleItem. dump instead requires an existing stored item, delivers through receiver handleItem and then removes one locally. A rejected dump returns false without removing the stored item. Both use the rotating cdump index, not a measured fairness guarantee. Exception rollback and whole-network conservation remain unexamined.","basis":"source inspection","evidence":{"path":"core/src/mindustry/entities/comp/BuildingComp.java","url":"https://github.com/Anuken/Mindustry/blob/17012d61d9e4c3cbd9820d87e81c24495486ac53/core/src/mindustry/entities/comp/BuildingComp.java#L1006-L1019","blobSha":"4b4b90593d7f31cb48f2f6adba030a2cbd5cc42d","lines":[1006,1019]}}],"coverage":{"mechanics":"not yet studied","systems":"partial static evidence","simulation":"partial static evidence","procedural-generation":"partial static evidence","ui":"partial static evidence","ux":"not yet studied","rendering":"not yet studied","assets":"partial static evidence","audio":"not yet studied","models":"not yet studied","binary":"not yet studied"},"inventoryUrl":"/data/anatomy/mindustry.json","lesson":{"status":"design inference; not implemented in Ranch Atelier","text":"Tie visible machine activity to simulated warmup and blocked outputs; save quick-choice preferences independently of world state."},"nextPass":"Generic item consumption and output recovery paths are partially traced. Liquid recovery, subclass policies, atomicity, network conservation and runtime outcomes remain unexamined.","runtimeObserved":false,"packedResourceCount":null}