starlit  Check-in [d831add94c]

Overview
Comment:add beginnings of construction system, add cuprite, fix granite, tweak balance, add sane asset management system
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: d831add94c87c5da2d49465d634be7c3e18b4d9fd756b5c0f8fc94bd2b0c5fde
User & Date: lexi on 2024-05-09 15:33:01
Other Links: manifest | tags
Context
2024-05-15
15:23
add basic architecture, rebalance minerals & recipes, fix dumb fab bug check-in: 99aefdbd9e user: lexi tags: trunk
2024-05-09
15:33
add beginnings of construction system, add cuprite, fix granite, tweak balance, add sane asset management system check-in: d831add94c user: lexi tags: trunk
2024-05-07
23:16
fix some bugs, start work on actually using the tier system, add usage docs check-in: e905f495dc user: lexi tags: trunk
Changes

Added asset.list version [a70ff394cb].

            1  +menu/background.png
            2  +menu/header.png
            3  +menu/icon.png
            4  +mods/starlit-building/textures/starlit-item-hinge.png
            5  +mods/starlit-building/textures/starlit-item-insulation.png
            6  +mods/starlit-building/textures/starlit-item-pipe.png
            7  +mods/starlit-building/textures/starlit-item-panel.png
            8  +mods/starlit-building/textures/starlit-item-concrete.png
            9  +mods/starlit-building/textures/starlit-node-concrete.png
           10  +mods/starlit-building/textures/starlit-node-floor-panel-side.png
           11  +mods/starlit-building/textures/starlit-node-floor-panel-side-conduit.png
           12  +mods/starlit-building/textures/starlit-node-floor-panel-top.png
           13  +mods/starlit-building/textures/starlit-node-floor-panel-top-vent.png
           14  +mods/starlit-building/textures/starlit-node-insulation-top.png
           15  +mods/starlit-building/textures/starlit-node-insulation-cable-top.png
           16  +mods/starlit-eco/textures/starlit-eco-plant-berry-bunch.png
           17  +mods/starlit-eco/textures/starlit-eco-plant-bloom-leaf.png
           18  +mods/starlit-eco/textures/starlit-eco-plant-bloom-petal.png
           19  +mods/starlit-eco/textures/starlit-eco-plant-bloom-stalk.png
           20  +mods/starlit-eco/textures/starlit-eco-plant-fiber.png
           21  +mods/starlit-eco/textures/starlit-eco-plant-grass-high.png
           22  +mods/starlit-eco/textures/starlit-eco-plant-grass-sprig.png
           23  +mods/starlit-eco/textures/starlit-eco-plant-grass-tall.png
           24  +mods/starlit-eco/textures/starlit-eco-plant-seeds.png
           25  +mods/starlit-eco/textures/starlit-eco-plant-stalk-berries.png
           26  +mods/starlit-eco/textures/starlit-eco-plant-stalk-grow-1.png
           27  +mods/starlit-eco/textures/starlit-eco-plant-stalk-grow-2.png
           28  +mods/starlit-eco/textures/starlit-eco-plant-stalk-grow-3.png
           29  +mods/starlit-eco/textures/starlit-eco-plant-stalk-petals.png
           30  +mods/starlit-eco/textures/starlit-eco-plant-stalk.png
           31  +mods/starlit-eco/textures/starlit-eco-tree-lambent-pine-bulb.png
           32  +mods/starlit-eco/textures/starlit-eco-tree-lambent-pine-needles.png
           33  +mods/starlit-eco/textures/starlit-eco-tree-lambent-pine-stem.png
           34  +mods/starlit-eco/textures/starlit-eco-tree-lambent-pine-trunk-top.png
           35  +mods/starlit-eco/textures/starlit-eco-tree-lambent-pine-trunk.png
           36  +mods/starlit-eco/textures/starlit-eco-tree-starblossom-leaves.png
           37  +mods/starlit-eco/textures/starlit-eco-tree-starblossom-shine.png
           38  +mods/starlit-eco/textures/starlit-eco-tree-starblossom-shine.png~
           39  +mods/starlit-eco/textures/starlit-eco-tree-starblossom-trunk-top.png
           40  +mods/starlit-eco/textures/starlit-eco-tree-starblossom-trunk-top.png~
           41  +mods/starlit-eco/textures/starlit-eco-tree-starblossom-trunk.png
           42  +mods/starlit-eco/textures/starlit-eco-tree-starblossom-trunk.png~
           43  +mods/starlit-electronics/textures/starlit-item-battery-box.png
           44  +mods/starlit-electronics/textures/starlit-item-battery.png
           45  +mods/starlit-electronics/textures/starlit-item-cable-electric.png
           46  +mods/starlit-electronics/textures/starlit-item-chip.png
           47  +mods/starlit-electronics/textures/starlit-item-electrode.png
           48  +mods/starlit-electronics/textures/starlit-item-heating-element.png
           49  +mods/starlit-electronics/textures/starlit-item-transformer.png
           50  +mods/starlit-electronics/textures/starlit-node-device-core-back.png
           51  +mods/starlit-electronics/textures/starlit-node-device-core-bottom.png
           52  +mods/starlit-electronics/textures/starlit-node-device-core-front.png
           53  +mods/starlit-electronics/textures/starlit-node-device-core-side.png
           54  +mods/starlit-electronics/textures/starlit-node-device-core-top.png
           55  +mods/starlit-material/textures/starlit-element-aluminum-powder.png
           56  +mods/starlit-material/textures/starlit-element-aluminum.png
           57  +mods/starlit-material/textures/starlit-element-argon.png
           58  +mods/starlit-material/textures/starlit-element-beryllium-powder.png
           59  +mods/starlit-material/textures/starlit-element-beryllium.png
           60  +mods/starlit-material/textures/starlit-element-brass-powder.png
           61  +mods/starlit-material/textures/starlit-element-bronze-powder.png
           62  +mods/starlit-material/textures/starlit-element-calcium.png
           63  +mods/starlit-material/textures/starlit-element-carbon-powder.png
           64  +mods/starlit-material/textures/starlit-element-carbon.png
           65  +mods/starlit-material/textures/starlit-element-cobalt-powder.png
           66  +mods/starlit-material/textures/starlit-element-copper-powder.png
           67  +mods/starlit-material/textures/starlit-element-copper.png
           68  +mods/starlit-material/textures/starlit-element-draconium-powder.png
           69  +mods/starlit-material/textures/starlit-element-duridium-powder.png
           70  +mods/starlit-material/textures/starlit-element-electrum-powder.png
           71  +mods/starlit-material/textures/starlit-element-gold-powder.png
           72  +mods/starlit-material/textures/starlit-element-gold.png
           73  +mods/starlit-material/textures/starlit-element-impervium-powder.png
           74  +mods/starlit-material/textures/starlit-element-iridium-powder.png
           75  +mods/starlit-material/textures/starlit-element-iridium.png
           76  +mods/starlit-material/textures/starlit-element-iron-powder.png
           77  +mods/starlit-material/textures/starlit-element-iron.png
           78  +mods/starlit-material/textures/starlit-element-lithium-powder.png
           79  +mods/starlit-material/textures/starlit-element-lithium.png
           80  +mods/starlit-material/textures/starlit-element-magnesium.png
           81  +mods/starlit-material/textures/starlit-element-nickel.png
           82  +mods/starlit-material/textures/starlit-element-osmium.png
           83  +mods/starlit-material/textures/starlit-element-oxygen.png
           84  +mods/starlit-material/textures/starlit-element-platinum-powder.png
           85  +mods/starlit-material/textures/starlit-element-potassium-powder.png
           86  +mods/starlit-material/textures/starlit-element-potassium.png
           87  +mods/starlit-material/textures/starlit-element-silicon.png
           88  +mods/starlit-material/textures/starlit-element-silver-powder.png
           89  +mods/starlit-material/textures/starlit-element-silver.png
           90  +mods/starlit-material/textures/starlit-element-steel-powder.png
           91  +mods/starlit-material/textures/starlit-element-technetium-powder.png
           92  +mods/starlit-material/textures/starlit-element-technetium.png
           93  +mods/starlit-material/textures/starlit-element-thorium-powder.png
           94  +mods/starlit-material/textures/starlit-element-thorium.png
           95  +mods/starlit-material/textures/starlit-element-tin-powder.png
           96  +mods/starlit-material/textures/starlit-element-titanium-powder.png
           97  +mods/starlit-material/textures/starlit-element-titanium.png
           98  +mods/starlit-material/textures/starlit-element-tyrannium-powder.png
           99  +mods/starlit-material/textures/starlit-element-uranium-powder.png
          100  +mods/starlit-material/textures/starlit-element-uranium.png
          101  +mods/starlit-material/textures/starlit-element-vanadium-powder.png
          102  +mods/starlit-material/textures/starlit-element-vanadium.png
          103  +mods/starlit-material/textures/starlit-element-vidrium-powder.png
          104  +mods/starlit-material/textures/starlit-element-xenon.png
          105  +mods/starlit-material/textures/starlit-item-brick.png
          106  +mods/starlit-material/textures/starlit-item-element-canister.png
          107  +mods/starlit-suit/textures/starlit-suit-survival-lining-human-female.png
          108  +mods/starlit-suit/textures/starlit-suit-survival-plate-human-female.png
          109  +mods/starlit-tech/textures/starlit-tech-crate-back.png
          110  +mods/starlit-tech/textures/starlit-tech-crate-bottom.png
          111  +mods/starlit-tech/textures/starlit-tech-crate-front.png
          112  +mods/starlit-tech/textures/starlit-tech-crate-side.png
          113  +mods/starlit-tech/textures/starlit-tech-crate-top.png
          114  +mods/starlit-tech/textures/starlit-tech-lamp-glow.png
          115  +mods/starlit-tech/textures/starlit-tech-lamp.png
          116  +mods/starlit/models/starlit-body-female.x
          117  +mods/starlit/models/starlit-body-female.x.nla
          118  +mods/starlit/sounds/default-dirt-footstep.1.ogg
          119  +mods/starlit/sounds/default-dirt-footstep.2.ogg
          120  +mods/starlit/sounds/default-dug-node.1.ogg
          121  +mods/starlit/sounds/default-dug-node.2.ogg
          122  +mods/starlit/sounds/default-grass-footstep.1.ogg
          123  +mods/starlit/sounds/default-grass-footstep.2.ogg
          124  +mods/starlit/sounds/default-grass-footstep.3.ogg
          125  +mods/starlit/sounds/default-hard-footstep.1.ogg
          126  +mods/starlit/sounds/default-hard-footstep.2.ogg
          127  +mods/starlit/sounds/default-hard-footstep.3.ogg
          128  +mods/starlit/sounds/default-ice-dig.1.ogg
          129  +mods/starlit/sounds/default-ice-dig.2.ogg
          130  +mods/starlit/sounds/default-ice-dig.3.ogg
          131  +mods/starlit/sounds/default-ice-dug.ogg
          132  +mods/starlit/sounds/default-ice-footstep.1.ogg
          133  +mods/starlit/sounds/default-ice-footstep.2.ogg
          134  +mods/starlit/sounds/default-ice-footstep.3.ogg
          135  +mods/starlit/sounds/default-metal-footstep.1.ogg
          136  +mods/starlit/sounds/default-metal-footstep.2.ogg
          137  +mods/starlit/sounds/default-metal-footstep.3.ogg
          138  +mods/starlit/sounds/default-sand-footstep.1.ogg
          139  +mods/starlit/sounds/default-sand-footstep.2.ogg
          140  +mods/starlit/sounds/default-sand-footstep.3.ogg
          141  +mods/starlit/sounds/default-snow-footstep.1.ogg
          142  +mods/starlit/sounds/default-snow-footstep.2.ogg
          143  +mods/starlit/sounds/default-snow-footstep.3.ogg
          144  +mods/starlit/sounds/default-snow-footstep.4.ogg
          145  +mods/starlit/sounds/default-snow-footstep.5.ogg
          146  +mods/starlit/sounds/default-water-footstep.1.ogg
          147  +mods/starlit/sounds/default-water-footstep.2.ogg
          148  +mods/starlit/sounds/default-water-footstep.3.ogg
          149  +mods/starlit/sounds/default-wood-footstep.1.ogg
          150  +mods/starlit/sounds/default-wood-footstep.2.ogg
          151  +mods/starlit/sounds/default_dig_grab.ogg
          152  +mods/starlit/sounds/default_dig_looseClump.ogg
          153  +mods/starlit/sounds/default_dig_pickup.ogg
          154  +mods/starlit/sounds/default_dig_plant.ogg
          155  +mods/starlit/sounds/starlit-alarm-urgent.ogg
          156  +mods/starlit/sounds/starlit-alarm.ogg
          157  +mods/starlit/sounds/starlit-configure.ogg
          158  +mods/starlit/sounds/starlit-error.ogg
          159  +mods/starlit/sounds/starlit-insert-snap.ogg
          160  +mods/starlit/sounds/starlit-mode-nano.ogg
          161  +mods/starlit/sounds/starlit-mode-off.ogg
          162  +mods/starlit/sounds/starlit-mode-psi.1.ogg
          163  +mods/starlit/sounds/starlit-mode-psi.2.ogg
          164  +mods/starlit/sounds/starlit-mode-psi.3.ogg
          165  +mods/starlit/sounds/starlit-mode-psi.4.ogg
          166  +mods/starlit/sounds/starlit-mode-weapon.ogg
          167  +mods/starlit/sounds/starlit-nano-heal.ogg
          168  +mods/starlit/sounds/starlit-nano-shred.1.ogg
          169  +mods/starlit/sounds/starlit-nano-shred.2.ogg
          170  +mods/starlit/sounds/starlit-nano-shred.3.ogg
          171  +mods/starlit/sounds/starlit-nano-shred.4.ogg
          172  +mods/starlit/sounds/starlit-nav.ogg
          173  +mods/starlit/sounds/starlit-power-down.ogg
          174  +mods/starlit/sounds/starlit-power-up.1.ogg
          175  +mods/starlit/sounds/starlit-power-up.2.ogg
          176  +mods/starlit/sounds/starlit-power-up.3.ogg
          177  +mods/starlit/sounds/starlit-power-up.4.ogg
          178  +mods/starlit/sounds/starlit-power-up.5.ogg
          179  +mods/starlit/sounds/starlit-power-up.6.ogg
          180  +mods/starlit/sounds/starlit-power-up.7.ogg
          181  +mods/starlit/sounds/starlit-quit.ogg
          182  +mods/starlit/sounds/starlit-success.ogg
          183  +mods/starlit/sounds/starlit-suit-battery-in.ogg
          184  +mods/starlit/sounds/starlit-suit-chip-in.ogg
          185  +mods/starlit/sounds/starlit-suit-don.ogg
          186  +mods/starlit/textures/starlit-body-eye.png
          187  +mods/starlit/textures/starlit-body-hair.png
          188  +mods/starlit/textures/starlit-body-skin.png
          189  +mods/starlit/textures/starlit-fx-nano-spark-big.png
          190  +mods/starlit/textures/starlit-fx-nano-spark-small.png
          191  +mods/starlit/textures/starlit-fx-nanocloud.png
          192  +mods/starlit/textures/starlit-fx-nanospark.png
          193  +mods/starlit/textures/starlit-item-chip.png
          194  +mods/starlit/textures/starlit-item-soil.png
          195  +mods/starlit/textures/starlit-item-suit.png
          196  +mods/starlit/textures/starlit-sun-tones.png
          197  +mods/starlit/textures/starlit-sun.png
          198  +mods/starlit/textures/starlit-terrain-feldspar.png
          199  +mods/starlit/textures/starlit-terrain-granite.png
          200  +mods/starlit/textures/starlit-terrain-greengraze-overlay.png
          201  +mods/starlit/textures/starlit-terrain-greengraze.png
          202  +mods/starlit/textures/starlit-terrain-greengraze.png~
          203  +mods/starlit/textures/starlit-terrain-lifesilt.png
          204  +mods/starlit/textures/starlit-terrain-sand.png
          205  +mods/starlit/textures/starlit-terrain-soil.png
          206  +mods/starlit/textures/starlit-terrain-undergloam-overlay.png
          207  +mods/starlit/textures/starlit-terrain-cuprite.png
          208  +mods/starlit/textures/starlit-terrain-undergloam.png
          209  +mods/starlit/textures/starlit-ui-alert-bg-hot.png
          210  +mods/starlit/textures/starlit-ui-alert-bg-hydration.png
          211  +mods/starlit/textures/starlit-ui-alert-bg-nutrition.png
          212  +mods/starlit/textures/starlit-ui-alert-bg-rad.png
          213  +mods/starlit/textures/starlit-ui-alert-bg-success.png
          214  +mods/starlit/textures/starlit-ui-alert-bg-temp-cold.png
          215  +mods/starlit/textures/starlit-ui-alert-bg-temp-rad.png
          216  +mods/starlit/textures/starlit-ui-alert-hydration.png
          217  +mods/starlit/textures/starlit-ui-alert-item.png
          218  +mods/starlit/textures/starlit-ui-alert-nutrition.png
          219  +mods/starlit/textures/starlit-ui-alert-rad.png
          220  +mods/starlit/textures/starlit-ui-alert-temp-cold.png
          221  +mods/starlit/textures/starlit-ui-alert-temp-hot.png
          222  +mods/starlit/textures/starlit-ui-alert.png
          223  +mods/starlit/textures/starlit-ui-bar.png
          224  +mods/starlit/textures/starlit-ui-bg-digital.png
          225  +mods/starlit/textures/starlit-ui-bg-panel.png
          226  +mods/starlit/textures/starlit-ui-button-hw-hover.png
          227  +mods/starlit/textures/starlit-ui-button-hw-press.png
          228  +mods/starlit/textures/starlit-ui-button-hw.png
          229  +mods/starlit/textures/starlit-ui-button-sw-hover.png
          230  +mods/starlit/textures/starlit-ui-button-sw-press.png
          231  +mods/starlit/textures/starlit-ui-button-sw.png
          232  +mods/starlit/textures/starlit-ui-crosshair-nano.png
          233  +mods/starlit/textures/starlit-ui-crosshair-psi.png
          234  +mods/starlit/textures/starlit-ui-crosshair-weapon.png
          235  +mods/starlit/textures/starlit-ui-crosshair.png
          236  +mods/starlit/textures/starlit-ui-hud-bg.png
          237  +mods/starlit/textures/starlit-ui-icon-ability-sprint.png
          238  +mods/starlit/textures/starlit-ui-icon-element.png
          239  +mods/starlit/textures/starlit-ui-icon-fabricate.png
          240  +mods/starlit/textures/starlit-ui-icon-nano.png
          241  +mods/starlit/textures/starlit-ui-icon-psi-cfg.png
          242  +mods/starlit/textures/starlit-ui-icon-psi.png
          243  +mods/starlit/textures/starlit-ui-icon-self.png
          244  +mods/starlit/textures/starlit-ui-icon-shred.png
          245  +mods/starlit/textures/starlit-ui-icon-stat-numina.png
          246  +mods/starlit/textures/starlit-ui-icon-stat-power.png
          247  +mods/starlit/textures/starlit-ui-icon-weapon.png
          248  +mods/starlit/textures/starlit-ui-meter-hl.png
          249  +mods/starlit/textures/starlit-ui-meter-readout.png
          250  +mods/starlit/textures/starlit-ui-meter.png
          251  +mods/starlit/textures/starlit-ui-slot-physical.png
          252  +mods/starlit/textures/starlit-ui-slot.png
          253  +mods/starlit/textures/starlit-water.png

