diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index ad731f6a509..b626942d063 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -49,6 +49,7 @@ var/global/list/all_cults = list() var/list/objectives = list() var/eldergod = 1 //for the summon god objective + var/demons_summoned = 0 var/acolytes_needed = 4 //for the survive objective - base number of acolytes, increased by 1 for every 10 players var/const/min_cultists_to_start = 3 @@ -231,6 +232,9 @@ var/global/list/all_cults = list() cult_fail += check_survive() //the proc returns 1 if there are not enough cultists on the shuttle, 0 otherwise if(objectives.Find("eldergod")) cult_fail += eldergod //1 by default, 0 if the elder god has been summoned at least once + if(objectives.Find("slaughter")) + if(!demons_summoned) + cult_fail++ if(objectives.Find("sacrifice")) if(sacrifice_target && !(sacrifice_target in sacrificed)) //if the target has been sacrificed, ignore this step. otherwise, add 1 to cult_fail cult_fail++ @@ -308,6 +312,13 @@ var/global/list/all_cults = list() else explanation = "Summon [ticker.mode.cultdat.entity_name]. Fail." feedback_add_details("cult_objective","cult_narsie|FAIL") + if("slaughter") + if(demons_summoned) + explanation = "Bring the Slaughter. Success!" + feedback_add_details("cult_objective","cult_demons|SUCCESS") + else + explanation = "Bring the Slaughter. Fail." + feedback_add_details("cult_objective","cult_demons|FAIL") if("convert")//convert half the crew if(obj_count < objectives.len) diff --git a/code/game/gamemodes/cult/cult_comms.dm b/code/game/gamemodes/cult/cult_comms.dm index 57f4934c9b7..8e6d903729e 100644 --- a/code/game/gamemodes/cult/cult_comms.dm +++ b/code/game/gamemodes/cult/cult_comms.dm @@ -32,7 +32,11 @@ user.say(message) else user.whisper(message) - var/my_message = "[(ishuman(user) ? "Acolyte" : "Construct")] [user]: [message]" + var/my_message + if(istype(user, /mob/living/simple_animal/slaughter/cult)) //Harbringers of the Slaughter + my_message = "Harbringer of the Slaughter: [message]" + else + my_message = "[(ishuman(user) ? "Acolyte" : "Construct")] [user]: [message]" for(var/mob/M in mob_list) if(iscultist(M)) to_chat(M, my_message) diff --git a/code/game/gamemodes/cult/cult_objectives.dm b/code/game/gamemodes/cult/cult_objectives.dm index 1c5def6e13e..f1badacb5b9 100644 --- a/code/game/gamemodes/cult/cult_objectives.dm +++ b/code/game/gamemodes/cult/cult_objectives.dm @@ -94,10 +94,15 @@ /datum/game_mode/cult/proc/second_phase() narsie_condition_cleared = 1 + var/explanation - objectives += "eldergod" + if(prob(50))//split the chance of this + objectives += "eldergod" + explanation = "Summon [ticker.mode.cultdat.entity_name] on the Station via the use of the Tear Reality rune." + else + objectives += "slaughter" + explanation = "Bring the Slaughter via the rune 'Tear Reality'." - var/explanation = "Summon [ticker.mode.cultdat.entity_name] on the Station via the use of the Tear Reality rune." for(var/datum/mind/cult_mind in cult) to_chat(cult_mind.current, "You and your acolytes have succeeded in preparing the station for the ultimate ritual!") to_chat(cult_mind.current, "Objective #[current_objective]: [explanation]") @@ -156,8 +161,8 @@ sacrifice_target = pick(possible_targets) possible_objectives |= "sacrifice" else - message_admins("Didn't find a suitable sacrifice target...what the hell? Shout at Deity.") - log_admin("Didn't find a suitable sacrifice target...what the hell? Shout at Deity.") + message_admins("Didn't find a suitable sacrifice target...what the hell? Shout at a coder.") + log_admin("Didn't find a suitable sacrifice target...what the hell? Shout at a coder.") if(!mass_convert) var/living_crew = 0 @@ -186,7 +191,12 @@ if(!possible_objectives.len)//No more possible objectives, time to summon Nar-Sie message_admins("No suitable objectives left! Nar-Sie objective unlocked.") log_admin("No suitable objectives left! Nar-Sie objective unlocked.") - return "eldergod" + var/lastbit + if(prob(50)) + lastbit = "eldergod" + else + lastbit = "slaughter" + return lastbit else return pick(possible_objectives) diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm index 7292568930d..7a47d332634 100644 --- a/code/game/gamemodes/cult/cult_structures.dm +++ b/code/game/gamemodes/cult/cult_structures.dm @@ -5,7 +5,25 @@ icon = 'icons/obj/cult.dmi' var/cooldowntime = 0 var/health = 100 - var/maxhealth = 100 + var/death_message = "The structure falls apart." //The message shown when the structure is destroyed + var/death_sound = 'sound/items/bikehorn.ogg' + + +/obj/structure/cult/proc/destroy_structure() + visible_message(death_message) + playsound(src, death_sound, 50, 1) + qdel(src) + +/obj/structure/cult/attackby(obj/item/I, mob/user, params) + if(I.force) + ..() + playsound(src, I.hitsound, 50, 1) + health = Clamp(health - I.force, 0, initial(health)) + user.changeNext_move(CLICK_CD_MELEE) + if(health <= 0) + destroy_structure() + return + ..() //Noncult As we may have this on maps /obj/structure/cult/talisman @@ -50,6 +68,9 @@ name = "altar" desc = "A bloodstained altar dedicated to Nar-Sie." icon_state = "talismanaltar" + health = 150 //Sturdy + death_message = "The altar breaks into splinters, releasing a cascade of spirits into the air!" + death_sound = 'sound/effects/altar_break.ogg' /obj/structure/cult/culttalisman/attack_hand(mob/living/user) if(!iscultist(user)) @@ -77,7 +98,9 @@ name = "daemon forge" desc = "A forge used in crafting the unholy weapons used by the armies of a cult." icon_state = "forge" - luminosity = 3 + health = 300 //Made of metal + death_message = "The forge falls apart, its lava cooling and winking away!" + death_sound = 'sound/effects/forge_destroy.ogg' /obj/structure/cult/cultforge/attack_hand(mob/living/user) if(!iscultist(user)) @@ -96,17 +119,21 @@ if(pickedtype && Adjacent(user) && src && !qdeleted(src) && !user.incapacitated() && cooldowntime <= world.time) cooldowntime = world.time + 2400 var/obj/item/N = new pickedtype(get_turf(src)) - user << "You work the forge as dark knowledge guides your hands, creating [N]!" + to_chat(user, "You work the forge as dark knowledge guides your hands, creating [N]!") /obj/structure/cult/cultpylon name = "pylon" desc = "A floating crystal that slowly heals those faithful to a cult." icon_state = "pylon" - luminosity = 5 + light_range = 5 + light_color = "#3e0000" var/heal_delay = 50 var/last_shot = 0 var/list/corruption = list() + health = 50 //Very fragile + death_message = "The pylon's crystal vibrates and glows fiercely before violently shattering!" + death_sound = 'sound/effects/pylon_shatter.ogg' /obj/structure/cult/cultpylon/New() processing_objects |= src @@ -147,6 +174,9 @@ name = "archives" desc = "A desk covered in arcane manuscripts and tomes in unknown languages. Looking at the text makes your skin crawl." icon_state = "tomealtar" + health = 125 //Slightly sturdy + death_message = "The desk breaks apart, its books falling to the floor." + death_sound = 'sound/effects/wood_break.ogg' /obj/structure/cult/culttome/attack_hand(mob/living/user) if(!iscultist(user)) diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index 5721ac0bfd3..400ca922f22 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -21,6 +21,16 @@ w_class = 2 var/scribereduct = 0 +/obj/item/weapon/tome/accursed + name = "accursed tome" + desc = "An arcane tome still empowered with a shadow of its former consecration." + scribereduct = 30 //faster because it's made by corrupting a bible + +/obj/item/weapon/tome/imbued //Admin-only tome, allows instant drawing of runes + name = "imbued arcane tome" + desc = "An arcane tome granted by the Geometer itself." + scribereduct = 50 + /obj/item/weapon/tome/examine(mob/user) ..() if(iscultist(user) || user.stat == DEAD) @@ -226,7 +236,7 @@ user.visible_message("[user] cuts open their arm and begins writing in their own blood!", \ "You slice open your arm and begin drawing a sigil of [ticker.mode.cultdat.entity_title3].") user.apply_damage(initial(rune_to_scribe.scribe_damage), BRUTE, pick("l_arm", "r_arm")) - if(!do_after(user, initial(rune_to_scribe.scribe_delay), target = get_turf(user))) + if(!do_after(user, initial(rune_to_scribe.scribe_delay)-scribereduct, target = get_turf(user))) for(var/V in shields) var/obj/machinery/shield/S = V if(S && !qdeleted(S)) diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index 4b7e7ab333e..ed6b8186558 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -61,6 +61,11 @@ To draw a rune, use an arcane tome. qdel(src) return else if(istype(I, /obj/item/weapon/nullrod)) + if(iscultist(user))//cultist..what are doing..cultist..staph... + user.drop_item() + user.visible_message("[I] suddenly glows with white light, forcing [user] to drop it in pain!", \ + "[I] suddenly glows with a white light that sears your hand, forcing you to drop it!") + return user.say("BEGONE FOUL MAGIKS!!") to_chat(user,"You disrupt the magic of [src] with [I].") qdel(src) @@ -496,6 +501,7 @@ var/list/teleport_runes = list() ..() world << 'sound/effects/dimensional_rend.ogg' to_chat(world, "The veil... is... TORN!!!--") + icon_state = "rune_large_distorted" var/turf/T = get_turf(src) sleep(40) new /obj/singularity/narsie/large(T) //Causes Nar-Sie to spawn even if the rune has been removed @@ -516,6 +522,78 @@ var/list/teleport_runes = list() ..() return + + +/obj/effect/rune/slaughter + cultist_name = "Call Forth The Slaughter" + cultist_desc = "Calls forth the doom of a eldrtich being. Three slaughter demons will appear to wreak havoc on the station." + invocation = null + req_cultists = 9 + icon = 'icons/effects/96x96.dmi' + icon_state = "rune_large" + pixel_x = -32 + pixel_y = -32 + + var/used = 0 + +/obj/effect/rune/slaughter/talismanhide() //can't hide this, and you wouldn't want to + return + +/obj/effect/rune/slaughter/invoke(var/list/invokers) + if(used) + return + var/mob/living/user = invokers[1] + if(ticker.mode.name == "cult") + var/datum/game_mode/cult/cult_mode = ticker.mode + if(!("slaughter" in cult_mode.objectives)) + message_admins("[usr.real_name]([user.ckey]) tried to summon demons when the objective was wrong") + for(var/M in invokers) + var/mob/living/L = M + to_chat(L, "\"YOUR SOUL BURNS WITH YOUR ARROGANCE!!!\"") + if(L.reagents) + L.reagents.add_reagent("hell_water", 10) + L.Weaken(7) + L.Stun(7) + fail_invoke() + log_game("Summon Demons rune failed - improper objective") + return + else if(user.z != ZLEVEL_STATION) + message_admins("[user.real_name]([user.ckey]) tried to summon demons off station") + for(var/M in invokers) + var/mob/living/L = M + to_chat(L, "\"YOUR SOUL BURNS WITH YOUR ARROGANCE!!!\"") + if(L.reagents) + L.reagents.add_reagent("hell_water", 10) + L.Weaken(7) + L.Stun(7) + fail_invoke() + log_game("Summon demons rune failed - off station Z level") + return + if(cult_mode.demons_summoned) + for(var/M in invokers) + to_chat(M, "Demons are already on this plane!") + log_game("Summon Demons rune failed - already summoned") + return + //BEGIN THE SLAUGHTER + used = 1 + for(var/mob/living/M in range(1,src)) + if(iscultist(M)) + M.say("TOK-LYR RQA-NAP SHA-NEX!!") + world << 'sound/effects/dimensional_rend.ogg' + to_chat(world, "A hellish cacaphony bombards from all around as something awful tears through the world...") + icon_state = "rune_large_distorted" + sleep(55) + to_chat(world, "\"LIBREATE TE EX INFERIS!\"")//Fethas note:I COULDN'T HELP IT OKAY?! + visible_message("[src] melts away into blood, and three horrific figures emerge from within!") + var/turf/T = get_turf(src) + new /mob/living/simple_animal/slaughter/cult(T) + new /mob/living/simple_animal/slaughter/cult(T, pick(NORTH, EAST, SOUTH, WEST)) + new /mob/living/simple_animal/slaughter/cult(T, pick(NORTHEAST, SOUTHEAST, NORTHWEST, SOUTHWEST)) + cult_mode.demons_summoned = 1 + shuttle_master.emergency.request(null, 0.5,null) + qdel(src) + + //Rite of Resurrection: Requires two corpses. Revives one and gibs the other. /obj/effect/rune/raise_dead cultist_name = "Rite of Resurrection" diff --git a/code/game/gamemodes/miniantags/slaughter/slaughter.dm b/code/game/gamemodes/miniantags/slaughter/slaughter.dm index 6f97740f8d5..6a579793f67 100644 --- a/code/game/gamemodes/miniantags/slaughter/slaughter.dm +++ b/code/game/gamemodes/miniantags/slaughter/slaughter.dm @@ -58,7 +58,7 @@ to_chat(src, src.playstyle_string) to_chat(src, "You are not currently in the same plane of existence as the station. Ctrl+Click a blood pool to manifest.") src << 'sound/misc/demon_dies.ogg' - mind.current.verbs += /mob/living/simple_animal/slaughter/proc/slaughterWhisper + mind.current.verbs += /mob/living/simple_animal/slaughter/verb/slaughterWhisper if(!(vialspawned)) var/datum/objective/slaughter/objective = new var/datum/objective/demonFluff/fluffObjective = new @@ -104,12 +104,77 @@ speed = 0 boost = world.time + 60 + + + +/mob/living/simple_animal/slaughter/cult //Summoned as part of the cult objective "Bring the Slaughter" + name = "harbringer of the slaughter" + real_name = "harbringer of the slaughter" + desc = "An awful creature from beyond the realms of madness." + maxHealth = 500 + health = 500 + melee_damage_upper = 60 + melee_damage_lower = 60 + environment_smash = 3 //Smashes through EVERYTHING - r-walls included + faction = list("cult") + playstyle_string = "You are a Harbringer of the Slaughter. Brought forth by the servants of Nar-Sie, you have a single purpose: slaughter the heretics \ + who do not worship your master. You may use the ability 'Blood Crawl' near a pool of blood to enter it and become incorporeal. Using the ability again near a blood pool will allow you \ + to emerge from it. You are fast, powerful, and almost invincible. By dragging a dead or unconscious body into a blood pool with you, you will consume it after a time and fully regain \ + your health. You may use the Sense Victims in your Cultist tab to locate a random, living heretic." + +/mob/living/simple_animal/slaughter/cult/verb/sense_victims() + set name = "Sense Victims" + set desc = "Locates the nearest heretic for annihilation." + set category = "Cultist" + + var/list/victims = list() + for(var/mob/living/L in living_mob_list) + if(!L.stat && !iscultist(L) && L.key && L != usr) + victims.Add(L) + if(!victims.len) + to_chat(usr, "You could not locate any sapient heretics for the Slaughter.") + return 0 + var/mob/living/victim = pick(victims) + to_chat(victim, "You feel an awful sense of being watched...") + victim.Stun(3) //HUE + var/area/A = victim.loc.loc + if(!A) + to_chat(usr, "You could not locate any sapient heretics for the Slaughter.") + return 0 + to_chat(usr, "You sense a terrified soul at [A]. Show them the error of their ways.") + +/mob/living/simple_animal/slaughter/cult/New() + ..() + spawn(5) + var/list/demon_candidates = get_candidates(ROLE_CULTIST) + if(!demon_candidates.len) + visible_message("[src] disappears in a flash of red light!") + qdel(src) + return 0 + var/client/C = pick(demon_candidates) + var/mob/living/simple_animal/slaughter/cult/S = src + if(!C) + visible_message("[src] disappears in a flash of red light!") + qdel(src) + return 0 + + S.key = C.key + S.mind.assigned_role = "Harbringer of the Slaughter" + S.mind.special_role = "Harbringer of the Slaugther" + to_chat(S, playstyle_string) + ticker.mode.add_cultist(S.mind) + var/datum/objective/new_objective = new /datum/objective + new_objective.owner = S.mind + new_objective.explanation_text = "Bring forth the Slaughter to the nonbelievers." + S.mind.objectives += new_objective + S << "Objective #[1]: [new_objective.explanation_text]" + ////////////////////The Powers //Paradise Port:I added this cuase..SPOOPY DEMON IN YOUR BRAIN -/mob/living/simple_animal/slaughter/proc/slaughterWhisper() +/mob/living/simple_animal/slaughter/verb/slaughterWhisper() set name = "Whisper" set desc = "Whisper to a mortal" set category = "Daemon" diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm index 08e6117e9bd..3ea7614066b 100644 --- a/code/game/gamemodes/wizard/soulstone.dm +++ b/code/game/gamemodes/wizard/soulstone.dm @@ -174,7 +174,7 @@ var/construct_class = alert(U, "Please choose which type of construct you wish to create.",,"Juggernaut","Wraith","Artificer") switch(construct_class) if("Juggernaut") - var/mob/living/simple_animal/construct/armoured/Z = new /mob/living/simple_animal/construct/armoured (get_turf(T.loc)) + var/mob/living/simple_animal/hostile/construct/armoured/Z = new /mob/living/simple_animal/hostile/construct/armoured (get_turf(T.loc)) Z.key = A.key Z.faction |= "\ref[U]" if(iscultist(U)) @@ -190,7 +190,7 @@ qdel(C) if("Wraith") - var/mob/living/simple_animal/construct/wraith/Z = new /mob/living/simple_animal/construct/wraith (get_turf(T.loc)) + var/mob/living/simple_animal/hostile/construct/wraith/Z = new /mob/living/simple_animal/hostile/construct/wraith (get_turf(T.loc)) Z.key = A.key Z.faction |= "\ref[U]" if(iscultist(U)) @@ -206,7 +206,7 @@ qdel(C) if("Artificer") - var/mob/living/simple_animal/construct/builder/Z = new /mob/living/simple_animal/construct/builder (get_turf(T.loc)) + var/mob/living/simple_animal/hostile/construct/builder/Z = new /mob/living/simple_animal/hostile/construct/builder (get_turf(T.loc)) Z.key = A.key Z.faction |= "\ref[U]" if(iscultist(U)) @@ -224,10 +224,10 @@ to_chat(U, "\red Creation failed!: \black The soul stone is empty! Go kill someone!") return -/proc/makeNewConstruct(var/mob/living/simple_animal/construct/ctype, var/mob/target, var/mob/stoner = null, cultoverride = 0) +/proc/makeNewConstruct(var/mob/living/simple_animal/hostile/construct/ctype, var/mob/target, var/mob/stoner = null, cultoverride = 0) if(jobban_isbanned(target, "cultist") || jobban_isbanned(target, "Syndicate")) return - var/mob/living/simple_animal/construct/newstruct = new ctype(get_turf(target)) + var/mob/living/simple_animal/hostile/construct/newstruct = new ctype(get_turf(target)) newstruct.faction |= "\ref[stoner]" newstruct.key = target.key if(stoner && iscultist(stoner) || cultoverride) diff --git a/code/game/objects/items/weapons/legcuffs.dm b/code/game/objects/items/weapons/legcuffs.dm index fa485cbf93b..e834f45f703 100644 --- a/code/game/objects/items/weapons/legcuffs.dm +++ b/code/game/objects/items/weapons/legcuffs.dm @@ -70,7 +70,7 @@ /obj/item/weapon/restraints/legcuffs/beartrap/Crossed(AM as mob|obj) if(armed && isturf(src.loc)) - if( (iscarbon(AM) || isanimal(AM)) && !istype(AM, /mob/living/simple_animal/parrot) && !istype(AM, /mob/living/simple_animal/construct) && !istype(AM, /mob/living/simple_animal/shade) && !istype(AM, /mob/living/simple_animal/hostile/viscerator)) + if( (iscarbon(AM) || isanimal(AM)) && !istype(AM, /mob/living/simple_animal/parrot) && !istype(AM, /mob/living/simple_animal/hostile/construct) && !istype(AM, /mob/living/simple_animal/shade) && !istype(AM, /mob/living/simple_animal/hostile/viscerator)) var/mob/living/L = AM armed = 0 icon_state = "beartrap0" diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 2fad8ab1b9f..9ba05c8e483 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -340,9 +340,9 @@ if("coffee") M.change_mob_type( /mob/living/simple_animal/crab/Coffee , null, null, delmob, 1 ) if("parrot") M.change_mob_type( /mob/living/simple_animal/parrot , null, null, delmob, 1 ) if("polyparrot") M.change_mob_type( /mob/living/simple_animal/parrot/Poly , null, null, delmob, 1 ) - if("constructarmoured") M.change_mob_type( /mob/living/simple_animal/construct/armoured , null, null, delmob, 1 ) - if("constructbuilder") M.change_mob_type( /mob/living/simple_animal/construct/builder , null, null, delmob, 1 ) - if("constructwraith") M.change_mob_type( /mob/living/simple_animal/construct/wraith , null, null, delmob, 1 ) + if("constructarmoured") M.change_mob_type( /mob/living/simple_animal/hostile/construct/armoured , null, null, delmob, 1 ) + if("constructbuilder") M.change_mob_type( /mob/living/simple_animal/hostile/construct/builder , null, null, delmob, 1 ) + if("constructwraith") M.change_mob_type( /mob/living/simple_animal/hostile/construct/wraith , null, null, delmob, 1 ) if("shade") M.change_mob_type( /mob/living/simple_animal/shade , null, null, delmob, 1 ) diff --git a/code/modules/awaymissions/mission_code/stationCollision.dm b/code/modules/awaymissions/mission_code/stationCollision.dm index af73c27667d..cf006d848c6 100644 --- a/code/modules/awaymissions/mission_code/stationCollision.dm +++ b/code/modules/awaymissions/mission_code/stationCollision.dm @@ -166,7 +166,7 @@ var/sc_safecode5 = "[rand(0,9)]" desc = "Your body becomes weak and your feel your mind slipping away as you try to comprehend what you know can't be possible." move_self = 0 //Contianed narsie does not move! grav_pull = 0 //Contained narsie does not pull stuff in! - var/uneatable = list(/turf/space, /obj/effect/overlay, /atom/movable/lighting_overlay, /mob/living/simple_animal/construct) + var/uneatable = list(/turf/space, /obj/effect/overlay, /atom/movable/lighting_overlay, /mob/living/simple_animal/hostile/construct) //Override this to prevent no adminlog runtimes and admin warnings about a singularity without containment /obj/singularity/narsie/sc_Narsie/admin_investigate_setup() diff --git a/icons/effects/96x96.dmi b/icons/effects/96x96.dmi index 8459267a66f..4061ac44a96 100644 Binary files a/icons/effects/96x96.dmi and b/icons/effects/96x96.dmi differ diff --git a/sound/effects/altar_break.ogg b/sound/effects/altar_break.ogg new file mode 100644 index 00000000000..72625df1000 Binary files /dev/null and b/sound/effects/altar_break.ogg differ diff --git a/sound/effects/forge_destroy.ogg b/sound/effects/forge_destroy.ogg new file mode 100644 index 00000000000..2b198e83af4 Binary files /dev/null and b/sound/effects/forge_destroy.ogg differ diff --git a/sound/effects/pylon_shatter.ogg b/sound/effects/pylon_shatter.ogg new file mode 100644 index 00000000000..7c5ccb37a15 Binary files /dev/null and b/sound/effects/pylon_shatter.ogg differ diff --git a/sound/effects/wood_break.ogg b/sound/effects/wood_break.ogg new file mode 100644 index 00000000000..e720e3327bc Binary files /dev/null and b/sound/effects/wood_break.ogg differ