Item breaking now happens for players too. Bandit adventured tweaked a bit. Rune of destruction added. Can be put anywhere only affective on weapons.

This commit is contained in:
Storm Dragon
2026-02-04 20:07:32 -05:00
parent 78a6156656
commit c6db6d49de
18 changed files with 488 additions and 69 deletions

View File

@@ -12,6 +12,14 @@ bool is_daytime = true;
bool sun_setting_warned = false;
bool sunrise_warned = false;
int playerItemBreakChance = PLAYER_ITEM_BREAK_CHANCE_MIN;
int playerItemBreaksToday = 0;
bool playerItemBreakPending = false;
int playerItemBreakPendingType = -1;
string playerItemBreakMessage = "";
int playerItemBreakSoundHandle = -1;
bool playerItemBreakSoundPending = false;
// Crossfade state
bool crossfade_active = false;
bool crossfade_to_night = false; // true = fading to night, false = fading to day
@@ -53,9 +61,95 @@ void init_time() {
invasion_roll_done_today = false;
invasion_scheduled_hour = -1;
invasion_enemy_type = "bandit";
reset_player_item_break_state();
update_ambience(true); // Force start
}
void reset_player_item_break_audio_state() {
playerItemBreakMessage = "";
playerItemBreakSoundHandle = -1;
playerItemBreakSoundPending = false;
}
void reset_player_item_break_state() {
playerItemBreakChance = PLAYER_ITEM_BREAK_CHANCE_MIN;
playerItemBreaksToday = 0;
playerItemBreakPending = false;
playerItemBreakPendingType = -1;
reset_player_item_break_audio_state();
}
void queue_player_item_break_message(const string&in message) {
if (message.length() == 0) return;
playerItemBreakMessage = message;
playerItemBreakSoundHandle = p.play_stationary("sounds/items/item_breaks.ogg", false);
playerItemBreakSoundPending = true;
}
void update_player_item_break_message() {
if (!playerItemBreakSoundPending) return;
if (playerItemBreakSoundHandle != -1 && p.sound_is_active(playerItemBreakSoundHandle)) {
return;
}
playerItemBreakSoundHandle = -1;
playerItemBreakSoundPending = false;
if (playerItemBreakMessage.length() > 0) {
speak_with_history(playerItemBreakMessage, true);
playerItemBreakMessage = "";
}
}
void resolve_pending_player_item_break() {
if (!playerItemBreakPending) return;
if (x > BASE_END) return;
if (playerItemBreakPendingType == -1) {
playerItemBreakPending = false;
return;
}
if (remove_breakable_personal_item(playerItemBreakPendingType)) {
cleanup_equipment_after_inventory_change();
string itemName = get_breakable_item_name(playerItemBreakPendingType);
queue_player_item_break_message(itemName + " is worn out so you discard it.");
}
playerItemBreakPending = false;
playerItemBreakPendingType = -1;
}
void attempt_player_item_break_check() {
if (playerItemBreakPending) return;
if (playerItemBreaksToday >= PLAYER_ITEM_BREAKS_PER_DAY) return;
int[] breakableItems;
get_breakable_personal_item_types(breakableItems);
if (breakableItems.length() == 0) return;
int roll = random(1, 100);
if (roll <= playerItemBreakChance) {
int pickIndex = random(0, int(breakableItems.length()) - 1);
int itemType = breakableItems[pickIndex];
playerItemBreakChance = PLAYER_ITEM_BREAK_CHANCE_MIN;
playerItemBreaksToday++;
if (x <= BASE_END) {
if (remove_breakable_personal_item(itemType)) {
cleanup_equipment_after_inventory_change();
string itemName = get_breakable_item_name(itemType);
queue_player_item_break_message(itemName + " is worn out so you discard it.");
}
} else {
playerItemBreakPending = true;
playerItemBreakPendingType = itemType;
}
} else {
if (playerItemBreakChance < PLAYER_ITEM_BREAK_CHANCE_MAX) {
playerItemBreakChance += PLAYER_ITEM_BREAK_CHANCE_INCREMENT;
}
if (playerItemBreakChance > PLAYER_ITEM_BREAK_CHANCE_MAX) {
playerItemBreakChance = PLAYER_ITEM_BREAK_CHANCE_MAX;
}
}
}
string get_invasion_enemy_type_for_terrain(const string&in terrain_type) {
for (uint i = 0; i < invasion_terrain_enemy_map.length(); i++) {
string entry = invasion_terrain_enemy_map[i];
@@ -452,6 +546,9 @@ bool should_attempt_resident_foraging(int hour) {
}
void update_time() {
update_player_item_break_message();
resolve_pending_player_item_break();
if (hour_timer.elapsed >= MS_PER_HOUR) {
hour_timer.restart();
current_hour++;
@@ -464,6 +561,7 @@ void update_time() {
invasion_roll_done_today = false;
invasion_scheduled_hour = -1;
quest_roll_done_today = false;
playerItemBreaksToday = 0;
}
// Residents consume food every 8 hours (at midnight, 8am, 4pm)
@@ -530,6 +628,7 @@ void update_time() {
}
attempt_daily_invasion();
keep_base_fires_fed();
attempt_player_item_break_check();
update_incense_burning();
attempt_hourly_flying_creature_spawn();
attempt_hourly_boar_spawn();