Initial commit (version 0.1-test)

This commit is contained in:
2022-11-21 16:12:22 -05:00
commit e4e2a9116d
2062 changed files with 52261 additions and 0 deletions

View File

@@ -0,0 +1 @@
Terumetal v3.0 - Make life easier with alloys and heat machinery!

328
mods/terumet/init.lua Normal file
View File

@@ -0,0 +1,328 @@
--[[ Terumet v3.0
Mod for open-source voxel game Minetest (https://www.minetest.net/)
Written for Minetest version 5.0.0
Now also supports Minetest 0.4.17
Creates a new ore in the world which can be used to make useful alloys
and heat-powered machines.
By Terumoc [https://github.com/Terumoc]
and with contributions from:
> obl3pplifp (https://github.com/obl3pplifp) for bug reports, information, ideas, and other considerable contributions
> RSL-Redstonier [https://github.com/RSL-Redstonier]
> Chem871 [https://github.com/Chemguy99] for many ideas and requests
BIG Thanks to all contributors for their input!
]]--
--[[ Copyright (C) 2017-2019 Terumoc (Scott Horvath)
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. ]]
terumet = {}
terumet.version = {major=3, minor=0, patch=0}
local ver = terumet.version
terumet.version_text = ver.major .. '.' .. ver.minor .. '.' .. ver.patch
terumet.mod_name = "terumet"
-- this isn't the suggested way to check for game version but... it works for my purposes
terumet.legacy = minetest.get_version().string:find('0.4')
if terumet.legacy then
minetest.log('[terumet] MTv0.4.* detected - in legacy mode!')
end
terumet.RAND = PcgRandom(os.time())
local FMT = string.format
minetest.register_chatcommand( 'item_info', {
params = '',
description = 'Get a complete description of the ItemStack in your hand',
privs = {debug=true},
func = function(name)
local player = minetest.get_player_by_name(name)
if player then
local witem = player:get_wielded_item()
if witem:is_empty() then
return true, "You're not holding anything."
else
local def = witem:get_definition()
local wear = witem:get_wear()
local wear_pct = FMT('%.1f%%', wear / 65535 * 100.0)
if def then
return true, FMT('%s "%s" #%s/%s w:%s (%s)',
minetest.colorize('#ff0', witem:get_name()),
def.description,
witem:get_count(),
minetest.colorize('#0ff', def.stack_max),
minetest.colorize('#f0f', wear),
minetest.colorize('#f0f', wear_pct)
)
else
return true, FMT('*NO DEF* %s #%s w:%s (%s)',
minetest.colorize('#ff0', witem:get_name()),
witem:get_count(),
minetest.colorize('#f0f', wear),
minetest.colorize('#f0f', wear_pct)
)
end
end
else
return false, "You aren't a player somehow, sorry?!"
end
end
})
function terumet.chance(pct)
if pct <= 0 then return false end
if pct >= 100 then return true end
return terumet.RAND:next(1,100) <= pct
end
-- function for a node's on_blast callback to be removed with a pct% chance
function terumet.blast_chance(pct, id)
return function(pos)
if terumet.chance(pct) then
minetest.remove_node(pos)
return {id}
else
return nil
end
end
end
-- empty function useful for where a callback is necessary but using nil would cause undesired default behavior
terumet.NO_FUNCTION = function() end
terumet.EMPTY = {}
terumet.ZERO_XYZ = {x=0,y=0,z=0}
function terumet.recipe_3x3(i)
return {
{i, i, i}, {i, i, i}, {i, i, i}
}
end
function terumet.recipe_box(outer, inner)
return {
{outer, outer, outer}, {outer, inner, outer}, {outer, outer, outer}
}
end
function terumet.recipe_plus(i)
return {
{'', i, ''}, {i, i, i}, {'', i, ''}
}
end
function terumet.random_velocity(max_tenths)
return {
x = terumet.RAND:next(-max_tenths,max_tenths) / 10,
y = terumet.RAND:next(-max_tenths,max_tenths) / 10,
z = terumet.RAND:next(-max_tenths,max_tenths) / 10
}
end
function terumet.particle_stream(pointA, pointB, density, particle_data, player)
local dist_vector = {x=(pointB.x-pointA.x), y=(pointB.y-pointA.y), z=(pointB.z-pointA.z)}
local dist = vector.length(dist_vector)
local pcount = dist * density
if pcount < 1 then return end -- guard against div/0
local step = {x=(dist_vector.x/pcount), y=(dist_vector.y/pcount), z=(dist_vector.z/pcount)}
local ppos = vector.new(pointA)
for _ = 1,pcount do
ppos = util3d.pos_plus(ppos, step)
minetest.add_particle{
pos = vector.new(ppos),
velocity=terumet.random_velocity(5),
expirationtime=(particle_data.expiration or 1),
size=(particle_data.size or 1),
glow=(particle_data.glow or 1),
playername=player,
texture=particle_data.texture,
animation=particle_data.animation
}
end
end
function terumet.format_time(t)
return string.format('%.1f s', t or 0)
end
function terumet.do_lua_file(name)
dofile(minetest.get_modpath(terumet.mod_name) .. '/' .. name .. '.lua')
end
-- create a copy of node groups from an unlit machine for lit version of machine
function terumet.create_lit_node_groups(unlit_groups)
local new_groups = {not_in_creative_inventory=1}
for k,v in pairs(unlit_groups) do new_groups[k] = v end
return new_groups
end
function terumet.itemstack_desc(stack)
local stack_desc = stack:get_definition().description
-- use only what is before a newline if one is in the description
if stack_desc:find('\n') then stack_desc = stack_desc:match('(.*)\n') end
if stack:get_count() > 1 then
return string.format('%s (x%d)', stack_desc, stack:get_count())
else
return stack_desc
end
end
-- given a table with 'group:XXX' keys and a node/item definition with groups, return the
-- (first) value in the table where node/item has a group key of XXX, otherwise nil
function terumet.match_group_key(table, def)
if not def then return nil end
for group_name,_ in pairs(def.groups) do
local grp_key = 'group:'..group_name
if table[grp_key] then
return table[grp_key]
end
end
return nil
end
function terumet.id(id, number)
if number then
return string.format('%s:%s %d', terumet.mod_name, id, number)
else
return string.format('%s:%s', terumet.mod_name, id)
end
end
function terumet.give_player_item(pos, player, stack)
local inv = player:get_inventory()
local leftover = inv:add_item("main", stack)
if leftover and not leftover:is_empty() then
minetest.item_drop(leftover, player, player:get_pos())
end
end
function terumet.tex(id)
-- accepts both base ids (assuming this mod) and full mod ids
-- ex: terumet.tex('ingot_raw') -> 'terumet_ingot_raw.png'
-- terumet.tex('default:cobble') -> 'default_cobble.png'
if id:match(':') then
return string.format('%s.png', id:gsub(':', '_'))
else
return string.format('%s_%s.png', terumet.mod_name, id)
end
end
function terumet.item_desc(name, xinfo)
if xinfo then
return string.format("%s\n%s", name, minetest.colorize(terumet.options.misc.TIP_COLOR, xinfo))
else
return name
end
end
function terumet.crystal_tex(color)
return string.format('%s^[multiply:%s', terumet.tex('item_cryst'), color)
end
function terumet.tex_comp(base_tex, overlay_id)
return base_tex .. '^' .. terumet.tex(overlay_id)
end
function terumet.tex_trans(id, rot)
return terumet.tex(id) .. '^[transform' .. rot
end
local HEAR_DIST = 12
terumet.squishy_node_sounds = {
footstep = {name='terumet_squish_step', max_hear_distance=HEAR_DIST},
dig = {name='terumet_squish_dig', max_hear_distance=HEAR_DIST},
dug = {name='terumet_squish_dug', max_hear_distance=HEAR_DIST},
place = {name='terumet_squish_place', max_hear_distance=HEAR_DIST},
}
terumet.do_lua_file('util3d')
terumet.do_lua_file('interop/terumet_api')
terumet.do_lua_file('options')
terumet.do_lua_file('material/reg_alloy')
-- reg_alloy(name, id, block hardness level, repair material value)
terumet.reg_alloy('Terucopper', 'tcop', 1, 20)
terumet.reg_alloy('Terutin', 'ttin', 1, 15)
terumet.reg_alloy('Terusteel', 'tste', 2, 40)
terumet.reg_alloy('Terugold', 'tgol', 3, 80)
terumet.reg_alloy('Coreglass', 'cgls', 4, 120)
terumet.reg_alloy('Teruchalcum', 'tcha', 2, 60)
terumet.do_lua_file('material/ceramic')
--terumet.do_lua_file('material/thermese')
terumet.do_lua_file('material/coil')
--terumet.do_lua_file('material/crushed')
--terumet.do_lua_file('material/pwood')
--terumet.do_lua_file('material/tglass')
terumet.do_lua_file('material/rebar')
terumet.do_lua_file('material/misc')
terumet.do_lua_file('material/crystallized')
--terumet.do_lua_file('material/battery')
local id = terumet.id
-- register raw terumetal ingot as weak repair-material
terumet.register_repair_material(id('ingot_raw'), 10)
--terumet.do_lua_file('tool/reg_tools')
local sword_opts = terumet.options.tools.sword_damage
--terumet.do_lua_file('tool/ore_saw')
-- register repairable default tools and materials
-- {value of 1 item, item id}:
local dmv_values = {
steel={10, 'default:steel_ingot'},
bronze={30, 'default:bronze_ingot'},
mese={90, 'default:mese_crystal'},
diamond={100, 'default:diamond'}
}
for dmat, v in pairs(dmv_values) do
terumet.register_repairable_item("default:pick_"..dmat, v[1]*3)
terumet.register_repairable_item("default:axe_"..dmat, v[1]*3)
terumet.register_repairable_item("default:shovel_"..dmat, v[1])
terumet.register_repairable_item("default:sword_"..dmat, v[1]*2)
terumet.register_repair_material(v[2], v[1])
end
terumet.do_lua_file('material/concrete')
terumet.do_lua_file('material/coalproc')
--experimental stuff
--terumet.do_lua_file('material/meson')
local INTEROPS = {'3d_armor', 'doors', 'unified_inventory', 'tubelib', 'dungeon_loot', 'moreores', 'farming', 'extra'}
for _,mod in ipairs(INTEROPS) do
if minetest.get_modpath(mod) then terumet.do_lua_file('interop/'..mod) end
end
local vacfood_options = terumet.options.vac_oven.VAC_FOOD
if vacfood_options and vacfood_options.ACTIVE then terumet.do_lua_file('material/vacfood') end
terumet.do_lua_file('interop/crusher_misc')

View File

@@ -0,0 +1,219 @@
-- add armor when 3darmor mod is also active
local opts = terumet.options.armor
local function gen_armor_groups(type, data)
local grps = {
armor_use=data.uses,
armor_heal=(data.heal or 0),
armor_water=(data.breathing or 0),
armor_fire=data.fire,
physics_speed=(data.speed or 0),
physics_gravity=(data.gravity or 0),
physics_jump=(data.jump or 0),
}
grps[type]=1
return grps
end
local function reg_recipe_boots(id, mat)
minetest.register_craft{output=id, recipe={
{mat, '', mat},
{mat, '', mat}
}}
end
local function reg_recipe_legs(id, mat)
minetest.register_craft{output=id, recipe={
{mat, mat, mat},
{mat, '', mat},
{mat, '', mat}
}}
end
local function reg_recipe_chest(id, mat)
minetest.register_craft{output=id, recipe={
{mat, '', mat},
{mat, mat, mat},
{mat, mat, mat}
}}
end
local function reg_recipe_helm(id, mat)
minetest.register_craft{output=id, recipe={
{mat, mat, mat},
{mat, '', mat},
}}
end
local function reg_terumet_armor(data)
if not data or not data.suffix or not data.mat then error('Missing data on registering Terumetal armor') end
data.uses = data.uses or 500
data.mrv = data.mrv or 10 -- material repair value of 1x mat
data.dgroups = data.dgroups or {cracky=3, snappy=3, choppy=3, crumbly=3, level=1}
data.name = data.name or data.suffix
local low_def = data.total_def / 6
local hi_def = data.total_def / 3
data.heal = data.total_heal / 4
data.speed = data.weight / -100
data.gravity = data.weight / 50
local boots_id = terumet.id('armboots_'..data.suffix)
armor:register_armor(boots_id, {
description = terumet.item_desc(data.name..' Boots', data.xinfo),
inventory_image = terumet.tex('invboots_'..data.suffix),
texture = terumet.tex('armboots_'..data.suffix),
preview = terumet.tex('prvboots_'..data.suffix),
groups = gen_armor_groups('armor_feet', data),
armor_groups = {fleshy=low_def},
damage_groups = data.dgroups,
})
reg_recipe_boots(boots_id, data.mat)
terumet.register_repairable_item(boots_id, data.mrv*4)
local helm_id = terumet.id('armhelm_'..data.suffix)
armor:register_armor(helm_id, {
description= terumet.item_desc(data.name..' Helmet', data.xinfo),
inventory_image = terumet.tex('invhelm_'..data.suffix),
texture = terumet.tex('armhelm_'..data.suffix),
preview = terumet.tex('prvhelm_'..data.suffix),
groups = gen_armor_groups('armor_head', data),
armor_groups = {fleshy=low_def},
damage_groups = data.dgroups,
})
reg_recipe_helm(helm_id, data.mat)
terumet.register_repairable_item(helm_id, data.mrv*5)
local chest_id = terumet.id('armchest_'..data.suffix)
armor:register_armor(chest_id, {
description= terumet.item_desc(data.name..' Chestpiece', data.xinfo),
inventory_image = terumet.tex('invchest_'..data.suffix),
texture = terumet.tex('armchest_'..data.suffix),
preview = terumet.tex('prvchest_'..data.suffix),
groups = gen_armor_groups('armor_torso', data),
armor_groups = {fleshy=hi_def},
damage_groups = data.dgroups,
})
reg_recipe_chest(chest_id, data.mat)
terumet.register_repairable_item(chest_id, data.mrv*8)
local legs_id = terumet.id('armlegs_'..data.suffix)
armor:register_armor(legs_id, {
description= terumet.item_desc(data.name..' Leggings', data.xinfo),
inventory_image = terumet.tex('invlegs_'..data.suffix),
texture = terumet.tex('armlegs_'..data.suffix),
preview = terumet.tex('prvlegs_'..data.suffix),
groups = gen_armor_groups('armor_legs', data),
armor_groups = {fleshy=hi_def},
damage_groups = data.dgroups,
})
reg_recipe_legs(legs_id, data.mat)
terumet.register_repairable_item(legs_id, data.mrv*7)
end
-- enable terumet bracers
if opts.BRACERS then
-- I would love to colorize every texture rather than require a seperate armor & preview texture for every bracer
-- but it seems that 3d_armor textures do NOT support texture generation with ^ layering and ^[multiply :(
local function bracer_inv_texture(color)
if color then
return string.format('(%s^(%s^[multiply:%s))', terumet.tex('invbrcr_base'), terumet.tex('invbrcr_color'), color)
else
return terumet.tex('invbrcr_base')
end
end
local function core_texture(color)
return string.format('%s^[multiply:%s', terumet.tex('item_brcrcrys'), color)
end
table.insert(armor.elements, "terumet_brcr")
local brcrcrys_id = terumet.id('item_brcrcrys')
minetest.register_craftitem( brcrcrys_id, {
description = 'Blank Bracer Core',
inventory_image = terumet.tex(brcrcrys_id)
})
-- add vulcan crystallizer recipe for blank bracer core
terumet.options.vulcan.recipes[opts.BRACER_CRYSTAL_ITEM] = {brcrcrys_id, 2}
local function reg_terumet_band(data)
if not data or not data.suffix then error('Missing data on registering Terumetal bracer') end
data.uses = data.uses or 500
data.def = data.def or 0
data.dgroups = data.dgroups or {cracky=3, snappy=3, choppy=3, crumbly=3, level=1}
data.name = data.name or data.suffix
-- generate groups now to update xinfo if necessary before registering it
local groups = gen_armor_groups('armor_terumet_brcr', data)
local band_id = terumet.id('brcr_'..data.suffix)
armor:register_armor(band_id, {
description= terumet.item_desc(data.name..' Bracers', data.xinfo),
inventory_image = bracer_inv_texture(data.color),
texture = terumet.tex('armbrcr_'..data.suffix),
preview = terumet.tex('prvbrcr_'..data.suffix),
groups = groups,
armor_groups = {fleshy=data.def},
damage_groups = data.dgroups,
on_equip = data.on_equip,
on_unequip = data.on_unequip,
on_damage = data.on_damage,
on_punched = data.on_punched
})
if data.mat then
local ecryst_id = terumet.id('item_brcrcrys_'..data.suffix)
minetest.register_craftitem( ecryst_id, {
description = data.name..' Bracer Core',
inventory_image = core_texture(data.color)
})
terumet.register_alloy_recipe{result=ecryst_id, flux=4, time=10.0, input={brcrcrys_id, data.mat}}
terumet.register_alloy_recipe{result=band_id, flux=0, time=120.0, input={terumet.id('brcr_base'), ecryst_id .. ' 8'}}
else
local metal = terumet.id('item_cryst_raw')
local coil = terumet.id('item_coil_tgol')
minetest.register_craft{output=band_id, recipe={
{coil, metal, coil},
{metal, metal, metal},
{coil, metal, coil}
}}
end
terumet.register_repairable_item(band_id, data.rep or 80)
end
reg_terumet_band{suffix='base', name='Terumetal', xinfo='No effects', def=5, uses=500, rep=80}
for band_id, band_data in pairs(opts.BRACERS) do
if (not band_data.fire) or armor.config.fire_protect then
band_data.suffix = band_id
reg_terumet_band(band_data)
end
end
end
if not armor.config.fire_protect then
minetest.log('warning', 'terumet: fire protection on armor will not function - 3d_armor fire protection option not activated')
end
-- 3d_armor fire protection notes: total fire protection must meet or exceed the following values to be immune
-- torches = 1, fire = 3, lava = 5
-- this seems to be the only effect it has
reg_terumet_armor{suffix='cgls', name='Coreglass', mat=terumet.id('ingot_cgls'),
mrv=120, total_def=78, total_heal=36, weight=3, xinfo='Weight +3', uses=120, fire=0.75} -- 2 pcs = immune to torches, 4 pcs = immune to fire
reg_terumet_armor{suffix='tcha', name='Teruchalcum', mat=terumet.id('ingot_tcha'),
mrv=60, total_def=64, total_heal=8, weight=2, xinfo='Weight +2', uses=260}
reg_terumet_armor{suffix='tste', name='Terusteel', mat=terumet.id('ingot_tste'),
mrv=40, total_def=56, total_heal=12, weight=1, xinfo='Weight +1', uses=190}
reg_terumet_armor{suffix='tcop', name='Terucopper', mat=terumet.id('ingot_tcop'),
mrv=20, total_def=45, total_heal=4, weight=0, uses=280}
reg_terumet_armor{suffix='tgol', name='Terugold', mat=terumet.id('ingot_tgol'),
mrv=80, total_def=24, total_heal=65, weight=-1, xinfo='Weight -1', uses=720}
reg_terumet_armor{suffix='ttin', name='Terutin', mat=terumet.id('ingot_ttin'),
mrv=21, total_def=38, total_heal=24, weight=-2, xinfo='Weight -2', uses=410, fire=0.34, breathing=.1} -- 3 pcs = immune to torches
reg_terumet_armor{suffix='rsuit', name='Vulcansuit', mat=terumet.id('item_rsuitmat'),
mrv=180, total_def=78, total_heal=50, weight=-3, xinfo='Weight -3', uses=120, fire=1} -- 1 pc = immune to torches, 3 pcs = immune to fire

View File

@@ -0,0 +1,47 @@
-- add crushing recipes for various mods if they are active
local function add_crush(item, result)
terumet.options.crusher.recipes[item] = result
end
if minetest.get_modpath('bushes') then
add_crush('bushes:BushLeaves1', 'terumet:item_dust_bio')
add_crush('bushes:BushLeaves2', 'terumet:item_dust_bio')
end
if minetest.get_modpath('dryplants') then
add_crush('dryplants:grass', 'terumet:item_dust_bio')
end
if minetest.get_modpath('vines') then
add_crush('vines:vines', 'terumet:item_dust_bio')
end
if minetest.get_modpath('farming') then
-- small crops turn into 2 biomatter
local small_crops = {
'wheat', 'peas', 'barley', 'beans', 'pepper', 'beetroot', 'chili_pepper', 'blueberries',
'cucumber', 'grapes', 'garlic', 'onion', 'pea_pod', 'pineapple_ring', 'pineapple_top', 'potato',
'raspberries', 'tomato', 'corn', 'rhubarb'
}
for _,crop in ipairs(small_crops) do
local crop_id = 'farming:'..crop
if minetest.registered_items[crop_id] then
add_crush(crop_id, 'terumet:item_dust_bio 2')
end
end
-- big crops turn into 5 biomatter
local big_crops = {
'pumpkin', 'pineapple', 'melon_8'
}
for _,crop in ipairs(big_crops) do
local crop_id = 'farming'..crop
if minetest.registered_items[crop_id] then
add_crush(crop_id, 'terumet:item_dust_bio 5')
end
end
end

View File

@@ -0,0 +1,79 @@
-- order door type can be converted
local type_order = {'full', 'mesh', 'slat', 'vert'}
local type_names = {
full='Solid %s Door',
mesh='Meshed %s Door',
slat='Slatted %s Door',
vert='Fancy %s Door'
}
local materials = {
tcop={
item=terumet.id('ingot_tcop'),
name='Terucopper',
level=1
},
ttin={
item=terumet.id('ingot_ttin'),
name='Terutin',
level=1
},
tste={
item=terumet.id('ingot_tste'),
name='Terusteel',
level=2
},
tcha={
item=terumet.id('ingot_tcha'),
name='Teruchalcum',
level=2
},
tgol={
item=terumet.id('ingot_tgol'),
name='Terugold',
level=3
},
cgls={
item=terumet.id('ingot_cgls'),
name='Coreglass',
level=4
}
}
for mat_id, mat_data in pairs(materials) do
local first_door_id = nil
local prev_door_id = nil
for _, type_id in pairs(type_order) do
local type_name = type_names[type_id]
local door_id = terumet.id(string.format('door%s_%s', type_id, mat_id))
local door_tex = terumet.tex(string.format('door%s_%s', type_id, mat_id))
local door_invtex = terumet.tex(string.format('dinv%s_%s', type_id, mat_id))
local door_recipe = nil
if not prev_door_id then
door_recipe = {
{mat_data.item, mat_data.item},
{mat_data.item, mat_data.item},
{mat_data.item, mat_data.item}
}
end
doors.register(door_id, {
tiles = {{name = door_tex, backface_culling = true}},
description = string.format(type_name, mat_data.name),
inventory_image = door_invtex,
protected = true,
groups = {cracky = 1, level = mat_data.level},
sounds = default.node_sound_metal_defaults(),
sound_open = 'doors_steel_door_open',
sound_close = 'doors_steel_door_close',
recipe = door_recipe
})
if prev_door_id then
minetest.register_craft{ type='shapeless', output=door_id, recipe={prev_door_id} }
end
if not first_door_id then first_door_id = door_id end
prev_door_id = door_id
end
minetest.register_craft{ type='shapeless', output=first_door_id, recipe={prev_door_id} }
end

View File

@@ -0,0 +1,44 @@
local rloot = dungeon_loot.register
local id = terumet.id
local BOTTOM = -32768
local TOP = 32768
-- still a WIP on balance/items put into loot
rloot{name=id('item_col_raw'), chance=0.8, count={1,9}, y={-64, TOP}}
rloot{name=id('item_col_tcop'), chance=0.8, count={1,9}, y={-512, 32}}
rloot{name=id('item_col_tgol'), chance=0.8, count={1,9}, y={BOTTOM, 0}}
rloot{name=id('lump_raw'), chance=0.8, count={2,6}, y={0, TOP}}
rloot{name=id('ingot_raw'), chance=0.7, count={1,4}, y={0, TOP}}
rloot{name=id('lump_raw'), chance=0.85, count={1,12}}
rloot{name=id('ingot_raw'), chance=0.75, count={1,9}}
rloot{name=id('item_glue'), chance=0.95, count={3,24}, y={-16, TOP}}
rloot{name=id('item_coke'), chance=0.85, count={1,10}, y={-128, -32}}
rloot{name=id('item_tarball'), chance=0.75, count={1,10}, y={BOTTOM, -96}}
rloot{name=id('block_pwood'), chance=0.85, count={8,24}, y={-16, TOP}}
rloot{name=id('block_conmix'), chance=0.65, count={8,24}, y={-64, 128}}
rloot{name=id('block_asphalt'), chance=0.75, count={8,24}, y={-128, -48}}
rloot{name=id('item_ceramic'), chance=0.65, count={2,10}, y={-8, TOP}}
rloot{name=id('item_ceramic'), chance=0.85, count={6,24}, y={-256, -8}}
rloot{name=id('block_ceramic'), chance=0.45, count={1,3}, y={BOTTOM, -128}}
rloot{name=id('item_batt_cop_full'), chance=0.10, y={-128, 0}}
rloot{name=id('item_batt_therm_full'), chance=0.05, y={BOTTOM, -128}}
rloot{name=id('item_htglass'), chance=0.5, count={1,3}, y={-128, 0}}
rloot{name=id('item_entropy'), chance=0.2, y={BOTTOM, -128}}
rloot{name=id('repmat_drop'), chance=0.5, count={1,24}, y={BOTTOM, -8}}
-- TODO: weight alloys by value
for _,alloy_data in pairs(terumet.alloys) do
rloot{name=alloy_data.ingot, chance=0.30, count={1,2}, y={-24, TOP}}
rloot{name=alloy_data.ingot, chance=0.50, count={1,5}, y={-128, 0}}
rloot{name=alloy_data.ingot, chance=0.70, count={3,9}, y={BOTTOM, -96}}
end

View File

@@ -0,0 +1,14 @@
local food_opts = terumet.options.vac_oven.VAC_FOOD
-- add farming foods to vac-food whitelist if it's active
if food_opts and food_opts.ACTIVE then
local foods = {
'potato_crisps', 'french_fries', 'onion_rings', 'blooming_onion', 'fish_sticks', 'grilled_patty', 'hamburger', 'cheeseburger',
'corn_dog', 'meatloaf', 'flour_tortilla', 'taco', 'super_taco', 'quesadilla', 'pepperoni', 'garlic_bread', 'spaghetti', 'lasagna', 'cheese_pizza',
'salsa', 'pepperoni_pizza', 'deluxe_pizza', 'pineapple_pizza', 'cornbread'
}
for _,id in ipairs(foods) do
food_opts.WHITELIST[string.format('extra:%s', id)]=1
end
end

View File

@@ -0,0 +1,13 @@
local food_opts = terumet.options.vac_oven.VAC_FOOD
-- add farming foods to vac-food whitelist if it's active
if food_opts and food_opts.ACTIVE then
local foods = {
'baked_potato', 'potato_salad', 'pumpkin_bread', 'toast_sandwich', 'donut', 'donut_chocolate', 'donut_apple', 'porridge', 'turkish_delight',
'chili_bowl', 'rhubarb_pie', 'garlic_bread', 'muffin_blueberry', 'chocolate_dark'
}
for _,id in ipairs(foods) do
food_opts.WHITELIST[string.format('farming:%s', id)]=1
end
end

View File

@@ -0,0 +1,7 @@
-- interop bugfix with Mesecons/piston mod
-- fix for https://github.com/Terumoc/terumet/issues/16
terumet.machine.register_on_new_machine_node(function (id, def)
-- register every terumetal machine node as a "stopper" for pistons
mesecon.register_mvps_stopper(id, true)
end)

View File

@@ -0,0 +1,22 @@
local crys_mithril = terumet.register_crystal{
suffix='mith',
color='#6161d5',
name='Crystallized Mithril',
cooking_result='moreores:mithril_ingot'
}
terumet.register_vulcan_result('moreores:mithril_lump', crys_mithril)
terumet.register_vulcan_result('moreores:mineral_mithril', crys_mithril, 1)
local crys_silver = terumet.register_crystal{
suffix='silv',
color='#d3fffb',
name='Crystallized Silver',
cooking_result='moreores:silver_ingot'
}
terumet.register_vulcan_result('moreores:silver_lump', crys_silver)
terumet.register_vulcan_result('moreores:mineral_silver', crys_silver, 1)
terumet.crystal_ids.mitril = crys_mithril
terumet.crystal_ids.silver = crys_silver

View File

@@ -0,0 +1,234 @@
-- API for other mods to interface with this mod
-- register an external block for use in making heatline versions and/or reinforced versions
-- if you wish to exclude one or the other, pass {heatline=true} or {reinforced=true} as 3rd argument
-- register an item that provide Repair Material to Equipment Reformer
-- value = repair material value provided by 1 item
function terumet.register_repair_material(id, value)
-- TODO error checking
terumet.options.repm.repair_mats[id] = value
end
-- register a tool that can be repaired in Equipment Reformer
-- needed_mat = amount of repair material value to repair fully worn tool
function terumet.register_repairable_item(id, needed_mat)
-- TODO error checking
terumet.options.repm.repairable[id] = needed_mat
end
-- register a new alloy smelter recipe
-- required data keys and descriptions:
local ALLOY_REQUIRED = {
result='[itemstack string] what will be output',
input='[table, 1-4 stacks] table of itemstacks consumed as input',
time='[float] time in seconds to process',
flux='[integer] amount of terumetal flux consumed from tank',
}
function terumet.register_alloy_recipe(data)
if not data then
error('terumet.register_alloy_recipe: no recipe data provided')
end
for req_key, desc in pairs(ALLOY_REQUIRED) do
if not data[req_key] then
error(string.format('terumet.register_alloy_recipe: recipe data is missing required key %s: %s', req_key, desc))
end
end
if type(data.input) ~= 'table' or #data.input < 1 or #data.input > 4 then
error('terumet.register_alloy_recipe: invalid input; must be a table of 1-4 itemstack strings (inclusive)')
end
table.insert(terumet.options.smelter.recipes, 1, data)
end
-- TODO error checking
function terumet.register_vacoven_recipe(data)
table.insert(terumet.options.vac_oven.recipes, data)
end
-- register a new crystallized material with the provided data
-- ID of created item will be 'terumet:item_cryst_<SUFFIX>'
-- IMPORTANT NOTE: a single source item can only be defined as a single crystal
-- for example, trying to add a new crystal for 'default:copper_lump' will override the default one
--
-- required data keys and descriptions:
local CRYSTAL_REQUIRED = {
suffix='[string] ID suffix for crystallized item',
color='[colorspec] minetest colorspec for crystallized item color',
name='[string] name of crystallized item',
cooking_result='[itemstack string] result of cooking crystallized item',
}
function terumet.register_crystal(data)
local this_func = 'terumet.register_crystal'
if not data then
error(this_func..': no data provided')
end
for req_key, desc in pairs(CRYSTAL_REQUIRED) do
if not data[req_key] then
error(string.format('%s: data missing required key %s: %s', this_func, req_key, desc))
end
end
local crys_id = terumet.id('item_cryst_'..data.suffix)
minetest.register_craftitem( crys_id, {
description = data.name,
inventory_image = terumet.crystal_tex(data.color),
})
minetest.register_craft{ type = 'cooking',
output = data.cooking_result,
recipe = crys_id,
cooktime = 5
}
return crys_id -- returns crystal item ID
end
-- register an item that can be put into crystal vulcanizer
-- requires source item and result, optionally include integer modifier
-- by default creates 2 result items, but count_modifier is added to that value
-- +1 more result item if vulcanizer has upgrade
function terumet.register_vulcan_result(source, result, count_modifier, specialized)
count_modifier = count_modifier or 0
local this_func = 'terumet.register_vulcan_result'
if not source then error(this_func..': no source item provided') end
if not result then error(this_func..': no result item provided') end
local count = 2 + count_modifier
if( count < 1 ) then count = 1 end
terumet.options.vulcan.recipes[source] = {result, count, specialized}
end
-- register that a node can generate heat when extracted by the Environmental Entropy Extraction Heater (EEE Heater)
local ENTROPIC_REQUIRED = {
node='[string] id of node that can be extracted',
hu_per_s='[integer] number of heat units extracted per second',
extract_time='[float] total amount of time to extract this node',
}
-- optional keys:
-- change_to: [string] what node this node will change into after extraction - if nil, the node will not change and thus can be extracted over and over (like air by default)
function terumet.register_entropic_node(data)
if not data then
error('terumet.register_entropic_node: no data provided')
end
for req_key, desc in pairs(ENTROPIC_REQUIRED) do
if not data[req_key] then
error(string.format('terumet.register_entropic_node: data is missing required key %s: %s', req_key, desc))
end
end
terumet.options.heater.entropy.EFFECTS[data.node] = {hu_per_s=data.hu_per_s, extract_time=data.extract_time, change_to=data.change_to}
end
local STANDARD_INV_LISTS = {'in', 'out', 'fuel', 'upgrade'}
local EXTERNAL_MACHINES = {}
local MACHINE_REQUIRED = {
name='[string] Name of machine',
node_tiles='[minetest tiles definition] Tiles for machine node',
heat_max='[integer] Base maximum heat units that can be stored by machine',
input_slots='[integer, 0-4 expected] Size of input inventory',
output_slots='[integer, 0-4 expected] Size of output inventory',
has_fuel_slot='[boolean] Whether machine has direct fuel slot',
upgrade_slots='[integer, 0-6 expected] Size of upgrade inventory',
tick_time='[float] Time in seconds between machine ticks',
tick_function='[fn(machine_state, dt) -> boolean] Function called when machine ticks. Return true to tick again in tick_time seconds.'
}
-- optional keys:
-- heat_provider: [boolean] true if machine generates/provides heat to adjacent machines
-- heat_transfer: [integer] Maximum amount of heat machine can send in 1 tick
-- node_name: [string] name to give machine's node. if not provided, uses same as 'name'
-- node_param2: [string] param2 to give machine's node (same as minetest's nodedef param2 setting: facedir/none/etc. )
-- custom_init: [fn(pos, meta, inv) -> nil] custom initialization for setting inventories or other metadata of a new machine
-- custom_write: [fn(machine_state)] function to call when saving machine state to metadata
-- custom_read: [fn(machine_state)] function to call when reading machine state from metadata
-- -- machine formspec options --
-- <basic>
-- machinefs_theme: [string] definition of background/listcolors for machine's formspec
-- machinefs_func: [fn(machine_state) -> string] custom function that returns formspec definition for main area above inventory in interface
-- -- <OR advanced> --
-- custom_fsdef: [fsdef table] entire customized formspec definition table for machine to use, see terumet/machine/machine.lua:build_fs for more information
-- [IMPORTANT] => using custom_fsdef completely overrides use of machinefs_* funcs and default formspec so everything must be defined
function terumet.register_heat_machine( id, data )
if not data then
error('terumet.register_heat_machine: no data provided')
end
for req_key, desc in pairs(MACHINE_REQUIRED) do
if not data[req_key] then
error(string.format('terumet.register_heat_machine: data is missing required key %s: %s', req_key, desc))
end
end
local machine_tm_class = {
name = data.name,
timer = data.tick_time,
fsdef = data.custom_fsdef or {
control_buttons = {
terumet.machine.buttondefs.HEAT_XFER_TOGGLE,
},
machine = data.machinefs_func or terumet.NO_FUNCTION,
input = {data.input_slots > 0},
output = {data.output_slots > 0},
fuel_slot = {data.fuel_slot},
theme = data.machinefs_theme,
},
default_heat_xfer = (data.heat_provider and terumet.machine.HEAT_XFER_MODE.PROVIDE_ONLY) or terumet.machine.HEAT_XFER_MODE.ACCEPT,
get_drop_contents = function(machine)
local drops = {}
for _,std_list in ipairs(STANDARD_INV_LISTS) do
default.get_inventory_drops(machine.pos, std_list, drops)
end
return drops
end
}
local node_def = terumet.machine.nodedef{
description = data.node_name or data.name,
tiles = data.node_tiles,
param2 = data.node_param2,
on_construct = function(pos)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
if data.upgrade_slots > 0 then inv:set_size('upgrade', data.upgrade_slots) end
if data.input_slots > 0 then inv:set_size('in', data.input_slots) end
if data.output_slots > 0 then inv:set_size('out', data.output_slots) end
if data.has_fuel_slot then inv:set_size('fuel', 1) end
if data.custom_init then data.custom_init(pos, meta, inv) end
local init = {
class = machine_tm_class,
state = 0,
state_time = 0,
heat_level = 0,
max_heat = data.heat_max,
status_text = 'New',
inv = inv,
meta = meta,
pos = pos,
}
terumet.machine.write_state(pos, init)
terumet.machine.set_timer(init)
end,
on_timer = function(pos, dt)
local machine = terumet.machine.tick_read_state(pos)
local re_tick = false
if not terumet.machine.check_overheat(machine, data.heat_max) then
re_tick = data.tick_function(machine, dt)
if machine.heat_xfer_mode == terumet.machine.HEAT_XFER_MODE.PROVIDE_ONLY then
terumet.machine.push_heat_adjacent(machine, data.heat_transfer or 50)
end
if data.has_fuel_slot then
terumet.machine.process_fuel(machine)
re_tick = not machine.need_heat
end
end
-- write status back to meta
terumet.machine.write_state(pos, machine)
return re_tick
end,
_terumach_class = machine_tm_class
}
minetest.register_node( id, node_def )
EXTERNAL_MACHINES[id] = data
end

View File

@@ -0,0 +1,52 @@
local tube = 'tubelib:tubeS'
if tubelib.version < 2.0 then
tube = 'tubelib:tube1'
end
terumet.register_machine_upgrade('tubelib', 'Tube Support Upgrade', {terumet.id('item_upg_base'), tube}, nil, 'simple', 'Allows machine to interface with tubelib tubes')
local machine_check = function(machine, player_name)
return machine and terumet.machine.has_upgrade(machine, 'tubelib')
---terumet.machine.has_auth(machine, player_name)
end
local PUSH_FUNC = function(pos, side, item, player_name)
local machine = terumet.machine.readonly_state(pos)
if machine_check(machine) then
local result = tubelib.put_item(machine.meta, 'in', item)
if result then machine.class.on_inventory_change(machine) end
return result
end
return false
end
local TUBELIB_MACHINE_DEF = {
on_pull_item = function(pos, side, player_name)
local machine = terumet.machine.readonly_state(pos)
if machine_check(machine) then
return tubelib.get_item(machine.meta, 'out')
end
return nil
end,
on_push_item = PUSH_FUNC,
on_unpull_item = PUSH_FUNC
}
terumet.machine.register_on_place(function (pos, machine, placer)
tubelib.add_node(pos, machine.class.name)
end)
terumet.machine.register_on_remove(function (pos, machine)
tubelib.remove_node(pos)
end)
tubelib.register_node(terumet.id('mach_asmelt'), {terumet.id('mach_asmelt_lit')}, TUBELIB_MACHINE_DEF)
tubelib.register_node(terumet.id('mach_htfurn'), {terumet.id('mach_htfurn_lit')}, TUBELIB_MACHINE_DEF)
tubelib.register_node(terumet.id('mach_lavam'), {terumet.id('mach_lavam_lit')}, TUBELIB_MACHINE_DEF)
tubelib.register_node(terumet.id('mach_htr_furnace'), {terumet.id('mach_htr_furnace_lit')}, TUBELIB_MACHINE_DEF)
tubelib.register_node(terumet.id('mach_crusher'), {terumet.id('mach_crusher_lit')}, TUBELIB_MACHINE_DEF)
--oops: mese garden has no upgrade slots... consider adding it if support for other upgrades is added in future
--tubelib.register_node(terumet.id('mach_meseg'), terumet.EMPTY, TUBELIB_MACHINE_DEF)
tubelib.register_node(terumet.id('mach_repm'), terumet.EMPTY, TUBELIB_MACHINE_DEF)
tubelib.register_node(terumet.id('mach_vulcan'), terumet.EMPTY, TUBELIB_MACHINE_DEF)

View File

@@ -0,0 +1,163 @@
local function add_terumet_recipes()
-- add each defined alloy recipe to UnInv
for _, recipe in pairs(terumet.options.smelter.recipes) do
local listed = {}
for i=1,#recipe.input do listed[#listed+1] = recipe.input[i] end
if recipe.flux > 0 then
listed[#listed+1] = terumet.id('uninv_flux_req', recipe.flux)
end
listed[#listed+1] = terumet.id('uninv_time_req', math.ceil(recipe.time))
unified_inventory.register_craft{
type = 'terumet_alloy',
output = recipe.result,
items = listed
}
end
-- add each defined vacuum oven recipe (1 entry for each output)
for _, recipe in ipairs(terumet.options.vac_oven.recipes) do
local time = terumet.id('uninv_time_req', math.ceil(recipe.time))
for _, output in ipairs(recipe.results) do
unified_inventory.register_craft{
type = 'terumet_vacoven',
output = output,
items = {recipe.input, time}
}
end
end
-- add each defined flux source to UnInv
for source, details in pairs(terumet.options.smelter.FLUX_ITEMS) do
unified_inventory.register_craft{
type = 'terumet_alloy',
output = terumet.id('uninv_flux_req'),
items = {source, terumet.id('uninv_time_req', math.ceil(details.time))}
}
end
-- add each crusher recipe to UnInv
for source, result in pairs(terumet.options.crusher.recipes) do
unified_inventory.register_craft{
type = 'terumet_crush',
output = result,
items = {source}
}
end
-- add each repair material to UnInv
for id, repmatval in pairs(terumet.options.repm.repair_mats) do
unified_inventory.register_craft{
type = 'terumet_repmat',
output = terumet.id('uninv_repmat', repmatval),
items = {id}
}
end
-- add each repairable tool to UnInv
for id, rmreq in pairs(terumet.options.repm.repairable) do
unified_inventory.register_craft{
type = 'terumet_repair',
output = id,
items = {id, terumet.id('uninv_repmat', rmreq)}
}
end
-- add each crystal vulcanizer recipe to UnInv
for source, result in pairs(terumet.options.vulcan.recipes) do
--minetest.log(string.format('%s => %s x %s', source or 'NIL', result[1] or 'NIL', result[2] or 'NIL'))
unified_inventory.register_craft{
type = 'terumet_vulcan',
output = result[1] .. ' ' .. result[2],
items = {source}
}
end
-- add each valid ore for ore saw to UnInv
for node, _ in pairs(terumet.options.ore_saw.VALID_ORES) do
unified_inventory.register_craft{
type = 'terumet_ore_saw',
output = node,
items = {node}
}
end
end
-- dummy item to display amount of flux needed to alloy
minetest.register_craftitem( terumet.id('uninv_flux_req'), {
description = "terumetal flux (in smelter tank)",
inventory_image = terumet.tex('uninv_flux_req'),
groups={not_in_creative_inventory=1}
})
-- dummy item to display amount of time needed to alloy
minetest.register_craftitem( terumet.id('uninv_time_req'), {
description = "time (seconds)",
inventory_image = terumet.tex('uninv_time_req'),
groups={not_in_creative_inventory=1}
})
-- dummy item to display amount of repair material
minetest.register_craftitem( terumet.id('uninv_repmat'), {
description = "repair material value",
inventory_image = terumet.tex('uninv_repmat'),
groups={not_in_creative_inventory=1}
})
-- register terumetal alloying with UnInv
unified_inventory.register_craft_type( 'terumet_alloy', {
description = 'Terumetal Alloy Smelting',
icon = 'terumet_asmelt_front_lit.png',
width=3,
height=2,
})
-- register crushing with UnInv
unified_inventory.register_craft_type( 'terumet_crush', {
description = 'Expansion Crusher',
icon = 'terumet_crush_front_lit.png',
width=1,
height=1,
})
-- register repair materials with UnInv
unified_inventory.register_craft_type( 'terumet_repmat', {
description = 'Equipment Reformer\n(material)',
icon = 'terumet_repm_front.png',
width=1,
height=1,
})
-- register tool repair with UnInv
unified_inventory.register_craft_type( 'terumet_repair', {
description = 'Equipment Reformer\n(for 100% wear)',
icon = 'terumet_repm_front.png',
width=2,
height=1,
})
-- register crystal vulcanizing with UnInv
unified_inventory.register_craft_type( 'terumet_vulcan', {
description = 'Crystal Vulcanizer',
icon = 'terumet_vulcan_front.png',
width=1,
height=1,
})
-- register ore saw gathering
unified_inventory.register_craft_type( 'terumet_ore_saw', {
description = 'Ore-cutting Saw',
icon = 'terumet_tool_ore_saw.png^[transformFX',
width=1,
height=1,
})
-- register vacuum oven with UnInv
unified_inventory.register_craft_type( 'terumet_vacoven', {
description = 'Vacuum Oven',
icon = 'terumet_vacoven_front.png',
width=3,
height=2,
})
-- call after all mods are loaded to catch new submod recipes/changes
minetest.after(0.01, function() add_terumet_recipes() end)

View File

@@ -0,0 +1,23 @@
local cplate_id = terumet.id('item_ceramic')
local cblock_id = terumet.id('block_ceramic')
minetest.register_craftitem( cplate_id, {
description = 'Teruceramic Plate',
inventory_image = terumet.tex(cplate_id)
})
minetest.register_node( cblock_id, {
description = 'Teruceramic Block',
tiles = {terumet.tex(cblock_id)},
is_ground_content = false,
groups={cracky=1, level=1, puts_out_fire=1},
sounds = default.node_sound_glass_defaults()
})
minetest.register_craft{ output = cblock_id,
recipe = terumet.recipe_3x3(cplate_id)
}
minetest.register_craft{ type = 'shapeless', output = terumet.id('item_ceramic', 9),
recipe = {cblock_id}
}

View File

@@ -0,0 +1,120 @@
local coke_id = terumet.id('item_coke')
minetest.register_craftitem( coke_id, {
description = 'Coke Lump',
inventory_image = terumet.tex(coke_id),
groups = {coal = 1, flammable = 1},
})
minetest.register_craft({
type = "fuel",
recipe = coke_id,
burntime = 80,
})
local coke_block_id = terumet.id('block_coke')
minetest.register_node( coke_block_id, {
description = 'Coke Block',
tiles = {terumet.tex(coke_block_id)},
is_ground_content = false,
groups = {cracky = 3},
sounds = default.node_sound_stone_defaults(),
})
minetest.register_craft({
type = "fuel",
recipe = coke_block_id,
burntime = 740,
})
minetest.register_craft{ output = coke_block_id,
recipe = terumet.recipe_3x3(coke_id)
}
minetest.register_craft{ type = 'shapeless', output = coke_id .. ' 9',
recipe = {coke_block_id},
}
local tarball_id = terumet.id('item_tarball')
minetest.register_craftitem( tarball_id, {
description = 'Tarball',
inventory_image = terumet.tex(tarball_id),
groups = {glue=1}
})
minetest.register_craft({
type = "fuel",
recipe = tarball_id,
burntime = 30,
})
local tarblock_id = terumet.id('block_tar')
minetest.register_node( tarblock_id, {
description = 'Tar Block',
tiles = {terumet.tex(tarblock_id)},
is_ground_content = false,
groups = {level=2, crumbly=2, cracky=1, snappy=2, choppy=2, disable_jump=1, fall_damage_add_percent=-100},
sounds = terumet.squishy_node_sounds
})
minetest.register_craft{ output = tarblock_id,
recipe = terumet.recipe_box(tarball_id, '')
}
minetest.register_craft{ type = 'shapeless', output = tarball_id .. ' 8', recipe = {tarblock_id} }
local prerubber_id = terumet.id('item_prerub')
minetest.register_craftitem( prerubber_id, {
description = 'Bio-tar Mixture',
inventory_image = terumet.tex(prerubber_id)
})
minetest.register_craft{ output = prerubber_id,
recipe = {
{'', tarball_id, ''},
{tarball_id, 'terumet:item_dust_bio', tarball_id},
{'', tarball_id, ''}
}
}
local rubber_bar_id = terumet.id('item_rubber')
terumet.options.vulcan.recipes[prerubber_id] = {rubber_bar_id, 1}
minetest.register_craftitem( rubber_bar_id, {
description = 'Synthetic Rubber Bar',
inventory_image = terumet.tex(rubber_bar_id)
})
local rsuit_mat = terumet.id('item_rsuitmat')
minetest.register_craftitem( rsuit_mat, {
description = 'Vulcansuit Plate',
inventory_image = terumet.tex(rsuit_mat)
})
terumet.register_alloy_recipe{result=rsuit_mat, flux=8, time=20.0, input={rubber_bar_id, 'terumet:ingot_cgls', 'terumet:item_ceramic'}}
local asphalt_id = terumet.id('block_asphalt')
minetest.register_node( asphalt_id, {
description = 'Asphalt Block',
tiles = {terumet.tex(asphalt_id)},
is_ground_content = false,
groups = {cracky = 3, crumbly = 1, level = 1},
sounds = default.node_sound_stone_defaults(),
})
minetest.register_craft({
output = asphalt_id..' 8',
recipe = terumet.recipe_box('default:gravel', tarball_id)
})
walls.register(terumet.id('wall_asphalt'), 'Asphalt Wall', terumet.tex(asphalt_id), asphalt_id, default.node_sound_stone_defaults())
stairs.register_stair_and_slab('asphalt', asphalt_id, {cracky = 3, crumbly = 1, level = 1}, {terumet.tex(asphalt_id)}, 'Asphalt Stair', 'Asphalt Slab', default.node_sound_stone_defaults(), false )

View File

@@ -0,0 +1,20 @@
local reg_coil = function(name, mat)
local coil_id = terumet.id('item_coil_'..mat)
minetest.register_craftitem( coil_id, {
description = name,
inventory_image = terumet.tex(coil_id)
})
local ingot_id = terumet.id('ingot_'..mat)
minetest.register_craft{ output=coil_id .. ' 3',
recipe = {
{ingot_id},
{ingot_id},
{ingot_id},
}
}
end
reg_coil('Pure Terumetal Coil', 'raw')
reg_coil('Terucopper Coil', 'tcop')
reg_coil('Terugold Coil', 'tgol')

View File

@@ -0,0 +1,152 @@
local CONCRETE_COLORS = {
'#FFF',--white
'#AAA',--grey
'#666',--dark grey
'#333',--black
'#722ed4',--violet
'#2e56d4',--blue
'#5484ac',--cyan
'#135918',--dark green
'#3ad42e',--green
'#d4c12e',--yellow
'#592e13',--brown
'#d4652e',--orange
'#d42e2e',--red
'#d80481',--magenta
'#ff7272',--pink
}
local mix_base = terumet.id('block_conmix')
local block_base = terumet.id('block_con')
local FMT = string.format
local function mix_id(dye_index)
return FMT("%s_%s", mix_base, dye.dyes[dye_index][1])
end
function terumet.concrete_block_id(dye_index)
return FMT("%s_%s", block_base, dye.dyes[dye_index][1])
end
local NAMEFORMATS = {
mix="%s Concrete Mix",
block="%s Concrete Block",
door="%s Concrete Door",
wall="%s Concrete Wall",
stair="%s Concrete Stair",
slab="%s Concrete Slab"
}
local function make_name(name, dye_index)
return FMT(NAMEFORMATS[name], dye.dyes[dye_index][2])
end
local function texture(base, dye_index)
return FMT("%s^[multiply:%s", base, CONCRETE_COLORS[dye_index])
end
local function mix_texture(dye_index)
return texture(terumet.tex('block_conmix'), dye_index)
end
local function block_texture(dye_index)
return texture(terumet.tex('block_con'), dye_index)
end
local function door_texture(dye_index)
return texture(terumet.tex('door_con'), dye_index)
end
local function door_item_texture(dye_index)
return texture(terumet.tex('dinv_con'), dye_index)
end
local HARDEN_LIST = {}
local MIXES_LIST = {}
for index,dye_info in ipairs(dye.dyes) do
local con_id = 'con_'..dye_info[1]
minetest.register_node(mix_id(index), {
description = make_name('mix', index),
tiles = {mix_texture(index)},
is_ground_content = false,
groups = {crumbly=2},
--sounds = default.node_sound_sand_defaults(),
})
local block_id = terumet.concrete_block_id(index)
minetest.register_node(block_id, {
description = make_name('block', index),
tiles = {block_texture(index)},
is_ground_content = false,
groups = {cracky = 2, level = 1},
sounds = default.node_sound_stone_defaults(),
})
if index ~= 1 then
local dye_id = "group:dye,color_"..dye_info[1]
local basic_powder = mix_id(1)
minetest.register_craft{
output = mix_id(index)..' 8',
recipe = terumet.recipe_box(basic_powder, dye_id)
}
minetest.register_craft{
output = mix_id(index)..' 8',
recipe = terumet.recipe_box(basic_powder, 'dye:'..dye_info[1])
}
end
HARDEN_LIST[mix_id(index)] = block_id
table.insert(MIXES_LIST, mix_id(index))
walls.register(terumet.id('wall_'..con_id), make_name('wall', index), block_texture(index), block_id, default.node_sound_stone_defaults())
doors.register(terumet.id('door_'..con_id), {
tiles = {{name = door_texture(index), backface_culling = true}},
description = make_name('door', index),
inventory_image = door_item_texture(index),
protected = true,
groups = {cracky = 2, level = 1},
sounds = default.node_sound_stone_defaults(),
sound_open = 'doors_steel_door_open',
sound_close = 'doors_steel_door_close',
recipe = {
{block_id},
{'doors:door_steel'},
{block_id},
}
})
stairs.register_stair_and_slab(con_id, block_id,
{cracky = 2, level = 1},
{block_texture(index)},
make_name('stair',index), make_name('slab', index),
default.node_sound_stone_defaults(),
false
)
end
minetest.register_abm{
label = 'Concrete mix hardening',
nodenames = MIXES_LIST,
neighbors = {'default:water_source', 'default:water_flowing'},
interval = 3.0, -- Run every 3 seconds
chance = 1, -- always
action = function(pos, node, active_object_count, active_object_count_wider)
local harden_id = HARDEN_LIST[node.name]
if harden_id then
minetest.set_node(pos, {name = harden_id})
end
end
}
local gravel_id = 'default:gravel'
local any_sand = 'group:sand'
minetest.register_craft{
output = mix_id(1)..' 8',
recipe = {
{any_sand, gravel_id, any_sand},
{gravel_id, '', gravel_id},
{any_sand, gravel_id, any_sand}
}
}

View File

@@ -0,0 +1,96 @@
local biomat_item = terumet.id('item_dust_bio')
local biomat_block = terumet.id('block_dust_bio')
local woodmulch_item = terumet.id('item_dust_wood')
local glue_item = terumet.id('item_glue')
minetest.register_craftitem( terumet.id('item_dust_ob'), {
description = 'Obsidian Grit',
inventory_image = terumet.tex('item_dust_ob')
})
-- ========================================================
minetest.register_craftitem( woodmulch_item, {
description = 'Wood Mulch',
inventory_image = terumet.tex('item_dust_wood')
})
minetest.register_craft({
type = 'fuel',
recipe = woodmulch_item,
burntime = 10,
})
minetest.register_craft{ output = 'default:paper',
type = 'shapeless',
recipe = {'bucket:bucket_water', woodmulch_item, woodmulch_item},
replacements={{'bucket:bucket_water','bucket:bucket_empty'}}
}
-- =======================================================
minetest.register_craftitem( biomat_item, {
description = 'Biomatter',
inventory_image = terumet.tex('item_dust_bio')
})
minetest.register_craft{
type = 'fuel',
recipe = biomat_item,
burntime = 30,
}
minetest.register_node( biomat_block, {
description = 'Biomatter Block',
tiles = {terumet.tex('block_dust_bio')},
is_ground_content = false,
groups={crumbly=3, oddly_breakable_by_hand=2, flammable=1},
sounds = default.node_sound_leaves_defaults()
})
minetest.register_craft{
type = 'fuel',
recipe = biomat_block,
burntime = 280,
}
minetest.register_craft{ output = biomat_block,
recipe = terumet.recipe_3x3(biomat_item)
}
minetest.register_craft{ output = biomat_item..' 9',
type = 'shapeless',
recipe = {biomat_block}
}
minetest.register_craft{ output = 'default:torch 4',
recipe = { {biomat_item},
{'group:stick'}}
}
-- =======================================================
minetest.register_craftitem( glue_item, {
description = 'Plant Glue',
groups = {glue=1},
inventory_image = terumet.tex('item_glue')
})
minetest.register_craft{ output = glue_item,
type = 'shapeless',
recipe = {'bucket:bucket_water', biomat_item},
replacements={{'bucket:bucket_water','bucket:bucket_empty'}}
}
minetest.register_craft{ output = glue_item .. ' 9',
type = 'shapeless',
recipe = {'bucket:bucket_water', biomat_block},
replacements={{'bucket:bucket_water','bucket:bucket_empty'}}
}
minetest.register_craft{ output = glue_item .. ' 8',
type = 'shapeless',
recipe = {'bucket:bucket_water', 'farming:flour'},
replacements={{'bucket:bucket_water','bucket:bucket_empty'}}
}

View File

@@ -0,0 +1,88 @@
local id=terumet.id
local opts = terumet.options.vulcan
local crys_terumetal = terumet.register_crystal{
suffix='raw',
color='#a33d57',
name='Crystallized Terumetal',
cooking_result=id('ingot_raw')
}
terumet.register_vulcan_result(id('lump_raw'), crys_terumetal, nil, true) -- 4th arg indicates it is a terumetal specialized recipe
terumet.register_vulcan_result(id('ore_raw'), crys_terumetal, 1, true)
terumet.register_vulcan_result(id('ore_raw_desert'), crys_terumetal, 2, true)
local crys_copper = terumet.register_crystal{
suffix='copper',
color='#ec923a',
name='Crystallized Copper',
cooking_result='default:copper_ingot'
}
terumet.register_vulcan_result('default:copper_lump', crys_copper)
terumet.register_vulcan_result('default:stone_with_copper', crys_copper, 1)
local crys_tin = terumet.register_crystal{
suffix='tin',
color='#dddddd',
name='Crystallized Tin',
cooking_result='default:tin_ingot'
}
terumet.register_vulcan_result('default:tin_lump', crys_tin )
terumet.register_vulcan_result('default:stone_with_tin', crys_tin, 1)
local crys_iron = terumet.register_crystal{
suffix='iron',
color='#ffdcb5',
name='Crystallized Iron',
cooking_result='default:steel_ingot'
}
terumet.register_vulcan_result('default:iron_lump', crys_iron)
terumet.register_vulcan_result('default:stone_with_iron', crys_iron, 1)
local crys_gold = terumet.register_crystal{
suffix='gold',
color='#ffcb15',
name='Crystallized Gold',
cooking_result='default:gold_ingot'
}
terumet.register_vulcan_result('default:gold_lump', crys_gold)
terumet.register_vulcan_result('default:stone_with_gold', crys_gold, 1)
local crys_ob = terumet.register_crystal{
suffix='ob',
color='#351569',
name='Crystallized Obsidian',
cooking_result='default:obsidian'
}
if opts.LIMIT_OBSIDIAN then
terumet.register_vulcan_result('default:obsidian', crys_ob, -1)
else
terumet.register_vulcan_result('default:obsidian', crys_ob)
end
local crys_mese = terumet.register_crystal{
suffix='mese',
color='#fffb81',
name='Crystallized Mese',
cooking_result='default:mese_crystal'
}
terumet.register_vulcan_result('default:stone_with_mese', crys_mese)
local crys_dia = terumet.register_crystal{
suffix='dia',
color='#66f6ff',
name='Crystallized Diamond',
cooking_result='default:diamond'
}
terumet.register_vulcan_result('default:stone_with_diamond', crys_dia)
-- outside mods can access ids of default crystallized materials through terumet.crystal_ids
terumet.crystal_ids = {
terumetal=crys_terumetal,
copper=crys_copper,
tin=crys_tin,
iron=crys_iron,
gold=crys_gold,
obsidian=crys_ob,
mese=crys_mese,
diamond=crys_dia
}

View File

@@ -0,0 +1,26 @@
local ent_crystal_id = terumet.id('item_entropy')
local ent_matrix_id = terumet.id('block_entropy')
minetest.register_craftitem( ent_crystal_id, {
description = 'Entropic Crystal',
inventory_image = terumet.tex(ent_crystal_id)
})
minetest.register_node( ent_matrix_id, {
description = 'Entropic Matrix\nPlace directly above EEE Heater',
tiles = {terumet.tex(ent_matrix_id)},
is_ground_content = false,
groups={cracky=1, level=2},
sounds = default.node_sound_glass_defaults()
})
minetest.register_craft{ output = ent_crystal_id,
recipe = {
{ terumet.id('item_dust_ob'), terumet.id('item_cryst_mese'), terumet.id('item_dust_ob') },
{ terumet.id('item_cryst_mese'), terumet.id('item_cryst_dia'), terumet.id('item_cryst_mese') },
{ terumet.id('item_dust_ob'), terumet.id('item_cryst_mese'), terumet.id('item_dust_ob') },
}}
minetest.register_craft{ output = ent_matrix_id,
recipe = terumet.recipe_box(ent_crystal_id, 'default:diamondblock')
}

View File

@@ -0,0 +1,41 @@
local ingot_id = terumet.id('ingot_meson')
local meson_color = '#be61ff'
minetest.register_craftitem( ingot_id, {
description = 'Fused Meson Ingot',
inventory_image = terumet.tex(ingot_id),
groups = {ingot = 1},
})
local toolstat = {times={1.3, 1.1, 0.9}, uses=0, maxlevel=5}
minetest.register_tool( terumet.id('tool_meson'), {
description = minetest.colorize(meson_color, 'Fused Meson Omni-tool'),
inventory_image = terumet.tex('tool_meson'),
wield_scale={x=1.8, y=1.8, z=1.4},
tool_capabilities = {
full_punch_interval = 1.0,
max_drop_level = 99,
groupcaps = {
cracky = toolstat,
crumbly = toolstat,
choppy = toolstat,
snappy = toolstat,
},
damage_groups = {fleshy=4},
},
})
--[[
Meson Fusion Reactor
Accepts items that yield repair material to create a critical mass. This mass is then superheated and Meson Fusion is attempted.
The chance of successful fusion is based on:
- The quality of materials used (the fewer items used -> higher chance)
- The time taken to reach the necessary heat (less time -> higher chance)
For 1 attempt at fusion the following is needed:
60 x 50 = 3500 RMP (repair material points) -- This averages to approx. 50 between alloyed iron and gold.
500000 HU -- assuming an average of 10000/second, averages to 50 seconds
]]

View File

@@ -0,0 +1,64 @@
local htg_id = terumet.id('item_htglass')
minetest.register_craftitem( htg_id, {
description = 'Heat-transference Glass',
inventory_image = terumet.tex(htg_id)
})
minetest.register_craft{ output = htg_id .. ' 3',
recipe = {
{'', 'default:obsidian_glass', ''},
{terumet.id('item_cryst_tin'), terumet.id('item_glue'), terumet.id('item_cryst_tin')},
{'', terumet.id('item_dust_ob'), ''}
}
}
-- =============================================
local emit_id = terumet.id('item_heatunit')
minetest.register_craftitem( emit_id, {
description = 'High Energy Alpha-wave Transmission Unit',
inventory_image = terumet.tex(emit_id)
})
minetest.register_craft{ output = emit_id,
recipe = {
{terumet.id('ingot_tgol'), 'default:obsidian_glass', terumet.id('ingot_tgol')},
{terumet.id('item_thermese'), 'default:mese_crystal', terumet.id('item_thermese')},
{terumet.id('item_ceramic'), terumet.id('item_coil_tgol'), terumet.id('item_ceramic')}
}
}
-- =============================================
local press_id = terumet.id('item_press')
minetest.register_craftitem( press_id, {
description = 'Terutin Expansion Press',
inventory_image = terumet.tex(press_id)
})
minetest.register_craft{ output = press_id,
recipe = {
{'default:stone', terumet.id('block_ttin'), 'default:stone'},
{terumet.id('ingot_tcha'), terumet.id('ingot_tcha'), terumet.id('ingot_tcha')},
{terumet.id('ingot_ttin'), terumet.id('ingot_ttin'), terumet.id('ingot_ttin')}
}
}
-- =============================================
local cryscham_id = terumet.id('item_cryscham')
minetest.register_craftitem( cryscham_id, {
description = 'Crystal Growth Chamber',
inventory_image = terumet.tex(cryscham_id)
})
minetest.register_craft{ output = cryscham_id,
recipe = {
{'default:obsidian_glass', 'default:obsidian_glass', 'default:obsidian_glass'},
{terumet.id('item_dust_ob'), terumet.id('item_dust_ob'), terumet.id('item_dust_ob')},
{terumet.id('ingot_tcha'), 'bucket:bucket_water', terumet.id('ingot_tcha')}
},
replacements={{'bucket:bucket_water','bucket:bucket_empty'}}
}

View File

@@ -0,0 +1,34 @@
local pwood_ytex = terumet.tex('block_pwood')
local pwood_xztex = terumet.tex('block_pwood_sides')
local pwood_tiles = {pwood_ytex, pwood_ytex, pwood_xztex}
local pwood_id = terumet.id('block_pwood')
minetest.register_node(pwood_id, {
description = "Pressed Wood",
tiles = pwood_tiles,
is_ground_content = false,
groups = {choppy = 2, oddly_breakable_by_hand = 2},
sounds = default.node_sound_wood_defaults(),
})
minetest.register_craft{ output = pwood_id..' 16',
recipe = terumet.recipe_box(terumet.id('item_dust_wood'), 'group:glue'),
}
if minetest.get_modpath('stairs') then
stairs.register_stair_and_slab(
'terumet_pwood',
pwood_id,
{choppy = 2, oddly_breakable_by_hand = 2},
pwood_tiles,
'Pressed Wood Stair',
'Pressed Wood Slab',
default.node_sound_wood_defaults()
)
end
if minetest.get_modpath('walls') then
walls.register(terumet.id('walls_pwood'), 'Pressed Wood Wall', pwood_tiles,
pwood_id, default.node_sound_stone_defaults())
end

View File

@@ -0,0 +1,16 @@
local id = terumet.id
local tex = terumet.tex
local function items(item, count)
return item .. ' ' .. count
end
local ore_stone = id('ore_raw')
local ore_stone_dense = id('ore_dense_raw')
local ore_desert_stone = id('ore_raw_desert')
local ore_desert_stone_dense = id('ore_raw_desert_dense')
local lump = id('lump_raw')
local ingot = id('ingot_raw')
local block = id('block_raw')

View File

@@ -0,0 +1,82 @@
local rebar_id = terumet.id('item_rebar')
minetest.register_craftitem( rebar_id, {
description = 'Teruchalcum Rebar',
inventory_image = terumet.tex('item_rebar'),
})
minetest.register_craft{ output=rebar_id..' 5', recipe=terumet.recipe_plus('terumet:ingot_tcha') }
local desc = {'Reinforced %s', 'Double-reinforced %s', 'Triple-reinforced %s'}
local blchance = {40, 20, 3}
local function reinf_block_id(code, rlv)
return minetest.get_current_modname()..':reinf_block_'..code..rlv
end
function terumet.register_reinforced_block(base, code)
local base_def = minetest.registered_nodes[base]
if not base_def then error('base '..base..' is not defined') end
for rlv = 1,3 do
local def = {}
for k,v in pairs(base_def) do
if k == 'groups' then
def.groups = {}
for gk,gv in pairs(v) do
if not terumet.options.misc.BLOCK_REMOVE_GROUPS[gk] then
def.groups[gk]=gv
end
end
else
def[k] = v
end
end
if not base_def.groups then
def.groups = {level=(rlv+1)}
else
def.groups.level = (base_def.groups.level or 1) + rlv
end
local id = reinf_block_id(code, rlv)
def.description = string.format(desc[rlv], base_def.description)
local visibility = terumet.options.cosmetic.REINFORCING_VISIBLE
if visibility then
local tileov = terumet.tex('blockov_rebar'..rlv)
if visibility == 1 then
def.overlay_tiles = {tileov, tileov, '', '', '', ''}
else
def.overlay_tiles = {tileov}
end
end
def.on_blast = terumet.blast_chance(blchance[rlv], id)
minetest.register_node(id, def)
local recbase
if rlv == 1 then
recbase = base
minetest.register_craft{ output=id..' 4', recipe = {
{rebar_id, recbase, rebar_id},
{recbase, '', recbase},
{rebar_id, recbase, rebar_id}
}}
elseif rlv == 2 then
recbase = reinf_block_id(code, 1)
minetest.register_craft{ output=id..' 4', recipe = {
{rebar_id, recbase, rebar_id},
{recbase, '', recbase},
{rebar_id, recbase, rebar_id}
}}
else
recbase = reinf_block_id(code, 2)
minetest.register_craft{ output=id..' 4', recipe = {
{rebar_id, recbase, rebar_id},
{recbase, '', recbase},
{rebar_id, recbase, rebar_id}
}}
end
end
end

View File

@@ -0,0 +1,35 @@
local id = terumet.id
local tex = terumet.tex
terumet.alloys = {}
function terumet.reg_alloy(name, alloy_id, block_level, repairmat_value)
local ingot_id = 'ingot_' .. alloy_id
local block_id = 'block_' .. alloy_id
minetest.register_craftitem( id(ingot_id), {
description = name .. ' Ingot',
inventory_image = tex(ingot_id),
groups = {ingot=1}
})
minetest.register_node( id(block_id), {
description = name .. ' Block',
tiles = {tex(block_id)},
is_ground_content = false,
groups = {cracky=1, level=block_level},
--sounds = default.node_sound_metal_defaults()
})
minetest.register_craft{ output = id(block_id),
recipe = terumet.recipe_3x3(id(ingot_id))
}
minetest.register_craft{ type = 'shapeless', output = id(ingot_id, 9),
recipe = {id(block_id)}
}
terumet.alloys[alloy_id] = {ingot=id(ingot_id), block=id(block_id)}
terumet.register_repair_material(id(ingot_id), repairmat_value)
end

View File

@@ -0,0 +1,38 @@
local tglass_id = terumet.id('block_tglass')
local tiles, glowtiles
if terumet.options.cosmetic.CLEAR_GLASS then
tiles = {terumet.tex('block_tglass_frame'), terumet.tex('blank')}
glowtiles = {terumet.tex('block_tglassglow_frame'), terumet.tex('blank')}
else
tiles = {terumet.tex('block_tglass_frame'), terumet.tex('block_tglass_streak')}
glowtiles = {terumet.tex('block_tglassglow_frame'), terumet.tex('block_tglassglow_streak')}
end
minetest.register_node(tglass_id, {
description = 'Terumetal Glass',
drawtype= 'glasslike_framed_optional',
paramtype = "light",
tiles = tiles,
is_ground_content = false,
sunlight_propagates = true,
groups = {cracky = 1, level = 2},
sounds = default.node_sound_glass_defaults(),
on_blast = terumet.blast_chance(30, tglass_id),
})
local tglass_glow_id = tglass_id..'glow'
minetest.register_node(tglass_glow_id, {
description = 'Terumetal Glow Glass',
drawtype= 'glasslike_framed_optional',
paramtype = "light",
tiles = glowtiles,
is_ground_content = false,
sunlight_propagates = true,
light_source=13,
groups = {cracky = 1, level = 2},
sounds = default.node_sound_glass_defaults(),
on_blast = terumet.blast_chance(15, tglass_glow_id),
})

View File

@@ -0,0 +1,97 @@
--[[
Adds food to the vacuum oven recipes:
* Upgrades food items - vacuum two food items to create a condensed and packaged version that restores 3 times as much health/stamina.
* Food items are items that are of the group "food_*" and have an on_use (presumably minetest.item_eat)
* To ensure all food items are seen, any mods that add foods must be added as a dependent mod to Terumet - by default only "farming" is
]]--
local options = terumet.options.vac_oven.VAC_FOOD
local FMT = string.format
local generated_vacfoods = {}
local function make_vacfood_image(img)
return FMT('[combine:32x32:0,0=%s:8,8=%s', terumet.tex('item_vacfood'), img)
end
local function make_vacfood(item_id)
local def = minetest.registered_items[item_id]
if generated_vacfoods[item_id] or (not def) then return end
local mod, item = item_id:match('^(%S+):(%S+)')
if mod and item then
local vf_id = terumet.id(FMT('vacf_%s_%s', mod, item))
local image
if def.inventory_image and def.inventory_image ~= '' then
image = make_vacfood_image(def.inventory_image)
elseif def.tiles and def.tiles[1] and def.tiles[1] ~= '' then
image = make_vacfood_image(def.tiles[1])
else
image = terumet.tex('item_vacfood')
end
local item_sound
if def.sound then
item_sound = table.copy(def.sound)
else
item_sound = {}
end
item_sound.eat = 'terumet_eat_vacfood'
minetest.register_craftitem(vf_id, {
description = 'Vacuum-packed ' .. def.description,
inventory_image = image,
sound=item_sound,
_terumet_vacfood = true,
on_use = def.on_use,
})
terumet.register_vacoven_recipe{
input=item_id..' 2',
results={vf_id},
time=4.0
}
generated_vacfoods[item_id]=vf_id
else
minetest.log('warning', FMT('terumet: valid item "%s" was selected for vacfood but mod or item-id did not parse properly', item_id))
end
end
if options.AUTO_GENERATE then
for id,def in pairs(minetest.registered_items) do
local blacklisted = false
if options.BLACKLIST then
blacklisted = options.BLACKLIST[id]
if not blacklisted then
blacklisted = terumet.match_group_key(options.BLACKLIST, def)
end
end
if not blacklisted then
local is_food = false
for group,_ in pairs(def.groups) do
if def.on_use and group:match('^food_') then
is_food = true
break
end
end
if is_food then make_vacfood(id) end
end
end
end
if options.WHITELIST then
for id,_ in pairs(options.WHITELIST) do
make_vacfood(id)
end
end
-- add a wrapper to core function of do_item_eat which triples hp_change value of items with _terumet_vacfood flag
-- there's no way to read what value individual food items are calling minetest.item_eat() with, so this is the next best way to multiply the value
local old_item_eat = core.do_item_eat
core.do_item_eat = function(hp_change, replace_with_item, itemstack, ...)
local def = itemstack:get_definition()
if def and def._terumet_vacfood then
return old_item_eat(hp_change * 3, replace_with_item, itemstack, ...)
else
return old_item_eat(hp_change, replace_with_item, itemstack, ...)
end
end

4
mods/terumet/mod.conf Normal file
View File

@@ -0,0 +1,4 @@
name=terumet
description=Terumetal v3.0 - Make life easier with alloys and heat machinery!
depends=walls, stairs, doors, dye
optional_depends=unified_inventory,tubelib,stairs,doors,tnt,mesecons,dungeon_loot,bushes,dryplants,vines,mobs_animal,main,extra

512
mods/terumet/options.lua Normal file
View File

@@ -0,0 +1,512 @@
terumet.options = {}
terumet.options.protection = {
-- List of potential external mods that will handle machine protection in lieu of the default owner system
-- If any of these mods are found on load, the default protection system will NOT be active
-- and all machine protection will be based on mintest.is_protected implemented by external mods
-- (1 has no specific meaning, only to provide a value)
EXTERNAL_MODS = {
['areas']=1
}
}
terumet.options.cosmetic = {
-- Set to false/nil for Terumetal Glass to be streaky similar to default Minetest glass
CLEAR_GLASS = true,
-- Style of reinforced blocks:
-- 1 = rebar on top/bottom only
-- 2 = rebar on all faces
-- false/nil = not visible (reinforced blocks look exact same as original block)
REINFORCING_VISIBLE = 1,
-- Set to false/nil for heatline blocks to not have visible ports
BLOCK_HEATLINE_VISIBLE = true,
}
terumet.options.misc = {
-- Groups to remove from converted blocks (heatline/reinforced blocks)
-- ex: 'wood' prevents wood planks with heatlines/reinforcing from being used as wood in general recipes
-- if any other groups cause problems when transferred over to a block, add it here
-- (1 has no specific meaning, only to provide a value)
BLOCK_REMOVE_GROUPS = {
['wood']=1,
['stone']=1,
['flammable']=1,
},
-- text color for additional info on items
TIP_COLOR = '#ffa2ba',
}
terumet.options.tools = {
--
-- TOOL SETTINGS
--
sword_damage = {
-- damage inflicted by each type of sword
TERUMETAL = 6,
COPPER_ALLOY = 8,
IRON_ALLOY = 9,
GOLD_ALLOY = 7,
BRONZE_ALLOY = 10,
COREGLASS = 12
},
-- Comment out/remove this section to disable all upgraded tools
UPGRADES = {
-- comment out/remove a single line to disable that upgrade
rng = {color='#ffda00', nametag='Kinetic', xinfo='Longer reach', item='terumet:item_cryst_mese 3', time=20.0, flux=8, repmult=1.5, effect=8}, -- effect=new range
spd = {color='#4aeffd', nametag='Expert', xinfo='Faster speed', item='terumet:item_cryst_dia 3', time=20.0, flux=8, repmult=2, effect=0.8}, -- effect=multiplier to tool speeds
dur = {color='#68905a', nametag='Durable', xinfo='Degrades slower', item='terumet:item_rubber 3', time=20.0, flux=8, repmult=1.5, effect=1.6}, -- effect=multiplier to tool uses
}
}
terumet.options.machine = {
--
-- GENERAL MACHINE SETTINGS
--
-- Heat sources that can be used in fuel slots of machines
BASIC_HEAT_SOURCES = {
['bucket:bucket_lava']={ hus=20000, return_item='bucket:bucket_empty' },
},
-- Whether machines emit smoke particles or not while working
PARTICLES = true,
-- Text descriptions of heat transfer modes of machines
HEAT_TRANSFER_MODE_NAMES = {
[0]='Disabled',
[1]='Accept',
[2]='Provide',
},
-- Sounds played by machines, (nil to disable)
OVERHEAT_SOUND = 'terumet_venting', -- when overheating and discharging
HEATIN_SOUND = 'terumet_heatin', -- when accepting heat from an item/battery
HEATOUT_SOUND = 'terumet_heatout', -- when depositing heat in a battery
DEFAULT_INPUT_SIDE = 3,
DEFAULT_OUTPUT_SIDE = 4,
-- tooltip colors for machine items
TIP_HU_COLOR = '#ff9d15',
TIP_PERCENT_COLOR = '#ffdcac',
}
terumet.options.heater = {
furnace={
--
-- FURNACE HEATER SETTINGS
--
-- Maximum HUs Furnace Heater can store
MAX_HEAT = 10000,
-- Maximum HUs Furnace Heater can transfer per tick
HEAT_TRANSFER_RATE = 500,
-- HU generation per second of burn time
GEN_HUPS = 100
},
solar={
--
-- SOLAR HEATER SETTINGS
--
-- Maximum HUs Solar Heater can store
MAX_HEAT = 40000,
-- HUs Solar Heater generates per second based on sunlight level
SOLAR_HUPS = { 0, 0, 0, 0, 0, 10, 10, 15, 20, 25, 30, 35, 40, 45, 50, 60 },
-- Maximum HUs Solar Heater can transfer per tick
HEAT_TRANSFER_RATE = 1000,
},
entropy={
--
-- ENTROPIC HEATER SETTINGS
--
MAX_HEAT = 200000,
HEAT_TRANSFER_RATE = 5000,
-- the maximum extent the heater "scans" from the main machine
MAX_RANGE = {x=5, y=5, z=5},
-- if a node time is not defined, use this time
DEFAULT_DRAIN_TIME = 1.0,
EFFECTS = {
['default:water_source']={change='default:ice', time=5.0, hups=1000},
['default:water_flowing']={change='default:ice', time=2.5, hups=1200},
['default:lava_source']={change='default:obsidian', time=2.0, hups=10000},
['default:lava_flowing']={change='default:obsidian', time=1.0, hups=5000},
['default:dirt_with_grass']={change='default:dirt', hups=1000},
['default:sandstone']={change='default:sand', hups=3000},
['default:silver_sandstone']={change='default:silver_sand', hups=3000},
['default:stone']={change='default:cobble', time=3.0, hups=1000},
['default:cobble']={change='default:gravel', time=3.0, hups=800},
['default:gravel']={change='default:silver_sand', time=3.0, hups=500},
['default:coalblock']={change='default:stone_with_coal', time=60.0, hups=1500},
['default:stone_with_coal']={change='default:stone', time=10.0, hups=1500},
['default:mossycobble']={change='default:cobble', time=15.0, hups=500},
['default:clay']={change='default:dirt', time=5.0, hups=500},
['default:cactus']={change='air', time=10.0, hups=2000},
['default:papyrus']={change='air', time=20.0, hups=2000},
['group:flora']={change='default:dry_shrub', time=6.0, hups=150},
['default:dry_shrub']={change='air', time=3.0, hups=1500},
['fire:basic_flame']={change='air', time=0.5, hups=10000},
['fire:permanent_flame']={change='air', time=0.5, hups=10000},
['air']={time=1.0, hups=500},
['group:tree']={change='air', time=12.0, hups=3000},
['group:sapling']={change='air', time=4.0, hups=4000},
['group:wood']={change='air', time=9.0, hups=1000},
['group:leaves']={change='air', time=4.0, hups=2000},
}
}
}
terumet.options.crusher = {
--
-- CRUSHER SETTINGS
--
MAX_HEAT = 5000,
HEAT_HUPS = 150,
TIME_HEATING = 4.0, -- in sec.
TIME_COOLING = 6.0, -- in sec.
recipes = {
['default:stone']='default:cobble',
['default:cobble']='default:gravel',
['default:gravel']='default:silver_sand',
['default:obsidian']='default:obsidian_shard 9',
['default:obsidian_shard']='terumet:item_dust_ob',
['default:sandstone']='default:sand',
['default:silver_sandstone']='default:silver_sand',
['default:coalblock']='default:coal_lump 9',
['default:apple']='terumet:item_dust_bio 2',
['default:papyrus']='terumet:item_dust_bio 3',
['group:flora']='terumet:item_dust_bio',
['group:leaves']='terumet:item_dust_bio',
['group:sapling']='terumet:item_dust_bio',
['group:tree']='terumet:item_dust_wood 4',
['group:wood']='terumet:item_dust_wood 1',
}
}
terumet.options.thermobox = {
--
-- THERMOBOX SETTINGS
--
MAX_HEAT = 200000,
HEAT_TRANSFER_RATE = 2500
}
terumet.options.thermdist = {
--
-- THERMAL DISTRIBUTOR SETTINGS
MAX_HEAT = 20000,
HEAT_TRANSFER_RATE = 2500
}
terumet.options.heatline = {
--
-- HEATLINE SETTINGS
--
-- Maximum HUs heatline input can contain
MAX_HEAT = 50000,
-- Maximum distance over a heatline input can send (in blocks of heatline)
-- when a heatline extends beyond this, it will occasionally display smoke particles to warn
MAX_DIST = 36,
-- Every RECHECK_LINKS_TIMER seconds, recheck the heatline network on an input
RECHECK_LINKS_TIMER = 4.0,
-- Max heat transferred every tick (divided among all connected machines in order of distance)
HEAT_TRANSFER_MAX = 2500,
-- whether /heatlines chat command is available to list all heatline network info
DEBUG_CHAT_COMMAND = false,
}
terumet.options.heat_ray = {
--
-- HEAT RAY EMITTER SETTINGS
--
-- Maximum HUs emitter can contain
MAX_HEAT = 20000,
-- HUs sent in one ray
SEND_AMOUNT = 10000,
-- maximum number of nodes emitter will seek before giving up
MAX_DISTANCE = 1000,
-- set to zero to disable particle display of ray
RAY_PARTICLES_PER_NODE = 6
}
terumet.options.smelter = {
--
-- TERUMETAL ALLOY SMELTER SETTINGS
--
-- Maximum HUs smelter can contain
MAX_HEAT = 20000,
-- Amount of flux value (FV) one item is worth
FLUX_VALUE = 2,
-- Maximum stored FV of an alloy smelter's flux tank
-- NOTE: if FLUX_MAXIMUM / FLUX_VALUE > 99, flux could be lost on breaking a smelter
-- (only a maximum of 1 stack of Crystallized Terumetal will be dropped)
-- also if stored flux < FLUX_VALUE, that amount will be lost (minimum 1 Crystallized Terumetal dropped)
FLUX_MAXIMUM = 100,
-- Heat expended per second melting flux
MELT_HUPS = 20,
-- Heat expended per second alloying
ALLOY_HUPS = 10,
-- Default items usable as flux
FLUX_ITEMS = {
['terumet:lump_raw']={time=3.0},
['terumet:ingot_raw']={time=2.0},
['terumet:item_cryst_raw']={time=1.0},
},
-- Default alloy-making recipes
recipes = {
-- Standard Bronze
-- Note these are first in the recipe list to override single terucopper/terutin if all elements for bronze are available
{result='default:bronze_ingot 9', flux=0, time=8.0, input={'default:copper_lump 8', 'default:tin_lump'}},
{result='default:bronze_ingot 9', flux=0, time=6.0, input={'default:copper_ingot 8', 'default:tin_ingot'}},
{result='default:bronzeblock 9', flux=0, time=40.5, input={'default:copperblock 8', 'default:tinblock'}},
{result='default:bronze_ingot 9', flux=0, time=2.0, input={'terumet:item_cryst_copper 8', 'terumet:item_cryst_tin'}},
-- Terumetal Glass
{result='terumet:block_tglass 4', flux=1, time=8.0, input={'default:glass 4', 'default:silver_sand'}},
-- Terumetal Glow Glass
{result='terumet:block_tglassglow 4', flux=1, time=8.0, input={'terumet:block_tglass 4', 'default:mese_crystal'}},
-- Teruchalchum
{result='terumet:ingot_tcha 3', flux=9, time=6.0, input={'default:bronze_ingot', 'default:tin_lump 2'}},
{result='terumet:ingot_tcha 3', flux=9, time=4.0, input={'default:bronze_ingot', 'default:tin_ingot 2'}},
{result='terumet:block_tcha 3', flux=75, time=54.0, input={'default:bronzeblock', 'default:tinblock 2'}},
{result='terumet:ingot_tcha 3', flux=9, time=3.0, input={'default:bronze_ingot', 'terumet:item_cryst_tin 2'}},
-- Terucopper
{result='terumet:ingot_tcop', flux=1, time=3.0, input={'default:copper_lump'}},
{result='terumet:ingot_tcop', flux=1, time=2.5, input={'default:copper_ingot'}},
{result='terumet:block_tcop', flux=8, time=22.5, input={'default:copperblock'}},
{result='terumet:ingot_tcop', flux=1, time=1.0, input={'terumet:item_cryst_copper'}},
-- Terutin
{result='terumet:ingot_ttin', flux=1, time=2.0, input={'default:tin_lump'}},
{result='terumet:ingot_ttin', flux=1, time=1.5, input={'default:tin_ingot'}},
{result='terumet:block_ttin', flux=8, time=15.0, input={'default:tinblock'}},
{result='terumet:ingot_ttin', flux=1, time=0.5, input={'terumet:item_cryst_tin'}},
-- Terusteel
{result='terumet:ingot_tste', flux=2, time=4.5, input={'default:iron_lump'}},
{result='terumet:ingot_tste', flux=2, time=3.5, input={'default:steel_ingot'}},
{result='terumet:block_tste', flux=16, time=31.5, input={'default:steelblock'}},
{result='terumet:ingot_tste', flux=2, time=2.0, input={'terumet:item_cryst_iron'}},
-- Terugold
{result='terumet:ingot_tgol', flux=3, time=5.0, input={'default:gold_lump'}},
{result='terumet:ingot_tgol', flux=3, time=4.0, input={'default:gold_ingot'}},
{result='terumet:block_tgol', flux=25, time=36.0, input={'default:goldblock'}},
{result='terumet:ingot_tgol', flux=3, time=2.5, input={'terumet:item_cryst_gold'}},
-- Coreglass
{result='terumet:ingot_cgls', flux=5, time=10.0, input={'default:diamond', 'default:obsidian_shard'}},
{result='terumet:block_cgls', flux=30, time=90.0, input={'default:diamondblock', 'default:obsidian'}},
{result='terumet:ingot_cgls', flux=5, time=5.0, input={'terumet:item_cryst_dia', 'terumet:item_cryst_ob'}},
-- Teruceramic
{result='terumet:item_ceramic', flux=2, time=3.0, input={'default:clay_lump'}},
-- Thermese
{result='terumet:item_thermese', flux=4, time=8.0, input={'default:mese_crystal'}},
},
}
terumet.options.furnace = {
--
-- HIGH-TEMP FURNACE SETTINGS
--
-- Maximum HUs ht-furnace can contain
MAX_HEAT = 30000,
-- Heat cost per second
COOK_HUPS = 100,
-- Multiplier applied to normal cooking time
-- NOTE: This multiplier is ignored for battery heating
TIME_MULT = 0.5,
}
terumet.options.vac_oven = {
--
-- VACUUM OVEN SETTINGS
--
-- Maximum HUs machine can contain
MAX_HEAT = 100000,
-- HU cost per tick of cooking
COOK_HUPS = 500,
recipes = {
{results={'terumet:item_tarball 4', 'terumet:item_coke'}, time=10.0, input='default:coal_lump'},
{results={'terumet:item_tarball 40', 'terumet:block_coke'}, time=80.0, input='default:coalblock'},
},
VAC_FOOD = {
ACTIVE = true, -- make false to disable vacuum-packed food entirely
-- if AUTO_GENERATE is true, the mod scans all items defined as of this mod's initialization
-- if an item has an on_use and has the group food_*, it is assumed to be a food and adds a vacuum-packed version
-- to ensure a mod's items are scanned, it should be added to terumet's list of dependent mods in mod.conf/depends.txt
AUTO_GENERATE = true,
-- items that are flagged as food by AUTO_GENERATE you do not want to be made into a vacfood can be added through this list
-- if AUTO_GENERATE is false, this list has no effect
-- (1 is meaningless and just to provide a value)
BLACKLIST = {
['mobs:glass_milk']=1,
['mobs:bucket_milk']=1,
['main:honey_bottle']=1,
['mobs:egg']=1,
['group:food_butter']=1, -- you can use groups too
},
-- items that aren't automatically recognized as food can be added through this list
-- even if AUTO_GENERATE is false, these items will be made into a vacfood
-- (1 is meaningless and just to provide a value)
WHITELIST = {
['moretrees:acorn_muffin']=1,
}
-- see interop/farming.lua for foods from "farming" mod
-- see interop/extra.lua for foods from "extra" mod
},
MAX_RESULTS = 2, -- Maximum number of result items from recipes (adjust this if any larger recipes are added)
}
terumet.options.vulcan = {
--
-- CRYSTAL VULCANIZER SETTINGS
--
-- populated through registration, see interop/terumet_api.lua
recipes = {}, -- DO NOT CHANGE
-- Maximum HUs vulcanizer can contain
MAX_HEAT = 60000,
-- Heat cost per second of vulcanizing
VULCANIZE_HUPS = 200,
-- Time to process one item (in seconds)
PROCESS_TIME = 6.0,
-- when true, crystalizing obsidian always produces exactly one crystal.
-- this prevents easy infinite obsidian loops.
LIMIT_OBSIDIAN = true,
}
terumet.options.lavam = {
--
-- LAVA MELTER SETTINGS
--
-- Maximum HUs melter can contain
MAX_HEAT = 30000,
-- Nodes that can be melted to lava
-- related number is total required heat to melt
VALID_STONES = {
['default:stone']=15000,
['default:cobble']=20000,
['default:desert_stone']=14000,
['default:desert_cobble']=18000
},
-- total time for 1 item required in seconds (best if required heat/MELT_TIME is a whole number)
MELT_TIME = 200
}
terumet.options.meseg = {
--
-- MESE GARDEN SETTINGS
--
-- Maximum HUs garden can contain
MAX_HEAT = 50000,
-- HUs required to begin growing
START_HEAT = 10000,
-- HUs required per second when growing
HEAT_HUPS = 350,
-- Multiplier applied to efficiency every second not heated or seeded
EFFIC_LOSS_RATE = 0.75,
-- Maximum efficiency "points" (at this level, progress is 100% of possible rate)
-- Efficiency points increase by number of seed crystals each second until max
MAX_EFFIC = 2000,
-- Progress "points" needed to grow a new shard
-- points gained each second = number of seed crystals x efficiency
PROGRESS_NEED = 300,
-- item id of seed crystal
SEED_ITEM = 'default:mese_crystal',
-- item id of produced item
PRODUCE_ITEM = 'default:mese_crystal_fragment',
-- Chance to lose a seed crystal each growth is 1/(SEED_LOSS_CHANCE-seed crystal count)
-- so SEED_LOSS_CHANCE = 101 means:
-- 1 seed crystal = 1/100 chance (very low)
-- 99 seed crystals = 1/2 chance (coin flip)
-- You can set to false or nil to disable losing seeds, even if it's overpowered.
SEED_LOSS_CHANCE = 101,
-- sound to play at Garden node when a seed is lost (nil for none)
SEED_LOSS_SOUND = 'terumet_break',
-- true if particle effects occur when a seed is lost (default machine PARTICLES option false will also disable)
SEED_LOSS_PARTICLES = true
}
terumet.options.repm = {
--
-- EQUIPMENT REFORMER SETTINGS
--
MAX_HEAT = 50000,
-- HUs/sec to melt repair material and repair material units processed per tick
MELT_HUPS = 100,
MELTING_RATE = 10,
-- HUs/sec to repair one item and repair material units applied to repairing per tick
REPAIR_HUPS = 30,
REPAIR_RATE = 10,
-- maximum units of repair material that can be stored
RMAT_MAXIMUM = 1000,
-- items that can be turned into "repair-material" and how much
-- populated through registration, see interop/terumet_api.lua
repair_mats = {}, -- DO NOT CHANGE
-- all items that can be repaired and how much "repair-material" is required to remove a full wear bar
-- (TODO) mods can add addtional ones through the API terumet.register_repairable_item -- see interop/terumet_api.lua
repairable = {}, -- DO NOT CHANGE
}
terumet.options.ore_saw = {
--
-- ORE SAW SETTINGS
--
-- Nodes that can be gathered directly via saw (1 is meaningless and just to provide a value)
VALID_ORES = {
['default:stone_with_diamond']=1,
['default:stone_with_mese']=1,
['default:stone_with_copper']=1,
['default:stone_with_tin']=1,
['default:stone_with_iron']=1,
['default:stone_with_gold']=1,
['default:stone_with_coal']=1,
['terumet:ore_raw']=1,
['terumet:ore_raw_desert']=1,
['asteroid:copperore']=1,
['asteroid:diamondore']=1,
['asteroid:goldore']=1,
['asteroid:ironore']=1,
['asteroid:meseore']=1,
['moreores:mineral_mithril']=1,
['moreores:mineral_silver']=1,
['titanium:titanium_in_ground']=1,
['quartz:quartz_ore']=1,
['nether:titanium_ore']=1,
},
-- Number of times basic ore saw can be used before breaking
BASIC_USES = 40,
-- Number of times advanced ore saw can be used before breaking
ADVANCED_USES = 200,
}
-- NOTE: Armor and bracers will only be available if the mod "3d_armor" by stujones11 (https://github.com/stujones11/minetest-3d_armor) is active
terumet.options.armor = {
-- delete or comment out entire BRACERS = {...} block to disable all bracers
BRACERS = { -- delete single line or comment out (add -- to start) to disable that type of bracer
-- water-breathing bracer
aqua={name='Aqua', color='#0010ff', mat='default:papyrus', xinfo='Underwater breathing',
def=5, uses=65535/150, rep=100, breathing=1},
-- high jump bracer
jump={name='Jump', color='#ffac00', mat='terumet:item_cryst_mese', xinfo='Increase jump height',
def=5, uses=65535/200, rep=150, jump=0.5},
-- movement speed bracer
spd={ name='Speed', color='#4eff00', mat='terumet:item_cryst_dia', xinfo='Increase move speed',
def=5, uses=65535/150, rep=400, speed=0.8},
-- anti-gravity bracer
agv={ name='Antigravity', color='#7600ff', mat='terumet:item_entropy', xinfo='Reduce gravity',
def=5, uses=65535/100, rep=400, speed=-0.1, gravity=-0.5, jump=-0.1},
-- high heal bracer
heal={name='Heal', color='#ff0086', mat='terumet:block_dust_bio', xinfo='Heal +10',
heal=10, uses=65535/200, rep=600},
-- high defense bracer
def={ name='Defense', color='#727272', mat='terumet:item_rsuitmat', xinfo='Defense +30',
def=30, uses=65535/150, rep=300},
-- fire protection bracer
-- 3darmor must have the option "Enable fire protection" on in order for this bracer to function or be loaded
fire={name='Fireproof', color='#ff5d00', mat='terumet:item_cryst_ob', xinfo='Immunity to fire/lava',
uses=65535/100, rep=300, fire=99},
},
-- Item used to create bracer crystals
BRACER_CRYSTAL_ITEM = 'default:steelblock',
}

BIN
mods/terumet/screenshot.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 409 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 314 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 297 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 293 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 290 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 304 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 284 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 348 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 340 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 310 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 741 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 746 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 341 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 345 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 341 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 559 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 583 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 556 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 529 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 567 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 543 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 399 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 397 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 393 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 387 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 408 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 375 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 470 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 473 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 433 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 424 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 464 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 455 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 253 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 569 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 936 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 965 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 576 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Some files were not shown because too many files have changed in this diff Show More