Verbessere die Erbverteilung und aktualisiere den Status nach Charakterlöschung
All checks were successful
Deploy yourpart (blue-green) / deploy (push) Successful in 3m33s

This commit is contained in:
Torsten Schulz (local)
2026-08-31 13:27:20 +02:00
parent 1bd6cbfe1b
commit d7318564e0
3 changed files with 45 additions and 41 deletions

View File

@@ -2027,6 +2027,17 @@ impl EventsWorker {
conn.prepare("delete_character", QUERY_DELETE_CHARACTER)?;
conn.execute("delete_character", &[&character_id])?;
// Der Client darf den Nachfolger erst sehen, wenn auch die alten
// Eltern-Kind-Beziehungen entfernt sind; sonst kann ein Geschwisterkind als
// offene Taufe des neuen Charakters erscheinen.
if let Some(falukant_user_id) = user_id {
let status = format!(
r#"{{"event":"falukantUpdateStatus","user_id":{}}}"#,
falukant_user_id
);
broker.publish(status);
}
Ok(())
}
@@ -2113,19 +2124,17 @@ impl EventsWorker {
.and_then(|v| v.parse::<i32>().ok())
.unwrap_or(0);
// Berechne das neue Vermögen (analog zu UserCharacterWorker::calculate_new_money)
// Das Erbe wird gleichmäßig auf Erben und alle Geschwister verteilt.
let total_assets = cash + houses + settlements + inventory - debt;
let single = child_count <= 0; // Nur der Erbe bleibt
let heir_share = total_assets / f64::from(child_count + 1);
let heir_share = if single {
total_assets
} else {
total_assets * 0.8
};
let new_money = heir_share - (houses + settlements + inventory + debt);
let final_money = if new_money <= 1000.0 {
1000.0
// Sachwerte und Schulden bleiben beim Nutzer. Um die Erbquote als
// Nettovermögen zu erreichen, werden Schulden beim Bargeld addiert.
let new_money = heir_share - (houses + settlements + inventory) + debt;
// Mindestens genug Startkapital für eine Produktion, aber keine pauschale
// hohe Mindest-Erbschaft bei vielen Geschwistern.
let final_money = if new_money <= 100.0 {
100.0
} else {
new_money
};
@@ -2141,13 +2150,6 @@ impl EventsWorker {
&format!("Erbe für Charakter {}", deceased_character_id),
)?;
// Expliziter Status-Refresh für die UI nach Erbwechsel.
let status = format!(
r#"{{"event":"falukantUpdateStatus","user_id":{}}}"#,
falukant_user_id
);
broker.publish(status);
eprintln!(
"[EventsWorker] Erbe {} übernimmt Vermögen von Charakter {} (User {}): {:.2} (von {:.2} Gesamtvermögen, {} weitere Kinder)",
heir_id, deceased_character_id, falukant_user_id, final_money, total_assets, child_count
@@ -2660,4 +2662,3 @@ fn should_run_interval(last: Option<Instant>, now: Instant, interval: Duration)
Some(last_time) => now.saturating_duration_since(last_time) >= interval,
}
}

View File

@@ -1036,7 +1036,8 @@ pub const QUERY_COUNT_CHILDREN: &str = r#"
SELECT COUNT(*) AS cnt FROM falukant_data.child_relation WHERE (father_character_id = $1 OR mother_character_id = $1) AND child_character_id != $2;
"#;
/// Zählt Kinder eines Users (über alle Charaktere des Users als Elternteil). Ein Parameter: user_id.
/// Zählt Kinder eines Users (über alle Charaktere des Users als Elternteil). Der Erbe ist
/// eingeschlossen; die Anzahl ist damit der Divisor für die gleichmäßige Erbquote.
pub const QUERY_COUNT_CHILDREN_BY_USER: &str = r#"
SELECT COUNT(DISTINCT cr.child_character_id) AS cnt
FROM falukant_data.child_relation cr

View File

@@ -828,6 +828,10 @@ impl UserCharacterWorker {
}
};
// Den Refresh erst nach dem vollständigen Cleanup senden. Andernfalls kann die
// UI zwischen Erbwechsel und dem Entfernen der Eltern-Kind-Beziehungen noch
// Geschwister des Erben als eigene Kinder (z. B. zur Taufe) sehen.
let succession_user_id = self.get_falukant_user_id(character_id)?;
self.set_heir(character_id)?;
let death_event = format!(
@@ -937,6 +941,14 @@ impl UserCharacterWorker {
)?;
conn.execute("delete_character", &[&character_id])?;
if succession_user_id >= 0 {
let update_status = format!(
r#"{{"event":"falukantUpdateStatus","user_id":{}}}"#,
succession_user_id
);
self.base.broker.publish(update_status);
}
Ok(())
}
@@ -965,13 +977,6 @@ impl UserCharacterWorker {
}
self.set_new_money(falukant_user_id, new_money)?;
// Nach Erbwechsel den Status sicher neu laden lassen.
let update_status = format!(
r#"{{"event":"falukantUpdateStatus","user_id":{}}}"#,
falukant_user_id
);
self.base.broker.publish(update_status);
Ok(())
}
@@ -1184,18 +1189,16 @@ impl UserCharacterWorker {
let debt = self.get_credit_debt(falukant_user_id)?;
let total_assets = cash + houses + settlements + inventory - debt;
let child_count = self.get_child_count(falukant_user_id)?;
let single = child_count <= 1;
let heir_share = if single {
total_assets
} else {
total_assets * 0.8
};
let net = heir_share - (houses + settlements + inventory + debt);
if net <= 1000.0 {
Ok(1000.0)
// Das Erbe wird gleichmäßig auf alle Kinder einschließlich des Erben verteilt.
// Der Spieler übernimmt die vorhandenen Sachwerte und Schulden; deshalb muss
// das verbleibende Bargeld die Netto-Position ausgleichen (Schulden addieren).
let child_count = self.get_child_count(falukant_user_id)?.max(1);
let heir_share = total_assets / f64::from(child_count);
let net = heir_share - (houses + settlements + inventory) + debt;
// Ein Erbe braucht mindestens Startkapital für eine Produktion, soll aber
// bei vielen Geschwistern nicht durch eine zu hohe Untergrenze profitieren.
if net <= 100.0 {
Ok(100.0)
} else {
Ok(net)
}
@@ -1258,4 +1261,3 @@ impl Worker for UserCharacterWorker {
self.base.start_watchdog();
}
}