Added makefile version [ebfb2ead99].

            1  +all: asset-sync doc-sync
            2  +
            3  +starlit.html: starlit.ct
            4  +	cortav -y html:fossil-uv "$<" -o "$@"
            5  +
            6  +.PHONY: doc-sync
            7  +doc-sync: starlit.html
            8  +	fossil uv add "$<"
            9  +	fossil uv sync
           10  +
           11  +asset.cpxz: asset.list $(cat asset.list)
           12  +	cpio -o <"$<" | xz >"$@"
           13  +
           14  +.PHONY: asset-sync
           15  +asset-sync: asset.cpxz
           16  +	fossil uv add "$<"
           17  +	fossil uv sync

Modified mods/starlit-building/init.lua from [35031ce713] to [76e0104e11].

    18     18   			allow = function(node, tool) ... end;
    19     19   			handle = function(node, tool) ... end;
    20     20   		};
    21     21   	};
    22     22   } ]]
    23     23   -- it should only be written by special accessor functions!
    24     24   
    25         -B.stage = lib.registry.mk 'starlit_building:stage'
    26         --- a stage consists of a list of pieces and maps from possible materials
    27         --- / tool usages to succeeding stages in the build tree. note that all
    28         --- used pieces must be defined before a stage is defined currently, due
    29         --- to a lack of cross-registry dependency mechanisms. i will hopefully
    30         --- improve vtlib to handle this condition eventually.
           25  +B.begin = {part = {}, tool = {}}
           26  +-- this maps parts/tools to the new nodes they create
    31     27   --[[
    32         -	starlit.mod.building.stage.link(id, {
    33         -		pieces = {
    34         -			'starlit_building:foundation';
    35         -			'starlit_building:insulation'; -- offset             ofsFac
    36         -			{'starlit_building:pipe',      vector.new(-.5, 0, 0), 0};--
    37         -			{'starlit_building:pipe',      vector.new(-.5, 0, 0), 1};
    38         -			'starlit_building:insulation';
    39         -			'starlit_building:panel';
    40         -		};
    41         -	})
           28  +	part = {
           29  +		['starlit_building:concrete'] = 'starlit_building:stage_foundation';
           30  +		-- or function(...)
           31  +	};
           32  +	tool = {
           33  +		-- for consistency's sake -- can't quite imagine a valid use
           34  +		-- for this but im sure it'll bite me eventually if i leave it out
           35  +	};
    42     36   ]]
    43     37   
    44         -B.piece = lib.registry.mk 'starlit_building:piece'
    45         --- a piece is used to produce stage definitions, by means of appending
    46         --- nodeboxes with appropriate offsets. it also lists the recoverable
    47         --- materials which can be obtained by destroying a stage containing
    48         --- this piece using nano. part IDs should correspond with piece IDs
    49         --- where possible
           38  +B.stage = lib.registry.mk 'starlit_building:stage'
           39  +-- a stage consists of a node definition and maps from possible materials
           40  +-- / tool usages to succeeding stages in the build tree
    50     41   --[[
    51         -	starlit.mod.building.piece.link(id, {
    52         -		tex = 'myMod_part.png';
    53         -		height = 0.1; -- used for auto-offset
    54         -		fab = {
    55         -			element = {iron=10};
    56         -		};	
    57         -		shape = {
    58         -			type = "fixed";
    59         -			fixed = { ... };
           42  +	starlit.mod.building.stage.link(id, {
           43  +		tex = { ... };
           44  +		box = { ... }; -- nodebox def, or
           45  +		mesh = '...'; -- mesh name
           46  +		begin = {
           47  +			part = {...};
           48  +			tool = {...};
           49  +		}
           50  +		build = {
           51  +			part = {
           52  +				['starlit_building:insulation'] = 'starlit_building:foundation_with_insulation';
           53  +			};
           54  +			tool = {
           55  +				['starlit_building:screwdriver'] = {id = 'air', drop = 'starlit_building:foundation'};
           56  +			};
    60     57   		};
    61     58   	})
    62     59   ]]
    63     60   
    64     61   B.part = lib.registry.mk 'starlit_building:part'
    65     62   -- a part is implemented as a special craftitem with the proper callbacks
    66     63   -- to index the registries and place/replace nodes by reference to the
................................................................................
    92     89   		short_description = e.name;
    93     90   		description = starlit.ui.tooltip {
    94     91   			title = e.name;
    95     92   			desc = e.desc;
    96     93   			props = props;
    97     94   		};
    98     95   		inventory_image = e.img;
           96  +		on_place = function(stack, luser, point)
           97  +			local node = minetest.get_node(point.under)
           98  +			local function tryBuild()
           99  +				local p = B.path[node.name]
          100  +				if not p then return nil end
          101  +				if (not p.part) or (not p.part[id]) then return nil end
          102  +				local n = p.part[id]
          103  +				local obj
          104  +				if type(n) == 'function' then
          105  +					obj = n(stack, node, point)
          106  +					if obj == nil then return nil end
          107  +				else
          108  +					obj = ItemStack(n)
          109  +					stack:take_item(1)
          110  +				end
          111  +				local pname = obj:get_name()
          112  +				local stg = B.stage.db[pname]
          113  +				node.name = pname
          114  +				minetest.swap_node(point.under, node)
          115  +				-- TODO make a noise
          116  +				if stg.onBuild then
          117  +					stg.onBuild(point.under, luser, stack)
          118  +				end
          119  +				return stack
          120  +			end
          121  +
          122  +			local function tryBegin()
          123  +				local p = B.begin.part[stack:get_name()]
          124  +				if not p then return nil end
          125  +				if type(p) == 'function' then
          126  +					p = p(stack, node, point)
          127  +					if p == nil then return nil end
          128  +				else
          129  +					stack:take_item(1)
          130  +				end
          131  +				minetest.rotate_and_place(ItemStack(p), luser, point, true)
          132  +				-- TODO make a noise
          133  +				return stack
          134  +			end
          135  +
          136  +			return tryBuild() or tryBegin() or stack
          137  +		end;
    99    138   		_starlit = {
   100    139   			mass = e.mass;
   101    140   			reverseEngineer = rev;
   102    141   			recover = e.recover or e.fab;
   103    142   		};
   104    143   	})
   105    144   	if e.fab then
................................................................................
   115    154   			};
   116    155   			rarity = e.rarity or 0;
   117    156   		})
   118    157   	end
   119    158   
   120    159   end)
   121    160   
   122         -B.stage.foreach('starlit:stageGen', {}, function(id, e)
   123         -	local box = {type = 'fixed', fixed = {}}
   124         -	local tex = {}
   125         -	local ofs = vector.new(0,0,0)
   126         -	for idx, p in ipairs(e.pieces) do
   127         -		local ho, pieceID, pos
   128         -		if type(p) == 'string' then
   129         -			pieceID, pos, ho = p, vector.zero(), 1.0
   130         -		else
   131         -			pieceID, pos, ho = pc[1],pc[2],pc[3]
   132         -		end
   133         -		local pc = B.piece.db[pieceID]
   134         -		pos = pos + ofs
   135         -		if ho ~= 0.0 then
   136         -			ofs = vector.offset(ofs, 0, pc.height)
   137         -		end
   138         -		local sh = lib.node.boxwarped(pc.shape, function(b)
   139         -			-- { -x, -y, -z;
   140         -			--   +x, +y, +z }
   141         -			b[1] = b[1] + ofs.x  b[4] = b[4] + ofs.x
   142         -			b[2] = b[2] + ofs.y  b[5] = b[5] + ofs.y
   143         -			b[3] = b[3] + ofs.z  b[6] = b[6] + ofs.z
   144         -		end)
   145         -		table.insert(box, sh)
   146         -		if type(pc.tex) == 'string' then
   147         -			table.insert(tex, pc.tex)
   148         -		else
   149         -			for i,t in ipairs(pc.tex) do
   150         -				table.insert(tex, t or '')
   151         -			end
   152         -		end
   153         -	end
   154         -	minetest.register_node(id, {
   155         -		description = 'Construction';
   156         -		drawtype = 'nodebox';
   157         -		paramtype  = 'light';
   158         -		paramtype2 = e.stateful or 'none';
   159         -		textures = tex;
   160         -		node_box = box;
   161         -		group = { stage = 1 };
   162         -		_starlit = {
   163         -			stage = id;
   164         -		};
   165         -	})
   166         -end)
   167         -
   168    161   function B.pathLink(from, kind, what, to)
   169    162   	if not B.path[from] then
   170    163   		B.path[from] = {part={}, tool={}}
   171    164   	end
   172    165   	local k = B.path[from][kind]
   173         -	assert(k[what] == nil)
          166  +	assert(k[what] == nil, 'attempted to overwrite an existing build path')
   174    167   	k[what] = to
   175    168   end
   176    169   
   177    170   function B.pathFind(from, kind, what)
   178    171   	if not B.path[from] then return nil end
   179    172   	return B.path[from][kind][what]
   180    173   end
          174  +
          175  +B.stage.foreach('starlit:stageGen', {}, function(id, e)
          176  +	local grp = e.groups and table.copy(e.groups) or {}
          177  +	grp.stage = 1
          178  +	minetest.register_node(id, {
          179  +		description = 'Construction';
          180  +		drawtype = (e.box  and 'nodebox')
          181  +		        or (e.mesh and 'mesh')
          182  +		        or 'regular';
          183  +		paramtype  = (e.box or e.mesh or e.light) and 'light' or nil;
          184  +		paramtype2 = e.stateful or 'none';
          185  +		tiles = e.tex;
          186  +		node_box = e.box;
          187  +		mesh = e.mesh;
          188  +		groups = grp;
          189  +		_starlit = {
          190  +			stage = id;
          191  +		};
          192  +	})
          193  +	if e.begin then
          194  +		for _, kind in ipairs {'part', 'tool'} do
          195  +			for i, v in ipairs(e.begin[kind] or {}) do
          196  +				assert(B.begin[kind][v] == nil, 'attempted to overwrite buildpath beginning')
          197  +				B.begin[kind][v] = id
          198  +			end
          199  +		end
          200  +	end
          201  +	if e.build then
          202  +		for _, kind in ipairs {'part', 'tool'} do
          203  +			for what, to in pairs(e.build[kind] or {}) do
          204  +				B.pathLink(id, kind, what, to)
          205  +			end
          206  +		end
          207  +	end
          208  +end)
          209  +
   181    210   
   182    211   starlit.include 'parts'
          212  +starlit.include 'stages'

