Verbessere die Erbverteilung und aktualisiere den Status nach Charakterlöschung
All checks were successful
Deploy yourpart (blue-green) / deploy (push) Successful in 3m33s
All checks were successful
Deploy yourpart (blue-green) / deploy (push) Successful in 3m33s
This commit is contained in:
@@ -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,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user