starlit  Diff

Differences From Artifact [e59f2eda8d]:

To Artifact [4ca9d32d80]:


    72     72   	description = 'Portable power storage cells are essential to all aspects of survival';
    73     73   })
    74     74   
    75     75   E.schematicGroups.link('starsoul_electronics:decayCell', {
    76     76   	title = 'Decay Cell', icon = 'starsoul-item-decaycell.png';
    77         -	description = "Radioisotope generators can pack much more power into a smaller amount of space than conventional battery, but they can't be recharged, dump power and heat whether they're in use or not, and their power yield drop towards zero over their usable lifetime.";
           77  +	description = "Radioisotope generators can pack much more power into a smaller amount of space than conventional batteries, but they can't be recharged, dump power and heat whether they're in use or not, and their power yield drops towards zero over their usable lifetime.";
    78     78   })
    79     79   
    80     80   
    81     81   -------------------------
    82     82   -- batteries & dynamos --
................................................................................
    98     98   		          stack:get_meta(), ...)
    99     99   	end
   100    100   end
   101    101   
   102    102   -- return a wear level that won't destroy the item
   103         -local function safeWear(fac) return math.min(math.max(fac,0),1) * 0xFFFE end
   104         -local function safeWearToFac(w) return w/0xFFFE end
          103  +-- local function safeWear(fac) return math.min(math.max(fac,0),1) * 0xFFFE end
          104  +-- local function safeWearToFac(w) return w/0xFFFE end
          105  +
          106  +E.battery.update = accessor('battery', function(stack, batClass, meta)
          107  +	-- local cap = E.battery.capacity(stack)
          108  +	local charge = meta:get_float 'starsoul_electronics:battery_charge'
          109  +	meta:set_string('count_meta', string.format('%s%%', math.floor(charge * 100)))
          110  +	meta:set_int('count_alignment', bit.lshift(3, 2) + 2)
          111  +end)
   105    112   
   106    113   -- E.battery.capacity(bat) --> charge (J)
   107    114   E.battery.capacity = accessor('battery', function(stack, batClass, meta)
   108         -	local dmg = meta:get_int('starsoul_electronics:battery_degrade') -- µJ/μW
          115  +	local dmg = meta:get_int 'starsoul_electronics:battery_degrade' -- µJ/μW
   109    116   	local dmg_J = dmg / 1000
   110    117   	return (batClass.capacity - dmg_J)
   111    118   end)
   112    119   
   113    120   -- E.battery.charge(bat) --> charge (J)
   114    121   E.battery.charge = accessor('battery', function(stack, batClass, meta)
   115         -	local fac = 1 - safeWearToFac(stack:get_wear())
          122  +	local fac = meta:get_float 'starsoul_electronics:battery_charge'
          123  +	-- local fac = 1 - safeWearToFac(stack:get_wear())
   116    124   	return E.battery.capacity(stack) * fac
   117    125   end)
   118    126   
   119    127   -- E.battery.dischargeRate(bat) --> dischargeRate (W)
   120    128   E.battery.dischargeRate = accessor('battery', function(stack, batClass, meta)
   121         -	local dmg = meta:get_int('starsoul_electronics:battery_degrade') -- µJ/μW
          129  +	local dmg = meta:get_int 'starsoul_electronics:battery_degrade' -- µJ/μW
   122    130   	local dmg_W = dmg / 1000
   123    131   	return batClass.dischargeRate - dmg_W
   124    132   end);
   125    133   
   126    134   
................................................................................
   140    148   		local degrade = m:get_int 'starsoul_electronics:battery_degrade' or 0
   141    149   		degrade = degrade + maxPower * bc.decay
   142    150   		-- for each joule of power drawn, capacity degrades by `decay` J
   143    151   		-- this should ordinarily be on the order of mJ or smaller
   144    152   		m:set_int('starsoul_electronics:battery_degrade', degrade)
   145         -		s:set_wear(safeWear(1 - (ch / E.battery.capacity(s))))
          153  +		-- s:set_wear(safeWear(1 - (ch / E.battery.capacity(s))))
          154  +		m:set_float('starsoul_electronics:battery_charge', ch / E.battery.capacity(s))
          155  +		E.battery.update(s)
   146    156   	end
   147    157   
   148    158   	return maxPower, 0 -- FIXME specify waste heat
   149    159   end)
   150    160   
................................................................................
   156    166   E.battery.recharge = accessor('battery', function(s, bc, m, power, time)
   157    167   	local ch = E.battery.charge(s)
   158    168   	local cap = E.battery.capacity(s)
   159    169   	local maxPower = math.min(E.battery.dischargeRate(s)*time, power)
   160    170   	local total = math.min(ch + maxPower, cap)
   161         -	s:set_wear(safeWear(1 - (total/cap)))
          171  +	-- s:set_wear(safeWear(1 - (total/cap)))
          172  +	m:set_float('starsoul_electronics:battery_charge', total/cap)
          173  +	E.battery.update(s)
   162    174   	return maxPower, 0 -- FIXME
   163    175   end)
   164    176   
   165    177   E.battery.setCharge = accessor('battery', function(s, bc, m, newPower)
   166    178   	local cap = E.battery.capacity(s)
   167    179   	local power = math.min(cap, newPower)
   168         -	s:set_wear(safeWear(1 - (power/cap)))
          180  +	-- s:set_wear(safeWear(1 - (power/cap)))
          181  +	m:set_float('starsoul_electronics:battery_charge', power/cap)
          182  +	E.battery.update(s)
          183  +end)
          184  +E.battery.setChargeF = accessor('battery', function(s, bc, m, newPowerF)
          185  +	local power = math.min(1.0, newPowerF)
          186  +	m:set_float('starsoul_electronics:battery_charge', power)
          187  +	E.battery.update(s)
   169    188   end)
   170    189   
   171    190   E.dynamo = { kind = {} }
   172    191   
   173    192   E.dynamo.drawCurrent = accessor('dynamo', function(s,c,m, power, time, test)
................................................................................
   209    228   			};
   210    229   		};
   211    230   		_starsoul = {
   212    231   			event = {
   213    232   				create = function(st, how)
   214         -					if not how.gift then -- cheap hack to make starting batteries fully charged
          233  +					--[[if not how.gift then -- cheap hack to make starting batteries fully charged
   215    234   						E.battery.setCharge(st, 0)
   216         -					end
          235  +					end]]
          236  +					E.battery.update(st)
   217    237   				end;
   218    238   			};
   219    239   			fab = def.fab;
   220    240   			dynamo = {
   221    241   				vtable = E.dynamo.kind.battery;
................................................................................
   834    854   		read = function(self)
   835    855   			local dat = E.chip.read(self.chip)
   836    856   			return dat.files[self.inode]
   837    857   		end;
   838    858   		write = function(self,data)
   839         -			print('writing', self.chip, self.inode)
          859  +			-- print('writing', self.chip, self.inode)
   840    860   			return E.chip.fileWrite(self.chip, self.inode, data)
   841    861   		end;
   842    862   		erase = function(self)
   843    863   			local dat = E.chip.read(self.chip)
   844    864   			table.remove(dat.files, self.inode)