Yeah tristates are mostly used for implementing buses without a predefined directionality.
Since a lot of older CPUs share and reuse as much internal resources as possible means that the buses inside can actually be quite spread out. One of these internal buses might have the capability to be driven from the external data bus, from any of the CPU registers, from the ALU output, from program counter...etc so this sort of architecture of every possible "bus master" simply having a tristate buffer driving the bus lines is convenient to implement on hardware and makes it easy to add extra masters by simply connecting them onto the same bus lines.
If you implement the bus as a ORed together MUX you need to get a wider set of OR gates every time you want to add a mus master. Works fine, its just messy looking as a big pile of buses converges onto the mountain of OR gates. But it is the way buses are done inside FPGAs since they also typically don't have any internal tristate capability. For the same reason RAM in FPGAs always has 2 data buses, one for write, one for read, since that removes the need for tristate, but makes the bus twice as wide.
But for the case of your simulator i can see how not having tristate makes things a lot simpler since an input can only be driven by a single output, making the wire connection a simple object pointer for "check your logic state here"