News:

The Forum Rules and Guidelines
Our forum has Rules and Guidelines. Please, be kind and read them ;).

Recent posts

#1
Patches & Projects / Re: Options in depots to only ...
Last post by Nazalassa - Today at 10:10:09 AM
Here's a small patch that adds the possibility for textinputs to display placeholder text when nothing has been typed yet, and uses it for searchable comboboxes. In my opinion it is better than showing the current selection until a search query is typed, because it tells the user they can search the combobox. (Otherwise, there is no easy way to discover it.)

For comboboxes where searchability makes little sense, the patch also makes searchability optional. It only enabledsit for the two large ones in the depot window.

placeholder-text.png
#2
Simutrans Tutorial / Simutrans Tutorial 2.0.07 Rele...
Last post by Andarix - Today at 09:35:21 AM
Please review this version.

Also, please review and read the texts. The texts are linked below.



  • extract to simutrans/[pak|pak64.german|pak128]/scenario/
  • start simutrans (Simutrans r11881+ required)
  • open load scenario
  • select scenario tutorial_multipak


Please not click button Tutorial.


translate page
Important: Do not change the text within { } or these brackets.

Download Nightly
Simutrans Git Nightlys
Andarix Nightlys
#3
It's an understandable thought. I've wished for well over 20 years that Simutrans could be played more like SimCity. :) Although in those 20+ years, sometimes something gets added. You can actually build individual buildings now, although it's not the same as zoning for Res/Com/Ind and wathing the cities grow. But I will often play in -freeplay mode and use it as a sort of virtual railroad layout, and my goal is to make fun freeways, but also to transport as many goods/passengers as I can (regardless of profit). heh.

And although programmers are volunteers and there's rarely much time to work on requests that don't have broad appeal (especially to those doing the programming), again sometimes things get put in that are useful - like one-way signs for roads. When those got added, we could make two-tile-wide freeways. And things like elevated ways made freeway junctions much more flexible.