Modified mods/starlit-building/parts.lua from [01ffc64dd2] to [d434edb6db].

    82     82   		cost = {power = 500};
    83     83   		flag = {print=true};
    84     84   		time = {print=20};
    85     85   	};
    86     86   	mass = 24;
    87     87   	rarity = 1;
    88     88   })
           89  +
           90  +B.part.link('starlit_building:concrete', {
           91  +	name = 'Concrete';
           92  +	desc = 'A sturdy base for modular construction units.';
           93  +	img = 'starlit-item-concrete.png';
           94  +	fab = starlit.type.fab {
           95  +		element = {
           96  +			calcium = 1;
           97  +			carbon = 4;
           98  +		};
           99  +		cost = {power = 200};
          100  +		flag = {print=true};
          101  +		time = {print=5};
          102  +	};
          103  +	mass = 5;
          104  +	rarity = 1;
          105  +})
          106  +
          107  +B.part.link('starlit_building:insulation', {
          108  +	name = 'Insulation';
          109  +	desc = 'An aerogel that traps heat very effectively.';
          110  +	img = 'starlit-item-insulation.png';
          111  +	fab = starlit.type.fab {
          112  +		element = {
          113  +			silicon = 4;
          114  +		};
          115  +		cost = {power = 100};
          116  +		flag = {print=true};
          117  +		time = {print=5};
          118  +	};
          119  +	mass = 4;
          120  +	rarity = 1;
          121  +})
          122  +
          123  +B.part.link('starlit_building:panel', {
          124  +	name = 'Panel';
          125  +	desc = 'A sheet of aluminum suitable for use as a wall or floor panel.';
          126  +	img = 'starlit-item-panel.png';
          127  +	fab = starlit.type.fab {
          128  +		element = {
          129  +			aluminum = 8;
          130  +		};
          131  +		cost = {power = 300};
          132  +		flag = {print=true};
          133  +		time = {print=15};
          134  +	};
          135  +	mass = 8;
          136  +	rarity = 1;
          137  +})
          138  +
          139  +B.part.link('starlit_building:pipe', {
          140  +	name = 'Pipe';
          141  +	desc = 'A pipe suitable for conveying liquids or gasses.';
          142  +	img = 'starlit-item-pipe.png';
          143  +	fab = starlit.type.fab {
          144  +		element = {
          145  +			aluminum = 4;
          146  +		};
          147  +		cost = {power = 300};
          148  +		flag = {print=true};
          149  +		time = {print=15};
          150  +	};
          151  +	mass = 4;
          152  +	rarity = 1;
          153  +})

