123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- local S = minetest.get_translator("advtrains_doc_integration")
- local fsescape = minetest.formspec_escape
- local function S2(a, b)
- return S(a, S(b))
- end
- local function map(tbl, func)
- local t = {}
- for k, v in pairs(tbl or {}) do
- t[k] = func(v)
- end
- return t
- end
- if doc.sub.items then
- local register_factoid = doc.sub.items.register_factoid
- local function group_factoid(cat, gr, f)
- register_factoid(cat, "groups", function(_, def)
- return f(def.groups[gr] or 0) or ""
- end)
- end
- for cat, cinfo in pairs{
- nodes = {
- not_blocking_trains = S("This block does not block trains."),
- save_in_at_nodedb = S("This block is saved in the Advtrains node database."),
- },
- } do
- for group, ginfo in pairs(cinfo) do
- local tp = type(ginfo)
- if tp == "string" then
- group_factoid(cat, group, function(x)
- if x > 0 then
- return ginfo
- end
- end)
- elseif tp == "function" then
- group_factoid(cat, group, ginfo)
- end
- end
- end
- register_factoid("nodes", "groups", function(_, ndef)
- if ndef.advtrains then
- if ndef.advtrains.set_aspect then
- return S("This is a signal with a variable aspect.")
- elseif ndef.advtrains.get_aspect then
- return S("This is a signal with a static aspect.")
- end
- end
- return ""
- end)
- end
- doc.add_category("advtrains_wagons", {
- name = S("Wagons"),
- build_formspec = doc.entry_builders.formspec,
- })
- local function addlist(lst, tbl, title, fallback1, fallback2, mapf)
- if not tbl then
- if fallback2 then
- table.insert(lst, fallback2)
- elseif fallback2 == false and fallback1 then
- table.insert(lst, fallback1)
- end
- elseif next(tbl) ~= nil then
- table.insert(lst, title)
- for k, v in pairs(tbl) do
- if mapf then
- k = mapf(k, v)
- end
- table.insert(lst, "* " .. k)
- end
- elseif fallback1 then
- table.insert(lst, fallback1)
- end
- end
- local function get_coupler_name(n)
- return advtrains.coupler_types[n] or n
- end
- local function doc_register_wagon(itemname)
- local prototype = advtrains.wagon_prototypes[itemname]
- local itemdef = minetest.registered_items[itemname]
- local desctext = {}
- addlist(desctext, prototype.drives_on, S("Drives on:"))
- addlist(desctext, prototype.coupler_types_front, S("Compatible front couplers:"), S2("Front coupler: @1", "Absent"), S2("Front coupler: @1", "Universal"), get_coupler_name)
- addlist(desctext, prototype.coupler_types_back, S("Compatible rear couplers:"), S2("Rear coupler: @1", "Absent"), S2("Rear coupler: @1", "Universal"), get_coupler_name)
- table.insert(desctext, S("Wagon span: @1", prototype.wagon_span and 2*prototype.wagon_span or S("Undefined")))
- table.insert(desctext, S("Maximum speed: @1", prototype.max_speed or S("Undefined")))
- table.insert(desctext, S2("Motive power: @1", prototype.is_locomotive and "Present" or "Absent"))
- if prototype.has_inventory then
- addlist(desctext, prototype.inventory_list_sizes, S("Cargo inventory size:"), S2("Cargo inventory: @1", "Present"), false, function(k, v)
- return string.format("%s: %s", k, v)
- end)
- else
- table.insert(desctext, S2("Cargo inventory: @1", "Absent"))
- end
- local pax, driver = 0, 0
- if prototype.seats and prototype.seat_groups then
- for _, v in pairs(prototype.seats) do
- if prototype.seat_groups[v.group].driving_ctrl_access then
- driver = driver + 1
- else
- pax = pax + 1
- end
- end
- end
- table.insert(desctext, S("Passenger seats: @1", pax))
- table.insert(desctext, S("Driver seats: @1", driver))
- addlist(desctext, prototype.drops, S("Drops:"), S("Drops nothing"), false, function(_, v) return v end)
- local hornsound = prototype.horn_sound
- if type(hornsound) == "table" then
- hornsound = hornsound.name
- end
- table.insert(desctext, S("Horn sound: @1", hornsound and hornsound ~= "" and hornsound or S("Undefined")))
- for k, v in pairs {
- custom_on_activate = "Custom instantiation callback",
- custom_on_step = "Custom step function",
- custom_on_velocity_change = "Custom velocity change callback",
- } do
- table.insert(desctext, S2(v .. ": @1", prototype[k] and "Defined" or "Undefined"))
- end
- local x0, y0 = doc.FORMSPEC.ENTRY_START_X, doc.FORMSPEC.ENTRY_START_Y
- local x1, y1 = doc.FORMSPEC.ENTRY_END_X+0.75, doc.FORMSPEC.ENTRY_END_Y
- local width, height = x1-x0, y1-y0
- local mside = height/2
- local mesh = fsescape(prototype.mesh or "")
- local textures = table.concat(map(prototype.textures, fsescape), ",")
- local fstext = {
- doc.widgets.text(table.concat(desctext, "\n"), x0, y0, width-mside, height),
- string.format("item_image[%f,%f;%f,%f;%s]", x1-mside, y0, mside, mside, fsescape(itemname)),
- "style[wagon_model;bgcolor=#000]",
- string.format("model[%f,%f;%f,%f;%s;%s;%s;%f,%f]",
- x1-mside, y1-mside+0.625, mside, mside, "wagon_model", mesh, textures, -30, 135),
- }
- minetest.override_item(itemname, {_doc_items_create_entry = false})
- doc.add_entry("advtrains_wagons", itemname, {
- name = string.split(itemdef.description, "\n", true)[1],
- data = table.concat(fstext),
- })
- end
- for k in pairs(advtrains.wagon_prototypes) do
- doc_register_wagon(k)
- end
|