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:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user