built on 21/06/2020 10:21:23

This commit is contained in:
Joachim Stolberg 2020-06-21 10:21:23 +02:00
parent 25b5e3a76c
commit e7445257b8
26 changed files with 238 additions and 44 deletions

View File

@ -39,6 +39,15 @@ Required: Minetest Game
### History
#### 2020-06-21
Updates (see local readme files):
- signs_bot v1.03
- techage v0.13
- hyperloop v2.06
#### 2020-06-18
- techage v0.12

View File

@ -64,9 +64,9 @@ has some risks. Therefore:
## Configuration
The following can be changed in the minetest menu (Settings -> Advanced Settings -> Mods -> hyperloop) or directly in 'minetest.conf'
* "WiFi block enabled" - To enable the usage of WiFi blocks
* "WiFi block crafting enabled" - To enable the crafting of WiFi blocks
* "free tube placement enabled" - If enabled Hyperloop Tubes and Elevator Shafts can be build in all directions.
* "WiFi block enabled" - To enable the usage of WiFi blocks (default: false)
* "WiFi block crafting enabled" - To enable the crafting of WiFi blocks (default: false)
* "free tube placement enabled" - If enabled Hyperloop Tubes and Elevator Shafts can be build in all directions (default: true)
When this option is disabled, Hyperloop tubes can only be built in the horizontal direction and elevator shafts in the vertical direction.
Example for 'minetest.conf':

View File

@ -3,7 +3,7 @@
Hyperloop Mod
=============
v2.04 by JoSt
v2.06 by JoSt
Copyright (C) 2017-2019 Joachim Stolberg
@ -33,6 +33,7 @@
2019-03-23 v2.03 Elevator duplication bugfix
2020-01-03 v2.04 Elevator door bugfix (MT 5+)
2020-03-12 v2.05 minetest translator added (thanks to acmgit/Clyde)
2020-06-14 v2.06 The default value for `hyperloop_free_tube_placement_enabled` is now true
]]--
@ -63,7 +64,7 @@ else
-- Configuration settings
hyperloop.wifi_enabled = minetest.settings:get_bool("hyperloop_wifi_enabled")
hyperloop.wifi_crafting_enabled = minetest.settings:get_bool("hyperloop_wifi_crafting_enabled")
hyperloop.free_tube_placement_enabled = minetest.settings:get_bool("hyperloop_free_tube_placement_enabled")
hyperloop.free_tube_placement_enabled = minetest.settings:get_bool("hyperloop_free_tube_placement_enabled", true)
dofile(minetest.get_modpath("hyperloop") .. "/network.lua")
dofile(minetest.get_modpath("hyperloop") .. "/data_base.lua")

View File

@ -166,4 +166,5 @@ optional: farming redo, node_io, doc, techage, minecart
- 2020-01-02 v1.00 * bot inventory filter added, documentation enhanced
- 2020-03-27 v1.01 * flower command and sign added
- 2020-03-30 v1.02 * Program flow control commands added
- 2020-06-21 v1.03 * Interpreter bugfixes, node and crop sensors changed

View File