So while something radical like playing as someone visible walking around might not ever happen, there is a small chance that if you come up with good ideas, someone might want to implement them. THAT said...... there's usually not a shortage of ideas; rather, a shortage of time/energy to implement them. So it's a balance of expectations. lol. "Probably not, but you never know". :)
#4
Extension Requests / Re: pipette tool update reques...
Last post by poppo - Yesterday at 05:30:33 AM
// create tool for object under the cursor
const char *tool_pipette_t::work(player_t *pl, koord3d pos)
{
    static cbuffer_t param_str;

    const grund_t *gr = welt->lookup(pos);
    if (!gr) {
        return NULL;
    }

    select_and_check(tunnel_t)
    select_and_check(bruecke_t)

    if (!gr->get_weg_nr(0)||!is_ctrl_pressed()) {
        if (gebaeude_t* gb = gr->find<gebaeude_t>()) {
            if (const char *err = allow_tool_check(gb, gb->get_tile()->get_desc(), pl)) {
                return err;
            }
            const building_desc_t* desc = gb->get_tile()->get_desc();
            if (!pl->is_public_service()) {
                // since we are not allowed to create public infrastructure as normal player, we must forbid this too
                if (desc->is_city_building()  ||  desc->is_attraction()  ||  desc->is_townhall()  ||  desc->is_monument()) {
                    return "Not allowed to copy object.";
                }
            }
            else {
                if (desc->is_depot()  ||  desc->is_headquarters()  ||  desc->is_townhall()) {
                    return "Not allowed to copy object.";
                }
            }
            // here on factories, monuments, town halls, city buildings and more
            if (gb->get_fabrik()) {
                static tool_build_factory_t t = tool_build_factory_t();
                param_str.clear();
                param_str.printf("%i%i%i,%s",
                    1, // with climate
                    gb->get_tile()->get_layout(), /*rotation*/
                    gb->get_fabrik()->get_base_production(),
                    gb->get_fabrik()->get_desc()->get_name());
                t.set_default_param(param_str);
                t.cursor = tool_t::general_tool[TOOL_BUILD_FACTORY]->cursor;
                welt->set_tool(&t, pl);
                return NULL;
            }
            else if (desc->is_attraction()  ||  desc->is_city_building()) {
                static tool_build_house_t t = tool_build_house_t();
                t.cursor = tool_t::general_tool[TOOL_BUILD_HOUSE]->cursor;
                param_str.clear();
                param_str.printf("0%d%s",
                    gb->get_tile()->get_layout(), /*rotation*/
                    gb->get_tile()->get_desc()->get_name());
                t.set_default_param(param_str);
                welt->set_tool(&t, pl);
                return NULL;
            }
            else if (tool_t* t = gb->get_tile()->get_desc()->get_builder()) {
                welt->set_tool(t, pl);
                return NULL;
            }
            return "Not allowed to copy object.";
        }
    }

    if (!is_ctrl_pressed()) {
        // we do not check depot if ctrl pressed(ctrl -> get way info directly)
        if (depot_t *depot=gr->get_depot()) {
            if (pl->is_public_service()) {
                return "Not allowed to copy object.";
            }
            tool_t* t = depot->get_tile()->get_desc()->get_builder();
            welt->set_tool(t, pl);
            return NULL;
        }
    }

    if (gr->get_weg_nr(1)&&is_shift_pressed()) {
        // we check weg_nr(1) only when shift pressed
        if(!is_ctrl_pressed()) {
            // signals > wayobjs > ways
            // if ctrl pressed, we only see way.
            select_and_check(signal_t);
            select_and_check(roadsign_t);
            if(gr->get_wayobj(gr->get_weg_nr(1)->get_waytype())){
                  if(tool_t *wayobj_builder = gr->get_wayobj(gr->get_weg_nr(1)->get_waytype())->get_desc()->get_builder()) {
                    if (const char* err = allow_tool_check(gr->get_wayobj(gr->get_weg_nr(1)->get_waytype()), gr->get_wayobj(gr->get_weg_nr(1)->get_waytype())->get_desc(), pl)) {
                        return err;
                    }
                    welt->set_tool(wayobj_builder, pl);
                    return NULL;
                }
            }
        }
        if (tool_t *way_builder = gr->get_weg_nr(1)->get_desc()->get_builder()) {
            if (const char* err = allow_tool_check(gr->get_weg_nr(1), gr->get_weg_nr(1)->get_desc(), pl)) {
                return err;
            }
            welt->set_tool(way_builder, pl);
            return NULL;
        }
        return "Not allowed to copy object.";
        // here on rivers and city roads
    }

    if (gr->get_weg_nr(0)) {
        if(!is_ctrl_pressed()) {
            // signals > wayobjs > ways
            // if ctrl pressed, we only see way.
            select_and_check(signal_t);
            select_and_check(roadsign_t);
            select_and_check(wayobj_t);
        }
        if (tool_t *way_builder = gr->get_weg_nr(0)->get_desc()->get_builder()) {
            if (const char* err = allow_tool_check(gr->get_weg_nr(0), gr->get_weg_nr(0)->get_desc(), pl)) {
                return err;
            }
            welt->set_tool(way_builder, pl);
            return NULL;
        }
        return "Not allowed to copy object.";
        // here on rivers and city roads
    }

    select_and_check(leitung_t);
    if (gr->find<senke_t>()  ||  gr->find<pumpe_t>()) {
        // missing: check for ownership
        welt->set_tool(tool_t::general_tool[TOOL_TRANSFORMER], pl);
        return NULL;
    }

    if (baum_t* b = gr->find<baum_t>()) {
        static tool_plant_tree_t t;
        param_str.clear();
        param_str.printf("%i%i,%s", 1, 0, b->get_desc()->get_name());
        t.set_default_param(param_str);
        t.cursor = tool_t::general_tool[TOOL_PLANT_TREE]->cursor;
        welt->set_tool(&t, pl);
        return NULL;
    }

    if (groundobj_t* b = gr->find<groundobj_t>()) {
        if (pl->is_public_service()) {
            static tool_plant_groundobj_t t;
            param_str.clear();
            param_str.printf("%i%i,%s", 1, 0, b->get_desc()->get_name());
            t.set_default_param(param_str);
            t.cursor = tool_t::general_tool[TOOL_PLANT_GROUNDOBJ]->cursor;
            welt->set_tool(&t, pl);
            return NULL;
        }
    }

    return gr->obj_count()>0 ? "Not allowed to copy object." : NULL;
}
#5
Simutrans Gaming Discussion / Re: About single person simula...
Last post by Aureus - Yesterday at 02:52:06 AM
I think this is one of my immature thought. I'm not a programmer, I know even if someone furfil this thought would require a lot of work. I don't really know what would those "pedestrians" do, which allow players have enough energy to play another totally different types of simulation. That would be a brand new game.
#6
Translation and Help Texts / Re: About pak choosing interfa...
Last post by makie - February 24, 2026, 05:30:35 PM
Quote from: Aureus on February 24, 2026, 06:04:22 AMBut I found no text for pak choosing interface or Settings
It is not possible to show translated texts in the "pak choosing interface"because it is no language selected at this state of the program.
#7
Simutrans-Extended paksets / Trying to compile pak192.comic...
Last post by cousjath - February 24, 2026, 05:27:20 PM
I've been trying to compile the pak192.comic (from https://github.com/Flemmbrav/Pak192.Comic/tree/extended) using the makeobj-extended from the nightly builds but when I try to run the result in simutrans-extended I get following output:

Parsed simuconf.tab for directory layout; multiuser = 1
Pak found: pak192.comic-extended/
FATAL ERROR: obj_reader_t::resolve_xrefs() - cannot resolve 'GOOD-deceased'
Aborting program execution ...

For help with this error or to file a bug report please see the Simutrans forum at
https://forum.simutrans.com
Aborted (core dumped)
#8
Randomness Lounge / Re: A pity we don't have rever...
Last post by Octavius - February 24, 2026, 02:49:48 PM
Essentially a back-feeding turning heptagram. I'm not aware of any in real life, but turning pentagrams do exist. There's one in Carbonia (Sardegna, Italy; no longer used) and in Mals (Trentino, Italy). Triangles a.k.a. wyes are more common. I expect this heptagram will be even more compact than a pentagram, but there comes a point where a turntable is the cheaper solution.

In this case the train alternates between doing 45 degree turns, bypassing the exact centre, and straights, going through the exact centre, giving a very complex centrepiece. But if 45 degree turns are acceptable, better make that 36 degree symmetrical turns and turn (!) it into an ordinary turning pentagram.
#9
Translation and Help Texts / Re: About pak choosing interfa...
Last post by prissi - February 24, 2026, 12:44:40 PM
There is a website, Simutranslator https://translator.simutrans.com/

Even without a login, one can submit suggestions there. But check your PM; I have added an account for you,
#10
Simutrans Gaming Discussion / Re: About single person simula...
Last post by Isaac Eiland-Hall - February 24, 2026, 09:49:56 AM
What would you envision the role of this theoretical single person player? What would they do in the game?

Also, thank you for the message in the "POST HERE" forum - I'm sure it's a strange way to gain access to the forum, but it does make sure that spammers that post spam never have their posts be publicly seen, only by the mods here :)