Added mods/starlit-building/stages.lua version [3af63c8d88].

            1  +local lib = starlit.mod.lib
            2  +local B = starlit.mod.building
            3  +B.stage.link('starlit_building:stage_foundation', {
            4  +	tex = {
            5  +		'starlit-node-concrete.png';
            6  +	};
            7  +	begin = {
            8  +		part = {
            9  +			'starlit_building:concrete';
           10  +		};
           11  +	};
           12  +	build = {
           13  +		part = {
           14  +			['starlit_building:insulation'] = 'starlit_building:stage_foundation_insulation';
           15  +		};
           16  +	};
           17  +	box = {
           18  +		type = 'fixed';
           19  +		fixed = {
           20  +			-.5, -.5,         -.5;
           21  +			 .5, -.5 + (2/16), .5;
           22  +		};
           23  +	};
           24  +})
           25  +
           26  +B.stage.link('starlit_building:stage_foundation_insulation', {
           27  +	tex = {
           28  +		'starlit-node-insulation-top.png';
           29  +		'starlit-node-concrete.png';
           30  +		'starlit-node-floor-panel-side.png';
           31  +	};
           32  +	build = {
           33  +		part = {
           34  +			['starlit_building:insulation'] = 'starlit_building:stage_foundation_insulation_x2';
           35  +			['starlit_building:cable_electric'] = 'starlit_building:stage_foundation_insulation_conduit';
           36  +		};
           37  +	};
           38  +	box = {
           39  +		type = 'fixed';
           40  +		fixed = {
           41  +			-.5, -.5,         -.5;
           42  +			 .5, -.5 + (6/16), .5;
           43  +		};
           44  +	};
           45  +})
           46  +
           47  +B.stage.link('starlit_building:stage_foundation_insulation_x2', {
           48  +	tex = {
           49  +		'starlit-node-insulation-top.png';
           50  +		'starlit-node-concrete.png';
           51  +		'starlit-node-floor-panel-side.png';
           52  +	};
           53  +	build = {
           54  +		part = {
           55  +			['starlit_building:panel'] = 'starlit_building:floor';
           56  +		};
           57  +	};
           58  +	box = {
           59  +		type = 'fixed';
           60  +		fixed = {
           61  +			-.5, -.5,         -.5;
           62  +			 .5, -.5 + (14/16), .5;
           63  +		};
           64  +	};
           65  +})
           66  +
           67  +B.stage.link('starlit_building:stage_foundation_insulation_conduit', {
           68  +	tex = {
           69  +		'starlit-node-insulation-cable-top.png';
           70  +		'starlit-node-concrete.png';
           71  +		'starlit-node-floor-panel-side-conduit.png';
           72  +	};
           73  +	groups = {
           74  +		conduit = 1;
           75  +	};
           76  +	build = {
           77  +		part = {
           78  +			['starlit_building:insulation'] = 'starlit_building:stage_foundation_insulated_conduit';
           79  +		};
           80  +	};
           81  +	box = {
           82  +		type = 'fixed';
           83  +		fixed = {
           84  +			-.5, -.5,         -.5;
           85  +			 .5, -.5 + (8/16), .5;
           86  +		};
           87  +	};
           88  +})
           89  +
           90  +B.stage.link('starlit_building:stage_foundation_insulated_conduit', {
           91  +	tex = {
           92  +		'starlit-node-insulation-top.png';
           93  +		'starlit-node-concrete.png';
           94  +		'starlit-node-floor-panel-side-conduit.png';
           95  +	};
           96  +	build = {
           97  +		part = {
           98  +			['starlit_building:panel'] = 'starlit_building:conduit';
           99  +		};
          100  +	};
          101  +	groups = {
          102  +		conduit = 1;
          103  +	};
          104  +	box = {
          105  +		type = 'fixed';
          106  +		fixed = {
          107  +			-.5, -.5,         -.5;
          108  +			 .5, -.5 + (14/16), .5;
          109  +		};
          110  +	};
          111  +})
          112  +
          113  +B.stage.link('starlit_building:conduit', {
          114  +	tex = {
          115  +		'starlit-node-floor-panel-top.png';
          116  +		'starlit-node-concrete.png';
          117  +		'starlit-node-floor-panel-side-conduit.png';
          118  +	};
          119  +	groups = {
          120  +		conduit = 1;
          121  +	};
          122  +})
          123  +
          124  +B.stage.link('starlit_building:floor', {
          125  +	tex = {
          126  +		'starlit-node-floor-panel-top.png';
          127  +		'starlit-node-concrete.png';
          128  +		'starlit-node-floor-panel-side.png';
          129  +	};
          130  +})