@ -46,9 +46,8 @@ local function node_timer(pos)
if swap_node(pos, "signs_bot:crop_sensor_on") then
signs_bot.send_signal(pos)
signs_bot.lib.activate_extender_nodes(pos, true)
minetest.after(1, swap_node, pos, "signs_bot:crop_sensor")
end
else
swap_node(pos, "signs_bot:crop_sensor")
end
return true
end
@ -118,8 +117,8 @@ minetest.register_node("signs_bot:crop_sensor_on", {
sunlight_propagates = true,
paramtype2 = "facedir",
is_ground_content = false,
diggable = false,
groups = {sign_bot_sensor = 1, not_in_creative_inventory = 1},
drop = "signs_bot:crop_sensor",
groups = {sign_bot_sensor = 1, cracky = 1, not_in_creative_inventory = 1},
sounds = default.node_sound_metal_defaults(),
})
@ -152,7 +151,7 @@ if minetest.get_modpath("doc") then
data = {
item = "signs_bot:crop_sensor",
text = table.concat({
I("The Crop Sensor sends a signal when, for example wheat is fully grown."),
I("The Crop Sensor sends cyclical signals when, for example, wheat is fully grown."),
I("The sensor range is one node/meter."),
I("The sensor has an active side (red) that must point to the crop/field."),

View File

@ -15,7 +15,7 @@
signs_bot = {}
-- Version for compatibility checks, see readme.md/history
signs_bot.version = 1.01
signs_bot.version = 1.03
if minetest.global_exists("techage") and techage.version < 0.06 then
minetest.log("error", "[signs_bot] Signs Bot requires techage version 0.06 or newer!")

View File

@ -49,7 +49,7 @@ local function get_line_tokens(script)
while idx < #lines do
idx = idx + 1
-- remove comments
local line = string.split(lines[idx], "--")[1] or ""
local line = string.split(lines[idx], "--", true, 1)[1] or ""
-- remove blanks
line = trim(line)
if #line > 0 then
@ -255,10 +255,6 @@ function api.check_script(script)
return false, I("'repeat' missing"), 0
elseif (tbl["end"] or 0) < (tbl["repeat"] or 0) then
return false, I("'end' missing"), 0
elseif (tbl["call"] or 0) > (tbl["return"] or 0) then
return false, I("'return' missing"), 0
elseif (tbl["call"] or 0) < (tbl["return"] or 0) then
return false, I("'call' missing"), 0
end
return true, I("Checked and approved"), 0
end

View File

@ -71,16 +71,12 @@ local function any_node_changed(pos)
if mem.num ~= num then
if mem.mode == 1 and num < mem.num then
mem.num = num
return true
elseif mem.mode == 2 and num > mem.num then
mem.num = num
return true
elseif mem.mode == 3 then
mem.num = num
return true
end
mem.num = num
end
return false
end
@ -93,6 +89,9 @@ local function on_receive_fields(pos, formname, fields, player)
end
if fields.accept then
mem.mode = DropdownValues[fields.mode] or 3
mem.num = nil
minetest.get_node_timer(pos):start(CYCLE_TIME)
swap_node(pos, "signs_bot:node_sensor")
end
meta:set_string("formspec", formspec(mem))
end
@ -102,9 +101,8 @@ local function node_timer(pos)
if swap_node(pos, "signs_bot:node_sensor_on") then
signs_bot.send_signal(pos)
signs_bot.lib.activate_extender_nodes(pos, true)
minetest.after(1, swap_node, pos, "signs_bot:node_sensor")
end
else
swap_node(pos, "signs_bot:node_sensor")
end
return true
end
@ -172,13 +170,14 @@ minetest.register_node("signs_bot:node_sensor_on", {
on_timer = node_timer,
update_infotext = update_infotext,
on_receive_fields = on_receive_fields,
on_rotate = screwdriver.disallow,
paramtype = "light",
sunlight_propagates = true,
paramtype2 = "facedir",
is_ground_content = false,
diggable = false,
groups = {sign_bot_sensor = 1, not_in_creative_inventory = 1},
drop = "signs_bot:node_sensor",
groups = {sign_bot_sensor = 1, cracky = 1, not_in_creative_inventory = 1},
sounds = default.node_sound_metal_defaults(),
})
@ -211,7 +210,7 @@ if minetest.get_modpath("doc") then
data = {
item = "signs_bot:node_sensor",
text = table.concat({
I("The node sensor can send a signal when it detects that nodes appear or disappear,"),
I("The node sensor sends cyclical signals when it detects that nodes have appeared or disappeared,"),
I("but has to be configured accordingly."),
I("Valid nodes are all kind of blocks and plants."),
I("The sensor range is 3 nodes/meters in one direction."),

View File

@ -35,7 +35,7 @@ Textures: CC BY-SA 3.0
### Dependencies
Required: default, doors, bucket, stairs, screwdriver, basic_materials, tubelib2, minecart, lcdlib, safer_lua
Recommended: signs_bot, hyperloop, compost, techpack_stairway, autobahn
Optional: unified_inventory, wielded_light, unifieddyes, lua-mashal, lsqlite3, moreores
Optional: unified_inventory, wielded_light, unifieddyes, lua-mashal, lsqlite3, moreores, ethereal, mesecon
The mods `default`, `doors`, `bucket`, `stairs`, and `screwdriver` are part of Minetest Game.
@ -87,7 +87,8 @@ to 'lsqlite3' and 'lua-marshal', but there is no way back, so:
- 2020-04-26 V0.07 * English translation added
- 2020-05-22 V0.08 * Support for 'lua-marshal' and 'lsqlite3' added
- 2020-05-31 V0.09 * TA4 tubes upgraded, manuals updated
- 2020-06-04 V0.10 * minor changes and bugfixes
- 2020-06-14 V0.11 * cart commands added for both controllers, support for moreores added
- 2020-06-17 V0.12 * Ethereal support added, manual correction, tin ingot recipe bugfix
- 2020-06-04 V0.10 * minor changes and bugfixes
- 2020-06-14 V0.11 * cart commands added for both controllers, support for moreores added
- 2020-06-17 V0.12 * Ethereal support added, manual correction, tin ingot recipe bugfix
- 2020-06-19 V0.13 * Mesecons Converter added

View File

@ -182,13 +182,7 @@ end
local function empty_on_punch(pos, nvm, full_container, item_count)
nvm.liquid = nvm.liquid or {}
nvm.liquid.amount = nvm.liquid.amount or 0
local lqd_def
-- handle legacy items
if IsLiquid[full_container] then
lqd_def = {inv_item = full_container, size = (item_count or 1), container = ""}
else
lqd_def = get_liquid_def(full_container)
end
local lqd_def = get_liquid_def(full_container)
local ndef_lqd = LQD(pos)
if lqd_def and ndef_lqd then
local tank_size = ndef_lqd.capa or 0

View File

@ -111,6 +111,7 @@ techage.Items = {
ta3_drill_pipe_wrench = "techage:ta3_drill_pipe_wrench",
ta3_pipe = "techage:ta3_pipeS",
ta3_pipe_wall_entry = "techage:ta3_pipe_wall_entry",
ta3_mesecons_converter = "techage:ta3_mesecons_converter",
----------------------------
techage_ta4 = "techage_ta4.png",
ta4_windturbine = "techage:ta4_wind_turbine",

View File

@ -99,6 +99,7 @@ techage.manual_DE.aTitel = {
"3,TechAge Signallampe / Signal Lamp",
"3,Tür/Tor Blöcke / Door/Gate Blocks",
"3,TA3 Tür Controller / Door Controller",
"3,TA3 Mesecons Umsetzer / TA3 Mesecons Converter",
"2,Detektoren",
"3,TA3 Detektor / Detector",
"3,TA3 Wagen Detektor / Cart Detector",
@ -934,6 +935,13 @@ techage.manual_DE.aText = {
"\n"..
"\n"..
"\n",
"Der Mesecons Umsetzer dient zur Umwandlung von Techage on/off Kommandos in Mesecons Signale und umgekehrt.\n"..
"Dazu müssen eine oder mehrere Knotennummern eingegeben und der Konverter mit Mesecons Blöcken \n"..
"über Mesecons Leitungen verbunden werden. Den Mesecons Umsetzer kann man auch mit dem Programmer konfigurieren.\n"..
"Der Mesecons Umsetzer akzeptiert bis zu 5 Kommandos pro Sekunde\\, bei höherer Belastung schaltet er sich ab.\n"..
"\n"..
"\n"..
"\n",
"Detektoren scannen ihre Umgebung ab und senden ein 'on'-Kommando\\, wenn das Gesuchte erkannt wurde.\n"..
"\n"..
"\n"..
@ -1566,6 +1574,7 @@ techage.manual_DE.aItemName = {
"ta3_signallamp",
"ta3_doorblock",
"ta3_doorcontroller",
"ta3_mesecons_converter",
"ta3_nodedetector",
"ta3_detector",
"ta3_cartdetector",
@ -1771,6 +1780,7 @@ techage.manual_DE.aPlanTable = {
"",
"",
"",
"",
"ta4_windturbine",
"",
"",

View File

@ -99,6 +99,7 @@ techage.manual_EN.aTitel = {
"3,TechAge Signal Lamp",
"3,Door/Gate Blocks",
"3,TA3 Door Controller",
"3,TA3 Mesecons Converter",
"2,Detectors",
"3,TA3 Detector",
"3,TA3 Cart Detector",
@ -932,6 +933,13 @@ techage.manual_EN.aText = {
"\n"..
"\n"..
"\n",
"The Mesecons converter is used to convert Techage on/off commands into Mesecons signals and vice versa.\n"..
"To do this\\, one or more node numbers must be entered and the converter with Mesecons blocks\n"..
"has to be connected via Mesecons cables. The Mesecons converter can also be configured with the programmer.\n"..
"The Mesecons converter accepts up to 5 commands per second\\; it switches itself off at higher loads.\n"..
"\n"..
"\n"..
"\n",
"Detectors scan their surroundings and send an 'on' command when the search is recognized.\n"..
"\n"..
"\n"..
@ -1556,6 +1564,7 @@ techage.manual_EN.aItemName = {
"ta3_signallamp",
"ta3_doorblock",
"ta3_doorcontroller",
"ta3_mesecons_converter",
"ta3_nodedetector",
"ta3_detector",
"ta3_cartdetector",
@ -1761,6 +1770,7 @@ techage.manual_EN.aPlanTable = {
"",
"",
"",
"",
"ta4_windturbine",
"",
"",

View File

@ -13,7 +13,7 @@
techage = {}
-- Version for compatibility checks, see readme.md/history
techage.version = 0.12
techage.version = 0.13
if minetest.global_exists("tubelib") then
minetest.log("error", "[techage] Techage can't be used together with the mod tubelib!")
@ -223,6 +223,9 @@ dofile(MP.."/logic/gateblock.lua")
dofile(MP.."/logic/doorblock.lua")
dofile(MP.."/logic/doorcontroller.lua")
dofile(MP.."/logic/collector.lua")
if minetest.global_exists("mesecon") then
dofile(MP.."/logic/mesecons_converter.lua")
end
-- Test
dofile(MP.."/recipe_checker.lua")

View File

@ -43,8 +43,9 @@ minetest.register_ore({
y_max = -250,
})
techage.furnace.register_recipe({
minetest.register_craft({
type = 'cooking',
output = 'techage:baborium_ingot',
recipe = {'techage:baborium_lump'},
time = 3,
})
recipe = 'techage:baborium_lump',
cooktime = 5,
})

View File

@ -31,7 +31,6 @@ minetest.register_craftitem("techage:cylinder_large_hydrogen", {
stack_max = 1,
})
techage.register_liquid("techage:hydrogen", "", 1, "techage:hydrogen")
techage.register_liquid("techage:cylinder_small_hydrogen", "techage:ta3_cylinder_small", 1, "techage:hydrogen")
techage.register_liquid("techage:cylinder_large_hydrogen", "techage:ta3_cylinder_large", 6, "techage:hydrogen")

View File

@ -132,6 +132,5 @@ minetest.register_craftitem("techage:ta3_canister_oil", {
})
techage.register_liquid("techage:bucket_oil", "bucket:bucket_empty", 1, "techage:oil_source")
techage.register_liquid("techage:oil_source", "", 1, "techage:oil_source")
techage.register_liquid("techage:ta3_barrel_oil", "techage:ta3_barrel_empty", 10, "techage:oil_source")
techage.register_liquid("techage:ta3_canister_oil", "techage:ta3_canister_empty", 1, "techage:oil_source")

View File

@ -215,6 +215,7 @@ TA1 Melting Pot=TA1 Schmelztiegel
TA1 Meridium Hammer (smash stone to gravel)=TA1 Meridiumhammer (zerschlage Stein zu Kies)
TA1 Mese Hammer (smash stone to gravel)=TA1 Mesehammer (zerschlage Stein zu Kies)
TA1 Steel Hammer (smash stone to gravel)=TA1 Stahlhammer (zerschlage Stein zu Kies)
TA1 Stone Hammer (smash stone to gravel)=TA1 Steinhammer (zerschlage Stein zu Kies)
TA2 Boiler Base=TA2 Boiler unten
TA2 Boiler Top=TA2 Boiler oben
TA2 Cylinder=TA2 Zylinder
@ -261,6 +262,7 @@ TA3 Generator=TA3 Generator
TA3 Gravel Sieve=TA3 Kiessieb
TA3 Logic Block=TA3 Logikblock
TA3 Melting=TA3 Schmelzen
TA3 Mesecons Converter=TA3 Mesecons Konverter
TA3 Naphtha=TA3 Naphtha
TA3 Naphtha Barrel=TA3 Naphtha-Fass
TA3 Naphtha Canister=TA3 Naphtha-Kanister

View File

@ -213,6 +213,7 @@ TA1 Melting Pot=
TA1 Meridium Hammer (smash stone to gravel)=
TA1 Mese Hammer (smash stone to gravel)=
TA1 Steel Hammer (smash stone to gravel)=
TA1 Stone Hammer (smash stone to gravel)=
TA2 Boiler Base=
TA2 Boiler Top=
TA2 Cylinder=
@ -259,6 +260,7 @@ TA3 Generator=
TA3 Gravel Sieve=
TA3 Logic Block=
TA3 Melting=
TA3 Mesecons Converter=
TA3 Naphtha=
TA3 Naphtha Barrel=
TA3 Naphtha Canister=

View File

@ -0,0 +1,147 @@
--[[
TechAge
=======
Copyright (C) 2017-2020 Joachim Stolberg
GPL v3
See LICENSE.txt for more information
Mesecons converter
]]--
-- for lazy programmers
local M = minetest.get_meta
local S = techage.S
local logic = techage.logic
local OVER_LOAD_MAX = 10
local CYCLE_TIME = 2
local function formspec(meta)
local numbers = meta:get_string("numbers") or ""
return "size[7.5,3]"..
"field[0.5,1;7,1;numbers;"..S("Insert destination node number(s)")..";"..numbers.."]" ..
"button_exit[2,2;3,1;exit;"..S("Save").."]"
end
local function send_message(pos, topic)
local meta = M(pos)
local mem = techage.get_mem(pos)
mem.overload_cnt = (mem.overload_cnt or 0) + 1
if mem.overload_cnt > OVER_LOAD_MAX then
logic.infotext(M(pos), S("TA3 Mesecons Converter"), "fault (overloaded)")
minetest.get_node_timer(pos):stop()
return false
end
local own_num = meta:get_string("node_number")
local numbers = meta:get_string("numbers")
techage.send_multi(own_num, numbers, topic)
end
minetest.register_node("techage:ta3_mesecons_converter", {
description = S("TA3 Mesecons Converter"),
tiles = {
-- up, down, right, left, back, front
"techage_filling_ta3.png^techage_frame_ta3_top.png",
"techage_filling_ta3.png^techage_frame_ta3_top.png",
"techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_mesecons_converter.png",
},
after_place_node = function(pos, placer)
local meta = M(pos)
local mem = techage.get_mem(pos)
logic.after_place_node(pos, placer, "techage:ta3_mesecons_converter", S("TA3 Mesecons Converter"))
logic.infotext(meta, S("TA3 Mesecons Converter"))
meta:set_string("formspec", formspec(meta))
mem.overload_cnt = 0
minetest.get_node_timer(pos):start(CYCLE_TIME)
mesecon.on_placenode(pos, minetest.get_node(pos))
end,
on_receive_fields = function(pos, formname, fields, player)
if minetest.is_protected(pos, player:get_player_name()) then
return
end
local meta = M(pos)
if techage.check_numbers(fields.numbers, player:get_player_name()) then
meta:set_string("numbers", fields.numbers)
logic.infotext(M(pos), S("TA3 Mesecons Converter"))
meta:set_string("formspec", formspec(meta))
end
minetest.get_node_timer(pos):start(CYCLE_TIME)
end,
on_timer = function(pos,elapsed)
local mem = techage.get_mem(pos)
mem.overload_cnt = 0
return true
end,
techage_set_numbers = function(pos, numbers, player_name)
local meta = M(pos)
local res = logic.set_numbers(pos, numbers, player_name, S("TA3 Mesecons Converter"))
meta:set_string("formspec", formspec(meta))
return res
end,
mesecons = {
receptor = {
state = mesecon.state.off,
rules = mesecon.rules.default,
},
effector = {
rules = mesecon.rules.default,
action_on = function(pos, node)
send_message(pos, "on")
end,
action_off = function(pos, node)
send_message(pos, "off")
end,
action_change = function(pos, node)
send_message(pos, "change")
end,
}
},
after_dig_node = function(pos, oldnode, oldmetadata)
techage.remove_node(pos, oldnode, oldmetadata)
techage.del_mem(pos)
mesecon.on_dignode(pos, oldnode)
end,
paramtype2 = "facedir",
groups = {choppy=2, cracky=2, crumbly=2},
is_ground_content = false,
sounds = default.node_sound_wood_defaults(),
})
minetest.register_craft({
output = "techage:ta3_mesecons_converter",
recipe = {
{"techage:ta3_repeater", "mesecons:wire_00000000_off"},
},
})
techage.register_node({"techage:ta3_mesecons_converter"}, {
on_recv_message = function(pos, src, topic, payload)
local mem = techage.get_mem(pos)
mem.overload_cnt = (mem.overload_cnt or 0) + 1
if mem.overload_cnt > OVER_LOAD_MAX then
logic.infotext(M(pos), S("TA3 Mesecons Converter"), "fault (overloaded)")
minetest.get_node_timer(pos):stop()
return false
elseif topic == "on" then
mesecon.receptor_on(pos, mesecon.rules.default)
elseif topic == "off" then
mesecon.receptor_off(pos, mesecon.rules.default)
end
end,
on_node_load = function(pos)
minetest.get_node_timer(pos):start(CYCLE_TIME)
end,
})

View File

@ -592,6 +592,14 @@ Der Tür Controller dient zur Ansteuerung der TA3 Tür/Tor Blöcke. Beim Tür Co
[ta3_doorcontroller|image]
### TA3 Mesecons Umsetzer / TA3 Mesecons Converter
Der Mesecons Umsetzer dient zur Umwandlung von Techage on/off Kommandos in Mesecons Signale und umgekehrt.
Dazu müssen eine oder mehrere Knotennummern eingegeben und der Konverter mit Mesecons Blöcken
über Mesecons Leitungen verbunden werden. Den Mesecons Umsetzer kann man auch mit dem Programmer konfigurieren.
Der Mesecons Umsetzer akzeptiert bis zu 5 Kommandos pro Sekunde, bei höherer Belastung schaltet er sich ab.
[ta3_mesecons_converter|image]
## Detektoren

View File

@ -590,6 +590,16 @@ The door controller is used to control the TA3 door/gate blocks. With the door c
[ta3_doorcontroller|image]
### TA3 Mesecons Converter
The Mesecons converter is used to convert Techage on/off commands into Mesecons signals and vice versa.
To do this, one or more node numbers must be entered and the converter with Mesecons blocks
has to be connected via Mesecons cables. The Mesecons converter can also be configured with the programmer.
The Mesecons converter accepts up to 5 commands per second; it switches itself off at higher loads.
[ta3_mesecons_converter|image]
## Detectors

View File

@ -98,6 +98,7 @@
- [TechAge Signallampe / Signal Lamp](./manual_ta3_DE.md#techage-signallampe--signal-lamp)
- [Tür/Tor Blöcke / Door/Gate Blocks](./manual_ta3_DE.md#türtor-blöcke--doorgate-blocks)
- [TA3 Tür Controller / Door Controller](./manual_ta3_DE.md#ta3-tür-controller--door-controller)
- [TA3 Mesecons Umsetzer / TA3 Mesecons Converter](./manual_ta3_DE.md#ta3-mesecons-umsetzer--ta3-mesecons-converter)
- [Detektoren](./manual_ta3_DE.md#detektoren)
- [TA3 Detektor / Detector](./manual_ta3_DE.md#ta3-detektor--detector)
- [TA3 Wagen Detektor / Cart Detector](./manual_ta3_DE.md#ta3-wagen-detektor--cart-detector)

View File

@ -98,6 +98,7 @@
- [TechAge Signal Lamp](./manual_ta3_EN.md#techage-signal-lamp)
- [Door/Gate Blocks](./manual_ta3_EN.md#doorgate-blocks)
- [TA3 Door Controller](./manual_ta3_EN.md#ta3-door-controller)
- [TA3 Mesecons Converter](./manual_ta3_EN.md#ta3-mesecons-converter)
- [Detectors](./manual_ta3_EN.md#detectors)
- [TA3 Detector](./manual_ta3_EN.md#ta3-detector)
- [TA3 Cart Detector](./manual_ta3_EN.md#ta3-cart-detector)

View File

@ -1,4 +1,4 @@
name = techage
depends = default,doors,tubelib2,basic_materials,bucket,stairs,screwdriver,minecart,lcdlib,safer_lua
optional_depends = unified_inventory,wielded_light,unifieddyes,moreores, ethereal
optional_depends = unified_inventory,wielded_light,unifieddyes,moreores,ethereal,mesecon
description = Techage, go through 4 tech ages in search of wealth and power!

Binary file not shown.

After

Width:  |  Height:  |  Size: 301 B