starlit  Check-in [e905f495dc]

Overview
Comment:fix some bugs, start work on actually using the tier system, add usage docs
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: e905f495dc51bcb45ecc91c61af102a75b3b1404db5a70f61225e3101e12f1b7
User & Date: lexi on 2024-05-07 23:16:29
Other Links: manifest | tags
Context
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
03:45
compiler now draws power, better compile job progress bars, stats screen refreshes check-in: 52a4f364ac user: lexi tags: trunk
Changes

Modified mods/starlit-electronics/init.lua from [50792bb85d] to [edafa25ca2].

   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')))
   309    310   local batteryTiers = {
   310    311   	makeshift = {
   311    312   		name = 'Makeshift'; capacity = .5, decay = 3, leak = 2, dischargeRate = 1,
   312         -		fab = starlit.type.fab {
   313         -			element = {copper=10};
   314         -			cost = {power = 0.3};
   315         -			time = {print = .25};
   316         -		};
          313  +-- 		fab = starlit.type.fab {
          314  +-- 			element = {copper=10};
          315  +-- 			cost = {power = 0.3};
          316  +-- 			time = {print = .25};
          317  +-- 		};
          318  +		fab = starlit.world.tier.fabsum('makeshift', 'battery');
   317    319   		desc = "Every attosecond this electrical abomination doesn't explode in your face is but the unearned grace of the Wild Gods.";
   318    320   		complexity = 1;
   319    321   		sw = {rarity = 1};
   320    322   	};
   321    323   	imperial  = {
   322    324   		name = 'Imperial'; capacity = 2, decay = 2, leak = 2, dischargeRate = 2; 
   323         -		fab = starlit.type.fab {
   324         -			element = {copper=15, iron = 20};
   325         -			size = { print = 0.1 };
   326         -			cost = {power = 2};
   327         -			time = {print = .5};
   328         -		};
          325  +-- 		fab = starlit.type.fab {
          326  +-- 			element = {iron = 20};
          327  +-- 			size = { print = 0.1 };
          328  +-- 			cost = {power = 2};
          329  +-- 			time = {print = .5};
          330  +-- 		};
          331  +		fab = starlit.world.tier.fabsum('imperial', 'battery');
   329    332   		desc = "The Empire's native technology is a lumbering titan: bulky, inefficient, unreliable, ugly, and awesomely powerful. Their batteries are no exception, with raw capacity and throughput that exceed even Usukinwya designs.";
   330    333   		drm = 1;
   331    334   		complexity = 2;
   332    335   		sw = {rarity = 2};
   333    336   	};
   334    337   	commune   = {
   335    338   		name = 'Commune'; capacity = 1, decay = .5, leak = .2, dischargeRate = 1; 
   336         -		fab = starlit.type.fab {
   337         -			element = {vanadium = 50};
   338         -			metal = {steel=10};
   339         -			size = { print = 0.05 };
   340         -			cost = {power = 1};
   341         -		};
          339  +		fab = starlit.world.tier.fabsum('commune', 'battery');
          340  +-- 		fab = starlit.type.fab {
          341  +-- 			element = {vanadium=10};
          342  +-- 			metal = {aluminum=10};
          343  +-- 			size = { print = 0.05 };
          344  +-- 			cost = {power = 1};
          345  +-- 		};
   342    346   		desc = "The Commune's proprietary battery designs prioritize reliability, compactness, and maintenance concerns above raw throughput, with an elegance of engineering and design that would make a Su'ikuri cry.";
   343    347   		complexity = 5;
   344    348   		sw = {rarity = 3};
   345    349   	};
   346    350   	usukwinya = {
   347    351   		name = 'Usukwinya'; capacity = 2, decay = 1, leak = 1, dischargeRate = 1.5,
   348         -		fab = starlit.type.fab {
   349         -			element = {argon=10};
   350         -			metal = {vanadium=30};
   351         -			size = { print = 0.07 };
   352         -			cost = {power = .8};
   353         -		};
          352  +		fab = starlit.world.tier.fabsum('usukwinya', 'battery');
          353  +-- 		fab = starlit.type.fab {
          354  +-- 			element = {argon=10, vanadium=10};
          355  +-- 			size = { print = 0.07 };
          356  +-- 			cost = {power = .8};
          357  +-- 		};
   354    358   		desc = "A race of consummate value engineers, the Usukwinya have spent thousands of years refining their tech to be as cheap to build as possible, without compromising much on quality. The Tradebirds drive an infamously hard bargain, but their batteries are more than worth their meagre cost.";
   355    359   		drm = 2;
   356    360   		sw = {rarity = 10};
   357    361   		complexity = 15;
   358    362   	};
   359    363   	eluthrai  = {
   360    364   		name = 'Eluthrai'; capacity = 3, decay = .4, leak = .1, dischargeRate = 1.5,
   361         -		fab = starlit.type.fab {
   362         -			element = {beryllium=20, platinum=20, technetium = 1};
   363         -			metal = {cinderstone = 10};
   364         -			size = { print = 0.03 };
   365         -			cost = {power = 10};
   366         -			time = {print = 2};
   367         -		};
          365  +		fab = starlit.world.tier.fabsum('eluthrai', 'battery');
          366  +-- 		fab = starlit.type.fab {
          367  +-- 			element = {beryllium=20, platinum=20, technetium = 1};
          368  +-- 			metal = {cinderstone = 10};
          369  +-- 			size = { print = 0.03 };
          370  +-- 			cost = {power = 10};
          371  +-- 			time = {print = 2};
          372  +-- 		};
   368    373   		desc = "The uncompromising Eluthrai are never satisfied until every quantifiable characteristic of their tech is maximally optimised down to the picoscale. Their batteries are some of the best in the Reach, and unquestionably the most expensive -- especially for those lesser races trying to copy the designs without the benefit of the sublime autofabricator ecosystem of the Eluthrai themselves.";
   369    374   		complexity = 200;
   370    375   		sw = {rarity = 0}; -- you think you're gonna buy eluthran schematics on SuperDiscountNanoWare.space??
   371    376   	};
   372    377   	firstborn = {
   373    378   		name = 'Firstborn'; capacity = 5, decay = 0.1, leak = 0, dischargeRate = 3;
   374         -		fab = starlit.type.fab {
   375         -			element = {neodymium=20, xenon=150, technetium=5};
   376         -			metal = {sunsteel = 10};
   377         -			crystal = {astrite = 1};
   378         -			size = { print = 0.05 };
   379         -			cost = {power = 50};
   380         -			time = {print = 4};
   381         -		};
          379  +		fab = starlit.world.tier.fabsum('firstborn', 'battery');
          380  +-- 		fab = starlit.type.fab {
          381  +-- 			element = {neodymium=20, xenon=150, technetium=5};
          382  +-- 			metal = {sunsteel = 10};
          383  +-- 			crystal = {astrite = 1};
          384  +-- 			size = { print = 0.05 };
          385  +-- 			cost = {power = 50};
          386  +-- 			time = {print = 4};
          387  +-- 		};
   382    388   		desc = "Firstborn engineering seamlessly merges psionic effects with a mastery of the physical universe unattained by even the greatest of the living Starsouls. Their batteries reach levels of performance that strongly imply Quantum Gravity Theory -- and several major holy books -- need to be rewritten. From the ground up.";
   383    389   		complexity = 1000;
   384    390   		sw = {rarity = 0}; -- lol no
   385    391   	};
   386    392   }
   387    393   
   388    394   local batterySizes = {
................................................................................
   395    401   	huge  = {name = 'Huge',  capacity =  3, dischargeRate =   2, complexity = 1, matMult = 2,
   396    402   		fab = starlit.type.fab {size={print=0.8},cost={power=8},time={print=120}}};
   397    403   }
   398    404   
   399    405   local batteryTypes = {
   400    406   	supercapacitor = {
   401    407   		name = 'Supercapacitor';
   402         -		desc = 'Room-temperature superconductors make for very reliable, high-dischargeRate, but low-capacity batteries.';
          408  +		desc = 'Room-temperature superconductors make for very reliable, high-discharge rate, but low-capacity batteries.';
   403    409   		fab = starlit.type.fab {
   404    410   			metal = { enodium = 5 };
   405    411   			size = {print=0.8};
   406    412   			cost = {power = 1e3};
   407    413   		};
   408    414   		sw = {
   409    415   			cost = {
................................................................................
   499    505   for bTierName, bTier in pairs(batteryTiers) do
   500    506   for bSizeName, bSize in pairs(batterySizes) do
   501    507   	-- elemath(elementCost, bType.fab.element or {}, bSize.matMult)
   502    508   	-- elemath(elementCost, bTier.fab.element or {}, bSize.matMult)
   503    509   	-- elemath(metalCost, bType.fab.metal or {}, bSize.matMult)
   504    510   	-- elemath(metalCost, bTier.fab.metal or {}, bSize.matMult)
   505    511   	local fab = bType.fab + bTier.fab + bSize.fab + starlit.type.fab {
   506         -		element = {copper = 10, silicon = 5};
          512  +		element = {copper = 10};
   507    513   	}
   508    514   	local baseID = string.format('battery_%s_%s_%s',
   509    515   		bTypeName, bTierName, bSizeName)
   510    516   	local id = 'starlit_electronics:'..baseID
   511    517   	local name = string.format('%s %s Battery', bTier.name, bType.name)
   512    518   	if bSize.name then name = bSize.name .. ' ' .. name end
   513    519   	local function batStat(s)

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

     1      1   local T = starlit.translator
     2      2   local lib = starlit.mod.lib
            3  +
            4  +local soilRec = starlit.type.fab {
            5  +	element = {
            6  +		carbon = 25;
            7  +	};
            8  +	time = { shred = 2.5; };
            9  +};
     3     10   
     4     11   starlit.terrain = {}
     5     12   local soilSounds = {
     6     13   	footstep = 'default-dirt-footstep';
     7     14   	dug = 'default-dug-node';
     8     15   }
     9     16   local sandSounds = {
................................................................................
    32     39   	tiles = {'starlit-terrain-soil.png'};
    33     40   	groups = {looseClump = 2, soil = 1};
    34     41   	drop = soilDrop;
    35     42   	sounds = soilSounds;
    36     43   	_starlit = {
    37     44   		kind = 'block';
    38     45   		elements = {};
           46  +		recover = soilRec;
    39     47   	};
    40     48   })
    41     49   
    42     50   
    43     51   minetest.register_node('starlit:sand', {
    44     52   	description = T 'Sand';
    45     53   	tiles = {'starlit-terrain-sand.png'};
................................................................................
    56     64   	description = T 'Lifesilt';
    57     65   	tiles = {'starlit-terrain-lifesilt.png'};
    58     66   	groups = {looseClump = 1, lifesilt = 1, falling_node = 1};
    59     67   	drop = '';
    60     68   	sounds = sandSounds;
    61     69   	_starlit = {
    62     70   		kind = 'block';
    63         -		fab = starlit.type.fab { element = { carbon = 8, silicon = 4 } };
           71  +		recover = starlit.type.fab { element = { carbon = 16, silicon = 16, rubidium = 4 } };
    64     72   	};
    65     73   })
    66     74   
    67     75   minetest.register_craftitem('starlit:soil_clump', {
    68     76   	short_description = T 'Soil';
    69     77   	description = starlit.ui.tooltip {
    70     78   		title = T 'Soil';
................................................................................
    77     85   		if me:get_count() < 3 then return end
    78     86   		if minetest.place_node(point.above, {name = 'starlit:soil'}, luser) then
    79     87   			me:take_item(3)
    80     88   		end
    81     89   		return me
    82     90   	end;
    83     91   	_starlit = {
    84         -		fab = starlit.type.fab { element = { carbon = 12 / 4 } };
           92  +		recover = starlit.type.fab { element = { carbon = 25 / 4 } };
    85     93   	};
    86     94   })
    87     95   
    88     96   function starlit.terrain.createGrass(def)
    89     97   	local drop = {
    90     98   		max_items = 4;
    91     99   		items = {
................................................................................
   105    113   				tileable_vertical = false;
   106    114   			};
   107    115   		};
   108    116   		groups = {looseClump = 2, grass = 1, soil = 1, sub_walk = 1};
   109    117   		drop = soilDrop;
   110    118   		sounds = grassSounds;
   111    119   		_starlit = {
   112         -			fab = def.fab;
   113    120   			recover = def.recover;
   114    121   			recover_vary = def.recover_vary;
   115    122   		};
   116    123   	})
   117    124   end
   118    125   
   119    126   
   120    127   starlit.terrain.createGrass {
   121    128   	name = 'starlit:greengraze';
   122    129   	desc = T 'Greengraze';
   123    130   	img = 'starlit-terrain-greengraze';
   124         -	fab = starlit.type.fab {
   125         -		element = { carbon = 12; };
   126         -		time = { shred = 2.5; };
   127         -	};
          131  +	recover = soilRec;
   128    132   }
   129    133   
   130    134   starlit.terrain.createGrass {
   131    135   	name = 'starlit:undergloam';
   132    136   	desc = T 'Undergloam';
   133    137   	-- fungal carpet
   134    138   	img = 'starlit-terrain-undergloam';
   135         -	fab = starlit.type.fab {
   136         -		element = {
   137         -			carbon = 12;
   138         -		};
   139         -		time = { shred = 2.5; };
   140         -	};
          139  +	recover = soilRec;
   141    140   }
   142    141   
   143    142   for _, w in pairs {false,true} do
   144    143   	minetest.register_node('starlit:liquid_water' .. (w and '_flowing' or ''), {
   145    144   		description = T 'Water';
   146    145   		drawtype = 'liquid';
   147    146   		waving = 3;
   148    147   		tiles = {
   149    148   			{
   150         -				name = "default_water_source_animated.png";
          149  +-- 				name = "default_water_source_animated.png";
          150  +				name = "starlit-water.png";
   151    151   				backface_culling = false;
   152    152   				animation = {
   153    153   					type = "vertical_frames";
   154    154   					aspect_w = 16;
   155    155   					aspect_h = 16;
   156    156   					length = 2.0;
   157    157   				};
   158    158   			};
   159    159   			{
   160         -				name = "default_water_source_animated.png";
          160  +-- 				name = "default_water_source_animated.png";
          161  +				name = "starlit-water.png";
   161    162   				backface_culling = true;
   162    163   				animation = {
   163    164   					type = "vertical_frames";
   164    165   					aspect_w = 16;
   165    166   					aspect_h = 16;
   166    167   					length = 2.0;
   167    168   				};

Modified mods/starlit/tiers.lua from [513c94b946] to [de1b489a19].

     7      7   function starlit.world.tier.fabsum(name, ty)
     8      8   	local dest = fab {}
     9      9   	local t = starlit.world.tier.db[name]
    10     10   	assert(t, 'reference to nonexisting tier '..name)
    11     11   	if t.super then
    12     12   		dest = dest+starlit.world.tier.fabsum(t.super, ty)*(t.cost or 1)
    13     13   	end
    14         -	if t.fabclasses and t.fabclasses[ty] then
    15         -		dest = dest + t.fabclasses[ty]
           14  +	if t.fabclass and (t.fabclass[ty] or t.fabclass.basis) then
           15  +		dest = dest + (t.fabclass[ty] or t.fabclass.basis)
    16     16   	end
    17     17   	return dest
    18     18   end
    19     19   
    20     20   function starlit.world.tier.tech(name, tech)
    21     21   	local t = starlit.world.tier.db[name]
    22     22   	if t.techs and t.techs[tech] ~= nil then return t.techs[tech] end
................................................................................
    37     37   	------------------
    38     38   	-- tier classes --
    39     39   	------------------
    40     40   
    41     41   	lesser = {
    42     42   		name = 'Lesser', adj = 'Lesser';
    43     43   		super = 'base';
    44         -		fabclasses = {
           44  +		fabclass = {
    45     45   			basis = fab {
    46         -				metal = {aluminum=4};
           46  +				element = {aluminum=4};
    47     47   			};
    48     48   		};
    49     49   	};
    50     50   	greater = {
    51     51   		name = 'Greater', adj = 'Greater';
    52     52   		super = 'base';
    53         -		fabclasses = {
           53  +		fabclass = {
    54     54   			basis = fab {
    55         -				metal = {vanadium=2};
           55  +				element = {vanadium=2};
    56     56   			};
    57     57   		};
    58     58   	};
    59     59   	starlit = {
    60         -		name = 'Starsoul', adj = 'Starsoul';
           60  +		name = 'Starlit', adj = 'Starlit';
    61     61   		super = 'base';
    62         -		fabclasses = {
           62  +		fabclass = {
    63     63   			basis = fab {
    64         -				metal = {osmiridium=1};
           64  +				element = {iridium=1};
    65     65   			};
    66     66   		};
    67     67   	};
    68     68   	forevanished = {
    69     69   		name = 'Forevanished One', adj = 'Forevanished';
    70     70   		super = 'base';
    71         -		fabclasses = {
           71  +		fabclass = {
    72     72   			basis = fab {
    73     73   				metal = {elusium=1};
    74     74   			};
    75     75   		};
    76     76   	};
    77     77   
    78     78   	------------------
................................................................................
    83     83   		name = 'Makeshift', adj = 'Makeshift';
    84     84   		super = 'lesser';
    85     85   		techs = {tool = true, prim = true, electric = true};
    86     86   		power = 0.5;
    87     87   		efficiency = 0.3;
    88     88   		reliability = 0.2;
    89     89   		cost = 0.3;
    90         -		fabclasses = { -- characteristic materials
           90  +		fabclass = { -- characteristic materials
    91     91   			basis = fab { -- fallback
    92         -				metal = {iron=3};
           92  +				element = {aluminum=4};
    93     93   			};
    94     94   		};
    95     95   	};
    96     96   
    97     97   	imperial = { --powerful trash
    98     98   		name = 'Imperial', adj = 'Imperial';
    99     99   		super = 'lesser';
   100    100   		techs = {tool = true, electric = true, electronic = true, suit = true, combatSuit = true, weapon = true, hover='ion'};
   101    101   		power = 2.0;
   102    102   		efficiency = 0.5;
   103    103   		reliability = 0.5;
   104    104   		cost = 1.0;
   105         -		fabclasses = {
          105  +		fabclass = {
   106    106   			basis = fab {
   107         -				metal = {steel=2};
          107  +				element = {iron=2};
   108    108   			};
   109    109   		};
   110    110   	};
   111    111   
   112    112   	commune = { --reliability
   113    113   		name = 'Commune', adj = 'Commune';
   114    114   		super = 'lesser';
   115    115   		techs = {tool = true, electric = true, electronic = true, suit = true, combatSuit = true, weapon = true, gravitic = true, hover='grav'};
   116    116   		power = 1.0;
   117    117   		efficiency = 2.0;
   118    118   		reliability = 3.0;
   119    119   		cost = 1.5;
   120         -		fabclasses = {
          120  +		fabclass = {
   121    121   			basis = fab {
   122         -				metal = {titanium=1};
          122  +				element = {titanium=1};
   123    123   				time = {print = 1.2}; -- commune stuff is intricate
   124    124   			};
   125    125   		};
   126    126   	};
   127    127   
   128    128   	-------------------
   129    129   	-- Greater Races --
................................................................................
   138    138   		name = 'Su\'ikuri', adj = "Su'ikuruk";
   139    139   		super = 'starlit';
   140    140   		techs = {psi = true, prim = true, bioSuit = true, psiSuit = true};
   141    141   		power = 1.5;
   142    142   		efficiency = 1.0;
   143    143   		reliability = 3.0;
   144    144   		cost = 2.0;
   145         -		fabclasses = {
          145  +		fabclass = {
   146    146   			psi = fab {
   147         -				metal = {numinium = 2.0};
   148         -				crystal = {beryllium = 1.0};
          147  +				element = {numinium = 2.0};
   149    148   			};
   150    149   			bio = fab {
   151         -				crystal = {beryllium = 1.0};
          150  +				element = {beryllium = 1.0};
   152    151   			};
   153    152   		};
   154    153   	};
   155    154   
   156    155   	usukwinya = { --value for 'money'; no weapons; no hovertech (they are birds)
   157    156   		-- NOTA BENE: the ususkwinya *do* have weapons of their own; however,
   158    157   		-- they are extremely restricted and never made available except to a
   159         -		-- very select number of that species. consequently, usuk players
          158  +		-- very select number of that species, those members who need stronger
          159  +		-- defenses than their native psionics can provide. consequently, usuk players
   160    160   		-- of a certain scenario may have usuk starting weapons, but these must
   161    161   		-- be manually encoded to avoid injecting them into the overall crafting
   162    162   		-- /loot system. because there are so few of these weapons in existence,
   163    163   		-- all so tightly controlled, the odds of the weapons or plans winding
   164    164   		-- up on Farthest Shadow are basically zero unless you bring them yourself
   165    165   		name = 'Usukwinya', adj = 'Usuk';
   166    166   		super = 'starlit';
   167    167   		techs = lib.tbl.set('tool', 'electric', 'electronic', 'suit', 'gravitic');
   168    168   		power = 2.0;
   169    169   		efficiency = 2.0;
   170    170   		reliability = 2.0;
   171    171   		cost = 0.5;
   172         -		fabclasses = {
          172  +		fabclass = {
   173    173   			basis = fab {
   174         -				crystal = {aluminum = 5}; -- ruby
          174  +				element = {cobalt=2};
   175    175   			};
   176    176   		};
   177    177   	};
   178    178   
   179    179   	eluthrai = { --super-tier
   180    180   		name = 'Eluthrai', adj = 'Eluthran';
   181    181   		super = 'starlit';
   182    182   		techs = {tool = true, electric = true, electronic = true, weapon = true, gravitic = true, gravweapon = true, suit = true, combatSuit = true, hover = 'grav'};
   183    183   		power = 4.0;
   184    184   		efficiency = 4.0;
   185    185   		reliability = 4.0;
   186    186   		cost = 4.0;
   187         -		fabclasses = {
          187  +		fabclass = {
   188    188   			basis = fab {
   189         -				crystal = {carbon = 5}; -- diamond
          189  +				element = {scandium = 1};
          190  +			};
          191  +			weapon = {
          192  +				metal = {cinderstone = 1};
   190    193   			};
   191    194   			special	= fab {
   192         -				metal = {technetium=1, cinderstone=1}
          195  +				element = {technetium=1};
   193    196   			};
   194    197   		};
   195    198   	};
   196    199   
   197    200   	-----------------------
   198    201   	-- Forevanished Ones --
   199    202   	-----------------------
................................................................................
   202    205   		name = 'Firstborn', adj = 'Firstborn';
   203    206   		super = 'forevanished';
   204    207   		techs = {tool = true, electric = true, electronic = true, suit = true, psi = true, combatSuit = true, weapon = true, gravitic = true, gravweapon = true};
   205    208   		power = 10.0;
   206    209   		efficiency = 5.0;
   207    210   		reliability = 3.0;
   208    211   		cost = 10.0;
   209         -		fabclasses = {
          212  +		fabclass = {
   210    213   			basis = fab {
   211         -				metal = {technetium=2, neodymium=3, sunsteel=1};
   212         -				crystal = {astrite=1};
          214  +				element = {technetium=2, neodymium=3};
          215  +-- 				metal = {sunsteel=1};
          216  +-- 				crystal = {astrite=1};
   213    217   			};
   214    218   		};
   215    219   	};
   216    220   
   217    221   	forevanisher = { --godslayer-tier
   218    222   		name = 'Forevanisher', adj = 'Forevanisher';
   219    223   		super = 'forevanished';
   220    224   		techs = {tool = true, electric = true, electronic = true, suit = true, psi = true, combatSuit = true, weapon = true, gravitic = true, gravweapon = true};
   221    225   		power = 20.0;
   222    226   		efficiency = 1.0;
   223    227   		reliability = 2.0;
   224    228   		cost = 100.0;
   225         -		fabclasses = {
          229  +		fabclass = {
   226    230   			basis = fab {
   227    231   				metal = {};
   228         -				crystal = {};
   229    232   			};
   230    233   		};
   231    234   	};
   232    235   
   233    236   }

Modified mods/starlit/user.lua from [4cee014aa7] to [1ac6a2a876].

   158    158   
   159    159   		uiColor = function(self) return lib.color {hue=238,sat=.5,lum=.5} end;
   160    160   
   161    161   		-----------
   162    162   		-- stats --
   163    163   		-----------
   164    164   		statDelta = function(self, stat, d, cause, abs)
          165  +			if self.entity:get_hp() == 0 then return end
   165    166   			local dt = self.persona.statDeltas
   166    167   			local min, max, base = self:statRange(stat)
   167    168   			if abs then
   168    169   				if     d == true  then d = max
   169    170   				elseif d == false then d = min end
   170    171   			end
   171    172   			if stat == 'health' then
................................................................................
   714    715   			dropInv 'main'
   715    716   			dropInv 'starlit_suit'
   716    717   			self:updateSuit()
   717    718   		end;
   718    719   		onRespawn = function(self)
   719    720   			local meta = self.entity:get_meta()
   720    721   			self.entity:set_pos(vector.from_string(meta:get_string'starlit_spawn'))
   721         -			self:statDelta('psi',          0, 'death', true)
          722  +			self:statDelta('numina',          0, 'death', true)
   722    723   			self:statDelta('nutrition', 1500, 'death', true)
   723    724   			self:statDelta('hydration',    2, 'death', true)
   724    725   			self:statDelta('fatigue',      0, 'death', true)
   725    726   			self:statDelta('stamina',      0, 'death', true)
   726    727   			self:updateSuit()
   727    728   			return true
   728    729   		end;

Modified mods/vtlib/math.lua from [276f7a5d6e] to [818384c4da].

    89     89   function fn.lerp(t, a, b) return (1-t)*a + t*b end
    90     90   function fn.gradient(grad, pos)
    91     91   	local n = #grad
    92     92   	if n == 1 then return grad[1] end
    93     93   	local op = pos*(n-1)
    94     94   	local idx = math.floor(op)
    95     95   	local t = op-idx
    96         -	return fn.lerp(t, grad[1 + idx], grad[2 + idx])
           96  +	return fn.lerp(t, grad[1 + idx] or grad[n], grad[2 + idx] or grad[n])
    97     97   end
    98     98   
    99     99   function fn.trim(fl, prec)
   100    100   	local fac = 10^prec
   101    101   	return math.floor(fl * fac) / fac
   102    102   end
   103    103   

Modified starlit.ct from [7cb4085b3b] to [ee106030ea].

    24     24   
    25     25   [!liars], all of them.
    26     26   
    27     27   are there other survivors? have they been similarly changed? what was that artifact and who were those terrorists? important questions, all, but they pale in comparison with the most important one:
    28     28   
    29     29   how the fuck are you going to survive the next 24 hours?
    30     30   
           31  +## usage
           32  +the ideal way to install [`starlit] on your system is to simply clone the repository with [`fossil]. this way, you can easily update the game whenever it's updated.
           33  +~~~
           34  +$ cd ~/.minetest/games
           35  +$ fossil clone https://c.hale.su/starlit
           36  +~~~
           37  +game assets are not versioned. to update these, run the following command [*in the root of the open starlit repository] (otherwise the archiver will shit all over your everything).
           38  +~~~
           39  +$ fossil uv cat asset.cpxz | xzcat | cpio -i
           40  +~~~
           41  +if, for some unaccountable reason, you don't want to use fossil, you can download a tarball.
           42  +~~~
           43  +$ curl https://c.hale.su/starlit/tarball/starlit.tar.gz | tar x
           44  +$ curl https://c.hale.su/starlit/uv/asset.cpxz | xzcat | cpio -i
           45  +~~~
           46  +eventually i might make proper release tarballs available that bundle the game and assets together, but the game isn't stable enough to do that yet.
           47  +
    31     48   ## engine
    32     49   starlit is developed against a bleeding-edge version of minetest. it definitely won't work with anything older than v5.7, and ideally you should build directly from master.
    33     50   
    34     51   starlit is best used with a patched version of minetest, though it is compatible with vanilla. the recommended patches are:
    35     52   
    36     53   * [>p11143 11143] - fix third-person view orientation
    37     54