Modified mods/starlit-electronics/init.lua from [edafa25ca2] to [668ccf7fa8].

   302    302   -- makeshift: cheap, weak, low quality
   303    303   -- imperial ("da red wunz go fasta"): powerful, low quality
   304    304   -- commune ("snooty sophisticates"): limited power, high quality, expensive
   305    305   -- usukwinya ("value engineering"): high power, mid quality, affordable
   306    306   -- eluthrai ("uncompromising"): high power, high quality, wildly expensive
   307    307   -- firstborn ("god-tier"): exceptional
   308    308   
   309         -		print(dump(starlit.world.tier.fabsum('commune', 'battery')))
   310    309   local batteryTiers = {
   311    310   	makeshift = {
   312    311   		name = 'Makeshift'; capacity = .5, decay = 3, leak = 2, dischargeRate = 1,
   313    312   -- 		fab = starlit.type.fab {
   314    313   -- 			element = {copper=10};
   315    314   -- 			cost = {power = 0.3};
   316    315   -- 			time = {print = .25};

Modified mods/starlit-scenario/init.lua from [ad44a3c89f] to [d2f3af923b].

    39     39   		{'starlit_tech:chem_lamp', 0};
    40     40   		{'starlit_tech:crate', 0};
    41     41   		{'starlit_building:battery_box', 0};
    42     42   		{'starlit_building:heating_element', 0};
    43     43   		{'starlit_building:electrode', 0};
    44     44   		{'starlit_building:cable_electric', 0};
    45     45   		{'starlit_building:transformer', 0};
           46  +		{'starlit_building:concrete', 0};
           47  +		{'starlit_building:insulation', 0};
           48  +		{'starlit_building:panel', 0};
    46     49   }
    47     50   
    48     51   local chipLibrary = {
    49     52   	compendium = makeChip('The Gentleman Adventurer\'s Compleat Wilderness Compendium', lib.tbl.append(survivalBasics, {
    50     53   		{'starlit_electronics:battery_chemical_imperial_small', 0};
    51     54   	}), {
    52     55   		{'starlit_electronics:shred', 0};

Modified mods/starlit-tech/init.lua from [4840721039] to [de8d4eba0f].

     7      7   	local stages = maxBright
     8      8   	local stageTimeout = burnTime / stages
     9      9   	local function chemLampID(n)
    10     10   		if n == stages then return 'starlit_tech:chem_lamp' end
    11     11   		return string.format('starlit_tech:chem_lamp_%s',n)
    12     12   	end
    13     13   	local fab = starlit.type.fab {
    14         -		element = { carbon = 8, magnesium = 2 };
           14  +		element = { carbon = 4, magnesium = 1 };
    15     15   		cost = { power = 100 };
    16     16   		flag = { print = true };
    17     17   		time = { print = 5 };
    18     18   	};
    19     19   	for i = stages, 0, -1 do
    20     20   		minetest.register_node(chemLampID(i), {
    21     21   			short_description = 'Chem Lamp';

Modified mods/starlit/interfaces.lua from [461714c4c0] to [42263b381c].

   220    220   						pnan.primary = nil
   221    221   					elseif pptrMatch(ptr, pnan.secondary) then
   222    222   						pnan.secondary = nil
   223    223   					else
   224    224   						pnan.secondary = ptr
   225    225   					end
   226    226   					user:suitSound 'starlit-configure'
          227  +					if user.actMode == 'off' then
          228  +						user:actModeSet 'nano'
          229  +					end
   227    230   				elseif pgm.sw.powerKind == 'direct' then
   228    231   					local ctx = suitCtx(pgm)
   229    232   					if pgm.sw.ui then
   230    233   						user:openUI(pgm.sw.ui, 'index', ctx)
   231    234   						return false
   232    235   					else
   233    236   						pgm.sw.run(user, ctx)

Modified mods/starlit/terrain.lua from [18098e5201] to [5c8125f149].

   109    109   			def.img .. '.png';
   110    110   			'starlit-terrain-soil.png';
   111    111   			{
   112    112   				name = 'starlit-terrain-soil.png^' .. def.img ..'-overlay.png';
   113    113   				tileable_vertical = false;
   114    114   			};
   115    115   		};
   116         -		groups = {looseClump = 2, grass = 1, soil = 1, sub_walk = 1};
          116  +		groups = {looseClump = 2, grass = 1, soil = 1};
   117    117   		drop = soilDrop;
   118    118   		sounds = grassSounds;
   119    119   		_starlit = {
   120    120   			recover = def.recover;
   121    121   			recover_vary = def.recover_vary;
   122    122   		};
   123    123   	})
................................................................................
   183    183   		drowning = 40;
   184    184   		post_effect_color = {a=103, r=10, g=40, b=70};
   185    185   		groups = {water = 3, liquid = 3};
   186    186   	});
   187    187   end
   188    188   
   189    189   
   190         -starlit.world.mineral.foreach('starlit:mineral_generate', {}, function(name,m)
   191         -	local node = string.format('starlit:mineral_%s', name)
          190  +starlit.world.mineral.foreach('starlit:mineral-generate', {}, function(node,m)
   192    191   	local grp = {mineral = 1}
   193    192   	minetest.register_node(node, {
   194    193   		short_description = m.name;
   195    194   		description = starlit.ui.tooltip {
   196    195   			title = m.name;
   197    196   			desc = m.desc;
   198    197   			color = m.tone;
................................................................................
   219    218   			seed = seed*50 + string.byte(m.name, i)
   220    219   		end
   221    220   		minetest.register_ore {
   222    221   			ore = node;
   223    222   			ore_type = m.dist.kind;
   224    223   			wherein = m.dist.among;
   225    224   			clust_scarcity = m.dist.rare;
   226         -			y_max = m.dist.height[1], y_min = m.dist.height[2];
          225  +			clust_num_ores = m.dist.ores;
          226  +			clust_size = m.dist.clust;
          227  +			y_min = m.dist.height[1], y_max = m.dist.height[2];
   227    228   			column_height_min = m.dist.sheetCols and m.dist.sheetCols[1] or nil;
   228    229   			column_height_max = m.dist.sheetCols and m.dist.sheetCols[2] or nil;
   229    230   			noise_params = m.dist.noise or {
   230    231   				scale = 1;
   231         -				spread = vector.new(128,128,128);
          232  +				spread = vector.new(16,16,16);
   232    233   				seed = seed;
   233    234   				octaves = 2;
   234    235   			};
   235    236   		}
   236    237   	end
   237    238   end)
   238    239   
   239         -starlit.world.mineral.link('feldspar', {
          240  +starlit.world.mineral.link('starlit:mineral_feldspar', {
   240    241   	name = T 'Feldspar';
   241    242   	tiles = {'starlit-terrain-feldspar.png'};
   242    243   	excludeOre = true;
   243    244   	recover = starlit.type.fab {
   244    245   		time = { shred = 3; };
   245    246   		cost = { shredPower = 3; };
   246    247   	};
................................................................................
   251    252   				potassium = rng:int(0,2);
   252    253   				calcium   = rng:int(0,2);
   253    254   			}
   254    255   		};
   255    256   	end;
   256    257   })
   257    258   
   258         -starlit.world.mineral.link('granite', {
          259  +starlit.world.mineral.link('starlit:mineral_granite', {
   259    260   	name = T 'Granite';
   260    261   	tiles = {'starlit-terrain-granite.png'};
   261    262   	dist = {
   262    263   		kind = 'sheet';
   263         -		among = 'starlit:feldspar';
          264  +		among = 'starlit:mineral_feldspar';
   264    265   		height = {-200,30};
   265    266   		sheetCols = {1, 16};
   266    267   	};
   267    268   	recover = starlit.type.fab {
   268         -		time = { shred = 4; };
          269  +		time = { shred = 3.5; };
   269    270   		cost = { shredPower = 8; };
   270    271   	};
   271    272   	recover_vary = function(rng, ctx)
   272         -		-- print('vary!', rng:int(), rng:int(0,10))
   273    273   		return starlit.type.fab {
   274    274   			element = {
   275         -				aluminum  = rng:int(0,4);
   276         -				potassium = rng:int(0,2);
   277         -				calcium   = rng:int(0,2);
          275  +				iron      = rng:int(0,4);
          276  +				magnesium = rng:int(0,2);
          277  +				titanium  = rng:int(0,1);
   278    278   			}
   279    279   		};
   280    280   	end;
   281    281   })
          282  +
          283  +starlit.world.mineral.link('starlit:mineral_cuprite', {
          284  +	name = T 'Cuprite';
          285  +	dist = {
          286  +		kind = 'blob';
          287  +		among = 'starlit:mineral_feldspar';
          288  +		height = {-20,20};
          289  +		clust = 8;
          290  +		ores = 1;
          291  +		rare = 1000;
          292  +		color = lib.color(.5,.2,.1);
          293  +		noise = {
          294  +			scale = 1;
          295  +			spread = vector.new(5,5,5);
          296  +			seed = 0x1faf7e1;
          297  +			octaves = 1
          298  +		}
          299  +	};
          300  +	tiles = {'starlit-terrain-cuprite.png'};
          301  +	recover = starlit.type.fab {
          302  +		element = { copper = 10 };
          303  +		time = { shred = 3; };
          304  +		cost = { shredPower = 3; };
          305  +	};
          306  +})
   282    307   
   283    308   -- map generation
   284    309   
   285    310   minetest.register_alias('mapgen_stone', 'starlit:mineral_feldspar')
   286    311   minetest.register_alias('mapgen_water_source', 'starlit:liquid_water')
   287    312   minetest.register_alias('mapgen_river_water_source', 'starlit:liquid_water')
   288    313   

Modified mods/starlit/ui.lua from [a436d8c893] to [01dfc2a3de].

   160    160   		local idx, rowH, totalH = 0,0,0
   161    161   		local cols = def.cols or math.huge
   162    162   		local startX = state.x
   163    163   		local maxX = startX
   164    164   		for _, w in ipairs(def) do idx = idx + 1
   165    165   			local src, st = starlit.ui.build(w, state)
   166    166   			-- TODO alignments
   167         -			rowH = math.max(rowH, st.h)
   168    167   			if idx > cols or (def.w and (state.x + state.spacing + st.w > def.w)) then
   169    168   				totalH = totalH + rowH
   170    169   				state.x = startX
          170  +				state.y = state.y + state.spacing + rowH
   171    171   				rowH,idx = 0,0
   172         -				state.y = state.y + state.spacing + st.h
   173    172   			end
          173  +			rowH = math.max(rowH, st.h)
   174    174   			widget('container[%s,%s]%scontainer_end[]', state.x, state.y, src)
   175    175   			state.x=state.x + state.spacing + st.w
   176    176   			maxX = math.max(state.x, maxX)
   177    177   		end
   178    178   		totalH = totalH + rowH
          179  +		state.y = state.y + rowH
   179    180   		state.h = math.max(state.h, totalH) + state.padding
   180    181   		state.w = state.x + state.padding/2
   181    182   		state.x = maxX
   182    183   	elseif def.kind == 'pane' then
   183    184   		local top = state.y
   184    185   		widget('scroll_container[%s,%s;%s,%s;%s;vertical]',
   185    186   			state.x, state.y, state.w, state.h,