← Back to Devlog

DeadRoute Devlog: Reputation Failure and Driver Stress

A pre-alpha systems update focused on making reputation and driver stress push back harder on the player.

DeadRouteDevlogActive Development

Note: DeadRoute is still a working title.

I’ve been working more on DeadRoute, and this update is mostly about making the game push back on the player a little more.

Up until now, the core loop was working pretty well. Jobs generate, you pick one, choose a route, watch the truck move through the map, deal with incidents, and try to finish the shift.

That was all cool, but one problem became pretty obvious while testing: it was still too easy to stay safe.

Driver stress would go up, but it was pretty easy to bring back down. Company reputation would take small hits, but it usually stayed above 90 without much effort. So even though the game had risk systems, they didn’t really feel dangerous yet.

This pass is the start of fixing that.

Reputation Can Actually End the Shift Now

The first big change is that company reputation can now fail the shift.

Before this, reputation was mostly just a number on the status panel. It could go up and down, but nothing major happened if it got low. Now, if reputation hits zero, the shift ends early and the end-of-shift report treats it as a failed shift.

The basic setup is simple:

var shift_failed: bool = false
var shift_failure_reason_key: String = ""

When reputation changes, the game checks if it has collapsed:

func _change_company_reputation(amount: int) -> void:
    if shift_has_ended:
        return

    company_reputation += amount
    company_reputation = clamp(company_reputation, 0, 100)

    _check_stat_warnings()
    _refresh_status_panel()

    if company_reputation <= 0:
        _fail_shift("SHIFT_FAILED_REPUTATION")

I like this because it plugs into the shift system that already exists. I don’t need a whole separate game-over screen yet. The game just ends the shift, shows the report, and gives you the bad result.

That feels good enough for pre-alpha, and it keeps things simple.

Bad Reputation Means Worse Work

I also started making reputation affect the jobs themselves.

If reputation gets low, fewer jobs show up. If it gets really low, you only get one job option.

var effective_max_jobs: int = max_visible_jobs

if company_reputation <= 25:
    effective_max_jobs = 1
elif company_reputation <= 50:
    effective_max_jobs = 2

Pay also gets worse when reputation drops:

if company_reputation <= 25:
    total_pay = int(total_pay * 0.70)
elif company_reputation <= 50:
    total_pay = int(total_pay * 0.85)

This should make reputation feel more connected to the actual game loop. If you keep making bad calls, you don’t just lose points on a meter. The company starts getting worse contracts, fewer options, and less room to recover.

That is the kind of downward spiral I want in the game, as long as it does not become unfair.

Driver Stress Can Now Cause Refusals

The other big thing is driver stress.

Stress already existed, but it mostly changed event chances and appeared on the UI. Now it can actually affect what the driver does.

The main example is the Keep Moving choice during driver decision prompts.

Normally, Keep Moving is the aggressive option. It gets the delivery moving and avoids reputation loss, but it adds stress and can make the road worse.

Now, if the driver is at critical stress, he might refuse:

if driver_stress >= 90:
    var refusal_roll: int = random.randi_range(1, 100)

    if refusal_roll <= 55:
        message_log.add_message(
            tr("TRUCK_12"),
            tr("MESSAGE_DRIVER_REFUSES_KEEP_MOVING")
        )

        _apply_critical_stress_delay()
        return

So if Manny is already barely holding it together and you tell him to push through anyway, he might just stop.

I like this direction a lot because it makes the driver feel less like a vehicle marker and more like a person you are trying to manage.

Critical Stress Can Create Delays

High stress can also cause problems even without the player picking Keep Moving.

If stress stays extremely high while the truck is moving, the game starts checking for forced stops. Basically, the driver can panic, hesitate, or stop unexpectedly.

if driver_stress < 95:
    critical_stress_timer = 0.0
    return

If the timer runs long enough, there is a chance of a forced delay:

if roll <= 45:
    message_log.add_message(
        tr("TRUCK_12"),
        tr("MESSAGE_DRIVER_FORCED_STOP")
    )

    _apply_critical_stress_delay()

Right now the effect is pretty simple. The truck slows way down for a few seconds:

dispatch_map.apply_temporary_speed_modifier(0.15, 5.0)

It is not a full stop forever, and it is not a huge complicated system yet. It just gives the feeling that the situation is starting to fall apart.

Safer Choices Matter More

Because of this, the safer dispatch choices matter more now.

Stop and Wait hurts reputation, but it reduces stress more if the driver is already close to breaking:

var stress_recovery: int = -6

if driver_stress >= 90:
    stress_recovery = -12
elif driver_stress >= 70:
    stress_recovery = -9

So the choice is starting to become more interesting.

Do you protect the schedule and risk the driver?

Or do you protect the driver and risk the company?

That is probably the main tension I want the game to have.

Where the Game Is At

The prototype has a lot more connected now than it did a few milestones ago:

  • Dynamic job generation
  • Route choice
  • Multi-leg routes
  • Road risk
  • Road conditions getting worse
  • Random incidents
  • Driver stress
  • Company reputation
  • Decision prompts
  • Shift timer
  • End-of-shift report
  • Early shift failure if reputation collapses

There is still a lot to clean up and tune, but the game is starting to feel more like the thing I wanted: a weird little horror dispatch game where the systems slowly stack against you.

The next thing I’ll probably focus on is tuning. Stress and reputation need to land in the right place. I want a normal shift to feel manageable, a bad shift to feel tense, and a disaster shift to spiral hard.

I also want to eventually add mid-route rerouting, especially when roads close or the driver refuses to continue, but I’m trying not to build that too early.