diff --git a/src/worker/events.rs b/src/worker/events.rs index d217e30..3bddafd 100755 --- a/src/worker/events.rs +++ b/src/worker/events.rs @@ -2024,9 +2024,20 @@ impl EventsWorker { } // 6) Charakter löschen - conn.prepare("delete_character", QUERY_DELETE_CHARACTER)?; + 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::().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, now: Instant, interval: Duration) Some(last_time) => now.saturating_duration_since(last_time) >= interval, } } - diff --git a/src/worker/sql.rs b/src/worker/sql.rs index 879d192..816c8fa 100755 --- a/src/worker/sql.rs +++ b/src/worker/sql.rs @@ -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 diff --git a/src/worker/user_character.rs b/src/worker/user_character.rs index 2e026ab..c194554 100755 --- a/src/worker/user_character.rs +++ b/src/worker/user_character.rs @@ -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(); } } -