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:
@@ -2024,9 +2024,20 @@ impl EventsWorker {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 6) Charakter löschen
|
// 6) Charakter löschen
|
||||||
conn.prepare("delete_character", QUERY_DELETE_CHARACTER)?;
|
conn.prepare("delete_character", QUERY_DELETE_CHARACTER)?;
|
||||||
conn.execute("delete_character", &[&character_id])?;
|
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(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2113,19 +2124,17 @@ impl EventsWorker {
|
|||||||
.and_then(|v| v.parse::<i32>().ok())
|
.and_then(|v| v.parse::<i32>().ok())
|
||||||
.unwrap_or(0);
|
.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 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 {
|
// Sachwerte und Schulden bleiben beim Nutzer. Um die Erbquote als
|
||||||
total_assets
|
// Nettovermögen zu erreichen, werden Schulden beim Bargeld addiert.
|
||||||
} else {
|
let new_money = heir_share - (houses + settlements + inventory) + debt;
|
||||||
total_assets * 0.8
|
// Mindestens genug Startkapital für eine Produktion, aber keine pauschale
|
||||||
};
|
// hohe Mindest-Erbschaft bei vielen Geschwistern.
|
||||||
|
let final_money = if new_money <= 100.0 {
|
||||||
let new_money = heir_share - (houses + settlements + inventory + debt);
|
100.0
|
||||||
let final_money = if new_money <= 1000.0 {
|
|
||||||
1000.0
|
|
||||||
} else {
|
} else {
|
||||||
new_money
|
new_money
|
||||||
};
|
};
|
||||||
@@ -2141,13 +2150,6 @@ impl EventsWorker {
|
|||||||
&format!("Erbe für Charakter {}", deceased_character_id),
|
&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!(
|
eprintln!(
|
||||||
"[EventsWorker] Erbe {} übernimmt Vermögen von Charakter {} (User {}): {:.2} (von {:.2} Gesamtvermögen, {} weitere Kinder)",
|
"[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
|
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,
|
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;
|
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#"
|
pub const QUERY_COUNT_CHILDREN_BY_USER: &str = r#"
|
||||||
SELECT COUNT(DISTINCT cr.child_character_id) AS cnt
|
SELECT COUNT(DISTINCT cr.child_character_id) AS cnt
|
||||||
FROM falukant_data.child_relation cr
|
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)?;
|
self.set_heir(character_id)?;
|
||||||
|
|
||||||
let death_event = format!(
|
let death_event = format!(
|
||||||
@@ -937,6 +941,14 @@ impl UserCharacterWorker {
|
|||||||
)?;
|
)?;
|
||||||
conn.execute("delete_character", &[&character_id])?;
|
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(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -965,13 +977,6 @@ impl UserCharacterWorker {
|
|||||||
}
|
}
|
||||||
self.set_new_money(falukant_user_id, new_money)?;
|
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(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1184,18 +1189,16 @@ impl UserCharacterWorker {
|
|||||||
let debt = self.get_credit_debt(falukant_user_id)?;
|
let debt = self.get_credit_debt(falukant_user_id)?;
|
||||||
|
|
||||||
let total_assets = cash + houses + settlements + inventory - debt;
|
let total_assets = cash + houses + settlements + inventory - debt;
|
||||||
let child_count = self.get_child_count(falukant_user_id)?;
|
// Das Erbe wird gleichmäßig auf alle Kinder einschließlich des Erben verteilt.
|
||||||
let single = child_count <= 1;
|
// Der Spieler übernimmt die vorhandenen Sachwerte und Schulden; deshalb muss
|
||||||
|
// das verbleibende Bargeld die Netto-Position ausgleichen (Schulden addieren).
|
||||||
let heir_share = if single {
|
let child_count = self.get_child_count(falukant_user_id)?.max(1);
|
||||||
total_assets
|
let heir_share = total_assets / f64::from(child_count);
|
||||||
} else {
|
let net = heir_share - (houses + settlements + inventory) + debt;
|
||||||
total_assets * 0.8
|
// 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 {
|
||||||
let net = heir_share - (houses + settlements + inventory + debt);
|
Ok(100.0)
|
||||||
if net <= 1000.0 {
|
|
||||||
Ok(1000.0)
|
|
||||||
} else {
|
} else {
|
||||||
Ok(net)
|
Ok(net)
|
||||||
}
|
}
|
||||||
@@ -1258,4 +1261,3 @@ impl Worker for UserCharacterWorker {
|
|||||||
self.base.start_watchdog();
|
self.base.start_watchdog();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user